mirror of https://gitlab.com/pamhyr/pamhyr2
Ensemble: Put ensemble results data into results obj.
parent
e7b9bc92a2
commit
a1d85274b9
|
|
@ -165,7 +165,6 @@ class Uniform(Function):
|
||||||
|
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
class Custom(Function):
|
class Custom(Function):
|
||||||
_sub_classes = []
|
_sub_classes = []
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -338,7 +338,7 @@ class Results(SQLSubModel):
|
||||||
_sub_classes = [River, TableData, AdditionalData]
|
_sub_classes = [River, TableData, AdditionalData]
|
||||||
|
|
||||||
def __init__(self, id=-1, study=None, solver=None,
|
def __init__(self, id=-1, study=None, solver=None,
|
||||||
repertory="", name="0"):
|
repertory="", name="0", is_ensemble=False):
|
||||||
super(Results, self).__init__(
|
super(Results, self).__init__(
|
||||||
id=id, status=study.status,
|
id=id, status=study.status,
|
||||||
owner_scenario=study.status.scenario.id
|
owner_scenario=study.status.scenario.id
|
||||||
|
|
@ -351,6 +351,8 @@ class Results(SQLSubModel):
|
||||||
self._solver = solver
|
self._solver = solver
|
||||||
self._repertory = repertory
|
self._repertory = repertory
|
||||||
|
|
||||||
|
self._is_ensemble = is_ensemble
|
||||||
|
|
||||||
self._meta_data = {
|
self._meta_data = {
|
||||||
# Keep results creation date
|
# Keep results creation date
|
||||||
"creation_date": datetime.now(),
|
"creation_date": datetime.now(),
|
||||||
|
|
@ -364,6 +366,9 @@ class Results(SQLSubModel):
|
||||||
if solver is not None:
|
if solver is not None:
|
||||||
self.set("solver_type", solver._type)
|
self.set("solver_type", solver._type)
|
||||||
|
|
||||||
|
def is_ensemble(self):
|
||||||
|
return self._is_ensemble
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def date(self):
|
def date(self):
|
||||||
date = self._meta_data["creation_date"]
|
date = self._meta_data["creation_date"]
|
||||||
|
|
|
||||||
|
|
@ -1033,24 +1033,26 @@ class Mage8(Mage):
|
||||||
self._study = study
|
self._study = study
|
||||||
name = study.name.replace(" ", "_")
|
name = study.name.replace(" ", "_")
|
||||||
|
|
||||||
self._export_ensemble_RUG(
|
var_samples = self._export_ensemble_RUG(
|
||||||
study, repertory,
|
study, repertory,
|
||||||
qlog, name=name,
|
qlog, name=name,
|
||||||
samples=samples,
|
samples=samples,
|
||||||
)
|
)
|
||||||
|
|
||||||
return True
|
return var_samples
|
||||||
|
|
||||||
def _export_ensemble_RUG(self, study, repertory,
|
def _export_ensemble_RUG(self, study, repertory,
|
||||||
qlog, name="0",
|
qlog, name="0",
|
||||||
samples={}):
|
samples={}):
|
||||||
files = []
|
files = []
|
||||||
|
var_samples = []
|
||||||
|
|
||||||
for ens in samples:
|
for ens in samples:
|
||||||
if ens.target_data is None:
|
if ens.target_data is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
x = next(samples[ens])
|
x = next(samples[ens])
|
||||||
|
var_samples.append(x)
|
||||||
|
|
||||||
qlog.put(f"*** Variation " +
|
qlog.put(f"*** Variation " +
|
||||||
f"'{ens.target_data}' - {ens.data_type} x {x}")
|
f"'{ens.target_data}' - {ens.data_type} x {x}")
|
||||||
|
|
@ -1092,7 +1094,7 @@ class Mage8(Mage):
|
||||||
|
|
||||||
id += 1
|
id += 1
|
||||||
|
|
||||||
return files
|
return var_samples
|
||||||
|
|
||||||
###########
|
###########
|
||||||
# RESULTS #
|
# RESULTS #
|
||||||
|
|
@ -1656,6 +1658,14 @@ class Mage8(Mage):
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def get_ensemble_empty_results(self, study, repertory, name=None):
|
||||||
|
return Results(
|
||||||
|
study=study,
|
||||||
|
solver=self,
|
||||||
|
repertory=repertory,
|
||||||
|
name=name,
|
||||||
|
is_ensemble=True,
|
||||||
|
)
|
||||||
|
|
||||||
class MageFake7(Mage8):
|
class MageFake7(Mage8):
|
||||||
_type = "mage_fake7"
|
_type = "mage_fake7"
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,8 @@ import os
|
||||||
import logging
|
import logging
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
from queue import Queue
|
from queue import Queue
|
||||||
from tools import trace, timer, logger_exception
|
from tools import trace, timer, logger_exception
|
||||||
|
|
||||||
|
|
@ -474,6 +476,8 @@ class SolverLogEnsWindow(SolverLogWindow):
|
||||||
|
|
||||||
self._samples[ens] = ens.get_sample(self._run_number)
|
self._samples[ens] = ens.get_sample(self._run_number)
|
||||||
|
|
||||||
|
self._results = None
|
||||||
|
self._run_samples = []
|
||||||
self._results_tables = {}
|
self._results_tables = {}
|
||||||
|
|
||||||
super(SolverLogEnsWindow, self).__init__(
|
super(SolverLogEnsWindow, self).__init__(
|
||||||
|
|
@ -506,7 +510,7 @@ class SolverLogEnsWindow(SolverLogWindow):
|
||||||
|
|
||||||
self.statusbar.showMessage(
|
self.statusbar.showMessage(
|
||||||
("Done" if int_code == 0 else "Failed")
|
("Done" if int_code == 0 else "Failed")
|
||||||
+ f"#{self._last_run}",
|
+ f" #{self._last_run}",
|
||||||
3000
|
3000
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -520,38 +524,79 @@ class SolverLogEnsWindow(SolverLogWindow):
|
||||||
if self._last_run < self._run_number:
|
if self._last_run < self._run_number:
|
||||||
self.next()
|
self.next()
|
||||||
else:
|
else:
|
||||||
|
self._results = self.fill_results_from_tables()
|
||||||
|
self._parent.set_results(self._solver, self._results)
|
||||||
|
|
||||||
self._progress_bar.setValue(self._last_run)
|
self._progress_bar.setValue(self._last_run)
|
||||||
|
|
||||||
|
def fill_results_from_tables(self):
|
||||||
|
tables = self._results_tables
|
||||||
|
results = self._solver.get_ensemble_empty_results(
|
||||||
|
self._study, self._workdir
|
||||||
|
)
|
||||||
|
|
||||||
|
table = {}
|
||||||
|
|
||||||
|
table["Z"] = results.new_table_data("Z", tables["z_mean"])
|
||||||
|
table["Q"] = results.new_table_data("Q", tables["q_mean"])
|
||||||
|
|
||||||
|
table["z_min"] = results.new_table_data("z_min", tables["z_min"])
|
||||||
|
table["q_min"] = results.new_table_data("q_min", tables["q_min"])
|
||||||
|
table["z_max"] = results.new_table_data("z_max", tables["z_max"])
|
||||||
|
table["q_max"] = results.new_table_data("q_max", tables["q_max"])
|
||||||
|
|
||||||
|
for nb, data in tables["traces"]:
|
||||||
|
name = f"{nb}_"
|
||||||
|
table[name + "z"] = results.new_table_data(name + "z", data["Z"])
|
||||||
|
table[name + "q"] = results.new_table_data(name + "q", data["Q"])
|
||||||
|
|
||||||
|
table["samples"] = results.new_table_data(
|
||||||
|
"samples", np.array(self._run_samples)
|
||||||
|
)
|
||||||
|
|
||||||
|
results.set("table", table)
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
def next(self):
|
def next(self):
|
||||||
self._process = self.new_process(self._parent)
|
self._process = self.new_process(self._parent)
|
||||||
|
|
||||||
self._log(f" *** Run #{self._last_run}", color="blue")
|
self._log(f" *** Run #{self._last_run}", color="blue")
|
||||||
|
|
||||||
if self._solver._type in ["mage8"]:
|
if self._solver._type in ["mage8"]:
|
||||||
self._solver.export_ensemble_variation(
|
samples = self._solver.export_ensemble_variation(
|
||||||
self._study, self._workdir, qlog=self._output,
|
self._study, self._workdir, qlog=self._output,
|
||||||
samples=self._samples,
|
samples=self._samples,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
self.ensemble_variation()
|
samples = self.ensemble_variation()
|
||||||
self._solver.export(
|
self._solver.export(
|
||||||
self._study, self._workdir, qlog=self._output
|
self._study, self._workdir, qlog=self._output
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Keep samples generators results
|
||||||
|
self._run_samples.append(samples)
|
||||||
|
|
||||||
self._solver.run(
|
self._solver.run(
|
||||||
self._study,
|
self._study,
|
||||||
process=self._process,
|
process=self._process,
|
||||||
output_queue=self._output
|
output_queue=self._output
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.set_running_button_status()
|
||||||
|
|
||||||
self._last_run += 1
|
self._last_run += 1
|
||||||
self._progress_bar.setValue(self._last_run - 1)
|
self._progress_bar.setValue(self._last_run - 1)
|
||||||
|
|
||||||
def ensemble_variation(self):
|
def ensemble_variation(self):
|
||||||
|
samples = []
|
||||||
|
|
||||||
for ens in self._samples:
|
for ens in self._samples:
|
||||||
if ens.target_data is None:
|
if ens.target_data is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
x = next(self._samples[ens])
|
x = next(self._samples[ens])
|
||||||
|
samples.append(x)
|
||||||
|
|
||||||
self._log(f"*** Variation #{self._last_run} " +
|
self._log(f"*** Variation #{self._last_run} " +
|
||||||
f"'{ens.target_data}' - {ens.data_type} x {x}",
|
f"'{ens.target_data}' - {ens.data_type} x {x}",
|
||||||
|
|
@ -562,6 +607,8 @@ class SolverLogEnsWindow(SolverLogWindow):
|
||||||
elif ens.data_type == "strickler_medium":
|
elif ens.data_type == "strickler_medium":
|
||||||
ens.target_data.medium = x
|
ens.target_data.medium = x
|
||||||
|
|
||||||
|
return samples
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self._log(f" *** Run solver {self._solver.name}", color="blue")
|
self._log(f" *** Run solver {self._solver.name}", color="blue")
|
||||||
self.next()
|
self.next()
|
||||||
|
|
@ -587,6 +634,7 @@ class SolverLogEnsWindow(SolverLogWindow):
|
||||||
|
|
||||||
self.next()
|
self.next()
|
||||||
|
|
||||||
|
def set_running_button_status(self):
|
||||||
self.find(QAction, "action_start").setEnabled(False)
|
self.find(QAction, "action_start").setEnabled(False)
|
||||||
if _signal:
|
if _signal:
|
||||||
self.find(QAction, "action_pause").setEnabled(True)
|
self.find(QAction, "action_pause").setEnabled(True)
|
||||||
|
|
@ -606,3 +654,12 @@ class SolverLogEnsWindow(SolverLogWindow):
|
||||||
self.find(QAction, "action_results").setEnabled(True)
|
self.find(QAction, "action_results").setEnabled(True)
|
||||||
if self._solver.log_file() != "":
|
if self._solver.log_file() != "":
|
||||||
self.find(QAction, "action_log_file").setEnabled(True)
|
self.find(QAction, "action_log_file").setEnabled(True)
|
||||||
|
|
||||||
|
def results(self):
|
||||||
|
if self._results is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
self._parent.set_results(self._solver, self._results)
|
||||||
|
self._parent.open_solver_results(self._solver, self._results)
|
||||||
|
|
||||||
|
self._solver.has_results_loaded()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue