Beispiel #1
0
        private Dictionary <Exercise, ProgressStatistics> CalculateExerciseProgress(ExerciseHistory history)
        {
            Dictionary <Exercise, ProgressStatistics> stats = new Dictionary <Exercise, ProgressStatistics>();
            HashSet <Exercise> recentExercises = new HashSet <Exercise>();

            List <WorkoutSession> allSessions = user.GetAllSessions();

            foreach (WorkoutSession session in allSessions)
            {
                foreach (WorkoutItem item in session.workoutItems)
                {
                    if (stats.ContainsKey(item.ex))
                    {
                        stats[item.ex].AddDataPoint(session.date, item.oneRepMax);
                    }
                    else
                    {
                        stats.Add(item.ex, new ProgressStatistics());
                    }
                }
            }

            Console.WriteLine("Exercise scores:");
            foreach (var kvp in stats)
            {
                kvp.Value.Finish();
                Console.WriteLine(kvp.Key.exerciseName + " = ");
                Console.WriteLine("\tLin_Slope = " + kvp.Value.Lin_Slope + "\n\tLin_Significance = " + kvp.Value.Lin_Significance);
            }

            return(stats);
        }
Beispiel #2
0
 /// <summary>
 /// initialized and calculates all of the values for the users history
 /// </summary>
 private void BuildWorkoutHistory()
 {
     history = new ExerciseHistory();
     history = CalculateBodyPartVolumes();
     history.exerciseStatistics = CalculateExerciseProgress(history);
 }
Beispiel #3
0
        private ExerciseHistory CalculateBodyPartVolumes()
        {
            ExerciseHistory res = new ExerciseHistory();

            List <WorkoutSession> sessions = user.GetAllSessions();

            sessions.Sort((lhs, rhs) => (rhs.date - lhs.date).Ticks > 0 ? 1 : -1);

            bool     anyFound   = false;
            DateTime firstFound = DateTime.MinValue;

            foreach (WorkoutSession session in sessions)
            {
                foreach (WorkoutItem item in session.workoutItems)
                {
                    foreach (WorkoutSet set in item.sets)
                    {
                        if (set.repsCompleted != 0)
                        {
                            firstFound = session.date;
                            anyFound   = true;
                            break;
                        }
                    }
                    if (anyFound)
                    {
                        break;
                    }
                }
                if (anyFound)
                {
                    break;
                }
            }

            if (anyFound)
            {
                DateTime startDate             = firstFound - new TimeSpan(7, 0, 0, 0, 0); //ein woch
                DateTime endDate               = firstFound;
                List <WorkoutSession> relevant = sessions.Where(session => (session.date <= endDate && session.date >= startDate)).ToList();

                res.recentExercises = new HashSet <Exercise>();
                relevant.ForEach(sesh => {
                    sesh.workoutItems.ForEach(item => {
                        res.recentExercises.Add(item.ex);
                    });
                });

                Dictionary <BodyPart, Tuple <int, int, int> > history = new Dictionary <BodyPart, Tuple <int, int, int> >();
                history.Add(BodyPart.Abs, new Tuple <int, int, int>(0, 0, 0));
                history.Add(BodyPart.Arms, new Tuple <int, int, int>(0, 0, 0));
                history.Add(BodyPart.Back, new Tuple <int, int, int>(0, 0, 0));
                history.Add(BodyPart.Chest, new Tuple <int, int, int>(0, 0, 0));
                history.Add(BodyPart.Legs, new Tuple <int, int, int>(0, 0, 0));
                history.Add(BodyPart.Shoulders, new Tuple <int, int, int>(0, 0, 0));
                if (relevant.Count > 0)
                {
                    relevant.ForEach(sesh =>
                                     sesh.workoutItems.ForEach(item => {
                        if (item.ex.areaNumber == 1)
                        {
                            Tuple <int, int, int> val     = history[item.ex.mainBodyPart];
                            history[item.ex.mainBodyPart] =
                                new Tuple <int, int, int>(item.sets.Select(set => set.reps * set.percent1RM).Aggregate((val0, val1) => val0 + val1), val.Item2, val.Item3);
                        }
                        else if (item.ex.areaNumber == 2)
                        {
                            Tuple <int, int, int> val     = history[item.ex.mainBodyPart];
                            history[item.ex.mainBodyPart] =
                                new Tuple <int, int, int>(val.Item1, item.sets.Select(set => set.reps * set.percent1RM).Aggregate((val0, val1) => val0 + val1), val.Item3);
                        }
                        else
                        {
                            Tuple <int, int, int> val     = history[item.ex.mainBodyPart];
                            history[item.ex.mainBodyPart] =
                                new Tuple <int, int, int>(val.Item1, val.Item2, item.sets.Select(set => set.reps * set.percent1RM).Aggregate((val0, val1) => val0 + val1));
                        }
                    }
                                                               )
                                     );
                }

                var sorted = history.ToList();
                sorted.Sort((lhs, rhs) => (lhs.Value.Item1 + lhs.Value.Item2 + lhs.Value.Item3) - (rhs.Value.Item1 + rhs.Value.Item2 + rhs.Value.Item3));

                Console.WriteLine("Body part volumes:");
                foreach (var something in sorted)
                {
                    Console.WriteLine(something.Key.ToString() + " = ");
                    Console.WriteLine("\t" + something.Value.Item1 + ", " + something.Value.Item2 + ", " + something.Value.Item3);
                }

                res.bodyPartVolumes = new List <Group>();
                sorted.ForEach(kvp => res.bodyPartVolumes.Add(new Group(kvp)));
            }
            else
            {
                res.bodyPartVolumes = new List <Group>();
                Enum.GetValues(typeof(BodyPart)).OfType <BodyPart>().ToList().ForEach(bp => {
                    res.bodyPartVolumes.Add(new Group(bp));
                });
                res.recentExercises = new HashSet <Exercise>();
            }
            return(res);
        }
