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 }