File size: 3,993 Bytes
38b60e5
30222ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38b60e5
30222ce
 
38b60e5
30222ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38b60e5
 
 
 
30222ce
38b60e5
 
30222ce
 
 
 
 
38b60e5
 
30222ce
 
38b60e5
 
 
 
 
30222ce
 
38b60e5
30222ce
 
 
 
38b60e5
30222ce
38b60e5
30222ce
 
 
 
 
 
 
 
38b60e5
 
 
30222ce
38b60e5
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import gradio as gr

# === Conversion pour Acontista mexicana ===
def age_humain_acontista(mois: float) -> float:
    """Conversion Acontista mexicana."""
    if mois <= 1:
        return 3 * mois
    elif mois <= 2:
        return 3 + (mois - 1) * 7
    elif mois <= 3.5:
        return 10 + (mois - 2) * 6.67
    elif mois <= 4:
        return 20 + (mois - 3.5) * 14
    elif mois <= 6:
        return 27 + (mois - 4) * 16.5
    elif mois <= 10:
        return 60 + (mois - 6) * 10
    else:
        return 100


# === Conversion pour Hierodula spp. ===
def age_humain_hierodula(stade: str = None, mois: float = None, sexe: str = "Femelle") -> float:
    """Conversion Hierodula spp. selon les données de Ruben."""
    stades_mois = {
        "L1": 0,
        "L2": 0.5,
        "L3": 1.25,
        "L4": 2.125,
        "L5": 3.125,
        "L6": 4.625,
        "L7": 6.825,
        "L8": 9.325,
    }

    # Si on a donné un stade
    if stade:
        mois = stades_mois.get(stade, 0)

    # Durée adulte selon le sexe
    if sexe == "Mâle":
        max_vie = 17      # ~L8 + 7.5 mois
    elif sexe == "Femelle":
        max_vie = 19.5    # ~L8 + 10 mois
    else:
        max_vie = 18.5

    # Conversion en âge humain
    if mois <= 9.325:
        age_humain = (mois / 9.325) * 27
    else:
        age_humain = 27 + ((mois - 9.325) / (max_vie - 9.325)) * (100 - 27)

    return min(age_humain, 100)


# === Gestion générale ===
def convertir_age(age_input, unite, espece, sexe):
    espece = espece.lower()

    if espece.startswith("acontista"):
        if unite == "Stade":
            return "Pour Acontista, indique l'âge en mois."
        try:
            mois = float(age_input)
        except:
            return "Entrée invalide pour l'âge."
        age_humain = age_humain_acontista(mois)
        return f"Âge humain approximatif : {age_humain:.1f} ans"

    elif espece.startswith("hierodula"):
        if unite == "Stade":
            age_humain = age_humain_hierodula(stade=age_input, sexe=sexe)
        else:
            try:
                mois = float(age_input)
            except:
                return "Entrée invalide pour l'âge."
            age_humain = age_humain_hierodula(mois=mois, sexe=sexe)
        return f"Âge humain approximatif : {age_humain:.1f} ans"

    else:
        return "Espèce non reconnue."


# === Interface Gradio ===
def main():
    with gr.Blocks() as demo:
        gr.Markdown("# 🦗 Convertisseur d’âge de mante religieuse en âge humain")
        gr.Markdown("## Projet de Ruben — modèle expérimental basé sur *Acontista mexicana* et *Hierodula spp.*")

        espece = gr.Radio(["Acontista mexicana", "Hierodula spp."], label="Espèce", value="Acontista mexicana")
        unite = gr.Radio(["Mois", "Stade"], label="Type d’entrée", value="Mois")

        age_input = gr.Dropdown(
            ["L1", "L2", "L3", "L4", "L5", "L6", "L7", "L8"],
            label="Stade (si applicable)",
            value="L1"
        )
        mois_input = gr.Number(label="Âge en mois (si applicable)", value=1.0)
        sexe = gr.Radio(["Femelle", "Mâle", "Indéterminé"], label="Sexe", value="Femelle")

        bouton = gr.Button("Convertir")
        resultat = gr.Textbox(label="Résultat")

        # Fonction liée au bouton
        def process(espece, unite, stade, mois, sexe):
            if unite == "Mois":
                return convertir_age(mois, unite, espece, sexe)
            else:
                return convertir_age(stade, unite, espece, sexe)

        bouton.click(process, [espece, unite, age_input, mois_input, sexe], resultat)

        gr.Markdown(
            "### ℹ️ Notes :\n"
            "- Les équivalences sont basées sur des observations empiriques.\n"
            "- Les *Acontista mexicana* se développent plus rapidement.\n"
            "- Les *Hierodula spp.* ont un cycle de vie plus long et progressif.\n"
        )

    demo.launch()


if __name__ == "__main__":
    main()