Results: Add posibility to save multiple results for different solver.

scenarios
Pierre-Antoine 2025-10-23 11:23:44 +02:00
parent 08c414a66e
commit 819ae41c00
4 changed files with 42 additions and 19 deletions

View File

@ -52,6 +52,9 @@ class Results(SQLSubModel):
"study_revision": study.status.version, "study_revision": study.status.version,
} }
if solver is not None:
self.set("solver_type", solver._type)
@property @property
def date(self): def date(self):
date = self._meta_data["creation_date"] date = self._meta_data["creation_date"]
@ -147,7 +150,7 @@ class Results(SQLSubModel):
) )
if table is None: if table is None:
yield new yield
if len(table) > 1: if len(table) > 1:
logger.warning("Multiple results for this scenario") logger.warning("Multiple results for this scenario")
@ -178,23 +181,32 @@ class Results(SQLSubModel):
data["timestamps"] = sorted(ts) data["timestamps"] = sorted(ts)
new_results._river = River._db_load(execute, data) 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): def _db_save(self, execute, data=None):
if self._status.scenario.id != self._owner_scenario: if self._status.scenario.id != self._owner_scenario:
return 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 pid = self._pamhyr_id
if self._solver is None: if self._solver is None:
solver_name = self.get("solver_name") solver_name = self.get("solver_name")
@ -203,6 +215,8 @@ class Results(SQLSubModel):
solver_name = self._solver._name solver_name = self._solver._name
solver_type = self._solver._type solver_type = self._solver._type
self._db_save_clear(execute, solver_type, data=data)
ts = sorted(self.get("timestamps")) ts = sorted(self.get("timestamps"))
sf = ">" + ''.join(itertools.repeat("d", len(ts))) sf = ">" + ''.join(itertools.repeat("d", len(ts)))

View File

@ -227,7 +227,7 @@ class Profile(SQLSubModel):
values = list(map(float, values)) values = list(map(float, values))
sf = ">" + ''.join(itertools.repeat("f", len(values))) sf = ">" + ''.join(itertools.repeat("f", len(values)))
len_values = len(values) len_values = len(values)
elif key is "sl": elif key == "sl":
# HACK: Some dirty code to transforme list of list of # HACK: Some dirty code to transforme list of list of
# tuple to list of values and ensure the values is # tuple to list of values and ensure the values is
# float type... # float type...

View File

@ -505,7 +505,7 @@ class River(Graph):
self._D90AdisTS = D90AdisTSList(status=self._status) self._D90AdisTS = D90AdisTSList(status=self._status)
self._DIFAdisTS = DIFAdisTSList(status=self._status) self._DIFAdisTS = DIFAdisTSList(status=self._status)
self._results = None self._results = {}
@classmethod @classmethod
def _db_create(cls, execute): def _db_create(cls, execute):
@ -620,7 +620,10 @@ class River(Graph):
return new return new
def _db_load_results(self, execute, data=None): 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): def _db_save(self, execute, data=None):
self._db_save_delete_artefact(execute, data) self._db_save_delete_artefact(execute, data)
@ -647,8 +650,8 @@ class River(Graph):
objs.append(self._D90AdisTS) objs.append(self._D90AdisTS)
objs.append(self._DIFAdisTS) objs.append(self._DIFAdisTS)
if self.results is not None: for solv_type in self.results:
objs.append(self.results) objs.append(self.results[solv_type])
self._save_submodel(execute, objs, data) self._save_submodel(execute, objs, data)
return True return True
@ -902,7 +905,9 @@ Last export at: @date."""
@results.setter @results.setter
def results(self, results): def results(self, results):
self._results = results solv_type = results.get("solver_type")
self._results[solv_type] = results
def _split_reach(self, reach, profile): def _split_reach(self, reach, profile):
node1 = reach.node1 node1 = reach.node1

View File

@ -596,7 +596,11 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
if self._study is None: if self._study is None:
return 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 @last_results.setter
def last_results(self, results): def last_results(self, results):