Пример #1
0
    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
Пример #2
0
def _select_exercise(exercise_filter, previous_exercise=None, retry_mode=False, logger=None):
    logger = logger or mock.MagicMock()
    if previous_exercise is not None:
        for related_muscle_group_set in MuscleGroup.get_rings():
            if previous_exercise.muscle_group_id in related_muscle_group_set:
                logger.log_muscle_restriction(previous_exercise, related_muscle_group_set)
                exercise_filter.restrict_to_muscle_group_ids(related_muscle_group_set)
                break
    elif not retry_mode:
        logger.log_retry_mode()
        exercise_filter = exercise_filter.compound_only()
    elif retry_mode and previous_exercise is None:
        logger.log_rollback_mode()
        rollback_filter = exercise_filter.copy()
        exercise_filter = exercise_filter.compound_only()
        if exercise_filter.count() == 0:
            exercise_filter = rollback_filter
        if exercise_filter.count() == 0:
            raise DeadEndException("Need a bigger exercise pool to continue")

    exercise_list = [exercise for exercise in exercise_filter.query]

    logger.log_available_exercises(exercise_list)
    exercise_list = evenly_distribute_exercises_by_muscle_group(exercise_list)
    try:
        exercise = random.choice(exercise_list)
    except IndexError:
        raise NoExercisesAvailableException("No exercises left")
    logger.log_exercise_selection(exercise)
    return exercise
Пример #3
0
    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