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