-// 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
// 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();
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()
return _pattern->isLocked();
}
+/*!
+ * Caller is not responsible from returned pointer
+ */
YACSEvalListOfResources *YACSEvalYFX::giveResources()
{
return _pattern->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
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());
}
}
}
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()