From 819ae41c00f8abf0b92e2262811fa6a840bc49b5 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Thu, 23 Oct 2025 11:23:44 +0200 Subject: [PATCH] Results: Add posibility to save multiple results for different solver. --- src/Model/Results/Results.py | 38 ++++++++++++++++++++++---------- src/Model/Results/River/River.py | 2 +- src/Model/River.py | 15 ++++++++----- src/View/MainWindow.py | 6 ++++- 4 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/Model/Results/Results.py b/src/Model/Results/Results.py index 3ea6e45a..b036f37a 100644 --- a/src/Model/Results/Results.py +++ b/src/Model/Results/Results.py @@ -52,6 +52,9 @@ class Results(SQLSubModel): "study_revision": study.status.version, } + if solver is not None: + self.set("solver_type", solver._type) + @property def date(self): date = self._meta_data["creation_date"] @@ -147,7 +150,7 @@ class Results(SQLSubModel): ) if table is None: - yield new + yield if len(table) > 1: logger.warning("Multiple results for this scenario") @@ -178,23 +181,32 @@ class Results(SQLSubModel): data["timestamps"] = sorted(ts) new_results._river = River._db_load(execute, data) - new = new_results + yield (solver_type, new_results) - yield new + def _db_save_clear(self, execute, solver_type, data=None): + old_pid = execute( + "SELECT pamhyr_id FROM results " + + f"WHERE scenario = {self._owner_scenario} " + + f"AND solver_type = '{solver_type}'" + ) + if len(old_pid) != 0: + old_pid = old_pid[0] + + execute( + "DELETE FROM results " + + f"WHERE scenario = {self._owner_scenario} " + + f"AND solver_type = '{solver_type}'" + ) + execute( + "DELETE FROM results_data " + + f"WHERE scenario = {self._owner_scenario} " + + f"AND results = '{old_pid}'" + ) def _db_save(self, execute, data=None): if self._status.scenario.id != self._owner_scenario: return - execute( - "DELETE FROM results " + - f"WHERE scenario = {self._owner_scenario}" - ) - execute( - "DELETE FROM results_data " + - f"WHERE scenario = {self._owner_scenario}" - ) - pid = self._pamhyr_id if self._solver is None: solver_name = self.get("solver_name") @@ -203,6 +215,8 @@ class Results(SQLSubModel): solver_name = self._solver._name solver_type = self._solver._type + self._db_save_clear(execute, solver_type, data=data) + ts = sorted(self.get("timestamps")) sf = ">" + ''.join(itertools.repeat("d", len(ts))) diff --git a/src/Model/Results/River/River.py b/src/Model/Results/River/River.py index b94b06d6..d111bf9f 100644 --- a/src/Model/Results/River/River.py +++ b/src/Model/Results/River/River.py @@ -227,7 +227,7 @@ class Profile(SQLSubModel): values = list(map(float, values)) sf = ">" + ''.join(itertools.repeat("f", len(values))) len_values = len(values) - elif key is "sl": + elif key == "sl": # HACK: Some dirty code to transforme list of list of # tuple to list of values and ensure the values is # float type... diff --git a/src/Model/River.py b/src/Model/River.py index 2671b12b..e0c4602b 100644 --- a/src/Model/River.py +++ b/src/Model/River.py @@ -505,7 +505,7 @@ class River(Graph): self._D90AdisTS = D90AdisTSList(status=self._status) self._DIFAdisTS = DIFAdisTSList(status=self._status) - self._results = None + self._results = {} @classmethod def _db_create(cls, execute): @@ -620,7 +620,10 @@ class River(Graph): return new def _db_load_results(self, execute, data=None): - self._results = Results._db_load(execute, data) + results_lst = Results._db_load(execute, data) + + for solv_type, results in results_lst: + self._results[solv_type] = results def _db_save(self, execute, data=None): self._db_save_delete_artefact(execute, data) @@ -647,8 +650,8 @@ class River(Graph): objs.append(self._D90AdisTS) objs.append(self._DIFAdisTS) - if self.results is not None: - objs.append(self.results) + for solv_type in self.results: + objs.append(self.results[solv_type]) self._save_submodel(execute, objs, data) return True @@ -902,7 +905,9 @@ Last export at: @date.""" @results.setter def results(self, results): - self._results = results + solv_type = results.get("solver_type") + + self._results[solv_type] = results def _split_reach(self, reach, profile): node1 = reach.node1 diff --git a/src/View/MainWindow.py b/src/View/MainWindow.py index 0821cd62..dba69b56 100644 --- a/src/View/MainWindow.py +++ b/src/View/MainWindow.py @@ -596,7 +596,11 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit): if self._study is None: return None - return self._study.results + results = self._study.results + if self._last_solver._type in results: + return self._study.results[self._last_solver._type] + + return None @last_results.setter def last_results(self, results):