gambit is hosted by Hepforge, IPPP Durham
GAMBIT  v1.5.0-2191-ga4742ac
a Global And Modular Bsm Inference Tool
random_tools.hpp
Go to the documentation of this file.
1 #ifndef RANDOM_TOOLS_HPP
2 #define RANDOM_TOOLS_HPP
3 #include <iostream>
4 #include <cstdio>
5 
7 
8 template <typename T>
9 T *matrix(const int xN)
10 {
11  T *temp = new T[xN];
12 
13  return temp;
14 }
15 
16 template <typename T>
17 T **matrix(const int xN, const int yN)
18 {
19  T **temp = new T*[xN];
20 
21  for (int i = 0; i < xN; i++)
22  temp[i] = new T[yN];
23 
24  return temp;
25 }
26 
27 template <typename T>
28 T ***matrix(const int xN, const int yN, const int zN)
29 {
30  T ***temp = new T**[xN];
31 
32  for (int i = 0; i < xN; i++)
33  {
34  temp[i] = new T*[yN];
35  for (int j = 0; j < yN; j++)
36  temp[i][j] = new T[zN];
37  }
38  return temp;
39 }
40 
41 template <typename T>
42 T *matrix(const int xN, T in)
43 {
44  T *temp = new T[xN];
45 
46  for (int i = 0; i < xN; i++)
47  temp[i] = in;
48 
49  return temp;
50 }
51 
52 template <typename T>
53 T **matrix(const int xN, const int yN, T in)
54 {
55  T **temp = new T*[xN];
56 
57  for (int i = 0; i < xN; i++)
58  {
59  temp[i] = new T[yN];
60  for (int j = 0; j < yN; j++)
61  temp[i][j] = in;
62  }
63 
64  return temp;
65 }
66 
67 template <typename T>
68 T ***matrix(const int xN, const int yN, const int zN, T in)
69 {
70  T ***temp = new T**[xN];
71 
72  for (int i = 0; i < xN; i++)
73  {
74  temp[i] = new T*[yN];
75  for (int j = 0; j < yN; j++)
76  {
77  temp[i][j] = new T[zN];
78  for (int k = 0; k < zN; k++)
79  temp[i][j][k] = in;
80  }
81  }
82  return temp;
83 }
84 
85 template <typename T>
86  T *matrix(const int xN, T *in)
87 {
88  T *temp = new T[xN];
89  for (int i = 0; i < xN; i++)
90  temp[i] = in[i];
91 
92  return temp;
93 }
94 
95 template <typename T>
96  T **matrix(const int xN, const int yN, T **in)
97 {
98  T **temp = new T*[xN];
99 
100  for (int i = 0; i < xN; i++)
101  {
102  temp[i] = new T[yN];
103  for (int j = 0; j < yN; j++)
104  temp[i][j] = in[i][j];
105  }
106 
107  return temp;
108 }
109 
110 template <typename T>
111  T ***matrix(const int xN, const int yN, const int zN, T ***in)
112 {
113  T ***temp = new T**[xN];
114 
115  for (int i = 0; i < xN; i++)
116  {
117  temp[i] = new T*[yN];
118  for (int j = 0; j < yN; j++)
119  {
120  temp[i][j] = new T[zN];
121  for (int k = 0; k < zN; k++)
122  temp[i][j][k] = in[i][j][k];
123  }
124  }
125  return temp;
126 }
127 
128 
129 template <typename T>
130 void del(T *temp)
131 {
132  delete[] temp;
133  temp = NULL;
134 }
135 
136 template <typename T>
137 void del(T **temp, int xN)
138 {
139  for (int i = 0; i < xN; i++)
140  delete[] temp[i];
141 
142  delete[] temp;
143  temp = NULL;
144 }
145 
146 template <typename T>
147 void del(T ***temp, int xN, int yN)
148 {
149  for (int i = 0; i < xN; i++)
150  {
151  for (int j = 0; j < yN; j++)
152  delete[] temp[i][j];
153  delete[] temp[i];
154  }
155 
156  delete[] temp;
157  temp = NULL;
158 }
159 
160 template<class T>
161 inline const T SQ(const T a) {return a*a;}
162 
163 template<class T>
164 inline const T SQR(const T a) {return a*a;}
165 
166 class Cholesky
167 {
168  private:
169  double **el;
170 
171  protected:
172  int num;
173 
174 
175  public:
176  Cholesky(const int nin) : num(nin)
177  {
178  el = matrix <double> (num, num);
179  }
180 
181  Cholesky(double **a, const int nin) : num(nin)
182  {
183  el = matrix <double> (num, num);
184  double sum = 0;
185  int i, j, k;
186 
187  for (i = 0; i < num; i++)
188  for (j = 0; j < num; j++)
189  el[i][j] = a[i][j];
190 
191  for (i = 0; i < num; i++)
192  {
193  for (j = i; j < num; j++)
194  {
195  for(sum = el[i][j], k = i - 1; k >= 0; k--)
196  sum -= el[i][k]*el[j][k];
197  if(i ==j)
198  {
199  if(sum <= 0.0)
200  {
201  std::cout << "Cholesky failed " << sum << std::endl;
202  getchar();
203  }
204  el[i][i] = sqrt(sum);
205  }
206  else
207  el[j][i] = sum/el[i][i];
208  }
209  }
210  for (i = 0; i < num; i++)
211  for (j = 0; j < i; j++)
212  el[j][i] = 0.0;
213  }
214 
215  bool EnterMatM(double **a, const int min)
216  {
217  double sum = 0;
218  int i, j, k;
219 
220  for (i = 0; i < num; i++)
221  {
222  for (j = 0; j < num; j++)
223  {
224  el[i][j] = a[i][j];
225  //out1 << el[i][j] << " " << endl;
226  }
227  //out1 << endl;
228  }
229 
230  if (num >= min)
231  {
232  k = min -1;
233  int l = num - min + 1;
234  for (i = 0; i < l; i++)
235  {
236  for (j = k+i; j < num; j++)
237  el[i][j] = el[j][i] = 0.0;
238  }
239  }
240 
241  for (i = 0; i < num; i++)
242  {
243  for (j = i; j < num; j++)
244  {
245  for(sum = el[i][j], k = i - 1; k >= 0; k--)
246  sum -= el[i][k]*el[j][k];
247  if(i ==j)
248  {
249  if(sum <= 0.0)
250  return true;
251  el[i][i] = sqrt(sum);
252  }
253  else
254  el[j][i] = sum/el[i][i];
255  }
256  }
257  for (i = 0; i < num; i++)
258  for (j = 0; j < i; j++)
259  el[j][i] = 0.0;
260 
261 // ofstream out2("cov2.dat");
262 // double **ct = matrix <double> (n, n, 0.0);
263 // for (i = 0; i < num; i++)
264 // for (j = 0; j < n; j++)
265 // for (k = 0; k < num; k++)
266 // ct[i][j] += el[i][k]*el[j][k];
267 // for (i = 0; i < num; i++)
268 // {
269 // for (j = 0; j < num; j++)
270 // out2 << ct[i][j] << " ";
271 // out2 << endl;
272 // }
273 // cout << "finished" << endl;
274 // getchar();
275 
276  return false;
277  }
278 
279  bool EnterMat(double **a)
280  {
281  double sum = 0;
282  int i, j, k;
283 
284  for (i = 0; i < num; i++)
285  {
286  for (j = 0; j < num; j++)
287  {
288  el[i][j] = a[i][j];
289  }
290  }
291 
292  for (i = 0; i < num; i++)
293  {
294  for (j = i; j < num; j++)
295  {
296  for(sum = el[i][j], k = i - 1; k >= 0; k--)
297  sum -= el[i][k]*el[j][k];
298  if(i ==j)
299  {
300  if(sum <= 0.0)
301  return false;
302  el[i][i] = sqrt(sum);
303  }
304  else
305  el[j][i] = sum/el[i][i];
306  }
307  }
308  for (i = 0; i < num; i++)
309  for (j = 0; j < i; j++)
310  el[j][i] = 0.0;
311 
312  return true;
313  }
314 
315  bool EnterMat(const std::vector<std::vector<double>> &a)
316  {
317  double sum = 0;
318  int i, j, k;
319 
320  for (i = 0; i < num; i++)
321  {
322  for (j = 0; j < num; j++)
323  {
324  el[i][j] = a[i][j];
325  }
326  }
327 
328  for (i = 0; i < num; i++)
329  {
330  for (j = i; j < num; j++)
331  {
332  for(sum = el[i][j], k = i - 1; k >= 0; k--)
333  sum -= el[i][k]*el[j][k];
334  if(i ==j)
335  {
336  if(sum <= 0.0)
337  return false;
338  el[i][i] = sqrt(sum);
339  }
340  else
341  el[j][i] = sum/el[i][i];
342  }
343  }
344  for (i = 0; i < num; i++)
345  for (j = 0; j < i; j++)
346  el[j][i] = 0.0;
347 
348  return true;
349  }
350 
351  void EnterMat(double **a, int nin)
352  {
353  del <double> (el, num);
354  num = nin;
355  el = matrix <double> (num, num);
356  EnterMat(a);
357  }
358 
359  void ElMult (double *y, double *b)
360  {
361  int i, j;
362  for(i = 0; i < num; i++)
363  {
364  b[i] = 0.0;
365  for (j = 0; j <= i; j++)
366  b[i] += el[i][j]*y[j];
367  }
368  }
369 
370  void ElMult (double *y)
371  {
372  int i, j;
373  double *b = new double[num];
374  for(i = 0; i < num; i++)
375  {
376  b[i] = 0.0;
377  for (j = 0; j <= i; j++)
378  {
379  b[i] += el[i][j]*y[j];
380  }
381  }
382  for (i = 0; i < num; i++)
383  {
384  y[i] = b[i];
385  }
386  delete[] b;
387  }
388 
389  void Solve (double *b, double *x)
390  {
391  int i, k;
392  double sum;
393 
394  for (i = 0; i < num; i++)
395  {
396  for (sum = b[i], k=i-1; k >=0; k--)
397  sum -= el[i][k]*x[k];
398  x[i]=sum/el[i][i];
399  }
400 
401  for (i = num-1; i >=0; i--)
402  {
403  for (sum = x[i], k=i+1; k<num; k++)
404  sum -= el[k][i]*x[k];
405  x[i]=sum/el[i][i];
406  }
407  }
408 
409  double Square(double *y, double *y0)
410  {
411  int i, j;
412  double sum;
413  double *x = new double[num];
414 
415  for (i = 0; i < num; i++)
416  {
417  for (sum = (y[i]-y0[i]), j=0; j < i; j++)
418  sum -= el[i][j]*x[j];
419  x[i]=sum/el[i][i];
420  }
421 
422  sum = 0.0;
423  for (i = 0; i < num; i++)
424  sum += x[i]*x[i];
425 
426  delete[] x;
427 
428  return sum;
429  }
430 
431  double Square(double *y, double *y0, int *map)
432  {
433  int i, j;
434  double sum;
435  double *x = new double[num];
436 
437  for (i = 0; i < num; i++)
438  {
439  for (sum = (y[map[i]]-y0[i]), j=0; j < i; j++)
440  sum -= el[i][j]*x[j];
441  x[i]=sum/el[i][i];
442  }
443 
444  sum = 0.0;
445  for (i = 0; i < num; i++)
446  sum += x[i]*x[i];
447 
448  delete[] x;
449 
450  return sum;
451  }
452 
453  void Inverse(double **ainv)
454  {
455  double sum;
456 
457  for (int i = 0; i < num; i++)
458  for (int j = 0; j <= i; j++)
459  {
460  sum = (i == j ? 1.0 : 0.0);
461  for (int k = i-1; k >= j; k--)
462  sum -= el[i][k]*ainv[j][k];
463  ainv[j][i] = sum/el[i][i];
464  }
465 
466  for (int i = num - 1; i >= 0; i--)
467  for (int j = 0; j <= i; j++)
468  {
469  sum = (i < j ? 0.0 : ainv[j][i]);
470  for (int k = i + 1; k < num; k++)
471  sum -= el[k][i]*ainv[j][k];
472  ainv[i][j] = ainv[j][i] = sum/el[i][i];
473  }
474  }
475 
476  double DetSqrt()
477  {
478  double temp = 1.0;
479  for (int i = 0; i < num; i++)
480  temp *= el[i][i];
481  return temp;
482  }
484  {
485  del <double> (el, num);
486  }
487 };
488 
489 class Ran_old
490 {
491  private:
492  unsigned long long int u, v, w;
493 
494  public:
495  Ran_old(unsigned long long int j) : v(4101842887655102017LL), w(1)
496  {
497  u = j ^ v; int64();
498  v = u; int64(); int64();
499  w = v; int64(); int64();
500  }
501  inline unsigned long long int int64()
502  {
503  u = u * 2862933555777941757LL + 7046029254386353087LL;
504  v ^= v >> 17; v ^= v << 31; v ^= v >> 8;
505  w = 4294957665U*(w & 0xffffffff) + (w >> 32);
506  unsigned long long int x = u ^ (u << 21); x ^= x >> 35; x ^= x << 4;
507  return (x + v) ^ w;
508  }
509  inline double Doub(){return 5.42101086242752217E-20 * int64();}
510  inline unsigned int int32(){return (unsigned int)int64();}
511 };
512 
513 class Ran
514 {
515 public:
516  Ran(unsigned long long int){}
517  inline double Doub(){return Gambit::Random::draw();}
518 };
519 
520 class ExponDev : public Ran
521 {
522  private:
523  double beta;
524  public:
525  ExponDev(double din, unsigned long long ii) : Ran(ii), beta(din){}
526  double Dev()
527  {
528  double u;
529  do
530  {
531  u = Doub();
532  }
533  while(u == 0);
534 
535  return -log(u)/beta;
536  }
537 };
538 
539 class NormalDev : public Ran
540 {
541  private:
542  double mu, sig;
543 
544  public:
545  NormalDev(double mmu, double ssig, unsigned long long i) : Ran(i), mu(mmu), sig(ssig){}
546  double Dev()
547  {
548  double u, v, x, y, q;
549  do
550  {
551  u = Doub();
552  v = 1.7156*(Doub() - 0.5);
553  x = u - 0.449871;
554  y = fabs(v) + 0.386595;
555  q = x*x + y*(0.19600*y-0.25472*x);
556  }
557  while(q > 0.27597 && (q > 0.27846 || v*v > -4.0*log(u)*u*u));
558 
559  return mu + sig*v/u;
560  }
561 };
562 
563 class BasicDevs : public Ran
564 {
565  private:
566 
567  public:
568  BasicDevs(unsigned long long i) : Ran(i) {}
569 
570  double Dev()
571  {
572  double u, v, x, y, q;
573  do
574  {
575  u = Doub();
576  v = 1.7156*(Doub() - 0.5);
577  x = u - 0.449871;
578  y = fabs(v) + 0.386595;
579  q = x*x + y*(0.19600*y-0.25472*x);
580  }
581  while(q > 0.27597 && (q > 0.27846 || v*v > -4.0*log(u)*u*u));
582 
583  return v/u;
584  }
585 
586  double ExpDev()
587  {
588  double u;
589  do
590  {
591  u = Doub();
592  }
593  while(u == 0);
594 
595  return -log(u);
596  }
597 };
598 
599 class MultiNormalDev : public Ran, public Cholesky
600 {
601  private:
602  int mm;
603  double f;
604  double *spt;
605 
606  public:
607  MultiNormalDev (double **vvar, double fin, unsigned long long int j, int nin) : Ran(j), Cholesky(vvar, nin), mm(nin), f(fin)
608  {
609  spt = matrix <double> (mm);
610  }
611  void Dev(double *pt, double *mean)
612  {
613  double u, v, x, y, q;
614  for (int i = 0; i < mm; i++)
615  {
616  do
617  {
618  u = Doub();
619  v = 1.7156*(Doub() - 0.5);
620  x = u - 0.449871;
621  y = fabs(v) + 0.386595;
622  q = x*x + y*(0.19600*y-0.25472*x);
623  }
624  while(q > 0.27597 && (q > 0.27846 || v*v > -4.0*log(u)*u*u));
625  spt[i] = v/u;
626  }
627  ElMult(spt, pt);
628  for (int i = 0; i < mm; i++)
629  pt[i] = f*pt[i] + mean[i];
630  }
631  void Dev(double **cvar, double *pt, double *mean)
632  {
633  double u, v, x, y, q;
634  for (int i = 0; i < mm; i++)
635  {
636  do
637  {
638  u = Doub();
639  v = 1.7156*(Doub() - 0.5);
640  x = u - 0.449871;
641  y = fabs(v) + 0.386595;
642  q = x*x + y*(0.19600*y-0.25472*x);
643  }
644  while(q > 0.27597 && (q > 0.27846 || v*v > -4.0*log(u)*u*u));
645  spt[i] = v/u;
646  }
647  EnterMat(cvar);
648  ElMult(spt, pt);
649  for (int i = 0; i < mm; i++)
650  pt[i] = f*pt[i] + mean[i];
651  }
653  {
654  del <double> (spt);
655  }
656 };
657 
658 class AdvanceDevs : public BasicDevs, public Cholesky
659 {
660  private:
661  double fac;
662 
663  public:
664  AdvanceDevs(int nin, double din, unsigned long long iin) : BasicDevs(iin), Cholesky(nin), fac(din)
665  {
666  }
667 
668  AdvanceDevs(double **vvar, const int nin, double din, unsigned long long iin) : BasicDevs(iin), Cholesky(vvar, nin), fac(din)
669  {
670  }
671 
672  double MultiDevDist()
673  {
674  double dist = 0.0;
675 
676  if(Doub() < 0.33)
677  dist = ExpDev();
678  else
679  {
680  double temp;
681  for (int i = 0; i < 2; i++)
682  {
683  temp = Dev();
684  dist += temp*temp;
685  }
686  dist = sqrt(dist/2.0);
687  }
688 
689  return fac*dist;
690  }
691 
692  double MultiDevPDF(double r, int dim)
693  {
694  return -(2.0 - dim)*std::log(r/fac) - r*r/fac/fac/2.0;
695  }
696 
697  void MultiDev(double *pin, double *p0)
698  {
699  int i;
700  double dist = 0.0;
701 
702  std::vector<double> vec(num);
703  double norm = 0.0;
704  for (i = 0; i < num; i++)
705  {
706  vec[i] = Dev();
707  norm += vec[i]*vec[i];
708  }
709  norm = sqrt(norm);
710 
711  if(Doub() < 0.33)
712  dist = ExpDev();
713  else
714  {
715  double temp;
716  for (i = 0; i < 2; i++)
717  {
718  temp = Dev();
719  dist += temp*temp;
720  }
721  dist = sqrt(dist/2.0);
722  }
723 
724  ElMult(&vec[0], pin);
725  for (i = 0; i < num; i++)
726  {
727  pin[i] = fac*dist*pin[i]/norm + p0[i];
728  }
729 
730  return;
731  }
732 
733  void MultiDev(double **cvar, double *pin, double *p0)
734  {
735  int i;
736  double dist = 0.0;
737 
738  double vec[num];
739  double norm = 0.0;
740  for (i = 0; i < num; i++)
741  {
742  vec[i] = Dev();
743  norm += vec[i]*vec[i];
744  }
745  norm = sqrt(norm);
746 
747  if(Doub() < 0.33)
748  dist = ExpDev();
749  else
750  {
751  double temp;
752  for (i = 0; i < 2; i++)
753  {
754  temp = Dev();
755  dist += temp*temp;
756  }
757  dist = sqrt(dist/2.0);
758  }
759 
760  EnterMat(cvar);
761  ElMult(vec, pin);
762  for (i = 0; i < num; i++)
763  {
764  pin[i] = fac*dist*pin[i]/norm + p0[i];
765  }
766 
767  return;
768  }
769 
770  void EllipseDev(double *pin, double *p0, double fin)
771  {
772  int i;
773  double dist = 0.0;
774 
775  double vec[num];
776  double norm = 0.0;
777  for (i = 0; i < num; i++)
778  {
779  vec[i] = Dev();
780  norm += vec[i]*vec[i];
781  }
782  norm = sqrt(norm);
783 
784  dist = pow(Doub(), 1.0/num);
785 
786  ElMult(vec, pin);
787  for (i = 0; i < num; i++)
788  {
789  pin[i] = fin*dist*pin[i] + p0[i];
790  }
791 
792  return;
793  }
794 
795  void EllipseDev(double **cvar, double *pin, double *p0, double fin)
796  {
797  int i;
798  double dist = 0.0;
799 
800  double vec[num];
801  double norm = 0.0;
802  for (i = 0; i < num; i++)
803  {
804  vec[i] = Dev();
805  norm += vec[i]*vec[i];
806  }
807  norm = sqrt(norm);
808 
809  dist = pow(Doub(), 1.0/num);
810 
811  EnterMat(cvar);
812  ElMult(vec, pin);
813  for (i = 0; i < num; i++)
814  {
815  pin[i] = fin*dist*pin[i] + p0[i];
816  }
817 
818  return;
819  }
820 };
821 
822 class RandomPlane : public AdvanceDevs
823 {
824 private:
825  double **rotVec;
826  double **currentVec;
827  double **endVec;
828  double **endEndVec;
829  double **sEndVec;
830  int proj, extra;
831  double alimt;
832  double sqrtAlim, powAlim, ratioAlim, ratioAlimt;
833 
834 public:
835  RandomPlane(const int projin, const int nin, const double din, const double alim, const double alimt, unsigned long long iin) : AdvanceDevs(nin, din, iin), proj(projin), alimt(alimt)
836  {
837  rotVec = matrix <double> (nin, nin);
838  RandRot();
839  if (proj > num) proj = num;
840  extra = num % proj;
841  endVec = currentVec + num - extra;
842  endEndVec = currentVec + num;
843  sEndVec = currentVec + num - proj;
844  sqrtAlim = sqrt(alim);
845  powAlim = pow(alim, 0.5 - proj);
846  double vol1 = 2.0*(sqrt(alim) - 1.0);
847  double vol2 = (1.0 - pow(alim, 0.5 - proj))/(proj - 0.5);
848  ratioAlim = vol1/(vol1 + vol2);
849  ratioAlimt = (alimt - 1.0)/(2.0*alimt + proj - 2.0);
850  }
851 
852  double WalkDev()
853  {
854  if (Doub() <= ratioAlim)
855  return SQ(1.0 + Doub()*(sqrtAlim - 1.0));
856  else
857  return pow(powAlim + Doub()*(1.0 - powAlim), 1.0/(proj - 0.5));
858  }
859 
860  double TransDev()
861  {
862  if (Doub() < ratioAlimt)
863  {
864  return -pow(Doub(), 1.0/(alimt + proj - 1.0));
865  }
866  else
867  {
868  return -pow(Doub(), 1.0/(1.0 - alimt));
869  }
870  }
871 
872  double KWalkDev()
873  {
874  if (Doub() < 0.5)
875  {
876  if (Doub() <= ratioAlim)
877  {
878  return SQ(1.0 + Doub()*(sqrtAlim - 1.0));
879  }
880  else
881  {
882  return pow(powAlim + Doub()*(1.0 - powAlim), 1.0/(proj - 0.5));
883  }
884  }
885  else
886  {
887  if (Doub() < ratioAlimt)
888  {
889  return -pow(Doub(), 1.0/(alimt + proj - 1.0));
890  }
891  else
892  {
893  return -pow(Doub(), 1.0/(1.0 - alimt));
894  }
895  }
896  }
897 
898  bool KWalkDev(double &Z)
899  {
900  if (Doub() < 0.5)
901  {
902  Z = SQ(1.0/sqrtAlim + Doub()*(sqrtAlim - 1.0/sqrtAlim));
903 
904  return pow(Z, proj - 1) > Doub();
905  }
906  else
907  {
908  if (Doub() < (alimt - 1.0)/(2.0*alimt))
909  {
910  Z = -pow(Doub(), 1.0/(alimt + 1.0));
911  }
912  else
913  {
914  Z = -pow(Doub(), 1.0/(1.0 - alimt));
915  }
916 
917  return pow(Z, proj - 2) > Doub();
918  }
919  }
920 
921  double WalkDev(double *ptrOut, double *ptr, double *ptr0)
922  {
923  double Z;
924 
925  Z = SQ(1.0/sqrtAlim + Doub()*(sqrtAlim - 1.0/sqrtAlim));
926 
927  Mult(ptrOut, ptr, ptr0, Z);
928 
929  return (proj - 1.0)*log(Z);
930  }
931 
932  double TransDev(double *ptrOut, double *ptr, double *ptr0)
933  {
934  double Z;
935 
936  if (Doub() < (alimt - 1.0)/(2.0*alimt))
937  {
938  Z = -pow(Doub(), 1.0/(alimt + 1.0));
939  }
940  else
941  {
942  Z = -pow(Doub(), 1.0/(1.0 - alimt));
943  }
944 
945  Mult(ptrOut, ptr, ptr0, Z);
946 
947  return (proj - 2.0)*log(-Z);
948  }
949 
950  void Mult2(double *ptrOut, double *ptr, double *ptr0, const double Z)
951  {
952  std::vector<double> z(proj);
953  for (int i = 0; i < proj; i++)
954  {
955  z[i] = 0.0;
956  for (int j = 0; j < num; j++)
957  {
958  z[i] += (Z-1.0)*(ptr[j] - ptr0[j])*currentVec[i][j];
959  }
960  }
961 
962  for (int j = 0; j < num; j++)
963  {
964  ptrOut[j] = ptr[j];
965  for (int i = 0; i < proj; i++)
966  {
967  ptrOut[j] += z[i]*currentVec[i][j];
968  }
969  }
970 
971  currentVec++;// += proj;
972  if (currentVec == sEndVec)
973  {
974  for (double **vec = currentVec, **vec2 = rotVec; vec != endEndVec; vec++, vec2++)
975  {
976  double *temp = *vec2;
977  *vec2 = *vec;
978  *vec = temp;
979  }
980  RandRot(extra);
981  }
982  }
983 
984  void Mult(double *ptrOut, double *ptr, double *ptr0, const double Z)
985  {
986  RandRot(0, proj);
987 
988  std::vector<double> z(proj);
989  for (int i = 0; i < proj; i++)
990  {
991  z[i] = 0.0;
992  for (int j = 0; j < num; j++)
993  {
994  z[i] += (Z-1.0)*(ptr[j] - ptr0[j])*currentVec[i][j];
995  }
996  }
997 
998  for (int j = 0; j < num; j++)
999  {
1000  ptrOut[j] = ptr[j];
1001  for (int i = 0; i < proj; i++)
1002  {
1003  ptrOut[j] += z[i]*currentVec[i][j];
1004  }
1005  }
1006  }
1007 
1008  void HopBlow(double *ptrOut, double *ptrIn, double *ptr, double *ptr0)
1009  {
1010  double max = 0;
1011 
1012  RandRot(0, proj);
1013 
1014  std::vector<double> z(proj);
1015  for (int i = 0; i < proj; i++)
1016  {
1017  z[i] = 0.0;
1018  for (int j = 0; j < num; j++)
1019  {
1020  z[i] += (ptr[j] - ptr0[j])*currentVec[i][j];
1021  }
1022  }
1023 
1024  for (auto &&elem : z)
1025  {
1026  double pt = std::abs(elem);
1027  if (pt > max)
1028  max = pt;
1029  }
1030 
1031  double r = MultiDevDist();
1032 
1033  for (int j = 0; j < num; j++)
1034  {
1035  ptrOut[j] = ptrIn[j];
1036  for (int i = 0; i < proj; i++)
1037  {
1038  ptrOut[j] += r*max*currentVec[i][j]/3.0;
1039  }
1040  }
1041  }
1042 
1043  void RandRot(const int start = 0)
1044  {
1045  double temp;
1046  std::vector<double> vec(num);
1047  int i, j, k;
1048 
1049  for (i = start; i < num; i++)
1050  {
1051  for (j = 0; j < num; j++)
1052  vec[j] = Dev();
1053  for (j = 0; j < i; j++)
1054  {
1055  temp = 0.0;
1056  for (k = 0; k < num; k++)
1057  temp += vec[k]*rotVec[j][k];
1058  for (k = 0; k < num; k++)
1059  vec[k] -= temp*rotVec[j][k];
1060  }
1061  temp = 0.0;
1062  for (j = 0; j < num; j++)
1063  temp += vec[j]*vec[j];
1064  temp = sqrt(temp);
1065  for (j = 0; j < num; j++)
1066  rotVec[i][j] = vec[j]/temp;
1067  }
1068 
1069  currentVec = rotVec;
1070  }
1071 
1072  void RandRot(const int start, const int end)
1073  {
1074  double temp;
1075  std::vector<double> vec(num);
1076  int i, j, k;
1077 
1078  for (i = start; i < end; i++)
1079  {
1080  for (j = 0; j < num; j++)
1081  vec[j] = Dev();
1082  for (j = 0; j < i; j++)
1083  {
1084  temp = 0.0;
1085  for (k = 0; k < num; k++)
1086  temp += vec[k]*rotVec[j][k];
1087  for (k = 0; k < num; k++)
1088  vec[k] -= temp*rotVec[j][k];
1089  }
1090  temp = 0.0;
1091  for (j = 0; j < num; j++)
1092  temp += vec[j]*vec[j];
1093  temp = sqrt(temp);
1094  for (j = 0; j < num; j++)
1095  rotVec[i][j] = vec[j]/temp;
1096  }
1097 
1098  currentVec = rotVec;
1099  }
1100 
1101  int Dim() const {return proj;}
1102 
1104  {
1105  del <double> (rotVec, num);
1106  }
1107 };
1108 
1109 class RandomBasis : public BasicDevs
1110 {
1111  private:
1112  double **rotVec;
1113 
1114  protected:
1115  int num;
1116  double **currentVec;
1117  double **endVec;
1118 
1119  public:
1120  RandomBasis(int nin, unsigned long long iin) : BasicDevs(iin), num(nin)
1121  {
1122  rotVec = matrix <double> (nin, nin);
1123  RandRot();
1124  endVec = currentVec + num;
1125  }
1126 
1127  void ChangeDim(const int nin)
1128  {
1129  del <double> (rotVec, num);
1130  num = nin;
1131  rotVec = matrix <double> (nin, nin);
1132  RandRot();
1133  endVec = currentVec + num;
1134  }
1135 
1136  void RandRot()
1137  {
1138  double temp;
1139  double vec[num];
1140  int i, j, k;
1141 
1142  for (i = 0; i < num; i++)
1143  {
1144  for (j = 0; j < num; j++)
1145  vec[j] = Dev();
1146  for (j = 0; j < i; j++)
1147  {
1148  temp = 0.0;
1149  for (k = 0; k < num; k++)
1150  temp += vec[k]*rotVec[j][k];
1151  for (k = 0; k < num; k++)
1152  vec[k] -= temp*rotVec[j][k];
1153  }
1154  temp = 0.0;
1155  for (j = 0; j < num; j++)
1156  temp += vec[j]*vec[j];
1157  temp = sqrt(temp);
1158  for (j = 0; j < num; j++)
1159  rotVec[i][j] = vec[j]/temp;
1160  }
1161 
1162  currentVec = rotVec;
1163  }
1164 
1165  double RanMult(double **cin)
1166  {
1167  int i, j;
1168  double temp = 0.0;
1169 
1170  for (i = 0; i < num; i++)
1171  {
1172  for (j = 0; j < num; j++)
1173  {
1174  temp += (*currentVec)[i]*cin[i][j]*(*currentVec)[j];
1175  }
1176  }
1177  return temp;
1178  }
1179 
1180  void RanMult(const double in, double *out)
1181  {
1182  int i;
1183  double *ptr = *currentVec;
1184 
1185  for (i = 0; i < num; i++)
1186  {
1187  *out++ = in*(*ptr++);
1188 
1189  }
1190  return;
1191  }
1192 
1193  void RanMult(double *in, const double w, double *out)
1194  {
1195  int i;
1196  double *ptr = *currentVec;
1197 
1198  for (i = 0; i < num; i++)
1199  {
1200  *out++ = *in++ + w*(*ptr++);
1201  }
1202  return;
1203  }
1204 
1205  double Mag(double *a, double *a0)
1206  {
1207  double temp = 0.0;
1208  int i;
1209  double *ptr = *currentVec;
1210 
1211  for (i = 0; i < num; i++)
1212  temp += (*a++-*a0++)*(*ptr++);
1213 
1214  return temp;
1215  }
1216 
1217  void Adjust(double *a, const double lim, const int iin)
1218  {
1219  double temp = (lim - a[iin])/(*currentVec)[iin];
1220  double *ptr = *currentVec;
1221 
1222  for (int i = 0; i < num; i++)
1223  a[i] += temp*(*ptr++);
1224  return;
1225  }
1226 
1227  virtual void operator ++ (int)
1228  {
1229  if (++currentVec == endVec)
1230  {
1231  RandRot();
1232  }
1233  }
1234 
1235  virtual ~RandomBasis()
1236  {
1237  del <double> (rotVec, num);
1238  }
1239 };
1240 
1241 class TransformRandomBasis : public RandomBasis, public Cholesky
1242 {
1243  private:
1244  int num;
1245 
1246  public:
1247  TransformRandomBasis(double **vvar, int nin, unsigned long long iin) : RandomBasis(nin, iin), Cholesky(vvar, nin), num(nin)
1248  {
1249  double **ptr = currentVec;
1250  for (int i = 0; i < num; i++)
1251  {
1252  ElMult(*ptr++);
1253  }
1254  }
1255 
1256  void operator ++ (int)
1257  {
1258  if (++currentVec == endVec)
1259  {
1260  RandRot();
1261  double **ptr = currentVec;
1262  for (int i = 0; i < num; i++)
1263  {
1264  ElMult(*ptr++);
1265  }
1266  }
1267  }
1268 };
1269 
1270 class MultiNormDev : public RandomBasis, public Cholesky
1271 {
1272  private:
1273  double fac;
1274  int num;
1275 
1276  public:
1277  MultiNormDev(int nin, double din, unsigned long long iin) : RandomBasis(nin, iin), Cholesky(nin), fac(din), num(nin)
1278  {
1279  }
1280 
1281  MultiNormDev(double **vvar, const int nin, double din, unsigned long long iin) : RandomBasis(nin, iin), Cholesky(vvar, nin), fac(din), num(nin)
1282  {
1283  }
1284 
1285  void MultiDev(double *pin, double *p0)
1286  {
1287  int i;
1288  double dist = 0.0;
1289 
1290  if(Doub() < 0.33)
1291  dist = ExpDev();
1292  else
1293  {
1294  double temp;
1295  for (i = 0; i < 2; i++)
1296  {
1297  temp = Dev();
1298  dist += temp*temp;
1299  }
1300  dist = sqrt(dist/2.0);
1301  }
1302 
1303  ElMult(*currentVec, pin);
1304  for (i = 0; i < num; i++)
1305  {
1306  pin[i] = fac*dist*pin[i] + p0[i];
1307  }
1308  (*this)++;
1309 
1310  return;
1311  }
1312 
1313  void MultiDev(double **cvar, double *pin, double *p0)
1314  {
1315  int i;
1316  double dist = 0.0;
1317 
1318  if(Doub() < 0.33)
1319  dist = ExpDev();
1320  else
1321  {
1322  double temp;
1323  for (i = 0; i < 2; i++)
1324  {
1325  temp = Dev();
1326  dist += temp*temp;
1327  }
1328  dist = sqrt(dist/2.0);
1329  }
1330 
1331  EnterMat(cvar);
1332  ElMult(*currentVec, pin);
1333  for (i = 0; i < num; i++)
1334  {
1335  pin[i] = fac*dist*pin[i] + p0[i];
1336  }
1337  (*this)++;
1338 
1339  return;
1340  }
1341 
1342  void MultiDevGauss(double **cvar, double *pin, double *p0)
1343  {
1344  int i;
1345  double dist = 0.0;
1346 
1347  double temp;
1348  for (i = 0; i < 2; i++)
1349  {
1350  temp = Dev();
1351  dist += temp*temp;
1352  }
1353  dist = sqrt(dist/2.0);
1354 
1355 
1356  EnterMat(cvar);
1357  ElMult(*currentVec, pin);
1358  for (i = 0; i < num; i++)
1359  {
1360  pin[i] = fac*dist*pin[i] + p0[i];
1361  }
1362  (*this)++;
1363 
1364  return;
1365  }
1366 
1367  void EllipseDev(double *pin, double *p0, double fin)
1368  {
1369  int i;
1370  double dist = 0.0;
1371 
1372  dist = pow(Doub(), 1.0/num);
1373 
1374  ElMult(*currentVec, pin);
1375  for (i = 0; i < num; i++)
1376  {
1377  pin[i] = fin*dist*pin[i] + p0[i];
1378  }
1379  (*this)++;
1380 
1381  return;
1382  }
1383 
1384  void EllipseDev(double **cvar, double *pin, double *p0, double fin)
1385  {
1386  int i;
1387  double dist = 0.0;
1388 
1389  dist = pow(Doub(), 1.0/num);
1390 
1391  EnterMat(cvar);
1392  ElMult(*currentVec, pin);
1393  for (i = 0; i < num; i++)
1394  {
1395  pin[i] = fin*dist*pin[i] + p0[i];
1396  }
1397  (*this)++;
1398 
1399  return;
1400  }
1401 };
1402 
1403 #endif
void del(T *temp)
unsigned long long int int64()
Cholesky(const int nin)
Ran(unsigned long long int)
unsigned int int32()
Ran_old(unsigned long long int j)
void EllipseDev(double *pin, double *p0, double fin)
void Adjust(double *a, const double lim, const int iin)
double MultiDevPDF(double r, int dim)
START_MODEL beta
Definition: Axions.hpp:36
double Dev()
double TransDev(double *ptrOut, double *ptr, double *ptr0)
RandomBasis(int nin, unsigned long long iin)
NormalDev(double mmu, double ssig, unsigned long long i)
void Dev(double **cvar, double *pt, double *mean)
const T SQ(const T a)
double RanMult(double **cin)
void EllipseDev(double **cvar, double *pin, double *p0, double fin)
bool EnterMat(double **a)
MultiNormDev(int nin, double din, unsigned long long iin)
void Mult2(double *ptrOut, double *ptr, double *ptr0, const double Z)
double TransDev()
void ElMult(double *y)
T * matrix(const int xN)
Definition: random_tools.hpp:9
BasicDevs(unsigned long long i)
AdvanceDevs(int nin, double din, unsigned long long iin)
RandomPlane(const int projin, const int nin, const double din, const double alim, const double alimt, unsigned long long iin)
double WalkDev(double *ptrOut, double *ptr, double *ptr0)
MultiNormalDev(double **vvar, double fin, unsigned long long int j, int nin)
void Inverse(double **ainv)
START_MODEL b
Definition: demo.hpp:270
void Dev(double *pt, double *mean)
double MultiDevDist()
bool EnterMat(const std::vector< std::vector< double >> &a)
void RandRot(const int start, const int end)
void MultiDev(double *pin, double *p0)
int Dim() const
ExponDev(double din, unsigned long long ii)
double Dev()
double WalkDev()
Cholesky(double **a, const int nin)
static double draw()
Draw a single uniform random deviate from the interval (0,1) using the chosen RNG engine...
bool KWalkDev(double &Z)
void ChangeDim(const int nin)
double Square(double *y, double *y0, int *map)
const double mu
Definition: SM_Z.hpp:42
void MultiDevGauss(double **cvar, double *pin, double *p0)
dictionary fin
double Doub()
TransformRandomBasis(double **vvar, int nin, unsigned long long iin)
void MultiDev(double **cvar, double *pin, double *p0)
void MultiDev(double *pin, double *p0)
void HopBlow(double *ptrOut, double *ptrIn, double *ptr, double *ptr0)
double KWalkDev()
A threadsafe interface to the STL random number generators.
void Solve(double *b, double *x)
void Mult(double *ptrOut, double *ptr, double *ptr0, const double Z)
START_MODEL dNur_CMB r
void EllipseDev(double *pin, double *p0, double fin)
MultiNormDev(double **vvar, const int nin, double din, unsigned long long iin)
double Doub()
double ** el
AdvanceDevs(double **vvar, const int nin, double din, unsigned long long iin)
void ElMult(double *y, double *b)
void RandRot(const int start=0)
void EllipseDev(double **cvar, double *pin, double *p0, double fin)
virtual ~RandomBasis()
double pow(const double &a)
Outputs a^i.
double Mag(double *a, double *a0)
double Square(double *y, double *y0)
void EnterMat(double **a, int nin)
void RanMult(double *in, const double w, double *out)
std::vector< T > vec(std::vector< T > vector)
Definition: daFunk.hpp:142
double Dev()
double ExpDev()
bool EnterMatM(double **a, const int min)
double DetSqrt()
const T SQR(const T a)
void MultiDev(double **cvar, double *pin, double *p0)
void RanMult(const double in, double *out)