From 8a6109a78a6f7b9e9585cd89e8a10d1f626b3af1 Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Tue, 17 Jul 2018 22:37:57 -0400 Subject: made many changes to implement alternate reflection generators, this is broken --- lib/orthogonal.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 6 deletions(-) (limited to 'lib/orthogonal.h') diff --git a/lib/orthogonal.h b/lib/orthogonal.h index 85f7a20..6166223 100644 --- a/lib/orthogonal.h +++ b/lib/orthogonal.h @@ -6,6 +6,7 @@ #include #include +#include "state.h" #include "types.h" template @@ -143,21 +144,62 @@ orthogonal_t act_inverse (orthogonal_t m1, orthogonal_t m2) } template -void generate_rotation (gsl_rng *r, orthogonal_t *ptr) { - ptr->is_reflection = true; - ptr->x = (double *)calloc(q, sizeof(double)); +orthogonal_t generate_rotation_uniform (gsl_rng *r, const state_t , vector_t > *s) { + orthogonal_t ptr; + ptr.is_reflection = true; + ptr.x = (double *)calloc(q, sizeof(double)); double v2 = 0; for (q_t i = 0; i < q; i++) { - ptr->x[i] = gsl_ran_ugaussian(r); - v2 += ptr->x[i] * ptr->x[i]; + ptr.x[i] = gsl_ran_ugaussian(r); + v2 += ptr.x[i] * ptr.x[i]; } double mag_v = sqrt(v2); for (q_t i = 0; i < q; i++) { - ptr->x[i] /= mag_v; + ptr.x[i] /= mag_v; } + + return ptr; +} + +template +orthogonal_t generate_rotation_perturbation (gsl_rng *r, const state_t , vector_t > *s, double epsilon) { + orthogonal_t ptr; + vector_t tmp_v; + ptr.is_reflection = true; + + tmp_v.x = (double *)malloc(q * sizeof(double)); + + double tmp2 = 0; + double M2 = 0; + double tmpM = 0; + + for (q_t i = 0; i < q; i++) { + tmp_v.x[i] = gsl_ran_ugaussian(r); + M2 += pow(s->M.x[i], 2); + tmpM += tmp_v.x[i] * s->M.x[i]; + } + + double v2 = 0; + + for (q_t i = 0; i < q; i++) { + tmp_v.x[i] = (tmp_v.x[i] - tmpM * s->M.x[i] / M2) + epsilon * gsl_ran_ugaussian(r); + v2 += tmp_v.x[i] * tmp_v.x[i]; + } + + double mag_v = sqrt(v2); + + for (q_t i = 0; i < q; i++) { + tmp_v.x[i] /= mag_v; + } + + vector_t v = act(s->R, tmp_v); + free(tmp_v.x); + ptr.x = v.x; + + return ptr; } -- cgit v1.2.3-70-g09d2