init packaging

This commit is contained in:
Joshua E. Jodesty 2018-10-09 15:12:10 -04:00
parent 596a75d7b7
commit 577ac24b96
13 changed files with 1853 additions and 107 deletions

0
engine/__init__.py Normal file
View File

13
engine/configProcessor.py Normal file
View File

@ -0,0 +1,13 @@
# if beh list empty, repeat 0 x n_states in list
def generate_config(mechanisms, exogenous_states):
es_funcs = [exogenous_states[state] for state in list(exogenous_states.keys())]
config = list(
map(
lambda m: (
list(mechanisms[m]["states"].values()) + es_funcs,
list(mechanisms[m]["behaviors"].values())
),
list(mechanisms.keys())
)
)
return config

View File

@ -0,0 +1,79 @@
from copy import deepcopy
from fn import op, _
def getColResults(step, sL, s, funcs):
return list(map(lambda f: f(step, sL, s), funcs))
def getBehaviorInput(step, sL, s, funcs):
return op.foldr(_ + _)(getColResults(step, sL, s, funcs))
def apply_env_proc(env_processes, state_dict, step):
for state in state_dict.keys():
if state in list(env_processes.keys()):
state_dict[state] = env_processes[state](step)(state_dict[state])
def mech_step(m_step, sL, state_funcs, behavior_funcs, env_processes, t_step):
in_copy, mutatable_copy, out_copy = deepcopy(sL), deepcopy(sL), deepcopy(sL)
last_in_obj, last_mut_obj = in_copy[-1], mutatable_copy[-1]
_input = getBehaviorInput(m_step, sL, last_in_obj, behavior_funcs)
for f in state_funcs:
f(m_step, sL, last_mut_obj, _input)
apply_env_proc(env_processes, last_mut_obj, last_mut_obj['timestamp'])
last_mut_obj["mech_step"], last_mut_obj["time_step"] = m_step, t_step
out_copy.append(last_mut_obj)
del last_in_obj, last_mut_obj, in_copy, mutatable_copy,
return out_copy
def block_gen(states_list, configs, env_processes, t_step):
m_step = 0
states_list_copy = deepcopy(states_list)
genesis_states = states_list_copy[-1]
genesis_states['mech_step'], genesis_states['time_step'] = m_step, t_step
states_list = [genesis_states]
m_step += 1
for config in configs:
s_conf, b_conf = config[0], config[1]
states_list = mech_step(m_step, states_list, s_conf, b_conf, env_processes, t_step)
m_step += 1
t_step += 1
return states_list
def pipeline(states_list, configs, env_processes, time_seq):
time_seq = [x + 1 for x in time_seq]
simulation_list = [states_list]
for time_step in time_seq:
pipeline_run = block_gen(simulation_list[-1], configs, env_processes, time_step)
head, *pipeline_run = pipeline_run
simulation_list.append(pipeline_run)
return simulation_list
def simulation(states_list, configs, env_processes, time_seq, runs):
pipeline_run = []
for run in range(runs):
if run == 0:
head, *tail = pipeline(states_list, configs, env_processes, time_seq)
head[-1]['mech_step'], head[-1]['time_step'] = 0, 0
simulation_list = [head] + tail
pipeline_run += simulation_list
else:
transient_states_list = [pipeline_run[-1][-1]]
head, *tail = pipeline(transient_states_list, configs, env_processes, time_seq)
pipeline_run += tail
return pipeline_run

16
engine/run.py Normal file
View File

@ -0,0 +1,16 @@
from ui.config import state_dict, mechanisms, exogenous_states, env_processes, sim_config
from engine.configProcessor import generate_config
from engine.mechanismExecutor import simulation
from engine.utils import flatten
from tabulate import tabulate
import pandas as pd
def main():
states_list = [state_dict]
configs = generate_config(mechanisms, exogenous_states)
# p = pipeline(states_list, configs, env_processes, range(10))
N = sim_config['N']
s = simulation(states_list, configs, env_processes, range(5), N)
result = pd.DataFrame(flatten(s))
print(tabulate(result, headers='keys', tablefmt='psql'))

54
engine/utils.py Normal file
View File

@ -0,0 +1,54 @@
from datetime import datetime, timedelta
from decimal import Decimal
from functools import partial
flatten = lambda l: [item for sublist in l for item in sublist]
def flatmap(f, items):
return list(map(f, items))
def datetime_range(start, end, delta, dt_format='%Y-%m-%d %H:%M:%S'):
reverse_head = end
[start, end] = [datetime.strptime(x, dt_format) for x in [start, end]]
def _datetime_range(start, end, delta):
current = start
while current < end:
yield current
current += delta
reverse_tail = [dt.strftime(dt_format) for dt in _datetime_range(start, end, delta)]
return reverse_tail + [reverse_head]
def last_index(l):
return len(l)-1
def retrieve_state(l, offset):
return l[last_index(l) + offset + 1]
def bound_norm_random(rng, low, high):
# Add RNG Seed
res = rng.normal((high+low)/2,(high-low)/6)
if (res<low or res>high):
res = bound_norm_random(rng, low, high)
return Decimal(res)
def env_proc(trigger_step, update_f):
def env_step_trigger(trigger_step, update_f, step):
if step == trigger_step:
return update_f
else:
return lambda x: x
return partial(env_step_trigger, trigger_step, update_f)
def time_step(dt_str, dt_format='%Y-%m-%d %H:%M:%S', days=0, minutes=0, seconds=30):
dt = datetime.strptime(dt_str, dt_format)
t = dt + timedelta(days=days, minutes=minutes, seconds=seconds)
return t.strftime(dt_format)
def ep_time_step(s, dt_str, fromat_str='%Y-%m-%d %H:%M:%S', days=0, minutes=0, seconds=1):
if s['mech_step'] == 0:
return time_step(dt_str, fromat_str, days, minutes, seconds)
else:
return dt_str

File diff suppressed because it is too large Load Diff

View File

