void Run() {
// Get the arrays of ages and prices from mitsub.txt
double[ ages; double[ prices; int n;
LoadData(@"data/mitsub.txt", out ages, out prices, out n);
double A_tau = 0.01;
double B_tau = 0.01; double sigma2_beta = 1.0E+8;
Vector vmu_vbeta = new Vector(new double[ { 0.0, 0.0 });
PositiveDefiniteMatrix mSigma_vbeta =
PositiveDefiniteMatrix.IdentityScaledBy(2,1/sigma2_beta);
// Create priors for tau, vbeta
Variable<double> tau = Variable.GammaFromShapeAndScale(A_tau,1/B_tau).Named("tau");
Variable<Vector> vbeta = Variable.VectorGaussianFromMeanAndPrecision(vmu_vbeta, mSigma_vbeta).Named("vbeta");
Range agesRange = new Range(n).Named("n");
Vector[ xdata = new Vector
;
for (int i = 0; i < n; i++) xdata
= new Vector(1, ages
);
VariableArray<Vector> vx = Variable.Observed(xdata,agesRange).Named("vx");
VariableArray<double> vmu = Variable.Array<double>(agesRange);
using(Variable.ForEach(agesRange)) {
vmu[agesRange] = Variable.InnerProduct(vbeta,vx[agesRange]);
}
VariableArray<double> vy = Variable.Array<double>(agesRange);
vy[agesRange] = Variable.GaussianFromMeanAndPrecision(vmu[agesRange],tau).Named("vy");
vy.ObservedValue = prices;
// Create an inference engine for VMP
InferenceEngine engine = new InferenceEngine(new VariationalMessagePassing());
Console.WriteLine("Dist over tau=\n" + engine.Infer<Gamma>(tau));
Console.WriteLine("Dist over vbeta=\n" + engine.Infer<VectorGaussian>(vbeta));
}