Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Les Enums sont définis comme en Python 3 #846

Merged
merged 41 commits into from
Jan 16, 2018
Merged

Les Enums sont définis comme en Python 3 #846

merged 41 commits into from
Jan 16, 2018

Conversation

Anna-Livia
Copy link
Contributor

@Anna-Livia Anna-Livia commented Nov 20, 2017

Connected to #831

  • Amélioration technique

  • Détails :

    • Modifie la façon dont les Enumerations sont définis et appelés.
    • Certains enums étaient utilisés comme booleens. La valeur 0/1 a été remplacé par le membre d'enum correspondant.
      Par exemple pour :
    class TypesAAHNonCalculable(Enum):
      non_renseigne = u"Non renseigné"
      intervention_CDAPH_necessaire = u"intervention_CDAPH_necessaire"
    

    False devient TypesAAHNonCalculable.non_renseigne
    True devient TypesAAHNonCalculable.intervention_CDAPH_necessaire

    Les valeurs possibles des Enums ainsi que les nouvelles valeurs par défaut sont disponibles sur legislation.openfisca.fr

    Pour les mainteneurs de formules:

    Les Enums étaient habituellement placés au dessus de la variable qui le calculait.
    Ils sont maintenant tous placés dans le fichier model/base.py, et commencent tous par Type


Ces changements _(effacez les lignes ne correspondant pas à votre cas) impactent l'API publique d'OpenFisca France (par exemple renommage ou suppression de variables).

@guillett
Copy link
Member

Merci beaucoup @Anna-Livia.

J'ajoute deux cas de test supplémentaires.

Dans la situation suivante la variable rsa_non_calculable génère l'erreur
"Internal server error: 'NoneType' object has no attribute 'name'"

{
    "familles": {
        "_": {
            "parents": [
                "demandeur"
            ],
            "rsa_non_calculable": {
                "2017-10": null
            },
            "aide_logement_non_calculable": {
                "2017-12": null
            }
        }
    },
    "foyers_fiscaux": {
        "_": {
            "declarants": [
                "demandeur"
            ],
            "personnes_a_charge": []
        }
    },
    "individus": {
        "demandeur": {}
    },
    "menages": {
        "_": {
            "personne_de_reference": [
                "demandeur"
            ]
        }
    }
}

