private void Find_Max_Index(Simplex_Table _Table, List <int> _Residual)
        {
            int           Row_Count = _Table.Rows.Count - 1;
            List <double> Row       = _Table.Rows[Row_Count].Row_Values;
            int           count     = Row.Count;
            double        max       = -1;
            int           mx        = -1;

            for (int i = 0; i < count; i++)
            {
                if (max < Row[i])
                {
                    max = Row[i];
                    mx  = i;
                }
            }
            if (mx != -1)
            {
                for (int i = 0; i < count; i++)
                {
                    if (max == Row[i])
                    {
                        Value_Possibility VP = new Value_Possibility();
                        VP.Max_Index = i;
                        VP.Min_Selected_Indicators_Result = -1;
                        VP.Min_Selected_Indicator         = -1;
                        Data.Values.Add(VP);
                        Table_Possibility TP = new Table_Possibility();
                        TP.Table = Make_Simplex_Tabel_Copy(_Table);
                        TP.Residual.AddRange(_Residual);
                        Data.Tables.Add(TP);
                    }
                }
            }
        }
        private void Simplex_Cycle(Simplex_Table _Table)
        {
            Table_Possibility start = new Table_Possibility();

            start.Table = Make_Simplex_Tabel_Copy(_Table);
            start.Residual.AddRange(Residual_Back);
            Data.Tables.Add(start);
            Data.Values.Add(new Value_Possibility());
            while (Data.Tables.Count != 0)
            {
                int count = Data.Tables.Count;
                for (int i = 0; i < count; i++)
                {
                    Find_Max_Index(Data.Tables[i].Table, Data.Tables[i].Residual);
                    Data.Tables.RemoveAt(i);
                    Data.Values.RemoveAt(i);
                    i--; count--;
                }
                count = Data.Tables.Count;
                for (int i = 0; i < count; i++)
                {
                    Find_Min_Selected_Indicators_Result(Data.Tables[i].Table, Data.Tables[i].Residual, Data.Values[i].Max_Index);
                    Data.Tables.RemoveAt(i);
                    Data.Values.RemoveAt(i);
                    i--; count--;
                }
                count = Data.Tables.Count;
                List_Of_Item_Indexs_To_Remove = new ConcurrentStack <int> {
                };
                Concurent_Table = new ConcurrentDictionary <int, Table_Possibility>(Thread_Count, count);
                Concurent_Value = new ConcurrentDictionary <int, Value_Possibility>(Thread_Count, count);
                for (int i = 0; i < count; i++)
                {
                    Concurent_Table[i] = Data.Tables[i];
                    Concurent_Value[i] = Data.Values[i];
                }
                using (e = new CountdownEvent(count))
                {
                    for (int i = 0; i < count; i++)
                    {
                        ThreadPool.QueueUserWorkItem(new WaitCallback(Simplex_Cycle_Step), i);
                    }
                    e.Wait();
                }
                for (int i = 0; i < count; i++)
                {
                    Data.Tables[i] = Concurent_Table[i];
                    // Data.Values[i] = Concurent_Value[i]; // Values dont change in calculation if they do, uncoment
                }
                int index;
                while (List_Of_Item_Indexs_To_Remove.TryPop(out index))
                {
                    Data.Tables[index] = null;
                    Data.Values[index] = null;
                }
                Data.Tables.RemoveAll(item => item == null);
                Data.Values.RemoveAll(item => item == null);
            }
        }
 private void Simplex_Cycle(Simplex_Table _Table)
 {
     Table_Possibility start = new Table_Possibility();
     start.Table = Make_Simplex_Tabel_Copy(_Table);
     start.Residual.AddRange(Residual_Back);
     Data.Tables.Add(start);
     Data.Values.Add(new Value_Possibility());
     while (Data.Tables.Count != 0)
     {
         int count = Data.Tables.Count;
         for (int i = 0; i < count; i++)
         {
             Find_Max_Index(Data.Tables[i].Table, Data.Tables[i].Residual);
             Data.Tables.RemoveAt(i);
             Data.Values.RemoveAt(i);
             i--; count--;
         }
         count = Data.Tables.Count;
         for (int i = 0; i < count; i++)
         {
             Find_Min_Selected_Indicators_Result(Data.Tables[i].Table, Data.Tables[i].Residual, Data.Values[i].Max_Index);
             Data.Tables.RemoveAt(i);
             Data.Values.RemoveAt(i);
             i--; count--;
         }
         count = Data.Tables.Count;
         List_Of_Item_Indexs_To_Remove = new ConcurrentStack<int> { };
         Concurent_Table = new ConcurrentDictionary<int, Table_Possibility>(Thread_Count, count);
         Concurent_Value = new ConcurrentDictionary<int, Value_Possibility>(Thread_Count, count);
         for (int i = 0; i < count; i++)
         {
             Concurent_Table[i] = Data.Tables[i];
             Concurent_Value[i] = Data.Values[i];
         }
         using (e = new CountdownEvent(count))
         {
             for (int i = 0; i < count; i++)
             {
                 ThreadPool.QueueUserWorkItem(new WaitCallback(Simplex_Cycle_Step), i);
             }
             e.Wait();
         }
         for (int i = 0; i < count; i++)
         {
             Data.Tables[i] = Concurent_Table[i];
             // Data.Values[i] = Concurent_Value[i]; // Values dont change in calculation if they do, uncoment
         }
         int index;
         while (List_Of_Item_Indexs_To_Remove.TryPop(out index))
         {
             Data.Tables[index] = null;
             Data.Values[index] = null;
         }
         Data.Tables.RemoveAll(item => item == null);
         Data.Values.RemoveAll(item => item == null);
     }
 }
        private void Find_Min_Selected_Indicators_Result(Simplex_Table _Table, List <int> _Residual, int Max_Index)
        {
            double     min      = -1;
            int        mn       = -1;
            List <Row> Row_List = _Table.Rows;
            int        count    = Row_List.Count - 1;

            for (int i = 0; i < count; i++)
            {
                double value = _Table.Selected_Indicators_Result[i] / Row_List[i].Row_Values[Max_Index];
                if (value >= 0)
                {
                    min = value;
                    mn  = i;
                    i   = count;
                }
            }
            if (mn != -1)
            {
                for (int i = 0; i < count; i++)
                {
                    if (Row_List[i].Row_Values[Max_Index] >= 0)
                    {
                        double tikrinti = _Table.Selected_Indicators_Result[i] / Row_List[i].Row_Values[Max_Index];
                        if (tikrinti < min && tikrinti > 0)
                        {
                            min = tikrinti;
                            mn  = i;
                        }
                    }
                }
                for (int i = 0; i < count; i++)
                {
                    if (Row_List[i].Row_Values[Max_Index] > 0)
                    {
                        double tikrinti = _Table.Selected_Indicators_Result[i] / Row_List[i].Row_Values[Max_Index];
                        if (tikrinti == min)
                        {
                            Value_Possibility newValue = new Value_Possibility();
                            newValue.Max_Index = Max_Index;
                            newValue.Min_Selected_Indicator         = i;
                            newValue.Min_Selected_Indicators_Result = min;
                            Data.Values.Add(newValue);
                            Table_Possibility TP = new Table_Possibility();
                            TP.Table = Make_Simplex_Tabel_Copy(_Table);
                            TP.Residual.AddRange(_Residual);
                            Data.Tables.Add(TP);
                        }
                    }
                }
            }
            else
            {
            }
        }
        private void Find_Min_Selected_Indicators_Result(Simplex_Table _Table, List<int> _Residual, int Max_Index)
        {
            double min = -1;
            int mn = -1;
            List<Row> Row_List = _Table.Rows;
            int count = Row_List.Count - 1;
            for (int i = 0; i < count; i++)
            {
                double value = _Table.Selected_Indicators_Result[i] / Row_List[i].Row_Values[Max_Index];
                if (value >= 0)
                {
                    min = value;
                    mn = i;
                    i = count;
                }
            }
            if (mn != -1)
            {
                for (int i = 0; i < count; i++)
                {
                    if (Row_List[i].Row_Values[Max_Index] >= 0)
                    {
                        double tikrinti = _Table.Selected_Indicators_Result[i] / Row_List[i].Row_Values[Max_Index];
                        if (tikrinti < min && tikrinti > 0)
                        {
                            min = tikrinti;
                            mn = i;
                        }
                    }
                }
                for (int i = 0; i < count; i++)
                {
                    if (Row_List[i].Row_Values[Max_Index] > 0)
                    {
                        double tikrinti = _Table.Selected_Indicators_Result[i] / Row_List[i].Row_Values[Max_Index];
                        if (tikrinti == min)
                        {
                            Value_Possibility newValue = new Value_Possibility();
                            newValue.Max_Index = Max_Index;
                            newValue.Min_Selected_Indicator = i;
                            newValue.Min_Selected_Indicators_Result = min;
                            Data.Values.Add(newValue);
                            Table_Possibility TP = new Table_Possibility();
                            TP.Table = Make_Simplex_Tabel_Copy(_Table);
                            TP.Residual.AddRange(_Residual);
                            Data.Tables.Add(TP);
                        }
                    }
                }
            }
            else
            {

            }
        }
 private void Find_Max_Index(Simplex_Table _Table, List<int> _Residual)
 {
     int Row_Count = _Table.Rows.Count - 1;
     List<double> Row = _Table.Rows[Row_Count].Row_Values;
     int count = Row.Count;
     double max = -1;
     int mx = -1;
     for (int i = 0; i < count; i++)
     {
         if (max < Row[i])
         {
             max = Row[i];
             mx = i;
         }
     }
     if (mx != -1)
     {
         for (int i = 0; i < count; i++)
         {
             if (max == Row[i])
             {
                 Value_Possibility VP = new Value_Possibility();
                 VP.Max_Index = i;
                 VP.Min_Selected_Indicators_Result = -1;
                 VP.Min_Selected_Indicator = -1;
                 Data.Values.Add(VP);
                 Table_Possibility TP = new Table_Possibility();
                 TP.Table = Make_Simplex_Tabel_Copy(_Table);
                 TP.Residual.AddRange(_Residual);
                 Data.Tables.Add(TP);
             }
         }
     }
 }