@ -29,59 +29,6 @@
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['2018-10-01 01:00:00',\n",
" '2018-10-01 01:15:00',\n",
" '2018-10-01 01:30:00',\n",
" '2018-10-01 01:45:00',\n",
" '2018-10-01 02:00:00']"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def datetime_range(start, end, delta, dt_format='%Y-%m-%d %H:%M:%S'):\n",
" reverse_head = end\n",
" [start, end] = [datetime.strptime(x, dt_format) for x in [start, end]]\n",
" def _datetime_range(start, end, delta):\n",
" current = start\n",
" while current < end:\n",
" yield current\n",
" current += delta\n",
" \n",
" reverse_tail = [dt.strftime(dt_format) for dt in _datetime_range(start, end, delta)]\n",
" return reverse_tail + [reverse_head]\n",
"\n",
"\n",
"datetime_range('2018-10-01 01:00:00', '2018-10-01 02:00:00', timedelta(minutes=15))\n",
"\n",
"# # datetime(2018, 10, 1, 1, 0, 0) + timedelta(seconds=30)\n",
"# # datetime.strptime('2018-10-01 15:16:24', '%Y-%m-%d %H:%M:%S')\n",
"\n",
"# def time_step(dt_str, dt_format='%Y-%m-%d %H:%M:%S', days=0, minutes=0, seconds=30):\n",
"# dt = datetime.strptime(dt_str, dt_format)\n",
"# t = dt + timedelta(days=days, minutes=minutes, seconds=seconds)\n",
"# return t.strftime(dt_format)\n",
"\n",
"# def es_time_step(s, dt_str, fromat_str='%Y-%m-%d %H:%M:%S', days=0, minutes=0, seconds=1):\n",
"# if s['mech_step'] == 0:\n",
"# return time_step(dt_str, fromat_str, days, minutes, seconds)\n",
"# else: \n",
"# return dt_str\n",
"\n",
"# time_step('2018-10-01 15:16:24')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"flatten = lambda l: [item for sublist in l for item in sublist]\n",
@ -106,8 +53,7 @@
"\n",
"def retrieve_state(l, offset):\n",
" return l[last_index(l) + offset + 1]\n",
"# Stochastic Process\n",
"# Input RNG Seed\n",
"\n",
"def bound_norm_random(rng, low, high):\n",
" # Add RNG Seed\n",
" res = rng.normal((high+low)/2,(high-low)/6)\n",
@ -118,10 +64,8 @@
"def env_proc(trigger_step, update_f):\n",
" def env_step_trigger(trigger_step, update_f, step):\n",
" if step == trigger_step:\n",
"# print('trigered: '+step)\n",
" return update_f\n",
" else:\n",
"# print('NOT trigered: '+step)\n",
" return lambda x: x\n",
" return partial(env_step_trigger, trigger_step, update_f)\n",
"\n",
@ -137,28 +81,22 @@
" return dt_str\n",
"\n",
"def round_down(x, fp=TWOPLACES):\n",
" return x.quantize(TWOPLACES, rounding=ROUND_DOWN)\n",
" \n",
"# def round_down(f, fp=TWOPLACES):\n",
"# return (f).quantize(fp, ROUND_DOWN)"
" return x.quantize(TWOPLACES, rounding=ROUND_DOWN)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"\n",
"\n",
"\n",
"# esceptions:\n",
"# point to line giving problems and pass a sentinel"
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
@ -211,14 +149,10 @@
"def es5p2(step, sL, s, _input):\n",
" s['timestamp'] = ep_time_step(s, s['timestamp'], seconds=1)\n",
"\n",
"\n",
"# add env process f(s) read from time es\n",
"# funcs execute in order\n",
"def env_a(x): \n",
" return 10\n",
"def env_b(x): \n",
" return 10\n",
" \n",
"def what_ever(x): \n",
" return x + 1\n",
"\n",
@ -231,9 +165,9 @@
" 'timestamp': '2018-10-01 15:16:24'\n",
"}\n",
"\n",
"# simulation = {\n",
"# \"s3\": es3p1\n",
"# }\n",
"sim_config = {\n",
" \"N\": 2\n",
"}\n",
"\n",
"exogenous_states = {\n",
" \"s3\": es3p1,\n",
@ -241,8 +175,6 @@
" \"timestamp\": es5p2\n",
"}\n",
"\n",
"# Update time at the end of each pipeline (once per 'block')\n",
"# Enable the acceptance of user defined time\n",
"env_processes = {\n",
" \"s3\": env_proc('2018-10-01 15:16:25', env_a),\n",
" \"s4\": env_proc('2018-10-01 15:16:25', env_b)\n",
@ -284,7 +216,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
@ -316,16 +248,11 @@
"# return state_dict\n",
" \n",
"def mech_step(m_step, sL, state_funcs, behavior_funcs, env_processes, t_step):\n",
" # Truncate reffs\n",
" in_copy, mutatable_copy, out_copy = deepcopy(sL), deepcopy(sL), deepcopy(sL)\n",
" last_in_obj, last_mut_obj = in_copy[-1], mutatable_copy[-1]\n",
" \n",
" # * force eval of _input withing state functions\n",
" _input = getBehaviorInput(m_step, sL, last_in_obj, behavior_funcs)\n",
"\n",
" \n",
"# apply_env_proc(env_processes, last_mut_obj, t_step)\n",
"\n",
" for f in state_funcs:\n",
" f(m_step, sL, last_mut_obj, _input)\n",
" \n",
@ -382,34 +309,25 @@
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"time_seq = datetime_range('2018-10-01 15:16:24', '2018-10-01 15:16:34', timedelta(seconds=1))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"states_list = [state_dict]\n",
"configs = generate_config(mechanisms, exogenous_states)\n",
"p = pipeline(states_list, configs, env_processes, range(10))\n",
"s = simulation(states_list, configs, env_processes, range(5), 2)\n",
"x = flatten(s)\n",
"N = sim_config['N']\n",
"s = simulation(states_list, configs, env_processes, range(5), N)\n",
"# x = flatten(s)\n",
"# transient_state = p[-1][1]\n",
"# transient_state['mech_step'], transient_state['time_step'] = 0, 0\n",
"# head, *tail = pipeline([transient_state], configs, env_processes, range(1))\n",
"# head\n",
"datetime_range('2018-10-01 15:16:24', '2018-10-01 15:16:34', timedelta(seconds=1))"
"# head"
]
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": 7,
"metadata": {},
"outputs": [
{
@ -858,7 +776,7 @@
"30 2018-10-01 15:16:34 "
]
},
"execution_count": 8,
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
@ -876,7 +794,7 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
@ -885,7 +803,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
@ -894,7 +812,7 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 10,
"metadata": {},
"outputs": [
{
@ -1343,7 +1261,7 @@
"30 2018-10-01 15:16:34 "
]
},
"execution_count": 11,
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
@ -1357,7 +1275,7 @@
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 11,
"metadata": {},
"outputs": [
{
@ -1366,7 +1284,7 @@
"[0, 1]"
]
},
"execution_count": 12,
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
@ -1377,7 +1295,7 @@
},
{
"cell_type": "code",
"execution_count": 13,
"execution_count": 12,
"metadata": {},
"outputs": [
{
@ -1385,9 +1303,9 @@
"evalue": "name 'non_numeric' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m--------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-13-9786f8c4c4ba>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mstate_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m's1'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'3323'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m's2'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'2572'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m's3'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'2.657'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m's4'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'7.914'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'timestamp'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'2018-10-01 15:16:26'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'mech_step'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'time_step'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mstate_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mTWOPLACES\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mROUND_DOWN\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstate_dict\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mstate_dict\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnon_numeric\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mstate_dict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31m---------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-12-9786f8c4c4ba>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mstate_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m's1'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'3323'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m's2'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'2572'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m's3'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'2.657'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m's4'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'7.914'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'timestamp'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'2018-10-01 15:16:26'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'mech_step'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'time_step'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mstate_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquantize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mTWOPLACES\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mROUND_DOWN\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstate_dict\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mDecimal\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mstate_dict\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnon_numeric\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mstate_dict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'non_numeric' is not defined"
]
}

0
setup.py Normal file
View File

Binary file not shown.

120
ui/config.py Normal file
View File

@ -0,0 +1,120 @@
from engine.utils import bound_norm_random, ep_time_step, env_proc
import numpy as np
from decimal import Decimal
seed = {
'z': np.random.RandomState(1),
'a': np.random.RandomState(2),
'b': np.random.RandomState(3),
'c': np.random.RandomState(3)
}
# Behaviors per Mechanism
def b1m1(step, sL, s):
return s['s1'] + 1
def b2m1(step, sL, s):
return s['s1'] + 1
def b1m2(step, sL, s):
return s['s1'] + 1
def b2m2(step, sL, s):
return s['s1'] + 1
def b1m3(step, sL, s):
return s['s1'] + 1
def b2m3(step, sL, s):
return s['s2'] + 1
# Internal States per Mechanism
def s1m1(step, sL, s, _input):
s['s1'] = s['s1'] + _input
def s2m1(step, sL, s, _input):
s['s2'] = s['s2'] + _input
def s1m2(step, sL, s, _input):
s['s1'] = s['s1'] + _input
def s2m2(step, sL, s, _input):
s['s2'] = s['s2'] + _input
def s1m3(step, sL, s, _input):
s['s1'] = s['s1'] + _input
def s2m3(step, sL, s, _input):
s['s2'] = s['s2'] + _input
# Exogenous States
proc_one_coef_A = 0.7
proc_one_coef_B = 1.3
def es3p1(step, sL, s, _input):
s['s3'] = s['s3'] * bound_norm_random(seed['a'], proc_one_coef_A, proc_one_coef_B)
def es4p2(step, sL, s, _input):
s['s4'] = s['s4'] * bound_norm_random(seed['b'], proc_one_coef_A, proc_one_coef_B)
def es5p2(step, sL, s, _input):
s['timestamp'] = ep_time_step(s, s['timestamp'], seconds=1)
# Environment States
def env_a(x):
return x
def env_b(x):
return x
def what_ever(x):
return x + 1
# Genesis States
state_dict = {
's1': Decimal(0.0),
's2': Decimal(0.0),
's3': Decimal(1.0),
's4': Decimal(1.0),
'timestamp': '2018-10-01 15:16:24'
}
exogenous_states = {
"s3": es3p1,
"s4": es4p2,
"timestamp": es5p2
}
env_processes = {
"s3": env_proc('2018-10-01 15:16:25', env_a),
"s4": env_proc('2018-10-01 15:16:25', env_b)
}
mechanisms = {
"m1": {
"behaviors": {
"b1": b1m1,
"b2": b2m1
},
"states": {
"s1": s1m1,
"s2": s2m1,
}
},
"m2": {
"behaviors": {
"b1": b1m2,
"b2": b2m2
},
"states": {
"s1": s1m2,
"s2": s2m2,
}
},
"m3": {
"behaviors": {
"b1": b1m3,
"b2": b2m3
},
"states": {
"s1": s1m3,
"s2": s2m3,
}
}
}
sim_config = {
"N": 2
}

2
ui/test.py Normal file
View File

@ -0,0 +1,2 @@
from engine import run
run.main()