Esempio n. 1
0
        public void LikelihoodConstructorTest()
        {
            int[]      o      = null; // TODO: инициализация подходящего значения
            HMM_QPN    model  = null; // TODO: инициализация подходящего значения
            Likelihood target = new Likelihood(o, model);

            Assert.Inconclusive("TODO: реализуйте код для проверки целевого объекта");
        }
Esempio n. 2
0
        public double b(int i, int d, int t)//t - правая граница
        {
            Debug.WriteLine("b(" + i + "," + d + "," + t + "): ");
            if (t - d <= 0 && t <= 0 || t - d > O.Length)
            {
                Debug.WriteLine("b(" + i + "," + d + "," + t + "): " + 0);
                return(0);//или t > O.Length
            }
            else
            {
                double   prod = 1;
                double[] fi   = HMM_QPN.integral(Model.Ro[i], Model.Ro[i].Length, d);
                //TODO: Хранить фи
                int m = 1;
                int k = d;
                if (t - d > 0)
                {
                    m = 1;
                    Debug.WriteLine("m: t - d > 0 " + m);
                }
                else
                {
                    m = 1 - t + d;
                    Debug.WriteLine("m: t - d <= 0 " + m);
                }
                if (t <= O.Length)
                {
                    k = d;
                    Debug.WriteLine("k:t <= O.Length " + k);
                }
                else
                {
                    k = O.Length - t + d;
                    Debug.WriteLine("k: t > O.Length " + k);
                }
                Debug.WriteLine("from " + m + "; to " + k);
                for (int theta = m; theta <= k; theta++)
                {
                    int I = MultiplicativeGroupIndicator(O[t - d + theta], Model.q);
                    Debug.Write(" position: " + (t - d + theta) + " I(" + O[t - d + theta] + ", " + Model.q + "): " + I);
                    Debug.Write(" fi: " + fi[theta - 1]);
                    Debug.Write(" Per: " + (double)Model.Per[i]);
                    Debug.Write(" d: " + (double)d);

                    double mult = (I == 1) ? (double)fi[theta - 1] * (double)Model.Per[i] * (double)d * (double)Model.B[i, O[t - d + theta] - 1] : (1 - (double)fi[theta - 1] * (double)Model.Per[i] * d);
                    if (I == 1)
                    {
                        Debug.Write(" B: " + (double)Model.B[i, O[t - d + theta] - 1]);
                    }
                    Debug.WriteLine(" mult(" + theta + "): " + mult);
                    prod *= mult;
                }
                Debug.WriteLine("b(" + i + "," + d + "," + t + "): " + prod);
                return(prod);
            }
        }
Esempio n. 3
0
        public void Max_PeriodTest()
        {
            HMM_QPN Model    = null; // TODO: инициализация подходящего значения
            int     expected = 0;    // TODO: инициализация подходящего значения
            int     actual;

            actual = HMM_PSM_Accessor.Max_Period(Model);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Проверьте правильность этого метода теста.");
        }
Esempio n. 4
0
        public void IsCorrectTest()
        {
            string  filename = string.Empty;          // TODO: инициализация подходящего значения
            HMM_QPN target   = new HMM_QPN(filename); // TODO: инициализация подходящего значения
            int     expected = 0;                     // TODO: инициализация подходящего значения
            int     actual;

            actual = target.IsCorrect();
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Проверьте правильность этого метода теста.");
        }
Esempio n. 5
0
        public void LikelihoodExtended1Test()
        {
            HMM_QPN Model = null;   // TODO: инициализация подходящего значения

            int[]  O        = null; // TODO: инициализация подходящего значения
            double expected = 0F;   // TODO: инициализация подходящего значения
            double actual;

            actual = HMM_PSM.LikelihoodExtended1(Model, O);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Проверьте правильность этого метода теста.");
        }
Esempio n. 6
0
        public void LikelihoodExtendedTest()
        {
            HMM_QPN Model = new HMM_QPN("F:/аспирантура/Programs/10.12.12/HSMPQApplication/M_1.txt");

            int[]  O        = { 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0 }; // TODO: инициализация подходящего значения
            double expected = 0F;                                                             // TODO: инициализация подходящего значения
            double actual;

            actual = HMM_PSM.LikelihoodExtended(Model, O);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Проверьте правильность этого метода теста.");
        }
