La vérification de l'applicabilité du parent faisait un aller/retour
inutile entre la règle enfant et la règle parent, à l'origine d'une
régression de performance.
* ⚙️ Sort les fonctions JSX de l'AST
Remplace la fonction makeJsx par un composant React <Explanation />
Déplace presque tout le code React dans le répertoire components/ en
prévision de sa séparation dans un paquet dédié.
* ⚙️ Renomme le nœud "replacement" en "replacementRule"
* ⚙️ Ajout d'un attribut visualisationKind pour les mécanismes transformées
* ⚙️ Retours PR 1275
- Introduction de nouveaux mécanismes
- Réecriture de l'evaluation et du parsing des règles.
- Les règles peuvent apparaître dans les formules de calcul
- Introduction d'un AST en bonne et due forme
- Réecriture de buildRuleDependancies.
- Ajout d'une passe pour la désambiguation des références
- Réecriture de rendNonApplicable et de remplace
- Réimplémentation de parentDependancy
Voir #1191
La fonction `uniroot` prend 2 paramètres d'amorçage "min" et "max" qui
nous définissions jusqu'alors comme des minimums et maximum absolus
-10^8 et +10^8. Vu que nous sommes obligés de calculer au moins une
première valeur à l'extérieur de `uniroot` notamment pour calculer les
variables manquantes, ce commit permet de ré-utiliser ce calcul dans
l'amorçage d' `uniroot`.
Les gains de performances sont détaillés dans la PR associée.
Par ailleurs supprime l'option "valeurs négatives possibles" rendue
obsolète.
Il y a des légers décalages d'1€ sur une dizaine de snapshots qui liés à
des arrondis à l'euro. On calcule en effet les inversions à 10 centimes
près et on peut donc tomber sur une valeur de xx,54€ là où la vraie
valeur est xx,48€ ce qui donne 1€ de différence avec l'arrondi alors que
la différence initialement calculée est inférieure à 10 centimes.
Par curiosité j'ai rejoué les tests de non-régressions en changeant les
paramètres d'`uniroot` pour avoir une précision au centime près (en
augmentant le nombre max d'itération à 50) et il se trouve que sur la
dizaine de tests différents entre ce commit et la version d'avant une
moitié des arrondis à l'euro étaient faux avant et corrects maintenant
et inversement pour l'autre moitié.
Plein de nouveautés et notamment la possibilité de "programmer" les
types chaînes littérales qui nous sera utile par exemple pour vérifier
statiquement la validité d'une *expression* publicode dans
`engine.evaluate`.
https://devblogs.microsoft.com/typescript/announcing-typescript-4-1/
⬆ MAJ ESLint-typescript pour la compatibilité
En analysant les traces d'execution, il apparaît qu'un temps conséquent
est passé dans la fonction `evaluateApplicability`. L'ajout d'un cache
simple semble améliorer significativement les performances (environ -30%
dans mes mesures non scientifiques).
- évite l'indirection vers "parseReferenceTransforms" pour les
références simples (il faut encore simplifier ce code)
- déplacement de fonctions de parsage vers les "stateless"
- typage de registerEvaluationFunction
- simplifie fragments.join()
Modifie l'API de la fonction `evaluate` pour transmettre le contexte
avec `this`, ce qui simplifie l'interface de ces fonctions.
L'objet `this` (qui contient `this.parsedRules`, `this.situation`,
`this.evaluate`, etc.) est un interpréteur Publicodes, mais nous n'avons
pas besoin de créer une nouvelle abstraction car cet objet présente
exactement la même interface que l'objet public exposé dans
`publicodes/index.ts` et c'est donc l'interface publique qui est
utilisée dans les appels internes.
Ce commit parachève la sortie de l'ensemble des functions "evaluate" de
l'AST et ajoute un "nodeKind" sur chaque nœud afin de les associer à la
bonne function d'évaluation.
L'API pour les mécanismes pourra être améliorée afin de ne pas appeler
`registerEvaluationFunction` sur chaque mécanisme mais en standardisant
l'interface exportée par les mécanismes, par exemple
export { name, parse, evaluate, render }
Par ailleurs il devrait être facile de sortir les fonctions `jsx` en se
basant sur les mêmes "nodeKind".
Enfin, il faudra nettoyer l'AST pour supprimer les attributs inutilisés
et ajouter du typage fort.
Si une inversion n'est pas trouvée à 0,1 près, fallback à 1 près.
Utile pour les cotisations des avocats, et permet de réaliser certaines
inversions qui étaient impossibles jusqu'à lors (cf. snapshots).
- On veut pouvoir afficher un lien vers la règle définissant la [ref] lorsqu'on est dans une formule avec une référence virtuelle
- Si on fait référence dans une règle à une notification sans formule (juste applicable) la règle crash
En attendant une réecriture de l'inlining qui permette d'ajouter le contexte à la référence appelée (référence ou définition),
je préfère désactiver cette logique