public static double MFactorCarbonPlus(List<MFCPData> matrixStateData, MFCPData currentStateData)
        {
            const int nFeatures = 4;
            int nFeaturesCoefficcients;
            int info = 0;
            var inVector = new double[matrixStateData.Count, nFeatures + 1];
            double[] coefficcients;
            var lm = new alglib.linearmodel();
            var lr = new alglib.lrreport();

            int lenghtData = matrixStateData.Count;
            for (int item = 0; item < lenghtData; item++)
            {
                inVector[item, 0] = matrixStateData[item].TimeFromX;                   // X1
                inVector[item, 1] = matrixStateData[item].CarbonOxideIVP;              // X2
                inVector[item, 2] = matrixStateData[item].CarbonMonoxideVP;            // X3
                inVector[item, 3] = matrixStateData[item].CarbonOxideVP;               // X4
                inVector[item, 4] = matrixStateData[item].SteelCarbonPercent;          // Y
            }

            alglib.lrbuild(inVector, lenghtData, nFeatures, out info, out lm, out lr);
            if (info != 1)
            {
                return info;
            }
            alglib.lrunpack(lm, out coefficcients, out nFeaturesCoefficcients);
            if (nFeaturesCoefficcients != nFeatures)
            {
                return -2.011;
            }
            double calculatedCarbon = coefficcients[4];
            calculatedCarbon += coefficcients[0] * currentStateData.TimeFromX;
            calculatedCarbon += coefficcients[1] * currentStateData.CarbonOxideIVP;
            calculatedCarbon += coefficcients[2] * currentStateData.CarbonMonoxideVP;
            calculatedCarbon += coefficcients[3] * currentStateData.CarbonOxideVP;

            return calculatedCarbon;
        }
        public static void Reset()
        {
            CurrentState = new MFCPData();
            HDSmoother = new HeatDataSmoother();

            ModelIsStarted = false;
            m_dataIsFixed = false;
            m_dataIsEnqueue = false;
            m_isBadInitBlowinByCO = false;
            m_isBlowingUpliftLance = false;
            Console.WriteLine("Reset");
            IntegralCO = 0;
            IntegralCO2 = 0;
            OffGasV = 320001;
            m_lastCarbon = 0;
            m_previousCarbon = Double.MaxValue;
            HeatIsStarted = false;
        }
        public static bool VerifiDataForSave(MFCPData currentHeatResult)
        {
            const double minCarbonPercent = 0.03;
            const double maxCarbonPercent = 0.12;

            return (currentHeatResult.SteelCarbonPercentCalculated != 0) &&
                   (currentHeatResult.SteelCarbonPercent > minCarbonPercent) &&
                   (currentHeatResult.SteelCarbonPercent < maxCarbonPercent) &&
                   (currentHeatResult.HightQualityHeat);
        }
        public static void HardFixData(MFCPData hDataResult)
        {
            if (VerifiDataForSave(hDataResult)) {
                //m_matrix.RemoveAt(0);
                //m_matrix.Add(hDataResult);
                //m_matrix.Insert();
                const double epsilon = 0.005;
                var isFoundInMatrix = false;
                for (int i = 0; i < m_matrix.Count; i++) {
                    if (Math.Abs(m_matrix[i].SteelCarbonPercent - hDataResult.SteelCarbonPercent) < epsilon) {
                        m_matrix.RemoveAt(i);
                        m_matrix.Insert(i, hDataResult);
                        isFoundInMatrix = true;
                        break;
                    }
                }
                if (isFoundInMatrix)
                    InstantLogger.log("hDataResult.SteelCarbonPercent is found in m_matrix and replased");
                else
                    InstantLogger.err("hDataResult.SteelCarbonPercent = {0} not found in m_matrix",
                                      hDataResult.SteelCarbonPercent);
            }
            else
                hDataResult.HightQualityHeat = false;

            m_matrixTotal.Add(hDataResult);

            Program.SaveMatrix(Program.MatrixPath, m_matrix);
            Program.SaveMatrix(Program.MatrixTotalPath, m_matrixTotal);
        }