private void PhaseTwo(Equation equation, int c)
        {
            CurrentPhase        = Phase.Two;
            equation.ColsCount -= c;
            double[] tempFunction = equation.Function;
            Array.Resize(ref tempFunction, equation.ColsCount);
            equation.Function = tempFunction;


            double[,] tempCoefficients = equation.Coefficients;
            equation.Coefficients      = new double[equation.RowsCount, equation.ColsCount];
            for (int i = 0; i < equation.RowsCount; i++)
            {
                for (int j = 0; j < equation.ColsCount; j++)
                {
                    equation.Coefficients[i, j] = tempCoefficients[i, j];
                }
            }

            RowReduction(equation.Function, equation);
        }
        private double[] StandardizePrecision(Equation equation)
        {
            for (int i = 0; i < equation.RowsCount; i++)
            {
                double fraction = equation.Intercepts[i] - Math.Truncate(equation.Intercepts[i]);

                if (Math.Abs(fraction) < 0.25)
                {
                    equation.Intercepts[i] = Math.Truncate(equation.Intercepts[i]);
                }

                else if (Math.Abs(fraction) > 0.75)
                {
                    if (equation.Intercepts[i] > 0)
                    {
                        equation.Intercepts[i] = Math.Truncate(equation.Intercepts[i]) + 1;
                    }
                    else
                    {
                        equation.Intercepts[i] = Math.Truncate(equation.Intercepts[i]) - 1;
                    }
                }
                else if (Math.Abs(fraction) != 0.0)
                {
                    if (equation.Intercepts[i] > 0)
                    {
                        equation.Intercepts[i] = Math.Truncate(equation.Intercepts[i]) + 0.5;
                    }
                    else
                    {
                        equation.Intercepts[i] = Math.Truncate(equation.Intercepts[i]) - 0.5;
                    }
                }
            }
            return(equation.Intercepts);
        }
        private void RowReduction(double[] row, Equation equation)
        {
            while (true)
            {
                Pivot pivot = SelectPivot(row, equation);

                if (pivot.Row == -1 || pivot.Column == -1 || CurrentSolution == Solution.Infinity)
                {
                    break;
                }

                ResultVariables[pivot.Column] = pivot.Row;


                double divisor = equation.Coefficients[pivot.Row, pivot.Column];
                equation.Intercepts[pivot.Row] /= divisor;
                for (int i = 0; i < equation.ColsCount; i++)
                {
                    equation.Coefficients[pivot.Row, i] /= divisor;
                }

                double multiple = 0;
                for (int i = 0; i < equation.RowsCount; i++)
                {
                    if (pivot.Row != i && !EqualToZero(equation.Coefficients[i, pivot.Column]))
                    {
                        multiple = equation.Coefficients[i, pivot.Column];

                        equation.Intercepts[i] -= equation.Intercepts[pivot.Row] * multiple;

                        for (int j = 0; j < equation.ColsCount; j++)
                        {
                            equation.Coefficients[i, j] -=
                                equation.Coefficients[pivot.Row, j] * multiple;
                        }
                    }
                }

                int size = equation.Intercepts.Length;
                if (CurrentPhase == Phase.One)
                {
                    equation.Intercepts[size - 2] -=
                        equation.Intercepts[pivot.Row] * equation.Function[pivot.Column];

                    equation.Intercepts[size - 1] -=
                        equation.Intercepts[pivot.Row] * row[pivot.Column];

                    double functionCol = equation.Function[pivot.Column];
                    double rowCol      = row[pivot.Column];
                    for (int i = 0; i < equation.ColsCount; i++)
                    {
                        equation.Function[i] -=
                            equation.Coefficients[pivot.Row, i] * functionCol;

                        row[i] -=
                            equation.Coefficients[pivot.Row, i] * rowCol;
                    }

                    SecondaryRow = row;
                }
                else
                {
                    equation.Intercepts[size - 1] -=
                        equation.Intercepts[pivot.Row] * equation.Function[pivot.Column];

                    multiple = equation.Function[pivot.Column];
                    for (int i = 0; i < equation.ColsCount; i++)
                    {
                        equation.Function[i] -=
                            equation.Coefficients[pivot.Row, i] * multiple;
                    }


                    equation.Function = row;
                }
            }
        }
 private void PhaseOne(Equation equation)
 {
     CurrentPhase = Phase.One;
     RowReduction(SecondaryRow, equation);
     CurrentSolution = (EqualToZero(equation.Intercepts.Last())) ? Solution.Bounded : Solution.NoSolution;
 }