Esempio n. 7
0
        public void ProbabilityFromDistributionTest()
        {
            string  filename = string.Empty;          // TODO: инициализация подходящего значения
            HMM_QPN target   = new HMM_QPN(filename); // TODO: инициализация подходящего значения

            DistributionPare[] DP       = null;       // TODO: инициализация подходящего значения
            double[]           expected = null;       // TODO: инициализация подходящего значения
            double[]           actual;
            actual = target.ProbabilityFromDistribution(DP);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Проверьте правильность этого метода теста.");
        }
Esempio n. 8
0
        private void btOMCCalculateProbability_Click(object sender, EventArgs e)
        {
            if (lbOMCModelPath.Text != "" && lbOMCSequencePath.Text != "" && tbOMCSegmentLength.Text != "" && tbOMCSequenceLength.Text != "")
            {
                int     segmentSize    = Int32.Parse(tbOMCSegmentLength.Text);  //добавить проверку
                int     sequenceLength = Int32.Parse(tbOMCSequenceLength.Text); //добавить проверку
                HMM_QPN Model          = new HMM_QPN(lbOMCModelPath.Text);
                if (Model.IsCorrect() == 1)
                {
                    int[] res = new int[sequenceLength + 1];
                    try
                    {
                        res = HMM_PSM.GetOutputSequence(lbOMCSequencePath.Text, sequenceLength);
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Желаемая длина последовательности превышает размер файла");
                        return;
                    }
                    ModelObject         model         = new ModelObject(lbOMCModelPath.Text, Model);
                    SequenceObject      sequence      = new SequenceObject(lbOMCSequencePath.Text, res);
                    OneModelComputation computor      = new OneModelComputation(model, sequence, segmentSize, sequenceLength);
                    List <double>       probabilities = computor.compute();

                    string s = "Model: " + model.ModelName + "\r\n Sequence: " + sequence.SequenceName + "\r\n Sequence length: " + sequenceLength + "\r\n Segment size: " + segmentSize + "\r\n";
                    for (int i = 0; i < probabilities.Count(); i++)
                    {
                        s += probabilities.ElementAt(i) + ",";
                    }
                    OutStreamer os = new OutStreamer("omc.txt", FileOpenMode.RewriteMode);

                    os.StringToFile(s);
                    if (saveFileDialogExperiment.ShowDialog() == DialogResult.OK)
                    {
                        StreamReader f   = File.OpenText("omc.txt");
                        string       Buf = f.ReadToEnd();
                        StreamWriter sw  = new StreamWriter(File.Create(saveFileDialogExperiment.FileName));
                        sw.Write(Buf);
                        sw.Close();
                        f.Close();
                    }
                }
                else
                {
                    MessageBox.Show("Модель некорректна");
                }
            }
            else
            {
                MessageBox.Show("Не все параметры заданы");
            }
        }
Esempio n. 9
0
        public void FullProbabilityTest()
        {
            int[]      o        = null;                     // TODO: инициализация подходящего значения
            HMM_QPN    model    = null;                     // TODO: инициализация подходящего значения
            Likelihood target   = new Likelihood(o, model); // TODO: инициализация подходящего значения
            int        t        = 0;                        // TODO: инициализация подходящего значения
            double     expected = 0F;                       // TODO: инициализация подходящего значения
            double     actual;

            actual = target.FullProbability(t);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Проверьте правильность этого метода теста.");
        }
Esempio n. 10
0
        private void GenerateBtn_Click(object sender, EventArgs e)
        {
            HMM_QPN Model = new HMM_QPN(filestr);
            int     seq_length;

            if (int.TryParse(textBox3.Text, out seq_length))
            {
                if (Model.IsCorrect() == 1)
                {
                    panel1.Enabled   = false;
                    textBox1.Enabled = false;
                    DateTime startTime = DateTime.Now;
                    DateTime endTime;
                    Model.StartGenerator(seq_length, HSMPQApplication.Mode.Release, HSMPQApplication.PRNGMode.Random);
                    endTime = DateTime.Now;
                    TimeSpan employedTime = endTime - startTime;
                    lbEmployedTime.Text = "Время, затраченное на генерацию " + employedTime.ToString();
                    panel1.Enabled      = true;
                    textBox1.Enabled    = true;
                    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                    {
                        StreamReader f   = File.OpenText("res.txt");
                        string       Buf = f.ReadToEnd();
                        StreamWriter sw  = new StreamWriter(File.Create(saveFileDialog1.FileName));
                        sw.Write(Buf);
                        sw.Close();
                        f.Close();
                    }
                }
                else if (Model.IsCorrect() == 3)
                {
                    MessageBox.Show("Для параметров не выполняются необходимые условия стохастичности");
                }
                else if (Model.IsCorrect() == 4)
                {
                    MessageBox.Show("Для параметров не выполняются необходимые условия адаптированности");
                }
                else if (Model.IsCorrect() == 0)
                {
                    MessageBox.Show("Размерности вводимых параметров не соответствуют");
                }
                else if (Model.IsCorrect() == 2)
                {
                    MessageBox.Show("Не все параметры заданы");
                }
            }
            else
            {
                MessageBox.Show("Введите длину последовательости ошибок");
            }
        }
