From 1e2e46c4e533b542b1f5f4274ef9e993559238d9 Mon Sep 17 00:00:00 2001 From: Laurent Bossavit Date: Mon, 31 Jul 2017 17:32:59 +0200 Subject: [PATCH] :racehorse: Optimisation 'sale' du calcul --- source/engine/traverse.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/source/engine/traverse.js b/source/engine/traverse.js index 92df20c2f..c83b34387 100644 --- a/source/engine/traverse.js +++ b/source/engine/traverse.js @@ -65,19 +65,24 @@ let fillFilteredVariableNode = (rules, rule) => (filter, parseResult) => { } } +// TODO: dirty, dirty +// ne pas laisser trop longtemps cette "optimisation" qui tue l'aspect fonctionnel de l'algo +var dict; + let createVariableNode = (rules, rule) => (parseResult) => { let evaluate = (situation, parsedRules, node) => { let dottedName = node.dottedName, - variable = findRuleByDottedName(parsedRules, dottedName), + cached = dict[dottedName], + variable = cached ? cached : findRuleByDottedName(parsedRules, dottedName), variableIsCalculable = variable.formule != null, //TODO perf : mettre un cache sur les variables ! // On le fait pas pour l'instant car ça peut compliquer les fonctionnalités futures // et qu'il n'y a aucun problème de perf aujourd'hui - parsedRule = variableIsCalculable && evaluateNode( + parsedRule = variableIsCalculable && (cached ? cached : evaluateNode( situation, parsedRules, variable - ), + )), situationValue = evaluateVariable(situation, dottedName, variable), nodeValue = situationValue @@ -91,10 +96,13 @@ let createVariableNode = (rules, rule) => (parseResult) => { let collectMissing = node => variableIsCalculable ? collectNodeMissing(parsedRule) : node.missingVariables - return { + let result = cached ? cached : { ...rewriteNode(node,nodeValue,explanation,collectMissing), missingVariables, } + dict[dottedName] = result + + return result } let {fragments} = parseResult, @@ -423,6 +431,7 @@ export let analyseSituation = (rules, rootVariable) => situationGate => { export let analyseTopDown = (rules, rootVariable) => situationGate => { + dict = {} let /* La fonction treatRuleRoot va descendre l'arbre de la règle `rule` et produire un AST, un objet contenant d'autres objets contenant d'autres objets...