Salome HOME
AutoGIL.hxx has been factorized to KERNEL PythonCppUtils.hxx
[modules/yacs.git] / src / evalyfx / YACSEvalYFX.cxx
index b3f425cd25df4534cbbb3dea872769b381d14ea8..c27cc9a3b9cd71418c15db1b1bc9a44bb3933fa7 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2015  CEA/DEN, EDF R&D
+// Copyright (C) 2012-2021  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -15,7 +15,7 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-// 
+//
 // Author : Anthony Geay (EDF R&D)
 
 #include "YACSEvalYFX.hxx"
 
 #include <Python.h>
 
-class MyAutoThreadSaver
-{
-public:
-  MyAutoThreadSaver():_save(PyEval_SaveThread()) { }
-  ~MyAutoThreadSaver() { PyEval_RestoreThread(_save); }
-private:
-  PyThreadState *_save;
-};
-
-
 YACSEvalYFX *YACSEvalYFX::BuildFromFile(const std::string& xmlOfScheme)
 {
   YACS::ENGINE::RuntimeSALOME::setRuntime();
@@ -70,11 +60,10 @@ std::vector< YACSEvalOutputPort * > YACSEvalYFX::getFreeOutputPorts() const
   return _pattern->getFreeOutputPorts();
 }
 
-void YACSEvalYFX::lockPortsForEvaluation(const std::vector< YACSEvalOutputPort * >& outputsOfInterest)
+void YACSEvalYFX::lockPortsForEvaluation(const std::vector< YACSEvalInputPort * >& inputsOfInterest, const std::vector< YACSEvalOutputPort * >& outputsOfInterest)
 {
-  std::size_t sz(checkPortsForEvaluation(outputsOfInterest));
-  _pattern->setOutPortsOfInterestForEvaluation(sz,outputsOfInterest);
-  _pattern->generateGraph();
+  checkPortsForEvaluation(inputsOfInterest,outputsOfInterest);
+  _pattern->setOutPortsOfInterestForEvaluation(outputsOfInterest);
 }
 
 void YACSEvalYFX::unlockAll()
@@ -91,6 +80,9 @@ bool YACSEvalYFX::isLocked() const
   return _pattern->isLocked();
 }
 
+/*!
+ * Caller is not responsible from returned pointer
+ */
 YACSEvalListOfResources *YACSEvalYFX::giveResources()
 {
   return _pattern->giveResources();
@@ -98,27 +90,42 @@ YACSEvalListOfResources *YACSEvalYFX::giveResources()
 
 bool YACSEvalYFX::run(YACSEvalSession *session, int& nbOfBranches)
 {
-  YACSEvalListOfResources *rss(giveResources());
-  if(!rss->isInteractive())
-    throw YACS::Exception("YACSEvalYFX::run : not implemented yet for non interactive !");
-  YACSEvalSession *mySession(session);
-  YACS::AutoCppPtr<YACSEvalSession> loc;
+  _pattern->generateGraph();
   if(!session)
     {
       throw YACS::Exception("YACSEvalYFX::run : input session in null !");
-      /*loc=new YACSEvalSession;
-      mySession=loc;*/
     }
+  session->launch();
+  YACSEvalListOfResources *rss(giveResources());
+  rss->checkOKForRun();
+  _pattern->assignRandomVarsInputs();
   rss->apply();
   nbOfBranches=_pattern->assignNbOfBranches();
-  mySession->launch();
-  YACS::ENGINE::Executor exe;
-  //
-  {
-    MyAutoThreadSaver locker;
-    exe.RunW(getUndergroundGeneratedGraph());
-  }
-  return getUndergroundGeneratedGraph()->getState()==YACS::DONE;
+  return _pattern->go(_params,session);
+}
+
+void YACSEvalYFX::registerObserver(YACSEvalObserver *observer)
+{
+  if(!_pattern)
+    throw YACS::Exception("YACSEvalYFX::registerObserver : no pattern !");
+  _pattern->registerObserver(observer);
+}
+
+YACSEvalObserver *YACSEvalYFX::getObserver()
+{
+  if(!_pattern)
+    throw YACS::Exception("YACSEvalYFX::getObserver : no pattern !");
+  return _pattern->getObserver();
+}
+
+std::string YACSEvalYFX::getErrorDetailsInCaseOfFailure() const
+{
+  return _pattern->getErrorDetailsInCaseOfFailure();
+}
+
+std::string YACSEvalYFX::getStatusOfRunStr() const
+{
+  return _pattern->getStatusOfRunStr();
 }
 
 std::vector<YACSEvalSeqAny *> YACSEvalYFX::getResults() const
@@ -126,40 +133,44 @@ std::vector<YACSEvalSeqAny *> YACSEvalYFX::getResults() const
   return _pattern->getResults();
 }
 
