🐛 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
parent
b74328b434
commit
70f99787f4
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
})
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue