udc workarround
This commit is contained in:
parent
5f2d0801ca
commit
3cf3f45c08
|
|
@ -5,6 +5,7 @@ from fn.op import foldr, call
|
||||||
|
|
||||||
from cadCAD.engine.utils import engine_exception
|
from cadCAD.engine.utils import engine_exception
|
||||||
from cadCAD.utils import flatten
|
from cadCAD.utils import flatten
|
||||||
|
import pprint as pp
|
||||||
|
|
||||||
id_exception: Callable = engine_exception(KeyError, KeyError, None)
|
id_exception: Callable = engine_exception(KeyError, KeyError, None)
|
||||||
|
|
||||||
|
|
@ -72,6 +73,7 @@ class Executor:
|
||||||
_input: Dict[str, Any] = self.policy_update_exception(self.get_policy_input(var_dict, sub_step, sL, last_in_obj, policy_funcs))
|
_input: Dict[str, Any] = self.policy_update_exception(self.get_policy_input(var_dict, sub_step, sL, last_in_obj, policy_funcs))
|
||||||
|
|
||||||
# ToDo: add env_proc generator to `last_in_copy` iterator as wrapper function
|
# ToDo: add env_proc generator to `last_in_copy` iterator as wrapper function
|
||||||
|
# ToDo: Can be multithreaded ??
|
||||||
last_in_copy: Dict[str, Any] = dict(
|
last_in_copy: Dict[str, Any] = dict(
|
||||||
[
|
[
|
||||||
self.state_update_exception(f(var_dict, sub_step, sL, last_in_obj, _input)) for f in state_funcs
|
self.state_update_exception(f(var_dict, sub_step, sL, last_in_obj, _input)) for f in state_funcs
|
||||||
|
|
@ -86,6 +88,7 @@ class Executor:
|
||||||
|
|
||||||
self.apply_env_proc(env_processes, last_in_copy, last_in_copy['timestep'])
|
self.apply_env_proc(env_processes, last_in_copy, last_in_copy['timestep'])
|
||||||
|
|
||||||
|
# ToDo: make 'substep' & 'timestep' reserve fields
|
||||||
last_in_copy['substep'], last_in_copy['timestep'], last_in_copy['run'] = sub_step, time_step, run
|
last_in_copy['substep'], last_in_copy['timestep'], last_in_copy['run'] = sub_step, time_step, run
|
||||||
|
|
||||||
sL.append(last_in_copy)
|
sL.append(last_in_copy)
|
||||||
|
|
@ -106,7 +109,16 @@ class Executor:
|
||||||
|
|
||||||
sub_step = 0
|
sub_step = 0
|
||||||
states_list_copy: List[Dict[str, Any]] = deepcopy(states_list)
|
states_list_copy: List[Dict[str, Any]] = deepcopy(states_list)
|
||||||
|
# for d1 in states_list:
|
||||||
|
# for d2 in states_list_copy:
|
||||||
|
# d2['classX'] = d1['classX']
|
||||||
|
#
|
||||||
|
# print()
|
||||||
|
# pp.pprint(states_list_copy)
|
||||||
|
# print()
|
||||||
|
|
||||||
genesis_states: Dict[str, Any] = states_list_copy[-1]
|
genesis_states: Dict[str, Any] = states_list_copy[-1]
|
||||||
|
del states_list_copy
|
||||||
genesis_states['substep'], genesis_states['timestep'] = sub_step, time_step
|
genesis_states['substep'], genesis_states['timestep'] = sub_step, time_step
|
||||||
states_list: List[Dict[str, Any]] = [genesis_states]
|
states_list: List[Dict[str, Any]] = [genesis_states]
|
||||||
|
|
||||||
|
|
@ -158,6 +170,11 @@ class Executor:
|
||||||
def execute_run(var_dict, states_list, configs, env_processes, time_seq, run) -> List[Dict[str, Any]]:
|
def execute_run(var_dict, states_list, configs, env_processes, time_seq, run) -> List[Dict[str, Any]]:
|
||||||
run += 1
|
run += 1
|
||||||
states_list_copy: List[Dict[str, Any]] = deepcopy(states_list)
|
states_list_copy: List[Dict[str, Any]] = deepcopy(states_list)
|
||||||
|
|
||||||
|
# for d1 in states_list:
|
||||||
|
# for d2 in states_list_copy:
|
||||||
|
# d2['classX'] = d1['classX']
|
||||||
|
|
||||||
head, *tail = self.run_pipeline(var_dict, states_list_copy, configs, env_processes, time_seq, run)
|
head, *tail = self.run_pipeline(var_dict, states_list_copy, configs, env_processes, time_seq, run)
|
||||||
del states_list_copy
|
del states_list_copy
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
import pandas as pd
|
||||||
|
from tabulate import tabulate
|
||||||
|
# The following imports NEED to be in the exact order
|
||||||
|
from cadCAD.engine import ExecutionMode, ExecutionContext, Executor
|
||||||
|
from simulations.validation import config_az
|
||||||
|
from cadCAD import configs
|
||||||
|
|
||||||
|
import pprint as pp
|
||||||
|
|
||||||
|
exec_mode = ExecutionMode()
|
||||||
|
|
||||||
|
print("Simulation Execution: Single Configuration")
|
||||||
|
print()
|
||||||
|
first_config = configs # only contains config1
|
||||||
|
single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)
|
||||||
|
run = Executor(exec_context=single_proc_ctx, configs=first_config)
|
||||||
|
|
||||||
|
raw_result, tensor_field = run.main()
|
||||||
|
result = pd.DataFrame(raw_result)
|
||||||
|
print()
|
||||||
|
print("Tensor Field: config1")
|
||||||
|
print(tabulate(tensor_field, headers='keys', tablefmt='psql'))
|
||||||
|
print("Output:")
|
||||||
|
print(tabulate(result, headers='keys', tablefmt='psql'))
|
||||||
|
print()
|
||||||
|
|
@ -6,7 +6,6 @@ from cadCAD.configuration import append_configs
|
||||||
from cadCAD.configuration.utils import proc_trigger, bound_norm_random, ep_time_step
|
from cadCAD.configuration.utils import proc_trigger, bound_norm_random, ep_time_step
|
||||||
from cadCAD.configuration.utils.parameterSweep import config_sim
|
from cadCAD.configuration.utils.parameterSweep import config_sim
|
||||||
|
|
||||||
|
|
||||||
seeds = {
|
seeds = {
|
||||||
'z': np.random.RandomState(1),
|
'z': np.random.RandomState(1),
|
||||||
'a': np.random.RandomState(2),
|
'a': np.random.RandomState(2),
|
||||||
|
|
@ -37,7 +36,7 @@ def p2m3(_g, step, sL, s):
|
||||||
# Internal States per Mechanism
|
# Internal States per Mechanism
|
||||||
def s1m1(_g, step, sL, s, _input):
|
def s1m1(_g, step, sL, s, _input):
|
||||||
y = 's1'
|
y = 's1'
|
||||||
x = _input['param1']
|
x = s['s1'] + 1
|
||||||
return (y, x)
|
return (y, x)
|
||||||
def s2m1(_g, step, sL, s, _input):
|
def s2m1(_g, step, sL, s, _input):
|
||||||
y = 's2'
|
y = 's2'
|
||||||
|
|
@ -46,7 +45,7 @@ def s2m1(_g, step, sL, s, _input):
|
||||||
|
|
||||||
def s1m2(_g, step, sL, s, _input):
|
def s1m2(_g, step, sL, s, _input):
|
||||||
y = 's1'
|
y = 's1'
|
||||||
x = _input['param1']
|
x = s['s1'] + 1
|
||||||
return (y, x)
|
return (y, x)
|
||||||
def s2m2(_g, step, sL, s, _input):
|
def s2m2(_g, step, sL, s, _input):
|
||||||
y = 's2'
|
y = 's2'
|
||||||
|
|
@ -55,7 +54,7 @@ def s2m2(_g, step, sL, s, _input):
|
||||||
|
|
||||||
def s1m3(_g, step, sL, s, _input):
|
def s1m3(_g, step, sL, s, _input):
|
||||||
y = 's1'
|
y = 's1'
|
||||||
x = _input['param1']
|
x = s['s1'] + 1
|
||||||
return (y, x)
|
return (y, x)
|
||||||
def s2m3(_g, step, sL, s, _input):
|
def s2m3(_g, step, sL, s, _input):
|
||||||
y = 's2'
|
y = 's2'
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,91 @@
|
||||||
|
from copy import deepcopy
|
||||||
|
from datetime import timedelta
|
||||||
|
from cadCAD.configuration import append_configs
|
||||||
|
from cadCAD.configuration.utils import ep_time_step
|
||||||
|
from cadCAD.configuration.utils.parameterSweep import config_sim
|
||||||
|
|
||||||
|
|
||||||
|
class MyClass:
|
||||||
|
def __init__(self):
|
||||||
|
self.x = 0
|
||||||
|
print(f"Instance of MyClass (mem_id {hex(id(self))}) created with value {self.x}")
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
# res = deepcopy(self)
|
||||||
|
self.x += 1
|
||||||
|
# print(f"Instance of MyClass (mem_id {hex(id(self))}) has been updated, has now value {self.x}")
|
||||||
|
return self #res
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"PRINT MyClass: @ {hex(id(self))}: value {self.x}"
|
||||||
|
|
||||||
|
# genesis state
|
||||||
|
state_dict = {
|
||||||
|
'classX': MyClass(),
|
||||||
|
'a': 0,
|
||||||
|
'b': 0,
|
||||||
|
'timestamp': '2019-01-01 00:00:00'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
timestep_duration = timedelta(minutes=1) # In this example, a timestep has a duration of 1 minute.
|
||||||
|
ts_format = '%Y-%m-%d %H:%M:%S'
|
||||||
|
def time_model(_g, step, sL, s, _input):
|
||||||
|
y = 'timestamp'
|
||||||
|
x = ep_time_step(s, dt_str=s['timestamp'], fromat_str=ts_format, _timedelta=timestep_duration)
|
||||||
|
return (y, x)
|
||||||
|
|
||||||
|
|
||||||
|
def updateClassX(_g, step, sL, s, _input):
|
||||||
|
y = 'classX'
|
||||||
|
x = s['classX']
|
||||||
|
return (y, x)
|
||||||
|
|
||||||
|
|
||||||
|
def updateA(_g, step, sL, s, _input):
|
||||||
|
y = 'a'
|
||||||
|
x = s['a'] + 1
|
||||||
|
return (y, x)
|
||||||
|
|
||||||
|
|
||||||
|
def updateB(_g, step, sL, s, _input):
|
||||||
|
s['classX'].update()
|
||||||
|
y = 'b'
|
||||||
|
x = s['classX'].x
|
||||||
|
return (y, x)
|
||||||
|
|
||||||
|
|
||||||
|
partial_state_update_blocks = {
|
||||||
|
'PSUB1': {
|
||||||
|
'behaviors': {
|
||||||
|
},
|
||||||
|
'states': {
|
||||||
|
'timestamp': time_model
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'PSUB2': {
|
||||||
|
'behaviors': {
|
||||||
|
},
|
||||||
|
'states': {
|
||||||
|
'classX': updateClassX,
|
||||||
|
'a': updateA,
|
||||||
|
'b': updateB
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'PSUB3': {
|
||||||
|
'behaviors': {
|
||||||
|
},
|
||||||
|
'states': {
|
||||||
|
'classX': updateClassX,
|
||||||
|
'a': updateA,
|
||||||
|
'b': updateB
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sim_config = config_sim({
|
||||||
|
"N": 2,
|
||||||
|
"T": range(4)
|
||||||
|
})
|
||||||
|
|
||||||
|
append_configs(sim_config, state_dict, {}, {}, {}, partial_state_update_blocks)
|
||||||
Loading…
Reference in New Issue