+std::vector<YACSEvalSeqAny *> YACSEvalYFX::getResultsInCaseOfFailure(std::vector<unsigned int>& passedIds) const
+{
+  return _pattern->getResultsInCaseOfFailure(passedIds);
+}
+
 YACS::ENGINE::Proc *YACSEvalYFX::getUndergroundGeneratedGraph() const
 {
   return _pattern->getUndergroundGeneratedGraph();
 }
 
+void YACSEvalYFX::setParallelizeStatus(bool newVal)
+{
+  _pattern->setParallelizeStatus(newVal);
+}
+
+bool YACSEvalYFX::getParallelizeStatus() const
+{
+  return _pattern->getParallelizeStatus();
+}
+
 YACSEvalYFX::YACSEvalYFX(YACS::ENGINE::Proc *scheme, bool ownScheme):_pattern(0)
 {
-  _pattern=YACSEvalYFXPattern::FindPatternFrom(scheme,ownScheme);
+  _pattern=YACSEvalYFXPattern::FindPatternFrom(this,scheme,ownScheme);
 }
 
-std::size_t YACSEvalYFX::checkPortsForEvaluation(const std::vector< YACSEvalOutputPort * >& outputs) const
+void YACSEvalYFX::checkPortsForEvaluation(const std::vector< YACSEvalInputPort * >& inputs, const std::vector< YACSEvalOutputPort * >& outputs) const
 {
+  std::set<YACSEvalInputPort * > inputs2(inputs.begin(),inputs.end());
   std::vector< YACSEvalInputPort * > allInputs(getFreeInputPorts());
   std::vector< YACSEvalOutputPort * > allOutputs(getFreeOutputPorts());
-  std::size_t sz(std::numeric_limits<std::size_t>::max());
   for(std::vector< YACSEvalInputPort * >::const_iterator it=allInputs.begin();it!=allInputs.end();it++)
     {
-      std::size_t mySz;
-      if(!(*it)->isOKForLock() && !(*it)->hasSequenceOfValuesToEval(mySz))
+      if(inputs2.find(*it)==inputs2.end())
         {
-          std::ostringstream oss; oss << "YACSEvalYFX::checkPortsForEvaluation : input port with name \"" << (*it)->getName() << "\" is not set properly !";
-          throw YACS::Exception(oss.str());
-        }
-      if((*it)->hasSequenceOfValuesToEval(mySz))
-        {
-          if(sz==std::numeric_limits<std::size_t>::max())
-            sz=mySz;
-          else
+          if(!(*it)->isOKForLock())
             {
-              if(sz!=mySz)
-                {
-                  std::ostringstream oss; oss << "YACSEvalYFX::checkPortsForEvaluation : input port with name \"" << (*it)->getName() << "\" is declared as to be evaluated on array ! But size of array is not the same than the others !";
-                  throw YACS::Exception(oss.str());
-                }
+              std::ostringstream oss; oss << "YACSEvalYFX::checkPortsForEvaluation : input port with name \"" << (*it)->getName() << "\" is not set properly !";
+              throw YACS::Exception(oss.str());
             }
         }
     }
@@ -170,8 +181,10 @@ std::size_t YACSEvalYFX::checkPortsForEvaluation(const std::vector< YACSEvalOutp
   if(soutputs.size()!=outputs.size())
     throw YACS::Exception("YACSEvalYFX::lockPortsForEvaluation : each elt in outputs must appear once !");
   for(std::vector< YACSEvalInputPort * >::const_iterator it=allInputs.begin();it!=allInputs.end();it++)
-    (*it)->lock();
-  return sz;
+    {
+      (*it)->declareRandomnessStatus(inputs2.find(*it)!=inputs2.end());
+      (*it)->lock();
+    }
 }
 
 YACSEvalYFX::~YACSEvalYFX()