private void buttonApply_Click(object sender, EventArgs e)
 {
     if (MessageBox.Show("Сохранить кластеры?", "Анализ временных рядов", MessageBoxButtons.YesNo,
                         MessageBoxIcon.Question) == DialogResult.Yes)
     {
         var logic = new FuzzyLabelService();
         for (int i = 0; i < dataGridView.Rows.Count; ++i)
         {
             try
             {
                 logic.InsertElement(new FuzzyLabelBindingModel
                 {
                     SeriesId       = _seriesId,
                     FuzzyLabelType = FuzzyLabelType.ClustFCM,
                     FuzzyLabelName = dataGridView.Rows[i].Cells[0].Value.ToString(),
                     Weigth         = Convert.ToInt32(
                         dataGridView.Rows[i].Cells[1].Value),
                     MinVal = Convert.ToDouble(dataGridView.Rows[i].Cells[2].Value),
                     Center = Convert.ToDouble(dataGridView.Rows[i].Cells[3].Value),
                     MaxVal = Convert.ToDouble(dataGridView.Rows[i].Cells[4].Value)
                 });
             }
             catch (Exception ex)
             {
                 MessageBox.Show("Ошибка при добавлении: " + ex.Message, "Анализ временных рядов",
                                 MessageBoxButtons.OK, MessageBoxIcon.Error);
             }
         }
         DialogResult = DialogResult.OK;
         Close();
     }
 }
        /// <summary>
        /// Генерируем правила определения тенденции по нечетким меткам
        /// </summary>
        /// <param name="seriesId"></param>
        /// <returns></returns>
        public static List <RuleTrendViewModel> GenerateRuleTrends(int seriesId)
        {
            var logicFL = new FuzzyLabelService();
            var logicFT = new FuzzyTrendService();
            var labels  = logicFL.GetElements(seriesId);
            var trends  = logicFT.GetElements(seriesId);
            // формируем правила нечетких тенденций
            List <RuleTrendViewModel> rules = new List <RuleTrendViewModel>();

            // проходимся по всем нечетким меткам ряда
            foreach (var labFrom in labels)
            {
                foreach (var labTo in labels)
                {
                    rules.Add(new RuleTrendViewModel
                    {
                        SeriesDiscriptionId = seriesId,
                        FuzzyTrendName      = FuzzyTrendLabel.Неопределено.ToString(),
                        FuzzyTrendWeight    = labTo.FuzzyLabelWeight - labFrom.FuzzyLabelWeight,
                        FuzzyLabelFromId    = labFrom.Id,
                        FuzzyLabelFromName  = labFrom.FuzzyLabelName,
                        FuzzyLabelToId      = labTo.Id,
                        FuzzyLabelToName    = labTo.FuzzyLabelName
                    });
                }
            }
            // сортируем правила по весам
            rules = rules.OrderBy(r => r.FuzzyTrendWeight).ToList();

            DistributePointTrendsByTrends(rules, trends);

            return(rules);
        }
 private bool CreateFuzzyLabel(string fileName, int seriesId)
 {
     lock (createFuzzyLabels)
     {
         try
         {
             int _countClasters = countCenters;
             while (true)
             {
                 var clust = new ModelClustering(fileName, 1, _countClasters);
                 if (clust.Calc())
                 {
                     var points = clust.Points;
                     var logic  = new FuzzyLabelService();
                     List <FuzzyLabelBindingModel> fuzzyPoints = new List <FuzzyLabelBindingModel>();
                     for (int i = 0; i < countCenters; ++i)
                     {
                         if (points.Count > 0)
                         {
                             var point       = points.First(r => r.X == points.Min(rex => rex.X));
                             var clustPoints = points.Where(r => r.ClusterIndex == point.ClusterIndex);
                             fuzzyPoints.Add(new FuzzyLabelBindingModel
                             {
                                 SeriesId       = seriesId,
                                 FuzzyLabelType = FuzzyLabelType.ClustFCM,
                                 FuzzyLabelName = "Кластер " + (i + 1),
                                 Weigth         = i + 1,
                                 MinVal         = clustPoints.Min(rex => rex.X),
                                 Center         = clust.Centers[(int)point.ClusterIndex].X,
                                 MaxVal         = clustPoints.Max(rex => rex.X)
                             });
                             points.RemoveAll(r => r.ClusterIndex == point.ClusterIndex);
                         }
                         else
                         {
                             fuzzyPoints.Add(new FuzzyLabelBindingModel
                             {
                                 SeriesId       = seriesId,
                                 FuzzyLabelType = FuzzyLabelType.ClustFCM,
                                 FuzzyLabelName = "Кластер " + (i + 1),
                                 Weigth         = i + 1,
                                 MinVal         = 0,
                                 Center         = 0,
                                 MaxVal         = 0
                             });
                         }
                     }
                     double delta = 5;
                     fuzzyPoints[fuzzyPoints.Count - 1].MaxVal += delta;
                     for (int i = 0; i < fuzzyPoints.Count - 1; ++i)
                     {
                         fuzzyPoints[i].MinVal -= delta;
                         delta = (fuzzyPoints[i + 1].MinVal - fuzzyPoints[i].MaxVal) / 2 + 5;
                         fuzzyPoints[i].MaxVal += delta;
                         logic.InsertElement(fuzzyPoints[i]);
                     }
                     fuzzyPoints[fuzzyPoints.Count - 1].MinVal -= delta;
                     logic.InsertElement(fuzzyPoints[fuzzyPoints.Count - 1]);
                     return(true);
                 }
                 _countClasters--;
                 if (_countClasters < 0)
                 {
                     throw new Exception("Кластеризация не прошла");
                 }
             }
         }
         catch (Exception ex)
         {
             throw new Exception(string.Format("CreateFuzzyLabel {0}: {1}", fileName, ex.Message));
         }
     }
 }