]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Superseeding pickle transmission to get portable strings
authorJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Thu, 15 Nov 2018 20:11:03 +0000 (21:11 +0100)
committerJean-Philippe ARGAUD <jean-philippe.argaud@edf.fr>
Thu, 15 Nov 2018 20:11:03 +0000 (21:11 +0100)
doc/en/ref_operator_requirements.rst
doc/fr/ref_operator_requirements.rst
resources/ADAOSchemaCatalog.xml
src/daSalome/daYacsIntegration/daOptimizerLoop.py
src/daSalome/daYacsSchemaCreator/methods.py

index 1c4b4bda46e4b48ef32054c6e0dc2eea9b26262d..ec883f52650be44d0a4f0163e6ae9e1e4a1667ce 100644 (file)
@@ -202,12 +202,14 @@ template for the switch. It requires an external script or code named here
 Here is the switch template::
 
     import Physical_simulation_functions
-    import numpy, logging
+    import numpy, logging, codecs, pickle
+    def loads( data ):
+        return pickle.loads(codecs.decode(data.encode(), "base64"))
     #
     method = ""
     for param in computation["specificParameters"]:
         if param["name"] == "method":
-            method = param["value"]
+            method = loads(param["value"])
     if method not in ["Direct", "Tangent", "Adjoint"]:
         raise ValueError("No valid computation method is given")
     logging.info("Found method is \'%s\'"%method)
index 12d109d64d8c92eb03088146a2b7beccd17d3279..3190f3d1e337a5604adec30ccaf33259995bfb25 100644 (file)
@@ -211,12 +211,14 @@ contenant trois fonctions nommées "*DirectOperator*", "*TangentOperator*" et
 "*AdjointOperator*" comme précédemment. Voici le squelette d'aiguillage::
 
     import Physical_simulation_functions
-    import numpy, logging
+    import numpy, logging, codecs, pickle
+    def loads( data ):
+        return pickle.loads(codecs.decode(data.encode(), "base64"))
     #
     method = ""
     for param in computation["specificParameters"]:
         if param["name"] == "method":
-            method = param["value"]
+            method = loads(param["value"])
     if method not in ["Direct", "Tangent", "Adjoint"]:
         raise ValueError("No valid computation method is given")
     logging.info("Found method is \'%s\'"%method)
index 3abb570964b862e51b881d492680c85a4d3f1e48..af25ccf9db3f7e460f271e77385e69db198c342a 100644 (file)
@@ -33,7 +33,7 @@
   <type name="long" kind="int"/>
   <struct name="SALOME_TYPES/Parameter">
     <member type="string" name="name"></member>
-    <member type="pyobj" name="value"></member>
+    <member type="string" name="value"></member>
   </struct>
   <sequence content="SALOME_TYPES/Parameter" name="SALOME_TYPES/ParameterList"></sequence>
   <sequence content="double" name="SALOME_TYPES/Variable"></sequence>
