public HeatData GetHeatData(HeatData hd, int intervalSec)
 {
     if (hd == null) throw new ArgumentNullException("hd");
     hd.CarbonMonoxideVolumePercent = CarbonMonoxideVolumePercent.Average(intervalSec);
     hd.CarbonMonoxideVolumePercentPrevious = CarbonMonoxideVolumePercentPrevious.Average(intervalSec);
     hd.CarbonOxideVolumePercent = CarbonOxideVolumePercent.Average(intervalSec);
     hd.CarbonOxideVolumePercentPrevious = CarbonOxideVolumePercentPrevious.Average(intervalSec);
     hd.OffgasVolumeRate = OffgasVolumeRate.Average(intervalSec);
     hd.HeightLanceCentimeters = (int) Math.Round(HeightLanceCentimeters.Average(intervalSec), 0);
     hd.OxygenVolumeRate = OxygenVolumeRate.Average(intervalSec);
     hd.OxygenVolumeCurrent = OxygenVolumeCurrent.Average(intervalSec);
     return hd;
 }
        public static void Iterate(HeatData heatData)
        {
            using (var l = new Logger("Iterate")) {
                if (ModelIsStarted) {
                    var currentStateData = new MFCMData {
                                                            CarbonMonoxideVolumePercent =
                                                                heatData.CarbonMonoxideVolumePercent,
                                                            CarbonOxideVolumePercent = heatData.CarbonOxideVolumePercent,
                                                            HeightLanceCentimeters = heatData.HeightLanceCentimeters,
                                                            OxygenVolumeRate = heatData.OxygenVolumeRate
                                                        };

                    m_currentMatrix = MFMChooser(heatData);
                    var matrixStateData =
                        Program.MFCMDataGenerate(Program.MatrixStateDataFull[m_currentMatrix].MatrixList);
                    var CMCarbon = Decarbonater.MultiFactorCarbonMass(matrixStateData, currentStateData);
                    //if (CMCarbon < RemainCarbonPercent) RemainCarbonPercent = CMCarbon;
                    RemainCarbonPercent = CMCarbon;

                    var fex2 = new ConnectionProvider.FlexHelper("SMFCarbon.Result");
                    fex2.AddArg("C", RemainCarbonPercent);
                    fex2.Fire(Program.PushGate);

                    Console.CursorTop = Console.CursorTop - 1;
                    Console.WriteLine("                                                   ");
                    Console.CursorTop = Console.CursorTop - 1;
                    Console.WriteLine("Carbon = " + RemainCarbonPercent + "%");

                    if (MomentFixDataForMFactorModel(heatData.CarbonMonoxideVolumePercent,
                                                     heatData.CarbonOxideVolumePercent)) // фиксируем для обучения
                    {
                        if (!m_dataIsFixed) {
                            CurrentHeatResult.OxygenVolumeRate = heatData.OxygenVolumeRate;
                            CurrentHeatResult.SteelCarbonCalculationPercent = RemainCarbonPercent;
                            CurrentHeatResult.CarbonMonoxideVolumePercent = heatData.CarbonMonoxideVolumePercent;
                            CurrentHeatResult.CarbonOxideVolumePercent = heatData.CarbonOxideVolumePercent;
                            CurrentHeatResult.HeightLanceCentimeters = heatData.HeightLanceCentimeters;
                            CurrentHeatResult.MFMEquationId = m_currentMatrix; // фиксируем матрицу по которой учим
                            EnqueueWaitC(CurrentHeatResult); // ставим в очередь ожидания углерода

                            var fex = new ConnectionProvider.FlexHelper("SMFCarbon.DataFix");
                            fex.AddArg("C", RemainCarbonPercent);
                            fex.Fire(Program.PushGate);
                            l.msg(fex.evt + "\n");

                            m_dataIsFixed = true;
                        }
                    }
                }
                else {
                    ModelIsStarted = ModelVerifiForStart(
                        heatData.OxygenVolumeTotal,
                        heatData.OxygenVolumeCurrent,
                        heatData.CarbonMonoxideVolumePercent,
                        heatData.CarbonMonoxideVolumePercentPrevious,
                        heatData.CarbonOxideVolumePercent,
                        heatData.CarbonOxideVolumePercentPrevious
                        );
                    if (ModelIsStarted) {
                        var fex = new ConnectionProvider.FlexHelper("SMFCarbon.ModelIsStarted");
                        fex.Fire(Program.PushGate);
                        l.msg(fex.evt + "\n");
                    }
                    Console.Write(".");
                }
            }
        }
 private static int MFMChooser(HeatData hd)
 {
     return (hd.CarbonOxideVolumePercent > hd.CarbonOxideVolumePercentPrevious) ? 0 : 1;
 }
 public static void Init()
 {
     m_sw = new Stopwatch();
     CurrentHeatResult = new MFCMDataFull();
     DataCurrentHeat = new HeatData();
     DataSmoothCurrent = new HeatDataSmoother(100);
     m_smoothSecondLancePosition = new RollingAverage();
     TotalCarbonMass = 0.0;
     RemainCarbonMass = 0.0;
     RemainCarbonPercent = 0.0;
     m_maxDownLancePosition = 10000;
     m_lanceSpeed = 0.0;
     TotalCarbonMassCalculated = false;
     GasCarbonMassFinished = false;
     m_dataIsFixed = false;
     ModelIsStarted = false;
 }