From 49a8af979f1c99f7b1fb47d9c36260ea50a8aeee Mon Sep 17 00:00:00 2001 From: "mathias.chouet" <mathias.chouet@irstea.fr> Date: Fri, 25 Oct 2019 15:18:30 +0200 Subject: [PATCH] Fix #159 - Solveur: too many searchable parameters --- spec/solveur/solveur.spec.ts | 16 ++++++++++++++++ src/nub.ts | 4 +++- src/solveur/solveur.ts | 4 ++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/spec/solveur/solveur.spec.ts b/spec/solveur/solveur.spec.ts index 91f6ff1d..75360c75 100644 --- a/spec/solveur/solveur.spec.ts +++ b/spec/solveur/solveur.spec.ts @@ -4,6 +4,7 @@ import { PabNombre } from "../../src/pab/pab_nombre"; import { PabNombreParams } from "../../src/pab/pab_nombre_params"; import { PabPuissance } from "../../src/pab/pab_puissance"; import { PabPuissanceParams } from "../../src/pab/pab_puissance_params"; +import { Bief } from "../../src/remous/bief"; import { Session } from "../../src/session"; import { Solveur } from "../../src/solveur/solveur"; import { SolveurParams } from "../../src/solveur/solveur_params"; @@ -223,4 +224,19 @@ describe("solveur multi-modules", () => { expect(s.result.sourceNub).toBe(s); expect(s.getChildren().length).toBe(0); }); + + it("test 11: bug jalhyd#159", () => { + // tslint:disable-next-line:max-line-length + const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2019-10-25T12:31:39.494Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"MHQxN3","props":{"calcType":"ParallelStructure"},"meta":{"title":"Ouvrages"},"children":[{"uid":"cW1pZD","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirFree"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":393.99},{"symbol":"L","mode":"SINGLE","value":1.84},{"symbol":"CdWR","mode":"SINGLE","value":0.4}]}],"parameters":[{"symbol":"Q","mode":"SINGLE","value":1.143420537740305},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"SINGLE","value":393.99}]},{"uid":"Mnk0Mj","props":{"regime":"Fluvial","calcType":"Bief"},"meta":{"title":"Bief"},"children":[{"uid":"ZWFod3","props":{"regime":"Fluvial","calcType":"Section","nodeType":"SectionRectangle"},"children":[],"parameters":[{"symbol":"Ks","mode":"SINGLE","value":40},{"symbol":"Q","mode":"LINK","targetNub":"MHQxN3","targetParam":"Q"},{"symbol":"YB","mode":"SINGLE","value":1},{"symbol":"Y","mode":"SINGLE","value":0.8},{"symbol":"LargeurBerge","mode":"SINGLE","value":2.3}]}],"parameters":[{"symbol":"Long","mode":"SINGLE","value":30},{"symbol":"Dx","mode":"SINGLE","value":1},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"LINK","targetNub":"MHQxN3","targetParam":"Z1"},{"symbol":"ZF1","mode":"SINGLE","value":393.99},{"symbol":"ZF2","mode":"SINGLE","value":394.1}]},{"uid":"bmlreT","props":{"calcType":"ParallelStructure"},"meta":{"title":"Ouvrages 1"},"children":[{"uid":"cnN3Y2","props":{"calcType":"Structure","structureType":"SeuilRectangulaire","loiDebit":"WeirVillemonte"},"children":[],"parameters":[{"symbol":"ZDV","mode":"SINGLE","value":393.99},{"symbol":"L","mode":"SINGLE","value":2.8},{"symbol":"CdWR","mode":"SINGLE","value":0.4}]}],"parameters":[{"symbol":"Q","mode":"LINK","targetNub":"MHQxN3","targetParam":"Q"},{"symbol":"Z1","mode":"CALCUL"},{"symbol":"Z2","mode":"LINK","targetNub":"Mnk0Mj","targetParam":"Z1"}]},{"uid":"ZDM5OT","props":{"calcType":"Solveur","nubToCalculate":"bmlreT","searchedParameter":"MHQxN3/Q"},"meta":{"title":"Solveur"},"children":[],"parameters":[{"symbol":"Xinit","mode":"SINGLE","value":0.5},{"symbol":"Ytarget","mode":"SINGLE","value":394.66}]}]}`; + Session.getInstance().clear(); + Session.getInstance().unserialise(sess); + const s = Session.getInstance().findNubByUid("ZDM5OT") as Solveur; + const ouvrages1 = Session.getInstance().findNubByUid("bmlreT") as ParallelStructure; + const bief = Session.getInstance().findNubByUid("Mnk0Mj") as Bief; + // searchable parameters + const spBief = Solveur.getDependingNubsSearchableParams(bief); + expect(spBief.length).toBe(5); + const spOuvrages1 = Solveur.getDependingNubsSearchableParams(ouvrages1); + expect(spOuvrages1.length).toBe(13); + }); }); diff --git a/src/nub.ts b/src/nub.ts index d13bdca1..7892c8ba 100644 --- a/src/nub.ts +++ b/src/nub.ts @@ -748,7 +748,9 @@ export abstract class Nub extends ComputeNode implements IObservable { for (const rn of requiredNubs) { requiredNubs = requiredNubs.concat(rn.getRequiredNubsDeep(visited)); } - // @TODO deduplicate ? + requiredNubs = requiredNubs.filter( + (item, index) => requiredNubs.indexOf(item) === index // deduplicate + ); return requiredNubs; } diff --git a/src/solveur/solveur.ts b/src/solveur/solveur.ts index baebd566..c232ee15 100644 --- a/src/solveur/solveur.ts +++ b/src/solveur/solveur.ts @@ -21,8 +21,8 @@ export class Solveur extends Nub implements Observer { const upstreamNubs = nub.getRequiredNubsDeep(); for (const un of upstreamNubs) { for (const p of un.parameterIterator) { - // only non-varying parameters can be looked for - if (p.valueMode === ParamValueMode.SINGLE) { + // only visible, non-varying parameters can be looked for + if (p.visible && p.valueMode === ParamValueMode.SINGLE) { searchableParams.push(p); } } -- GitLab