Ejemplo n.º 1
0
        public ModelTraining(IOrchestrator proxy)
        {
            var sample = new Queue <Temperature>();

            Twin.Subscribe(async twin =>
            {
                Logger.LogInformation("Twin update");

                lock (_sync)
                {
                    _aggregationSize          = twin.AggregationSize;
                    _tumblingWindowPercentage = twin.TumblingWindowPercentage;
                }

                await Twin.ReportAsync(twin);
                return(TwinResult.Ok);
            });

            proxy.Training.Subscribe(this, async signal =>
            {
                Model model = null;
                lock (sample)
                {
                    sample.Enqueue(signal);
                    if (sample.Count >= _aggregationSize)
                    {
                        var kMeansTraining = new KMeansTraining(_numClusters);
                        kMeansTraining.TrainModel(sample.Select(e => new[] { e.TimeStamp, e.Value }).ToArray());
                        model = new Model
                        {
                            Algorithm = Algorithm.kMeans,
                            DataJson  = kMeansTraining.SerializeModel()
                        };
                        for (var i = 0; i < _tumblingWindowPercentage * _aggregationSize / 100; i++)
                        {
                            sample.Dequeue();
                        }
                    }
                }

                if (model != null)
                {
                    await Model.PublishAsync(model).ConfigureAwait(false);
                }

                return(MessageResult.Ok);
            });
        }
        public ModelTraining(IOrchestrator proxy)
        {
            _sample = new Queue <Temperature>();

            Twin.Subscribe(async twin =>
            {
                Console.WriteLine($"{typeof(ModelTraining).Name}::Twin update");

                lock (_sync)
                {
                    _aggregationSize          = twin.AggregationSize;
                    _tumblingWindowPercentage = twin.TumblingWindowPercentage;
                }
                await Twin.ReportAsync(twin);
                return(TwinResult.Ok);
            });

            proxy.Training.Subscribe(this, async signal =>
            {
                Model model = null;
                lock (_sample)
                {
                    _sample.Enqueue(signal);
                    if (_sample.Count >= _aggregationSize)
                    {
                        _kMeansTraining = new KMeansTraining(_numClusters);
                        _kMeansTraining.TrainModel(_sample.Select(e => new double[] { e.TimeStamp, e.Value }).ToArray());
                        model = new Model()
                        {
                            Algorithm = ThermostatApplication.Algorithm.kMeans,
                            DataJson  = _kMeansTraining.SerializeModel()
                        };
                        for (int i = 0; i < _tumblingWindowPercentage * _aggregationSize / 100; i++)
                        {
                            _sample.Dequeue();
                        }
                    }
                }
                if (model != null)
                {
                    await Model.PublishAsync(model).ConfigureAwait(false);
                }

                return(MessageResult.Ok);
            });
        }