Deterministic Gaussian Sampling
Loading...
Searching...
No Matches
gm_to_dirac_even_binf_optimization_params.h
1#ifndef GM_TO_DIRAC_EVEN_BINF_OPTIMIZATION_PARAMS_H
2#define GM_TO_DIRAC_EVEN_BINF_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
31 public:
39 GMToDiracEvenBinfOptimizationParams(const gsl_vector* wX, size_t N, size_t L)
41 wX(wX),
42 k(N / 2),
44 sProjected(L * N, 0.00),
45 cSqrdNorm(L, 0.00) {
46 assert(wX != nullptr);
47 assert(wX->size == L);
48 assert(N % 2 == 0);
49 assert(N >= 2);
50 assert(L >= 1);
51
52 if (L > 1)
53 squaredEuclideanDistanceUtilLL =
55 }
56
61 if (squaredEuclideanDistanceUtilLL) delete squaredEuclideanDistanceUtilLL;
62 }
63
73 inline void update(const gsl_vector* t) {
74 assert(t->size == L * N);
75
76 // s = t - 1 * (w^T t)
77 std::vector<double> mean(N, 0.00);
78 for (size_t i = 0; i < L; ++i) {
79 const double wXi = wX->data[i];
80 for (size_t d = 0; d < N; ++d) mean[d] += wXi * t->data[i * N + d];
81 }
82
83 for (size_t i = 0; i < L; ++i) {
84 double sum = 0.00;
85 for (size_t d = 0; d < N; ++d) {
86 const double sid = t->data[i * N + d] - mean[d];
87 sProjected[i * N + d] = sid;
88 sum += sid * sid;
89 }
90 cSqrdNorm[i] = sum;
91 }
92
93 if (!squaredEuclideanDistanceUtilLL) return;
94
95 const gsl_matrix sMatrix =
96 gsl_matrix_view_array(sProjected.data(), L, N).matrix;
97 squaredEuclideanDistanceUtilLL->calculateDistance(&sMatrix, nullptr);
98 }
99
110 inline bool hasDegenerateSample() const {
111 for (size_t i = 0; i < L; ++i)
112 if (!(cSqrdNorm[i] > 0.00)) return true;
113 return false;
114 }
115
123 inline double sample(size_t i, size_t d) const {
124 return sProjected[i * N + d];
125 }
126
138 inline double distanceSq(size_t i, size_t j) const {
139 if (!squaredEuclideanDistanceUtilLL) return 0.00; // L == 1
140 return squaredEuclideanDistanceUtilLL->getDistance(i, j);
141 }
142
143 const gsl_vector* wX;
144 const size_t k;
145 const double constant;
146
147 std::vector<double> sProjected;
148 std::vector<double> cSqrdNorm;
149 SquaredEuclideanDistanceUtilsLL* squaredEuclideanDistanceUtilLL = nullptr;
150};
151
152#endif // GM_TO_DIRAC_EVEN_BINF_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
bMax-free closed forms for the LCD / modified Cramer-von-Mises distance of an even-dimensional standa...
double lcd_binf_constant(size_t k)
K_k, the sample-independent constant of the bMax-free distance.
Definition lcd_even_binf_closed_form.h:297
optimization parameters for the bMax-free closed-form even-N Gaussian-to-Dirac approximation
Definition gm_to_dirac_even_binf_optimization_params.h:30
~GMToDiracEvenBinfOptimizationParams()
Destroy the GMToDiracEvenBinfOptimizationParams object.
Definition gm_to_dirac_even_binf_optimization_params.h:60
GMToDiracEvenBinfOptimizationParams(const gsl_vector *wX, size_t N, size_t L)
Construct a new GMToDiracEvenBinfOptimizationParams object.
Definition gm_to_dirac_even_binf_optimization_params.h:39
const double constant
K_k, see lcd_binf_constant()
Definition gm_to_dirac_even_binf_optimization_params.h:145
std::vector< double > cSqrdNorm
c_i = ||s_i||^2, size L
Definition gm_to_dirac_even_binf_optimization_params.h:148
void update(const gsl_vector *t)
project t onto the zero-mean manifold and refresh the caches
Definition gm_to_dirac_even_binf_optimization_params.h:73
std::vector< double > sProjected
s = t - 1 * (w^T t), size L * N
Definition gm_to_dirac_even_binf_optimization_params.h:147
double sample(size_t i, size_t d) const
cached projected sample coordinate s_{i,d}
Definition gm_to_dirac_even_binf_optimization_params.h:123
double distanceSq(size_t i, size_t j) const
cached squared distance T_ij between projected samples i and j
Definition gm_to_dirac_even_binf_optimization_params.h:138
const size_t k
N / 2.
Definition gm_to_dirac_even_binf_optimization_params.h:144
bool hasDegenerateSample() const
true if any projected sample sits exactly on the origin
Definition gm_to_dirac_even_binf_optimization_params.h:110
base struct minimizer needs to be setup with
Definition gsl_minimizer.h:18