cadCAD/SimCAD/engine/__init__.py

65 lines
2.7 KiB
Python

from pathos.multiprocessing import ProcessingPool as Pool
import pandas as pd
from tabulate import tabulate
from SimCAD.utils import flatten
from SimCAD.utils.ui import create_tensor_field
from SimCAD.utils.configProcessor import generate_config
class ExecutionContext(object):
def __init__(self):
def parallelize_simulations(fs, states_list, configs, env_processes, Ts, Ns):
l = list(zip(fs, states_list, configs, env_processes, Ts, Ns))
with Pool(len(configs)) as p:
results = p.map(lambda t: t[0](t[1], t[2], t[3], t[4], t[5]), l)
return results
self.parallelize_simulations = parallelize_simulations
class Executor(object):
def __init__(self, ExecutionContext, configs):
from SimCAD.engine.simulation import Executor
def execute():
ec = ExecutionContext()
print(configs)
states_lists, Ts, Ns, eps, configs_struct, env_processes, mechanisms, simulation_execs = \
[], [], [], [], [], [], [], []
config_idx = 0
for x in configs:
states_lists.append([x.state_dict])
Ts.append(x.sim_config['T'])
Ns.append(x.sim_config['N'])
eps.append(list(x.exogenous_states.values()))
configs_struct.append(generate_config(x.state_dict, x.mechanisms, eps[config_idx]))
env_processes.append(x.env_processes)
mechanisms.append(x.mechanisms)
simulation_execs.append(Executor(x.behavior_ops).simulation)
config_idx += 1
# Dimensions: N x r x mechs
if len(configs) > 1:
simulations = ec.parallelize_simulations(simulation_execs, states_lists, configs_struct, env_processes, Ts, Ns)
for result, mechanism, ep in list(zip(simulations, mechanisms, eps)):
print(tabulate(create_tensor_field(mechanism, ep), headers='keys', tablefmt='psql'))
print(tabulate(pd.DataFrame(flatten(result)), headers='keys', tablefmt='psql'))
else:
print('single note')
simulation, states_list, config = simulation_execs.pop(), states_lists.pop(), configs_struct.pop()
env_process = env_processes.pop()
# simulations = [simulation(states_list, config, env_processes, T, N)]
# behavior_ops, states_list, configs, env_processes, time_seq, runs
# result = simulation(states_list1, config1, conf1.env_processes, T, N)
# return pd.DataFrame(flatten(result))
self.ExecutionContext = ExecutionContext
self.main = execute