public static void Iterate(HeatData heatData)
        {
            using (var l = new Logger("Iterate")) {
                var calculatedCarboneEvent = new CalculatedCarboneEvent();

                var currentStateData = new MFCMData {
                                                        CarbonMonoxideVolumePercent =
                                                            heatData.CarbonMonoxideVolumePercent,
                                                        CarbonOxideVolumePercent = heatData.CarbonOxideVolumePercent,
                                                        HeightLanceCentimeters = heatData.HeightLanceCentimeters,
                                                        OxygenVolumeRate = heatData.OxygenVolumeRate
                                                    };
                //RemainCarbonPercent = Decarbonater.ComplexNMCProcess(heatData.MatrixStateData, currentStateData);
                RemainCarbonPercent = Decarbonater.ComplexNMCProcess(currentStateData);

                if (MomentFixDataForMFactorModel(heatData.OxygenVolumeCurrent, heatData.OxygenVolumeTotal,
                                                 heatData.CarbonMonoxideVolumePercent, heatData.CarbonOxideVolumePercent))
                    // фиксируем для обучения
                {
                    if (m_noFixData) {
                        CurrentHeatResult.OxygenVolumeRate = heatData.OxygenVolumeRate;
                        CurrentHeatResult.SteelCarbonCalculationPercent = RemainCarbonPercent;
                        CurrentHeatResult.CarbonMonoxideVolumePercent = heatData.CarbonMonoxideVolumePercent;
                        CurrentHeatResult.CarbonOxideVolumePercent = heatData.CarbonOxideVolumePercent;
                        CurrentHeatResult.HeightLanceCentimeters = heatData.HeightLanceCentimeters;
                        EnqueueWaitC(CurrentHeatResult); // ставим в очередь ожидания углерода
                        //Program.PushGate.PushEvent(new FixDataMfactorModelEvent());
                        FireFixEvent(RemainCarbonPercent);
                        m_noFixData = false;
                    }
                }

                ModelIsStarted = ModelVerifiForStart(heatData.OxygenVolumeCurrent, heatData.CarbonMonoxideVolumePercent,
                                                     heatData.CarbonOxideVolumePercent);
                if (ModelIsStarted) FireStartEvent();
                calculatedCarboneEvent.model = "Complex neural Model";
                calculatedCarboneEvent.CarbonePercent = RemainCarbonPercent;
                calculatedCarboneEvent.CarboneMass = RemainCarbonMass;
                var fex = new ConnectionProvider.FlexHelper("NeuralProcessorC.Calc");
                fex.AddArg("TypeNeural", "non linear");
                fex.AddArg("C", RemainCarbonPercent);
                fex.Fire(Program.PushGate);

                FireResultCarbonEvent();

                //l.msg("fired carbon:\n{0}",fex.evt.ToString());
                //Program.PushGate.PushEvent(calculatedCarboneEvent);
                //Program.PushGate.PushEvent(new CalculatedCarboneEvent());
            }
        }
 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 Init()
 {
     m_sw = new Stopwatch();
     CurrentHeatResult = new MFCMDataFull();
     DataCurrentHeat = new HeatData();
     DataCurrentHeat.MatrixStateData = Program.MFCMDataGenerate(Program.MatrixStateDataFull); //!!
     Decarbonater.ComplexNMCTrain(DataCurrentHeat.MatrixStateData); //!!
     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_noFixData = true;
     ModelIsStarted = false;
 }