Pour la situation suivante je m'attends à un RSA à 470.95€ (https://mes-aides.gouv.fr/tests/58d3eeeeb5028ff3207a188e/show) mais j'obtiens 0 (désolé pour le dump complet [avec les variables d'extensions]) :

{
    "familles": {
        "_": {
            "acs": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "af": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "aide_logement": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "aide_logement_non_calculable": {
                "2017-03": null
            },
            "asf": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "asi": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "aspa": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "ass": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "bourse_college": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "bourse_lycee": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "cf": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "cmu_c": {
                "2017-03": null
            },
            "enfants": [],
            "paje_base": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "parents": [
                "58d3eeeba2c5bff720fb554d"
            ],
            "paris_complement_sante": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "paris_energie_famille": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "paris_forfait_famille": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "paris_logement": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "paris_logement_aspeh": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "paris_logement_familles": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "paris_logement_plfm": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "paris_logement_psol": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "ppa": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "proprietaire_proche_famille": {
                "2016-12": false,
                "2017-01": false,
                "2017-02": false,
                "2017-03": false
            },
            "rsa": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            }
        }
    },
    "foyers_fiscaux": {
        "_": {
            "declarants": [
                "58d3eeeba2c5bff720fb554d"
            ],
            "personnes_a_charge": []
        }
    },
    "individus": {
        "58d3eeeba2c5bff720fb554d": {
            "aah": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "aah_non_calculable": {
                "2017-03": null
            },
            "age": {
                "2016-12": 35,
                "2017-01": 35,
                "2017-02": 35,
                "2017-03": 35
            },
            "age_en_mois": {
                "2016-12": 420,
                "2017-01": 420,
                "2017-02": 420,
                "2017-03": 420
            },
            "apa_eligibilite": {
                "2017-03": null
            },
            "boursier": {
                "2016-12": false,
                "2017-01": false,
                "2017-02": false,
                "2017-03": false
            },
            "date_arret_de_travail": {
                "2016-12": "2017-11-27",
                "2017-01": "2017-11-27",
                "2017-02": "2017-11-27",
                "2017-03": "2017-11-27"
            },
            "date_naissance": {
                "2016-12": "1982-03-20",
                "2017-01": "1982-03-20",
                "2017-02": "1982-03-20",
                "2017-03": "1982-03-20"
            },
            "enfant_a_charge": {
                "2017": false
            },
            "enfant_place": {
                "2016-12": false,
                "2017-01": false,
                "2017-02": false,
                "2017-03": false
            },
            "epargne_non_remuneree": {
                "2012-01": 0
            },
            "gir": {
                "2016-12": "non_defini",
                "2017-01": "non_defini",
                "2017-02": "non_defini",
                "2017-03": "non_defini"
            },
            "handicap": {
                "2016-12": false,
                "2017-01": false,
                "2017-02": false,
                "2017-03": false
            },
            "inapte_travail": {
                "2016-12": false,
                "2017-01": false,
                "2017-02": false,
                "2017-03": false
            },
            "interets_epargne_sur_livrets": {
                "2012-01": 0
            },
            "rennes_metropole_transport": {
                "2016-03": 0,
                "2016-04": 0,
                "2016-05": 0,
                "2016-06": 0,
                "2016-07": 0,
                "2016-08": 0,
                "2016-09": 0,
                "2016-10": 0,
                "2016-11": 0,
                "2016-12": 0,
                "2017-01": 0,
                "2017-02": 0,
                "2017-03": null
            },
            "salaire_imposable": {
                "2015": 0
            },
            "statut_marital": {
                "2016-12": "celibataire",
                "2017-01": "celibataire",
                "2017-02": "celibataire",
                "2017-03": "celibataire"
            },
            "taux_incapacite": {
                "2016-12": false,
                "2017-01": false,
                "2017-02": false,
                "2017-03": false
            },
            "tns_auto_entrepreneur_type_activite": {
                "2016-12": "bic",
                "2017-01": "bic",
                "2017-02": "bic",
                "2017-03": "bic"
            },
            "tns_micro_entreprise_type_activite": {
                "2016-12": "bic",
                "2017-01": "bic",
                "2017-02": "bic",
                "2017-03": "bic"
            },
            "valeur_locative_immo_non_loue": {
                "2012-01": 0
            },
            "valeur_locative_terrains_non_loue": {
                "2012-01": 0
            }
        }
    },
    "menages": {
        "_": {
            "charges_locatives": {
                "2016-12": 50,
                "2017-01": 50,
                "2017-02": 50,
                "2017-03": 50
            },
            "coloc": {
                "2016-12": false,
                "2017-01": false,
                "2017-02": false,
                "2017-03": false
            },
            "depcom": {
                "2016-12": "75101",
                "2017-01": "75101",
                "2017-02": "75101",
                "2017-03": "75101"
            },
            "enfants": [],
            "logement_chambre": {
                "2016-12": false,
                "2017-01": false,
                "2017-02": false,
                "2017-03": false
            },
            "loyer": {
                "2016-12": 600,
                "2017-01": 600,
                "2017-02": 600,
                "2017-03": 600
            },
            "personne_de_reference": [
                "58d3eeeba2c5bff720fb554d"
            ],
            "statut_occupation_logement": {
                "2016-12": "locataire_vide",
                "2017-01": "locataire_vide",
                "2017-02": "locataire_vide",
                "2017-03": "locataire_vide"
            }
        }
    }
}

Copy link
Member

@fpagnoux fpagnoux left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That looks like a tedious jobs, thank you for taking care of it !

CHANGELOG.md Outdated
@@ -1,5 +1,28 @@
# Changelog

## 19.0.0 - [#846](https://github.com/openfisca/openfisca-france/pull/846)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le changelog n'explique pas quels sont les breaking change et comment s'y adapter

CHANGELOG.md Outdated

* Amélioration technique
* Détails :
- Modifie la façon dont les Enumerations sont définis et appelés.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'aurais tendance à dire que "Enumerations" est féminin. définies ? appelées ?

@@ -107,12 +102,14 @@ def formula(individu, period, parameters):
# heures_mensuelles = min_(salaire_mensuel_reference / smic_h_b, 35 * 52 / 12) # TODO: depuis 2001 mais avant ?
heures_mensuelles = 35 * 52 / 12
cho_seuil_exo = law.prelevements_sociaux.contributions.csg.chomage.min_exo * heures_mensuelles * smic_h_b

eligible = \
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prefer implicit line continuation to backslashes.

eligible = (
    (taux_csg_remplacement == TypesTauxCSGRemplacement.taux_reduit) +
    (taux_csg_remplacement == TypesTauxCSGRemplacement.taux_plein)
)

@@ -22,7 +23,14 @@ def formula(self, simulation, period):
seuil_effectif = simulation.parameters_at(period.start).cotsoc.versement_transport.seuil_effectif

preload_taux_versement_transport()
public = (categorie_salarie >= 2)
public = \
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here, avoid backslashes

@@ -425,14 +429,25 @@ def switch_on_allegement_mode(simulation, period, mode_recouvrement, variable_na
should precisely be the variable name prefixed with 'compute_'
"""
compute_function = globals()['compute_' + variable_name]
return switch(
if type(mode_recouvrement[0]) == TypesAllegementCotisationAllocationsFamilialesModeRecouvrement:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is quite complicated.

Why not giving up the switch and have something like:

recouvrement_fin_annee = (mode_recouvrement == TypesAllegementCotisationAllocationsFamilialesModeRecouvrement.fin_d_annee) + (mode_recouvrement == TypesAllegementFillonModeRecouvrement.fin_d_annee)
recouvrement_anticipe  = (mode_recouvrement == TypesAllegementCotisationAllocationsFamilialesModeRecouvrement. anticipe) + (mode_recouvrement == TypesAllegementFillonModeRecouvrement. anticipe)
recouvrement_progressif = ...

return recouvrement_fin_annee * compute_allegement_annuel(...) + recouvrement_anticipe * compute_allegement_anticipe(...)

plancher = min_zone_1 * (zone_apl == 1) + min_zone_2 * (zone_apl == 2) + min_zone_3 * (zone_apl == 3)
taux = P.taux.zone1 * (zone_apl == TypesZoneApl.zone_1) + P.taux.zone2 * (zone_apl == TypesZoneApl.zone_2) + P.taux.zone3 * (zone_apl == TypesZoneApl.zone_3)
plancher = min_zone_1 * (zone_apl == TypesZoneApl.zone_1) + min_zone_2 * (zone_apl == TypesZoneApl.zone_2) + min_zone_3 * (zone_apl == TypesZoneApl.zone_3)
public = \
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use implicit line continuation

@@ -725,7 +704,15 @@ def formula(self, simulation, period):
_P = simulation.parameters_at(period.start)

traitement_annuel_brut = _P.fonc.IM_100
return (traitement_indiciaire_brut * 100 * 12 / traitement_annuel_brut) * (categorie_salarie >= 2)
public = \
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use implicit line continuation

@@ -826,22 +813,28 @@ def formula(individu, period, parameters):
plafond = (plafond_mensuel_1 * (fonc_nbenf == 1) + plafond_mensuel_2 * (fonc_nbenf == 2) +
plafond_mensuel_3 * (fonc_nbenf == 3) +
plafond_mensuel_supp * max_(0, fonc_nbenf - 3))

sft = (categorie_salarie >= 2) * (categorie_salarie < 7) * min_(
public = \
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use implicit line continuation

@@ -861,8 +854,15 @@ def formula(self, simulation, period):
traitement_indiciaire_brut = simulation.calculate('traitement_indiciaire_brut', period)
nouvelle_bonification_indiciaire = simulation.calculate('nouvelle_bonification_indiciaire', period)
categorie_salarie = simulation.calculate('categorie_salarie', period)

public = \
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use implicit line continuation

plafond_personne_seule = take(plafonds_by_zone[0], zone_apl)
plafond_couple = take(plafonds_by_zone[1], zone_apl)
plafond_famille = take(plafonds_by_zone[2], zone_apl) + (al_nb_pac > 1) * (al_nb_pac - 1) * take(plafonds_by_zone[3], zone_apl)
index_zone_apl = select(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All this preprocessing is getting heavy, and we now have tools to simplify it (indexing parameters with a variable), provided we take advantage of the breaking change to do some smart renaming in the parameters. I'm opening a PR on this branch and I'll let you decide whether we integrate it in this PR or not 🙂

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@guillett
Copy link
Member

guillett commented Dec 1, 2017

@Anna-Livia j'ai fait évoluer les extensions sur mes-aides.gouv.fr et j'ai réussi à faire passer tous les tests.

@Anna-Livia Anna-Livia requested a review from fpagnoux December 4, 2017 15:10
Copy link
Member

@fpagnoux fpagnoux left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

L'exemple sur les YAML dans le changelog peut être simplifié, mais sinon c'est bon.

Attention, il y a beaucoup de commits marqués "To revert" ou "À vérifier", ne pas oublier de nettoyer l'historique avant de merger.

CHANGELOG.md Outdated
}
```

#### YAML testing
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je trouve cet exemple assez difficile à lire, car il contient beaucoup d'entrées/sorties qui ne sont pas directement liés au changement sur les enums.

Peut-être peut-on le simplifier ?

setup.py Outdated
@@ -7,7 +7,7 @@

setup(
name = 'OpenFisca-France',
version = '19.0.0',
version = '19.0.0rc0,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Anna-Livia je crois qu'il manque un '.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no point in Python style versionning 🙂

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

@benjello benjello left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je comprends la clarté apporté par ce changement.

Je m'inquiète seulement de la forme des input à fournir ou des résultats produits. Aura-t-on toujours le loisir d'injecter des entiers dans les variables Enum et de récupérer des entiers en sortie.

CHANGELOG.md Outdated
input_variables:
salaire_de_base: 1467
# nécessaire pour des requêtes sur un mois de salaire :
allegement_fillon_mode_recouvrement: anticipe
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cette ligne là auss i est nouvelle non ?

'non_pertinent',
])

class TypesStatutOccupationLogement(Enum):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ces tYpes gagneraient à être classés selon l'ordre alphabétique.

CHANGELOG.md Outdated
allegement_fillon_mode_recouvrement: anticipe
effectif_entreprise: 250
categorie_salarie: 0
contrat_de_travail_duree: cdi
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Celle là aussi je pense

@Anna-Livia
Copy link
Contributor Author

Anna-Livia commented Dec 11, 2017

@benjello Les modifications que tu as demandé sont implémentées 🙂

La PR sur les Enums transforme les Enums OpenFisca en Enums Python 3. Les index ne sont plus des inputs compatibles, ils sont remplacés par des strings :

holder = household.get_holder('statut_marital')
holder.set_input(period, np.asarray(['marie']))

On comprends que cela nécessite un important effort d’adaptation de ton côté, si tu le souhaites, nous serions heureux de filer un coup de main dans la migration. Quel est ton estimation de l’effort nécessaire pour la migration de ton coté ?

Ce changement devrait beaucoup aider nos nouveaux clients et les nouveaux mainteneurs à aborder et contribuer à OpenFisca.

@Anna-Livia Anna-Livia requested a review from benjello December 11, 2017 12:48
Copy link
Member

@benjello benjello left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mon but n'est pas de bloquer pour bloquer comme je l'ai dit à @maukoquiroga mais en plus des changements que cela va engendrer côté chargement des inputs, je suis inquiet de la performance avec des vecteurs numpy de strings tant du point de vue vitesse que mémoire. Je pense que cela doit être un peu étudié avant de basculer sur un changement irréversible.

@guillett
Copy link
Member

@benjello merci beaucoup pour ton feedback, en regardant les temps passés sur CircleCi (la dernière branche IPP et celle des Enum) on ne voit pas d'impact majeur.

Je pense qu'il serait intéressant de lancer les tests mes-aides.gouv.fr d'un seul coup, i.e. à la place de faire 500 tests d'1 situation on va lancer 1 test de 500 situations pour se rapprocher de tes cas d'utilisation. On aura ainsi des informations sur la performance et voir si il y a des changements significatifs.

@benjello
Copy link
Member

@fpagnoux : maintenant que tu as une vision large ton avis nous intéresse (je parle au moins pour moi)

@fpagnoux
Copy link
Member

Je regarde l'impact mémoire et vitesse d'exécution.

@guillett si tu veux avoir des cas d'usages grosse population, tu peux regarder ici : openfisca/openfisca-core#604

@fpagnoux
Copy link
Member

fpagnoux commented Dec 13, 2017

Bilan des tests:

Peu d'impact mémoire : on ne stocke pas des vecteurs de strings, mais de référence vers des items d'énums. Ça équivaut à stocker des float64. C'est plus gros que des int16, mais dans la masse des variables ça donne une occupatiion mémoire au final qui augmente de max quelques pourcents.

Par contre, au niveau temps de calcul, ça s'envole pour de grosses populations 😞.

Je tente de faire une implem alternative qui garderait la même syntaxe et la même interface (quand c'est possible) mais qui resterait basé sur des entiers sous le capot.

@benjello
Copy link
Member

Good job @fpagnoux

@bonjourmauko
Copy link
Member

Merci @fpagnoux, sad pour la perte de perf effectivement 😢 . Qu'est-ce que tu as en tête pour implémentation alternative ?

@fpagnoux
Copy link
Member

fpagnoux commented Dec 14, 2017

Pour garder des performances correctes, il faut que les comparaison de type categorie_salarie == TypesCategorieSalarie.prive_non_cadre se fasse d'entier à entier. En effet, pour de gros vecteurs, les comparaisons sur des items d'enums coutent beaucoup plus cher que les comparaisons int to int.

À partir de ça, deux possibilités qui ont l'air de tenir la route en terme de perf:

  • Soit TypesCategorieSalarie.prive_non_cadre est lui même un entier.
    • à faire : implémenter des enums custom, qui se déclarent de la même manière que les python3
  • Soit categorie_salarie est un numpy array un peu amélioré qui sait se comparer très rapidement à un enum item (en utilisant l'index de chaque item).
    • à faire: légèrement modifier les énums pour avoir accès rapidement à l'index de chaque item
    • à faire: introduire une sous-classe des arrays numpy
    • avantage: lorsque je fais simulation.calculate('categorie_salarie', period), je ne me retrouve pas avec un simple array d'entiers que je ne comprends pas, mais on peut avoir une impression un peu customisé.
    • inconvénient : plus complexe, peut être overkill

Pour le moment, après reflexion, j'ai plutôt envie de partir sur la solution 1 qui me semble la plus simple.

@benjello
Copy link
Member

Je pense aussi que la solution 1 est très raisonnable.

@fpagnoux
Copy link
Member

fpagnoux commented Jan 11, 2018

Dernier test de perf, pour un calcul du revenu disponible:

Population Temps de calcul sur cette branche Temps de calcul master
1 famille, 4 personnes 4.06 3.99
4000 familles, 16000 personnes 11.6 11.6
20000 familles, 80000 personnes 47.0 46.3

Pas de dégradation significative en terme de performances.
Aucun changement en mémoire, ce qu'on stocke n'a pas changé.

@fpagnoux
Copy link
Member

En terme d'usage, la façon de déclarer les énums a changé. Il y a une petite dizaine de variables à adapter côté IPP (rapide).
On peut toujours injecter des entiers en entrée (même si ce n'est pas un usage conseillé).

@benjello est-ce que c'est bon à merger pour toi ? Je suggère qu'on merge ça avant d'adapter complètement le code côté IPP, afin d'éviter de faire traîner encore plus cette PR qui bloque les dev sur france 🙂

@fpagnoux fpagnoux requested a review from benjello January 11, 2018 22:19
@Anna-Livia Anna-Livia merged commit 7684962 into master Jan 16, 2018
@fpagnoux fpagnoux deleted the enums-2 branch January 18, 2018 21:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants