Deterministic Gaussian Sampling
Loading...
Searching...
No Matches
gm_to_dirac_optimization_params.h
1#ifndef GM_TO_DIRAC_OPTIMIZATION_PARAMS_H
2#define GM_TO_DIRAC_OPTIMIZATION_PARAMS_H
3
4#include <gsl/gsl_integration.h>
5#include <gsl/gsl_sf_pow_int.h>
6#include <gsl/gsl_vector.h>
7
8#include <cassert>
9
10#include "floating_bucket_cache.h"
11#include "gsl_minimizer.h"
12#include "gsl_quadrature_adaptive_gauss_kronrod.h"
13#include "math_util_defs.h"
14#include "squared_euclidean_distance_utils.h"
15
22 cacheManagerPrefactor = new floatingBucketCacheManager(bSizeEstimate);
23 cacheManagerInnerSum =
26 xi = new size_t[numThreads];
27 eta = new size_t[numThreads];
28 }
29
31 if (cacheManagerPrefactor) delete cacheManagerPrefactor;
32 if (cacheManagerInnerSum) delete cacheManagerInnerSum;
33 if (xi) delete[] xi;
34 if (eta) delete[] eta;
35 }
36
44 inline void reset(const gsl_vector* x) {
45 cacheManagerInnerSum->clear();
46 this->x = x;
47 }
48
49 size_t* xi;
50 size_t* eta;
51 const gsl_vector* x;
52 floatingBucketCacheManager* cacheManagerPrefactor;
53 floatingBucketCacheManagerIntKey* cacheManagerInnerSum;
54};
55
63 public:
73 GMToDiracBaseOptimizationParams(const gsl_vector* covDiag, size_t N, size_t L,
74 size_t bMax, double cB)
76 covDiag(covDiag),
77 covDiagSqrd(createCovDiagSqrd(covDiag)),
78 bMax(bMax),
79 cB(cB),
80 // twoPiNHalf(std::pow(2.00 * M_PI, static_cast<double>(N) / 2.00)),
81 twoPiNHalf(std::pow(2.00, static_cast<double>(N) / 2.00)),
82 D1(calculateD1(bMax, covDiag, N)),
84 assert(covDiag != nullptr);
85 assert(covDiag->size == N);
86 assert(bMax > 0);
87 squaredEuclideanDistanceUtilLL =
89 vecN = gsl_vector_alloc(N);
90 integrationParams = new GMToDiracIntegrationParams(L, 200);
91 }
92
98 if (vecN) gsl_vector_free(vecN);
99 if (squaredEuclideanDistanceUtilLL) delete squaredEuclideanDistanceUtilLL;
100 if (integrationParams) delete integrationParams;
101 }
102
103 const gsl_vector* covDiag;
104 const gsl_vector* covDiagSqrd;
105 const size_t bMax;
106 const double cB;
107 const double twoPiNHalf;
108 const double D1;
109 const GslQuadratureAdaptiveGaussKronrod* gaussKronrod;
110 SquaredEuclideanDistanceUtilsLL* squaredEuclideanDistanceUtilLL;
111 gsl_vector* vecN;
112 GMToDiracIntegrationParams* integrationParams;
113
114 private:
115 static gsl_vector* createCovDiagSqrd(const gsl_vector* covDiag) {
116 gsl_vector* covDiagSqrd = gsl_vector_alloc(covDiag->size);
117 for (size_t i = 0; i < covDiag->size; ++i) {
118 covDiagSqrd->data[i] = covDiag->data[i] * covDiag->data[i];
119 }
120 return covDiagSqrd;
121 }
122 struct P1IntegrationParams {
123 const size_t N;
124 const gsl_vector* covDiag;
125 };
126 static double calculateP1(double b, void* params) {
127 P1IntegrationParams* p1Params = static_cast<P1IntegrationParams*>(params);
128 const size_t N = p1Params->N;
129 const gsl_vector* covDiag = p1Params->covDiag;
130 double sum = gsl_sf_pow_int(b, (int)(N + 1));
131 for (size_t k = 0; k < N; k++) {
132 sum *=
133 1.00 / std::sqrt(covDiag->data[k] * covDiag->data[k] + 2.00 * b * b);
134 }
135 return sum;
136 }
137 static double calculateD1(size_t bMax, const gsl_vector* covDiag, size_t N) {
138 gsl_integration_workspace* workspace =
140 double result = 0.00;
141 double abserr = 0.00;
142 P1IntegrationParams p1Params = P1IntegrationParams{N, covDiag};
144 F.function = calculateP1;
145 F.params = &p1Params;
146 int status =
147 gsl_integration_qag(&F, 0.00, (double)bMax, 0.00, 1e-10, 1000,
148 GSL_INTEG_GAUSS31, workspace, &result, &abserr);
150 if (status != GSL_SUCCESS) return 0.00;
151 return result;
152 }
153
154 friend class benchmark_gm_to_dirac_short;
155};
156
164 public:
178 const gsl_vector* wX, size_t N,
179 size_t L, size_t bMax, double cB)
180 : GMToDiracBaseOptimizationParams(covDiag, N, L, bMax, cB),
181 wX(wX),
182 freeWeight(false) {
183 assert(covDiag != nullptr);
184 assert(covDiag->size == N);
185 }
186
199 size_t L, size_t bMax, double cB)
200 : GMToDiracBaseOptimizationParams(covDiag, N, L, bMax, cB),
201 wX(getConstWeight(L)),
202 freeWeight(true) {
203 assert(covDiag != nullptr);
204 assert(covDiag->size == N);
205 }
206
212 if (freeWeight) gsl_vector_free(const_cast<gsl_vector*>(wX));
213 }
214
215 const gsl_vector* wX;
216
217 private:
218 const bool freeWeight;
219
220 static gsl_vector* getConstWeight(size_t size) {
222 gsl_vector_set_all(constWeight, (1.00 / static_cast<double>(size)));
223 return constWeight;
224 }
225};
226
227#endif // GM_TO_DIRAC_OPTIMIZATION_PARAMS_H
helper class to use GSL adaptive Gauss-Kronrod quadrature
Definition gsl_quadrature_adaptive_gauss_kronrod.h:13
base class for implementations calculating squared euclidean distances with just one set of vectors
Definition squared_euclidean_distance_utils.h:64
implements a vectorized version of calculating squared euclidean distances store in a vector
Definition squared_euclidean_distance_utils.h:202
Definition dirac_to_dirac_approx_short.h:9
Definition floating_bucket_cache.h:44
Definition floating_bucket_cache.h:11
base struct for the GMToDirac optimization parameters
Definition gm_to_dirac_optimization_params.h:62
GMToDiracBaseOptimizationParams(const gsl_vector *covDiag, size_t N, size_t L, size_t bMax, double cB)
Construct a new GMToDiracBaseOptimizationParams object.
Definition gm_to_dirac_optimization_params.h:73
~GMToDiracBaseOptimizationParams()
Destroy the GMToDiracBaseOptimizationParams object.
Definition gm_to_dirac_optimization_params.h:97
optimization parameters for the GMToDirac approximation with constant weights
Definition gm_to_dirac_optimization_params.h:163
GMToDiracConstWeightOptimizationParams(const gsl_vector *covDiag, const gsl_vector *wX, size_t N, size_t L, size_t bMax, double cB)
Construct a new GMToDiracConstWeightOptimizationParams object.
Definition gm_to_dirac_optimization_params.h:177
GMToDiracConstWeightOptimizationParams(const gsl_vector *covDiag, size_t N, size_t L, size_t bMax, double cB)
Construct a new GMToDiracConstWeightOptimizationParams object.
Definition gm_to_dirac_optimization_params.h:198
~GMToDiracConstWeightOptimizationParams()
Destroy the GMToDiracConstWeightOptimizationParams object.
Definition gm_to_dirac_optimization_params.h:211
additional parameters for the GMToDiracIntegration function
Definition gm_to_dirac_optimization_params.h:20
void reset(const gsl_vector *x)
resets cacheManager and x to the new x
Definition gm_to_dirac_optimization_params.h:44
base struct minimizer needs to be setup with
Definition gsl_minimizer.h:18