From 0a0d85c2578697035be570d59e98dbba04fca470 Mon Sep 17 00:00:00 2001 From: "Joshua E. Jodesty" Date: Fri, 31 May 2019 16:57:30 -0400 Subject: [PATCH] ver. 0.2.4 --- cadCAD/configuration/utils/__init__.py | 7 -- .../configuration/utils/policyAggregation.py | 37 ----------- cadCAD/engine/__init__.py | 4 -- cadCAD/engine/simulation.py | 60 +----------------- cadCAD/utils/sys_config.py | 9 +-- dist/cadCAD-0.2.3-py3-none-any.whl | Bin 15601 -> 0 bytes dist/cadCAD-0.2.4-py3-none-any.whl | Bin 0 -> 15046 bytes setup.py | 2 +- 8 files changed, 3 insertions(+), 116 deletions(-) delete mode 100644 dist/cadCAD-0.2.3-py3-none-any.whl create mode 100644 dist/cadCAD-0.2.4-py3-none-any.whl diff --git a/cadCAD/configuration/utils/__init__.py b/cadCAD/configuration/utils/__init__.py index a4ab297..3efdcc3 100644 --- a/cadCAD/configuration/utils/__init__.py +++ b/cadCAD/configuration/utils/__init__.py @@ -1,9 +1,6 @@ from datetime import datetime, timedelta -from decimal import Decimal from copy import deepcopy from functools import reduce -from pprint import pprint - from fn.func import curried from funcy import curry import pandas as pd @@ -175,9 +172,6 @@ def env_trigger(end_substep): return lambda trigger_field, trigger_vals, funct_list: \ curry(trigger)(end_substep)(trigger_field)(trigger_vals)(funct_list) -# trigger = curry(_trigger) -# print(timestep_trigger) - # param sweep enabling middleware def config_sim(d): @@ -185,7 +179,6 @@ def config_sim(d): return flatten_tabulated_dict(tabulate_dict(d)) if "M" in d: - # print([{"N": d["N"], "T": d["T"], "M": M} for M in process_variables(d["M"])]) return [{"N": d["N"], "T": d["T"], "M": M} for M in process_variables(d["M"])] else: d["M"] = [{}] diff --git a/cadCAD/configuration/utils/policyAggregation.py b/cadCAD/configuration/utils/policyAggregation.py index c43de03..96077dc 100644 --- a/cadCAD/configuration/utils/policyAggregation.py +++ b/cadCAD/configuration/utils/policyAggregation.py @@ -1,6 +1,5 @@ from fn.op import foldr from fn.func import curried -from collections import Counter def get_base_value(x): if isinstance(x, str): @@ -39,43 +38,7 @@ def dict_op(f, d1, d2): 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} -# -# @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(source_dict[key]) -# else: -# return target_dict[key] -# -# key_set = set(list(d1.keys()) + list(d2.keys())) -# -# norm_d1 = {k: set_base_value(d1, d2, k) for k in key_set} -# norm_d2 = {k: set_base_value(d2, d1, k) for k in key_set} -# -# return {k: f(set_base_value(d1, d2, k), set_base_value(d2, d1, k)) for k in key_set} - - -# @curried -# def dict_op(f, d1, d2): -# # d1C = Counter(d1) -# # d2C = Counter(d2) -# def set_base_value(target_dict, source_dict, key): -# if key not in target_dict: -# return get_base_value(source_dict[key]) -# else: -# return target_dict[key] -# key_set = set(list(d1.keys()) + list(d2.keys())) -# norm_d1 = Counter({k: set_base_value(d1, d2, k) for k in key_set}) -# norm_d2 = Counter({k: set_base_value(d2, d1, k) for k in key_set}) -# # print(norm_d1) -# # print(norm_d2) -# print(norm_d1 + norm_d2) -# # print(f(norm_d1, norm_d2)) -# print() -# return f(norm_d1, norm_d2) def dict_elemwise_sum(): return dict_op(add) diff --git a/cadCAD/engine/__init__.py b/cadCAD/engine/__init__.py index 75c1e51..a8002b9 100644 --- a/cadCAD/engine/__init__.py +++ b/cadCAD/engine/__init__.py @@ -27,11 +27,8 @@ def single_proc_exec( Ts: List[range], Ns: List[int] ): - # print(env_processes_list) - # print(configs_structs) l = [simulation_execs, states_lists, configs_structs, env_processes_list, Ts, Ns] simulation_exec, states_list, config, env_processes, T, N = list(map(lambda x: x.pop(), l)) - # print(config.env_processes) result = simulation_exec(var_dict_list, states_list, config, env_processes, T, N) return flatten(result) @@ -68,7 +65,6 @@ class Executor: self.exec_method = exec_context.method self.exec_context = exec_context.name self.configs = configs - # self.main = self.execute def execute(self) -> Tuple[List[Dict[str, Any]], DataFrame]: config_proc = Processor() diff --git a/cadCAD/engine/simulation.py b/cadCAD/engine/simulation.py index d278633..8a5c5df 100644 --- a/cadCAD/engine/simulation.py +++ b/cadCAD/engine/simulation.py @@ -1,9 +1,7 @@ from typing import Any, Callable, Dict, List, Tuple - from pathos.pools import ThreadPool as TPool from copy import deepcopy from functools import reduce -from funcy import compose from cadCAD.engine.utils import engine_exception from cadCAD.utils import flatten @@ -19,13 +17,10 @@ class Executor: state_update_exception: Callable = id_exception ) -> None: - # behavior_ops self.policy_ops = policy_ops self.state_update_exception = state_update_exception self.policy_update_exception = policy_update_exception - # behavior_update_exception - # get_behavior_input # sL: State Window def get_policy_input( self, sweep_dict: Dict[str, List[Any]], @@ -35,10 +30,8 @@ class Executor: funcs: List[Callable] ) -> Dict[str, Any]: - # ops = self.policy_ops[::-1] ops = self.policy_ops - def get_col_results(sweep_dict, sub_step, sL, s, funcs): return list(map(lambda f: f(sweep_dict, sub_step, sL, s), funcs)) @@ -119,23 +112,7 @@ class Executor: run: int ) -> List[Dict[str, Any]]: - # def dp_psu(d): - # for k, v in deepcopy(d).items(): - # yield k, deepcopy(v) - # - # def dp_psub(l): - # for d in l: - # yield dict(dp_psu(d)) - - # last_in_obj: Dict[str, Any] = dict(dp_psu(sL[-1])) - last_in_obj: Dict[str, Any] = deepcopy(sL[-1]) - # last_in_obj: Dict[str, Any] = sL[-1] - - # last_in_obj: Dict[str, Any] = sH[-1] - # print(last_in_obj) - # print(sH[-1]) - _input: Dict[str, Any] = self.policy_update_exception(self.get_policy_input(sweep_dict, sub_step, sH, last_in_obj, policy_funcs)) # ToDo: add env_proc generator to `last_in_copy` iterator as wrapper function @@ -152,22 +129,13 @@ class Executor: return destination last_in_copy: Dict[str, Any] = transfer_missing_fields(last_in_obj, dict(generate_record(state_funcs))) - # ToDo: Remove - # last_in_copy: Dict[str, Any] = self.apply_env_proc(env_processes, last_in_copy, last_in_copy['timestep']) - # print(env_processes) - # print() last_in_copy: Dict[str, Any] = self.apply_env_proc(sweep_dict, env_processes, last_in_copy) - - # ToDo: make 'substep' & 'timestep' reserve fields last_in_copy['substep'], last_in_copy['timestep'], last_in_copy['run'] = sub_step, time_step, run sL.append(last_in_copy) del last_in_copy - # print(sL) - # print() - return sL # mech_pipeline - state_update_block @@ -182,23 +150,7 @@ class Executor: ) -> List[Dict[str, Any]]: sub_step = 0 - # states_list_copy: List[Dict[str, Any]] = deepcopy(states_list) - # states_list_copy: List[Dict[str, Any]] = states_list - # ToDo: flatten first - # states_list_copy: List[Dict[str, Any]] = simulation_list[-1] states_list_copy: List[Dict[str, Any]] = deepcopy(simulation_list[-1]) - - # def dp_psu(d): - # for k, v in deepcopy(d).items(): - # yield k, deepcopy(v) - # - # def dp_psub(l): - # for d in l: - # yield dict(dp_psu(d)) - - # states_list_copy: List[Dict[str, Any]] = list(dp_psub(simulation_list[-1])) - # print(states_list_copy) - # ToDo: Causes Substep repeats in sL: genesis_states: Dict[str, Any] = states_list_copy[-1] @@ -211,7 +163,7 @@ class Executor: del states_list_copy states_list: List[Dict[str, Any]] = [genesis_states] - # ToDo: Causes Substep repeats in sL, use for yield + # ToDo: Was causing Substep repeats in sL, use for yield sub_step += 1 for [s_conf, p_conf] in configs: # tensor field @@ -219,11 +171,7 @@ class Executor: states_list: List[Dict[str, Any]] = self.partial_state_update( sweep_dict, sub_step, states_list, simulation_list, s_conf, p_conf, env_processes, time_step, run ) - # print(sub_step) - # print(simulation_list) - # print(flatten(simulation_list)) sub_step += 1 - # print(sub_step) time_step += 1 @@ -244,10 +192,6 @@ class Executor: # ToDo: simulation_list should be a Tensor that is generated throughout the Executor simulation_list: List[List[Dict[str, Any]]] = [states_list] - # print(simulation_list[-1]) - # print() - # pipe_run = simulation_list[-1] - # print(simulation_list) for time_step in time_seq: pipe_run: List[Dict[str, Any]] = self.state_update_pipeline( sweep_dict, simulation_list, configs, env_processes, time_step, run @@ -255,8 +199,6 @@ class Executor: _, *pipe_run = pipe_run simulation_list.append(pipe_run) - # print(simulation_list) - # print() return simulation_list diff --git a/cadCAD/utils/sys_config.py b/cadCAD/utils/sys_config.py index 738161c..3da1efe 100644 --- a/cadCAD/utils/sys_config.py +++ b/cadCAD/utils/sys_config.py @@ -1,12 +1,6 @@ -from copy import deepcopy - -from fn.func import curried +from funcy import curry from cadCAD.configuration.utils import ep_time_step, time_step -from funcy import curry -import pprint as pp -# from fn import _ -from functools import reduce def increment(y, incr_by): return lambda _g, step, sL, s, _input: (y, s[y] + incr_by) @@ -26,7 +20,6 @@ def update_timestamp(y, timedelta, format): ep_time_step(s, dt_str=s[y], fromat_str=format, _timedelta=timedelta) ) - def apply(f, y: str, incr_by: int): return lambda _g, step, sL, s, _input: (y, curry(f)(s[y])(incr_by)) diff --git a/dist/cadCAD-0.2.3-py3-none-any.whl b/dist/cadCAD-0.2.3-py3-none-any.whl deleted file mode 100644 index 19d55e7fc5efae02e7b3c981fa143f9ce6f710e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15601 zcmajGV{~O(_WvE*wr$&X#kOrb72CEesi=}vQn78@wyh_(`~T~@efxGl=Zrnh*e~{H ztaHv>Q|mkBrGY_E0000W0Iu^? zM0!+KrA9?wN>0YX)mdR%YJ5U^M1~#=N^}4SK>lAa|L|XOWWnw`ub=<`&*%UE1ixWM zcDAM#W-g8f&K7pIe@6GIYkgm3L-2j5mLKZ*!M;N3!D>xF5`;FbxZFzHKbX?05bG^i zJF%45^K^kL*+9CqES({gs!d~I%JRIQIklKQ;F;C9Zm}bqnYe11;Bh z$ehUV&g7gWmW)&#QgXVIG9oD~&y>W1C5~$gkpl7V+)I&`uCoNy{2ip~s1^16ikuY@ zvkNH^{(@ibyUB|3DaBgx+9Y$!1+ULAb-x!C4`v}d#A;o`73*QySZK^<&OR=x2Yof= zd2>qL_0iiE#i7E)mlBB1Bqg~MaWV_K(C2bWA#OqGl2Ttl2@cdm#&GQUI=f9&G~OPb z)VAxXUsR2*Ym3nZYJ(gpjoGXCkfc#0`X75Ns7 z39pAY6e%k57TS37hfT+`oe@L>7NQH0(YtG{$DWK+w#^vaVxem2XO8W^BSsd=Oio-( zUf2lFXn+YIR~+pWlMm74kGItghkR?}@3vlb=LkurD}KC4<5?4IN23=&mnPpD z4y!>Vz}3?Uv@MGx0p1`ispPI^D25k2rrsN67VulF@yXw&_KP^cyW!dl zQqUSjwzNv|1>oNhwAkvCJ{v$4c&qp+DhrT;%D0CF(1i__`vVy&j%Zee^qg7sj}p}H>^0vChuTqI&=OoGQZAMRX4E$j~%+)ifAo<{dnXx(cydm5p(b_ zxm(peXhyfAd@*Mh+;)L4C|wTqD@wUo4c0n!WSOoo)0MiyYo@a7w^kRZrt|ib$Fx;3 zZhb1?iYOaBm-e}&u4{D4UK9B65|u-NX-t>KF~SL_fsG$Q(iCM1P&qbbwRh<7 z6oATZ#pp+`kTO~P(pqi%mMRpEn2OPAd_05Xo@HVf3N*QD4@39e4@FZ$+OsCk6&7=E zSygvgxxOEX>S4+^k>GD9O+i(v)1`c+Dr7wehVx>n2Dx1@VE1RB| zwu|{yac*~%pO|h4dt#U=taVMS_H&-TdvL}=gSL>&6=VUfT3VET`Sy4V2}}kFM2jNr zCdhtwG^{5-?sBFiSxl4ORb}TAm6-h185J(no^)_hY^GE5i}QxgcUP^=eF>wVI3Q|1 z6zaBIYlU@9l{>#S1g=m?_FYV)!vZW}!`*~DfJsCF5^RHmU-4_yO9o=`FVG^i?&WLZR%ded{cKCK4h+S!oVTE&1x;0x7$}@2jN8|6DzK zu+(J7mfAs*b49HQ#Hu5m5B(?#BR0399x0NH0*XDgi+?jF(HOxBKqwxjR-oo9 z@|XV(H8re_>)F{*4qfb?`Q5N3v^s0=7ZyXK5wEs6dh^6u#4AdDiuJ# z*Rv|wr_A@1$OpPN;N@JN5fZAf$APbM+|oe@1)k>QZ`R7AI2RYWqdEE{Mp?z77DE_+ z2;a^Mv!a~E%w#m~XeWSRTe4VJ0kB@jOR&lV=CVtINf8eAkdC3s)ml<&_UAgxN#HsA z1HlTRH?ld$;3-~Pvo5>1Oj&CP>i1Ybj=Z4(Z1H-(fWLl$>^1CAqc%*doV97R(^z*E zP7GA5usWPPS5$QSLfM4g@}dBF4i=a4tNt6M=(f0e%InbtV;lf4cW%RY2?`E>1@FpA+IoR_6BBj<2C{X1q~i%Ucak z7QhR>2PB)y8$s=i&zF+QJUs5H=WA4=Q$u{IrtH8wY zZY9(K4eQ#})ARkno(lg^m6(Gq2@st58kobqZqx{y95m!kaDvCbEUAeh* z)d8Ux!BUPw)Yq(e3ep}h(QIH*ja!E&^;s_pIZ4A}s}h>6xK^X-FGAP z;eacS9{r;3P`|;ezINYXtX<=|<8}-&!22o7l4-*-pU#=QD5Y#hGHf#S&}wp<s1+1%rzT@n6Aq7^+E0i~VtR}#$Ypzm5l}k48a~K{sc^%{u*HolWCz~G z4hrCRei9Sx8>5}?W~M$48fXs*J2fD7U^yzLc2MBPDXXcDYV>o!bdGs>S)9??riT!I z!Opzi20Qgy=Xf1+hp&A`BYp$_viZvY#hra@Y%-dB=l6^^h!Ba0SS1$Tn{> zTuAHP^Z~CI|7%OrSC?NfRfzU(0%3NB@;WP08)&@OeFz|mokC5Vz3(0NOkzwZvMKk@(t(@u*kv1Z=G*JvkxXIZax=IUkUfL-k`oN^h6(tIAb%|cXXq;I0@J+ zFblJ32aNyFfz)A{pqbT3l!KLwl16a9>oT>vn5WFW^#xXbf>W9(i$>cBRj$7&Wy!K- z8SoKnWUyZy8%pyQdOG#F4Z5Cd%)diZhqf!{MJOC{J;kagxTh$BY+R*)n2dxCkoUrj zU5?;LuQte;eC!cAagR@+b(h?fl5SA)--x!zr7;x{O-c5sEL4@*#w`vFQiVerEnt3c z4-SFm@^W28h=I*9_YNI(aXJQc8a@RMw#!%4dR;4At=SpQ>X2l-qiOO5&Q|4DD!CKzM(WQ|6a@_DQF&AiUQ^jCRMzasqrCx7UjQ zctl1Q_rq9WK{^PffQt!<)ooSRAmVGb3_q_Yfp!~mTRET{1ov^DN}B{bh_H#K?~T^4 z*#FYkdAC(}k%Ewv1WG>c%KG&9i%SvMcwg_Q#qBp(Z`bbxQFP~Y3=nClyEu!j+OIc; zqKjaBwMp9Etbx^@_TYgnYPce9C3tw4jRB(REnVPb@436&-y8!E2MIC}0*9x(-(EG}b+-xBN$yQ5XdM^8tR6v0D zmc3lwZ}?b46sy_lvm-!2%jrGtjsdy+b-^fqrh{NqGRH?AtIw;n)jc|}1@aJ=_nL^; zKp06)n|A2ltr$)pS4?^RIK?39d+T?qA=GusVISHb>>`QtnWI9O6N#}klA+czko_sI zx*h&_hrs-YCN<=Z;#yl?FpV^$k&i}0)~KCFx_Rm_`YV(#2l0?Wbb>p8RuSt!9GWTS zGv4>004~tJ3lfuv3E2vviL`_En#45Y;EHBS;a>y z%i66lz_h)nAuM*uA?|{s4Cbr5+0eJa1`cWlR?>y=JwD<+ z9nP=76}bS*A5_5SA?Pfli{{sWqJ;pp8PHZ*Sg6V7&iMd3_yo>-ng{V@1*zdUaFGMC z7E!`jaS%dKPJz~F23)ong_1Gcl5C#S^__C;wDR!tZ3LqCLY&GgN;4@s;F*BbgKZlL zn+_QD1H;v<2@MH?RG<#YSJ8)tSvH)>pBI9i|H5(Fdt|*8!bcqJB(Y$=T9WUK`A)+? zYx(KO&S!=Zk}OG`dD{celD0R5XPv(FIwF#+T@G|H%SIx|JwnGmA1c3U6GT>6rr)CZ zel+>Z;XYkuG-IsDC)2+u*D(?SQb-NJGz25qxo@iTEk@#XEdsz60QSpQt*=CvoQb zjx14JwZ;M-d9SoUtIRKL#wr4otgu_&s;UG#jV?wG=)uc)vH1$u* z(AUKCq`i>11Zej?wvO7A1G|c2jyFs_h|L5bV`>$vbSehVkok-_#}WG#OwiKA*h@<# zy5zMKKi={x;})g&SEOUDcHp_#jYBE4i>5gbN@(c~AgOQHjNo#9Lm~4O`KaHkNr7Dg zl$^fOpQ|fxF-N~pels{uo{6CD?REis=p0km=w^pFJB3+*W;kt0fRKuJgM!pONF*WL zeaQ>SoVVI1cX4i1&dS%8JEi^>_EI*|`+a)a7YuyL^$uc_dF6fyjN_-3Hq2IC^HpZ) z;}B4gxL$J?)6VM_*Cb#wGbp^D?W+$N22=!~{Bpr1!%2pesc;nydykJ;QmXr@1{J?> z+S#U77=5=MCmw)F=Y@cNhW_kTsODX~br^@CXTOB5O z^SI?QdM#me{aIuh@bN&kXSW&Ej`F2pNDqD(h9l71v?_fmdEl>he-qv=yX4DXk)Bza z*}(M!{CDg702Ar@O~5X z@TWSMHFU%pn?8Oj0Ru{;EsNh^oH4rK)CZqb%Gsi=nhs3l?hY}2nf4GAlSWD!CZQE< zfn^bsd>vGiMJ7^UtD6N~U^Fq?eMe)MCOZlb2L7b7dba!#Mo`sc7U=~pwyIM}q70Rc zqv)gXU=F6M9X(KP$ez7=B%qQf>j(0$CTfoYu$oKB2H!1Lv=Jvk@&C5Z_ROFOs7-}>x2JW@it}q8W77od8 zO<6V*)IM`J*|&vSd*=K~g!C0mXas8Fddf2Pr#1fg$t3F$h5D(1Uc=0q&C#Oe@eqU0 z2<$ac6~KO1wvUi!wyqB;&-CSH1%g`s4a&^U8&n^4=vX7Pnl*B@1v#j$L?wlH2iw$f zqj~f@?|a(^UV}EB$60GgPM2~DzA;pI!Vk*t88|FYuL$*KAiJyk>TFl~lB;nse$>DG ze%mtpXKzFD7}cm21OVV15dZ-5w~|Y6#;7r0R&q1FphvLunSAdiGK0e zYrnwkMp`>TFCEsRi7Y`cIt1ZED*f35w-c-45lF_e3{DE2W zy;ta_$qxsjnRPZr5mMR?@>EsjTEjrJNH-376au{>cxezQOj5=|SLeBW==K$xh5s@% z9GqwZCp|zifdxjIvk$1t=UA&&7UA_MiAnJ!D)74hrHRo|3BJz#=_gHOrYWat<_I+@ITtCQ*Mm;f#&P~kWUTNMLpy0V$(@_C zJFnV6+>g7hm8_S6kYO}v{ZccjYf zD0{Z7PD>Je-Ug08vgNThtG4kZ{l$TzD+q*G?yXc@-WqUTHjF=dBYyKb#N)>{p+}|k z!*@#tZ90Q!PmT9duRo zgq9g;5-z0n6s^QhU8WK9gUv%W%dN;OCt`;K-Q#dkw6>~`tS;zMs)8DH^s*V-Vt$D?_xtaPJfpRIKuDAjTJ+D_vR654C)sTbJ9J3M4 zJe8F^StVz_ZVieYje$*(#M2|I{fzbuZ|ON`q8vjDBCyxCG9fE!o*_mem;fu8txH0s zmXelTF7fN1yPHGP(FyD+`y!K4**NnndJzuLg{if^R6vp{Lc`{Cc4yMk=}E&YRR04C zss)59_akE(jqF<&JUz{_)> zOFA&H*{T!o2p8}7Y$*?_+p=tnXk`LUIE$)CWE25Ef>!+EzL9Ofy7)ns5uq`P!tn?- zXV67Lq0(u(l6dN-9R7JFINN0D@^bT&3s_Spd$a4{!Q?4Zx)9b}v@sQjq_A&>*|iIk z_4zqd`#;XX(>?TKw(oa-RChr7Z(aJXBHRk`%MJ3QQm*@)aXE_^o%Z~+Uj zUjpu^z1f(ECas)Ff5`11H%*rU2_f@#`h&7Ctj2XJ&K9XQ%QwqCu%sP7vs4pyji6xZ zfPd^)AiE<>+38&qtY1d>3i737a?61qo^(-}%OBDWnKj|sfMY-wjux1I8yNKxU zJT{l8lBqpKL1{}8BIcl<9~MtFioRcK&T1W=KfJw;fbO)L^Qd3L{&sXAE^TrU1CU|> zkN^NGlmGzO|KaGIENon?|CJtU{;PA_DWKLo2bNh4Hr?a$;16nv(x>C^%K(#2qX37k zF&$oyyi@bhCama<8Sj{-z2e1KgS~_^{=&mtqyxVe5au+o%xe(Zjt%lu#cQ^!G{w?a zm5=!}Dit5kx^wyQ_QUSbP+>&YhY*j;cg9VpXKel@GyrXme~Vbr-jN=k#bN2rOjucA zdE~*fn6IJu(gUWRD`l2;*~bLjuL)5PZLai!Z)4JRLetX;Wz=CZcki~Ts7+rdl8s=v znKCHv%&?0}yuG$RvBh8Q+RgLb7o(Yw`1}Z8M|!5uP=O8fVE4sL6Hk=A0u4kLwNf&t zE+w4j%PjeIpM{dyz0L+}1N{TcwPtJpFqY9MUA=mkhbEoQ2Qp5QFdvNfedjUp9iu|Ryg zC#X*fmSXRH%jI6RTS>Ep@}ei*Sn$hSJFwM1W@=hx@#sdziPJ%C} z29;qn)dSuRtNR#FNTjk7L{_we{368(Ky`vg`Gx#Lp<|YJTk}`p(=<5fI~%oD*8$f? z#O~X#DH^ezGg$8?nrF_zD7fD^;Aky6lXm5AC6#boRRoVw%jg-UVH;6Sn1Q|&M5uQq zj%I5UrmhoRi*4p<%p@x?ClRS$|8ZAEP!I7_d4Z6l5} zV?z*lp4`Zp&L+~UN}rt%4%iQA01TfMj!f6A=m)c9wfE9Z#aht#dJgq+DmPcl`l_8*^+eL0mit9 zHwMKOYQXAm7`>vp>BBh9?S=_Q^CdFYIXR_KL4{PjickZLLxXq}kw~hUruXl%r|5fW z5+~jE4Zf-kD^<}HPehs7rsaWOX0Kh%h1SaYv}FG>vcLu6!$2->zq5SDvd|NDby-jr zRs`DKhLI9@#Gr>1Lg?Ginz>JU5LRn%-wUz|LEpO&c>;24%*ez#-kEJPN$meF*V?NU-|)O_JpTl9HYLe>3fxk+1CTAri9-8>I0 z0QQBjEszf}nH~_u2J|3C9VB=^V=x}TeGX13BSK7fRPV#ufvu=-9_sfk0Og?@ZG)T0 zuuvfi3B#lwY^hC@K9g3-bl^0@hdSW_W|6lq{>PvQFe*o^{W8(Jb^_hBNCahK7BF7=;mJ4smX zp7TAo>x$QadLHK)Ro?Z92%1b<@1cbVz%a@#th$D@$w1m|E%&~NV67QvV+@7uWQ#KU z8ADmfJJ&54&N66%LO!=bXPjm<#TfXr4{I^Ev{5|Wd87UG40%al^`5*=I6f?btzENm zTF(c$xYhTG%?vD-z22yplVq*LH&dnC5PL$tv;L5iGc!W=b0Z7mcuQLxJI~&z-njlV zGCP!5eEDze^{{jCZvBn!5Sq_>D0MJ#k=&w6tY| zc9MU@B5uYmTpmqO1I@hUv^VbzoZh^&?^II+#FsyrUFWQpTY9JLnSE;zJo{1`aT$6J z@diAe0ot^XTy8so(ReTd#fRCvgGUkEEX&MKXus*7UPYHilza!&96eg~gN~O}C|3Y% ze{&vvKNvkyel2hr>Z&yiI}Fhcv$hI1(PuQ{>r7f-wJ_-|+r%Jyj@Kx$7!u7q4lm4E zwLtA)IIvw$W0PN@?1PAu&kZ2Cj@Xwtuj2(q&~qZs1+9oxT%!sy4hll^Hn?ry* zSrnn^N=v8jxkDXf>oLy{f{2KW+|>#gxg7qp2$fImS?&L+LICxRn1_Ht$q<)p7!JgWuKL%tT<fL>}TYq?eFagNW zUv-2g40GaXKl(9_mBy=N?gelIU^}9CKHR7J1D4VKtY)~#?ZMfOJDz-NPl%Oh52wS8E;O|22EE2$S`@5%5=qKP zW-`2y5*qiPL&OxDWgvL;0V$>Xyi`(@ot7Ri?iE&H%1M_gJSW_gXOWLsNDs{9tW;eh z%%b12L__LGeoR(ecxa{03m&&xKM}Wsz1fe3w3~*^NJx<_pMl%&;LxryX&j3ilzTOU z`a7{Gv51&YS@tYP%$ylI^Me94sQ{B_b8SKbhSLDr6mWsrWO@>%KBMfgt@KHJtj~KN zR6AlBPC+^07`|jc))LtzK-%>cc_%#FMQG#dASMVUmBUR7I6Xrp&h2YOB_Fs+N|Uav z&PB06*XkmD)M_P!R2|XDqLU2Mlg;WJSKSw-;8zr)^MW^ER>87PCz;D~?sR^+bd6|> zAH`T-E+}$Lcr`stN73W(QID(43DWAW+!gia9b~eiQ@#({;Dg;=N`V-J;3X%}-!Bg+ zC})X=q5Ga=I)|)#k?eeAm`zoQJ3kNnWfFr&Gtd|e*QC%wGwN$YeFcFkc|tY(qB!9VLz7Ba#+`lWx_V$C<^33PmMdMXKRNDRXZzJS`De=S z35Ch&y6X`k$}d2=hI3T{IBZFaO_)FXqXjU&tZmQ6$^jP@fPk(w4jp-!KTcerQDuS#aoATop1iDV0O#Uof4?Y`1NSBqg1Fp^=tj+z0gj?_xm zGgO-sCnXg(p+E?LJFH~bV~tE5tyECg5%Tno9(QZY*o+AltHYi-yCx8dZyO5T3-Qm} z6myG_?Y>T=20ex9E&E-B6vJkq2rV<+fZm9_BGW1)F6Ml{E=PeCN3>D+$m-%|nIH@E zSYd{L1c8RlIMO5s>x4hHLaDcuCT_2J;MLoj$z~1?2r234QT=FVZ&-vMmfDvNmkrfU zXs8jsj8TEFA(+DoMPc5SlQ6g!XgaHEA$?j@typmPQZ>L3{03!7m{i|8Y(8KD$rM)* znP>IWvpmzriC!h@Mj$3|H|w>F^E}-1&_RcJZ4nS;f#NO+ns~VM#Ws$$X(!Kp#>T_u zF3k(>+#eT*vnM5O2{^jjtg(~LTs=}>IMW%wKIlXWQs6C#{uD`zjZU3mjmB!f}Bktq^d@b_aD^>|aCg&7pJDZTH4U9xlL zDckd|+PY_eY*=>MiOG+}G+o02Inn9zeEtpeFXM}xHxXrb^TdbZgD8tQm6^nv@1{>q z1~(T#N9co4itX`>ngUUAwZu}3AqF=1psKrXSDPY1ud?yYJt`cnu%T|ET;tp6A=qSh z(#kYpYFqGjJzEy2rCII|MC7`LFK%(MHt>TpWd&&fvs&gj_{qm8Z5Z@C!M&UEyBDYU z!(Kqpta9EI+@08LmoNGB)4vvShmji>_?eY(ZpyU7I}|5|QVQ|&4)&xULp^Q#U-enP z7>`BPw~mH>MEhQ*J_TNzohtj5aH4YPbH4U618>T5srW4R)CA+cuza*c=?``Mj>&&G zYkwngE5^@w41xdvfb~~r?d0L4_fJ*xXIvgrlaAc|bk{FxVVGDWy(`ue>oBk_LwIa) zyril6SUU~7g1zvBBhuVGuMf(SwX`i>p1NLP1{l2M?a#;g3C+qjvJt9qBD1wB84Tm3 zGr9HuEjFPOe6%vvmEvS3S3|UE0txP zW-5@NEHDE6C2S*Q4ruC8e%G_!->`WPNtjBO)f?7{fP>`>;5#YkK(1EarcH%J5G zGAHFLNSvIo86{8LTaGtLC6^XX(`ZIcWZ;6|VZo;U_Mlw-gcRM4<+!r_+*Ro)!Lb#S z3oV5FdgE^Oy;Wx1#+Exa;5F}pRF-vzaMLDQkm6&{1!2~03j^WN`8o0I)A~9dQ`>&F`KlGHDz6CyIuPNy%qTow~)s^RZ6Ln6TfQ>BG2mJ znyirLJQuZ|p(F7Hnsf)BZu#1W)|#ejg!J7mE2AOIru(Dap(%OV*2v;}t+9=}zfv@Z zhFGCV#%bL<|8GYF=G7rrnC@hn{CU(V`k5Kx|I5+PGSD&6G1D1aI62c=*qYkW%Ze%s ziU=wT{#2HYo%yT+4%9~B&6U(`d8bU`5o$n{0T0S}B}e;Rjkzhe7H&?9v>+WezZOe{ z^ZMTKk@+O`W+2;jNQU*d@UG3#e<#*jN;G`izm(_AZT)s}tTty+pVH&ayN;a5CQB@+ z&9tf%*%CjFBdWyWddj)QCc04s4W1t`hukO>4Ua+s1wLnEzP)~^*hJ`>QFRjC*po&w z*<}vEC&5xlyb(un(aIXJjgz>j-gcwf037!)Tg=k?X1kCv8-1YZ(b96!=E+4#EH`ux z=zT!HlK4Yo!$2k*-pljCh@Gje@~Vim#DjM!!er*+NSxEpXI#QXJFh%eEIjh?>F#ms z@#y8pGfZ2YsU7#6Axiq=N5!*QrX|-ees<0(095r1u-P_{WlzxuWBD%*P zXHt5zQdB-!_mv#{{fgB5)ppSHycR?fBAQaY^i|f!EFYX;IWI6)9P9vD(yjr&gZEr|Kd_ofPmr8P?j7g{wsBrg@8B z2A4^J0@jN-#p6>`0MauuHqVYt2Oj|?P8s9@#b`>Qt6|HcOtmB3g&G7WVw|cC<<{+h znsvS1%a4q0PgPqYx(cZym_b?^27>}jtOa#4_r%~VH>1EpjWB105FxV`X=i_Q zUSO^DFjn)3N zG)+#npTQth`v@)LTZSH zE}R~`Okt8?l9_Fqd43mac!GZFj%FT~f>vs5NTybif|5#h4@y#|QIX;s%lz2Lg!G*3 z==a_2KMyDUvCqCdAcA}zP5^*^UL^m0RnB(yde$bcCf0P$?#|Nxn0eazD~h$PY;O5; z%RYbR2Y(Dt{g*GOC@TC#QN(9vD4{?K1#HuYA9|65IZ~G(k;9)rVk-ndhKw*DBe?V; z;`lP8v7q8i!`m;560SOd;sfq0&YllKMF!?cZJhBUe-48AsETmmrsPh&I+*B^zLEcf zleq{wOEF1UVI31CJ09_q-W5MZl|n+PF!sGibi0vKXEQf>GwPd0rN9@=QdKj#=C+ve zF^qmu=1TY|W{*G`Lz+C@PT}0tH8-C1zHy`&I0=}|-cAI`v!Is;U@HeP<80AvLZSz; zX@hkG9PwKIE49UXhH-xBOavY2MLtqoYhCR^XXY3Vpo}^~A`BFbaPV2|;^5v27w+mF z6XjA6u(Vuki({r(Ge%jhG~fALMubi6+?14YV7--S497Ec;sOQX}*jIk<+ zQtud%YWVkIaIH@NdA{67VyR{59h|fhH={RzwjTt|K!Z*z(#eg+SS2ofv>GT~jZFbsrn~M>& zhw13T?k!lv_32z4(74&WH86;=+OA0qG&MHYQix^P!u?26N>v{n?*r(%+=PDS3_YN3 zTxT94$ru_6nv`oDoJgz@0>mz_hu%IT2+kuJ^$(#=|yCr)HJm&V=bX4?)?QlqII-nuN>h* zc{}L3t$vRuuN50t40xMSJWD;E+R|mL1#dz@@q>>dh9WZNaf7?C6y zx)D*&?&0ewtd}0Ij=6197bFuJ7=@<$o+q~G68~f;!^W)}E30q^6?ND8dF(u>{K;9~ zp-m5pTgj14IwsTb0LV4!(t@mfH)6{7_jP{rd6SAddE$k|7Ti4YO{n-=;hD*At``FGlXbYlL@{5u)uZ)Pd{|78BXDD%(w zzti0P#$$fYX8w;Q|D6KwukgQ0s(!;$KmWr20slLJ)t}*ir*ZiWH~O3f{eSTPRJ{Bd z^LHo6zcDhOf#lyY|8}1IXVBkuRDXklN&gD^zy9i<8GqNV`^~T>{}mpXNV8?EfW=e}(-uLjQ&-v;0@sKjQUYNq>#1ze&gc uo%C-p_OHah2G{>1)&sJ#{@1nrGt|mUgMMyp008*Ucl>8;mg4y1?*9Y3W@M`X diff --git a/dist/cadCAD-0.2.4-py3-none-any.whl b/dist/cadCAD-0.2.4-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..052468e42d539d3e683af988c828b461a19d534a GIT binary patch literal 15046 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 I>mR@VAAOw@?*IS* literal 0 HcmV?d00001 diff --git a/setup.py b/setup.py index 8e98475..966cce7 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ long_description = "cadCAD is a differential games based simulation software pac monte carlo analysis and other common numerical methods is provided." setup(name='cadCAD', - version='0.2.3', + version='0.2.4', description="cadCAD: a differential games based simulation software package for research, validation, and \ Computer Aided Design of economic systems", long_description=long_description,