Mercurial > hg > jslab
annotate src/samer/maths/random/PosteriorSampler.java @ 8:5e3cbbf173aa tip
Reorganise some more
author | samer |
---|---|
date | Fri, 05 Apr 2019 22:41:58 +0100 |
parents | bf79fb79ee13 |
children |
rev | line source |
---|---|
samer@0 | 1 package samer.maths.random; |
samer@0 | 2 import samer.maths.*; |
samer@0 | 3 import samer.core.*; |
samer@0 | 4 |
samer@0 | 5 /** |
samer@0 | 6 sample from posterior |
samer@0 | 7 instead of supplying weighting factor, |
samer@0 | 8 reject a fraction of the samples |
samer@0 | 9 make take a long time if A<<sigma |
samer@0 | 10 */ |
samer@0 | 11 |
samer@0 | 12 class PosteriorSampler extends BaseRandom |
samer@0 | 13 { |
samer@0 | 14 double A, sigma; |
samer@0 | 15 double std, var, mean; |
samer@0 | 16 |
samer@0 | 17 public PosteriorSampler() {} |
samer@0 | 18 |
samer@0 | 19 public void setA(double a) { A=a; std=sigma/A; var=std*std; } |
samer@0 | 20 public void setSigma(double s) { sigma=s; std=sigma/A; var=std*std; } |
samer@0 | 21 public void setx(double x) { mean=x/A; } |
samer@0 | 22 |
samer@0 | 23 public double next() |
samer@0 | 24 { |
samer@0 | 25 double v; |
samer@0 | 26 boolean ok=false; |
samer@0 | 27 |
samer@0 | 28 do { |
samer@0 | 29 v=mean + std*rnd.nextGaussian(); |
samer@0 | 30 |
samer@0 | 31 if (v<=-var) { |
samer@0 | 32 v=v+var; |
samer@0 | 33 if (mean<0) { |
samer@0 | 34 double k=Math.exp(2*mean); |
samer@0 | 35 double u=rnd.nextDouble(); |
samer@0 | 36 if (u<k) ok=true; |
samer@0 | 37 } else ok=true; |
samer@0 | 38 } else if (v>=var) { |
samer@0 | 39 v=v-var; |
samer@0 | 40 if (mean>0) { |
samer@0 | 41 double k=Math.exp(-2*mean); |
samer@0 | 42 double u=rnd.nextDouble(); |
samer@0 | 43 if (u<k) ok=true; |
samer@0 | 44 } else ok=true; |
samer@0 | 45 } |
samer@0 | 46 } while (!ok); |
samer@0 | 47 |
samer@0 | 48 return v; |
samer@0 | 49 } |
samer@0 | 50 } |