From 1009591f3117bd44725f31d13bba6e1836260dc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Grand?= <francois.grand@inrae.fr> Date: Wed, 17 May 2023 11:09:22 +0200 Subject: [PATCH] refactor: predams: do not remove results if the only error is a dichotomy convergence error refs #302 --- src/nub.ts | 23 +++++++++++++++++++++++ src/prebarrage/pre_barrage.ts | 4 +++- src/util/log.ts | 22 ++++++++++++++++++++++ src/util/result.ts | 23 +++++++++++++++++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) diff --git a/src/nub.ts b/src/nub.ts index 783a199f..64e31c46 100644 --- a/src/nub.ts +++ b/src/nub.ts @@ -1660,6 +1660,29 @@ export abstract class Nub extends ComputeNode implements IProperties { return true; } + /** + * @returns true if all messages in nub hierarchy have the same code + */ + public hasOnlyMessage(code: MessageCode): boolean { + for (const n of this.allChildNubIterator) { + if (!n.result.hasOnlyMessage(code)) { + return false; + } + } + return true; + } + + public get uniqueMessageCodes(): MessageCode[] { + let res: MessageCode[] = []; + for (const n of this.allChildNubIterator) { + if (n.uid === "MDZ3aH") { + debugger + } + res = res.concat(n.result.uniqueMessageCodes); + } + return res; + } + // interface IObservable /** diff --git a/src/prebarrage/pre_barrage.ts b/src/prebarrage/pre_barrage.ts index 5ae7adec..82c9e164 100644 --- a/src/prebarrage/pre_barrage.ts +++ b/src/prebarrage/pre_barrage.ts @@ -381,7 +381,9 @@ export class PreBarrage extends Nub { } // if an error occurred in any nub, remove all results - if (!this.allResultsOk) { + // except if it's a dichotomy convergence error (and only this error) + + if (!this.allResultsOk && !this.hasOnlyMessage(MessageCode.ERROR_DICHO_CONVERGE)) { for (const c of this.allChildNubIterator) { c.result.resultElement.removeValues(); } diff --git a/src/util/log.ts b/src/util/log.ts index 3ef37196..d78c7d92 100644 --- a/src/util/log.ts +++ b/src/util/log.ts @@ -103,6 +103,28 @@ export class cLog { return undefined; } + /** + * @returns true if all messages have the same code + */ + public hasOnlyMessage(code: MessageCode): boolean { + for (const m of this.messages) { + if (m.code !== code) { + return false; + } + } + return true; + } + + public get uniqueMessageCodes(): MessageCode[] { + const res: MessageCode[] = []; + for (const m of this.messages) { + if (res.indexOf(m.code) === -1) { + res.push(m.code); + } + } + return res; + } + /** * compute error, warning, info count in a message list */ diff --git a/src/util/result.ts b/src/util/result.ts index a396c11a..cba512d9 100644 --- a/src/util/result.ts +++ b/src/util/result.ts @@ -299,6 +299,29 @@ export class Result extends JalhydObject { return false; } + /** + * determine if all messages have the same code + * @param code message code to find + */ + public hasOnlyMessage(code: MessageCode): boolean { + if (!this._globalLog.hasOnlyMessage(code)) { + return false; + } + + if (!this.resultElement.log.hasOnlyMessage(code)) { + return false; + } + + return true; + } + + public get uniqueMessageCodes(): MessageCode[] { + let res: MessageCode[] = []; + res = res.concat(this._globalLog.uniqueMessageCodes); + res = res.concat(this.resultElement.log.uniqueMessageCodes); + return res; + } + /** * compute log stats (# of error, warning, info) on all result element */ -- GitLab