private List <AnalyticsItem> GetExerciseProgress() { List <AnalyticsItem> exerciseProgress = _userExercises.GroupBy(e => e.Definition).Select(g => { ExerciseDefinition def = _userExerciseDefinitions.FirstOrDefault(d => d.Id == g.First().Definition); Exercise firstExercise = _userExercises.FirstOrDefault(ex => ex.Id == def.History?.FirstOrDefault()); var total = g.Sum(t => (double)t.NetValue); var numberOfSessions = g.Count(); double progressPercent = 0.0; if (firstExercise != null) { double initialNetValue = ExerciseUtilities.GetNetExerciseValue(firstExercise); // Progress percent = average net value - initial net value progressPercent = (total / numberOfSessions) - initialNetValue; } return(new AnalyticsItem { Marker = def.Title, Count = progressPercent, }); }).OrderByDescending(a => a.Count).ToList(); return(exerciseProgress); }
private double GetLatestExerciseImprovement(Exercise newExercise, Exercise lastExercise) { var newNetValue = ExerciseUtilities.GetNetExerciseValue(newExercise); var lastNetValue = ExerciseUtilities.GetNetExerciseValue(lastExercise); var min = Math.Min(newNetValue, lastNetValue); var max = Math.Max(newNetValue, lastNetValue); var delta = max - min; // Get a percentage of deviation based on average net value var improvement = (delta / max) * 100; // If most recent value is less than average, this is a negative correlation if (lastNetValue > newNetValue) { improvement *= -1; } return(Math.Round(improvement)); }