samer@0: package samer.models; samer@0: samer@0: import samer.core.*; samer@0: import samer.core.types.*; samer@0: import samer.maths.*; samer@0: import samer.functions.*; samer@0: import samer.maths.opt.*; samer@0: import samer.tools.*; samer@0: samer@0: /** samer@0: Non adaptive model of vector in which each component is samer@0: independent of the others and all are identically distributed samer@0: according to a given prior samer@0: */ samer@0: samer@0: public class IIDPrior extends AnonymousTask implements Model samer@0: { samer@0: Vec x; samer@0: VVector e; // , g; samer@0: Function logprior, phi; samer@0: VDouble E; samer@0: samer@0: double [] _x, _e, _g; samer@0: samer@0: // default model is Gaussian samer@0: public IIDPrior(int n) { this(n,new HalfSquare()); } samer@0: public IIDPrior(Vec in) { this(in.size(),new HalfSquare()); setInput(in); } samer@0: public IIDPrior(Vec in, Function E) { this(in.size(),E); setInput(in); } samer@0: public IIDPrior(int N, Function f) samer@0: { samer@0: int n=N; samer@0: e=new VVector("e",n); samer@0: // g=new VVector("phi",n); samer@0: E=new VDouble("E"); samer@0: logprior = f; phi = f.derivative(); samer@0: _e = e.array(); samer@0: _g = new double[n]; // g.array(); samer@0: } samer@0: samer@0: public int getSize() { return e.size(); } samer@0: samer@0: public String toString() { return "IIDPrior:"+logprior.format("x"); } samer@0: samer@0: public void dispose() { samer@0: e.dispose(); samer@0: // g.dispose(); samer@0: E.dispose(); samer@0: logprior.dispose(); samer@0: phi.dispose(); samer@0: } samer@0: samer@0: public void setInput(Vec input) { x=input; _x=x.array(); } samer@0: public void setLogPrior(Function f) { samer@0: phi.dispose(); logprior.dispose(); samer@0: logprior=f; phi=f.derivative(); samer@0: } samer@0: samer@0: public VVector getEnergyVector() { return e; } samer@0: public VDouble getEnergySignal() { return E; } samer@0: public double getEnergy() { return E.value; } samer@0: public double [] getGradient() { return _g; } samer@0: public void infer() {} samer@0: public void compute() samer@0: { samer@0: phi.apply(_x,_g); // g.changed(); samer@0: logprior.apply(_x,_e); e.changed(); samer@0: E.set(Mathx.sum(_e)); samer@0: } samer@0: samer@0: public Functionx functionx() { samer@0: return new Functionx() { samer@0: public void dispose() {} samer@0: public void evaluate(Datum P) { P.f=evaluate(P.x,P.g); } samer@0: public double evaluate(double [] x, double [] g) { samer@0: logprior.apply(x,g); samer@0: double E=Mathx.sum(g); samer@0: phi.apply(x,g); samer@0: return E; samer@0: } samer@0: }; samer@0: } samer@0: samer@0: public void run() { compute(); } samer@0: } samer@0: