Time Series Parameter learning in C#

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="ParameterLearningTemporal.cs" company="Bayes Server">
//   Copyright (C) Bayes Server.  All rights reserved.
// </copyright>
// --------------------------------------------------------------------------------------------------------------------

namespace BayesServer.HelpSamples
    using System;
    using System.Data.SqlClient;

    using BayesServer.Data;
    using BayesServer.Inference.RelevanceTree;
    using BayesServer.Learning.Parameters;

    public static class ParameterLearningTemporal
        public static void Main()
            // we manually construct the network here, but it could be loaded from a file
            var network = CreateNetworkStructure();
            var x1 = network.Variables["X1"];
            var x2 = network.Variables["X2"];
            // now learn the parameters from the data in Walkthrough 3 - Time Series network

            // This example uses Sql Server as the data source and assumes the data has been copied to
            // a table called TimeSeriesWalkthrough
            // We will use the RelevanceTree algorithm here, as it is optimized for parameter learning
            var learning = new ParameterLearning(network, new RelevanceTreeInferenceFactory());
            var learningOptions = new ParameterLearningOptions();
            learningOptions.TimeSeriesMode = TimeSeriesMode.Rolling;

            // sql server connection string
            string sqlServer = @"localhost\sqlexpress"; // change this to your sql server instance name
            string database = "BayesServer";    // change this to your database name

            string connectionString = string.Format(
                @"Data Source={0};Initial Catalog={1};Integrated Security=True;", sqlServer, database);

            IDataReaderCommand temporalDataReaderCommand = new DatabaseDataReaderCommand(
                "Select [Case], Time, X1, X2 From TimeSeriesWalkthrough ORDER BY [Case], Time");

            bool cacheDataInMemory = true;  // set this to false for large data sets

            if (cacheDataInMemory)
                temporalDataReaderCommand = new DataTableDataReaderCommand(temporalDataReaderCommand.ExecuteReader());

            var temporalReaderOptions = new TemporalReaderOptions("Case", "Time", TimeValueType.Index);

            // here we map variables to database columns
            // in this case the variables and database columns have the same name
            var temporalVariableReferences = new VariableReference[]
                    new VariableReference(x1, ColumnValueType.Value, x1.Name),
                    new VariableReference(x2, ColumnValueType.Value, x2.Name)

            // note that although this example only has temporal data
            // we could have included additional non temporal variables and data

            var evidenceReaderCommand = new EvidenceReaderCommand(

            var result = learning.Learn(evidenceReaderCommand, learningOptions);

            Console.WriteLine("Log likelihood = {0}", result.LogLikelihood.Value);


        private static Network CreateNetworkStructure()
            var network = new Network();

            var x1 = new Variable("X1", VariableValueType.Continuous);
            var x2 = new Variable("X2", VariableValueType.Continuous);

            // add a temporal (time series) node, with two continuous variables
            var nodeX = new Node("X", new Variable[] { x1, x2 })
                TemporalType = BayesServer.TemporalType.Temporal


            // add temporal links
            for (int order = 1; order <= 4; order++)
                network.Links.Add(new Link(nodeX, nodeX, order));

            // at this point the Dynamic Bayesian network structure is fully specified

            return network;