Esempio n. 11
0
        public static double SymbolFinalProbability(HMM_QPN Model, double fi, int d, int i, int symbol)
        {
            double smb_final_prob = 0;

            if (symbol == 0)
            {
                smb_final_prob = 1 - fi * Model.Per[i] * d;
            }
            else
            {
                smb_final_prob = fi * Model.Per[i] * d * Model.B[i, symbol - 1];
            }
            return(smb_final_prob);
        }
Esempio n. 12
0
        public void SymbolFinalProbabilityTest()
        {
            HMM_QPN Model    = null; // TODO: инициализация подходящего значения
            double  fi       = 0F;   // TODO: инициализация подходящего значения
            int     d        = 0;    // TODO: инициализация подходящего значения
            int     i        = 0;    // TODO: инициализация подходящего значения
            int     symbol   = 0;    // TODO: инициализация подходящего значения
            double  expected = 0F;   // TODO: инициализация подходящего значения
            double  actual;

            actual = HMM_PSM.SymbolFinalProbability(Model, fi, d, i, symbol);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Проверьте правильность этого метода теста.");
        }
Esempio n. 13
0
        public void alphaTest()
        {
            HMM_QPN Model = null;   // TODO: инициализация подходящего значения

            int[]  O        = null; // TODO: инициализация подходящего значения
            int    d        = 0;    // TODO: инициализация подходящего значения
            int    i        = 0;    // TODO: инициализация подходящего значения
            int    t        = 0;    // TODO: инициализация подходящего значения
            double expected = 0F;   // TODO: инициализация подходящего значения
            double actual;

            actual = HMM_PSM_Accessor.alpha(Model, O, d, i, t);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Проверьте правильность этого метода теста.");
        }
Esempio n. 14
0
 public Likelihood(int[] o, HMM_QPN model)
 {
     O = o;
     Model = model;
     int D = model.MaxPeriodOverall();
     alpha = new double[model.n, D + 1, o.Length + Model.MaxPeriodOverall()];
     P = new double[o.Length + Model.MaxPeriodOverall()];
     for (int r = 0; r < o.Length + Model.MaxPeriodOverall(); r++)
     {
         for (int i = 0; i < model.n; i++)
             for (int d = 0; d <= D; d++)
                 alpha[i, d, r] = -1;
         P[r] = -1;
     }
 }
Esempio n. 15
0
        public void bTest()
        {
            HMM_QPN Model = new HMM_QPN("H:/аспирантура/Programs/10.12.12/HSMPQApplication/13.01.txt");

            int[]  O        = { 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0 };
            int    i        = 0;                            // TODO: инициализация подходящего значения
            int    t        = 25;                           // TODO: инициализация подходящего значения
            double expected = 0.0000066483263599150104576F; // TODO: инициализация подходящего значения
            double actual;

            actual = HMM_PSM_Accessor.b(Model, O, i, t, O.Length);
            double epsilon = 0.00000001F;
            bool   correct = Math.Abs(actual - expected) <= epsilon;

            Assert.AreEqual(correct, true);
        }
Esempio n. 16
0
        private static int Max_Period(HMM_QPN Model)
        {
            int max_period = 0;//максимальная длительность по всем состояниям (у Рабинера D)
            int i          = 0;

            for (i = 0; i <= Model.A.GetLength(0) - 1; i++)//определяем max_period
            {
                double[] f_values     = Model.ValueFromDistribution(Model.F[i]);
                int      max_in_state = (int)HMM_QPN.MaxElementOfArray(f_values);
                if (max_in_state > max_period)
                {
                    max_period = max_in_state;
                }
            }
            return(max_period);
        }
