def _trim_most_worked_muscles(self, target_time): if self.get_total_time() < target_time: return non_supersets = [_we for _we in self._workout__exercise_list if _we.first_super_set_workout_exercise_id is None] while self.get_total_time() > target_time: # SBL MOVE THIS LOGIC TO ITS OWN FUNCTION muscle_id_to_ring = {} ring_to_count = {} for muscle_id_set in MuscleGroup.get_rings(): muscle_id_tuple = tuple(muscle_id_set) for muscle_id in muscle_id_tuple: muscle_id_to_ring[muscle_id] = muscle_id_tuple ring_to_count[muscle_id_tuple] = 0 for _we in non_supersets: exercise = Exercise.get_by_id(_we.exercise_id) muscle_id_tuple = muscle_id_to_ring[exercise.muscle_group_id] if _we.sets: ring_to_count[muscle_id_tuple] += 1 muscle_ring__count = sorted(ring_to_count.items(), key=lambda t: t[1], reverse=True) for _we in non_supersets: exercise = Exercise.get_by_id(_we.exercise_id) if _we.sets and exercise.muscle_group_id in muscle_ring__count[0][0]: _we.sets = 0 if _we.second_exercise: _we.second_exercise.sets = 0 break
def _get_workout_component_to_exercises(self): workout_component_to_exercises = defaultdict(list) first_exercise_superset = [_we for _we in self._workout__exercise_list if _we.first_super_set_workout_exercise_id is None] second_exercise_superset = [_we for _we in self._workout__exercise_list if _we.first_super_set_workout_exercise_id is not None] for _workout__exercise in first_exercise_superset: exercise = Exercise.get_by_id(_workout__exercise.exercise_id) workout_component_to_exercises[exercise.workout_component_id].append(_workout__exercise) for _workout__exercise in second_exercise_superset: exercise = Exercise.get_by_id(_workout__exercise.exercise_id) for _workout__exercise_initial in workout_component_to_exercises[exercise.workout_component_id]: if _workout__exercise_initial.id == _workout__exercise.first_super_set_workout_exercise_id: _workout__exercise_initial.second_exercise = _workout__exercise break return workout_component_to_exercises
def _trim_lonely_muscle_groups(self, target_time): if self.get_total_time() < target_time: return non_supersets = [_we for _we in self._workout__exercise_list if _we.first_super_set_workout_exercise_id is None] muscle_id_to_ring = {} ring_to_count = {} for muscle_id_set in MuscleGroup.get_rings(): muscle_id_tuple = tuple(muscle_id_set) for muscle_id in muscle_id_tuple: muscle_id_to_ring[muscle_id] = muscle_id_tuple ring_to_count[muscle_id_tuple] = 0 for _we in non_supersets: exercise = Exercise.get_by_id(_we.exercise_id) muscle_id_tuple = muscle_id_to_ring[exercise.muscle_group_id] ring_to_count[muscle_id_tuple] += 1 for muscle_ring, count in ring_to_count.items(): if count == 1: for _we in non_supersets: _we.sets = 0 if self.get_total_time() < target_time: break else: continue break
def get_total_time(self): total_time = 0.0 workout_component_to_exercises = self._get_workout_component_to_exercises() for workout_component_id, exercise_list in workout_component_to_exercises.items(): if workout_component_id == WorkoutComponent.FLEXIBILITY: continue workout_component = WorkoutComponent.get_by_id(workout_component_id) for _workout__exercise in exercise_list: seconds_rest = workout_component.get_rest(self.phase) minutes_rest = float(seconds_rest) / 60 minutes_rest *= _workout__exercise.sets total_time += minutes_rest for _we in [_workout__exercise, _workout__exercise.second_exercise]: if _we is None: continue exercise = Exercise.get_by_id(_we.exercise_id) if exercise.timed: total_time += _we.sets * SECONDS_FOR_TIMED_EXERCISE / 60.0 else: total_reps = _we.reps * _we.sets rep_minutes = total_reps * self.phase.tempo.seconds_per_rep / 60.0 total_time += rep_minutes total_time *= TIME_FUDGE_FACTOR return total_time
def get_rep_prescriptions_for_muscle(self, muscle_id): rep_list = [] for _workout__exercise in self._workout__exercise_list: exercise = Exercise.get_by_id(_workout__exercise.exercise_id) if exercise.muscle_group_id == muscle_id: rep_list.append(_workout__exercise.reps) return rep_list
def get_muscle_ids_used(self): muscle_ids = self.get_primary_muscle_ids_used() for _workout__exercise in self._workout__exercise_list: exercise = Exercise.get_by_id(_workout__exercise.exercise_id) muscle_ids.extend(exercise.muscle_group_ids) muscle_ids = list(set(muscle_ids)) return muscle_ids
def get_primary_muscle_ids_used(self, workout_component_id=None): muscle_ids = [] for _workout__exercise in self._workout__exercise_list: exercise = Exercise.get_by_id(_workout__exercise.exercise_id) if workout_component_id is None or exercise.workout_component_id == workout_component_id: muscle_ids.append(exercise.muscle_group_id) muscle_ids = list(set(muscle_ids)) return muscle_ids
def get_exercise_ids_used(self, workout_component_id=None): exercise_ids = [] for _we in self._workout__exercise_list: if workout_component_id: exercise = Exercise.get_by_id(_we.exercise_id) if exercise.workout_component_id != workout_component_id: continue exercise_ids.append(_we.exercise_id) return exercise_ids
def _trim_isolated_exercises(self, target_time): if self.get_total_time() < target_time: return non_supersets = [_we for _we in self._workout__exercise_list if _we.first_super_set_workout_exercise_id is None] for _we in non_supersets: exercise = Exercise.get_by_id(_we.exercise_id) if not _we.second_exercise and exercise.compound: _we.sets = 0 if self.get_total_time() < target_time: break
def _workout__exercise_to_json(self, _workout__exercise): if _workout__exercise is None: return None if _workout__exercise.first_super_set_workout_exercise_id is None and _workout__exercise.sets == 0: # sets can be reduced to 0 via time trimming return None return { "exercise": Exercise.get_by_id(_workout__exercise.exercise_id).to_json(), "reps": _workout__exercise.reps, "sets": _workout__exercise.sets, "superset": self._workout__exercise_to_json(_workout__exercise.second_exercise) }