@@ -536,14 +536,17 @@ if sys.path.count(filepath)==0 or (sys.path.count(filepath)>0 and sys.path.index
   </inline>
 
   <inline name="ReadForSwitchNode">
-    <script><code><![CDATA[import sys, logging
+    <script><code><![CDATA[import sys, logging, codecs, pickle
 if sys.version_info.major > 2: import adao
+def loads( data ):
+  return pickle.loads(codecs.decode(data.encode(), "base64"))
 logging.debug("CREATE YI Entering in ReadForSwitchNode")
-logging.debug("       with input data : ",list(data["specificParameters"]))
+logging.debug("       with input data : ",list(data["specificParameters"]))
 switch_value = -1
 for param in data["specificParameters"]:
+  # logging.debug("       ReadForSwitchNode specificParameters : ",param)
   if param["name"] == "switch_value":
-    switch_value = int(param["value"])
+    switch_value = int(loads(param["value"]))
 logging.debug("       switching to value : "+str(switch_value))
 ]]></code></script>
     <inport name="data" type="SALOME_TYPES/ParametricInput"/>
@@ -552,17 +555,19 @@ logging.debug("       switching to value : "+str(switch_value))
   </inline>
 
   <inline name="ExtractDataNode">
-    <script><code><![CDATA[import sys, logging
+    <script><code><![CDATA[import sys, logging, codecs, pickle
 if sys.version_info.major > 2: import adao
-logging.debug("TERMINATE Entering in ExtractDataNode")
+def loads( data ):
+  return pickle.loads(codecs.decode(data.encode(), "base64"))
+logging.debug("TERMINATE Entering in ExtractData/Node")
 from daCore.AssimilationStudy import AssimilationStudy
 var = None
 info = None
 for param in data["specificParameters"]:
   if param["name"] == "var":
-    var = param["value"]
+    var = loads(param["value"])
   if param["name"] == "info":
-    info = param["value"]
+    info = loads(param["value"])
 ]]></code></script>
     <inport name="data" type="SALOME_TYPES/ParametricInput"/>
     <outport name="var" type="pyobj"/>
index 0a0591805e907aa3d938c7acc645082ca527f3f6..ff1df9119863c0ad49dcffca9cd700d0fec5e3c3 100644 (file)
@@ -32,11 +32,17 @@ import numpy
 import threading
 import sys
 import traceback
+import codecs
 
 # Pour disposer des classes dans l'espace de nommage lors du pickle
 from daCore.AssimilationStudy import AssimilationStudy
 from daYacsIntegration import daStudy
 
+def dumps( data ):
+  return str(codecs.encode(pickle.dumps(data), "base64").decode())
+def loads( data ):
+  return pickle.loads(codecs.decode(data.encode(), "base64"))
+
 class OptimizerHooks:
 
   def __init__(self, optim_algo, switch_value=-1):
@@ -60,27 +66,18 @@ class OptimizerHooks:
     specificParameters = pilot.SequenceAny_New(self.optim_algo.runtime.getTypeCode("SALOME_TYPES/Parameter"))
     method_name = pilot.StructAny_New(self.optim_algo.runtime.getTypeCode('SALOME_TYPES/Parameter'))
     method_name.setEltAtRank("name", "method")
-    if sys.version_info.major < 3:
-      method_name.setEltAtRank("value", method)
-    else:
-      method_name.setEltAtRank("value", pickle.dumps(method))
+    method_name.setEltAtRank("value", dumps(method))
     specificParameters.pushBack(method_name)
     # print self.optim_algo.has_observer
     if self.optim_algo.has_observer:
       obs_switch = pilot.StructAny_New(self.optim_algo.runtime.getTypeCode('SALOME_TYPES/Parameter'))
       obs_switch.setEltAtRank("name", "switch_value")
-      if sys.version_info.major < 3:
-        obs_switch.setEltAtRank("value", "1")
-      else:
-        obs_switch.setEltAtRank("value", pickle.dumps("1"))
+      obs_switch.setEltAtRank("value", dumps("1"))
       specificParameters.pushBack(obs_switch)
     if self.optim_algo.has_evolution_model:
       obs_switch = pilot.StructAny_New(self.optim_algo.runtime.getTypeCode('SALOME_TYPES/Parameter'))
       obs_switch.setEltAtRank("name", "switch_value")
-      if sys.version_info.major < 3:
-        obs_switch.setEltAtRank("value", self.switch_value)
-      else:
-        obs_switch.setEltAtRank("value", pickle.dumps(self.switch_value))
+      obs_switch.setEltAtRank("value", dumps(self.switch_value))
       specificParameters.pushBack(obs_switch)
     sample.setEltAtRank("specificParameters", specificParameters)
 
@@ -400,10 +397,7 @@ class AssimilationAlgorithm_asynch(SALOMERuntime.OptimizerAlgASync):
     # Switch Value
     obs_switch = pilot.StructAny_New(self.runtime.getTypeCode('SALOME_TYPES/Parameter'))
     obs_switch.setEltAtRank("name", "switch_value")
-    if sys.version_info.major < 3:
-      obs_switch.setEltAtRank("value", self.da_study.observers_dict[info]["number"])
-    else:
-      obs_switch.setEltAtRank("value", pickle.dumps(self.da_study.observers_dict[info]["number"]))
+    obs_switch.setEltAtRank("value", dumps(self.da_study.observers_dict[info]["number"]))
     specificParameters.pushBack(obs_switch)
 
     # Var
@@ -413,7 +407,7 @@ class AssimilationAlgorithm_asynch(SALOMERuntime.OptimizerAlgASync):
     # Remove Data Observer, so you can ...
     var.removeDataObserver(self.obs)
     # Pickle then ...
-    var_struct.setEltAtRank("value", pickle.dumps(var))
+    var_struct.setEltAtRank("value", dumps(var))
     specificParameters.pushBack(var_struct)
     # Add Again Data Observer
     if self.da_study.observers_dict[info]["scheduler"] != "":
@@ -424,10 +418,7 @@ class AssimilationAlgorithm_asynch(SALOMERuntime.OptimizerAlgASync):
     # Info
     info_struct = pilot.StructAny_New(self.runtime.getTypeCode('SALOME_TYPES/Parameter'))
     info_struct.setEltAtRank("name", "info")
-    if sys.version_info.major < 3:
-      info_struct.setEltAtRank("value", self.da_study.observers_dict[info]["info"])
-    else:
-      info_struct.setEltAtRank("value", pickle.dumps(self.da_study.observers_dict[info]["info"]))
+    info_struct.setEltAtRank("value", dumps(self.da_study.observers_dict[info]["info"]))
     specificParameters.pushBack(info_struct)
 
     sample.setEltAtRank("specificParameters", specificParameters)
index 428440d6526c59b87340fea4bf4149c224f8cffc..db4e0c1fbbab2708e2b76ba0ff694065db7a1caa 100644 (file)
@@ -455,7 +455,9 @@ def create_yacs_proc(study_config):
     except:
       raise ValueError("Exception in opening function script file: " + script_filename)
     node_script  = "#-*- coding: utf-8 -*-\n"
-    node_script += "import sys, os, numpy, logging\n"
+    node_script += "import sys, os, numpy, logging, pickle, codecs\n"
+    node_script += "def loads( data ):\n"
+    node_script += "  return pickle.loads(codecs.decode(data.encode(), 'base64'))\n"
     node_script += "filepath = \"" + os.path.dirname(script_filename) + "\"\n"
     node_script += "filename = \"" + os.path.basename(script_filename) + "\"\n"
     node_script += "if sys.path.count(filepath)==0 or (sys.path.count(filepath)>0 and sys.path.index(filepath)>0):\n"
@@ -465,7 +467,7 @@ def create_yacs_proc(study_config):
     node_script += """# ==============================================\n"""
     node_script += """__method = None\n"""
     node_script += """for param in computation["specificParameters"]:\n"""
-    node_script += """  if param["name"] == "method": __method = param["value"]\n"""
+    node_script += """  if param["name"] == "method": __method = loads(param["value"])\n"""
     node_script += """if __method not in ["Direct", "Tangent", "Adjoint"]:\n"""
     node_script += """  raise ValueError("ComputationFunctionNode: no valid computation method is given, it has to be Direct, Tangent or Adjoint (\'%s\' given)."%__method)\n"""
     node_script += """logging.debug("ComputationFunctionNode: Found method is \'%s\'"%__method)\n"""
@@ -538,7 +540,9 @@ def create_yacs_proc(study_config):
     except:
       raise ValueError("Exception in opening function script file: " + script_filename)
     node_script  = "#-*- coding: utf-8 -*-\n"
-    node_script += "import sys, os, numpy, logging\n"
+    node_script += "import sys, os, numpy, logging, pickle, codecs\n"
+    node_script += "def loads( data ):\n"
+    node_script += "  return pickle.loads(codecs.decode(data.encode(), 'base64'))\n"
     node_script += "filepath = \"" + os.path.dirname(script_filename) + "\"\n"
     node_script += "filename = \"" + os.path.basename(script_filename) + "\"\n"
     node_script += "if sys.path.count(filepath)==0 or (sys.path.count(filepath)>0 and sys.path.index(filepath)>0):\n"
@@ -548,7 +552,7 @@ def create_yacs_proc(study_config):
     node_script += """# ==============================================\n"""
     node_script += """__method = None\n"""
     node_script += """for param in computation["specificParameters"]:\n"""
-    node_script += """  if param["name"] == "method": __method = param["value"]\n"""
+    node_script += """  if param["name"] == "method": __method = loads(param["value"])\n"""
     node_script += """if __method not in ["Direct", "Tangent", "Adjoint"]:\n"""
     node_script += """  raise ValueError("ComputationFunctionNode: no valid computation method is given, it has to be Direct, Tangent or Adjoint (\'%s\' given)."%__method)\n"""
     node_script += """logging.debug("ComputationFunctionNode: Found method is \'%s\'"%__method)\n"""
@@ -657,7 +661,9 @@ def create_yacs_proc(study_config):
       except:
         raise ValueError("Exception in opening function script file: " + script_filename)
       node_script  = "#-*- coding: utf-8 -*-\n"
-      node_script += "import sys, os, numpy, logging\n"
+      node_script += "import sys, os, numpy, logging, pickle, codecs\n"
+      node_script += "def loads( data ):\n"
+      node_script += "  return pickle.loads(codecs.decode(data.encode(), 'base64'))\n"
       node_script += "filepath = \"" + os.path.dirname(script_filename) + "\"\n"
       node_script += "filename = \"" + os.path.basename(script_filename) + "\"\n"
       node_script += "if sys.path.count(filepath)==0 or (sys.path.count(filepath)>0 and sys.path.index(filepath)>0):\n"
@@ -666,7 +672,7 @@ def create_yacs_proc(study_config):
       node_script += """# ==============================================\n"""
       node_script += """__method = None\n"""
       node_script += """for param in computation["specificParameters"]:\n"""
-      node_script += """  if param["name"] == "method": __method = param["value"]\n"""
+      node_script += """  if param["name"] == "method": __method = loads(param["value"])\n"""
       node_script += """if __method not in ["Direct", "Tangent", "Adjoint"]:\n"""
       node_script += """  raise ValueError("ComputationFunctionNode: no valid computation method is given, it has to be Direct, Tangent or Adjoint (\'%s\' given)."%__method)\n"""
       node_script += """logging.debug("ComputationFunctionNode: Found method is \'%s\'"%__method)\n"""
@@ -739,7 +745,9 @@ def create_yacs_proc(study_config):
       except:
         raise ValueError("Exception in opening function script file: " + script_filename)
       node_script  = "#-*- coding: utf-8 -*-\n"
-      node_script += "import sys, os, numpy, logging\n"
+      node_script += "import sys, os, numpy, logging, pickle, codecs\n"
+      node_script += "def loads( data ):\n"
+      node_script += "  return pickle.loads(codecs.decode(data.encode(), 'base64'))\n"
       node_script += "filepath = \"" + os.path.dirname(script_filename) + "\"\n"
       node_script += "filename = \"" + os.path.basename(script_filename) + "\"\n"
       node_script += "if sys.path.count(filepath)==0 or (sys.path.count(filepath)>0 and sys.path.index(filepath)>0):\n"
@@ -748,7 +756,7 @@ def create_yacs_proc(study_config):
       node_script += """# ==============================================\n"""
       node_script += """__method = None\n"""
       node_script += """for param in computation["specificParameters"]:\n"""
-      node_script += """  if param["name"] == "method": __method = param["value"]\n"""
+      node_script += """  if param["name"] == "method": __method = loads(param["value"])\n"""
       node_script += """if __method not in ["Direct", "Tangent", "Adjoint"]:\n"""
       node_script += """  raise ValueError("ComputationFunctionNode: no valid computation method is given, it has to be Direct, Tangent or Adjoint (\'%s\' given)."%__method)\n"""
       node_script += """logging.debug("ComputationFunctionNode: Found method is \'%s\'"%__method)\n"""