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