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
|