🐛 Répare un bug dans le mécanisme résoudre le cycle

Le cache n'était pas réinitialisé, et les valeurs utilisée étaient celle du dernier calcul de la fonction uniroot, qui n'est pas forcément celui du résultat finalement retourné.
pull/1510/head
Johan Girod 2021-04-20 15:45:55 +02:00
parent b74328b434
commit 70f99787f4
7 changed files with 40 additions and 30 deletions

View File

@ -25,3 +25,9 @@
**core**
- Fix bug sur le mécanisme minimum, une valeur non applicable n'est plus considérée comme valant "0" (#1493)
## 1.0.0-beta.16 (release candidate)
**core**
- Répare un bug dans le mécanisme résoudre le cycle

View File

@ -17,7 +17,7 @@ import { PlafondNode } from '../mecanisms/plafond'
import { PlancherNode } from '../mecanisms/plancher'
import { ProductNode } from '../mecanisms/product'
import { RecalculNode } from '../mecanisms/recalcul'
import { RésoudreRéférenceCiruclaireNode } from '../mecanisms/résoudre-référence-circulaire'
import { RésoudreRéférenceCirculaireNode } from '../mecanisms/résoudre-référence-circulaire'
import { SituationNode } from '../mecanisms/situation'
import { SommeNode } from '../mecanisms/sum'
import { SynchronisationNode } from '../mecanisms/synchronisation'
@ -58,7 +58,7 @@ export type ASTNode = (
| PlancherNode
| ProductNode
| RecalculNode
| RésoudreRéférenceCiruclaireNode
| RésoudreRéférenceCirculaireNode
| SituationNode
| SommeNode
| SynchronisationNode

View File

@ -32,12 +32,12 @@ const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) {
) as Array<[ReferenceNode & EvaluatedNode, EvaluatedNode]>
const originalCache = this.cache
const originalSituation = { ...this.parsedSituation }
const originalSituation = this.parsedSituation
// Optimisation : no need for recalcul if situation is the same
const invalidateCache = Object.keys(amendedSituation).length > 0
if (invalidateCache) {
this.resetCache()
this.cache._meta = { ...this.cache._meta, inRecalcul: true }
this.cache._meta.inRecalcul = true
}
this.parsedSituation = {
@ -55,10 +55,12 @@ const evaluateRecalcul: EvaluationFunction<'recalcul'> = function (node) {
}
const evaluatedNode = this.evaluate(node.explanation.recalcul)
this.parsedSituation = originalSituation
if (invalidateCache) {
this.cache = originalCache
}
return {
...node,
nodeValue: evaluatedNode.nodeValue,

View File

@ -6,7 +6,7 @@ import { Context } from '../parsePublicodes'
import uniroot from '../uniroot'
import { UnitéNode } from './unité'
export type RésoudreRéférenceCiruclaireNode = {
export type RésoudreRéférenceCirculaireNode = {
explanation: {
ruleToSolve: string
valeur: ASTNode
@ -65,19 +65,20 @@ export const evaluateRésoudreRéférenceCirculaire: EvaluationFunction<'résoud
const defaultMin = -1_000_000
const defaultMax = 100_000_000
nodeValue = uniroot(test, defaultMin, defaultMax, 1, 30, 2)
nodeValue = uniroot(test, defaultMin, defaultMax, 0.5, 30, 2)
}
this.cache = originalCache
delete this.parsedSituation[node.explanation.ruleToSolve]
if (nodeValue === undefined) {
nodeValue = null
this.cache._meta.inversionFail = true
}
if (nodeValue != null) {
originalCache.nodes.forEach((v, k) => this.cache.nodes.set(k, v))
if (nodeValue !== null) {
valeur = evaluateWithValue(nodeValue, unit)
}
// console.log('iteration résoudre référence circulaire :', i)
this.cache = originalCache
delete this.parsedSituation[node.explanation.ruleToSolve]
return {
...node,
unit,
@ -98,7 +99,7 @@ export default function parseRésoudreRéférenceCirculaire(v, context: Context)
valeur: parse(v.valeur, context),
},
nodeKind: 'résoudre référence circulaire',
} as RésoudreRéférenceCiruclaireNode
} as RésoudreRéférenceCirculaireNode
}
parseRésoudreRéférenceCirculaire.nom = 'résoudre la référence circulaire'

View File

@ -165,7 +165,6 @@ registerEvaluationFunction('rule', function evaluate(node) {
explanation.valeur = valeur
}
// if (valeur.nodeValue === '') {
const evaluation = {
...node,
@ -177,5 +176,6 @@ registerEvaluationFunction('rule', function evaluate(node) {
),
...(valeur && 'unit' in valeur && { unit: valeur.unit }),
}
return evaluation
})

View File

@ -37,15 +37,16 @@ cycle avec inversion et situation vide:
situation:
cycle avec inversion et situation vide: CA
valeur attendue: null
# - nom: net
# situation:
# cycle avec inversion et situation vide: net
# valeur attendue: null
# - nom: net après impôt
# situation:
# cycle avec inversion et situation vide: net après impôt
# valeur attendue: null
- nom: net
situation:
cycle avec inversion et situation vide: net
valeur attendue: null
- nom: net après impôt
situation:
cycle avec inversion et situation vide: net après impôt
valeur attendue: null
# TODO : à corriger
cycle avec la règle à inverser fixée dans la situation:
valeur: net
exemples:
@ -53,13 +54,14 @@ cycle avec la règle à inverser fixée dans la situation:
CA: 10000
valeur attendue: 6666.666
cycle avec la règle du cycle fixée dans la situation:
valeur: CA
exemples:
- situation:
net: 1000
valeur attendue: 1500
# cycle avec la règle du cycle fixée dans la situation:
# valeur: CA
# exemples:
# - situation:
# net: 1000
# valeur attendue: 1500
# TODO : à corriger
# cycle avec une règle reliée fixée dans la situation:
# valeur: net
# exemples:

View File

@ -8,9 +8,8 @@ export default function Recalcul({ nodeValue, explanation, unit }) {
<>
{explanation.recalcul && (
<>
Recalcul de la règle{' '}
<RuleLinkWithContext dottedName={explanation.recalcul.dottedName} />{' '}
avec les valeurs suivantes :
Recalcul de la valeur de <Explanation node={explanation.recalcul} />{' '}
avec la situation suivante :
</>
)}
<ul>