Deterministic Gaussian Sampling
Loading...
Searching...
No Matches
gm_to_dirac_even_optimization_params.h
1#ifndef GM_TO_DIRAC_EVEN_OPTIMIZATION_PARAMS_H
2#define GM_TO_DIRAC_EVEN_OPTIMIZATION_PARAMS_H
3
4#include <gsl/gsl_matrix.h>
5#include <gsl/gsl_vector.h>
6
7#include <cassert>
8#include <vector>
9
10#include "gsl_minimizer.h"
12#include "squared_euclidean_distance_utils.h"
13
19 public:
30 GMToDiracEvenOptimizationParams(const gsl_vector* wX, size_t N, size_t L,
31 double bMax, bool includeD1)
33 wX(wX),
34 bMax(bMax),
35 k(N / 2),
37 lcd_reported_offset(N, bMax, weightSumOf(wX, L))),
39 cSqrdNorm(L, 0.00) {
40 assert(wX != nullptr);
41 assert(wX->size == L);
42 assert(N % 2 == 0);
43 assert(N >= 2);
44 assert(bMax > 0.00);
45 assert(L >= 1);
46
47 if (L > 1)
48 squaredEuclideanDistanceUtilLL =
50 }
51
56 if (squaredEuclideanDistanceUtilLL) delete squaredEuclideanDistanceUtilLL;
57 }
58
67 inline void update(const gsl_vector* x) {
68 assert(x->size == L * N);
69
70 for (size_t i = 0; i < L; ++i) {
71 double sum = 0.00;
72 for (size_t d = 0; d < N; ++d) {
73 const double xid = x->data[i * N + d];
74 sum += xid * xid;
75 }
76 cSqrdNorm[i] = sum;
77 }
78
79 if (!squaredEuclideanDistanceUtilLL) return;
80
81 const gsl_matrix xMatrix = gsl_matrix_view_array(x->data, L, N).matrix;
82 squaredEuclideanDistanceUtilLL->calculateDistance(&xMatrix, nullptr);
83 }
84
92 inline double distanceSq(size_t i, size_t j) const {
93 if (!squaredEuclideanDistanceUtilLL) return 0.00; // L == 1
94 return squaredEuclideanDistanceUtilLL->getDistance(i, j);
95 }
96
97 const gsl_vector* wX;
98 const double bMax;
99 const size_t k;
100
103 const double reportedOffset;
104
108 const double objectiveOffset;
109
110 std::vector<double> cSqrdNorm;
111 SquaredEuclideanDistanceUtilsLL* squaredEuclideanDistanceUtilLL = nullptr;
112
113 private:
114 static double weightSumOf(const gsl_vector* wX, size_t L) {
115 double sum = 0.00;
116 for (size_t i = 0; i < L; ++i) sum += wX->data[i];
117 return sum;
118 }
119};
120
121#endif // GM_TO_DIRAC_EVEN_OPTIMIZATION_PARAMS_H
base class for implementations calculating squared euclidean distances with just one set of vectors
Definition squared_euclidean_distance_utils.h:64
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
Definition dirac_to_dirac_approx_short.h:9
quadrature-free closed forms for the LCD / modified Cramer-von-Mises distance of an even-dimensional ...
double lcd_reported_offset(size_t N, double bMax, double weightSum)
the constant that turns the reduced objective back into the true distance
Definition lcd_even_closed_form.h:385
optimization parameters for the closed-form even-N Gaussian-to-Dirac approximation
Definition gm_to_dirac_even_optimization_params.h:18
const size_t k
N / 2.
Definition gm_to_dirac_even_optimization_params.h:99
double distanceSq(size_t i, size_t j) const
cached squared distance T_ij between samples i and j
Definition gm_to_dirac_even_optimization_params.h:92
std::vector< double > cSqrdNorm
c_i = ||s_i||^2, size L
Definition gm_to_dirac_even_optimization_params.h:110
const double objectiveOffset
Definition gm_to_dirac_even_optimization_params.h:108
GMToDiracEvenOptimizationParams(const gsl_vector *wX, size_t N, size_t L, double bMax, bool includeD1)
Construct a new GMToDiracEvenOptimizationParams object.
Definition gm_to_dirac_even_optimization_params.h:30
void update(const gsl_vector *x)
refresh the per-evaluation caches for a new x
Definition gm_to_dirac_even_optimization_params.h:67
const double reportedOffset
Definition gm_to_dirac_even_optimization_params.h:103
~GMToDiracEvenOptimizationParams()
Destroy the GMToDiracEvenOptimizationParams object.
Definition gm_to_dirac_even_optimization_params.h:55
base struct minimizer needs to be setup with
Definition gsl_minimizer.h:18