mirror of https://gitlab.com/pamhyr/pamhyr2
Mage: Ensemble: Add bin reading method.
parent
e7290fa81b
commit
51b3987a4a
|
|
@ -1513,6 +1513,145 @@ class Mage8(Mage):
|
||||||
|
|
||||||
return results
|
return results
|
||||||
|
|
||||||
|
@timer
|
||||||
|
def read_ensemble_bin(self, study, fname, tables, run_number, qlog=None):
|
||||||
|
logger.info(f"read_bin: Start reading '{fname}' ...")
|
||||||
|
start = time.time()
|
||||||
|
|
||||||
|
with mage_file_open(fname, "r") as f:
|
||||||
|
def newline(): return np.fromfile(f, dtype=np.int32, count=1)
|
||||||
|
def endline(): return np.fromfile(f, dtype=np.int32, count=1)
|
||||||
|
|
||||||
|
def read_int(size): return np.fromfile(
|
||||||
|
f, dtype=np.int32, count=size)
|
||||||
|
|
||||||
|
def read_float(size): return np.fromfile(
|
||||||
|
f, dtype=np.float32, count=size)
|
||||||
|
|
||||||
|
def read_float64(size): return np.fromfile(
|
||||||
|
f, dtype=np.float64, count=size)
|
||||||
|
|
||||||
|
# Meta data (1st line)
|
||||||
|
newline()
|
||||||
|
data = read_int(3)
|
||||||
|
|
||||||
|
nb_reach = data[0]
|
||||||
|
nb_profile = data[1]
|
||||||
|
mage_version = data[2]
|
||||||
|
|
||||||
|
if mage_version <= 80:
|
||||||
|
msg = (
|
||||||
|
"Read BIN files: " +
|
||||||
|
f"Possible incompatible mage version '{mage_version}', " +
|
||||||
|
"please check your solver configuration..."
|
||||||
|
)
|
||||||
|
logger.warning(msg)
|
||||||
|
|
||||||
|
if qlog is not None:
|
||||||
|
qlog.put("[WARNING] " + msg)
|
||||||
|
|
||||||
|
endline()
|
||||||
|
|
||||||
|
# Reach information (2nd line)
|
||||||
|
newline()
|
||||||
|
_ = read_int(2*nb_reach)
|
||||||
|
endline()
|
||||||
|
|
||||||
|
# X (3rd line)
|
||||||
|
newline()
|
||||||
|
_ = read_float(nb_profile)
|
||||||
|
endline()
|
||||||
|
|
||||||
|
# Z and Y (4th line)
|
||||||
|
newline()
|
||||||
|
_ = read_float(3*nb_profile)
|
||||||
|
endline()
|
||||||
|
|
||||||
|
# Data
|
||||||
|
newline()
|
||||||
|
|
||||||
|
tmp_table = {}
|
||||||
|
end = False
|
||||||
|
while not end:
|
||||||
|
n = read_int(1)[0]
|
||||||
|
timestamp = read_float64(1)[0]
|
||||||
|
key = bytearray(
|
||||||
|
np.fromfile(
|
||||||
|
f, dtype=np.byte, count=1
|
||||||
|
)
|
||||||
|
).decode()
|
||||||
|
data = read_float(n)
|
||||||
|
|
||||||
|
if key not in tmp_table:
|
||||||
|
tmp_table[key] = []
|
||||||
|
|
||||||
|
tmp_table[key].append(data)
|
||||||
|
|
||||||
|
endline()
|
||||||
|
end = newline().size <= 0
|
||||||
|
|
||||||
|
table = {}
|
||||||
|
for k in tmp_table:
|
||||||
|
table[k] = np.array(tmp_table[k])
|
||||||
|
|
||||||
|
|
||||||
|
self.read_ensemble_bin_agregate_data(
|
||||||
|
table, tables, run_number
|
||||||
|
)
|
||||||
|
|
||||||
|
logger.info(f"reading time: '{time.time() - start}'")
|
||||||
|
|
||||||
|
def read_ensemble_bin_agregate_data(self, tables, res, run_number):
|
||||||
|
z = tables["Z"]
|
||||||
|
q = tables["Q"]
|
||||||
|
|
||||||
|
if "z_mean" not in res:
|
||||||
|
res["z_mean"] = z
|
||||||
|
res["q_mean"] = q
|
||||||
|
|
||||||
|
res["z_min"] = z
|
||||||
|
res["z_max"] = z
|
||||||
|
|
||||||
|
res["q_min"] = q
|
||||||
|
res["q_max"] = q
|
||||||
|
|
||||||
|
# FIXME: Keep all results ?
|
||||||
|
res["traces"] = [(run_number, tables)]
|
||||||
|
else:
|
||||||
|
# Get mean results for Z and Q
|
||||||
|
res["z_mean"] = (res["z_mean"] + z) / 2
|
||||||
|
res["q_mean"] = (res["q_mean"] + q) / 2
|
||||||
|
|
||||||
|
# Z and Q min max values
|
||||||
|
res["z_min"] = np.minimum(z, res["z_min"])
|
||||||
|
res["z_max"] = np.maximum(z, res["z_max"])
|
||||||
|
res["q_min"] = np.minimum(q, res["q_min"])
|
||||||
|
res["q_max"] = np.maximum(q, res["q_max"])
|
||||||
|
|
||||||
|
# FIXME: Keep all results ?
|
||||||
|
res["traces"].append((run_number, tables))
|
||||||
|
|
||||||
|
@timer
|
||||||
|
def results_ensemble(self, study, repertory,
|
||||||
|
tables, run_number,
|
||||||
|
qlog=None, name=None):
|
||||||
|
self._study = study
|
||||||
|
if name is None:
|
||||||
|
name = study.name.replace(" ", "_")
|
||||||
|
|
||||||
|
fname = os.path.join(repertory, f"{name}.BIN".replace(" ", "_"))
|
||||||
|
if not os.path.isfile(fname):
|
||||||
|
logger.info(f"Result file {name}.BIN does not exist")
|
||||||
|
return None
|
||||||
|
try:
|
||||||
|
self.read_ensemble_bin(study, fname, tables, run_number, qlog)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Failed to read results")
|
||||||
|
logger_exception(e)
|
||||||
|
return None
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
class MageFake7(Mage8):
|
class MageFake7(Mage8):
|
||||||
_type = "mage_fake7"
|
_type = "mage_fake7"
|
||||||
|
|
|
||||||
|
|
@ -474,6 +474,8 @@ class SolverLogEnsWindow(SolverLogWindow):
|
||||||
|
|
||||||
self._samples[ens] = ens.get_sample(self._run_number)
|
self._samples[ens] = ens.get_sample(self._run_number)
|
||||||
|
|
||||||
|
self._results_tables = {}
|
||||||
|
|
||||||
super(SolverLogEnsWindow, self).__init__(
|
super(SolverLogEnsWindow, self).__init__(
|
||||||
solver=solver,
|
solver=solver,
|
||||||
study=study,
|
study=study,
|
||||||
|
|
@ -503,7 +505,8 @@ 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}",
|
||||||
3000
|
3000
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -515,6 +518,13 @@ class SolverLogEnsWindow(SolverLogWindow):
|
||||||
def next(self):
|
def next(self):
|
||||||
self._process = self.new_process(self._parent)
|
self._process = self.new_process(self._parent)
|
||||||
|
|
||||||
|
self._solver.results_ensemble(
|
||||||
|
self._study, self._workdir,
|
||||||
|
self._results_tables,
|
||||||
|
self._last_run,
|
||||||
|
qlog=self._output,
|
||||||
|
)
|
||||||
|
|
||||||
self._log(f" *** Run #{self._last_run}", color="blue")
|
self._log(f" *** Run #{self._last_run}", color="blue")
|
||||||
self._solver.export_ensemble_variation(
|
self._solver.export_ensemble_variation(
|
||||||
self._study, self._workdir, qlog=self._output,
|
self._study, self._workdir, qlog=self._output,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue