source: issm/trunk-jpl/src/c/shared/Random/random.cpp@ 26477

Last change on this file since 26477 was 26477, checked in by vverjans, 3 years ago

autoregression SMB module, Random utilities, Cholesky decomposition

  • Property svn:executable set to *
File size: 2.6 KB
Line 
1/*!\file: random
2 * \brief random number generating functions
3 */
4
5/*Headers*/
6/*{{{*/
7#include <stdio.h>
8#include <sys/types.h>
9#include <math.h>
10#include <float.h> /* DBL_EPSILON */
11#include <chrono>
12#include <cstdarg>
13#include <iostream>
14#include <random>
15
16#include "../Matrix/matrix.h"
17#include "../Exceptions/exceptions.h"
18#include "../MemOps/MemOps.h"
19#include "../io/io.h"
20/*}}}*/
21
22void univariateNormal(IssmDouble* prand, IssmDouble mean, IssmDouble sdev) { /*{{{*/
23 /*univariateNormal generates a random value follwoing Normal distribution*/
24 unsigned seed = std::chrono::steady_clock::now().time_since_epoch().count(); //random seed using time_since_epoch
25 std::default_random_engine generator(seed); //generator of random numbers
26 std::normal_distribution<double> normdistri(mean,sdev); //Normal probability distribution
27 double tfunc;
28 *prand = normdistri(generator);
29} /*}}}*/
30void multivariateNormal(IssmDouble** prand, int dim, IssmDouble mean, IssmDouble* covariancematrix) { /*{{{*/
31 IssmDouble* sampleStandardNormal = xNew<IssmDouble>(dim);
32 IssmDouble* sampleMultivariateNormal = xNew<IssmDouble>(dim);
33 IssmDouble* Lchol = xNewZeroInit<IssmDouble>(dim*dim);
34 for(int ii{0};ii<dim;ii++){univariateNormal(&(sampleStandardNormal[ii]),0.0,1.0);}
35 CholeskyRealPositiveDefinite(Lchol,covariancematrix,dim);
36 for(int ii{0};ii<dim;ii++){ //matrix by vector multiplication
37 double sum{0.0};
38 for(int jj{0};jj<dim;jj++){sum += sampleStandardNormal[jj]*Lchol[ii*dim+jj];} //entry-by-entry multiplication along matrix row
39 sampleMultivariateNormal[ii] = mean+sum; //assign value
40 }
41 *prand = sampleMultivariateNormal;
42 xDelete<IssmDouble>(sampleStandardNormal);
43 xDelete<IssmDouble>(Lchol);
44} /*}}}*/
45void multivariateNormal(IssmDouble** prand, int dim, IssmDouble* mean, IssmDouble* covariancematrix) { /*{{{*/
46 IssmDouble* sampleStandardNormal = xNew<IssmDouble>(dim);
47 IssmDouble* sampleMultivariateNormal = xNew<IssmDouble>(dim);
48 IssmDouble* Lchol = xNewZeroInit<IssmDouble>(dim*dim);
49 for(int ii{0};ii<dim;ii++){univariateNormal(&(sampleStandardNormal[ii]),0.0,1.0);}
50 CholeskyRealPositiveDefinite(Lchol,covariancematrix,dim);
51 for(int ii{0};ii<dim;ii++){ //matrix by vector multiplication
52 double sum{0.0};
53 for(int jj{0};jj<dim;jj++){sum += sampleStandardNormal[jj]*Lchol[ii*dim+jj];} //entry-by-entry multiplication along matrix row
54 sampleMultivariateNormal[ii] = mean[ii]+sum; //assign value
55 }
56 *prand = sampleMultivariateNormal;
57 xDelete<IssmDouble>(sampleStandardNormal);
58 xDelete<IssmDouble>(Lchol);
59} /*}}}*/
60
61
62
Note: See TracBrowser for help on using the repository browser.