diff --git a/pydynamo/__init__.py b/pydynamo/__init__.py index c7da20a9d7289bf6532368e1e1ef150ab464bf6a..3788011a2264360b892e5ea38faec5e7d9b3e63c 100644 --- a/pydynamo/__init__.py +++ b/pydynamo/__init__.py @@ -2,7 +2,7 @@ __version__ = "0.1" -from pydynamo.core.parse_system import new_cst_politic, new_system, system_from_lines, system_from_fun, system_from_file +from pydynamo.core.parse_system import new_cst_politic, new_table_politic, new_system, system_from_lines, system_from_fun, system_from_file # import pydynamo.core.system from pydynamo.core.plot_system import * # import pydynamo.core.dynamo_converter diff --git a/pydynamo/core/parse_system.py b/pydynamo/core/parse_system.py index f03918ca63e2d31c19ab81dd8569d50148ade994..cbcb3be1734d17bae3359a29c4e6e496b4bdd8b3 100644 --- a/pydynamo/core/parse_system.py +++ b/pydynamo/core/parse_system.py @@ -122,7 +122,22 @@ def new_cst_politic(s, cst, year, val2): system_from_lines([eq_clip, eq_year, eq_cst1, eq_cst2], s=s, prepare=True) + +def new_table_politic(s, var, year, val2): + """Add new equations to change table from year""" + assert f'tabhl' in s.eqs['update'][var]['args']['fun'], f"{var} hasn't tabhl function" + table_name = s.eqs['update'][var]['args']['fun']['tabhl']['table'] + table_init_val = s.eqs['cst'][table_name]['line'] + var_line = s.eqs['update'][var]['raw_line'] + + eq_table_1 = f"{table_name}1 = {table_init_val}" + eq_table_2 = f"{table_name}2 = {val2}" + eq_var_1 = var_line.replace(f'{var}.k', f'{var}1.k').replace(table_name, table_name + '1') + eq_var_2 = var_line.replace(f'{var}.k', f'{var}2.k').replace(table_name, table_name + '2') + eq_var = f"{var}.k = clip({var}2.k, {var}1.k, time.k, {year})" + system_from_lines([eq_table_1, eq_table_2, eq_var_1, eq_var_2, eq_var], s=s) + def change_cst_to_var(s, cst): # TODO: FAIRE AVEC INIT """Change a constant for a variable""" @@ -135,7 +150,8 @@ def change_cst_to_var(s, cst): new_raw_line = re.sub(f'(?<!\w){cst}(?!\w)', f'{cst}.k', args['raw_line']) args['raw_line'] = new_raw_line args['line'] = new_line - + + def change_var_to_cst(s, var): """Change a variable for a constant""" pass @@ -150,11 +166,11 @@ def change_var_to_cst(s, var): # args['raw_line'] = new_raw_line # args['line'] = new_line -def new_system(raw): +def new_system(raw, s=None): """returns a new System object from the data included in raw""" if callable(raw): - return system_from_fun(raw) + return system_from_fun(raw, s=s) elif isinstance(raw, list): - return system_from_lines(raw) + return system_from_lines(raw, s=s) elif isinstance(raw, str): - return system_from_file(raw) + return system_from_file(raw, s=s) diff --git a/pydynamo/core/plot_system.py b/pydynamo/core/plot_system.py index 0ca23d5369bf6b035ecf4362acacfa94c7f696bb..b8888f3e455a6e6bc0a3dcb7920f094ed50db4ad 100644 --- a/pydynamo/core/plot_system.py +++ b/pydynamo/core/plot_system.py @@ -61,10 +61,12 @@ def plot_tabhl(s, name): plt.xlabel(xlabel) plt.title(title) -def compare_systems(s1, s2, *args, **kwargs): - plot_system(s1, *args, **kwargs, linestyle='-') +def compare_systems(s1, s2, v_names, scales=None, rescale=False, *args, **kwargs): + if not scales and rescale: + scales = {v: max(max(getattr(s1, v)), max(getattr(s2, v))) for v in v_names} + plot_system(s1, v_names, *args, **kwargs, linestyle='-', scales=scales) plt.gca().set_prop_cycle(None) - plot_system(s2,*args, **kwargs, linestyle='--') + plot_system(s2, v_names, *args, **kwargs, linestyle='--', scales=scales) diff --git a/pydynamo/core/specials.py b/pydynamo/core/specials.py index 82708817fd45cb3a4320df52f693716e8dacca16..9097756dc1cfa6cd7b7c675a30c269fbd53cd822 100644 --- a/pydynamo/core/specials.py +++ b/pydynamo/core/specials.py @@ -47,13 +47,11 @@ def clip(func2, func1, t, t_switch): func2 if t>t_switch, else func1. """ - if np.isnan(func1) or np.isnan(func2): - return np.nan + + if t <= t_switch: + return func1 else: - if t <= t_switch: - return func1 - else: - return func2 + return func2 class Sample: """