Deterministic Gaussian Sampling
Loading...
Searching...
No Matches
gm_to_dirac_even_closed_form.h
1#ifndef GM_TO_DIRAC_EVEN_CLOSED_FORM_H
2#define GM_TO_DIRAC_EVEN_CLOSED_FORM_H
3
4#include "gm_to_dirac_approx_standard_normal_distribution_i.h"
5#include "gm_to_dirac_even_optimization_params.h"
6
25template <typename T>
28 public:
29 using GSLVectorType = typename gm_to_dirac_approx_standard_normal_distribution_i<
30 T>::GSLVectorType;
31 using GSLMatrixType = typename gm_to_dirac_approx_standard_normal_distribution_i<
32 T>::GSLMatrixType;
33
43
44 // clang-format off
57 bool approximate(size_t L,
58 size_t N,
59 double bMax,
60 T* x,
61 const T* wX = nullptr,
62 GslminimizerResult* result = nullptr,
64
76 size_t L,
77 size_t N,
78 double bMax,
79 T* x,
80 const T* wX);
81
93 size_t L,
94 size_t N,
95 double bMax,
96 T* x,
97 const T* wX);
98
99 bool approximate(size_t L,
100 size_t N,
101 double bMax,
102 GSLVectorType* x,
103 const GSLVectorType* wX = nullptr,
104 GslminimizerResult* result = nullptr,
106
108 size_t L,
109 size_t N,
110 double bMax,
111 GSLVectorType* x,
112 const GSLVectorType* wX);
113
115 size_t L,
116 size_t N,
117 double bMax,
118 GSLVectorType* x,
119 const GSLVectorType* wX);
120
121 bool approximate(size_t L,
122 size_t N,
123 double bMax,
124 GSLMatrixType* x,
125 const GSLVectorType* wX = nullptr,
126 GslminimizerResult* result = nullptr,
128
130 size_t L,
131 size_t N,
132 double bMax,
133 GSLMatrixType* x,
134 const GSLVectorType* wX);
135
137 size_t L,
138 size_t N,
139 double bMax,
140 GSLMatrixType* x,
141 const GSLVectorType* wX);
142 // clang-format on
143
144 // isotropic sigma^2 * I (scaling reduction)
145
146 // clang-format off
166 bool approximate_isotropic(size_t L,
167 size_t N,
168 double sigma,
169 double bMax,
170 T* x,
171 const T* wX = nullptr,
172 GslminimizerResult* result = nullptr,
174
189 size_t L,
190 size_t N,
191 double sigma,
192 double bMax,
193 T* x,
194 const T* wX);
195
196 bool approximate(size_t L,
197 size_t N,
198 T* x,
199 const T* wX,
200 GslminimizerResult* result = nullptr,
201 const ApproximateOptions& options = ApproximateOptions{}) override;
202
204 size_t L,
205 size_t N,
206 size_t bMax,
207 T* x,
208 const T* wX) override;
209
211 size_t L,
212 size_t N,
213 size_t bMax,
214 T* x,
215 const T* wX) override;
216
217 bool approximate(size_t L,
218 size_t N,
219 GSLVectorType* x,
220 const GSLVectorType* wX = nullptr,
221 GslminimizerResult* result = nullptr,
222 const ApproximateOptions& options = ApproximateOptions{}) override;
223
225 size_t L,
226 size_t N,
227 size_t bMax,
228 GSLVectorType* x,
229 const GSLVectorType* wX) override;
230
232 size_t L,
233 size_t N,
234 size_t bMax,
235 GSLVectorType* x,
236 const GSLVectorType* wX) override;
237
238 bool approximate(size_t L,
239 size_t N,
240 GSLMatrixType* x,
241 const GSLVectorType* wX = nullptr,
242 GslminimizerResult* result = nullptr,
243 const ApproximateOptions& options = ApproximateOptions{}) override;
244
246 size_t L,
247 size_t N,
248 size_t bMax,
249 GSLMatrixType* x,
250 const GSLVectorType* wX) override;
251
253 size_t L,
254 size_t N,
255 size_t bMax,
256 GSLMatrixType* x,
257 const GSLVectorType* wX) override;
258 // clang-format on
259
260 private:
261 static double modified_van_mises_distance_sq(const gsl_vector* x,
262 void* params);
264 void* params,
266 static void combined_distance_metric(const gsl_vector* x, void* params,
267 double* f, gsl_vector* grad);
268
269 static inline void calculateD2(const gsl_vector* x,
271 double* f, gsl_vector* grad);
272
273 static inline void calculateD3(const gsl_vector* x,
275 double* f, gsl_vector* grad);
276
277 static inline void correctMean(gsl_vector* x, const gsl_vector* wX, size_t L,
278 size_t N);
279
280 static inline bool preconditionsHold(size_t L, size_t N, double bMax);
281};
282
283#include "gm_to_dirac_even_closed_form.tpp"
284
285template <>
287 size_t L, size_t N, double bMax, gsl_vector_float* x,
290
291template <>
293 size_t L, size_t N, double bMax, gsl_vector* x, const gsl_vector* wX,
295
296template <>
298 float* distance, size_t L, size_t N, double bMax, gsl_vector_float* x,
299 const gsl_vector_float* wX);
300
301template <>
303 double* distance, size_t L, size_t N, double bMax, gsl_vector* x,
304 const gsl_vector* wX);
305
306template <>
308 float>::modified_van_mises_distance_sq_derivative(
309 gsl_vector_float* gradient, size_t L, size_t N, double bMax,
310 gsl_vector_float* x, const gsl_vector_float* wX);
311
312template <>
314 double>::modified_van_mises_distance_sq_derivative(
315 gsl_vector* gradient, size_t L, size_t N, double bMax, gsl_vector* x,
316 const gsl_vector* wX);
317
318extern template class gm_to_dirac_even_closed_form<double>;
319extern template class gm_to_dirac_even_closed_form<float>;
320
321#endif // GM_TO_DIRAC_EVEN_CLOSED_FORM_H
Definition dirac_to_dirac_approx_short.h:9
interface for the gausian mixture to dirac approximation
Definition gm_to_dirac_approx_standard_normal_distribution_i.h:20
quadrature-free Gaussian-to-Dirac approximation for an even-dimensional standard normal target
Definition gm_to_dirac_even_closed_form.h:27
void modified_van_mises_distance_sq_derivative(GSLMatrixType *gradient, size_t L, size_t N, size_t bMax, GSLMatrixType *x, const GSLVectorType *wX) override
calculate modified van mises distance based on standard normal deviation and x
void modified_van_mises_distance_sq(T *distance, size_t L, size_t N, double bMax, T *x, const T *wX)
true mCvM distance, D1 included
Definition gm_to_dirac_even_closed_form.cpp:59
bool includeD1InObjective
carry the sample-independent constant inside the minimizer's objective
Definition gm_to_dirac_even_closed_form.h:42
bool approximate_isotropic(size_t L, size_t N, double sigma, double bMax, T *x, const T *wX=nullptr, GslminimizerResult *result=nullptr, const ApproximateOptions &options=ApproximateOptions{})
approximate an isotropic Gaussian N(0, sigma^2 * I)
Definition gm_to_dirac_even_closed_form.cpp:113
void modified_van_mises_distance_sq(T *distance, size_t L, size_t N, size_t bMax, GSLMatrixType *x, const GSLVectorType *wX) override
calculate modified van mises distance based on standard normal deviation and x
void modified_van_mises_distance_sq_derivative(T *gradient, size_t L, size_t N, double bMax, T *x, const T *wX)
gradient of the true mCvM distance with respect to x
Definition gm_to_dirac_even_closed_form.cpp:68
void modified_van_mises_distance_sq_isotropic(T *distance, size_t L, size_t N, double sigma, double bMax, T *x, const T *wX)
true mCvM distance for an isotropic Gaussian N(0, sigma^2 * I)
Definition gm_to_dirac_even_closed_form.cpp:134
bool approximate(size_t L, size_t N, GSLMatrixType *x, const GSLVectorType *wX=nullptr, GslminimizerResult *result=nullptr, const ApproximateOptions &options=ApproximateOptions{}) override
approximate using gsl vectors
bool approximate(size_t L, size_t N, double bMax, T *x, const T *wX=nullptr, GslminimizerResult *result=nullptr, const ApproximateOptions &options=ApproximateOptions{})
approximate a standard normal by L Dirac components
Definition gm_to_dirac_even_closed_form.cpp:47
Definition approximate_options.h:6
optimization parameters for the closed-form even-N Gaussian-to-Dirac approximation
Definition gm_to_dirac_even_optimization_params.h:18
struct to hold the result of the minimization
Definition gsl_minimizer.h:32