view src/samer/models/IIDPrior.java @ 0:bf79fb79ee13

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children
line wrap: on
line source
package samer.models;

import samer.core.*;
import samer.core.types.*;
import samer.maths.*;
import samer.functions.*;
import samer.maths.opt.*;
import samer.tools.*;

/**
	Non adaptive model of vector in which each component is
	independent of the others and all are identically distributed
	according to a given prior
	*/

public class IIDPrior extends AnonymousTask implements Model
{
	Vec 		x;
	VVector	e; // , g;
	Function	logprior, phi;
	VDouble	E;

	double [] _x, _e, _g;

	// default model is Gaussian
	public IIDPrior(int n) { this(n,new HalfSquare()); }
	public IIDPrior(Vec in) { this(in.size(),new HalfSquare()); setInput(in); }
	public IIDPrior(Vec in, Function E) { this(in.size(),E); setInput(in); }
	public IIDPrior(int N, Function f)
	{
		int n=N;
		e=new VVector("e",n);
		// g=new VVector("phi",n);
		E=new VDouble("E");
		logprior = f; phi = f.derivative();
		_e = e.array();
		_g = new double[n]; // g.array();
	}

	public int getSize() { return e.size(); }

	public String toString() { return "IIDPrior:"+logprior.format("x"); }

	public void dispose() {
		e.dispose();
		// g.dispose();
		E.dispose();
		logprior.dispose();
		phi.dispose();
	}

	public void setInput(Vec input) {	x=input; _x=x.array(); }
	public void setLogPrior(Function f) {
		phi.dispose(); logprior.dispose();
		logprior=f; phi=f.derivative();
	}

	public VVector	getEnergyVector() { return e; }
	public VDouble	getEnergySignal() { return E; }
	public double	getEnergy() { return E.value; }
	public double [] getGradient() { return _g; 	}
	public void infer() {}
	public void compute()
	{
	  	phi.apply(_x,_g); // g.changed();
		logprior.apply(_x,_e);	e.changed();
		E.set(Mathx.sum(_e));
	}

	public Functionx functionx() {
		return new Functionx() {
			public void dispose() {}
			public void evaluate(Datum P) { P.f=evaluate(P.x,P.g); }
			public double evaluate(double [] x, double [] g) {
				logprior.apply(x,g);
				double E=Mathx.sum(g);
				phi.apply(x,g);
				return E;
			}
		};
	}

	public void run() { compute(); }
}