Beispiel #4
0
        private List <Exercise> CalculateExercises(BodyPart part, Tuple <setCount, setCount, setCount> groupNums, ExerciseHistory history)
        {
            HashSet <Exercise> res = new HashSet <Exercise>();
            Dictionary <Exercise, ProgressStatistics> stats = history.exerciseStatistics;

            //first pick a random subgroup and find an exercise that is compound
            Distribution <int> subgroupChance = new Distribution <int>();

            subgroupChance[1] = groupNums.Item1;
            subgroupChance[2] = groupNums.Item2;
            subgroupChance[3] = groupNums.Item3;
            int      chosenSubgroup = subgroupChance.select();
            var      g1c            = Exercise.onlyCompoundsInSubgroup(Exercise.group(Exercise.globalExercises, part), chosenSubgroup);
            Exercise chosenEx       = g1c.ElementAt(Util.rand(g1c.Count() - 1));

            //get a set of exercises for each subgroup, excluding the compound one we picked first
            var g1s = Exercise.group(Exercise.globalExercises, part, 1); if (chosenSubgroup == 1)
            {
                g1s.Remove(chosenEx);
            }
            var g2s = Exercise.group(Exercise.globalExercises, part, 2); if (chosenSubgroup == 2)
            {
                g2s.Remove(chosenEx);
            }
            var g3s = Exercise.group(Exercise.globalExercises, part, 3); if (chosenSubgroup == 3)
            {
                g3s.Remove(chosenEx);
            }

            //create a probability distribution for each of the exercise sets
            Distribution <Exercise> dg1 = new Distribution <Exercise>();
            Distribution <Exercise> dg2 = new Distribution <Exercise>();
            Distribution <Exercise> dg3 = new Distribution <Exercise>();

            foreach (Exercise ex in g1s)
            {
                const double baseScore = 0.1;
                double       score     = stats.ContainsKey(ex) ? stats[ex].Lin_Slope * stats[ex].Lin_Significance : 0.0;
                dg1[ex] = Math.Max((history.recentExercises.Contains(ex) ? 0.3 : 0) + baseScore + score, 0.0);
                //Console.WriteLine(ex.exerciseName + ", " + dg1[ex]);
            }
            foreach (Exercise ex in g2s)
            {
                const double baseScore = 0.1;
                double       score     = stats.ContainsKey(ex) ? stats[ex].Lin_Slope * stats[ex].Lin_Significance : 0.0;
                dg2[ex] = Math.Max((history.recentExercises.Contains(ex) ? 0.3 : 0) + baseScore + score, 0.0);
                //Console.WriteLine(ex.exerciseName + ", " + dg2[ex]);
            }
            foreach (Exercise ex in g3s)
            {
                const double baseScore = 0.1;
                double       score     = stats.ContainsKey(ex) ? stats[ex].Lin_Slope * stats[ex].Lin_Significance : 0.0;
                dg3[ex] = Math.Max((history.recentExercises.Contains(ex) ? 0.3 : 0) + baseScore + score, 0.0);
                //Console.WriteLine(ex.exerciseName + ", " + dg3[ex]);
            }

            //pick a bunch of random exercises from the subgroup sets we've found earlier
            res.UnionWith(dg1.selectN_unique(groupNums.Item1));
            res.UnionWith(dg2.selectN_unique(groupNums.Item2));
            res.UnionWith(dg3.selectN_unique(groupNums.Item3));

            //Console.WriteLine("Chosen exercises:");
            //foreach(Exercise ex in res) {
            //    Console.WriteLine(ex.exerciseName);
            //}

            return(res.ToList());
        }