quentinL52
Initial commit
4e9b744
from typing import Dict
def calculate_technical_gap_score(indicators: Dict[str, bool]) -> int:
"""
Calcule le niveau (0-4) pour une lacune technique basée sur les indicateurs binaires.
Poids:
- concept_sous_jacent: 2
- experience_liee: 1
- outil_adjacent: 1
- cas_usage: 1
- strategie_montee: 1
Mapping:
- 0 pts -> Niveau 0
- 1-2 pts -> Niveau 1
- 3 pts -> Niveau 2
- 4 pts -> Niveau 3
- 5-6 pts -> Niveau 4
"""
weights = {
"concept_sous_jacent": 2,
"experience_liee": 1,
"outil_adjacent": 1,
"cas_usage": 1,
"strategie_montee": 1
}
score = sum(weights.get(k, 0) for k, v in indicators.items() if v)
if score == 0: return 0
if score <= 2: return 1
if score == 3: return 2
if score == 4: return 3
return 4
def calculate_project_tech_understanding_score(indicators: Dict[str, bool]) -> int:
"""
Calcule le score (1-5) pour la compréhension d'une technologie projet.
Poids:
- justifie_choix: 1
- fonctionnement_interne: 3
- identifie_limites: 2
- propose_alternatives: 2
- quantifie_resultats: 1
- resolution_probleme: 2
Total max: 11
Mapping:
- 0-2 -> 1/5 (usage superficiel)
- 3-4 -> 2/5 (usage fonctionnel)
- 5-6 -> 3/5 (compréhension partielle)
- 7-9 -> 4/5 (bonne compréhension)
- 10-11 -> 5/5 (maîtrise démontrée)
"""
weights = {
"justifie_choix": 1,
"fonctionnement_interne": 3,
"identifie_limites": 2,
"propose_alternatives": 2,
"quantifie_resultats": 1,
"resolution_probleme": 2
}
score = sum(weights.get(k, 0) for k, v in indicators.items() if v)
if score <= 2: return 1
if score <= 4: return 2
if score <= 6: return 3
if score <= 9: return 4
return 5
def calculate_behavioral_score(competence: str, indicators: Dict[str, bool]) -> int:
"""
Calcule le score (1-5) pour une compétence comportementale.
Utilise une pondération spécifique par compétence si définie, sinon une générique.
Mapping proportionnel au max possible.
"""
# Exemples de poids par défaut si non spécifiés dans le code appelant
# Ici on suppose que les indicateurs passés correspondent à ceux attendus pour la compétence
# On va utiliser une heuristique simple: 1 point par indicateur si pas de poids spécifique,
# ou on code en dur les poids des exemples connus.
# Poids par défaut pour les exemples connus
weights_map = {
"Adaptabilité": {
"situation_changement": 2,
"actions_concretes": 2,
"apprentissage_ajustement": 2,
"resultat_quantifie": 1,
"limites_reconnues": 1,
"transfert_competence": 2
},
"Apprentissage autonome": {
"demarche_auto_formation": 2, # Mapping approximatif des clés JSON
"ressources_specifiques": 1,
"progression_mesurable": 2,
"application_concrete": 2,
"identifie_reste_a_apprendre": 1
}
}
# Si la compétence est connue, on utilise ses poids, sinon 1.
competence_weights = weights_map.get(competence, {})
total_score = 0
max_score = 0
for key, val in indicators.items():
weight = competence_weights.get(key, 1) # Default weight 1 if unknown key
if val:
total_score += weight
max_score += weight
if max_score == 0:
return 3 # Score neutre si aucun indicateur defini
ratio = total_score / max_score
# Mapping linéaire approximatif vers 1-5
if ratio <= 0.2: return 1
if ratio <= 0.4: return 2
if ratio <= 0.6: return 3
if ratio <= 0.8: return 4
return 5
def calculate_situation_score(indicators: Dict[str, bool]) -> int:
"""
Calcule le score (1-5) pour la mise en situation.
Poids:
- comprehension_probleme: 2
- demarche_structuree: 3
- pertinence_technique: 3
- gestion_contraintes: 2
- communication_solution: 1
- identification_risques: 2
- proposition_alternatives: 1
Total max: 14
Mapping:
- 0-3 -> 1/5
- 4-6 -> 2/5
- 7-9 -> 3/5
- 10-12 -> 4/5
- 13-14 -> 5/5
"""
weights = {
"comprehension_probleme": 2,
"demarche_structuree": 3,
"pertinence_technique": 3,
"gestion_contraintes": 2,
"communication_solution": 1,
"identification_risques": 2,
"proposition_alternatives": 1
}
score = sum(weights.get(k, 0) for k, v in indicators.items() if v)
if score <= 3: return 1
if score <= 6: return 2
if score <= 9: return 3
if score <= 12: return 4
return 5