Esempio n. 17
0
        /// <summary>
        /// Функция вычисления вероятности наблюдения частичной последовательности O_{t-d+1:t} в состоянии i, где d = O.length
        /// </summary>
        /// <param name="O">частичная последовательность</param>
        /// <param name="i">состояние</param>
        /// <param name="t">момент времени соответствующий концу частичной последовательности внутри целой</param>
        /// <param name="d">длинна квазипериода</param>
        /// <returns></returns>
        private static double b(HMM_QPN Model, int[] O, int i, int t, int d)
        {
            if (t <= 0)
            {
                return(1);
            }
            else
            {
                double prod = 1;
                if (O == null || O.Length == 0)
                {
                    return(1);
                }
                else
                {
                    //int o = O.Length;
                    if (d == 0)
                    {
                        return(1);
                    }
                    int q = Model.B.GetLength(1) + 1;//мощность поля Галуа

                    double[] fi = HMM_QPN.integral(Model.Ro[i], Model.Ro[i].Length, d);
                    int      theta;
                    for (theta = 0; theta < O.Length; theta++)
                    {
                        try
                        {
                            int I = MultiplicativeGroupIndicator(O[theta], q);//-1 из-за того что в реализации массив нумеруется с 0

                            prod *= (I == 1) ? fi[d - O.Length + theta] * Model.Per[i] * d * Model.B[i, O[theta] - 1] : (1 - fi[theta] * Model.Per[i] * d);
                        }
                        catch
                        { }
                    }
                    ;
                    return(prod);
                }
            }
        }
Esempio n. 18
0
 public double[] calculateSplitedLikelihood(HMM_QPN model, int[] O)
 {
     if (segment_size <= 0)
     {
         return(null);
     }
     else
     {
         int      h      = O.Length / segment_size;
         double[] result = new double[h];
         for (int i = 0; i < h; i++)
         {
             int[] subseq = new int[segment_size + 1];
             for (int j = 1; j <= segment_size; j++)
             {
                 subseq[j] = O[i * segment_size + j];
             }
             Likelihood lk = new Likelihood(subseq, model);
             result[i] = lk.FullProbability(subseq.Length - 1);
         }
         return(result);
     }
 }
Esempio n. 19
0
        public void MinElementOfArrayTest()
        {
            double[] p        = { 0.7F, 0.3F, 0.1F };
            double   expected = 0.1F;
            double   actual;

            actual = HMM_QPN.MinElementOfArray(p);
            Assert.AreEqual(expected, actual);
            // наибольший последний
            double[] p1 = { 0.1F, 0.3F, 0.7F };
            expected = 0.1F;
            actual   = HMM_QPN.MaxElementOfArray(p1);
            Assert.AreEqual(expected, actual);
            //наибольший в середине
            double[] p2 = { 0.1F, 0.3F, 0.7F };
            expected = 0.1F;
            actual   = HMM_QPN.MaxElementOfArray(p2);
            Assert.AreEqual(expected, actual);
            //всего 1 элемент
            double[] p3 = { 0.7F };
            expected = 0.1F;
            actual   = HMM_QPN.MaxElementOfArray(p3);
            Assert.AreEqual(expected, actual);
        }
Esempio n. 20
0
 public List <ModelObject> getModelsList()
 {
     if (this.modelsFolderPath == null)
     {
         return(null);
     }
     try
     {
         string[] files = Directory.GetFiles(this.modelsFolderPath);
         if (files == null && files.Length == 0)
         {
             return(null);
         }
         List <ModelObject> result = new List <ModelObject>();
         for (int i = 0; i <= files.Length; i++)
         {
             try
             {
                 HMM_QPN Model = new HMM_QPN(files[i]);
                 if (Model.IsCorrect() == 1)
                 {
                     result.Add(new ModelObject(files[i], Model));
                 }
             }
             catch
             {
                 //TODO do smth or change try to if
             }
         }
         return(result);
     }
     catch
     {
         return(null);
     }
 }
