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); }); }