public void Train(double[][] observations, int numberOfIterations, double likelihoodTolerance)
        {
            if (_initialize)
            {
                Initialize(observations);
            }
            if (_pi == null || _transitionProbabilityMatrix == null || _emission == null)
            {
                throw new ApplicationException("Initialize the model with initial valuesss");
            }
            var model = HiddenMarkovModelStateFactory.GetState(new ModelCreationParameters <Mixture <IMultivariateDistribution> > {
                Pi = _pi, TransitionProbabilityMatrix = _transitionProbabilityMatrix, Emissions = _emission
            });                                                                                                                                                                                                                 //new HiddenMarkovModelState<Mixture<IMultivariateDistribution>>(_pi, _transitionProbabilityMatrix, _emission);

            model.Normalized = Normalized;
            var alg = new BaumWelchWeightedMixtureDistribution(Helper.Convert(observations),
                                                               TimeSensitiveWeightCalculator.Calculate(7, observations.Length),
                                                               model);
            var estimatedParameters = alg.Run(numberOfIterations, likelihoodTolerance);

            _pi = estimatedParameters.Pi;
            _transitionProbabilityMatrix = estimatedParameters.TransitionProbabilityMatrix;
            _emission  = estimatedParameters.Emission;
            Likelihood = estimatedParameters.Likelihood;
        }
        public void Run_TrainingSetAndModel_TrainedModel()
        {
            var util               = new TestDataUtils();
            var observationArray   = util.GetSvcData(util.FTSEFilePath, new DateTime(2010, 12, 18), new DateTime(2011, 12, 18));
            var observations       = Helper.Convert(observationArray);
            var observationsWeight = Array.ConvertAll(TimeSensitiveWeightCalculator.Calculate(14, observations.Count), x => (decimal)x);

            Initialize(observationArray);
            var model = HiddenMarkovModelFactory.GetModel(new ModelCreationParameters <Mixture <IMultivariateDistribution> >()
            {
                Pi = _pi, TransitionProbabilityMatrix = _tpm, Emissions = _emission
            });

            model.Normalized = true;

            var algo = new BaumWelchWeightedMixtureDistribution(observations, observationsWeight, model);
            var trainedModelState = algo.Run(MaxIterationNumber, LikelihoodTolerance);

            Assert.AreEqual(1d, Math.Round(trainedModelState.Pi.Sum(), 5));
            Assert.AreEqual(1d, Math.Round(trainedModelState.TransitionProbabilityMatrix[0].Sum(), 5));
            Assert.AreEqual(1d, Math.Round(trainedModelState.TransitionProbabilityMatrix[1].Sum(), 5));
            Assert.AreEqual(1d, Math.Round(trainedModelState.TransitionProbabilityMatrix[2].Sum(), 5));
        }