Esempio n. 21
0
        public static double Likelihood(HMM_QPN Model, int[] res, out double[,] norm_alpha_par, out double[,] alpha_par, out double[] norm_coeff, out double prob)// считает вероятность того, что последовательность наблюдений res получена с помощью модели Model
        //res numeruetsya ot 1
        {
            #region Описание переменных
            int n = Model.A.GetLength(0);                     //число состояний
            int T = res.Length - 1;                           //длина последовательности наблюдений
            double[,] alpha           = new double[n, T + 1]; //прямая переменная
            double[,] auxiliary_alpha = new double[n, T + 1];
            double[,] norm_alpha      = new double[n, T + 1]; //нормированная прямая переменная
            double[] c          = new double[T + 1];          //коэффициенты нормировки
            int      max_period = 0;                          //максимальная длительность по всем состояниям (у Рабинера D)
            #endregion
            #region Определение максимальной длительности по всем состояниям
            int i = 0;
            for (i = 0; i < n; i++)//определяем max_period
            {
                double[] f_values     = Model.ValueFromDistribution(Model.F[i]);
                int      max_in_state = (int)HMM_QPN.MaxElementOfArray(f_values);
                if (max_in_state > max_period)
                {
                    max_period = max_in_state;
                }
            }
            #endregion
            //преобразуем p_i(d) к виду ряда распределения где d принадлежит от 1 до D(то есть) max_period,а вероятность =0 если такой длины нет
            #region Матрица плотностей длительностей состояний
            float[,] length_density = new float[n, max_period + 1];//матрица плотностей длительности состояний.
            //Второй индекс соответствует длине, значение - вероятности
            for (i = 0; i < n; i++)
            {
                for (int d = 1; d <= max_period; d++)
                {
                    length_density[i, d] = 0;//занулили все элементы матрицы
                }
                for (int j = 0; j < Model.F[i].Length; j++)
                {
                    length_density[i, Model.F[i][j].value] = Model.F[i][j].probability;//изменили те элементы, для которых вероятность нулю не равна
                }
            }
            #endregion
            #region Старый вариант формул
            //#region Для t=1
            ////для t=1
            //c[1] = 0;
            //for (i=0; i<n; i++)
            //{
            //    if (length_density[i, 1] > 0)
            //    {
            //        float[] fi = new float[1];
            //        fi = HMM_QPN.integral(Model.Ro[i], Model.Ro[i].Length, 1);
            //        alpha[i, 1] = SymbolFinalProbability(Model, fi[0], 1, i, res[1]) * Model.Pi[i] * length_density[i, 1];
            //        auxiliary_alpha[i, 1] = SymbolFinalProbability(Model, fi[0], 1, i, res[1]) * Model.Pi[i] * length_density[i, 1];
            //    }
            //    else
            //    {
            //        alpha[i, 1] = 0;
            //        auxiliary_alpha[i, 1] =0;
            //    }
            //    c[1] += auxiliary_alpha[i, 1];
            //}
            //c[1] =(c[1]!=0)?1 / c[1]:0;//вычислили нормировочный коэффициент
            //for (i = 0; i < n; i++)
            //{
            //    norm_alpha[i, 1] = auxiliary_alpha[i, 1] * c[1];
            //}
            //#endregion
            //#region Для 1<t<=D
            ////вторая строчка формулы
            //int t=2;
            //for (t = 2; (t <= max_period)&&(t<=T); t++)
            //{
            //    c[t] = 0;
            //    for (i = 0; i < n; i++)
            //    {
            //        //первое слагаемое формулы 2
            //        float term1 = 0;
            //        if (length_density[i, t] > 0)
            //        {
            //            float[] fi = new float[t];
            //            fi = HMM_QPN.integral(Model.Ro[i], Model.Ro[i].Length, t);
            //            float prod_tilda_b1 = 1;//переменная для произведения b c волной
            //            for (int s = 1; s <= t; s++)
            //            {
            //                prod_tilda_b1 *= SymbolFinalProbability(Model, fi[s - 1], t, i, res[s]);
            //            }
            //            term1 = Model.Pi[i] * length_density[i, t] * prod_tilda_b1;
            //        }
            //        float term2 = 0;
            //        float norm_term2 = 0;
            //        for (int d = 1; d <= t - 1; d++)
            //            for (int j = 0; j < n; j++)
            //            {
            //                float prod_tilda_b2 = 1;
            //                if (length_density[i, d] > 0)
            //                {
            //                    float[] fi2 = new float[d];
            //                    fi2 = HMM_QPN.integral(Model.Ro[i], Model.Ro[i].Length, d);

            //                    for (int s = t - d + 1; s <= t; s++)
            //                    {
            //                        prod_tilda_b2 *= SymbolFinalProbability(Model, fi2[s - t + d - 1],d, i, res[s]);
            //                    }
            //                    term2 += alpha[j, t - d] * Model.A[j, i] * length_density[i, d] * prod_tilda_b2;
            //                    norm_term2 += norm_alpha[j, t - d] * Model.A[j, i] * length_density[i, d] * prod_tilda_b2;
            //                }
            //            }
            //        alpha[i, t] = term1 + term2;
            //        auxiliary_alpha[i, t] = term1 + norm_term2;
            //        c[t] += auxiliary_alpha[i, t];
            //    }
            //    c[t] = (c[t] != 0) ? 1 / c[t] : 0;
            //    for (i = 0; i < n; i++)
            //    {
            //        norm_alpha[i, t] = auxiliary_alpha[i, t] * c[t];
            //    }
            //}
            //#endregion
            //#region Для t>D
            ////третья строчка формулы
            //for (t = max_period + 1; t <= T; t++)
            //{
            //    c[t] = 0;
            //    for (i = 0; i < n; i++)
            //    {
            //        float term = 0;
            //        float norm_term = 0;
            //        for (int d = 1; d <= max_period; d++)
            //            for (int j = 0; j < n; j++)
            //            {
            //                if (length_density[i, d] > 0)
            //                {
            //                    float prod_tilda_b = 1;
            //                    float[] fi = new float[d];
            //                    fi = HMM_QPN.integral(Model.Ro[i], Model.Ro[i].Length, d);

            //                    for (int s = t - d + 1; s <= t; s++)
            //                    {
            //                        prod_tilda_b *= SymbolFinalProbability(Model, fi[s - t + d - 1], d, i, res[s]);
            //                    }
            //                    term += alpha[j, t - d] * Model.A[j, i] * length_density[i, d] * prod_tilda_b;
            //                    norm_term += norm_alpha[j, t - d] * Model.A[j, i] * length_density[i, d] * prod_tilda_b;
            //                }
            //            }
            //        alpha[i, t] = term;
            //        auxiliary_alpha[i, t] = norm_term;
            //        c[t] += auxiliary_alpha[i, t];
            //    }
            //    c[t] = (c[t] != 0) ? 1 / c[t] : 0;
            //    for (i = 0; i < n; i++)
            //    {
            //        norm_alpha[i, t] = auxiliary_alpha[i, t] * c[t];
            //    }
            //}
            //  #endregion
            #endregion Старый вариант формул
            #region Для t=1
            //для t=1
            c[1] = 0;
            for (i = 0; i < n; i++)
            {
                if (length_density[i, 1] > 0)
                {
                    double[] fi = new double[1];
                    fi                    = HMM_QPN.integral(Model.Ro[i], Model.Ro[i].Length, 1);
                    alpha[i, 1]           = SymbolFinalProbability(Model, fi[0], 1, i, res[1]) * Model.Pi[i] * length_density[i, 1];
                    auxiliary_alpha[i, 1] = SymbolFinalProbability(Model, fi[0], 1, i, res[1]) * Model.Pi[i] * length_density[i, 1];
                }
                else
                {
                    alpha[i, 1]           = 0;
                    auxiliary_alpha[i, 1] = 0;
                }
                c[1] += auxiliary_alpha[i, 1];
            }
            c[1] = (c[1] != 0) ? 1 / c[1] : 0;//вычислили нормировочный коэффициент
            for (i = 0; i < n; i++)
            {
                norm_alpha[i, 1] = auxiliary_alpha[i, 1] * c[1];
            }
            #endregion

            #region Для t<T
            int t = 2;

            for (t = 2; t <= T; t++)
            {
                c[t] = 0;
                for (i = 0; i < n; i++)
                {
                    double term      = 0;
                    double norm_term = 0;
                    int    D         = max_period >= t ? t : max_period;
                    for (int d = 1; d <= D; d++)
                    {
                        for (int j = 0; j < n; j++)
                        {
                            if (length_density[i, d] > 0)
                            {
                                double   prod_tilda_b = 1;
                                double[] fi           = new double[d];
                                fi = HMM_QPN.integral(Model.Ro[i], Model.Ro[i].Length, d);

                                for (int s = t - d + 1; s <= t; s++)
                                {
                                    prod_tilda_b *= SymbolFinalProbability(Model, fi[s - t + d - 1], d, i, res[s]);
                                }
                                term      += alpha[j, t - d] * Model.A[j, i] * length_density[i, d] * prod_tilda_b;
                                norm_term += norm_alpha[j, t - d] * Model.A[j, i] * length_density[i, d] * prod_tilda_b;
                            }
                        }
                    }
                    alpha[i, t]           = term;
                    auxiliary_alpha[i, t] = norm_term;
                    c[t] += auxiliary_alpha[i, t];
                }
                c[t] = (c[t] != 0) ? 1 / c[t] : 0;
                for (i = 0; i < n; i++)
                {
                    norm_alpha[i, t] = auxiliary_alpha[i, t] * c[t];
                }
            }
            #endregion Для t<T
            double probability = 0;
            prob = 0;
            double coeffsum = 0;
            for (i = 0; i < n; i++)
            {
                //          probability+=norm_alpha[i,T];
                prob += alpha[i, T];
            }
            for (t = 1; t <= T; t++)
            {
                coeffsum += c[t];
            }
            probability    = 1 / coeffsum;
            alpha_par      = alpha;
            norm_alpha_par = norm_alpha;
            norm_coeff     = c;
            return(probability);
        }
