samer@0: package samer.models; samer@0: samer@0: import samer.maths.*; samer@0: import samer.maths.opt.*; samer@0: import samer.tools.*; samer@0: import samer.core.*; samer@0: import samer.core.types.*; samer@0: import java.util.*; samer@0: samer@0: /** samer@0: Non-adaptive generalised exponential factorial prior: the pointy samer@0: bit of the usual GeneralisedExponential has been smoothed out samer@0: by blending with a quadratic. samer@0: */ samer@0: samer@0: public class SmoothGeneralisedExponential extends NamedTask implements Model, Observer { samer@0: Vec input; samer@0: VVector alpha, e, grad; samer@0: int N; samer@0: VDouble E; samer@0: double[] x, g, e0, _e, a, eps; samer@0: double last_eps; samer@0: samer@0: public SmoothGeneralisedExponential(Vec x) { this(x.size()); setInput(x); } samer@0: public SmoothGeneralisedExponential(int n) { samer@0: super("genExp"); samer@0: Shell.push(node); samer@0: N=n; samer@0: E=new VDouble("E"); samer@0: e=new VVector("e",N); samer@0: grad=new VVector("phi",N); samer@0: alpha=new VVector("alpha",N); samer@0: eps=new double[N]; samer@0: alpha.addSaver(); samer@0: Shell.pop(); samer@0: samer@0: alpha.addObserver(this); samer@0: g=grad.array(); // new double[N]; samer@0: e0=new double[N]; samer@0: a=alpha.array(); samer@0: _e=e.array(); samer@0: samer@0: Mathx.setAll(a,1.0); samer@0: setEps(0.1); samer@0: } samer@0: samer@0: public void update(Observable obs, Object arg) { samer@0: setEps(last_eps); samer@0: } samer@0: public void setEps(double e) { samer@0: last_eps=e; samer@0: for (int i=0; i