26 #ifndef MLN_LINEAR_GAUSSIAN_INTERNAL_COEFFICIENTS_HH
27 # define MLN_LINEAR_GAUSSIAN_INTERNAL_COEFFICIENTS_HH
54 typedef double norm_fun(
double,
double,
65 coefficients(
double a0,
double a1,
69 double s, norm_fun norm);
70 std::vector<double> n, d, nm, dm;
74 coefficients coefficients_not_derivative(
double sigma);
75 coefficients coefficients_1st_derivative(
double sigma);
76 coefficients coefficients_2nd_derivative(
double sigma);
80 # ifndef MLN_INCLUDE_ONLY
84 coefficients::coefficients(
double a0,
double a1,
88 double s, norm_fun norm)
100 double sin0 = std::sin(w0);
101 double sin1 = std::sin(w1);
102 double cos0 = std::cos(w0);
103 double cos1 = std::cos(w1);
106 double n_ = norm(a0, a1, b0, b1, c0, c1, cos0, sin0, cos1, sin1, sign);
114 std::exp(-b1 - 2*b0) * (c1 * sin1 - cos1 * c0) +
115 std::exp(-b0 - 2*b1) * (a1 * sin0 - cos0 * a0);
117 2 * std::exp(-b0 - b1) * ((a0 + c0) * cos1 * cos0 -
120 c0 * std::exp(-2*b0) + a0 * std::exp(-2*b1);
122 std::exp(-b1) * (c1 * sin1 - (c0 + 2 * a0) * cos1) +
123 std::exp(-b0) * (a1 * sin0 - (2 * c0 + a0) * cos0);
128 std::exp(-2 * b0 - 2 * b1);
130 -2 * cos0 * std::exp(-b0 - 2*b1) -
131 2 * cos1 * std::exp(-b1 - 2*b0);
133 4 * cos1 * cos0 * std::exp(-b0 - b1) +
134 std::exp(-2*b1) + std::exp(-2*b0);
136 -2 * std::exp(-b1) * cos1 - 2 * std::exp(-b0) * cos0;
138 for (
unsigned i = 1; i <= 3; ++i)
141 nm[i] = double(sign) * (n[i] - d[i] * n[0]);
144 nm[4] = double(sign) * (-d[4] * n[0]);
150 double norm_not_derivative(
double a0,
double a1,
151 double b0,
double b1,
152 double c0,
double c1,
153 double cos0,
double sin0,
154 double cos1,
double sin1,
157 double expb0 = std::exp(b0);
158 double exp2b0 = std::exp(2.f * b0);
160 double scale0 = 1 + exp2b0 - 2 * cos0 * expb0;
161 double scaleA = 2 * a1 * sin0 * expb0 - a0 * (1 - exp2b0);
163 double expb1 = std::exp(b1);
164 double exp2b1 = std::exp(2.f * b1);
166 double scale1 = 1 + exp2b1 - 2 * cos1 * expb1;
167 double scaleC = 2 * c1 * sin1 * expb1 - c0 * (1 - exp2b1);
169 double sumA = scaleA / scale0;
170 double sumC = scaleC / scale1;
179 double norm_1st_derivative(
double a0,
double a1,
180 double b0,
double b1,
181 double c0,
double c1,
182 double cos0,
double sin0,
183 double cos1,
double sin1,
186 double expb0 = std::exp(b0);
187 double exp2b0 = std::exp(2.f * b0);
189 double scale0 = 1 + exp2b0 - 2 * cos0 * expb0;
191 double scaleA = - 2 * a1 * sin0 * expb0 * (1 - exp2b0) +
192 2 * a0 * expb0 * (2 * expb0 - cos0 * (1 + exp2b0));
194 double expb1 = std::exp(b1);
195 double exp2b1 = std::exp(2.f * b1);
197 double scale1 = 1 + exp2b1 - 2 * cos1 * expb1;
199 double scaleC = - 2 * c1 * sin1 * expb1 * (1 - exp2b1) +
200 2 * c0 * expb1 * (2 * expb1 - cos1 * (1 + exp2b1));
202 double sumA = scaleA / scale0;
203 double sumC = scaleC / scale1;
212 double norm_2nd_derivative(
double a0,
double a1,
213 double b0,
double b1,
214 double c0,
double c1,
215 double cos0,
double sin0,
216 double cos1,
double sin1,
219 double expb0 = std::exp(b0);
220 double exp2b0 = std::exp(2.f * b0);
222 double scale0 = 1 + exp2b0 - 2 * cos0 * expb0;
223 scale0 *= scale0 * scale0;
225 double scaleA = a1 * sin0 * expb0 *
226 (1 + expb0 * (2 * cos0 * (1 + exp2b0) + exp2b0 - 6)) +
227 a0 * expb0 * (2 * expb0 * (2 - cos0 * cos0) *
228 (1 - exp2b0) - cos0 * (1 - exp2b0 * exp2b0));
230 double expb1 = std::exp(b1);
231 double exp2b1 = std::exp(2.f * b1);
233 double scale1 = 1 + exp2b1 - 2 * cos1 * expb1;
234 scale1 *= scale1 * scale1;
236 double scaleC = c1 * sin1 * expb1 *
237 (1 + expb1 * (2 * cos1 * (1 + exp2b1) + exp2b1 - 6)) +
238 c0 * expb1 * (2 * expb1 * (2 - cos1 * cos1) *
239 (1 - exp2b1) - cos1 * (1 - exp2b1 * exp2b1));
241 double sumA = scaleA / scale0;
242 double sumC = scaleC / scale1;
250 coefficients coefficients_not_derivative(
double sigma)
252 coefficients tmp(+1.6800, +3.7350,
257 norm_not_derivative);
263 coefficients coefficients_1st_derivative(
double sigma)
265 coefficients tmp(-0.6472, -4.5310,
270 norm_1st_derivative);
276 coefficients coefficients_2nd_derivative(
double sigma)
278 coefficients tmp(-1.3310, +3.661,
283 norm_2nd_derivative);
287 # endif // ! MLN_INCLUDE_ONLY
298 #endif // ! MLN_LINEAR_GAUSSIAN_INTERNAL_COEFFICIENTS_HH