Esempio n. 22
0
        /// <summary>
        /// Метод вычисляющий вероятность наблюдать последовательность O при заданной модели Model
        /// </summary>
        /// <param name="Model"></param>
        /// <param name="O"></param>
        /// <returns></returns>
        public static double LikelihoodExtended(HMM_QPN Model, int[] O)
        {
            //Первый запуск метода. Заполняем элементы массивов alphav и likelihood -1
            //(поскольку это вероятности, значение -1 больше никак появиться не может,
            //то есть это признак незаполненности элемента)
            if (D == -1)
            {
                D = Max_Period(Model);
                int N = Model.n;                                 //число состояний
                // O нумеруется начиная с первого элемента, а не с нулевого. как и длительности
                alphav     = new double[N, D + 1, O.Length + 1]; //1-i, 2-d, 3-t
                likelihood = new double[O.Length + 1];           //1-i, 2-d, 3-t
                for (int r = 0; r <= O.Length; r++)
                {
                    for (int i = 0; i < N; i++)
                    {
                        for (int d = 0; d <= D; d++)
                        {
                            alphav[i, d, r] = -1;
                        }
                    }
                    likelihood[r] = -1;
                }
            }
            //если последовательность пустая, то вероятность 1. Это может быть в случае, если мы забрались в отрицательную область по t
            if (O == null || O.Length == 0)
            {
                return(1);
            }
            int    t   = O.Length;//число элементов последвательности
            double sum = 0;

            for (int i = 0; i < Model.n; i++)
            {
                for (int d = 1; d <= D; d++)
                {
                    if (Model.ProbabilityByValueAndState(d, i) == 0)
                    {
                        alphav[i, d, t] = 0; continue;
                    }
                    //смотрим посчитана ли вероятность P[O_1:t-d|lambda]
                    double formerlikelihood;
                    if (t - d >= 0 && likelihood[t - d] != -1)
                    {    //эта вероятность уже была посчитана раньше и записана в массив
                        formerlikelihood = likelihood[t - d];
                    }
                    else
                    {    //еще не была посчитана и должны посчитать
                        formerlikelihood = LikelihoodExtended(Model, SubSequence(O, 0, t - d - 1));
                        //и записать в массив
                        if (t - d >= 0)
                        {
                            likelihood[t - d] = formerlikelihood;
                        }
                    }
                    //смотрим посчитана ли вероятность alfa_t(i,d)
                    double formeralpha;
                    if (t >= 0 && alphav[i, d, t] != -1)
                    {    //эта вероятность уже была посчитана раньше и записана в массив
                        formeralpha = alphav[i, d, t];
                    }
                    else
                    {    //еще не была посчитана и должны посчитать
                        formeralpha = alpha(Model, O, d, i, t);
                        //и записать в массив
                        if (t >= 0)
                        {
                            alphav[i, d, t] = formeralpha;
                        }
                    }
                    sum += formerlikelihood * formeralpha * b(Model, SubSequence(O, t - d, t - 1), i, t, d);
                }
            }

            likelihood[t] = sum;
            return(sum);
        }
