From 73c6d21f12e987d196b1792f28048a83b8e408c8 Mon Sep 17 00:00:00 2001 From: "Joshua E. Jodesty" Date: Tue, 8 Jan 2019 11:29:09 -0500 Subject: [PATCH 1/9] check comments --- SimCAD/configuration/utils/behaviorAggregation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/SimCAD/configuration/utils/behaviorAggregation.py b/SimCAD/configuration/utils/behaviorAggregation.py index abde5d6..814bd7a 100644 --- a/SimCAD/configuration/utils/behaviorAggregation.py +++ b/SimCAD/configuration/utils/behaviorAggregation.py @@ -28,7 +28,6 @@ def sum_dict_values(): return foldr_dict_vals(add) # AttributeError: 'int' object has no attribute 'keys' -# config7c @curried def dict_op(f, d1, d2): def set_base_value(target_dict, source_dict, key): From ae25a9ff0485c67c735cbe58ad3076cbcdc653d2 Mon Sep 17 00:00:00 2001 From: "Joshua E. Jodesty" Date: Thu, 10 Jan 2019 10:12:15 -0500 Subject: [PATCH 2/9] update setup --- SimCAD/__init__.py | 1 + LICENSE.txt => licenses/LICENSE.txt | 0 setup.py | 16 ++++++++++++++-- 3 files changed, 15 insertions(+), 2 deletions(-) rename LICENSE.txt => licenses/LICENSE.txt (100%) diff --git a/SimCAD/__init__.py b/SimCAD/__init__.py index 206f79c..b4234cb 100644 --- a/SimCAD/__init__.py +++ b/SimCAD/__init__.py @@ -1 +1,2 @@ +name = "SimCAD" configs = [] \ No newline at end of file diff --git a/LICENSE.txt b/licenses/LICENSE.txt similarity index 100% rename from LICENSE.txt rename to licenses/LICENSE.txt diff --git a/setup.py b/setup.py index 369eacb..4947cc1 100644 --- a/setup.py +++ b/setup.py @@ -1,11 +1,23 @@ from setuptools import setup +long_description = "SimCAD is a differential games based simulation software package for research, validation, and \ + Computer Aided Design of economic systems. An economic system is treated as a state based model and defined through \ + a set of endogenous and exogenous state variables which are updated through mechanisms and environmental processes, \ + respectively. Behavioral models, which may be deterministic or stochastic, provide the evolution of the system \ + within the action space of the mechanisms. Mathematical formulations of these economic games treat agent utility as \ + derived from state rather than direct from action, creating a rich dynamic modeling framework. Simulations may be \ + run with a range of initial conditions and parameters for states, behaviors, mechanisms, and environmental \ + processes to understand and visualize network behavior under various conditions. Support for A/B testing policies, \ + monte carlo analysis and other common numerical methods is provided." + setup(name='SimCAD', version='0.1', - description='Sim-Cad Enigne', + description="SimCAD: a differential games based simulation software package for research, validation, and \ + Computer Aided Design of economic systems", + long_description = long_description, url='https://github.com/BlockScience/DiffyQ-SimCAD', author='Joshua E. Jodesty', author_email='joshua@block.science', - # license='?????', + license='licenses', packages=['SimCAD'], zip_safe=False) \ No newline at end of file From f9f945c20f1dd11a87177b4911b4d6f056faf1ca Mon Sep 17 00:00:00 2001 From: "Joshua E. Jodesty" Date: Thu, 10 Jan 2019 13:44:55 -0500 Subject: [PATCH 3/9] init --- .gitignore | 14 ++ LICENSE.txt | 119 ++++++++++++ README.md | 80 ++++++++ SimCAD/__init__.py | 2 + SimCAD/configuration/__init__.py | 97 ++++++++++ SimCAD/configuration/utils/__init__.py | 58 ++++++ .../utils/behaviorAggregation.py | 45 +++++ SimCAD/engine/__init__.py | 75 ++++++++ SimCAD/engine/simulation.py | 92 ++++++++++ SimCAD/engine/utils.py | 33 ++++ SimCAD/utils/__init__.py | 24 +++ Simulation.md | 151 ++++++++++++++++ demos/sim_test.py | 37 ++++ demos/test.ipynb | 137 ++++++++++++++ requirements.txt | 3 + setup.py | 23 +++ simulations/validation/config1.py | 171 ++++++++++++++++++ simulations/validation/config2.py | 171 ++++++++++++++++++ 18 files changed, 1332 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 SimCAD/__init__.py create mode 100644 SimCAD/configuration/__init__.py create mode 100644 SimCAD/configuration/utils/__init__.py create mode 100644 SimCAD/configuration/utils/behaviorAggregation.py create mode 100644 SimCAD/engine/__init__.py create mode 100644 SimCAD/engine/simulation.py create mode 100644 SimCAD/engine/utils.py create mode 100644 SimCAD/utils/__init__.py create mode 100644 Simulation.md create mode 100644 demos/sim_test.py create mode 100644 demos/test.ipynb create mode 100644 requirements.txt create mode 100644 setup.py create mode 100644 simulations/validation/config1.py create mode 100644 simulations/validation/config2.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ec1adb --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +demos +SimCAD +simularions +setup.py +build + +.ipynb_checkpoints +.DS_Store +.idea +SimCAD.egg-info +__pycache__ +Pipfile +Pipfile.lock +.mypy_cache \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..04c5891 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,119 @@ +TRIAL LICENSE AGREEMENT + +BACKGROUND + +Company has developed and intends to market and license a certain software product and service called ”SimCAD” which, +among other things, is a scientific engineering simulation tool (“Software”). Company wishes to provide access, on a +trial basis, to users of a “beta” version of the Software to test and provide feedback to Company. Licensee wishes to +participate in Company’s beta trial of the Software and to provide feedback to Company with respect to Licensee’s use +thereof. + +Accordingly, the parties hereby agree as follows: + +1. BETA PRODUCT. + +This Agreement applies to any pre­release version of the Software and any updates and changes thereto during the Term +(collectively, “Beta Product”). As an essential condition of this Agreement, Licensee understands and acknowledges that: +(a) Licensee is participating in a beta test of the Beta Product; (b) the Beta Product has not been field tested or +trialed; and (c) the Beta Product may not operate properly or be error free and may not perform all functions for +which it is intended or represented. + +2. FEEDBACK. + +As a condition of this Agreement, during the Term of this Agreement, Licensee agrees to provide Company with comments, +feedback, criticisms, and suggestions for changes to the Beta Product (“Feedback”), and to help Company identify errors +or malfunctions, and performance issues, in the operation of the Beta Product, as Company may reasonably request. All +rights to any Feedback or other intellectual property derived from Licensee’s use of or relating to the Beta Product, +as well any data collected from the use of the Beta Product, belong solely to Company and Licensee hereby irrevocably +assigns all such rights to Company. Company reserves the right to use all Feedback and data collected as a result of the +use of the Beta Product to advertise and promote the Company and the Software. + +3. LICENSE AND RESERVATION OF RIGHTS. + +3.1 Subject to the terms and conditions set forth in this Agreement, Company hereby grants Licensee, and Licensee +accepts, during the Term, a non­exclusive, royalty­free, revocable, non­transferable, limited license to access and use +the Beta Product for its internal, non­commercial use for evaluation purposes only, and to give permission to employees +of Licensee and employees of Licensee’s subsidiaries (“Permitted Users”) to use the Beta Product in accordance with the +foregoing. + +3.2 The Beta Product and the Software comprise the intellectual property of Company. All right, title and interest in +and to the Beta Product (and, more generally, in and to the Software), and to all Feedback and data arising from its +use, in whole or in part, and all patent, copyright, trade­marks, trade secret and all other intellectual and industrial +property rights therein and the structure, sequence and organization of same, and the media on which such material is +contained belong exclusively to Company. Licensee and its Permitted Users will not, directly or indirectly: reverse +engineer, decompile, disassemble or otherwise attempt to discover the source code, object code or underlying structure, +ideas, know­how or algorithms relevant to the Beta Product; modify, adapt, alter, edit, correct, translate, publish, +sell, transfer, assign, convey, rent, lease, loan, pledge, sublicense, distribute, export, enhance or create derivative +works based on the Beta Product; or remove, alter, cover or otherwise obscure any proprietary notices or labels +displayed on or within the Beta Product any documentation relating thereto. + +4. DISCLAIMER. + +4.1 COMPANY MAKES NO WARRANTIES, WHETHER EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, WITH RESPECT TO THE BETA PRODUCT, +INCLUDING, BUT NOT LIMITED TO, THE AVAILABILITY, QUALITY OR PERFORMANCE OF THE BETA PRODUCT. COMPANY SPECIFICALLY +DISCLAIMS ALL EXPRESS, STATUTORY AND IMPLIED WARRANTIES AND CONDITIONS, INCLUDING, WITHOUT LIMITATION (A) THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON­INFRINGEMENT, (B) ANY WARRANTIES AGAINST HIDDEN +OR LATENT DEFECTS, (C) AND ANY WARRANTIES AND CONDITIONS ARISING OUT OF COURSE OF DEALING OR USAGE OF TRADE AND (D) ANY +WARRANTY OR REPRESENTATION THAT THE BETA PRODUCT IS ERROR­FREE, VIRUS­FREE, SECURE, UNINTERRUPTED, OR FREE FROM +UNAUTHORIZED ACCESS (INCLUDING, BUT NOT LIMITED TO, THIRD PARTY HACKERS OR DENIAL OF SERVICE ATTACKS). THE BETA PRODUCT +IS SUPPLIED ON AN “AS IS”, “AS AVAILABLE” BASIS WITHOUT WARRANTY. + +4.2 NEITHER PARTY SHALL BE LIABLE FOR SPECIAL, INCIDENTAL, PUNITIVE, CONSEQUENTIAL OR INDIRECT DAMAGES OR LOSS +(INCLUDING DEATH AND PERSONAL INJURY), IRRESPECTIVE OF THEIR CAUSE, NOTWITHSTANDING THAT A PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH LOSS OR DAMAGE, NOR FOR ANY CLAIMS FOR SUCH LOSS OR DAMAGE INSTITUTED AGAINST A PARTY OR ITS +CUSTOMERS BY ANY THIRD PARTY. + +5. CONFIDENTIALITY + +5.1 All Confidential Information disclosed by either party shall be kept by the receiving party in strict confidence and +shall not be disclosed to any third party without the disclosing party’s express written consent. For purposes of this +Agreement, “Confidential Information” means all information regarding either party’s business which has been marked or +is otherwise communicated as being “proprietary” or “confidential” or which reasonably should be known by the receiving +party to be proprietary or confidential information. Without limiting the generality of the foregoing, Confidential +Information of Company includes non­public information regarding features, functionality and performance of the Beta +Product, including all Feedback and related data. Notwithstanding the foregoing, each party’s confidentiality +obligations hereunder shall not apply to information that: (a) is already known to the receiving party without a +pre­existing restriction as to disclosure; (b) is or becomes publicly available without fault of the receiving party; +(c) is rightfully obtained by the receiving party from a third party without restriction as to disclosure, or is +approved for release by written authorization of the disclosing party; (d) is developed independently by the receiving +party without use of the disclosing party’s Confidential Information; or (e) is required to be disclosed by law or +regulation, including, but not limited to, supplying such information or making such statements or disclosures relating +to this Agreement before any competent court, governmental agency or authority in response to a lawful requirement or +request from a court of governmental agency or authority, provided that the disclosing party shall give the other party +prompt notice of such request, to the extent practicable, so that the other party may seek (at its sole cost and +expense) an appropriate protective order or similar relief. + +5.2 In the event of a breach of Sections 2, 3 or this Section 5, the non­breaching party shall be entitled to seek +equitable relief to protect its interests, including, but not limited to, injunctive relief. In the event of expiration +or earlier termination of this Agreement, each party shall immediately return to the other party such other party’s +Confidential Information, or at such other party’s option, destroy any remaining Confidential Information and certify +that such destruction has taken place. + +6. FEES; EXPENSES. + +Neither party shall be entitled to any compensation in connection with this Agreement or its use or provision of the +Beta Product. Each party shall bear its own costs and expenses arising from this Agreement and its use or provision of +the Beta Product, as the case may be. + +7. TERM OF AGREEMENT. + +This Agreement shall begin on the Effective Date and shall continue until it has been terminated (such period, the +“Term”). Either party shall have the right to terminate this Agreement at any time on one (1) month written notice to +the other party, or in the case of a breach of this Agreement by Licensee or its Permitted Users, Company may terminate +this Agreement immediately on written notice to Licensee. Upon termination of this Agreement, all rights granted to +Licensee (and any Permitted User) under this Agreement will immediately terminate and Licensee (and all Permitted Users) +must immediately cease all use of the Beta Product at such time. Notwithstanding any termination of this Agreement, +Sections 2, 3.2, 4, 5, 6, this Section 7 and Section 8 shall survive and remain binding on the parties. + +8. MISCELLANEOUS. + +This Agreement shall be governed by and construed in accordance with the laws of the State of New York. All disputes +relating to this Agreement shall be resolved in the federal and state courts of New York County, New York and the +parties submit to the jurisdiction of such courts. This Agreement does not create any agency, partnership, or joint +venture relationship between Licensee and Company. This Agreement is the entire understanding of the parties with +respect to the subject matter hereof and supersedes any previous or contemporaneous communications, representations, +warranties, discussions, arrangements or commitments, whether oral or written with respect to such subject matter. This +Agreement cannot be amended except by a written amendment that expressly refers to this Agreement and is signed by an +authorized representative of each party. This Agreement may be executed in one or more counterparts, including via +facsimile or email (or any other electronic means such as “.pdf” or “.tiff” files), each of which shall be deemed an +original, and all of which shall constitute one and the same Agreement. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..97f3511 --- /dev/null +++ b/README.md @@ -0,0 +1,80 @@ +# SimCad +**Warning**: +**Do not** publish this package / software to **any** software repository **except** one permitted by BlockScience. + +**Description:** + +SimCAD is a differential games based simulation software package for research, validation, and Computer \ +Aided Design of economic systems. An economic system is treated as a state based model and defined through a \ +set of endogenous and exogenous state variables which are updated through mechanisms and environmental \ +processes, respectively. Behavioral models, which may be deterministic or stochastic, provide the evolution of \ +the system within the action space of the mechanisms. Mathematical formulations of these economic games \ +treat agent utility as derived from state rather than direct from action, creating a rich dynamic modeling framework. + +Simulations may be run with a range of initial conditions and parameters for states, behaviors, mechanisms, \ +and environmental processes to understand and visualize network behavior under various conditions. Support for \ +A/B testing policies, monte carlo analysis and other common numerical methods is provided. + +**1. Install Dependencies:** +```bash +pip install -r requirements.txt +pip install -e . +``` + +**2. Configure Simulation:** + +Intructions: +`/Simulation.md` + +Examples: +`/simulations/validation/*` + +**3. Import SimCAD & Run Simulation:** + +Example: +`/demos/sim_test.py` or `test.ipynb` + +```python +import pandas as pd +from tabulate import tabulate + +# The following imports NEED to be in the exact order +from SimCAD.engine import ExecutionMode, ExecutionContext, Executor +from simulations.validation import config1, config2 +from SimCAD import configs + +exec_mode = ExecutionMode() + + +print("Simulation Execution 1") +print() +first_config = [configs[0]] # from config1 +single_proc_ctx = ExecutionContext(context=exec_mode.single_proc) +run1 = Executor(exec_context=single_proc_ctx, configs=first_config) +run1_raw_result, tensor_field = run1.main() +result = pd.DataFrame(run1_raw_result) +print() +print("Tensor Field:") +print(tabulate(tensor_field, headers='keys', tablefmt='psql')) +print("Output:") +print(tabulate(result, headers='keys', tablefmt='psql')) +print() + +print("Simulation Execution 2: Pairwise Execution") +print() +multi_proc_ctx = ExecutionContext(context=exec_mode.multi_proc) +run2 = Executor(exec_context=multi_proc_ctx, configs=configs) +for raw_result, tensor_field in run2.main(): + result = pd.DataFrame(raw_result) + print() + print("Tensor Field:") + print(tabulate(tensor_field, headers='keys', tablefmt='psql')) + print("Output:") + print(tabulate(result, headers='keys', tablefmt='psql')) + print() +``` + +The above can be run in Jupyter. +```bash +jupyter notebook +``` diff --git a/SimCAD/__init__.py b/SimCAD/__init__.py new file mode 100644 index 0000000..b4234cb --- /dev/null +++ b/SimCAD/__init__.py @@ -0,0 +1,2 @@ +name = "SimCAD" +configs = [] \ No newline at end of file diff --git a/SimCAD/configuration/__init__.py b/SimCAD/configuration/__init__.py new file mode 100644 index 0000000..400fe9d --- /dev/null +++ b/SimCAD/configuration/__init__.py @@ -0,0 +1,97 @@ +from functools import reduce +from fn.op import foldr +import pandas as pd + +from SimCAD.utils import key_filter +from SimCAD.configuration.utils.behaviorAggregation import dict_elemwise_sum + + +class Configuration: + def __init__(self, sim_config, state_dict, seed, exogenous_states, env_processes, mechanisms, behavior_ops=[foldr(dict_elemwise_sum())]): + 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 + + +class Identity: + def __init__(self, behavior_id={'identity': 0}): + self.beh_id_return_val = behavior_id + + def b_identity(self, step, sL, s): + return self.beh_id_return_val + + def behavior_identity(self, k): + return self.b_identity + + def no_state_identity(self, step, sL, s, _input): + return None + + def state_identity(self, k): + return lambda step, sL, s, _input: (k, s[k]) + + def apply_identity_funcs(self, identity, df, cols): + def fillna_with_id_func(identity, df, col): + return df[[col]].fillna(value=identity(col)) + + return list(map(lambda col: fillna_with_id_func(identity, df, col), cols)) + + +class Processor: + def __init__(self, id=Identity()): + self.id = id + self.b_identity = id.b_identity + self.behavior_identity = id.behavior_identity + self.no_state_identity = id.no_state_identity + self.state_identity = id.state_identity + self.apply_identity_funcs = id.apply_identity_funcs + + def create_matrix_field(self, mechanisms, key): + if key == 'states': + identity = self.state_identity + elif key == 'behaviors': + identity = self.behavior_identity + df = pd.DataFrame(key_filter(mechanisms, key)) + col_list = self.apply_identity_funcs(identity, df, list(df.columns)) + if len(col_list) != 0: + return reduce((lambda x, y: pd.concat([x, y], axis=1)), col_list) + else: + return pd.DataFrame({'empty': []}) + + def generate_config(self, state_dict, mechanisms, exo_proc): + + def no_update_handler(bdf, sdf): + if (bdf.empty == False) and (sdf.empty == True): + bdf_values = bdf.values.tolist() + sdf_values = [[self.no_state_identity] * len(bdf_values) for m in range(len(mechanisms))] + return sdf_values, bdf_values + elif (bdf.empty == True) and (sdf.empty == False): + sdf_values = sdf.values.tolist() + bdf_values = [[self.b_identity] * len(sdf_values) for m in range(len(mechanisms))] + return sdf_values, bdf_values + else: + sdf_values = sdf.values.tolist() + bdf_values = bdf.values.tolist() + return sdf_values, bdf_values + + def only_ep_handler(state_dict): + sdf_functions = [ + lambda step, sL, s, _input: (k, v) for k, v in zip(state_dict.keys(), state_dict.values()) + ] + sdf_values = [sdf_functions] + bdf_values = [[self.b_identity] * len(sdf_values)] + return sdf_values, bdf_values + + if len(mechanisms) != 0: + bdf = self.create_matrix_field(mechanisms, 'behaviors') + sdf = self.create_matrix_field(mechanisms, 'states') + sdf_values, bdf_values = no_update_handler(bdf, sdf) + zipped_list = list(zip(sdf_values, bdf_values)) + else: + sdf_values, bdf_values = only_ep_handler(state_dict) + zipped_list = list(zip(sdf_values, bdf_values)) + + return list(map(lambda x: (x[0] + exo_proc, x[1]), zipped_list)) \ No newline at end of file diff --git a/SimCAD/configuration/utils/__init__.py b/SimCAD/configuration/utils/__init__.py new file mode 100644 index 0000000..09bd90b --- /dev/null +++ b/SimCAD/configuration/utils/__init__.py @@ -0,0 +1,58 @@ +from datetime import datetime, timedelta +from decimal import Decimal +from fn.func import curried +import pandas as pd + + +class TensorFieldReport: + def __init__(self, config_proc): + self.config_proc = config_proc + + def create_tensor_field(self, mechanisms, exo_proc, keys=['behaviors', 'states']): + dfs = [self.config_proc.create_matrix_field(mechanisms, k) for k in keys] + df = pd.concat(dfs, axis=1) + for es, i in zip(exo_proc, range(len(exo_proc))): + df['es' + str(i + 1)] = es + df['m'] = df.index + 1 + return df + + +def bound_norm_random(rng, low, high): + # Add RNG Seed + res = rng.normal((high+low)/2,(high-low)/6) + if (reshigh): + res = bound_norm_random(rng, low, high) + return Decimal(res) + + +@curried +def proc_trigger(trigger_step, update_f, step): + if step == trigger_step: + return update_f + else: + return lambda x: x + + +t_delta = timedelta(days=0, minutes=0, seconds=30) +def time_step(dt_str, dt_format='%Y-%m-%d %H:%M:%S', _timedelta = t_delta): + dt = datetime.strptime(dt_str, dt_format) + t = dt + _timedelta + return t.strftime(dt_format) + + +t_delta = timedelta(days=0, minutes=0, seconds=1) +def ep_time_step(s, dt_str, fromat_str='%Y-%m-%d %H:%M:%S', _timedelta = t_delta): + if s['mech_step'] == 0: + return time_step(dt_str, fromat_str, _timedelta) + else: + return dt_str + + +def exo_update_per_ts(ep): + @curried + def ep_decorator(f, y, step, sL, s, _input): + if s['mech_step'] + 1 == 1: + return f(step, sL, s, _input) + else: + return (y, s[y]) + return {es: ep_decorator(f, es) for es, f in ep.items()} \ No newline at end of file diff --git a/SimCAD/configuration/utils/behaviorAggregation.py b/SimCAD/configuration/utils/behaviorAggregation.py new file mode 100644 index 0000000..5bcdd1a --- /dev/null +++ b/SimCAD/configuration/utils/behaviorAggregation.py @@ -0,0 +1,45 @@ +from fn.op import foldr +from fn.func import curried + + +def get_base_value(datatype): + if datatype is str: + return '' + elif datatype is int: + return 0 + elif datatype is list: + return [] + return 0 + + +def behavior_to_dict(v): + return dict(list(zip(map(lambda n: 'b' + str(n + 1), list(range(len(v)))), v))) + + +add = lambda a, b: a + b + + +@curried +def foldr_dict_vals(f, d): + return foldr(f)(list(d.values())) + + +def sum_dict_values(): + return foldr_dict_vals(add) + + +@curried +def dict_op(f, d1, d2): + def set_base_value(target_dict, source_dict, key): + if key not in target_dict: + return get_base_value(type(source_dict[key])) + else: + return target_dict[key] + + key_set = set(list(d1.keys()) + list(d2.keys())) + + return {k: f(set_base_value(d1, d2, k), set_base_value(d2, d1, k)) for k in key_set} + + +def dict_elemwise_sum(): + return dict_op(add) \ No newline at end of file diff --git a/SimCAD/engine/__init__.py b/SimCAD/engine/__init__.py new file mode 100644 index 0000000..4e8bc6d --- /dev/null +++ b/SimCAD/engine/__init__.py @@ -0,0 +1,75 @@ +from pathos.multiprocessing import ProcessingPool as Pool + +from SimCAD.utils import flatten +from SimCAD.configuration import Processor +from SimCAD.configuration.utils import TensorFieldReport +from SimCAD.engine.simulation import Executor as SimExecutor + + +class ExecutionMode: + single_proc = 'single_proc' + multi_proc = 'multi_proc' + + +class ExecutionContext: + def __init__(self, context=ExecutionMode.multi_proc): + self.name = context + self.method = None + + def single_proc_exec(simulation_execs, states_lists, configs_structs, env_processes_list, Ts, Ns): + l = [simulation_execs, states_lists, configs_structs, env_processes_list, Ts, Ns] + simulation, states_list, config, env_processes, T, N = list(map(lambda x: x.pop(), l)) + result = simulation(states_list, config, env_processes, T, N) + return flatten(result) + + 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 + + if context == 'single_proc': + self.method = single_proc_exec + elif context == 'multi_proc': + self.method = parallelize_simulations + + +class Executor: + def __init__(self, exec_context, configs): + self.SimExecutor = SimExecutor + self.exec_method = exec_context.method + self.exec_context = exec_context.name + self.configs = configs + self.main = self.execute + + def execute(self): + config_proc = Processor() + create_tensor_field = TensorFieldReport(config_proc).create_tensor_field + + print(self.exec_context+": "+str(self.configs)) + states_lists, Ts, Ns, eps, configs_structs, env_processes_list, mechanisms, simulation_execs = \ + [], [], [], [], [], [], [], [] + config_idx = 0 + for x in self.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_structs.append(config_proc.generate_config(x.state_dict, x.mechanisms, eps[config_idx])) + env_processes_list.append(x.env_processes) + mechanisms.append(x.mechanisms) + simulation_execs.append(SimExecutor(x.behavior_ops).simulation) + + config_idx += 1 + + if self.exec_context == ExecutionMode.single_proc: + tensor_field = create_tensor_field(mechanisms.pop(), eps.pop()) + result = self.exec_method(simulation_execs, states_lists, configs_structs, env_processes_list, Ts, Ns) + return result, tensor_field + elif self.exec_context == ExecutionMode.multi_proc: + if len(self.configs) > 1: + simulations = self.exec_method(simulation_execs, states_lists, configs_structs, env_processes_list, Ts, Ns) + results = [] + for result, mechanism, ep in list(zip(simulations, mechanisms, eps)): + results.append((flatten(result), create_tensor_field(mechanism, ep))) + return results diff --git a/SimCAD/engine/simulation.py b/SimCAD/engine/simulation.py new file mode 100644 index 0000000..9b91402 --- /dev/null +++ b/SimCAD/engine/simulation.py @@ -0,0 +1,92 @@ +from copy import deepcopy +from fn.op import foldr, call +from SimCAD.engine.utils import engine_exception + +id_exception = engine_exception(KeyError, KeyError, None) + + +class Executor: + def __init__(self, behavior_ops, behavior_update_exception=id_exception, state_update_exception=id_exception): + self.behavior_ops = behavior_ops + self.state_update_exception = state_update_exception + self.behavior_update_exception = behavior_update_exception + + def get_behavior_input(self, step, sL, s, funcs): + ops = self.behavior_ops[::-1] + + def get_col_results(step, sL, s, funcs): + return list(map(lambda f: f(step, sL, s), funcs)) + + return foldr(call, get_col_results(step, sL, s, funcs))(ops) + + def apply_env_proc(self, env_processes, state_dict, step): + for state in state_dict.keys(): + if state in list(env_processes.keys()): + env_state = env_processes[state] + if (env_state.__name__ == '_curried') or (env_state.__name__ == 'proc_trigger'): + state_dict[state] = env_state(step)(state_dict[state]) + else: + state_dict[state] = env_state(state_dict[state]) + + def mech_step(self, m_step, sL, state_funcs, behavior_funcs, env_processes, t_step, run): + last_in_obj = sL[-1] + + _input = self.state_update_exception(self.get_behavior_input(m_step, sL, last_in_obj, behavior_funcs)) + + last_in_copy = dict([self.behavior_update_exception(f(m_step, sL, last_in_obj, _input)) for f in state_funcs]) + + for k in last_in_obj: + if k not in last_in_copy: + last_in_copy[k] = last_in_obj[k] + + del last_in_obj + + self.apply_env_proc(env_processes, last_in_copy, last_in_copy['timestamp']) + + last_in_copy["mech_step"], last_in_copy["time_step"], last_in_copy['run'] = m_step, t_step, run + sL.append(last_in_copy) + del last_in_copy + + return sL + + def mech_pipeline(self, states_list, configs, env_processes, t_step, run): + 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 = self.mech_step(m_step, states_list, s_conf, b_conf, env_processes, t_step, run) + m_step += 1 + + t_step += 1 + + return states_list + + def block_pipeline(self, states_list, configs, env_processes, time_seq, run): + time_seq = [x + 1 for x in time_seq] + simulation_list = [states_list] + # print(len(configs)) + for time_step in time_seq: + pipe_run = self.mech_pipeline(simulation_list[-1], configs, env_processes, time_step, run) + _, *pipe_run = pipe_run + simulation_list.append(pipe_run) + + return simulation_list + + def simulation(self, states_list, configs, env_processes, time_seq, runs): + pipe_run = [] + for run in range(runs): + run += 1 + states_list_copy = deepcopy(states_list) + head, *tail = self.block_pipeline(states_list_copy, configs, env_processes, time_seq, run) + genesis = head.pop() + genesis['mech_step'], genesis['time_step'], genesis['run'] = 0, 0, run + first_timestep_per_run = [genesis] + tail.pop(0) + pipe_run += [first_timestep_per_run] + tail + del states_list_copy + + return pipe_run \ No newline at end of file diff --git a/SimCAD/engine/utils.py b/SimCAD/engine/utils.py new file mode 100644 index 0000000..bcf1507 --- /dev/null +++ b/SimCAD/engine/utils.py @@ -0,0 +1,33 @@ +from datetime import datetime +from fn.func import curried + + +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] + + +@curried +def engine_exception(ErrorType, error_message, exception_function, try_function): + try: + return try_function + except ErrorType: + print(error_message) + return exception_function diff --git a/SimCAD/utils/__init__.py b/SimCAD/utils/__init__.py new file mode 100644 index 0000000..435ee87 --- /dev/null +++ b/SimCAD/utils/__init__.py @@ -0,0 +1,24 @@ +def pipe(x): + return x + + +def print_pipe(x): + print(x) + return x + + +def flatten(l): + return [item for sublist in l for item in sublist] + + +def flatmap(f, items): + return list(map(f, items)) + + +def key_filter(l, keyname): + return [v[keyname] for k, v in l.items()] + + +def rename(new_name, f): + f.__name__ = new_name + return f \ No newline at end of file diff --git a/Simulation.md b/Simulation.md new file mode 100644 index 0000000..81d1ece --- /dev/null +++ b/Simulation.md @@ -0,0 +1,151 @@ +# SimmCAD Documentation + +## Introduction + +A blockchain is a distributed ledger with economic agents transacting in a network. The state of the network evolves with every new transaction, which can be a result of user behaviors, protocol-defined system mechanisms, or external processes. + +It is not uncommon today for blockchain projects to announce a set of rules for their network and make claims about their system level behvaior. However, the validity of those claims is hardly validated. Furthermore, it is difficult to know the potential system-level impact when the network is considering an upgrade to their system rules and prameters. + +To rigorously and reliably analyze, design, and improve cryptoeconomic networks, we are introducing this Computer Aided Design Engine where we define a cryptoeconomic network with its state and exogneous variables, model transactions as a result of agent behaviors, state mechanisms, and environmental processes. We can then run simulations with different initial states, mechanisms, environmental processes to understand and visualize network behavior under different conditions. + +## State Variables and Transitions + +We now define variables and different transition mechanisms that will be inputs to the simulation engine. + +- ***State variables*** are defined to capture the shape and property of the network, such as a vector or a dictionary that captures all user balances. +- ***Exogenous variables*** are variables that represent external input and signal. They are only affected by environmental processes and are not affected by system mechanisms. Nonetheless, exgoneous variables can be used as an input to a mechanism that impacts state variables. They can be considered as read-only variables to the system. +- ***Behaviors per transition*** model agent behaviors in reaction to state variables and exogenous variables. The resulted user action will become an input to state mechanisms. Note that user behaviors should not directly update value of state variables. +- ***State mechanisms per transition*** are system defined mechanisms that take user actions and other states as inputs and produce updates to the value of state variables. +- ***Exogenous state updates*** specify how exogenous variables evolve with time which can indirectly impact state variables through behavior and state mechanisms. +- ***Environmental processes*** model external changes that directly impact state or exogenous variables at specific timestamps or conditions. + +A state evolves to another state via state transition. Each transition is composed of behavior and state mechanisms as functions of state and exogenous variables. A flow of the state transition is as follows. + +Given some state and exogenous variables of the system at the onset of a state transition, agent behavior takes in these variables as input and return a set of agent actions. This models after agent behavior and reaction to a set of variables. Given these agent actions, state mechanism, as defined by the protocol, takes these actions, state, and exogenous variables as inputs and return a new set of state variables. + +## System Configuration File + +Simulation engine takes in system configuration files, e.g. `config.py`, where all the above variables and mechanisms are defined. The following import statements should be added at the beginning of the configuration files. +```python +from decimal import Decimal +import numpy as np +from datetime import timedelta + +from SimCAD import configs +from SimCAD.configuration import Configuration +from SimCAD.configuration.utils import exo_update_per_ts, proc_trigger, bound_norm_random, \ + ep_time_step +``` + +State variables and their initial values can be defined as follows. Note that `timestamp` is a required field for this iteration of SimCAD for `env_proc` to work. Future iterations will strive to make this more generic and timestamp optional. +```python +genesis_dict = { + 's1': Decimal(0.0), + 's2': Decimal(0.0), + 's3': Decimal(1.0), + 'timestamp': '2018-10-01 15:16:24' +} +``` + +Each potential transition and its state and behavior mechanisms can be defined in the following dictionary object. +```python +transitions = { + "m1": { + "behaviors": { + "b1": b1m1, + "b2": b2m1 + }, + "states": { + "s1": s1m1, + "s2": s2m1 + } + }, + "m2": {...} +} +``` +Every behavior per transition should return a dictionary as actions taken by the agents. They will then be aggregated through addition in this version of SimCAD. Some examples of behaviors per transition are as follows. More flexible and user-defined aggregation functions will be introduced in future iterations but no example is provided at this point. +```python +def b1m1(step, sL, s): + return {'param1': 1} + +def b1m2(step, sL, s): + return {'param1': 'a', 'param2': 2} + +def b1m3(step, sL, s): + return {'param1': ['c'], 'param2': np.array([10, 100])} +``` +State mechanism per transition on the other hand takes in the output of behavior mechanisms (`_input`) and returns a tuple of the name of the variable and the new value for the variable. Some examples of a state mechanism per transition are as follows. Note that each state mechanism is supposed to change one state variable at a time. Changes to multiple state variables should be done in separate mechanisms. +```python +def s1m1(step, sL, s, _input): + y = 's1' + x = _input['param1'] + 1 + return (y, x) + +def s1m2(step, sL, s, _input): + y = 's1' + x = _input['param1'] + return (y, x) +``` +Exogenous state update functions, for example `es3p1`, `es4p2` and `es5p2` below, update exogenous variables at every timestamp. Note that every timestamp is consist of all behaviors and state mechanisms in the order defined in `transitions` dictionary. If `exo_update_per_ts` is not used, exogenous state updates will be applied at every mechanism step (`m1`, `m2`, etc). Otherwise, exogenous state updates will only be applied once for every timestamp after all the mechanism steps are executed. +```python +exogenous_states = exo_update_per_ts( + { + "s3": es3p1, + "s4": es4p2, + "timestamp": es5p2 + } +) +``` +To model randomness, we should also define pseudorandom seeds in the configuration as follows. +```python +seed = { + 'z': np.random.RandomState(1), + 'a': np.random.RandomState(2), + 'b': np.random.RandomState(3), + 'c': np.random.RandomState(3) +} +``` +SimCAD currently supports generating random number from a normal distribution through `bound_norm_random` with `min` and `max` values specified. Examples of environmental processes with randomness are as follows. We also define timestamp format with `ts_format` and timestamp changes with `t_delta`. Users can define other distributions to update exogenous variables. +```python +proc_one_coef_A = 0.7 +proc_one_coef_B = 1.3 + +def es3p1(step, sL, s, _input): + y = 's3' + x = s['s3'] * bound_norm_random(seed['a'], proc_one_coef_A, proc_one_coef_B) + return (y, x) + +def es4p2(step, sL, s, _input): + y = 's4' + x = s['s4'] * bound_norm_random(seed['b'], proc_one_coef_A, proc_one_coef_B) + return (y, x) + +ts_format = '%Y-%m-%d %H:%M:%S' +t_delta = timedelta(days=0, minutes=0, seconds=1) +def es5p2(step, sL, s, _input): + y = 'timestamp' + x = ep_time_step(s, s['timestamp'], fromat_str=ts_format, _timedelta=t_delta) + return (y, x) +``` +User can also define specific external events such as market shocks at specific timestamps through `env_processes` with `proc_trigger`. An environmental process with no `proc_trigger` will be called at every timestamp. In the example below, it will return the value of `s3` at every timestamp. Logical event triggers, such as a big draw down in exogenous variables, will be supported in a later version of SimCAD. +```python +def env_a(x): + return x +def env_b(x): + return 10 + +env_processes = { + "s3": env_a, + "s4": proc_trigger('2018-10-01 15:16:25', env_b) +} +``` + +Lastly, we set the overall simulation configuration and initialize the `Configuration` class with the following. `T` denotes the time range and `N` refers to the number of simulation runs. Each run will start from the same initial states and run for `T` time range. Every transition is consist of behaviors, state mechanisms, exogenous updates, and potentially environmental processes. All of these happen within one time step in the simulation. +```python +sim_config = { + "N": 2, + "T": range(5) +} + +configs.append(Configuration(sim_config, state_dict, seed, exogenous_states, env_processes, mechanisms)) +``` diff --git a/demos/sim_test.py b/demos/sim_test.py new file mode 100644 index 0000000..ae58ba4 --- /dev/null +++ b/demos/sim_test.py @@ -0,0 +1,37 @@ +import pandas as pd +from tabulate import tabulate + +# The following imports NEED to be in the exact order +from SimCAD.engine import ExecutionMode, ExecutionContext, Executor +from simulations.validation import config1, config2 +from SimCAD import configs + +exec_mode = ExecutionMode() + + +print("Simulation Execution 1") +print() +first_config = [configs[0]] # from config1 +single_proc_ctx = ExecutionContext(context=exec_mode.single_proc) +run1 = Executor(exec_context=single_proc_ctx, configs=first_config) +run1_raw_result, tensor_field = run1.main() +result = pd.DataFrame(run1_raw_result) +print() +print("Tensor Field:") +print(tabulate(tensor_field, headers='keys', tablefmt='psql')) +print("Output:") +print(tabulate(result, headers='keys', tablefmt='psql')) +print() + +print("Simulation Execution 2: Pairwise Execution") +print() +multi_proc_ctx = ExecutionContext(context=exec_mode.multi_proc) +run2 = Executor(exec_context=multi_proc_ctx, configs=configs) +for raw_result, tensor_field in run2.main(): + result = pd.DataFrame(raw_result) + print() + print("Tensor Field:") + print(tabulate(tensor_field, headers='keys', tablefmt='psql')) + print("Output:") + print(tabulate(result, headers='keys', tablefmt='psql')) + print() \ No newline at end of file diff --git a/demos/test.ipynb b/demos/test.ipynb new file mode 100644 index 0000000..e3c6800 --- /dev/null +++ b/demos/test.ipynb @@ -0,0 +1,137 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "# The following imports NEED to be in the exact order\n", + "from SimCAD.engine import ExecutionMode, ExecutionContext, Executor\n", + "from simulations.validation import config1, config2\n", + "from SimCAD import configs\n", + "\n", + "exec_mode = ExecutionMode()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Simulation Execution 1\")\n", + "print()\n", + "first_config = [configs[0]] # from config1\n", + "single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)\n", + "run1 = Executor(exec_context=single_proc_ctx, configs=first_config)\n", + "run1_raw_result, raw_tensor_field = run1.main()\n", + "result = pd.DataFrame(run1_raw_result)\n", + "tensor_field = pd.DataFrame(raw_tensor_field)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Tensor Field:\")\n", + "tensor_field" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Output:\")\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Simulation Execution 2: Pairwise Execution\")\n", + "print()\n", + "multi_proc_ctx = ExecutionContext(context=exec_mode.multi_proc)\n", + "run2 = Executor(exec_context=multi_proc_ctx, configs=configs)\n", + "results = []\n", + "tensor_fields = []\n", + "for raw_result, raw_tensor_field in run2.main():\n", + " results.append(pd.DataFrame(raw_result))\n", + " tensor_fields.append(pd.DataFrame(raw_tensor_field))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "print(\"Tensor Field A:\")\n", + "tensor_fields[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Output A:\")\n", + "results[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Tensor Field B:\")\n", + "tensor_fields[1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Output B:\")\n", + "results[1]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..48a300b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +pathos +fn +tabulate \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..5165a7f --- /dev/null +++ b/setup.py @@ -0,0 +1,23 @@ +from setuptools import setup + +long_description = "SimCAD is a differential games based simulation software package for research, validation, and \ + Computer Aided Design of economic systems. An economic system is treated as a state based model and defined through \ + a set of endogenous and exogenous state variables which are updated through mechanisms and environmental processes, \ + respectively. Behavioral models, which may be deterministic or stochastic, provide the evolution of the system \ + within the action space of the mechanisms. Mathematical formulations of these economic games treat agent utility as \ + derived from state rather than direct from action, creating a rich dynamic modeling framework. Simulations may be \ + run with a range of initial conditions and parameters for states, behaviors, mechanisms, and environmental \ + processes to understand and visualize network behavior under various conditions. Support for A/B testing policies, \ + monte carlo analysis and other common numerical methods is provided." + +setup(name='SimCAD', + version='0.1', + description = "SimCAD: a differential games based simulation software package for research, validation, and \ + Computer Aided Design of economic systems", + long_description=long_description, + url='https://github.com/BlockScience/SimCAD-Beta', + author='Joshua E. Jodesty', + author_email='joshua@block.science', + license='LICENSE.txt', + packages=['SimCAD'], +) \ No newline at end of file diff --git a/simulations/validation/config1.py b/simulations/validation/config1.py new file mode 100644 index 0000000..1d0387e --- /dev/null +++ b/simulations/validation/config1.py @@ -0,0 +1,171 @@ +from decimal import Decimal +import numpy as np +from datetime import timedelta + +from SimCAD import configs +from SimCAD.configuration import Configuration +from SimCAD.configuration.utils import exo_update_per_ts, proc_trigger, bound_norm_random, \ + ep_time_step + + +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 {'param1': 1} +def b2m1(step, sL, s): + return {'param2': 4} + +def b1m2(step, sL, s): + return {'param1': 'a', 'param2': 2} +def b2m2(step, sL, s): + return {'param1': 'b', 'param2': 4} + +def b1m3(step, sL, s): + return {'param1': ['c'], 'param2': np.array([10, 100])} +def b2m3(step, sL, s): + return {'param1': ['d'], 'param2': np.array([20, 200])} + + +# Internal States per Mechanism +def s1m1(step, sL, s, _input): + y = 's1' + x = _input['param1'] + return (y, x) +def s2m1(step, sL, s, _input): + y = 's2' + x = _input['param2'] + return (y, x) + +def s1m2(step, sL, s, _input): + y = 's1' + x = _input['param1'] + return (y, x) +def s2m2(step, sL, s, _input): + y = 's2' + x = _input['param2'] + return (y, x) + +def s1m3(step, sL, s, _input): + y = 's1' + x = _input['param1'] + return (y, x) +def s2m3(step, sL, s, _input): + y = 's2' + x = _input['param2'] + return (y, x) + + +# Exogenous States +proc_one_coef_A = 0.7 +proc_one_coef_B = 1.3 + +def es3p1(step, sL, s, _input): + y = 's3' + x = s['s3'] * bound_norm_random(seed['a'], proc_one_coef_A, proc_one_coef_B) + return (y, x) + +def es4p2(step, sL, s, _input): + y = 's4' + x = s['s4'] * bound_norm_random(seed['b'], proc_one_coef_A, proc_one_coef_B) + return (y, x) + +ts_format = '%Y-%m-%d %H:%M:%S' +t_delta = timedelta(days=0, minutes=0, seconds=1) +def es5p2(step, sL, s, _input): + y = 'timestamp' + x = ep_time_step(s, dt_str=s['timestamp'], fromat_str=ts_format, _timedelta=t_delta) + return (y, x) + + +# Environment States +def env_a(x): + return 5 +def env_b(x): + return 10 +# def what_ever(x): +# return x + 1 + + +# Genesis States +genesis_states = { + 's1': Decimal(0.0), + 's2': Decimal(0.0), + 's3': Decimal(1.0), + 's4': Decimal(1.0), + 'timestamp': '2018-10-01 15:16:24' +} + + +# remove `exo_update_per_ts` to update every ts +exogenous_states = exo_update_per_ts( + { + "s3": es3p1, + "s4": es4p2, + "timestamp": es5p2 + } +) + + +env_processes = { + "s3": env_a, + "s4": proc_trigger('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, + "T": range(5) +} + + +configs.append( + Configuration( + sim_config=sim_config, + state_dict=genesis_states, + seed=seed, + exogenous_states=exogenous_states, + env_processes=env_processes, + mechanisms=mechanisms + ) +) \ No newline at end of file diff --git a/simulations/validation/config2.py b/simulations/validation/config2.py new file mode 100644 index 0000000..e4c83c6 --- /dev/null +++ b/simulations/validation/config2.py @@ -0,0 +1,171 @@ +from decimal import Decimal +import numpy as np +from datetime import timedelta + +from SimCAD import configs +from SimCAD.configuration import Configuration +from SimCAD.configuration.utils import exo_update_per_ts, proc_trigger, bound_norm_random, \ + ep_time_step + + +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 {'param1': 1} +def b2m1(step, sL, s): + return {'param2': 4} + +def b1m2(step, sL, s): + return {'param1': 'a', 'param2': 2} +def b2m2(step, sL, s): + return {'param1': 'b', 'param2': 4} + +def b1m3(step, sL, s): + return {'param1': ['c'], 'param2': np.array([10, 100])} +def b2m3(step, sL, s): + return {'param1': ['d'], 'param2': np.array([20, 200])} + + +# Internal States per Mechanism +def s1m1(step, sL, s, _input): + y = 's1' + x = _input['param1'] + return (y, x) +def s2m1(step, sL, s, _input): + y = 's2' + x = _input['param2'] + return (y, x) + +def s1m2(step, sL, s, _input): + y = 's1' + x = _input['param1'] + return (y, x) +def s2m2(step, sL, s, _input): + y = 's2' + x = _input['param2'] + return (y, x) + +def s1m3(step, sL, s, _input): + y = 's1' + x = _input['param1'] + return (y, x) +def s2m3(step, sL, s, _input): + y = 's2' + x = _input['param2'] + return (y, x) + + +# Exogenous States +proc_one_coef_A = 0.7 +proc_one_coef_B = 1.3 + +def es3p1(step, sL, s, _input): + y = 's3' + x = s['s3'] * bound_norm_random(seed['a'], proc_one_coef_A, proc_one_coef_B) + return (y, x) + +def es4p2(step, sL, s, _input): + y = 's4' + x = s['s4'] * bound_norm_random(seed['b'], proc_one_coef_A, proc_one_coef_B) + return (y, x) + +ts_format = '%Y-%m-%d %H:%M:%S' +t_delta = timedelta(days=0, minutes=0, seconds=1) +def es5p2(step, sL, s, _input): + y = 'timestamp' + x = ep_time_step(s, dt_str=s['timestamp'], fromat_str=ts_format, _timedelta=t_delta) + return (y, x) + + +# Environment States +def env_a(x): + return 10 +def env_b(x): + return 10 +# def what_ever(x): +# return x + 1 + + +# Genesis States +genesis_states = { + 's1': Decimal(0.0), + 's2': Decimal(0.0), + 's3': Decimal(1.0), + 's4': Decimal(1.0), + 'timestamp': '2018-10-01 15:16:24' +} + + +# remove `exo_update_per_ts` to update every ts +exogenous_states = exo_update_per_ts( + { + "s3": es3p1, + "s4": es4p2, + "timestamp": es5p2 + } +) + + +env_processes = { + "s3": proc_trigger('2018-10-01 15:16:25', env_a), + "s4": proc_trigger('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, + "T": range(5) +} + + +configs.append( + Configuration( + sim_config=sim_config, + state_dict=genesis_states, + seed=seed, + exogenous_states=exogenous_states, + env_processes=env_processes, + mechanisms=mechanisms + ) +) \ No newline at end of file From 19503e3d325694fa25748e6692aebbce39ee1ade Mon Sep 17 00:00:00 2001 From: "Joshua E. Jodesty" Date: Thu, 10 Jan 2019 21:38:38 -0500 Subject: [PATCH 4/9] resolved ModuleNotFoundError --- .gitignore | 17 +- demos/sim_test.py | 37 - demos/test.ipynb | 137 --- setup.py | 4 +- simulations/sim_test.py | 7 +- simulations/test.ipynb | 1899 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 1911 insertions(+), 190 deletions(-) delete mode 100644 demos/sim_test.py delete mode 100644 demos/test.ipynb create mode 100644 simulations/test.ipynb diff --git a/.gitignore b/.gitignore index d48827a..a9e45ba 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,14 @@ -demos -SimCAD -simularions -setup.py -build - +.idea .ipynb_checkpoints .DS_Store -.idea -SimCAD.egg-info __pycache__ Pipfile Pipfile.lock results -.mypy_cache \ No newline at end of file +.mypy_cache +*.csv +*.txt +simulations/.ipynb_checkpoints + +build +SimCAD.egg-info \ No newline at end of file diff --git a/demos/sim_test.py b/demos/sim_test.py deleted file mode 100644 index ae58ba4..0000000 --- a/demos/sim_test.py +++ /dev/null @@ -1,37 +0,0 @@ -import pandas as pd -from tabulate import tabulate - -# The following imports NEED to be in the exact order -from SimCAD.engine import ExecutionMode, ExecutionContext, Executor -from simulations.validation import config1, config2 -from SimCAD import configs - -exec_mode = ExecutionMode() - - -print("Simulation Execution 1") -print() -first_config = [configs[0]] # from config1 -single_proc_ctx = ExecutionContext(context=exec_mode.single_proc) -run1 = Executor(exec_context=single_proc_ctx, configs=first_config) -run1_raw_result, tensor_field = run1.main() -result = pd.DataFrame(run1_raw_result) -print() -print("Tensor Field:") -print(tabulate(tensor_field, headers='keys', tablefmt='psql')) -print("Output:") -print(tabulate(result, headers='keys', tablefmt='psql')) -print() - -print("Simulation Execution 2: Pairwise Execution") -print() -multi_proc_ctx = ExecutionContext(context=exec_mode.multi_proc) -run2 = Executor(exec_context=multi_proc_ctx, configs=configs) -for raw_result, tensor_field in run2.main(): - result = pd.DataFrame(raw_result) - print() - print("Tensor Field:") - print(tabulate(tensor_field, headers='keys', tablefmt='psql')) - print("Output:") - print(tabulate(result, headers='keys', tablefmt='psql')) - print() \ No newline at end of file diff --git a/demos/test.ipynb b/demos/test.ipynb deleted file mode 100644 index e3c6800..0000000 --- a/demos/test.ipynb +++ /dev/null @@ -1,137 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "\n", - "# The following imports NEED to be in the exact order\n", - "from SimCAD.engine import ExecutionMode, ExecutionContext, Executor\n", - "from simulations.validation import config1, config2\n", - "from SimCAD import configs\n", - "\n", - "exec_mode = ExecutionMode()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Simulation Execution 1\")\n", - "print()\n", - "first_config = [configs[0]] # from config1\n", - "single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)\n", - "run1 = Executor(exec_context=single_proc_ctx, configs=first_config)\n", - "run1_raw_result, raw_tensor_field = run1.main()\n", - "result = pd.DataFrame(run1_raw_result)\n", - "tensor_field = pd.DataFrame(raw_tensor_field)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Tensor Field:\")\n", - "tensor_field" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Output:\")\n", - "result" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Simulation Execution 2: Pairwise Execution\")\n", - "print()\n", - "multi_proc_ctx = ExecutionContext(context=exec_mode.multi_proc)\n", - "run2 = Executor(exec_context=multi_proc_ctx, configs=configs)\n", - "results = []\n", - "tensor_fields = []\n", - "for raw_result, raw_tensor_field in run2.main():\n", - " results.append(pd.DataFrame(raw_result))\n", - " tensor_fields.append(pd.DataFrame(raw_tensor_field))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "print(\"Tensor Field A:\")\n", - "tensor_fields[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Output A:\")\n", - "results[0]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Tensor Field B:\")\n", - "tensor_fields[1]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Output B:\")\n", - "results[1]" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/setup.py b/setup.py index 15dc6df..f27a6a4 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -from setuptools import setup +from setuptools import setup, find_packages long_description = "SimCAD is a differential games based simulation software package for research, validation, and \ Computer Aided Design of economic systems. An economic system is treated as a state based model and defined through \ @@ -19,5 +19,5 @@ setup(name='SimCAD', author='Joshua E. Jodesty', author_email='joshua@block.science', license='licenses', - packages=['SimCAD'] + packages=find_packages() #['SimCAD'] ) diff --git a/simulations/sim_test.py b/simulations/sim_test.py index ef1daa7..ae58ba4 100644 --- a/simulations/sim_test.py +++ b/simulations/sim_test.py @@ -1,13 +1,11 @@ import pandas as pd from tabulate import tabulate -# The following imports NEED to be in the exact same order +# The following imports NEED to be in the exact order from SimCAD.engine import ExecutionMode, ExecutionContext, Executor -from simulations.validation import config_1, config_2 +from simulations.validation import config1, config2 from SimCAD import configs -# ToDo: pass ExecutionContext with execution method as ExecutionContext input - exec_mode = ExecutionMode() @@ -18,7 +16,6 @@ single_proc_ctx = ExecutionContext(context=exec_mode.single_proc) run1 = Executor(exec_context=single_proc_ctx, configs=first_config) run1_raw_result, tensor_field = run1.main() result = pd.DataFrame(run1_raw_result) -# result.to_csv('~/Projects/DiffyQ-SimCAD/results/config4.csv', sep=',') print() print("Tensor Field:") print(tabulate(tensor_field, headers='keys', tablefmt='psql')) diff --git a/simulations/test.ipynb b/simulations/test.ipynb new file mode 100644 index 0000000..b281b65 --- /dev/null +++ b/simulations/test.ipynb @@ -0,0 +1,1899 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "# The following imports NEED to be in the exact order\n", + "from SimCAD.engine import ExecutionMode, ExecutionContext, Executor\n", + "from validation import config1, config2\n", + "from SimCAD import configs\n", + "\n", + "exec_mode = ExecutionMode()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simulation Execution 1\n", + "\n", + "single_proc: []\n" + ] + } + ], + "source": [ + "print(\"Simulation Execution 1\")\n", + "print()\n", + "first_config = [configs[0]] # from config1\n", + "single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)\n", + "run1 = Executor(exec_context=single_proc_ctx, configs=first_config)\n", + "run1_raw_result, raw_tensor_field = run1.main()\n", + "result = pd.DataFrame(run1_raw_result)\n", + "tensor_field = pd.DataFrame(raw_tensor_field)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tensor Field:\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
b1b2s1s2es1es2es3m
0<function b1m1 at 0x109f25d90><function b2m1 at 0x10a2fda60><function s1m1 at 0x10a2fdd08><function s2m1 at 0x10a2fdd90><function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...1
1<function b1m2 at 0x10a2fdae8><function b2m2 at 0x10a2fdb70><function s1m2 at 0x10a2fde18><function s2m2 at 0x10a2fdea0><function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...2
2<function b1m3 at 0x10a2fdbf8><function b2m3 at 0x10a2fdc80><function s1m3 at 0x10a2fdf28><function s2m3 at 0x10a308048><function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...3
\n", + "
" + ], + "text/plain": [ + " b1 b2 \\\n", + "0 \n", + "1 \n", + "2 \n", + "\n", + " s1 s2 \\\n", + "0 \n", + "1 \n", + "2 \n", + "\n", + " es1 \\\n", + "0 ._curried at 0x10a30... \n", + "1 ._curried at 0x10a30... \n", + "2 ._curried at 0x10a30... \n", + "\n", + " es2 \\\n", + "0 ._curried at 0x10a30... \n", + "1 ._curried at 0x10a30... \n", + "2 ._curried at 0x10a30... \n", + "\n", + " es3 m \n", + "0 ._curried at 0x10a30... 1 \n", + "1 ._curried at 0x10a30... 2 \n", + "2 ._curried at 0x10a30... 3 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(\"Tensor Field:\")\n", + "tensor_field" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Output:\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
mech_stepruns1s2s3s4time_steptimestamp
001001102018-10-01 15:16:24
1111451012018-10-01 15:16:25
221ab651012018-10-01 15:16:25
331[c, d][30, 300]51012018-10-01 15:16:25
41114510.4365098505119902050353175622018-10-01 15:16:26
521ab6510.4365098505119902050353175622018-10-01 15:16:26
631[c, d][30, 300]510.4365098505119902050353175622018-10-01 15:16:26
71114510.5372195281202876186024801332018-10-01 15:16:27
821ab6510.5372195281202876186024801332018-10-01 15:16:27
931[c, d][30, 300]510.5372195281202876186024801332018-10-01 15:16:27
10111458.57361635768008949978322321242018-10-01 15:16:28
1121ab658.57361635768008949978322321242018-10-01 15:16:28
1231[c, d][30, 300]58.57361635768008949978322321242018-10-01 15:16:28
13111458.33579435462959645300709321652018-10-01 15:16:29
1421ab658.33579435462959645300709321652018-10-01 15:16:29
1531[c, d][30, 300]58.33579435462959645300709321652018-10-01 15:16:29
1602001102018-10-01 15:16:24
17121451012018-10-01 15:16:25
1822ab651012018-10-01 15:16:25
1932[c, d][30, 300]51012018-10-01 15:16:25
20121459.91725851851753992249882685422018-10-01 15:16:26
2122ab659.91725851851753992249882685422018-10-01 15:16:26
2232[c, d][30, 300]59.91725851851753992249882685422018-10-01 15:16:26
23121459.29544573818278309896721217232018-10-01 15:16:27
2422ab659.29544573818278309896721217232018-10-01 15:16:27
2532[c, d][30, 300]59.29544573818278309896721217232018-10-01 15:16:27
26121459.25471479697655613481958888342018-10-01 15:16:28
2722ab659.25471479697655613481958888342018-10-01 15:16:28
2832[c, d][30, 300]59.25471479697655613481958888342018-10-01 15:16:28
29121458.81306312028134610425625981852018-10-01 15:16:29
3022ab658.81306312028134610425625981852018-10-01 15:16:29
3132[c, d][30, 300]58.81306312028134610425625981852018-10-01 15:16:29
\n", + "
" + ], + "text/plain": [ + " mech_step run s1 s2 s3 s4 \\\n", + "0 0 1 0 0 1 1 \n", + "1 1 1 1 4 5 10 \n", + "2 2 1 ab 6 5 10 \n", + "3 3 1 [c, d] [30, 300] 5 10 \n", + "4 1 1 1 4 5 10.43650985051199020503531756 \n", + "5 2 1 ab 6 5 10.43650985051199020503531756 \n", + "6 3 1 [c, d] [30, 300] 5 10.43650985051199020503531756 \n", + "7 1 1 1 4 5 10.53721952812028761860248013 \n", + "8 2 1 ab 6 5 10.53721952812028761860248013 \n", + "9 3 1 [c, d] [30, 300] 5 10.53721952812028761860248013 \n", + "10 1 1 1 4 5 8.573616357680089499783223212 \n", + "11 2 1 ab 6 5 8.573616357680089499783223212 \n", + "12 3 1 [c, d] [30, 300] 5 8.573616357680089499783223212 \n", + "13 1 1 1 4 5 8.335794354629596453007093216 \n", + "14 2 1 ab 6 5 8.335794354629596453007093216 \n", + "15 3 1 [c, d] [30, 300] 5 8.335794354629596453007093216 \n", + "16 0 2 0 0 1 1 \n", + "17 1 2 1 4 5 10 \n", + "18 2 2 ab 6 5 10 \n", + "19 3 2 [c, d] [30, 300] 5 10 \n", + "20 1 2 1 4 5 9.917258518517539922498826854 \n", + "21 2 2 ab 6 5 9.917258518517539922498826854 \n", + "22 3 2 [c, d] [30, 300] 5 9.917258518517539922498826854 \n", + "23 1 2 1 4 5 9.295445738182783098967212172 \n", + "24 2 2 ab 6 5 9.295445738182783098967212172 \n", + "25 3 2 [c, d] [30, 300] 5 9.295445738182783098967212172 \n", + "26 1 2 1 4 5 9.254714796976556134819588883 \n", + "27 2 2 ab 6 5 9.254714796976556134819588883 \n", + "28 3 2 [c, d] [30, 300] 5 9.254714796976556134819588883 \n", + "29 1 2 1 4 5 8.813063120281346104256259818 \n", + "30 2 2 ab 6 5 8.813063120281346104256259818 \n", + "31 3 2 [c, d] [30, 300] 5 8.813063120281346104256259818 \n", + "\n", + " time_step timestamp \n", + "0 0 2018-10-01 15:16:24 \n", + "1 1 2018-10-01 15:16:25 \n", + "2 1 2018-10-01 15:16:25 \n", + "3 1 2018-10-01 15:16:25 \n", + "4 2 2018-10-01 15:16:26 \n", + "5 2 2018-10-01 15:16:26 \n", + "6 2 2018-10-01 15:16:26 \n", + "7 3 2018-10-01 15:16:27 \n", + "8 3 2018-10-01 15:16:27 \n", + "9 3 2018-10-01 15:16:27 \n", + "10 4 2018-10-01 15:16:28 \n", + "11 4 2018-10-01 15:16:28 \n", + "12 4 2018-10-01 15:16:28 \n", + "13 5 2018-10-01 15:16:29 \n", + "14 5 2018-10-01 15:16:29 \n", + "15 5 2018-10-01 15:16:29 \n", + "16 0 2018-10-01 15:16:24 \n", + "17 1 2018-10-01 15:16:25 \n", + "18 1 2018-10-01 15:16:25 \n", + "19 1 2018-10-01 15:16:25 \n", + "20 2 2018-10-01 15:16:26 \n", + "21 2 2018-10-01 15:16:26 \n", + "22 2 2018-10-01 15:16:26 \n", + "23 3 2018-10-01 15:16:27 \n", + "24 3 2018-10-01 15:16:27 \n", + "25 3 2018-10-01 15:16:27 \n", + "26 4 2018-10-01 15:16:28 \n", + "27 4 2018-10-01 15:16:28 \n", + "28 4 2018-10-01 15:16:28 \n", + "29 5 2018-10-01 15:16:29 \n", + "30 5 2018-10-01 15:16:29 \n", + "31 5 2018-10-01 15:16:29 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(\"Output:\")\n", + "result" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Simulation Execution 2: Pairwise Execution\n", + "\n", + "multi_proc: [, ]\n" + ] + } + ], + "source": [ + "print(\"Simulation Execution 2: Pairwise Execution\")\n", + "print()\n", + "multi_proc_ctx = ExecutionContext(context=exec_mode.multi_proc)\n", + "run2 = Executor(exec_context=multi_proc_ctx, configs=configs)\n", + "results = []\n", + "tensor_fields = []\n", + "for raw_result, raw_tensor_field in run2.main():\n", + " results.append(pd.DataFrame(raw_result))\n", + " tensor_fields.append(pd.DataFrame(raw_tensor_field))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tensor Field A:\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
b1b2s1s2es1es2es3m
0<function b1m1 at 0x109f25d90><function b2m1 at 0x10a2fda60><function s1m1 at 0x10a2fdd08><function s2m1 at 0x10a2fdd90><function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...1
1<function b1m2 at 0x10a2fdae8><function b2m2 at 0x10a2fdb70><function s1m2 at 0x10a2fde18><function s2m2 at 0x10a2fdea0><function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...2
2<function b1m3 at 0x10a2fdbf8><function b2m3 at 0x10a2fdc80><function s1m3 at 0x10a2fdf28><function s2m3 at 0x10a308048><function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...3
\n", + "
" + ], + "text/plain": [ + " b1 b2 \\\n", + "0 \n", + "1 \n", + "2 \n", + "\n", + " s1 s2 \\\n", + "0 \n", + "1 \n", + "2 \n", + "\n", + " es1 \\\n", + "0 ._curried at 0x10a30... \n", + "1 ._curried at 0x10a30... \n", + "2 ._curried at 0x10a30... \n", + "\n", + " es2 \\\n", + "0 ._curried at 0x10a30... \n", + "1 ._curried at 0x10a30... \n", + "2 ._curried at 0x10a30... \n", + "\n", + " es3 m \n", + "0 ._curried at 0x10a30... 1 \n", + "1 ._curried at 0x10a30... 2 \n", + "2 ._curried at 0x10a30... 3 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "print(\"Tensor Field A:\")\n", + "tensor_fields[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Output A:\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
mech_stepruns1s2s3s4time_steptimestamp
001001102018-10-01 15:16:24
1111451012018-10-01 15:16:25
221ab651012018-10-01 15:16:25
331[c, d][30, 300]51012018-10-01 15:16:25
41114510.8846223804995845263476894622018-10-01 15:16:26
521ab6510.8846223804995845263476894622018-10-01 15:16:26
631[c, d][30, 300]510.8846223804995845263476894622018-10-01 15:16:26
71114511.8439037891546010592859424032018-10-01 15:16:27
821ab6511.8439037891546010592859424032018-10-01 15:16:27
931[c, d][30, 300]511.8439037891546010592859424032018-10-01 15:16:27
101114513.8687056777981817566008678242018-10-01 15:16:28
1121ab6513.8687056777981817566008678242018-10-01 15:16:28
1231[c, d][30, 300]513.8687056777981817566008678242018-10-01 15:16:28
131114513.9380958635320972504792206852018-10-01 15:16:29
1421ab6513.9380958635320972504792206852018-10-01 15:16:29
1531[c, d][30, 300]513.9380958635320972504792206852018-10-01 15:16:29
1602001102018-10-01 15:16:24
17121451012018-10-01 15:16:25
1822ab651012018-10-01 15:16:25
1932[c, d][30, 300]51012018-10-01 15:16:25
20121459.45464005238046967249943008922018-10-01 15:16:26
2122ab659.45464005238046967249943008922018-10-01 15:16:26
2232[c, d][30, 300]59.45464005238046967249943008922018-10-01 15:16:26
23121457.99250141557961352525319763532018-10-01 15:16:27
2422ab657.99250141557961352525319763532018-10-01 15:16:27
2532[c, d][30, 300]57.99250141557961352525319763532018-10-01 15:16:27
26121458.77765872647237926847033398342018-10-01 15:16:28
2722ab658.77765872647237926847033398342018-10-01 15:16:28
2832[c, d][30, 300]58.77765872647237926847033398342018-10-01 15:16:28
29121457.81117913728395304481061202852018-10-01 15:16:29
3022ab657.81117913728395304481061202852018-10-01 15:16:29
3132[c, d][30, 300]57.81117913728395304481061202852018-10-01 15:16:29
\n", + "
" + ], + "text/plain": [ + " mech_step run s1 s2 s3 s4 \\\n", + "0 0 1 0 0 1 1 \n", + "1 1 1 1 4 5 10 \n", + "2 2 1 ab 6 5 10 \n", + "3 3 1 [c, d] [30, 300] 5 10 \n", + "4 1 1 1 4 5 10.88462238049958452634768946 \n", + "5 2 1 ab 6 5 10.88462238049958452634768946 \n", + "6 3 1 [c, d] [30, 300] 5 10.88462238049958452634768946 \n", + "7 1 1 1 4 5 11.84390378915460105928594240 \n", + "8 2 1 ab 6 5 11.84390378915460105928594240 \n", + "9 3 1 [c, d] [30, 300] 5 11.84390378915460105928594240 \n", + "10 1 1 1 4 5 13.86870567779818175660086782 \n", + "11 2 1 ab 6 5 13.86870567779818175660086782 \n", + "12 3 1 [c, d] [30, 300] 5 13.86870567779818175660086782 \n", + "13 1 1 1 4 5 13.93809586353209725047922068 \n", + "14 2 1 ab 6 5 13.93809586353209725047922068 \n", + "15 3 1 [c, d] [30, 300] 5 13.93809586353209725047922068 \n", + "16 0 2 0 0 1 1 \n", + "17 1 2 1 4 5 10 \n", + "18 2 2 ab 6 5 10 \n", + "19 3 2 [c, d] [30, 300] 5 10 \n", + "20 1 2 1 4 5 9.454640052380469672499430089 \n", + "21 2 2 ab 6 5 9.454640052380469672499430089 \n", + "22 3 2 [c, d] [30, 300] 5 9.454640052380469672499430089 \n", + "23 1 2 1 4 5 7.992501415579613525253197635 \n", + "24 2 2 ab 6 5 7.992501415579613525253197635 \n", + "25 3 2 [c, d] [30, 300] 5 7.992501415579613525253197635 \n", + "26 1 2 1 4 5 8.777658726472379268470333983 \n", + "27 2 2 ab 6 5 8.777658726472379268470333983 \n", + "28 3 2 [c, d] [30, 300] 5 8.777658726472379268470333983 \n", + "29 1 2 1 4 5 7.811179137283953044810612028 \n", + "30 2 2 ab 6 5 7.811179137283953044810612028 \n", + "31 3 2 [c, d] [30, 300] 5 7.811179137283953044810612028 \n", + "\n", + " time_step timestamp \n", + "0 0 2018-10-01 15:16:24 \n", + "1 1 2018-10-01 15:16:25 \n", + "2 1 2018-10-01 15:16:25 \n", + "3 1 2018-10-01 15:16:25 \n", + "4 2 2018-10-01 15:16:26 \n", + "5 2 2018-10-01 15:16:26 \n", + "6 2 2018-10-01 15:16:26 \n", + "7 3 2018-10-01 15:16:27 \n", + "8 3 2018-10-01 15:16:27 \n", + "9 3 2018-10-01 15:16:27 \n", + "10 4 2018-10-01 15:16:28 \n", + "11 4 2018-10-01 15:16:28 \n", + "12 4 2018-10-01 15:16:28 \n", + "13 5 2018-10-01 15:16:29 \n", + "14 5 2018-10-01 15:16:29 \n", + "15 5 2018-10-01 15:16:29 \n", + "16 0 2018-10-01 15:16:24 \n", + "17 1 2018-10-01 15:16:25 \n", + "18 1 2018-10-01 15:16:25 \n", + "19 1 2018-10-01 15:16:25 \n", + "20 2 2018-10-01 15:16:26 \n", + "21 2 2018-10-01 15:16:26 \n", + "22 2 2018-10-01 15:16:26 \n", + "23 3 2018-10-01 15:16:27 \n", + "24 3 2018-10-01 15:16:27 \n", + "25 3 2018-10-01 15:16:27 \n", + "26 4 2018-10-01 15:16:28 \n", + "27 4 2018-10-01 15:16:28 \n", + "28 4 2018-10-01 15:16:28 \n", + "29 5 2018-10-01 15:16:29 \n", + "30 5 2018-10-01 15:16:29 \n", + "31 5 2018-10-01 15:16:29 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(\"Output A:\")\n", + "results[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tensor Field B:\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
b1b2s1s2es1es2es3m
0<function b1m1 at 0x10a308488><bound method Identity.b_identity of <SimCAD.c...<function s1m1 at 0x10a308950><function Identity.state_identity.<locals>.<la...<function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...1
1<function b1m2 at 0x10a308730><bound method Identity.b_identity of <SimCAD.c...<function s1m2 at 0x10a308a60><function Identity.state_identity.<locals>.<la...<function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...2
2<function b1m3 at 0x10a308840><function b2m3 at 0x10a3088c8><function s1m3 at 0x10a308b70><function s2m3 at 0x10a308bf8><function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...<function curried.<locals>._curried at 0x10a30...3
\n", + "
" + ], + "text/plain": [ + " b1 \\\n", + "0 \n", + "1 \n", + "2 \n", + "\n", + " b2 \\\n", + "0 \n", + "\n", + " s1 \\\n", + "0 \n", + "1 \n", + "2 \n", + "\n", + " s2 \\\n", + "0 .. \n", + "\n", + " es1 \\\n", + "0 ._curried at 0x10a30... \n", + "1 ._curried at 0x10a30... \n", + "2 ._curried at 0x10a30... \n", + "\n", + " es2 \\\n", + "0 ._curried at 0x10a30... \n", + "1 ._curried at 0x10a30... \n", + "2 ._curried at 0x10a30... \n", + "\n", + " es3 m \n", + "0 ._curried at 0x10a30... 1 \n", + "1 ._curried at 0x10a30... 2 \n", + "2 ._curried at 0x10a30... 3 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(\"Tensor Field B:\")\n", + "tensor_fields[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Output B:\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
mech_stepruns1s2s3s4time_steptimestamp
001001102018-10-01 15:16:24
11110101012018-10-01 15:16:25
221a0101012018-10-01 15:16:25
331[c, d][30, 300]101012018-10-01 15:16:25
4111[30, 300]9.94373317277366997046783581010.4365098505119902050353175622018-10-01 15:16:26
521a[30, 300]9.94373317277366997046783581010.4365098505119902050353175622018-10-01 15:16:26
631[c, d][30, 300]9.94373317277366997046783581010.4365098505119902050353175622018-10-01 15:16:26
7111[30, 300]7.81955677476886926528452637110.5372195281202876186024801332018-10-01 15:16:27
821a[30, 300]7.81955677476886926528452637110.5372195281202876186024801332018-10-01 15:16:27
931[c, d][30, 300]7.81955677476886926528452637110.5372195281202876186024801332018-10-01 15:16:27
10111[30, 300]9.1021758460007533121249253318.57361635768008949978322321242018-10-01 15:16:28
1121a[30, 300]9.1021758460007533121249253318.57361635768008949978322321242018-10-01 15:16:28
1231[c, d][30, 300]9.1021758460007533121249253318.57361635768008949978322321242018-10-01 15:16:28
13111[30, 300]7.4697592395088619727980957658.33579435462959645300709321652018-10-01 15:16:29
1421a[30, 300]7.4697592395088619727980957658.33579435462959645300709321652018-10-01 15:16:29
1531[c, d][30, 300]7.4697592395088619727980957658.33579435462959645300709321652018-10-01 15:16:29
1602001102018-10-01 15:16:24
171210101012018-10-01 15:16:25
1822a0101012018-10-01 15:16:25
1932[c, d][30, 300]101012018-10-01 15:16:25
20121[30, 300]10.502881417158043131365730019.91725851851753992249882685422018-10-01 15:16:26
2122a[30, 300]10.502881417158043131365730019.91725851851753992249882685422018-10-01 15:16:26
2232[c, d][30, 300]10.502881417158043131365730019.91725851851753992249882685422018-10-01 15:16:26
23121[30, 300]9.1949701067745045497220664269.29544573818278309896721217232018-10-01 15:16:27
2422a[30, 300]9.1949701067745045497220664269.29544573818278309896721217232018-10-01 15:16:27
2532[c, d][30, 300]9.1949701067745045497220664269.29544573818278309896721217232018-10-01 15:16:27
26121[30, 300]8.2221862040910078929039996589.25471479697655613481958888342018-10-01 15:16:28
2722a[30, 300]8.2221862040910078929039996589.25471479697655613481958888342018-10-01 15:16:28
2832[c, d][30, 300]8.2221862040910078929039996589.25471479697655613481958888342018-10-01 15:16:28
29121[30, 300]7.4747832170044870609731757978.81306312028134610425625981852018-10-01 15:16:29
3022a[30, 300]7.4747832170044870609731757978.81306312028134610425625981852018-10-01 15:16:29
3132[c, d][30, 300]7.4747832170044870609731757978.81306312028134610425625981852018-10-01 15:16:29
\n", + "
" + ], + "text/plain": [ + " mech_step run s1 s2 s3 \\\n", + "0 0 1 0 0 1 \n", + "1 1 1 1 0 10 \n", + "2 2 1 a 0 10 \n", + "3 3 1 [c, d] [30, 300] 10 \n", + "4 1 1 1 [30, 300] 9.943733172773669970467835810 \n", + "5 2 1 a [30, 300] 9.943733172773669970467835810 \n", + "6 3 1 [c, d] [30, 300] 9.943733172773669970467835810 \n", + "7 1 1 1 [30, 300] 7.819556774768869265284526371 \n", + "8 2 1 a [30, 300] 7.819556774768869265284526371 \n", + "9 3 1 [c, d] [30, 300] 7.819556774768869265284526371 \n", + "10 1 1 1 [30, 300] 9.102175846000753312124925331 \n", + "11 2 1 a [30, 300] 9.102175846000753312124925331 \n", + "12 3 1 [c, d] [30, 300] 9.102175846000753312124925331 \n", + "13 1 1 1 [30, 300] 7.469759239508861972798095765 \n", + "14 2 1 a [30, 300] 7.469759239508861972798095765 \n", + "15 3 1 [c, d] [30, 300] 7.469759239508861972798095765 \n", + "16 0 2 0 0 1 \n", + "17 1 2 1 0 10 \n", + "18 2 2 a 0 10 \n", + "19 3 2 [c, d] [30, 300] 10 \n", + "20 1 2 1 [30, 300] 10.50288141715804313136573001 \n", + "21 2 2 a [30, 300] 10.50288141715804313136573001 \n", + "22 3 2 [c, d] [30, 300] 10.50288141715804313136573001 \n", + "23 1 2 1 [30, 300] 9.194970106774504549722066426 \n", + "24 2 2 a [30, 300] 9.194970106774504549722066426 \n", + "25 3 2 [c, d] [30, 300] 9.194970106774504549722066426 \n", + "26 1 2 1 [30, 300] 8.222186204091007892903999658 \n", + "27 2 2 a [30, 300] 8.222186204091007892903999658 \n", + "28 3 2 [c, d] [30, 300] 8.222186204091007892903999658 \n", + "29 1 2 1 [30, 300] 7.474783217004487060973175797 \n", + "30 2 2 a [30, 300] 7.474783217004487060973175797 \n", + "31 3 2 [c, d] [30, 300] 7.474783217004487060973175797 \n", + "\n", + " s4 time_step timestamp \n", + "0 1 0 2018-10-01 15:16:24 \n", + "1 10 1 2018-10-01 15:16:25 \n", + "2 10 1 2018-10-01 15:16:25 \n", + "3 10 1 2018-10-01 15:16:25 \n", + "4 10.43650985051199020503531756 2 2018-10-01 15:16:26 \n", + "5 10.43650985051199020503531756 2 2018-10-01 15:16:26 \n", + "6 10.43650985051199020503531756 2 2018-10-01 15:16:26 \n", + "7 10.53721952812028761860248013 3 2018-10-01 15:16:27 \n", + "8 10.53721952812028761860248013 3 2018-10-01 15:16:27 \n", + "9 10.53721952812028761860248013 3 2018-10-01 15:16:27 \n", + "10 8.573616357680089499783223212 4 2018-10-01 15:16:28 \n", + "11 8.573616357680089499783223212 4 2018-10-01 15:16:28 \n", + "12 8.573616357680089499783223212 4 2018-10-01 15:16:28 \n", + "13 8.335794354629596453007093216 5 2018-10-01 15:16:29 \n", + "14 8.335794354629596453007093216 5 2018-10-01 15:16:29 \n", + "15 8.335794354629596453007093216 5 2018-10-01 15:16:29 \n", + "16 1 0 2018-10-01 15:16:24 \n", + "17 10 1 2018-10-01 15:16:25 \n", + "18 10 1 2018-10-01 15:16:25 \n", + "19 10 1 2018-10-01 15:16:25 \n", + "20 9.917258518517539922498826854 2 2018-10-01 15:16:26 \n", + "21 9.917258518517539922498826854 2 2018-10-01 15:16:26 \n", + "22 9.917258518517539922498826854 2 2018-10-01 15:16:26 \n", + "23 9.295445738182783098967212172 3 2018-10-01 15:16:27 \n", + "24 9.295445738182783098967212172 3 2018-10-01 15:16:27 \n", + "25 9.295445738182783098967212172 3 2018-10-01 15:16:27 \n", + "26 9.254714796976556134819588883 4 2018-10-01 15:16:28 \n", + "27 9.254714796976556134819588883 4 2018-10-01 15:16:28 \n", + "28 9.254714796976556134819588883 4 2018-10-01 15:16:28 \n", + "29 8.813063120281346104256259818 5 2018-10-01 15:16:29 \n", + "30 8.813063120281346104256259818 5 2018-10-01 15:16:29 \n", + "31 8.813063120281346104256259818 5 2018-10-01 15:16:29 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(\"Output B:\")\n", + "results[1]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 796bf023ecebe08026fc371f14960c919308922c Mon Sep 17 00:00:00 2001 From: "Joshua E. Jodesty" Date: Thu, 10 Jan 2019 21:41:46 -0500 Subject: [PATCH 5/9] added dist --- dist/SimCAD-0.1-py3-none-any.whl | Bin 0 -> 11724 bytes dist/SimCAD-0.1.tar.gz | Bin 0 -> 6132 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 dist/SimCAD-0.1-py3-none-any.whl create mode 100644 dist/SimCAD-0.1.tar.gz diff --git a/dist/SimCAD-0.1-py3-none-any.whl b/dist/SimCAD-0.1-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..070c329bbc6296426d9eab8b88aa9d89dcf22899 GIT binary patch literal 11724 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 Gpa1~2QX_-_ literal 0 HcmV?d00001 From 460bbbacd7afb041d3253d71acc0aeffd7174ac1 Mon Sep 17 00:00:00 2001 From: "Joshua E. Jodesty" Date: Fri, 11 Jan 2019 09:47:27 -0500 Subject: [PATCH 6/9] moved licenses --- LICENSE.txt | 119 ---------------------------------- licenses/LICENSE.txt | 150 ------------------------------------------- 2 files changed, 269 deletions(-) delete mode 100644 LICENSE.txt delete mode 100644 licenses/LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 04c5891..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,119 +0,0 @@ -TRIAL LICENSE AGREEMENT - -BACKGROUND - -Company has developed and intends to market and license a certain software product and service called ”SimCAD” which, -among other things, is a scientific engineering simulation tool (“Software”). Company wishes to provide access, on a -trial basis, to users of a “beta” version of the Software to test and provide feedback to Company. Licensee wishes to -participate in Company’s beta trial of the Software and to provide feedback to Company with respect to Licensee’s use -thereof. - -Accordingly, the parties hereby agree as follows: - -1. BETA PRODUCT. - -This Agreement applies to any pre­release version of the Software and any updates and changes thereto during the Term -(collectively, “Beta Product”). As an essential condition of this Agreement, Licensee understands and acknowledges that: -(a) Licensee is participating in a beta test of the Beta Product; (b) the Beta Product has not been field tested or -trialed; and (c) the Beta Product may not operate properly or be error free and may not perform all functions for -which it is intended or represented. - -2. FEEDBACK. - -As a condition of this Agreement, during the Term of this Agreement, Licensee agrees to provide Company with comments, -feedback, criticisms, and suggestions for changes to the Beta Product (“Feedback”), and to help Company identify errors -or malfunctions, and performance issues, in the operation of the Beta Product, as Company may reasonably request. All -rights to any Feedback or other intellectual property derived from Licensee’s use of or relating to the Beta Product, -as well any data collected from the use of the Beta Product, belong solely to Company and Licensee hereby irrevocably -assigns all such rights to Company. Company reserves the right to use all Feedback and data collected as a result of the -use of the Beta Product to advertise and promote the Company and the Software. - -3. LICENSE AND RESERVATION OF RIGHTS. - -3.1 Subject to the terms and conditions set forth in this Agreement, Company hereby grants Licensee, and Licensee -accepts, during the Term, a non­exclusive, royalty­free, revocable, non­transferable, limited license to access and use -the Beta Product for its internal, non­commercial use for evaluation purposes only, and to give permission to employees -of Licensee and employees of Licensee’s subsidiaries (“Permitted Users”) to use the Beta Product in accordance with the -foregoing. - -3.2 The Beta Product and the Software comprise the intellectual property of Company. All right, title and interest in -and to the Beta Product (and, more generally, in and to the Software), and to all Feedback and data arising from its -use, in whole or in part, and all patent, copyright, trade­marks, trade secret and all other intellectual and industrial -property rights therein and the structure, sequence and organization of same, and the media on which such material is -contained belong exclusively to Company. Licensee and its Permitted Users will not, directly or indirectly: reverse -engineer, decompile, disassemble or otherwise attempt to discover the source code, object code or underlying structure, -ideas, know­how or algorithms relevant to the Beta Product; modify, adapt, alter, edit, correct, translate, publish, -sell, transfer, assign, convey, rent, lease, loan, pledge, sublicense, distribute, export, enhance or create derivative -works based on the Beta Product; or remove, alter, cover or otherwise obscure any proprietary notices or labels -displayed on or within the Beta Product any documentation relating thereto. - -4. DISCLAIMER. - -4.1 COMPANY MAKES NO WARRANTIES, WHETHER EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, WITH RESPECT TO THE BETA PRODUCT, -INCLUDING, BUT NOT LIMITED TO, THE AVAILABILITY, QUALITY OR PERFORMANCE OF THE BETA PRODUCT. COMPANY SPECIFICALLY -DISCLAIMS ALL EXPRESS, STATUTORY AND IMPLIED WARRANTIES AND CONDITIONS, INCLUDING, WITHOUT LIMITATION (A) THE IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON­INFRINGEMENT, (B) ANY WARRANTIES AGAINST HIDDEN -OR LATENT DEFECTS, (C) AND ANY WARRANTIES AND CONDITIONS ARISING OUT OF COURSE OF DEALING OR USAGE OF TRADE AND (D) ANY -WARRANTY OR REPRESENTATION THAT THE BETA PRODUCT IS ERROR­FREE, VIRUS­FREE, SECURE, UNINTERRUPTED, OR FREE FROM -UNAUTHORIZED ACCESS (INCLUDING, BUT NOT LIMITED TO, THIRD PARTY HACKERS OR DENIAL OF SERVICE ATTACKS). THE BETA PRODUCT -IS SUPPLIED ON AN “AS IS”, “AS AVAILABLE” BASIS WITHOUT WARRANTY. - -4.2 NEITHER PARTY SHALL BE LIABLE FOR SPECIAL, INCIDENTAL, PUNITIVE, CONSEQUENTIAL OR INDIRECT DAMAGES OR LOSS -(INCLUDING DEATH AND PERSONAL INJURY), IRRESPECTIVE OF THEIR CAUSE, NOTWITHSTANDING THAT A PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH LOSS OR DAMAGE, NOR FOR ANY CLAIMS FOR SUCH LOSS OR DAMAGE INSTITUTED AGAINST A PARTY OR ITS -CUSTOMERS BY ANY THIRD PARTY. - -5. CONFIDENTIALITY - -5.1 All Confidential Information disclosed by either party shall be kept by the receiving party in strict confidence and -shall not be disclosed to any third party without the disclosing party’s express written consent. For purposes of this -Agreement, “Confidential Information” means all information regarding either party’s business which has been marked or -is otherwise communicated as being “proprietary” or “confidential” or which reasonably should be known by the receiving -party to be proprietary or confidential information. Without limiting the generality of the foregoing, Confidential -Information of Company includes non­public information regarding features, functionality and performance of the Beta -Product, including all Feedback and related data. Notwithstanding the foregoing, each party’s confidentiality -obligations hereunder shall not apply to information that: (a) is already known to the receiving party without a -pre­existing restriction as to disclosure; (b) is or becomes publicly available without fault of the receiving party; -(c) is rightfully obtained by the receiving party from a third party without restriction as to disclosure, or is -approved for release by written authorization of the disclosing party; (d) is developed independently by the receiving -party without use of the disclosing party’s Confidential Information; or (e) is required to be disclosed by law or -regulation, including, but not limited to, supplying such information or making such statements or disclosures relating -to this Agreement before any competent court, governmental agency or authority in response to a lawful requirement or -request from a court of governmental agency or authority, provided that the disclosing party shall give the other party -prompt notice of such request, to the extent practicable, so that the other party may seek (at its sole cost and -expense) an appropriate protective order or similar relief. - -5.2 In the event of a breach of Sections 2, 3 or this Section 5, the non­breaching party shall be entitled to seek -equitable relief to protect its interests, including, but not limited to, injunctive relief. In the event of expiration -or earlier termination of this Agreement, each party shall immediately return to the other party such other party’s -Confidential Information, or at such other party’s option, destroy any remaining Confidential Information and certify -that such destruction has taken place. - -6. FEES; EXPENSES. - -Neither party shall be entitled to any compensation in connection with this Agreement or its use or provision of the -Beta Product. Each party shall bear its own costs and expenses arising from this Agreement and its use or provision of -the Beta Product, as the case may be. - -7. TERM OF AGREEMENT. - -This Agreement shall begin on the Effective Date and shall continue until it has been terminated (such period, the -“Term”). Either party shall have the right to terminate this Agreement at any time on one (1) month written notice to -the other party, or in the case of a breach of this Agreement by Licensee or its Permitted Users, Company may terminate -this Agreement immediately on written notice to Licensee. Upon termination of this Agreement, all rights granted to -Licensee (and any Permitted User) under this Agreement will immediately terminate and Licensee (and all Permitted Users) -must immediately cease all use of the Beta Product at such time. Notwithstanding any termination of this Agreement, -Sections 2, 3.2, 4, 5, 6, this Section 7 and Section 8 shall survive and remain binding on the parties. - -8. MISCELLANEOUS. - -This Agreement shall be governed by and construed in accordance with the laws of the State of New York. All disputes -relating to this Agreement shall be resolved in the federal and state courts of New York County, New York and the -parties submit to the jurisdiction of such courts. This Agreement does not create any agency, partnership, or joint -venture relationship between Licensee and Company. This Agreement is the entire understanding of the parties with -respect to the subject matter hereof and supersedes any previous or contemporaneous communications, representations, -warranties, discussions, arrangements or commitments, whether oral or written with respect to such subject matter. This -Agreement cannot be amended except by a written amendment that expressly refers to this Agreement and is signed by an -authorized representative of each party. This Agreement may be executed in one or more counterparts, including via -facsimile or email (or any other electronic means such as “.pdf” or “.tiff” files), each of which shall be deemed an -original, and all of which shall constitute one and the same Agreement. \ No newline at end of file diff --git a/licenses/LICENSE.txt b/licenses/LICENSE.txt deleted file mode 100644 index b5d9242..0000000 --- a/licenses/LICENSE.txt +++ /dev/null @@ -1,150 +0,0 @@ -SOFTWARE LICENSE AGREEMENT - -This Software License Agreement (the “Agreement”) is entered into as of December __ 2018, (the “Effective Date”) between -Dapper Labs, Inc., a Canadian corporation having its principal place of business at 980-350 Howe Street, -Vancouver, BC V6Z 1N9 (“DLI”) and BlockScience, Inc., a California corporation with an address at 471 McAuley Street, -Oakland, CA 94609 (“BlockScience”). This Agreement includes the attached Exhibit A. - -WHEREAS, DLI and BlockScience are parties to that certain Professional Services Agreement dated March 23, 2018 (the -“PSA”), pursuant to which BlockScience performed and is currently performing professional services and other development -work for DLI; - -WHEREAS, as part of BlockScience’s performance under the PSA, BlockScience developed certain “behaviour archetypes” and -“configuration of the Null Model”, which the parties agree are “Work Product” under the PSA; - -WHEREAS, the parties agree that BlockScience’s proprietary SimCAD software tool is considered “Contractor Technology” -under the PSA; and - -WHEREAS, the parties wish to enter into this Agreement to clarify DLI’s rights to use the SimCAD software tool on a -going-forward basis. - -NOW, THEREFORE, for good and valuable consideration, the receipt and sufficiency of which is hereby acknowledged, DLI -and BlockScience agree as follows: - -1. DEFINITIONS - -(a) “Affiliate” means any entity that, directly or indirectly through one or more intermediaries, controls, is -controlled by, or is under common control with, DLI. - -(b) “Documentation” means any manuals, documentation and other supporting materials related to the Software. -Documentation is considered part of the related Software. - -(c) “Intellectual Property Rights” means patent rights (including patent applications and disclosures), copyrights, -trade marks, trade secrets, know-how and any other intellectual property rights recognized in any country or -jurisdiction in the world. - -(d) “Software” means the object and source code versions of BlockScience’s proprietary SimCAD software product more -fully described in Exhibit A. Software includes the applicable Documentation, as well as any Updates. - -(e) “Update” means any bug fix, error correction, patch, modification, enhancement, update, upgrade, replacement, -successor product, new version, new release, or derivative work of or to the Software. - -(f) “Zeus” means the decentralized synchronous computational network developed by DLI, as such name or reference may be -changed from time to time at DLI’s sole discretion. - -2. SOFTWARE LICENSE - -(a) License Grant. BlockScience hereby grants to DLI and its Affiliates a worldwide, non-exclusive, royalty-free, -irrevocable, perpetual license to (i) download, install, use, execute, access, copy, perform, and modify, the Software -in connection with the Zeus project; (ii) distribute and display the Software internally amongst DLI and its Affiliates, -its and their employees, contractors, and agents, subject to the use of reasonable efforts to maintain the confidential -status of the non-public aspects of the Software display; and (iii) create derivative works of the Software in -connection with the Zeus project, provided that any such derivative works may only be used in connection with the Zeus -project. For the sake of clarity, nothing in this Agreement (including, without limitation, this Section 2) will create -any liability to DLI for or restrict DLI’s ability to externally distribute python scripts containing the “input” -configuration files specific to the Zeus project, as well as the notebooks with the resulting “output” data from the -Software, all of which may be distributed, displayed, and shared publicly at DLI’s discretion. - -(b) Ownership; Limited Rights. As between the parties, BlockScience owns and retains all right, title and interest in -and to the Software, and all Intellectual Property Rights therein. DLI’s rights in the Software are limited to those -expressly granted in Section 2(a) and in the PSA. BlockScience reserves all rights and licenses in the Software not -expressly granted to DLI herein and in the PSA. - -(c) Delivery. BlockScience will deliver a copy of the Software and Documentation to DLI on the Effective Date. The -delivery may be made in electronic form, or via hardcopy medium (e.g., a CD). - -(d) Updates. BlockScience will deliver Updates to DLI as and when such Updates become available. The obligation to -deliver Updates will continue for as long as the PSA remains in force; upon termination or expiration of the PSA, -BlockScience’s obligation to provide Updates will automatically terminate. - -(e) Support. BlockScience will provide reasonable technical support for the Software, to help DLI manage any support -issues that arise. The obligation to provide support will continue for as long as the PSA remains in force; upon -termination or expiration of the PSA, BlockScience’s obligation to provide support will automatically terminate. - -3. NO FEES. - -There are no fees owed by DLI for the license granted or the Updates or support provided by BlockScience -pursuant to this Agreement. Each party will bear its own costs and expenses arising out of or relating to its -obligations, efforts and performance under this Agreement. - -4. LIMITED WARRANTY; DISCLAIMER - -(a) Limited Warranty. BlockScience represents and warrants as follows: (i) that it has the right to enter into this -Agreement, and to perform its obligations hereunder, without violating the terms of any other agreement; (ii) that the -Software, and any Updates, do not and will not infringe, violate, or misappropriate the Intellectual Property Rights of -any third party; (iii) that the Software and any Updates do not and will not contain any virus, malware, spyware, trojan -horse, or other malicious code; and (iv) that the Software and each Update will substantially conform to its -Documentation. - -(b) Disclaimer. EXCEPT AS OTHERWISE SET FORTH IN THIS AGREEMENT, BLOCKSCIENCE DISCLAIMS ALL OTHER WARRANTIES, EXPRESS OR -IMPLIED, RELATED TO THE SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR -PURPOSE. - -5. TERM & TERMINATION - -(a) Term. This Agreement begins on the Effective Date, and will continue in effect until one of us terminates it in -accordance with Section 5(b). - -(b) Termination for Breach. Either party may terminate this Agreement if the other party breaches any material term or -condition of this Agreement, and the breaching party fails to cure the breach within thirty (30) days of receiving -written notice of it. - -(c) Survival. Sections 2 through 7 will survive termination or expiration of this Agreement. - -6. INDEMNIFICATION. - -BlockScience will defend, indemnify, and hold DLI harmless from and against any claim, damage, loss, -liability, expense and cost (including, without limitation, reasonable attorneys’ fees) incurred by or brought against -DLI arising out of or related to: (i) any claim that the Software infringes or misappropriates the Intellectual Property -Rights of that third party; or (ii) BlockScience’s breach of its limited warranties in Section 4(a). - -7. GENERAL TERMS - -(a) Entire Agreement; Waiver. This Agreement is the entire understanding of the parties, and supersedes any and all -prior agreements or understandings between the parties as to its subject matter. It may be amended or modified, or -provisions waived, only in a writing signed by both parties. The waiver of a breach of any provision of this Agreement -will not operate or be interpreted as a waiver of any other or subsequent breach. - -(b) Acknowledgement. BlockScience acknowledges and agrees that the “behaviour archetypes” and “configuration of the Null -Model” referenced in the PSA are considered “Work Product” under the PSA. - -(c) Governing Law. This Agreement will be construed, interpreted and applies in accordance with the internal laws of -British Columbia, Canada (excluding its body of law controlling conflicts of law). Any legal action or proceeding -arising under or related to this Agreement will be brought exclusively in the federal or provincial courts located in -Vancouver, British Columbia, and the parties irrevocably consent to personal jurisdiction and venue there. - -(d) Severability. If any provision of this Agreement is held to be invalid or unenforceable for any reason, that -provision will be enforced to the maximum extent permitted by law, and the remaining provisions will continue in full -force and effect. - -(e) Miscellaneous. This Agreement may be executed in one or more counterparts, with the same effect as if the parties -had signed the same document. Each counterpart so executed will be deemed to be an original, and all such counterparts -will be construed together and will constitute one Agreement. The prevailing party in any action or legal proceeding -arising out of this Agreement will be entitled to recover from the other party all reasonable costs and expenses -incurred in connection with such action or proceeding, including reasonable attorneys’ fees and court costs. In the -event of a direct conflict between the terms of this Agreement and the PSA with respect to the DLI’s rights in and to -the Software, the terms of this Agreement will control. - -EXHIBIT A - -SOFTWARE - -Software Name: SimCAD tool - -Software Description: SimCAD is a Monte-Carlo based simulation software package for research, validation, and -Computer Aided Design of economic systems. An economic system is treated as a state based model and defined -through a set of endogenous and exogenous state variables which are updated through mechanisms and -environmental processes, respectively. Behavioral models, which may be deterministic or stochastic, provide the -evolution of the system within the action space of the mechanisms. Simulations can be run with a range of initial -conditions and parameters for states, behaviors, mechanisms, and environmental processes to understand and -visualize network behavior under various conditions. \ No newline at end of file From 06de968a6036c677bf7270e56f499de1d7d9104d Mon Sep 17 00:00:00 2001 From: "Joshua E. Jodesty" Date: Fri, 11 Jan 2019 09:52:24 -0500 Subject: [PATCH 7/9] added licenses --- licenses/AGREEMENT.txt | 150 +++++++++++++++++++++++++++++++++++++++++ licenses/LICENSE.txt | 119 ++++++++++++++++++++++++++++++++ 2 files changed, 269 insertions(+) create mode 100644 licenses/AGREEMENT.txt create mode 100644 licenses/LICENSE.txt diff --git a/licenses/AGREEMENT.txt b/licenses/AGREEMENT.txt new file mode 100644 index 0000000..b5d9242 --- /dev/null +++ b/licenses/AGREEMENT.txt @@ -0,0 +1,150 @@ +SOFTWARE LICENSE AGREEMENT + +This Software License Agreement (the “Agreement”) is entered into as of December __ 2018, (the “Effective Date”) between +Dapper Labs, Inc., a Canadian corporation having its principal place of business at 980-350 Howe Street, +Vancouver, BC V6Z 1N9 (“DLI”) and BlockScience, Inc., a California corporation with an address at 471 McAuley Street, +Oakland, CA 94609 (“BlockScience”). This Agreement includes the attached Exhibit A. + +WHEREAS, DLI and BlockScience are parties to that certain Professional Services Agreement dated March 23, 2018 (the +“PSA”), pursuant to which BlockScience performed and is currently performing professional services and other development +work for DLI; + +WHEREAS, as part of BlockScience’s performance under the PSA, BlockScience developed certain “behaviour archetypes” and +“configuration of the Null Model”, which the parties agree are “Work Product” under the PSA; + +WHEREAS, the parties agree that BlockScience’s proprietary SimCAD software tool is considered “Contractor Technology” +under the PSA; and + +WHEREAS, the parties wish to enter into this Agreement to clarify DLI’s rights to use the SimCAD software tool on a +going-forward basis. + +NOW, THEREFORE, for good and valuable consideration, the receipt and sufficiency of which is hereby acknowledged, DLI +and BlockScience agree as follows: + +1. DEFINITIONS + +(a) “Affiliate” means any entity that, directly or indirectly through one or more intermediaries, controls, is +controlled by, or is under common control with, DLI. + +(b) “Documentation” means any manuals, documentation and other supporting materials related to the Software. +Documentation is considered part of the related Software. + +(c) “Intellectual Property Rights” means patent rights (including patent applications and disclosures), copyrights, +trade marks, trade secrets, know-how and any other intellectual property rights recognized in any country or +jurisdiction in the world. + +(d) “Software” means the object and source code versions of BlockScience’s proprietary SimCAD software product more +fully described in Exhibit A. Software includes the applicable Documentation, as well as any Updates. + +(e) “Update” means any bug fix, error correction, patch, modification, enhancement, update, upgrade, replacement, +successor product, new version, new release, or derivative work of or to the Software. + +(f) “Zeus” means the decentralized synchronous computational network developed by DLI, as such name or reference may be +changed from time to time at DLI’s sole discretion. + +2. SOFTWARE LICENSE + +(a) License Grant. BlockScience hereby grants to DLI and its Affiliates a worldwide, non-exclusive, royalty-free, +irrevocable, perpetual license to (i) download, install, use, execute, access, copy, perform, and modify, the Software +in connection with the Zeus project; (ii) distribute and display the Software internally amongst DLI and its Affiliates, +its and their employees, contractors, and agents, subject to the use of reasonable efforts to maintain the confidential +status of the non-public aspects of the Software display; and (iii) create derivative works of the Software in +connection with the Zeus project, provided that any such derivative works may only be used in connection with the Zeus +project. For the sake of clarity, nothing in this Agreement (including, without limitation, this Section 2) will create +any liability to DLI for or restrict DLI’s ability to externally distribute python scripts containing the “input” +configuration files specific to the Zeus project, as well as the notebooks with the resulting “output” data from the +Software, all of which may be distributed, displayed, and shared publicly at DLI’s discretion. + +(b) Ownership; Limited Rights. As between the parties, BlockScience owns and retains all right, title and interest in +and to the Software, and all Intellectual Property Rights therein. DLI’s rights in the Software are limited to those +expressly granted in Section 2(a) and in the PSA. BlockScience reserves all rights and licenses in the Software not +expressly granted to DLI herein and in the PSA. + +(c) Delivery. BlockScience will deliver a copy of the Software and Documentation to DLI on the Effective Date. The +delivery may be made in electronic form, or via hardcopy medium (e.g., a CD). + +(d) Updates. BlockScience will deliver Updates to DLI as and when such Updates become available. The obligation to +deliver Updates will continue for as long as the PSA remains in force; upon termination or expiration of the PSA, +BlockScience’s obligation to provide Updates will automatically terminate. + +(e) Support. BlockScience will provide reasonable technical support for the Software, to help DLI manage any support +issues that arise. The obligation to provide support will continue for as long as the PSA remains in force; upon +termination or expiration of the PSA, BlockScience’s obligation to provide support will automatically terminate. + +3. NO FEES. + +There are no fees owed by DLI for the license granted or the Updates or support provided by BlockScience +pursuant to this Agreement. Each party will bear its own costs and expenses arising out of or relating to its +obligations, efforts and performance under this Agreement. + +4. LIMITED WARRANTY; DISCLAIMER + +(a) Limited Warranty. BlockScience represents and warrants as follows: (i) that it has the right to enter into this +Agreement, and to perform its obligations hereunder, without violating the terms of any other agreement; (ii) that the +Software, and any Updates, do not and will not infringe, violate, or misappropriate the Intellectual Property Rights of +any third party; (iii) that the Software and any Updates do not and will not contain any virus, malware, spyware, trojan +horse, or other malicious code; and (iv) that the Software and each Update will substantially conform to its +Documentation. + +(b) Disclaimer. EXCEPT AS OTHERWISE SET FORTH IN THIS AGREEMENT, BLOCKSCIENCE DISCLAIMS ALL OTHER WARRANTIES, EXPRESS OR +IMPLIED, RELATED TO THE SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. + +5. TERM & TERMINATION + +(a) Term. This Agreement begins on the Effective Date, and will continue in effect until one of us terminates it in +accordance with Section 5(b). + +(b) Termination for Breach. Either party may terminate this Agreement if the other party breaches any material term or +condition of this Agreement, and the breaching party fails to cure the breach within thirty (30) days of receiving +written notice of it. + +(c) Survival. Sections 2 through 7 will survive termination or expiration of this Agreement. + +6. INDEMNIFICATION. + +BlockScience will defend, indemnify, and hold DLI harmless from and against any claim, damage, loss, +liability, expense and cost (including, without limitation, reasonable attorneys’ fees) incurred by or brought against +DLI arising out of or related to: (i) any claim that the Software infringes or misappropriates the Intellectual Property +Rights of that third party; or (ii) BlockScience’s breach of its limited warranties in Section 4(a). + +7. GENERAL TERMS + +(a) Entire Agreement; Waiver. This Agreement is the entire understanding of the parties, and supersedes any and all +prior agreements or understandings between the parties as to its subject matter. It may be amended or modified, or +provisions waived, only in a writing signed by both parties. The waiver of a breach of any provision of this Agreement +will not operate or be interpreted as a waiver of any other or subsequent breach. + +(b) Acknowledgement. BlockScience acknowledges and agrees that the “behaviour archetypes” and “configuration of the Null +Model” referenced in the PSA are considered “Work Product” under the PSA. + +(c) Governing Law. This Agreement will be construed, interpreted and applies in accordance with the internal laws of +British Columbia, Canada (excluding its body of law controlling conflicts of law). Any legal action or proceeding +arising under or related to this Agreement will be brought exclusively in the federal or provincial courts located in +Vancouver, British Columbia, and the parties irrevocably consent to personal jurisdiction and venue there. + +(d) Severability. If any provision of this Agreement is held to be invalid or unenforceable for any reason, that +provision will be enforced to the maximum extent permitted by law, and the remaining provisions will continue in full +force and effect. + +(e) Miscellaneous. This Agreement may be executed in one or more counterparts, with the same effect as if the parties +had signed the same document. Each counterpart so executed will be deemed to be an original, and all such counterparts +will be construed together and will constitute one Agreement. The prevailing party in any action or legal proceeding +arising out of this Agreement will be entitled to recover from the other party all reasonable costs and expenses +incurred in connection with such action or proceeding, including reasonable attorneys’ fees and court costs. In the +event of a direct conflict between the terms of this Agreement and the PSA with respect to the DLI’s rights in and to +the Software, the terms of this Agreement will control. + +EXHIBIT A + +SOFTWARE + +Software Name: SimCAD tool + +Software Description: SimCAD is a Monte-Carlo based simulation software package for research, validation, and +Computer Aided Design of economic systems. An economic system is treated as a state based model and defined +through a set of endogenous and exogenous state variables which are updated through mechanisms and +environmental processes, respectively. Behavioral models, which may be deterministic or stochastic, provide the +evolution of the system within the action space of the mechanisms. Simulations can be run with a range of initial +conditions and parameters for states, behaviors, mechanisms, and environmental processes to understand and +visualize network behavior under various conditions. \ No newline at end of file diff --git a/licenses/LICENSE.txt b/licenses/LICENSE.txt new file mode 100644 index 0000000..04c5891 --- /dev/null +++ b/licenses/LICENSE.txt @@ -0,0 +1,119 @@ +TRIAL LICENSE AGREEMENT + +BACKGROUND + +Company has developed and intends to market and license a certain software product and service called ”SimCAD” which, +among other things, is a scientific engineering simulation tool (“Software”). Company wishes to provide access, on a +trial basis, to users of a “beta” version of the Software to test and provide feedback to Company. Licensee wishes to +participate in Company’s beta trial of the Software and to provide feedback to Company with respect to Licensee’s use +thereof. + +Accordingly, the parties hereby agree as follows: + +1. BETA PRODUCT. + +This Agreement applies to any pre­release version of the Software and any updates and changes thereto during the Term +(collectively, “Beta Product”). As an essential condition of this Agreement, Licensee understands and acknowledges that: +(a) Licensee is participating in a beta test of the Beta Product; (b) the Beta Product has not been field tested or +trialed; and (c) the Beta Product may not operate properly or be error free and may not perform all functions for +which it is intended or represented. + +2. FEEDBACK. + +As a condition of this Agreement, during the Term of this Agreement, Licensee agrees to provide Company with comments, +feedback, criticisms, and suggestions for changes to the Beta Product (“Feedback”), and to help Company identify errors +or malfunctions, and performance issues, in the operation of the Beta Product, as Company may reasonably request. All +rights to any Feedback or other intellectual property derived from Licensee’s use of or relating to the Beta Product, +as well any data collected from the use of the Beta Product, belong solely to Company and Licensee hereby irrevocably +assigns all such rights to Company. Company reserves the right to use all Feedback and data collected as a result of the +use of the Beta Product to advertise and promote the Company and the Software. + +3. LICENSE AND RESERVATION OF RIGHTS. + +3.1 Subject to the terms and conditions set forth in this Agreement, Company hereby grants Licensee, and Licensee +accepts, during the Term, a non­exclusive, royalty­free, revocable, non­transferable, limited license to access and use +the Beta Product for its internal, non­commercial use for evaluation purposes only, and to give permission to employees +of Licensee and employees of Licensee’s subsidiaries (“Permitted Users”) to use the Beta Product in accordance with the +foregoing. + +3.2 The Beta Product and the Software comprise the intellectual property of Company. All right, title and interest in +and to the Beta Product (and, more generally, in and to the Software), and to all Feedback and data arising from its +use, in whole or in part, and all patent, copyright, trade­marks, trade secret and all other intellectual and industrial +property rights therein and the structure, sequence and organization of same, and the media on which such material is +contained belong exclusively to Company. Licensee and its Permitted Users will not, directly or indirectly: reverse +engineer, decompile, disassemble or otherwise attempt to discover the source code, object code or underlying structure, +ideas, know­how or algorithms relevant to the Beta Product; modify, adapt, alter, edit, correct, translate, publish, +sell, transfer, assign, convey, rent, lease, loan, pledge, sublicense, distribute, export, enhance or create derivative +works based on the Beta Product; or remove, alter, cover or otherwise obscure any proprietary notices or labels +displayed on or within the Beta Product any documentation relating thereto. + +4. DISCLAIMER. + +4.1 COMPANY MAKES NO WARRANTIES, WHETHER EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, WITH RESPECT TO THE BETA PRODUCT, +INCLUDING, BUT NOT LIMITED TO, THE AVAILABILITY, QUALITY OR PERFORMANCE OF THE BETA PRODUCT. COMPANY SPECIFICALLY +DISCLAIMS ALL EXPRESS, STATUTORY AND IMPLIED WARRANTIES AND CONDITIONS, INCLUDING, WITHOUT LIMITATION (A) THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON­INFRINGEMENT, (B) ANY WARRANTIES AGAINST HIDDEN +OR LATENT DEFECTS, (C) AND ANY WARRANTIES AND CONDITIONS ARISING OUT OF COURSE OF DEALING OR USAGE OF TRADE AND (D) ANY +WARRANTY OR REPRESENTATION THAT THE BETA PRODUCT IS ERROR­FREE, VIRUS­FREE, SECURE, UNINTERRUPTED, OR FREE FROM +UNAUTHORIZED ACCESS (INCLUDING, BUT NOT LIMITED TO, THIRD PARTY HACKERS OR DENIAL OF SERVICE ATTACKS). THE BETA PRODUCT +IS SUPPLIED ON AN “AS IS”, “AS AVAILABLE” BASIS WITHOUT WARRANTY. + +4.2 NEITHER PARTY SHALL BE LIABLE FOR SPECIAL, INCIDENTAL, PUNITIVE, CONSEQUENTIAL OR INDIRECT DAMAGES OR LOSS +(INCLUDING DEATH AND PERSONAL INJURY), IRRESPECTIVE OF THEIR CAUSE, NOTWITHSTANDING THAT A PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH LOSS OR DAMAGE, NOR FOR ANY CLAIMS FOR SUCH LOSS OR DAMAGE INSTITUTED AGAINST A PARTY OR ITS +CUSTOMERS BY ANY THIRD PARTY. + +5. CONFIDENTIALITY + +5.1 All Confidential Information disclosed by either party shall be kept by the receiving party in strict confidence and +shall not be disclosed to any third party without the disclosing party’s express written consent. For purposes of this +Agreement, “Confidential Information” means all information regarding either party’s business which has been marked or +is otherwise communicated as being “proprietary” or “confidential” or which reasonably should be known by the receiving +party to be proprietary or confidential information. Without limiting the generality of the foregoing, Confidential +Information of Company includes non­public information regarding features, functionality and performance of the Beta +Product, including all Feedback and related data. Notwithstanding the foregoing, each party’s confidentiality +obligations hereunder shall not apply to information that: (a) is already known to the receiving party without a +pre­existing restriction as to disclosure; (b) is or becomes publicly available without fault of the receiving party; +(c) is rightfully obtained by the receiving party from a third party without restriction as to disclosure, or is +approved for release by written authorization of the disclosing party; (d) is developed independently by the receiving +party without use of the disclosing party’s Confidential Information; or (e) is required to be disclosed by law or +regulation, including, but not limited to, supplying such information or making such statements or disclosures relating +to this Agreement before any competent court, governmental agency or authority in response to a lawful requirement or +request from a court of governmental agency or authority, provided that the disclosing party shall give the other party +prompt notice of such request, to the extent practicable, so that the other party may seek (at its sole cost and +expense) an appropriate protective order or similar relief. + +5.2 In the event of a breach of Sections 2, 3 or this Section 5, the non­breaching party shall be entitled to seek +equitable relief to protect its interests, including, but not limited to, injunctive relief. In the event of expiration +or earlier termination of this Agreement, each party shall immediately return to the other party such other party’s +Confidential Information, or at such other party’s option, destroy any remaining Confidential Information and certify +that such destruction has taken place. + +6. FEES; EXPENSES. + +Neither party shall be entitled to any compensation in connection with this Agreement or its use or provision of the +Beta Product. Each party shall bear its own costs and expenses arising from this Agreement and its use or provision of +the Beta Product, as the case may be. + +7. TERM OF AGREEMENT. + +This Agreement shall begin on the Effective Date and shall continue until it has been terminated (such period, the +“Term”). Either party shall have the right to terminate this Agreement at any time on one (1) month written notice to +the other party, or in the case of a breach of this Agreement by Licensee or its Permitted Users, Company may terminate +this Agreement immediately on written notice to Licensee. Upon termination of this Agreement, all rights granted to +Licensee (and any Permitted User) under this Agreement will immediately terminate and Licensee (and all Permitted Users) +must immediately cease all use of the Beta Product at such time. Notwithstanding any termination of this Agreement, +Sections 2, 3.2, 4, 5, 6, this Section 7 and Section 8 shall survive and remain binding on the parties. + +8. MISCELLANEOUS. + +This Agreement shall be governed by and construed in accordance with the laws of the State of New York. All disputes +relating to this Agreement shall be resolved in the federal and state courts of New York County, New York and the +parties submit to the jurisdiction of such courts. This Agreement does not create any agency, partnership, or joint +venture relationship between Licensee and Company. This Agreement is the entire understanding of the parties with +respect to the subject matter hereof and supersedes any previous or contemporaneous communications, representations, +warranties, discussions, arrangements or commitments, whether oral or written with respect to such subject matter. This +Agreement cannot be amended except by a written amendment that expressly refers to this Agreement and is signed by an +authorized representative of each party. This Agreement may be executed in one or more counterparts, including via +facsimile or email (or any other electronic means such as “.pdf” or “.tiff” files), each of which shall be deemed an +original, and all of which shall constitute one and the same Agreement. \ No newline at end of file From 9a7af896912aa09157092d7048036ce695fced1e Mon Sep 17 00:00:00 2001 From: "Joshua E. Jodesty" Date: Fri, 11 Jan 2019 11:00:47 -0500 Subject: [PATCH 8/9] update --- .gitignore | 1 + README.md | 15 ++++----------- dist/SimCAD-0.1-py3-none-any.whl | Bin 11724 -> 7533 bytes dist/SimCAD-0.1.tar.gz | Bin 6132 -> 0 bytes simulations/sim_test.py | 5 ++--- simulations/test.ipynb | 1 + 6 files changed, 8 insertions(+), 14 deletions(-) delete mode 100644 dist/SimCAD-0.1.tar.gz diff --git a/.gitignore b/.gitignore index a9e45ba..93f9edb 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ results *.csv *.txt simulations/.ipynb_checkpoints +dist/SimCAD-0.1.tar.gz build SimCAD.egg-info \ No newline at end of file diff --git a/README.md b/README.md index a5c1aa7..b56fea1 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ A/B testing policies, monte carlo analysis and other common numerical methods is **1. Install Dependencies:** ```bash pip install -r requirements.txt -pip install -e . +python3 setup.py sdist bdist_wheel ``` **2. Configure Simulation:** @@ -33,25 +33,19 @@ Examples: **3. Import SimCAD & Run Simulation:** Example: -`/demos/sim_test.py` or `test.ipynb` +`/simulations/sim_test.py` or `/simulations/test.ipynb` ```python import pandas as pd from tabulate import tabulate - -# The following imports NEED to be in the exact same order - +# The following imports NEED to be in the exact order from SimCAD.engine import ExecutionMode, ExecutionContext, Executor -from simulations.validation import config1, config2 +from validation import config1, config2 from SimCAD import configs - -# ToDo: pass ExecutionContext with execution method as ExecutionContext input - exec_mode = ExecutionMode() - print("Simulation Execution 1") print() first_config = [configs[0]] # from config1 @@ -59,7 +53,6 @@ single_proc_ctx = ExecutionContext(context=exec_mode.single_proc) run1 = Executor(exec_context=single_proc_ctx, configs=first_config) run1_raw_result, tensor_field = run1.main() result = pd.DataFrame(run1_raw_result) - print() print("Tensor Field:") print(tabulate(tensor_field, headers='keys', tablefmt='psql')) diff --git a/dist/SimCAD-0.1-py3-none-any.whl b/dist/SimCAD-0.1-py3-none-any.whl index 070c329bbc6296426d9eab8b88aa9d89dcf22899..10b79b5c93d4020914d2e15d8a00e5c408f9c690 100644 GIT binary patch delta 759 zcmX>T{nl#3c44N_`pvVIPcs4O$r);sm_q6&|50=23$54oo4fFBp#u{G!)fNpf$B>2 z7fGV9kFUlip$%$?7^CS>iE-ghQ%o3FfJ&Usfjfo*Q4NYwQoTXiqRhOxxm z7VP=*=ufj>Zn0az4t3kC+37l;^jCK5bbaHQYgB)T&-nPP@R(M))_nzEPprGzaB9I6 zAH{=Rhx9*OSiGwG*!Bxc{O_#meA^eS94qYm%9-`}lbpM0&UedIr=ERt{GPVCj3f7@ z`kyBHLOr*3^E|X|kDvVhf9JH~$LlM9=@eCOJ@K$|SD42HR)y2Yd`^9yp}^g;y^6QP z^sv3yQ(hO}fAu=QlGH=$MBYbdN<5yq^~##74-Y0MeSdO+yY%APxq-T#nTZY?)*SdN zU>(AL_56hB%-IiDNq#7lesfjMqxeovnfJNq8P^l;c~!o$wsYOS&v65j^M8Z=|335z zvlL0FrEh4i5jpj^cl~Wy-N|nf&(yg3Y4RMp8{~L#hh)nUL;knd>$kC8K2_qCENc+= z#q_i-lDQ$+1%;Yp3 z$;oGRL=-?tZS(6Z{V@y-3?M88#4xa=u}W+*qpk)hS!(ObF!6~4dE%23bS1&s5Gj;_ fK^mq9NN-^bhbY{j%g4vVz{Aka%)oF#5~KnEeZEwJ delta 4965 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 I!2g~8A1$Uqv;Y7A diff --git a/dist/SimCAD-0.1.tar.gz b/dist/SimCAD-0.1.tar.gz deleted file mode 100644 index fa62ddcc86065f9658a8abfd10c40a5b456abd06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6132 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 Gpa1~2QX_-_ diff --git a/simulations/sim_test.py b/simulations/sim_test.py index ae58ba4..3a18378 100644 --- a/simulations/sim_test.py +++ b/simulations/sim_test.py @@ -3,12 +3,11 @@ from tabulate import tabulate # The following imports NEED to be in the exact order from SimCAD.engine import ExecutionMode, ExecutionContext, Executor -from simulations.validation import config1, config2 +from validation import config1, config2 from SimCAD import configs exec_mode = ExecutionMode() - print("Simulation Execution 1") print() first_config = [configs[0]] # from config1 @@ -34,4 +33,4 @@ for raw_result, tensor_field in run2.main(): print(tabulate(tensor_field, headers='keys', tablefmt='psql')) print("Output:") print(tabulate(result, headers='keys', tablefmt='psql')) - print() \ No newline at end of file + print() diff --git a/simulations/test.ipynb b/simulations/test.ipynb index b281b65..8f8415a 100644 --- a/simulations/test.ipynb +++ b/simulations/test.ipynb @@ -7,6 +7,7 @@ "outputs": [], "source": [ "import pandas as pd\n", + "from tabulate import tabulate\n", "\n", "# The following imports NEED to be in the exact order\n", "from SimCAD.engine import ExecutionMode, ExecutionContext, Executor\n", From c6f5e5cce2e5519f1b2c31b67fae8e99a411ce3d Mon Sep 17 00:00:00 2001 From: "Joshua E. Jodesty" Date: Fri, 11 Jan 2019 11:12:31 -0500 Subject: [PATCH 9/9] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b56fea1..6421442 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,9 @@ Examples: **3. Import SimCAD & Run Simulation:** -Example: -`/simulations/sim_test.py` or `/simulations/test.ipynb` +Examples: `/simulations/sim_test.py` or `/simulations/test.ipynb` +`/simulations/sim_test.py`: ```python import pandas as pd from tabulate import tabulate