annotate src/samer/models/IIDPrior.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.models;
samer@0 2
samer@0 3 import samer.core.*;
samer@0 4 import samer.core.types.*;
samer@0 5 import samer.maths.*;
samer@0 6 import samer.functions.*;
samer@0 7 import samer.maths.opt.*;
samer@0 8 import samer.tools.*;
samer@0 9
samer@0 10 /**
samer@0 11 Non adaptive model of vector in which each component is
samer@0 12 independent of the others and all are identically distributed
samer@0 13 according to a given prior
samer@0 14 */
samer@0 15
samer@0 16 public class IIDPrior extends AnonymousTask implements Model
samer@0 17 {
samer@0 18 Vec x;
samer@0 19 VVector e; // , g;
samer@0 20 Function logprior, phi;
samer@0 21 VDouble E;
samer@0 22
samer@0 23 double [] _x, _e, _g;
samer@0 24
samer@0 25 // default model is Gaussian
samer@0 26 public IIDPrior(int n) { this(n,new HalfSquare()); }
samer@0 27 public IIDPrior(Vec in) { this(in.size(),new HalfSquare()); setInput(in); }
samer@0 28 public IIDPrior(Vec in, Function E) { this(in.size(),E); setInput(in); }
samer@0 29 public IIDPrior(int N, Function f)
samer@0 30 {
samer@0 31 int n=N;
samer@0 32 e=new VVector("e",n);
samer@0 33 // g=new VVector("phi",n);
samer@0 34 E=new VDouble("E");
samer@0 35 logprior = f; phi = f.derivative();
samer@0 36 _e = e.array();
samer@0 37 _g = new double[n]; // g.array();
samer@0 38 }
samer@0 39
samer@0 40 public int getSize() { return e.size(); }
samer@0 41
samer@0 42 public String toString() { return "IIDPrior:"+logprior.format("x"); }
samer@0 43
samer@0 44 public void dispose() {
samer@0 45 e.dispose();
samer@0 46 // g.dispose();
samer@0 47 E.dispose();
samer@0 48 logprior.dispose();
samer@0 49 phi.dispose();
samer@0 50 }
samer@0 51
samer@0 52 public void setInput(Vec input) { x=input; _x=x.array(); }
samer@0 53 public void setLogPrior(Function f) {
samer@0 54 phi.dispose(); logprior.dispose();
samer@0 55 logprior=f; phi=f.derivative();
samer@0 56 }
samer@0 57
samer@0 58 public VVector getEnergyVector() { return e; }
samer@0 59 public VDouble getEnergySignal() { return E; }
samer@0 60 public double getEnergy() { return E.value; }
samer@0 61 public double [] getGradient() { return _g; }
samer@0 62 public void infer() {}
samer@0 63 public void compute()
samer@0 64 {
samer@0 65 phi.apply(_x,_g); // g.changed();
samer@0 66 logprior.apply(_x,_e); e.changed();
samer@0 67 E.set(Mathx.sum(_e));
samer@0 68 }
samer@0 69
samer@0 70 public Functionx functionx() {
samer@0 71 return new Functionx() {
samer@0 72 public void dispose() {}
samer@0 73 public void evaluate(Datum P) { P.f=evaluate(P.x,P.g); }
samer@0 74 public double evaluate(double [] x, double [] g) {
samer@0 75 logprior.apply(x,g);
samer@0 76 double E=Mathx.sum(g);
samer@0 77 phi.apply(x,g);
samer@0 78 return E;
samer@0 79 }
samer@0 80 };
samer@0 81 }
samer@0 82
samer@0 83 public void run() { compute(); }
samer@0 84 }
samer@0 85