1#ifndef DIRAC_TO_DIRAC_OPTIMIZATION_PARAMS_H
2#define DIRAC_TO_DIRAC_OPTIMIZATION_PARAMS_H
4#include <gsl/gsl_vector.h>
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"
35 size_t N,
size_t M,
size_t L,
size_t bMax,
43 Dy(calculateDy(wY, y, M, N)),
44 piPrefactor(calculatePiPrefactor(N)),
45 meanY(createMeanY(y, wY, M, N)) {
46 assert(wY !=
nullptr);
52 vecN = gsl_vector_alloc(N);
53 squaredEuclideanDistanceUtilLL =
55 squaredEuclideanDistanceUtilLM =
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));
76 const double piPrefactor;
77 const gsl_vector* meanY;
83 static gsl_vector* createMeanY(
const gsl_vector* y,
const gsl_vector* wY,
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]);
94 static double calculateDy(
const gsl_vector* wY,
const gsl_vector* y,
size_t M,
97 gsl_matrix yMatrix = gsl_matrix_view_array(y->data, M, N).matrix;
100 const int numThreads = omp_get_max_threads();
101 std::vector<double> threadDy((
size_t)numThreads, 0.0);
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;
111 const double logLocalDistSq = std::log(localDistSq);
112 threadDy[(size_t)omp_get_thread_num()] +=
113 wYi * wY->data[j] * localDistSq * logLocalDistSq;
118 for (
size_t i = 0; i < (size_t)numThreads; ++i) {
124 static double calculatePiPrefactor(
size_t N) {
125 return std::pow(M_PI,
static_cast<double>(N) / 2.00) * 0.125;
153 const gsl_vector* wY,
154 const gsl_vector* y,
size_t N,
155 size_t M,
size_t L,
size_t bMax,
159 freeWeights(false) {}
175 size_t M,
size_t L,
size_t bMax,
179 wX(getConstWeight(L)),
188 gsl_vector_free(
const_cast<gsl_vector*
>(wX));
189 gsl_vector_free(
const_cast<gsl_vector*
>(wY));
193 const gsl_vector* wX;
196 const bool freeWeights;
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)));
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)
219 wXcallback(wXcallback),
220 wXDcallback(wXDcallback),
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)
231 wXcallback(wXcallback),
232 wXDcallback(wXDcallback),
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;
249 gsl_vector* wXNDXiEta;
250 dirac_to_dirac_approx_function_i<double>::wXf wXcallback;
251 dirac_to_dirac_approx_function_i<double>::wXd wXDcallback;
256 const bool freeWeight;
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 =
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)));
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