[WIP] Improve routine suggestion.
This commit is contained in:
parent
9005ed2c09
commit
11e2e56a5f
|
@ -352,6 +352,7 @@ def random_skill(request, number=None):
|
||||||
def __construct_routine(
|
def __construct_routine(
|
||||||
current_routine,
|
current_routine,
|
||||||
max_routine_length,
|
max_routine_length,
|
||||||
|
max_skill_difficulty,
|
||||||
total_difficulty_score=None,
|
total_difficulty_score=None,
|
||||||
competition=True,
|
competition=True,
|
||||||
logic=True,
|
logic=True,
|
||||||
|
@ -361,85 +362,72 @@ def __construct_routine(
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
current_routine (array): la série en cours de création.
|
current_routine (array): la série en cours de création.
|
||||||
routine_length (int): nombre de sauts qui compose la série.
|
max_routine_length (int): nombre de saut souhaités dans la série.
|
||||||
|
max_skill_difficulty (int): difficulté du saut le plus difficile à considérer.
|
||||||
total_difficulty_score (int): score total de difficulté souhaité de la série EN DIXIEME (/!\).
|
total_difficulty_score (int): score total de difficulté souhaité de la série EN DIXIEME (/!\).
|
||||||
competition (bool): indique si la série doit respecter les règles de compétition.
|
competition (bool): indique si la série doit respecter les règles de compétition.
|
||||||
logic (bool): indique si la série doit suivre les règles de logique (sportive).
|
logic (bool): indique si la série doit suivre les règles de logique (sportive).
|
||||||
gymnast (gymnast): gymnaste.
|
gymnast (gymnast): gymnaste.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
??? (list): liste des séries correspondantes aux criètres.
|
??? (list ?): liste des séries correspondantes aux criètres.
|
||||||
"""
|
"""
|
||||||
# print("Il reste " + str(max_routine_length - len(current_routine)) + " sauts à trouver.")
|
|
||||||
print("Il reste " + str(total_difficulty_score) + " dixièmes à trouver.")
|
|
||||||
|
|
||||||
if not total_difficulty_score or total_difficulty_score <= 0:
|
|
||||||
print("Total score négatif ou None !")
|
|
||||||
return
|
|
||||||
|
|
||||||
if len(current_routine) == max_routine_length:
|
if len(current_routine) == max_routine_length:
|
||||||
print(current_routine)
|
print(current_routine)
|
||||||
return
|
return
|
||||||
# print('1')
|
|
||||||
|
if total_difficulty_score / max_skill_difficulty > max_routine_length:
|
||||||
|
return
|
||||||
|
|
||||||
|
if total_difficulty_score <= 0:
|
||||||
|
return # Total score négatif, on est au dela du total score demandé
|
||||||
|
|
||||||
if current_routine:
|
if current_routine:
|
||||||
skill_list = Skill.objects.filter(
|
skill_list = Skill.objects.filter(
|
||||||
departure = current_routine[-1].landing
|
departure = current_routine[-1].landing
|
||||||
) # , difficulty__lte = total_difficulty_score
|
) # , difficulty__lte = total_difficulty_score
|
||||||
if len(current_routine) == (max_routine_length - 1):
|
if len(current_routine) == (max_routine_length - 1):
|
||||||
skill_list = skill_list.filter(landing__longLabel="Debout")
|
skill_list = skill_list.filter(landing__longLabel="Debout")
|
||||||
if logic and current_routine[-1].landing == "Debout":
|
if logic and current_routine[-1].landing.longLabel == "Debout":
|
||||||
skill_list = skill_list.exclude(rotationType = current_routine[-1].rotationType)
|
skill_list = skill_list.exclude(rotationType = current_routine[-1].rotationType)
|
||||||
else:
|
else:
|
||||||
skill_list = Skill.objects.filter(departure__longLabel = "Debout")
|
skill_list = Skill.objects.filter(departure__longLabel="Debout")
|
||||||
# print('2')
|
|
||||||
if competition:
|
if competition:
|
||||||
skill_list = skill_list.filter(is_competitive = True)
|
skill_list = skill_list.filter(is_competitive=True)
|
||||||
# skill_list = skill_list.exclude(position="L").exclude(position="c")
|
|
||||||
# print('3')
|
|
||||||
if logic and total_difficulty_score:
|
if logic and total_difficulty_score:
|
||||||
if gymnast:
|
if len(current_routine) == max_routine_length - 1:
|
||||||
max_skill_difficulty = Educative.objects.filter(cando__gymnast=gymnast).order_by(
|
min_diff_skill = total_difficulty_score
|
||||||
"-difficulty"
|
max_diff_skill = total_difficulty_score + 3
|
||||||
)[:1]
|
|
||||||
else:
|
else:
|
||||||
max_skill_difficulty = Skill.objects.values('difficulty').order_by("-difficulty")[:1][0]["difficulty"] * 10
|
if math.ceil(total_difficulty_score / max_routine_length) < max_skill_difficulty:
|
||||||
print("Max Skill diff.: " + str(max_skill_difficulty))
|
min_diff_skill = math.ceil(max((total_difficulty_score / max_routine_length) - 5, 0))
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
if math.ceil(total_difficulty_score / max_routine_length) < max_skill_difficulty:
|
if (math.ceil(total_difficulty_score / max_routine_length) + 2) <= max_skill_difficulty:
|
||||||
min_diff_skill = math.ceil(max((total_difficulty_score / max_routine_length) - 5, 0))
|
max_diff_skill = math.ceil(total_difficulty_score / max_routine_length) + 2
|
||||||
print("Min diff.: " + str(min_diff_skill))
|
else:
|
||||||
else:
|
return
|
||||||
return
|
|
||||||
|
|
||||||
if (math.ceil(total_difficulty_score / max_routine_length) + 2) <= max_skill_difficulty:
|
|
||||||
max_diff_skill = math.ceil(total_difficulty_score / max_routine_length) + 2
|
|
||||||
print("Max. diff.: " + str(max_diff_skill))
|
|
||||||
else:
|
|
||||||
print("Score demandé:" + str(total_difficulty_score))
|
|
||||||
print("# de sauts:" + str(max_routine_length))
|
|
||||||
print("Pré-condition:" + str((total_difficulty_score / max_routine_length) + 2))
|
|
||||||
print("Condition: " + str(math.ceil(total_difficulty_score / max_routine_length) + 2))
|
|
||||||
print("RETURN…")
|
|
||||||
return
|
|
||||||
|
|
||||||
skill_list = skill_list.filter(
|
skill_list = skill_list.filter(
|
||||||
difficulty__gte = (min_diff_skill / 10),
|
difficulty__gte = (min_diff_skill / 10),
|
||||||
difficulty__lte = (max_diff_skill / 10)
|
difficulty__lte = (max_diff_skill / 10)
|
||||||
)
|
)
|
||||||
# print('4')
|
|
||||||
# if gymnast:
|
|
||||||
# skill_list = skill_list.filter(can_do__gymnast = gymnast)
|
|
||||||
|
|
||||||
# skill_list = skill_list[0:3]
|
if gymnast:
|
||||||
|
skill_list = skill_list.filter(cando__gymnast = gymnast)
|
||||||
|
|
||||||
for skill in skill_list:
|
for skill in skill_list:
|
||||||
print("On sélectionne : " + str(skill))
|
|
||||||
current_routine.append(skill)
|
current_routine.append(skill)
|
||||||
|
|
||||||
__construct_routine(
|
__construct_routine(
|
||||||
current_routine,
|
current_routine,
|
||||||
max_routine_length,
|
max_routine_length,
|
||||||
total_difficulty_score - (skill.difficulty * 10) if total_difficulty_score else None,
|
max_skill_difficulty,
|
||||||
|
total_difficulty_score - (skill.difficulty * 10) if total_difficulty_score is not None else None,
|
||||||
competition,
|
competition,
|
||||||
logic,
|
logic,
|
||||||
gymnast,
|
gymnast,
|
||||||
|
@ -452,7 +440,7 @@ def __construct_routine(
|
||||||
|
|
||||||
def suggest_routine(
|
def suggest_routine(
|
||||||
request,
|
request,
|
||||||
max_routine_length = 2,
|
max_routine_length = 3,
|
||||||
total_difficulty_score=None,
|
total_difficulty_score=None,
|
||||||
competition=True,
|
competition=True,
|
||||||
logic=True,
|
logic=True,
|
||||||
|
@ -473,32 +461,38 @@ def suggest_routine(
|
||||||
|
|
||||||
>>> http://127.0.0.1:8000/routine/suggest/
|
>>> http://127.0.0.1:8000/routine/suggest/
|
||||||
"""
|
"""
|
||||||
# routines = []
|
|
||||||
# routines.append(__construct_routine(
|
|
||||||
# routine_length,
|
|
||||||
# total_difficulty_score,
|
|
||||||
# competition,
|
|
||||||
# logic,
|
|
||||||
# gymnast,
|
|
||||||
# None
|
|
||||||
# )
|
|
||||||
# )
|
|
||||||
routine = []
|
|
||||||
# if not total_difficulty_score:
|
|
||||||
# total_difficulty_score = 15
|
|
||||||
|
|
||||||
difficulty_scores = range(5, 45, 5)
|
routine = []
|
||||||
for total_difficulty_score in difficulty_scores:
|
|
||||||
print("===============================================================================================")
|
if not gymnast:
|
||||||
print(total_difficulty_score)
|
gymnast = Gymnast.objects.get(pk=14)
|
||||||
__construct_routine(
|
total_difficulty_score = 30
|
||||||
routine,
|
|
||||||
max_routine_length,
|
if gymnast:
|
||||||
total_difficulty_score,
|
max_skill_difficulty = Educative.objects.values('difficulty').filter(cando__gymnast=gymnast).order_by(
|
||||||
competition,
|
"-difficulty"
|
||||||
logic,
|
)[:1][0]["difficulty"] * 10
|
||||||
gymnast,
|
else:
|
||||||
)
|
max_skill_difficulty = Skill.objects.values('difficulty').order_by("-difficulty")[:1][0]["difficulty"] * 10
|
||||||
|
|
||||||
|
# print(max_skill_difficulty)
|
||||||
|
# if not total_difficulty_score:
|
||||||
|
# total_difficulty_score = 30
|
||||||
|
# max_routine_length = 3
|
||||||
|
|
||||||
|
|
||||||
|
# difficulty_scores = range(5, 45, 5)
|
||||||
|
# for total_difficulty_score in difficulty_scores:
|
||||||
|
# print("===============================================================================================")
|
||||||
|
__construct_routine(
|
||||||
|
routine,
|
||||||
|
max_routine_length,
|
||||||
|
max_skill_difficulty,
|
||||||
|
total_difficulty_score,
|
||||||
|
competition,
|
||||||
|
logic,
|
||||||
|
gymnast,
|
||||||
|
)
|
||||||
# print(routines)
|
# print(routines)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -76,8 +76,8 @@ class GymnastForm(forms.ModelForm):
|
||||||
)
|
)
|
||||||
widgets = {
|
widgets = {
|
||||||
"id": forms.HiddenInput(),
|
"id": forms.HiddenInput(),
|
||||||
"lastname": forms.TextInput(attrs={"class": "form-control"}),
|
"lastname": forms.TextInput(attrs={"class": "form-control", "placeholder":"Lastname"}),
|
||||||
"firstname": forms.TextInput(attrs={"class": "form-control"}),
|
"firstname": forms.TextInput(attrs={"class": "form-control", "placeholder":"Firstname"}),
|
||||||
"birthdate": forms.DateInput(attrs={"class": "form-control datepicker"}),
|
"birthdate": forms.DateInput(attrs={"class": "form-control datepicker"}),
|
||||||
"gender": forms.Select(attrs={"class": "form-control"}),
|
"gender": forms.Select(attrs={"class": "form-control"}),
|
||||||
"address": forms.TextInput(attrs={"class": "form-control"}),
|
"address": forms.TextInput(attrs={"class": "form-control"}),
|
||||||
|
|
Loading…
Reference in New Issue