private double CalculateNextX(Random rnd, DoubleSeries s, PFSeriesConfig c, Function f, string fHead, long i) { double t = i / c.TimeQuotient; var arg = ConfigurationParser.ParseArgument("t", t); var periodicPart = ConfigurationParser.ComputeFunction(fHead, f, arg); var ar_part_drivers = 0.0; var ma_part_drivers = 0.0; lock (seriesDict) CalculateDriverParts(c.Drivers, out ar_part_drivers, out ma_part_drivers); var et = rnd.NextGaussian_BoxMuller(c.Mean, c.StdDev); // next noise var xt = c.C + periodicPart + ar_part_drivers + ma_part_drivers + et; lock (seriesDict) { if (s.X.Count > MAX_BUFFER_SIZE) { s.X.RemoveAt(0); } s.X.Add(xt); } return(xt); }
private double CalculateNextXSimple(Random rnd, DoubleSeries s, PFSeriesConfig c, Function f, string fHead, long i) { double t = i / c.TimeQuotient; var arg = ConfigurationParser.ParseArgument("t", t); var xt = ConfigurationParser.ComputeFunction(fHead, f, arg); s.X.Add(xt); return(xt); }
private void StreamSeries(StreamingJob job, PFSeriesConfig c) { DateTime dtts = new DateTime(1000, 1, 1, 0, 0, 0, 0); string fHead = $"PF({string.Join(",", c.Arguments)})"; Function f = ConfigurationParser.ParseFunction(fHead, c.Expression); for (long i = 0; true; i++) { job.Token.ThrowIfCancellationRequested(); double xt = 0.0; lock (seriesDict) xt = CalculateNextX(rnd, series, c, f, fHead, i); if (c.Export && i > c.Delay) { double outlierCandidate = rnd.NextDouble(); if (outlierCandidate < c.OutlierRatio3s) { xt = GenerateOutlier(rnd, xt, series.X, 3, 4); } else if (outlierCandidate < c.OutlierRatio2s) { xt = GenerateOutlier(rnd, xt, series.X, 2, 3); } // string timestamp = DateTime.Now.ToString(DATETIME_FORMAT); // v1 string timestamp = dtts.ToString(generatorConfig.DateTimeFormat); // v2 var msg = JsonConvert.SerializeObject(GenerateMessage(c, group, timestamp, xt)); job.Client.Publish(config.Topic, Encoding.UTF8.GetBytes(msg)); Thread.Sleep(c.Interval); dtts = dtts.AddMilliseconds(c.Interval); // v2 } else if (i > c.Delay) { Thread.Sleep(c.Interval); } } }