From d5d90cd70cfc5215551db2949b6835f96b7d75c3 Mon Sep 17 00:00:00 2001 From: abaucher <achille.baucher@inria.fr> Date: Thu, 3 Feb 2022 18:14:19 +0100 Subject: [PATCH] Better compare plots, clip, and new table politic --- pydynamo/__init__.py | 2 +- pydynamo/core/parse_system.py | 26 +++++++++++++++++++++----- pydynamo/core/plot_system.py | 8 +++++--- pydynamo/core/specials.py | 10 ++++------ 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/pydynamo/__init__.py b/pydynamo/__init__.py index c7da20a9..3788011a 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 f03918ca..cbcb3be1 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 0ca23d53..b8888f3e 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 82708817..9097756d 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: """ -- GitLab