Salome HOME
debug for test case.
[modules/yacs.git] / src / evalyfx / YACSEvalYFX.cxx
index b3210bd5e12f4d575c2f01aef288ffb413761cc9..aba327e7457aa083f5b7a83347ea624a215ad441 100644 (file)
@@ -46,7 +46,6 @@ private:
   PyThreadState *_save;
 };
 
-
 YACSEvalYFX *YACSEvalYFX::BuildFromFile(const std::string& xmlOfScheme)
 {
   YACS::ENGINE::RuntimeSALOME::setRuntime();
@@ -60,27 +59,27 @@ YACSEvalYFX *YACSEvalYFX::BuildFromScheme(YACS::ENGINE::Proc *scheme)
   return new YACSEvalYFX(scheme,false);
 }
 
-std::list< YACSEvalInputPort * > YACSEvalYFX::getFreeInputPorts() const
+std::vector< YACSEvalInputPort * > YACSEvalYFX::getFreeInputPorts() const
 {
   return _pattern->getFreeInputPorts();
 }
 
-std::list< YACSEvalOutputPort * > YACSEvalYFX::getFreeOutputPorts() const
+std::vector< YACSEvalOutputPort * > YACSEvalYFX::getFreeOutputPorts() const
 {
   return _pattern->getFreeOutputPorts();
 }
 
-void YACSEvalYFX::lockPortsForEvaluation(const std::list< 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);
+  checkPortsForEvaluation(inputsOfInterest,outputsOfInterest);
+  _pattern->setOutPortsOfInterestForEvaluation(outputsOfInterest);
   _pattern->generateGraph();
 }
 
 void YACSEvalYFX::unlockAll()
 {
-  std::list< YACSEvalInputPort * > allInputs(getFreeInputPorts());
-  for(std::list< YACSEvalInputPort * >::const_iterator it=allInputs.begin();it!=allInputs.end();it++)
+  std::vector< YACSEvalInputPort * > allInputs(getFreeInputPorts());
+  for(std::vector< YACSEvalInputPort * >::const_iterator it=allInputs.begin();it!=allInputs.end();it++)
     (*it)->unlock();
   _pattern->resetOutputsOfInterest();
   _pattern->resetGeneratedGraph();
@@ -98,6 +97,7 @@ YACSEvalListOfResources *YACSEvalYFX::giveResources()
 
 bool YACSEvalYFX::run(YACSEvalSession *session, int& nbOfBranches)
 {
+  _pattern->assignRandomVarsInputs();
   YACSEvalListOfResources *rss(giveResources());
   if(!rss->isInteractive())
     throw YACS::Exception("YACSEvalYFX::run : not implemented yet for non interactive !");
@@ -113,7 +113,9 @@ bool YACSEvalYFX::run(YACSEvalSession *session, int& nbOfBranches)
   nbOfBranches=_pattern->assignNbOfBranches();
   mySession->launch();
   YACS::ENGINE::Executor exe;
+  exe.setKeepGoingProperty(!_params.getStopASAPAfterErrorStatus());
   //
+  _pattern->emitStart();
   {
     MyAutoThreadSaver locker;
     exe.RunW(getUndergroundGeneratedGraph());
@@ -121,6 +123,20 @@ bool YACSEvalYFX::run(YACSEvalSession *session, int& nbOfBranches)
   return getUndergroundGeneratedGraph()->getState()==YACS::DONE;
 }
 
+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::vector<YACSEvalSeqAny *> YACSEvalYFX::getResults() const
 {
   return _pattern->getResults();
@@ -133,45 +149,36 @@ YACS::ENGINE::Proc *YACSEvalYFX::getUndergroundGeneratedGraph() const
 
 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::list< YACSEvalOutputPort * >& outputs) const
+void YACSEvalYFX::checkPortsForEvaluation(const std::vector< YACSEvalInputPort * >& inputs, const std::vector< YACSEvalOutputPort * >& outputs) const
 {
-  std::list< YACSEvalInputPort * > allInputs(getFreeInputPorts());
-  std::list< YACSEvalOutputPort * > allOutputs(getFreeOutputPorts());
-  std::size_t sz(std::numeric_limits<std::size_t>::max());
-  for(std::list< YACSEvalInputPort * >::const_iterator it=allInputs.begin();it!=allInputs.end();it++)
+  std::set<YACSEvalInputPort * > inputs2(inputs.begin(),inputs.end());
+  std::vector< YACSEvalInputPort * > allInputs(getFreeInputPorts());
+  std::vector< YACSEvalOutputPort * > allOutputs(getFreeOutputPorts());
+  for(std::vector< YACSEvalInputPort * >::const_iterator it=allInputs.begin();it!=allInputs.end();it++)
     {
-      std::size_t mySz;
-      if(!(*it)->isOKForLock() && !(*it)->hasSequenceOfValuesToEval(mySz))
-        {
-          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(inputs2.find(*it)==inputs2.end())
         {
-          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());
             }
         }
     }
-  for(std::list< YACSEvalOutputPort * >::const_iterator it=outputs.begin();it!=outputs.end();it++)
+  for(std::vector< YACSEvalOutputPort * >::const_iterator it=outputs.begin();it!=outputs.end();it++)
     if(std::find(allOutputs.begin(),allOutputs.end(),*it)==allOutputs.end())
       throw YACS::Exception("YACSEvalYFX::lockPortsForEvaluation : one of output is not part of this !");
   std::set< YACSEvalOutputPort * > soutputs(outputs.begin(),outputs.end());
   if(soutputs.size()!=outputs.size())
     throw YACS::Exception("YACSEvalYFX::lockPortsForEvaluation : each elt in outputs must appear once !");
-  for(std::list< YACSEvalInputPort * >::const_iterator it=allInputs.begin();it!=allInputs.end();it++)
-    (*it)->lock();
-  return sz;
+  for(std::vector< YACSEvalInputPort * >::const_iterator it=allInputs.begin();it!=allInputs.end();it++)
+    {
+      (*it)->declareRandomnessStatus(inputs2.find(*it)!=inputs2.end());
+      (*it)->lock();
+    }
 }
 
 YACSEvalYFX::~YACSEvalYFX()