Compare commits

..

2 Commits

5 changed files with 45 additions and 32 deletions

View File

@ -31,10 +31,7 @@ class Ensemble(SQLSubModel):
def __init__(self, id: int = -1, def __init__(self, id: int = -1,
name: str = "", name: str = "",
prob_dist="generic", function=-1, range=[], data_pid=-1,
function="generic",
range=[],
data_pid=-1,
status=None, owner_scenario=-1): status=None, owner_scenario=-1):
super(Ensemble, self).__init__( super(Ensemble, self).__init__(
id=id, status=status, id=id, status=status,
@ -43,7 +40,6 @@ class Ensemble(SQLSubModel):
self._name = name self._name = name
self._type = "generic" self._type = "generic"
self._prob_dist = prob_dist
self._function = function self._function = function
self._range = range self._range = range
self._data_pid = data_pid self._data_pid = data_pid
@ -56,8 +52,8 @@ class Ensemble(SQLSubModel):
deleted BOOLEAN NOT NULL DEFAULT FALSE, deleted BOOLEAN NOT NULL DEFAULT FALSE,
name TEXT NOT NULL, name TEXT NOT NULL,
type VARCHAR(8) NOT NULL, type VARCHAR(8) NOT NULL,
prob_dist VARCHAR(8) NOT NULL, function INTEGER NOT NULL,
function VARCHAR(8) NOT NULL, function_name VARCHAR(32) NOT NULL,
range BLOB NOT NULL, range BLOB NOT NULL,
range_len INTEGER NOT NULL, range_len INTEGER NOT NULL,
data_pid INTEGER NOT NULL, data_pid INTEGER NOT NULL,
@ -87,11 +83,12 @@ class Ensemble(SQLSubModel):
def _db_load(cls, execute, data=None): def _db_load(cls, execute, data=None):
new = [] new = []
scenario = data["scenario"] scenario = data["scenario"]
functions = data["ens_functions"]
loaded = data['loaded_pid'] loaded = data['loaded_pid']
table = execute( table = execute(
"SELECT pamhyr_id, deleted, name, type, " + "SELECT pamhyr_id, deleted, name, type, " +
"prob_dist, function, range, range_len, data_pid, " + "function, function_name, range, range_len, data_pid, " +
"scenario " + "scenario " +
"FROM ensemble " + "FROM ensemble " +
f"WHERE scenario = {scenario.id} " + f"WHERE scenario = {scenario.id} " +
@ -105,18 +102,25 @@ class Ensemble(SQLSubModel):
deleted = (next(it) == 1) deleted = (next(it) == 1)
name = next(it) name = next(it)
type = next(it) type = next(it)
prob_dist = next(it) fid = next(it)
function = next(it) fname = next(it)
range = next(it) range = next(it)
range_len = next(it) range_len = next(it)
data_pid = next(it) data_pid = next(it)
owner_scenario = next(it) owner_scenario = next(it)
def fn(f): return f._name == fname
if fid != -1:
def fn(f): return f._pamhyr_id == fid
function = next(
filter(fn, functions.lst),
)
rdata = cls._decode_range(range, range_len) rdata = cls._decode_range(range, range_len)
new_ensemble = cls( new_ensemble = cls(
id, name=name, id, name=name,
prob_dist=prob_dist,
function=function, function=function,
range=rdata, range=rdata,
status=data["status"], status=data["status"],
@ -142,27 +146,24 @@ class Ensemble(SQLSubModel):
brange, length = self._encode_range() brange, length = self._encode_range()
fid = self._function._pamhyr_id
if self._function._type == "generic":
fid = -1
execute( execute(
"INSERT INTO " + "INSERT INTO " +
"ensemble(pamhyr_id, deleted, name, type, " + "ensemble(pamhyr_id, deleted, name, type, " +
" prob_dist, function, range, range_len, " + " function, function_name, range, range_len, " +
" data_pid, scenario) " + " data_pid, scenario) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
self.pamhyr_id, self.is_deleted(), self.pamhyr_id, self.is_deleted(),
self._name, self._type, self._name, self._type,
self._prob_dist, self._function, brange, length, fid, self._function._name, brange, length,
self._data_pid, self._status.scenario_id self._data_pid, self._status.scenario_id
) )
return True return True
def _data_traversal(self,
predicate=lambda obj, data: True,
modifier=lambda obj, data: None,
data={}):
if predicate(self, data):
modifier(self, data)
def _encode_range(self): def _encode_range(self):
length = len(self._range) length = len(self._range)
data_format = ">" + ''.join(itertools.repeat("d", length)) data_format = ">" + ''.join(itertools.repeat("d", length))

View File

@ -41,9 +41,6 @@ class EnsembleList(PamhyrModelList):
f"WHERE scenario = {self._status.scenario_id}" f"WHERE scenario = {self._status.scenario_id}"
) )
if data is None:
data = {}
for ens in self._lst: for ens in self._lst:
ens._db_save(execute, data=data) ens._db_save(execute, data=data)

View File

@ -19,6 +19,7 @@
import struct import struct
import logging import logging
import itertools import itertools
import numpy as np
from tools import logger_exception from tools import logger_exception
@ -149,8 +150,14 @@ class Uniform(Function):
name=name, script=script name=name, script=script
) )
def get_sample(self, dist, ens_range): def get_sample(self, ens_range):
return range(ens_range[0], ens_range[1]) b = ens_range[0]
t = ens_range[1]
n = ens_range[2]
step = (t - b) / n
return np.arange(b, t, step)
class Custom(Function): class Custom(Function):
@ -166,11 +173,11 @@ class Custom(Function):
self._type = "custom" self._type = "custom"
def get_sample(self, dist, ens_range): def get_sample(self, ens_range):
try: try:
# Run script to (re)define the sample function # Run script to (re)define the sample function
f = eval(self._script) f = eval(self._script)
return f(dist, ens_range) return f(ens_range)
except Exception as e: except Exception as e:
logger_exception(e) logger_exception(e)
return None # TODO: Raise helpful exception return None # TODO: Raise helpful exception

View File

@ -29,7 +29,12 @@ class FunctionList(PamhyrModelList):
def _db_load(cls, execute, data=None): def _db_load(cls, execute, data=None):
new = cls(status=data['status']) new = cls(status=data['status'])
new._lst = [Uniform(status=data['status'])] # Default functions
new._lst = [
Uniform(status=data['status']),
]
# DB custom functions
new._lst += Function._db_load( new._lst += Function._db_load(
execute, data execute, data
) )

View File

@ -87,7 +87,7 @@ class Study(SQLModel):
self.scenarios[0] = s0 self.scenarios[0] = s0
self.status.scenario = s0 self.status.scenario = s0
self._ens_function = FunctionList(status=self.status) self._ens_functions = FunctionList(status=self.status)
self._river = River(status=self.status) self._river = River(status=self.status)
else: else:
@ -400,10 +400,12 @@ class Study(SQLModel):
data["loaded_pid"] = set() data["loaded_pid"] = set()
# Get ensemble function # Get ensemble function
new._ens_function = FunctionList._db_load( new._ens_functions = FunctionList._db_load(
sql_exec, data=data sql_exec, data=data
) )
data["ens_functions"] = new._ens_functions
# Load river data # Load river data
new._river = River._db_load( new._river = River._db_load(
sql_exec, data=data sql_exec, data=data
@ -466,7 +468,7 @@ class Study(SQLModel):
self._save_submodel( self._save_submodel(
[ [
self.scenarios, self._ens_function, self.scenarios, self._ens_functions,
self._river self._river
], ],
data=progress data=progress
@ -586,7 +588,8 @@ class Study(SQLModel):
data = { data = {
"status": self.status, "status": self.status,
"loaded_pid": set(), "loaded_pid": set(),
"scenario": scenario "scenario": scenario,
"ens_functions": self._ens_functions,
} }
self.status.start_loading() self.status.start_loading()