Esempio n. 23
0
        private static double alpha(HMM_QPN Model, int[] O, int d, int i, int t)
        {
            double d_prob = Model.ProbabilityByValueAndState(d, i);

            // по первой ветке
            if (t <= 0)
            {
                return
                    (Model.Pi[i] * d_prob);//вероятность наблюдать длину d в состоянии i
            }
            else //по второй ветке
            {
                // если вероятность длительности в состоянии нулевая, то и альфа будет нулевой
                if (d_prob == 0)
                {
                    alphav[i, d, t] = 0;
                    return(0);
                }
                else
                {
                    //если вероятность не нулевая, то считаем по формуле
                    double sum = 0;

                    //внешняя сумма по всем состояниям
                    for (int i_prime = 0; i_prime < Model.n; i_prime++)
                    {
                        //смотрим посчитана ли вероятность P[O_1:t-d|lambda], это общий множитель для всех слагаемых
                        double formerlikelihood1;
                        if (t - d >= 0 && likelihood[t - d] != -1)// вторая часть так как изначально все элементы массива =-1
                        {
                            formerlikelihood1 = likelihood[t - d];
                        }
                        else
                        {
                            formerlikelihood1 = LikelihoodExtended(Model, SubSequence(O, 0, t - d - 1));
                            if (t - d >= 0)
                            {
                                likelihood[t - d] = formerlikelihood1;
                            }
                        }

                        //по всем длительностям
                        for (int d_prime = 1; d_prime <= D; d_prime++)
                        {
                            //смотрим посчитана ли вероятность P[O_1:t-d-d_prime|lambda]
                            double formerlikelihood2;
                            if (t - d - d_prime >= 0 && likelihood[t - d - d_prime] != -1)
                            {
                                formerlikelihood2 = likelihood[t - d - d_prime];
                            }
                            else
                            {
                                formerlikelihood2 = LikelihoodExtended(Model, SubSequence(O, 0, t - d - d_prime - 1));
                                if (t - d - d_prime >= 0)
                                {
                                    likelihood[t - d - d_prime] = formerlikelihood2;
                                }
                            }
                            //смотрим посчитана ли вероятность alfa_t-d(i_prime,d_prime)
                            double formeralpha;
                            if (t - d >= 0 && alphav[i_prime, d_prime, t - d] != -1)
                            {
                                formeralpha = alphav[i_prime, d_prime, t - d];
                            }
                            else
                            {
                                formeralpha = alpha(Model, O, d_prime, i_prime, t - d);
                                if (t - d >= 0)
                                {
                                    alphav[i_prime, d_prime, t - d] = formeralpha;
                                }
                            }
                            sum += d_prob * formeralpha *
                                   (b(Model, SubSequence(O, t - d - d_prime, t - d - 1), i_prime, t - d, d_prime) *
                                    Model.A[i_prime, i] * formerlikelihood2) / formerlikelihood1;
                        }
                    }
                    alphav[i, d, t] = sum;
                    return(sum);
                }
            }
        }
Esempio n. 24
0
        private void CountProbBtn_Click(object sender, EventArgs e)
        {
            HMM_QPN Model = new HMM_QPN(label1.Text);

            if (Model.IsCorrect() == 1)
            {
                int smbnubmer = 10;
                if (textBox2.Text != "")
                {
                    try
                    {
                        smbnubmer = int.Parse(textBox2.Text);
                    }
                    catch (Exception)
                    {
                    }
                }
                ;
                int[] res = new int[smbnubmer + 1];
                try
                {
                    res = HMM_PSM.GetOutputSequence(label2.Text, smbnubmer);
                }
                catch (Exception)
                {
                    MessageBox.Show("Желаемая длина последовательности превышает размер файла");
                    return;
                }
                panel3.Enabled = false;

                if (radioButton1.Checked)
                {
                    //try
                    //{
                    Likelihood lk = new Likelihood(res, Model);
                    //label3.Text = lk.Probability(res.Length - 1).ToString();
                    label3.Text = lk.FullProbability(res.Length - 1).ToString();

                    //}
                    //catch (Exception)
                    //    { MessageBox.Show("В процессе расчета возникла ошибка!"); };
                    panel3.Enabled = true;
                }
                else
                {
                    if (radioButton2.Checked)
                    {
                        LikelihoodSimple lk = new LikelihoodSimple(res, Model);
                        //label3.Text = lk.Probability(res.Length - 1).ToString();
                        label3.Text    = lk.Probability(res.Length - 1).ToString();
                        panel3.Enabled = true;
                    }
                    else
                    {
                        if (tbSegmentNumber.Text != "")
                        {
                            int segment_size = 0;
                            if (Int32.TryParse(tbSegmentNumber.Text, out segment_size))
                            {
                                LikelihoodSplit ls     = new LikelihoodSplit(segment_size);
                                double []       result = ls.calculateSplitedLikelihood(Model, res);
                                double          total  = 0;
                                tbSplitResultDetails.Text = "";
                                for (int i = 0; i < result.Length; i++)
                                {
                                    tbSplitResultDetails.Text += "P[O(" + i * segment_size + "," + ((i + 1) * segment_size) + ")] = " + result[i] + "\r\n";
                                    total += result[i];
                                }
                                label3.Text    = (total / result.Length).ToString();
                                panel3.Enabled = true;
                            }
                            else
                            {
                                MessageBox.Show("Размер сегмента разбиения должен быть целым");
                            }
                        }
                        else
                        {
                            MessageBox.Show("Задайте размер сегмента разбиения");
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("Модель задана некорректно");
            }
        }
Esempio n. 25
0
 public ModelObject(string modelName, HMM_QPN model)
 {
     this.model_name = modelName;
     this.model      = model;
 }