public void TestNoNormalization() { //a bunch of zero-index activities just to stave off normalization var sim1 = new Simulator(new Activity[] { new FoodActivity(new Data.FoodData { GlycemicIndex = 10 }, TimeSpan.FromHours(1)), new ExerciseActivity(new Data.ExerciseData { ExerciseIndex = 0 }, TimeSpan.FromHours(2)), new ExerciseActivity(new Data.ExerciseData { ExerciseIndex = 0 }, TimeSpan.FromHours(3)), new FoodActivity(new Data.FoodData { GlycemicIndex = 0 }, TimeSpan.FromHours(4)), new FoodActivity(new Data.FoodData { GlycemicIndex = 0 }, TimeSpan.FromHours(5)), new FoodActivity(new Data.FoodData { GlycemicIndex = 0 }, TimeSpan.FromHours(7) + TimeSpan.FromMinutes(5)), }); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(-1)), 0.00001); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(0)), 0.00001); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(1)), 0.00001); Assert.AreEqual(85, sim1.GetBloodSugar(TimeSpan.FromHours(2)), 0.00001); Assert.AreEqual(90, sim1.GetBloodSugar(TimeSpan.FromHours(3)), 0.00001); Assert.AreEqual(90, sim1.GetBloodSugar(TimeSpan.FromMinutes(181)), 0.00001); Assert.AreEqual(90, sim1.GetBloodSugar(TimeSpan.FromHours(4)), 0.00001); Assert.AreEqual(90, sim1.GetBloodSugar(TimeSpan.FromHours(5)), 0.00001); Assert.AreEqual(90, sim1.GetBloodSugar(TimeSpan.FromHours(6)), 0.00001); Assert.AreEqual(90, sim1.GetBloodSugar(TimeSpan.FromHours(7)), 0.00001); Assert.AreEqual(85, sim1.GetBloodSugar(TimeSpan.FromHours(8)), 0.00001); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(99)), 0.00001); Assert.AreEqual(0, sim1.GetCumulativeGlycation(TimeSpan.FromHours(99)), 0.00001); }
public void TestBasicGlycation() { var sim1 = new Simulator(new Activity[] { new FoodActivity(new Data.FoodData { GlycemicIndex = 140 }, TimeSpan.FromHours(1)), }); Assert.AreEqual(0, sim1.GetCumulativeGlycation(TimeSpan.FromHours(0)), 0.00001); Assert.AreEqual(0, sim1.GetCumulativeGlycation(TimeSpan.FromHours(1)), 0.00001); Assert.AreEqual(0, sim1.GetCumulativeGlycation(TimeSpan.FromMinutes(120)), 0.00001); //blood sugar now exactly equal to 150, but not "above" so no glycation yet Assert.AreEqual(1, sim1.GetCumulativeGlycation(TimeSpan.FromMinutes(121)), 0.00001); Assert.AreEqual(2, sim1.GetCumulativeGlycation(TimeSpan.FromMinutes(122)), 0.00001); Assert.AreEqual(128, sim1.GetCumulativeGlycation(TimeSpan.FromMinutes(248)), 0.00001); Assert.AreEqual(129, sim1.GetCumulativeGlycation(TimeSpan.FromMinutes(249)), 0.00001); Assert.AreEqual(129, sim1.GetCumulativeGlycation(TimeSpan.FromMinutes(250)), 0.00001); //blood sugar now exactly equal to 150 again, but not "above" so no additional glycation Assert.AreEqual(129, sim1.GetCumulativeGlycation(TimeSpan.FromMinutes(999)), 0.00001); }
public void TestFoodExerciseOffset() { var sim1 = new Simulator(new Activity[] { new ExerciseActivity(new Data.ExerciseData { ExerciseIndex = 10 }, TimeSpan.FromHours(1)), new ExerciseActivity(new Data.ExerciseData { ExerciseIndex = 10 }, TimeSpan.FromHours(2)), new FoodActivity(new Data.FoodData { GlycemicIndex = 20 }, TimeSpan.FromHours(1)), }); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(-1)), 0.00001); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(0)), 0.00001); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(1)), 0.00001); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(1.5)), 0.00001); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(2)), 0.00001); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromMinutes(121)), 0.00001); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(99)), 0.00001); Assert.AreEqual(00, sim1.GetCumulativeGlycation(TimeSpan.FromHours(99)), 0.00001); }
private void GenerateGraph() { zedGraphControl.GraphPane.CurveList.Clear(); var sim = new Simulator(Activities); //figure out any points where the graph potentially changes slope: var xValues = sim.GetActivitiesAndNormalizations() .SelectMany(x => new[] {x.ActivityTime, x.ActivityTime + x.Onset}) .Union(new[] {TimeSpan.FromHours(0), TimeSpan.FromHours(24)}) .Distinct() .OrderBy(x => x) .ToList(); //Add any starting or ending points for glycation, when blood sugar crosses 150: var crossovers = new List<TimeSpan>(); for (int i = 0; i + 1 < xValues.Count; i++) { if (Math.Sign(sim.GetBloodSugar(xValues[i]) - 150) != Math.Sign(sim.GetBloodSugar(xValues[i + 1]) - 150)) { var fractionOfTime = (150 - sim.GetBloodSugar(xValues[i])) / (sim.GetBloodSugar(xValues[i + 1]) - sim.GetBloodSugar(xValues[i])); crossovers.Add(xValues[i] + TimeSpan.FromMinutes(fractionOfTime * (xValues[i + 1] - xValues[i]).TotalMinutes)); } } xValues = xValues.Union(crossovers).Distinct().OrderBy(x => x).ToList(); var bloodSugar = new ZedGraph.PointPairList(); foreach (var time in xValues) { double sugar = sim.GetBloodSugar(time); bloodSugar.Add(new ZedGraph.PointPair(time.TotalHours, sugar)); } var glycation = new ZedGraph.PointPairList(); foreach (var time in xValues) { double gly = sim.GetCumulativeGlycation(time); glycation.Add(new ZedGraph.PointPair(time.TotalHours, gly)); } var foodEvents = new ZedGraph.PointPairList(); foreach (var time in Activities.OfType<FoodActivity>().Select(x => x.ActivityTime)) { double point = sim.GetBloodSugar(time); foodEvents.Add(new ZedGraph.PointPair(time.TotalHours, point)); } var exerciseEvents = new ZedGraph.PointPairList(); foreach (var time in Activities.OfType<ExerciseActivity>().Select(x => x.ActivityTime)) { double point = sim.GetBloodSugar(time); exerciseEvents.Add(new ZedGraph.PointPair(time.TotalHours, point)); } var threshold = new ZedGraph.PointPairList(new[] {0.0, 24.0}, new[] {150.0, 150.0}); zedGraphControl.GraphPane.AddCurve("Blood Sugar", bloodSugar, Color.Green, ZedGraph.SymbolType.None); zedGraphControl.GraphPane.AddCurve("Cumulative Glycation", glycation, Color.Red, ZedGraph.SymbolType.None); var line = zedGraphControl.GraphPane.AddCurve("Glycation threshold", threshold, Color.Red, ZedGraph.SymbolType.HDash); line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash; var food = zedGraphControl.GraphPane.AddCurve("", foodEvents, Color.Red, ZedGraph.SymbolType.Triangle); food.Line.IsVisible = false; food.Symbol.Fill.Type = ZedGraph.FillType.Solid; var exercise = zedGraphControl.GraphPane.AddCurve("", exerciseEvents, Color.Green, ZedGraph.SymbolType.TriangleDown); exercise.Line.IsVisible = false; exercise.Symbol.Fill.Type = ZedGraph.FillType.Solid; zedGraphControl.RestoreScale(zedGraphControl.GraphPane); }
public void TestOneFood() { var sim1 = new Simulator(new Activity[] { new FoodActivity(new Data.FoodData { GlycemicIndex = 10 }, TimeSpan.FromHours(1)), }); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(-1)), 0.00001); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(0)), 0.00001); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(1)), 0.00001); Assert.AreEqual(85, sim1.GetBloodSugar(TimeSpan.FromHours(2)), 0.00001); Assert.AreEqual(90, sim1.GetBloodSugar(TimeSpan.FromHours(3)), 0.00001); Assert.AreEqual(89, sim1.GetBloodSugar(TimeSpan.FromMinutes(181)), 0.00001); Assert.AreEqual(80, sim1.GetBloodSugar(TimeSpan.FromHours(99)), 0.00001); Assert.AreEqual(0, sim1.GetCumulativeGlycation(TimeSpan.FromHours(99)), 0.00001); }