Deterministic Gaussian Sampling
Loading...
Searching...
No Matches
dirac_to_dirac_optimization_params.h
1#ifndef DIRAC_TO_DIRAC_OPTIMIZATION_PARAMS_H
2#define DIRAC_TO_DIRAC_OPTIMIZATION_PARAMS_H
3
4#include <gsl/gsl_vector.h>
5
6#include <cassert>
7
8#include "dirac_to_dirac_approx_function_i.h"
9#include "gsl_minimizer.h"
10#include "math_util_defs.h"
11#include "squared_euclidean_distance_utils.h"
12
21 public:
34 DiracToDiracBaseOptimizationParams(const gsl_vector* wY, const gsl_vector* y,
35 size_t N, size_t M, size_t L, size_t bMax,
36 double cB)
38 wY(wY),
39 y(y),
40 M(M),
41 bMax(bMax),
42 cB(cB),
43 Dy(calculateDy(wY, y, M, N)),
44 piPrefactor(calculatePiPrefactor(N)),
45 meanY(createMeanY(y, wY, M, N)) {
46 assert(wY != nullptr);
47 assert(y != nullptr);
48 assert(N > 0);
49 assert(M > 0);
50 assert(L > 0);
51 assert(bMax > 0);
52 vecN = gsl_vector_alloc(N);
53 squaredEuclideanDistanceUtilLL =
55 squaredEuclideanDistanceUtilLM =
57 }
58
64 if (vecN) gsl_vector_free(vecN);
65 if (squaredEuclideanDistanceUtilLL) delete squaredEuclideanDistanceUtilLL;
66 if (squaredEuclideanDistanceUtilLM) delete squaredEuclideanDistanceUtilLM;
67 if (meanY) gsl_vector_free(const_cast<gsl_vector*>(meanY));
68 }
69
70 const gsl_vector* wY;
71 const gsl_vector* y;
72 const size_t M;
73 const size_t bMax;
74 const double cB;
75 const double Dy;
76 const double piPrefactor;
77 const gsl_vector* meanY;
78 SquaredEuclideanDistanceUtilsLL* squaredEuclideanDistanceUtilLL;
79 SquaredEuclideanDistanceUtilsLM* squaredEuclideanDistanceUtilLM;
80 gsl_vector* vecN;
81
82 private:
83 static gsl_vector* createMeanY(const gsl_vector* y, const gsl_vector* wY,
84 size_t M, size_t N) {
85 gsl_vector* meanY = gsl_vector_calloc(N);
86 for (size_t k = 0; k < N; k++) {
87 for (size_t j = 0; j < M; j++) {
88 FMA_ACC(wY->data[j], y->data[j * N + k], meanY->data[k]);
89 }
90 }
91 return meanY;
92 }
93
94 static double calculateDy(const gsl_vector* wY, const gsl_vector* y, size_t M,
95 size_t N) {
96 SquaredEuclideanDistance_LL_vectorized squaredEuclideanDistanceUtilLL(M, N);
97 gsl_matrix yMatrix = gsl_matrix_view_array(y->data, M, N).matrix;
98 squaredEuclideanDistanceUtilLL.calculateDistance(&yMatrix, &yMatrix);
99
100 const int numThreads = omp_get_max_threads();
101 std::vector<double> threadDy((size_t)numThreads, 0.0);
102
103#pragma omp parallel for
104 for (size_t i = 1; i < M; i++) {
105 const double wYi = wY->data[i];
106 for (size_t j = 0; j < i; j++) {
107 const double localDistSq =
108 squaredEuclideanDistanceUtilLL.getDistance(i, j);
109 if (localDistSq <= 0.0) continue;
110
111 const double logLocalDistSq = std::log(localDistSq);
112 threadDy[(size_t)omp_get_thread_num()] +=
113 wYi * wY->data[j] * localDistSq * logLocalDistSq;
114 }
115 }
116
117 double Dy = 0.00;
118 for (size_t i = 0; i < (size_t)numThreads; ++i) {
119 Dy += threadDy[i];
120 }
121 return 2.00 * Dy;
122 }
123
124 static double calculatePiPrefactor(size_t N) {
125 return std::pow(M_PI, static_cast<double>(N) / 2.00) * 0.125;
126 }
127};
128
136 public:
153 const gsl_vector* wY,
154 const gsl_vector* y, size_t N,
155 size_t M, size_t L, size_t bMax,
156 double cB)
157 : DiracToDiracBaseOptimizationParams(wY, y, N, M, L, bMax, cB),
158 wX(wX),
159 freeWeights(false) {}
160
174 DiracToDiracConstWeightOptimizationParams(const gsl_vector* y, size_t N,
175 size_t M, size_t L, size_t bMax,
176 double cB)
177 : DiracToDiracBaseOptimizationParams(getConstWeight(M), y, N, M, L, bMax,
178 cB),
179 wX(getConstWeight(L)),
180 freeWeights(true) {}
181
187 if (freeWeights) {
188 gsl_vector_free(const_cast<gsl_vector*>(wX));
189 gsl_vector_free(const_cast<gsl_vector*>(wY));
190 }
191 }
192
193 const gsl_vector* wX;
194
195 private:
196 const bool freeWeights;
197
198 static gsl_vector* getConstWeight(size_t size) {
199 gsl_vector* constWeight = gsl_vector_alloc(size);
200 gsl_vector_set_all(constWeight, (1.00 / static_cast<double>(size)));
201 return constWeight;
202 }
203};
204
212 public:
214 dirac_to_dirac_approx_function_i<double>::wXf wXcallback,
215 dirac_to_dirac_approx_function_i<double>::wXd wXDcallback,
216 const gsl_vector* y, size_t N, size_t M, size_t L, size_t bMax, double cB)
217 : DiracToDiracBaseOptimizationParams(getConstWeight(M), y, N, M, L, bMax,
218 cB),
219 wXcallback(wXcallback),
220 wXDcallback(wXDcallback),
221 freeWeight(true) {
222 setup();
223 }
224
226 const gsl_vector* wY,
227 dirac_to_dirac_approx_function_i<double>::wXf wXcallback,
228 dirac_to_dirac_approx_function_i<double>::wXd wXDcallback,
229 const gsl_vector* y, size_t N, size_t M, size_t L, size_t bMax, double cB)
230 : DiracToDiracBaseOptimizationParams(wY, y, N, M, L, bMax, cB),
231 wXcallback(wXcallback),
232 wXDcallback(wXDcallback),
233 freeWeight(false) {
234 setup();
235 }
236
238 if (wX) gsl_vector_free(wX);
239 if (wXD) gsl_matrix_free(wXD);
240 if (wXN) gsl_vector_free(wXN);
241 if (wXNDXiEta) gsl_vector_free(wXNDXiEta);
242 if (freeWeight) gsl_vector_free(const_cast<gsl_vector*>(wY));
243 if (squaredEuclideanDistanceUtilLL) delete squaredEuclideanDistanceUtilLL;
244 if (squaredEuclideanDistanceUtilLM) delete squaredEuclideanDistanceUtilLM;
245 }
246 gsl_vector* wX;
247 gsl_matrix* wXD;
248 gsl_vector* wXN;
249 gsl_vector* wXNDXiEta;
250 dirac_to_dirac_approx_function_i<double>::wXf wXcallback;
251 dirac_to_dirac_approx_function_i<double>::wXd wXDcallback;
252 SquaredEuclideanDistanceUtilsLL* squaredEuclideanDistanceUtilLL;
253 SquaredEuclideanDistanceUtilsLM* squaredEuclideanDistanceUtilLM;
254
255 private:
256 const bool freeWeight;
257
258 void setup() {
259 this->wX = gsl_vector_alloc(L);
260 this->wXD = gsl_matrix_alloc(L, N);
261 this->wXN = gsl_vector_alloc(L);
262 this->wXNDXiEta = gsl_vector_alloc(L);
263 squaredEuclideanDistanceUtilLL =
265 squaredEuclideanDistanceUtilLM =
267 }
268
269 static gsl_vector* getConstWeight(size_t size) {
270 gsl_vector* constWeight = gsl_vector_alloc(size);
271 gsl_vector_set_all(constWeight, (1.00 / static_cast<double>(size)));
272 return constWeight;
273 }
274};
275
276#endif // DIRAC_TO_DIRAC_OPTIMIZATION_PARAMS_H
base class for implementations calculating squared euclidean distances with just one set of vectors
Definition squared_euclidean_distance_utils.h:64
base class for implementations calculating squared euclidean distances with two set of vectors
Definition squared_euclidean_distance_utils.h:76
virtual void calculateDistance(const gsl_matrix *x, const gsl_matrix *y)=0
calculate all squared euclidean distance between vectors contained as columns in x and y
implements a vectorized version of calculating squared euclidean distances store in a vector
Definition squared_euclidean_distance_utils.h:202
implements the naive calculation of all squared euclidean distances store in a LxM matrix
Definition squared_euclidean_distance_utils.h:326
base struct for the Dirac To Dirac optimization parameters
Definition dirac_to_dirac_optimization_params.h:20
~DiracToDiracBaseOptimizationParams()
Destroy the Dirac To Dirac Base Optimization Params object.
Definition dirac_to_dirac_optimization_params.h:63
DiracToDiracBaseOptimizationParams(const gsl_vector *wY, const gsl_vector *y, size_t N, size_t M, size_t L, size_t bMax, double cB)
Construct a new Dirac To Dirac Base Optimization Params object.
Definition dirac_to_dirac_optimization_params.h:34
optimization parameters for the Dirac To Dirac approximation with constant weights
Definition dirac_to_dirac_optimization_params.h:135
~DiracToDiracConstWeightOptimizationParams()
Destroy the Dirac To Dirac Const Weight Optimization Params object.
Definition dirac_to_dirac_optimization_params.h:186
DiracToDiracConstWeightOptimizationParams(const gsl_vector *wX, const gsl_vector *wY, const gsl_vector *y, size_t N, size_t M, size_t L, size_t bMax, double cB)
Construct a new Dirac To Dirac Const Weight Optimization Params object.
Definition dirac_to_dirac_optimization_params.h:152
DiracToDiracConstWeightOptimizationParams(const gsl_vector *y, size_t N, size_t M, size_t L, size_t bMax, double cB)
Construct a new Dirac To Dirac Const Weight Optimization Params object.
Definition dirac_to_dirac_optimization_params.h:174
optimization parameters for the GMToDirac approximation with variable weights
Definition dirac_to_dirac_optimization_params.h:211
base struct minimizer needs to be setup with
Definition gsl_minimizer.h:18