From aa566af97ab667cecdd6882f407126184585eaeb Mon Sep 17 00:00:00 2001 From: Erik Pelgrim Date: Thu, 15 Jan 2026 13:43:14 +0100 Subject: [PATCH 1/2] Fix bug that ignores additional stop criteria in Dud #448 --- .../java/src/org/openda/algorithms/BaseDudCoreOptimizer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/java/src/org/openda/algorithms/BaseDudCoreOptimizer.java b/algorithms/java/src/org/openda/algorithms/BaseDudCoreOptimizer.java index 5255ef85a..fdd27755a 100644 --- a/algorithms/java/src/org/openda/algorithms/BaseDudCoreOptimizer.java +++ b/algorithms/java/src/org/openda/algorithms/BaseDudCoreOptimizer.java @@ -447,7 +447,7 @@ boolean isThereMoreToDo(double costs[], double relErrorLinCost, IVector predTry, isStop = object.checkForStop(pars[0],residual,costs[0],threshold); } Results.putMessage(object.toString()); - this.moreToDo = this.moreToDo & !isStop; + moreToDo &= !isStop; } } From e15a92ade31a7edd3e5ce50ec85e686981fa7bdf Mon Sep 17 00:00:00 2001 From: Erik Pelgrim Date: Fri, 16 Jan 2026 11:09:07 +0100 Subject: [PATCH 2/2] Do not execute extra stop criteria on inner iteration + improve loop --- .../algorithms/BaseDudCoreOptimizer.java | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/algorithms/java/src/org/openda/algorithms/BaseDudCoreOptimizer.java b/algorithms/java/src/org/openda/algorithms/BaseDudCoreOptimizer.java index fdd27755a..2ce43b78c 100644 --- a/algorithms/java/src/org/openda/algorithms/BaseDudCoreOptimizer.java +++ b/algorithms/java/src/org/openda/algorithms/BaseDudCoreOptimizer.java @@ -433,26 +433,20 @@ boolean isThereMoreToDo(double costs[], double relErrorLinCost, IVector predTry, && diff > relTol * Math.abs(costs[0]) && relErrorLinCost>relTolLinCost; + // do not stop on a backtracking iteration + if (innerIter > 0 && imain < maxit) return true; + + if (stopCriteria.isEmpty()) return moreToDo; // additional stop criteria: - if (stopCriteria.size()>0) { - IVector residual = obs.clone(); - residual.axpy(-1.0,predTry); - boolean isStop; - for (int i=0; i0 && (imain < maxit)) moreToDo = true; return moreToDo; }