diff --git a/configuration/__init__.py b/configuration/__init__.py new file mode 100644 index 0000000..9f1848c --- /dev/null +++ b/configuration/__init__.py @@ -0,0 +1,11 @@ +configs = [] + +class Config(object): + def __init__(self, sim_config, state_dict, seed, exogenous_states, env_processes, behavior_ops, mechanisms): + self.sim_config = sim_config + self.state_dict = state_dict + self.seed = seed + self.exogenous_states = exogenous_states + self.env_processes = env_processes + self.behavior_ops = behavior_ops + self.mechanisms = mechanisms diff --git a/engine/__init__.py b/engine/__init__.py index e69de29..f5117de 100644 --- a/engine/__init__.py +++ b/engine/__init__.py @@ -0,0 +1,18 @@ +# from pathos.multiprocessing import ProcessingPool as Pool +# +# class Multiproc(object): +# +# def __init__(self, fs, states_list, configs, env_processes, Ts, Ns): +# self.fs = fs +# self.states_list = states_list +# self.configs = configs +# self.env_processes = env_processes +# self.Ts = Ts +# self.Ns = Ns +# +# def parallelize_simulations(self): +# l = list(zip(self.fs, self.states_list, self.configs, self.env_processes, self.Ts, self.Ns)) +# with Pool(len(self.configs)) as p: +# results = p.map(lambda t: t[0](t[1], t[2], t[3], t[4], t[5]), l) +# +# return results \ No newline at end of file diff --git a/engine/mechanismExecutor.py b/engine/mechanism.py similarity index 100% rename from engine/mechanismExecutor.py rename to engine/mechanism.py diff --git a/engine/multiproc.py b/engine/multiproc.py deleted file mode 100644 index ab9e82c..0000000 --- a/engine/multiproc.py +++ /dev/null @@ -1,8 +0,0 @@ -from pathos.multiprocessing import ProcessingPool as Pool - - -def parallelize_simulations(fs, states_list, configs, env_processes, T, N): - l = list(zip(fs, states_list, configs, env_processes)) - with Pool(len(configs)) as p: - results = p.map(lambda x: x[0](x[1], x[2], x[3], T, N), l) - return results \ No newline at end of file diff --git a/engine/run.py b/engine/run.py deleted file mode 100644 index ac0139b..0000000 --- a/engine/run.py +++ /dev/null @@ -1,52 +0,0 @@ -import pandas as pd -from tabulate import tabulate - -from engine.configProcessor import generate_config -from engine.mechanismExecutor import Executor -from utils.engine import flatten -from utils.ui import create_tensor_field -from engine.multiproc import parallelize_simulations - -# from ui.config import state_dict, mechanisms, exogenous_states, env_processes, sim_config - -import ui.config1 as conf1 -import ui.config2 as conf2 - -def main(): - states_list1 = [conf1.state_dict] - states_list2 = [conf2.state_dict] - states_lists = [states_list1,states_list2] - - T = conf1.sim_config['T'] - N = conf2.sim_config['N'] - - ep1 = list(conf1.exogenous_states.values()) - ep2 = list(conf2.exogenous_states.values()) - eps = [ep1, ep2] - - config1 = generate_config(conf1.state_dict, conf1.mechanisms, ep1) - config2 = generate_config(conf2.state_dict, conf2.mechanisms, ep2) - configs = [config1, config2] - - env_processes = [conf1.env_processes, conf2.env_processes] - - # Dimensions: N x r x mechs - - simulation1 = Executor(conf1.behavior_ops).simulation - simulation2 = Executor(conf2.behavior_ops).simulation - simulation_execs = [simulation1,simulation2] - - - if len(configs) > 1: - simulations = parallelize_simulations(simulation_execs, states_lists, configs, env_processes, T, N) - # else: - # simulations = [simulation(states_list1, configs[0], 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)) - - mechanisms = [conf1.mechanisms, conf2.mechanisms] - 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')) \ No newline at end of file diff --git a/runtime/__init__.py b/runtime/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/runtime/multiproc.py b/runtime/multiproc.py new file mode 100644 index 0000000..da420d3 --- /dev/null +++ b/runtime/multiproc.py @@ -0,0 +1,9 @@ +from pathos.multiprocessing import ProcessingPool as Pool + + +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 \ No newline at end of file diff --git a/runtime/run.py b/runtime/run.py new file mode 100644 index 0000000..df40cab --- /dev/null +++ b/runtime/run.py @@ -0,0 +1,49 @@ +import pandas as pd +from tabulate import tabulate +from configuration import configs +from utils.engine import flatten +from utils.ui import create_tensor_field +from engine.configProcessor import generate_config +from engine.mechanism import Executor +from runtime.multiproc import parallelize_simulations + +# from ui import config1, config2 + +def main(): + 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 = 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)) + + diff --git a/test.py b/test.py index 43e5f85..cac1ef4 100644 --- a/test.py +++ b/test.py @@ -1,4 +1,5 @@ -from engine import run +from runtime import run +from ui import config1, config2 from tabulate import tabulate result = run.main() print(tabulate(result, headers='keys', tablefmt='psql')) \ No newline at end of file diff --git a/ui/config1.py b/ui/config1.py index d1d2400..7a0d661 100644 --- a/ui/config1.py +++ b/ui/config1.py @@ -1,8 +1,6 @@ +from configuration import Config, configs from utils.configuration import * from fn.op import foldr -from fn import _ -from fn.func import curried - import numpy as np from decimal import Decimal @@ -160,3 +158,5 @@ sim_config = { "N": 2, "T": range(5) } + +configs.append(Config(sim_config, state_dict, seed, exogenous_states, env_processes, behavior_ops, mechanisms)) diff --git a/ui/config2.py b/ui/config2.py index 6bc52de..6ec8fe5 100644 --- a/ui/config2.py +++ b/ui/config2.py @@ -1,7 +1,6 @@ +from configuration import Config, configs from utils.configuration import * from fn.op import foldr - - import numpy as np from decimal import Decimal @@ -160,4 +159,6 @@ mechanisms = { sim_config = { "N": 2, "T": range(5) -} \ No newline at end of file +} + +configs.append(Config(sim_config, state_dict, seed, exogenous_states, env_processes, behavior_ops, mechanisms)) \ No newline at end of file