Version: 8.3.0
YACS::ENGINE::OptimizerLoop Class Reference

class to build optimization loops More...

#include <OptimizerLoop.hxx>

Inheritance diagram for YACS::ENGINE::OptimizerLoop:
Collaboration diagram for YACS::ENGINE::OptimizerLoop:

Public Member Functions

 OptimizerLoop (const std::string &name, const std::string &algLibWthOutExt, const std::string &symbolNameToOptimizerAlgBaseInstanceFactory, bool algInitOnFile, bool initAlgo=true, Proc *procForTypes=NULL)
 
 OptimizerLoop (const OptimizerLoop &other, ComposedNode *father, bool editionOnly)
 
 ~OptimizerLoop ()
 
void init (bool start=true)
 
void exUpdateState ()
 Update the node state. More...
 
int getNumberOfInputPorts () const
 
InputPortedGetPortForOutPool ()
 
InputPortedGetAlgoInitPort ()
 
OutputPortedGetAlgoResultPort ()
 
InputPortgetInputPort (const std::string &name) const throw (Exception)
 Get an input port given its name. More...
 
std::list< InputPort * > getSetOfInputPort () const
 
std::list< InputPort * > getLocalInputPorts () const
 redefined on derived class of ComposedNode. by default a ComposedNode has no port by itself More...
 
void selectRunnableTasks (std::vector< Task * > &tasks)
 
void getReadyTasks (std::vector< Task * > &tasks)
 
YACS::Event updateStateOnFinishedEventFrom (Node *node)
 
void checkNoCyclePassingThrough (Node *node) throw (Exception)
 
virtual void accept (Visitor *visitor)
 
virtual std::string getSymbol () const
 
virtual std::string getAlgLib () const
 Return the name of the algorithm library. More...
 
virtual void setAlgorithm (const std::string &alglib, const std::string &symbol, bool checkLinks=true, Proc *procForTypes=NULL)
 Set the algorithm library name and factory name (symbol in library) to create the algorithm and change it if the node is not connected. More...
 
virtual void checkBasicConsistency () const throw (Exception)
 Check validity for the node. More...
 
virtual std::string typeName ()
 
int getNumberOfOutputPorts () const
 
std::list< OutputPort * > getSetOfOutputPort () const
 
std::list< OutputPort * > getLocalOutputPorts () const
 redefined on derived class of ComposedNode. by default a ComposedNode has no port by itself More...
 
OutPortgetOutPort (const std::string &name) const throw (Exception)
 
OutputPortgetOutputPort (const std::string &name) const throw (Exception)
 Get an output port given its name. More...
 
YACS::Event finalize ()
 
- Public Member Functions inherited from YACS::ENGINE::DynParaLoop
NodeedRemoveNode ()
 
NodeedRemoveInitNode ()
 
NodeedRemoveFinalizeNode ()
 
NodeedSetNode (Node *DISOWNnode)
 
NodeedSetInitNode (Node *DISOWNnode)
 
NodeedSetFinalizeNode (Node *DISOWNnode)
 
virtual bool edAddDFLink (OutPort *start, InPort *end) throw (Exception)
 Connect an OutPort to an InPort and add control link if necessary. More...
 
InputPortedGetNbOfBranchesPort ()
 
unsigned getNumberOfEltsConsumed () const
 
int getBranchIDOfNode (Node *node) const
 
OutputPortedGetSamplePort ()
 
bool isPlacementPredictableB4Run () const
 For the moment false is returned : impovement about it coming soon. More...
 
void edRemoveChild (Node *node) throw (Exception)
 Remove a child node. More...
 
virtual bool edAddChild (Node *DISOWNnode) throw (Exception)
 
std::list< Node * > edGetDirectDescendants () const
 
unsigned getNumberOfBranchesCreatedDyn () const throw (Exception)
 
NodegetChildByShortName (const std::string &name) const throw (Exception)
 
NodegetChildByNameExec (const std::string &name, unsigned id) const throw (Exception)
 
std::vector< Node * > getNodes () const
 
bool isMultiplicitySpecified (unsigned &value) const
 
void forceMultiplicity (unsigned value)
 
virtual std::string getErrorReport ()
 returns a string that contains an error report if the node is in error More...
 
NodegetInitNode ()
 
NodegetExecNode ()
 
NodegetFinalizeNode ()
 
int getMaxLevelOfParallelism () const
 
- Public Member Functions inherited from YACS::ENGINE::ComposedNode
virtual ~ComposedNode ()
 
bool isFinished ()
 
virtual void resetState (int level)
 Reset the state of the node and its children depending on the parameter level. More...
 
std::string getName () const
 
std::string getTaskName (Task *task) const
 
DeploymentTree getDeploymentTree () const
 Essentially for test. Use checkDeploymentTree instead to be sure that returned DeploymentTree is consistent. More...
 
DeploymentTree checkDeploymentTree (bool deep) const throw (Exception)
 Perform check of deployment consistency of the current graph. More...
 
std::vector< Task * > getNextTasks (bool &isMore)
 
void notifyFrom (const Task *sender, YACS::Event event, const Executor *execInst)
 Notify the node a task has emitted an event. More...
 
bool edAddLink (OutPort *start, InPort *end) throw (Exception)
 Add a dataflow link between two data ports. More...
 
bool edAddLink (OutGate *start, InGate *end) throw (Exception)
 Add a controlflow link between two control ports. More...
 
bool edAddCFLink (Node *nodeS, Node *nodeE) throw (Exception)
 Add a controlflow link between two nodes. More...
 
void edRemoveCFLink (Node *nodeS, Node *nodeE) throw (Exception)
 Remove a controlflow link. More...
 
void edRemoveLink (OutPort *start, InPort *end) throw (Exception)
 Remove a dataflow link. More...
 
void edRemoveLink (OutGate *start, InGate *end) throw (Exception)
 Remove a controlflow link. More...
 
virtual bool isRepeatedUnpredictablySeveralTimes () const
 
virtual void removeRecursivelyRedundantCL ()
 
std::list< ElementaryNode * > getRecursiveConstituents () const
 
std::list< Node * > getAllRecursiveNodes ()
 Get all children nodes elementary and composed including this node. More...
 
virtual std::list< Node * > getAllRecursiveConstituents ()
 Idem getAllRecursiveNodes, but this node is NOT included. More...
 
std::list< ProgressWeightgetProgressWeight () const
 Get the progress weight for all elementary nodes. More...
 
std::string getInPortName (const InPort *) const throw (Exception)
 Get the input port name. More...
 
std::string getOutPortName (const OutPort *) const throw (Exception)
 
std::set< OutPort * > getAllOutPortsLeavingCurrentScope () const
 List all output ports of children nodes that are linked to out of scope input ports. More...
 
std::set< InPort * > getAllInPortsComingFromOutsideOfCurrentScope () const
 List all input ports that are linked to out of scope ports. More...
 
std::list< InputDataStreamPort * > getSetOfInputDataStreamPort () const
 
std::list< OutputDataStreamPort * > getSetOfOutputDataStreamPort () const
 
InputDataStreamPortgetInputDataStreamPort (const std::string &name) const throw (Exception)
 
OutputDataStreamPortgetOutputDataStreamPort (const std::string &name) const throw (Exception)
 
std::vector< std::pair
< OutPort *, InPort * > > 
getSetOfInternalLinks () const
 
virtual std::vector< std::pair
< OutPort *, InPort * > > 
getSetOfLinksLeavingCurrentScope () const
 
void checkConsistency (LinkInfo &info) const throw (Exception)
 
virtual std::vector< std::pair
< InPort *, OutPort * > > 
getSetOfLinksComingInCurrentScope () const
 
virtual void edUpdateState ()
 update the status of the node More...
 
ComposedNodegetRootNode () const throw (Exception)
 
bool isNodeAlreadyAggregated (const Node *node) const
 Check that Node 'node' is already a direct son of this. More...
 
virtual bool isNameAlreadyUsed (const std::string &name) const
 
NodeisInMyDescendance (Node *nodeToTest) const
 Returns the parent of a node that is the direct child of this node. More...
 
std::string getChildName (const Node *node) const throw (Exception)
 
virtual std::string getMyQualifiedName (const Node *directSon) const
 
NodegetChildByName (const std::string &name) const throw (Exception)
 
void loaded ()
 
void connected ()
 
virtual void cleanNodes ()
 Clean the composed node in case of not clean exit. More...
 
virtual std::string getProgress () const
 
- Public Member Functions inherited from YACS::ENGINE::Node
virtual ~Node ()
 
Nodeclone (ComposedNode *father, bool editionOnly=true) const
 This method MUST NEVER BE VIRTUAL More...
 
NodecloneWithoutCompAndContDeepCpy (ComposedNode *father, bool editionOnly=true) const
 This method MUST NEVER BE VIRTUAL More...
 
void setState (YACS::StatesForNode theState)
 Sets the given state for node. More...
 
virtual YACS::StatesForNode getState () const
 
virtual YACS::StatesForNode getEffectiveState () const
 Return the node state in the context of its father. More...
 
virtual YACS::StatesForNode getEffectiveState (const Node *) const
 Return the effective state of a node in the context of this one (its father) More...
 
std::string getColorState (YACS::StatesForNode state) const
 Return the color associated to a state. More...
 
InGategetInGate ()
 
OutGategetOutGate ()
 
const std::string & getName () const
 
void setName (const std::string &name)
 Change the name of the node. More...
 
ComposedNodegetFather () const
 
const std::string getId () const
 
bool exIsControlReady () const
 
std::list< Node * > getOutNodes () const
 
virtual void writeDot (std::ostream &os) const
 Dump to the input stream a dot representation of the node. More...
 
virtual void exFailedState ()
 Notify this node that its execution has failed. More...
 
virtual void exDisabledState ()
 Notify this node that it has been disabled. More...
 
std::list< InPort * > getSetOfInPort () const
 
std::list< OutPort * > getSetOfOutPort () const
 
virtual std::set< InputPort * > edGetSetOfUnitializedInputPort () const
 Becomes deprecated soon. Replaced by ComposedNode::CheckConsistency. More...
 
virtual bool edAreAllInputPortInitialized () const
 Becomes deprecated soon. Replaced by ComposedNode::CheckConsistency. More...
 
InPortgetInPort (const std::string &name) const throw (Exception)
 
InPropertyPortgetInPropertyPort () const throw (Exception)
 
std::list< ComposedNode * > getAllAscendanceOf (ComposedNode *levelToStop=0) const
 
bool operator> (const Node &other) const
 
bool operator< (const Node &other) const
 
std::string getImplementation () const
 
virtual void setProperty (const std::string &name, const std::string &value)
 
virtual std::string getProperty (const std::string &name)
 
std::map< std::string,
std::string > 
getProperties ()
 
std::map< std::string,
std::string > 
getPropertyMap ()
 
virtual void setProperties (std::map< std::string, std::string > properties)
 
virtual ProcgetProc ()
 
virtual const ProcgetProc () const
 
std::string getQualifiedName () const
 same as Node::getName() in most cases, but differs for children of switch More...
 
int getNumId ()
 return node instance identifiant, unique for each node instance More...
 
std::vector< std::pair
< std::string, int > > 
getDPLScopeInfo (ComposedNode *gfn)
 
virtual void applyDPLScope (ComposedNode *gfn)
 
virtual void sendEvent (const std::string &event)
 emit notification to all observers registered with the dispatcher More...
 
virtual void sendEvent2 (const std::string &event, void *something)
 emit notification to all observers registered with the dispatcher More...
 
virtual std::string getErrorDetails () const
 
virtual void setErrorDetails (const std::string &error)
 
virtual void modified ()
 Sets Node in modified state and its father if it exists. More...
 
virtual int isModified ()
 
virtual int isValid ()
 indicates if the node is valid (returns 1) or not (returns 0) More...
 
virtual std::string getContainerLog ()
 returns a string that contains the name of the container log file if it exists More...
 
virtual void ensureLoading ()
 Put this node into TOLOAD state when possible. More...
 
virtual void getCoupledNodes (std::set< Task * > &coupledNodes)
 
- Public Member Functions inherited from YACS::ENGINE::Scheduler
virtual ~Scheduler ()
 

Protected Member Functions

virtual YACS::Event updateStateOnFailedEventFrom (Node *node, const Executor *execInst)
 Method used to notify the node that a child node has failed. More...
 
void buildDelegateOf (InPort *&port, OutPort *initialStart, const std::list< ComposedNode * > &pointsOfView)
 
void buildDelegateOf (std::pair< OutPort *, OutPort * > &port, InPort *finalTarget, const std::list< ComposedNode * > &pointsOfView)
 
void checkControlDependancy (OutPort *start, InPort *end, bool cross, std::map< ComposedNode *, std::list< OutPort * >, SortHierarc > &fw, std::vector< OutPort * > &fwCross, std::map< ComposedNode *, std::list< OutPort * >, SortHierarc > &bw, LinkInfo &info) const
 
void checkCFLinks (const std::list< OutPort * > &starts, InputPort *end, unsigned char &alreadyFed, bool direction, LinkInfo &info) const
 check control flow links More...
 
void checkLinkPossibility (OutPort *start, const std::list< ComposedNode * > &pointsOfViewStart, InPort *end, const std::list< ComposedNode * > &pointsOfViewEnd) throw (Exception)
 
void cleanInterceptors ()
 
void launchMaxOfSamples (bool first)
 
bool isFullyLazy () const
 
bool isFullyBusy (unsigned &branchId) const
 
void initInterceptors (unsigned nbOfBr)
 
void pushValueOutOfScopeForCase (unsigned branchId)
 
NodesimpleClone (ComposedNode *father, bool editionOnly=true) const
 
virtual void loadAlgorithm ()
 Load the algorithm from the dynamic library. More...
 
- Protected Member Functions inherited from YACS::ENGINE::DynParaLoop
 DynParaLoop (const std::string &name, TypeCode *typeOfDataSplitted)
 
virtual ~DynParaLoop ()
 
 DynParaLoop (const DynParaLoop &other, ComposedNode *father, bool editionOnly)
 
void cleanDynGraph ()
 
void prepareInputsFromOutOfScope (int branchNb)
 
void putValueOnBranch (Any *val, unsigned branchId, bool first)
 
TypeOfNode getIdentityOfNotifyerNode (const Node *node, unsigned &id)
 
InputPortgetDynInputPortByAbsName (int branchNb, const std::string &name, bool initNodeAdmitted)
 
virtual void forwardExecStateToOriginalBody (Node *execNode)
 
std::vector< Node * > cloneAndPlaceNodesCoherently (const std::vector< Node * > &origNodes)
 Clone nodes and make their placement consistent with the placement of the original ones. More...
 
NodecheckConsistencyAndSetNode (Node *&nodeToReplace, Node *DISOWNnode)
 This method is used to factorize methods edSetNode, edSetInitNode and edSetFinalizeNode. More...
 
NoderemoveNode (Node *&nodeToRemove)
 This method is used to factorize methods edRemoveNode, edRemoveInitNode and edRemoveFinalizeNode. More...
 
virtual void shutdown (int level)
 Stop all pending activities of the composed node. More...
 
- Protected Member Functions inherited from YACS::ENGINE::ComposedNode
 ComposedNode (const std::string &name)
 
 ComposedNode (const ComposedNode &other, ComposedNode *father)
 
void performDuplicationOfPlacement (const Node &other)
 performs a duplication of placement using clone method of containers and components. clone behaviour is driven by attachOnCloning attribute. More...
 
void performShallowDuplicationOfPlacement (const Node &other)
 performs a also duplication of placement but here containers and components are not copied at all whatever the value of attachedOnCloning. More...
 
void edDisconnectAllLinksWithMe ()
 
YACS::Event updateStateFrom (Node *node, YACS::Event event, const Executor *execInst)
 Update node state on receiving event from a node. More...
 
virtual YACS::Event updateStateOnStartEventFrom (Node *node)
 Method used to notify the node that a child node has started. More...
 
virtual void getDelegateOf (InPort *&port, OutPort *initialStart, const std::list< ComposedNode * > &pointsOfView) throw (Exception)
 
virtual void getDelegateOf (std::pair< OutPort *, OutPort * > &port, InPort *finalTarget, const std::list< ComposedNode * > &pointsOfView) throw (Exception)
 
virtual void releaseDelegateOf (InPort *&port, OutPort *initialStart, const std::list< ComposedNode * > &pointsOfView) throw (Exception)
 
virtual void releaseDelegateOf (OutPort *portDwn, OutPort *portUp, InPort *finalTarget, const std::list< ComposedNode * > &pointsOfView) throw (Exception)
 
void checkInMyDescendance (Node *nodeToTest) const throw (Exception)
 Check if a node is in the descendance of this node. More...
 
template<class PORT >
std::string getPortName (const PORT *port) const throw (Exception)
 
void checkNoCrossHierachyWith (Node *node) const throw (Exception)
 
virtual void performCFComputations (LinkInfo &info) const
 perform recursively all CF computations. More...
 
virtual void destructCFComputations (LinkInfo &info) const
 destroy recursively all results of initial computations. More...
 
NodegetLowestNodeDealingAll (const std::list< OutPort * > &ports) const
 
void checkLinksCoherenceRegardingControl (const std::vector< OutPort * > &starts, InputPort *end, LinkInfo &info) const throw (Exception)
 
void solveObviousOrDelegateCFLinks (const std::list< OutPort * > &starts, InputPort *end, unsigned char &alreadyFed, bool direction, LinkInfo &info) const
 
- Protected Member Functions inherited from YACS::ENGINE::Node
 Node (const std::string &name)
 
 Node (const Node &other, ComposedNode *father)
 
virtual void exForwardFailed ()
 
virtual void exForwardFinished ()
 

Protected Attributes

Pool _myPool
 
bool _algInitOnFile
 
std::string _symbol
 
std::string _alglib
 
AnyInputPort _algoInitPort
 
::YACS::BASES::DynLibLoader * _loader
 
OptimizerAlgBase_alg
 
AnyInputPort _retPortForOutPool
 
std::vector< bool > _initNodeUpdated
 
bool _convergenceReachedWithOtherCalc
 
FakeNodeForOptimizerLoop_nodeForSpecialCases
 
std::vector< AnyInputPort * > _interceptorsForOutPool
 
std::map< InputPort
*, std::vector< InputPort * > > 
_interceptors
 outputports interceptors leaving current scope. More...
 
AnyOutputPort _algoResultPort
 
- Protected Attributes inherited from YACS::ENGINE::DynParaLoop
Node_node
 
Node_initNode
 
Node_finalizeNode
 
unsigned _nbOfEltConsumed
 
std::vector< int > _execIds
 
AnyInputPort _nbOfBranches
 
AnyOutputPort _splittedPort
 
std::vector< Node * > _execNodes
 
std::vector< Node * > _execInitNodes
 
std::vector< Node * > _execFinalizeNodes
 
int _initializingCounter
 
int _unfinishedCounter
 
int _failedCounter
 

Static Protected Attributes

static const int NOT_RUNNING_BRANCH_ID =-1973012217
 
static const int NOT_INITIALIZED_BRANCH_ID =-1973
 
static const char NAME_OF_ALGO_INIT_PORT [] = "algoInit"
 
static const char NAME_OF_OUT_POOL_INPUT [] = "evalResults"
 
static const char NAME_OF_ALGO_RESULT_PORT [] = "algoResults"
 
- Static Protected Attributes inherited from YACS::ENGINE::DynParaLoop
static const char NAME_OF_SPLITTED_SEQ_OUT [] = "evalSamples"
 
static const char OLD_NAME_OF_SPLITTED_SEQ_OUT [] = "SmplPrt"
 
static const char NAME_OF_NUMBER_OF_BRANCHES [] ="nbBranches"
 
- Static Protected Attributes inherited from YACS::ENGINE::ComposedNode
static const char SEP_CHAR_BTW_LEVEL [] ="."
 
static const unsigned char FED_ST = 2
 
static const unsigned char FREE_ST = 0
 
static const unsigned char FED_DS_ST = 1
 
- Static Protected Attributes inherited from YACS::ENGINE::Node
static const char SEP_CHAR_IN_PORT [] ="."
 
static int _total = 0
 

Private Member Functions

TypeCodecheckTypeCode (TypeCode *tc, const char *portName)
 

Friends

class FakeNodeForOptimizerLoop
 

Additional Inherited Members

- Static Public Member Functions inherited from YACS::ENGINE::ComposedNode
static ComposedNodegetLowestCommonAncestor (Node *node1, Node *node2) throw (Exception)
 Retrieves the lowest common ancestor of 2 nodes. More...
 
static std::string getLowestCommonAncestorStr (const std::string &node1, const std::string &node2)
 
- Public Attributes inherited from YACS::ENGINE::Node
YACS::Colour _colour
 
- Static Public Attributes inherited from YACS::ENGINE::Node
static std::map< int, Node * > idMap
 
- Protected Types inherited from YACS::ENGINE::DynParaLoop
enum  TypeOfNode { INIT_NODE = 5, WORK_NODE = 6, FINALIZE_NODE = 7 }
 
- Static Protected Member Functions inherited from YACS::ENGINE::ComposedNode
static bool splitNamesBySep (const std::string &globalName, const char separator[], std::string &firstPart, std::string &lastPart, bool priority) throw (Exception)
 Splits name globalName in 2 parts using separator. More...
 

Detailed Description

class to build optimization loops

Definition at line 56 of file OptimizerLoop.hxx.

Constructor & Destructor Documentation

OptimizerLoop::OptimizerLoop ( const std::string &  name,
const std::string &  algLibWthOutExt,
const std::string &  symbolNameToOptimizerAlgBaseInstanceFactory,
bool  algInitOnFile,
bool  initAlgo = true,
Proc procForTypes = NULL 
)

Definition at line 98 of file OptimizerLoop.cxx.

References setAlgorithm().

Referenced by simpleClone().

101  :
102  DynParaLoop(name,Runtime::_tc_string),_algInitOnFile(algInitOnFile),_alglib(algLibWthOutExt),
107 {
108  //We need this because calling a virtual method in a constructor does not call the most derived method but the method of the class
109  //A derived class must take care to manage that
110  if(initAlgo)
111  setAlgorithm(algLibWthOutExt,symbolNameToOptimizerAlgBaseInstanceFactory, procForTypes);
}
OptimizerLoop::OptimizerLoop ( const OptimizerLoop other,
ComposedNode father,
bool  editionOnly 
)

Definition at line 113 of file OptimizerLoop.cxx.

References _retPortForOutPool, YACS::ENGINE::ComposedNode::edAddLink(), YACS::ENGINE::InPort::edSetOutPort(), getOutPort(), and YACS::ENGINE::ComposedNode::getPortName().

114  :
115  DynParaLoop(other,father,editionOnly),_algInitOnFile(other._algInitOnFile),_alglib(other._alglib),
118  _algoResultPort(other._algoResultPort, this)
119 {
120  //Don't call setAlgorithm here because it will be called several times if the class is derived. Call it in simpleClone for cloning
121 
122  // Create the links to evalResults port
123  set<OutPort *> fromPortsToReproduce=other._retPortForOutPool.edSetOutPort();
124  for(set<OutPort *>::iterator iter=fromPortsToReproduce.begin();iter!=fromPortsToReproduce.end();iter++)
}
OptimizerLoop::~OptimizerLoop ( )

Definition at line 127 of file OptimizerLoop.cxx.

References _alg, _loader, _nodeForSpecialCases, YACS::ENGINE::DynParaLoop::cleanDynGraph(), cleanInterceptors(), and YACS::ENGINE::RefCounter::decrRef().

128 {
129  if(_alg)
130  _alg->decrRef();
131  cleanDynGraph();
133  delete _loader;
134  delete _nodeForSpecialCases;
135 }

Member Function Documentation

void OptimizerLoop::accept ( Visitor visitor)
virtual

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 694 of file OptimizerLoop.cxx.

References YACS::ENGINE::Visitor::visitOptimizerLoop().

695 {
696  visitor->visitOptimizerLoop(this);
697 }
void OptimizerLoop::buildDelegateOf ( InPort *&  port,
OutPort initialStart,
const std::list< ComposedNode * > &  pointsOfView 
)
protectedvirtual

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 474 of file OptimizerLoop.cxx.

References _retPortForOutPool, YACS::ENGINE::DynParaLoop::buildDelegateOf(), and YACS::ENGINE::DataPort::getName().

475 {
476  DynParaLoop::buildDelegateOf(port,initialStart,pointsOfView);
477  if(port==&_retPortForOutPool)
478  {
479  std::string linkName("(");
480  linkName += initialStart->getName()+" to "+port->getName()+")";
481  throw Exception(std::string("Illegal OptimizerLoop link: \
482 The 'evalResults' port must be linked within the scope of the loop.")
483  + linkName);
484  }
485 }
void OptimizerLoop::buildDelegateOf ( std::pair< OutPort *, OutPort * > &  port,
InPort finalTarget,
const std::list< ComposedNode * > &  pointsOfView 
)
protectedvirtual

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 487 of file OptimizerLoop.cxx.

References _algoResultPort, YACS::ENGINE::DynParaLoop::buildDelegateOf(), YACS::ENGINE::DataPort::getName(), and YACS::ENGINE::OutputPort::NAME.

488 {
489  DynParaLoop::buildDelegateOf(port,finalTarget,pointsOfView);
490  if(port.first != &_algoResultPort)
491  {
492  std::string linkName("(");
493  linkName += port.first->getName()+" to "+finalTarget->getName()+")";
494  throw Exception(std::string("Illegal OptimizerLoop link: \
495 Only the algorithm result port can be linked to a port outside the scope of the loop.")
496  + linkName);
497  }
498 
499  string typeOfPortInstance=(port.first)->getNameOfTypeOfCurrentInstance();
500  if(typeOfPortInstance!=OutputPort::NAME)
501  throw Exception("OptimizerLoop::buildDelegateOf : not implemented for DS because not specified ");
502 }
void OptimizerLoop::checkBasicConsistency ( ) const throw (Exception)
virtual

Check validity for the node.

Throw an exception if the node is not valid

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 801 of file OptimizerLoop.cxx.

References _alg, _alglib, YACS::ENGINE::Node::_errorDetails, _symbol, YACS::ENGINE::DynParaLoop::checkBasicConsistency(), and DEBTRACE.

802 {
803  DEBTRACE("OptimizerLoop::checkBasicConsistency");
804  if (_alglib == "")
805  throw Exception("No library specified for the OptimizerLoop control algorithm");
806  if (_symbol == "")
807  throw Exception("No symbol specified for the OptimizerLoop control algorithm");
808  if(_alg == NULL)
809  throw YACS::Exception("Problem during library loading: "+_errorDetails);
810 
812 }
void OptimizerLoop::checkCFLinks ( const std::list< OutPort * > &  starts,
InputPort end,
unsigned char &  alreadyFed,
bool  direction,
LinkInfo info 
) const
protectedvirtual

check control flow links

Parameters
startsIf different of 0, must aggregate at leat 1 element.
end:
alreadyFedin/out parameter. Indicates if 'end' ports is already and surely set or fed by an another port.
directionIf true : forward direction else backward direction.
info: informations collectedduring the check

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 516 of file OptimizerLoop.cxx.

References _retPortForOutPool, YACS::ENGINE::DynParaLoop::checkCFLinks(), and YACS::ENGINE::ComposedNode::solveObviousOrDelegateCFLinks().

517 {
518  if(end==&_retPortForOutPool)
519  solveObviousOrDelegateCFLinks(starts,end,alreadyFed,direction,info);
520  else
521  DynParaLoop::checkCFLinks(starts,end,alreadyFed,direction,info);
522 }
void OptimizerLoop::checkControlDependancy ( OutPort start,
InPort end,
bool  cross,
std::map< ComposedNode *, std::list< OutPort * >, SortHierarc > &  fw,
std::vector< OutPort * > &  fwCross,
std::map< ComposedNode *, std::list< OutPort * >, SortHierarc > &  bw,
LinkInfo info 
) const
protectedvirtual
Parameters
start: start port
end: end port
crossindicates if start -> end link is a DS link behind.
fwout parameter.
fwCrossout parameter storing links where a cross has been detected.
bwout parameter where backward links are stored.
info: collected information

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 504 of file OptimizerLoop.cxx.

References _retPortForOutPool, and YACS::ENGINE::DynParaLoop::checkControlDependancy().

509 {
510  if(end==&_retPortForOutPool)
511  fw[(ComposedNode *)this].push_back(start);
512  else
513  DynParaLoop::checkControlDependancy(start,end,cross,fw,fwCross,bw,info);
514 }
void OptimizerLoop::checkLinkPossibility ( OutPort start,
const std::list< ComposedNode * > &  pointsOfViewStart,
InPort end,
const std::list< ComposedNode * > &  pointsOfViewEnd 
) throw (Exception)
protectedvirtual

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 524 of file OptimizerLoop.cxx.

References YACS::ENGINE::DynParaLoop::checkLinkPossibility().

526 {
527  DynParaLoop::checkLinkPossibility(start, pointsOfViewStart, end, pointsOfViewEnd);
528  std::string linkName("(");
529  linkName += start->getName()+" to "+end->getName()+")";
530 
531  // Yes, it should be possible to link back the result port to any input port of the loop.
532  if(end == &_nbOfBranches || end == &_algoInitPort)
533  if(start != &_algoResultPort)
534  throw Exception(std::string("Illegal OptimizerLoop link.") + linkName);
535  else
536  return;
537 
538  if(start == &_algoResultPort)
539  throw Exception(std::string("Illegal OptimizerLoop link: \
540 The 'algoResult' port can't be linked within the scope of the loop.") + linkName);
541 
542  if(end == &_retPortForOutPool && isInMyDescendance(start->getNode())!=_node)
543  throw Exception(std::string("Illegal OptimizerLoop link: \
544 The 'evalResults' port can only be linked to the working node.") + linkName);
545 }
void OptimizerLoop::checkNoCyclePassingThrough ( Node node) throw (Exception)
virtual

Implements YACS::ENGINE::ComposedNode.

Definition at line 470 of file OptimizerLoop.cxx.

471 {
472 }
TypeCode * OptimizerLoop::checkTypeCode ( TypeCode tc,
const char *  portName 
)
private

Definition at line 743 of file OptimizerLoop.cxx.

References YACS::ENGINE::ComposedNode::getName().

Referenced by setAlgorithm().

744 {
745  if (tc == NULL) {
746  ostringstream errorMsg;
747  errorMsg << "The algorithm specified for OptimizerLoop node \"" << getName() <<
748  "\" provided an invalid type for port \"" << portName << "\"";
749  throw Exception(errorMsg.str());
750  }
751  return tc;
752 }
void OptimizerLoop::cleanInterceptors ( )
protected

Definition at line 547 of file OptimizerLoop.cxx.

References _interceptors, and _interceptorsForOutPool.

Referenced by init(), and ~OptimizerLoop().

548 {
549  // At this point all garanties taken let's clean all.
550  map<InputPort *,vector<InputPort *> >::iterator iter=_interceptors.begin();
551  for(;iter!=_interceptors.end();iter++)
552  for(vector<InputPort *>::iterator iter2=(*iter).second.begin();iter2!=(*iter).second.end();iter2++)
553  delete (*iter2);
554  _interceptors.clear();
555  for(vector<AnyInputPort *>::iterator iter3=_interceptorsForOutPool.begin();iter3!=_interceptorsForOutPool.end();iter3++)
556  delete (*iter3);
557  _interceptorsForOutPool.clear();
558 }
InputPort* YACS::ENGINE::OptimizerLoop::edGetAlgoInitPort ( )
inline

Definition at line 86 of file OptimizerLoop.hxx.

Referenced by YACS::HMI::EditionOptimizerLoop::onModifyInitFile(), and YACS::HMI::EditionOptimizerLoop::update().

86 { return &_algoInitPort; }
OutputPort* YACS::ENGINE::OptimizerLoop::edGetAlgoResultPort ( )
inline

Definition at line 87 of file OptimizerLoop.hxx.

Referenced by YACS::HMI::EditionOptimizerLoop::update().

87 { return &_algoResultPort; }
InputPort* YACS::ENGINE::OptimizerLoop::edGetPortForOutPool ( )
inline

Definition at line 85 of file OptimizerLoop.hxx.

Referenced by YACS::HMI::CommandSetAlgo::localExecute(), YACS::HMI::CommandSetAlgo::localReverse(), and YACS::HMI::EditionOptimizerLoop::update().

85 { return &_retPortForOutPool; }
void OptimizerLoop::exUpdateState ( )
virtual

Update the node state.

Note
: Update the '_state' attribute. Typically called by 'this->_inGate' when 'this->_inGate' is ready.

Called by InGate::exNotifyFromPrecursor

Reimplemented from YACS::ENGINE::Node.

Definition at line 161 of file OptimizerLoop.cxx.

References _alg, _algoInitPort, _algoResultPort, YACS::ENGINE::DynParaLoop::_execFinalizeNodes, YACS::ENGINE::DynParaLoop::_execIds, YACS::ENGINE::DynParaLoop::_execInitNodes, YACS::ENGINE::DynParaLoop::_execNodes, YACS::ENGINE::DynParaLoop::_finalizeNode, YACS::ENGINE::Node::_inGate, YACS::ENGINE::DynParaLoop::_initializingCounter, YACS::ENGINE::DynParaLoop::_initNode, _initNodeUpdated, _myPool, YACS::ENGINE::Node::_name, YACS::ENGINE::DynParaLoop::_nbOfBranches, YACS::ENGINE::DynParaLoop::_node, _nodeForSpecialCases, YACS::ENGINE::Node::_state, YACS::ENGINE::DynParaLoop::cloneAndPlaceNodesCoherently(), YACS::ENGINE::Pool::destroyAll(), YACS::DISABLED, YACS::ENGINE::InGate::exIsReady(), FakeNodeForOptimizerLoop, YACS::ENGINE::OptimizerAlgBase::finishProxy(), YACS::ENGINE::ComposedNode::getAllOutPortsLeavingCurrentScope(), YACS::ENGINE::OptimizerAlgBase::getError(), YACS::ENGINE::AnyInputPort::getIntValue(), YACS::ENGINE::Pool::getNextSampleWithHighestPriority(), YACS::ENGINE::AnyInputPort::getValue(), YACS::ENGINE::OptimizerAlgBase::hasError(), CORBAEngineTest::i, YACS::ENGINE::OptimizerAlgBase::initializeProxy(), initInterceptors(), launchMaxOfSamples(), NOT_INITIALIZED_BRANCH_ID, YACS::ENGINE::DynParaLoop::prepareInputsFromOutOfScope(), YACS::ENGINE::OptimizerAlgBase::setNbOfBranches(), YACS::ENGINE::Node::setState(), YACS::ENGINE::OptimizerAlgBase::startProxy(), and YACS::TOACTIVATE.

162 {
163  if(_state == YACS::DISABLED)
164  return;
165  delete _nodeForSpecialCases;
166  _nodeForSpecialCases = NULL;
167  try
168  {
169  if(_inGate.exIsReady())
170  {
172  // Force termination in case the previous algorithm did not finish properly (manual stop)
173  _alg->finishProxy();
175 
176  // Initialize and launch the algorithm
178  if (_alg->hasError()) {
179  string error = _alg->getError();
180  _alg->finishProxy();
181  throw Exception(error);
182  }
183 
184  //internal graph update
185  int i;
186  int nbOfBr=_nbOfBranches.getIntValue();
187  _alg->setNbOfBranches(nbOfBr);
188 
189  _alg->startProxy();
190  if (_alg->hasError()) {
191  string error = _alg->getError();
192  _alg->finishProxy();
193  throw Exception(error);
194  }
195 
196  if(nbOfBr==0)
197  {
198  // A number of branches of 0 is acceptable if there are no output ports
199  // leaving OptimizerLoop
200  bool normal = getAllOutPortsLeavingCurrentScope().empty();
202  "OptimizerLoop has no branch to run the internal node(s)");
203  return;
204  }
205  _execNodes.resize(nbOfBr);
206  _execIds.resize(nbOfBr);
207  if(_initNode)
208  {
209  _execInitNodes.resize(nbOfBr);
210  _initNodeUpdated.resize(nbOfBr);
211  for(i=0;i<nbOfBr;i++)
212  _initNodeUpdated[i]=false;
213  }
215  if (_finalizeNode)
216  _execFinalizeNodes.resize(nbOfBr);
217  vector<Node *> origNodes;
218  origNodes.push_back(_initNode);
219  origNodes.push_back(_node);
220  origNodes.push_back(_finalizeNode);
221  for(i=0;i<nbOfBr;i++)
222  {
224  vector<Node *> clonedNodes = cloneAndPlaceNodesCoherently(origNodes);
225  if(_initNode)
226  _execInitNodes[i] = clonedNodes[0];
227  _execNodes[i] = clonedNodes[1];
228  if(_finalizeNode)
229  _execFinalizeNodes[i] = clonedNodes[2];
231  }
232  initInterceptors(nbOfBr);
233  int id;
234  unsigned char priority;
235  Any *val=_myPool.getNextSampleWithHighestPriority(id,priority);
236  if(!val)
237  {
238  // It is acceptable to have no sample to launch if there are no output ports
239  // leaving OptimizerLoop
240  std::set<OutPort *> setOutPort = getAllOutPortsLeavingCurrentScope();
241  // Special in the special
242  // We do not check algoResult
243  setOutPort.erase(&_algoResultPort);
244  bool normal = setOutPort.empty();
246  string("The algorithm of OptimizerLoop with name ") + _name +
247  " returns no sample to launch");
248  return;
249  }
250  launchMaxOfSamples(true);
251  }
252  }
253  catch (const exception & e)
254  {
256  string("An error happened in the control algorithm of OptimizerLoop \"") + _name +
257  "\": " + e.what());
258  }
259 }
YACS::Event OptimizerLoop::finalize ( )

Definition at line 410 of file OptimizerLoop.cxx.

References _alg, _algoResultPort, YACS::ENGINE::DynParaLoop::_execFinalizeNodes, YACS::ENGINE::DynParaLoop::_execIds, YACS::ENGINE::DynParaLoop::_finalizeNode, YACS::ENGINE::DynParaLoop::_nbOfBranches, YACS::ENGINE::DynParaLoop::_node, YACS::ENGINE::DynParaLoop::_unfinishedCounter, DEBTRACE, YACS::DONE, YACS::FINISH, YACS::ENGINE::OptimizerAlgBase::finishProxy(), YACS::ENGINE::OptimizerAlgBase::getAlgoResultProxy(), YACS::ENGINE::ComposedNode::getAllRecursiveConstituents(), YACS::ENGINE::AnyInputPort::getIntValue(), CORBAEngineTest::i, YACS::NOEVENT, NOT_INITIALIZED_BRANCH_ID, NOT_RUNNING_BRANCH_ID, YACS::ENGINE::AnyOutputPort::put(), YACS::ENGINE::Node::setState(), and YASSERT.

Referenced by updateStateOnFinishedEventFrom().

411 {
412  //update internal node (definition node) state
413  if (_node)
414  {
416  ComposedNode* compNode = dynamic_cast<ComposedNode*>(_node);
417  if (compNode)
418  {
419  std::list<Node *> aChldn = compNode->getAllRecursiveConstituents();
420  std::list<Node *>::iterator iter=aChldn.begin();
421  for(;iter!=aChldn.end();iter++)
422  (*iter)->setState(YACS::DONE);
423  }
424  }
425  _alg->finishProxy();
427  if (_finalizeNode == NULL)
428  {
429  // No finalize node, we just finish OptimizerLoop at the end of exec nodes execution
431  return YACS::FINISH;
432  }
433  else
434  {
435  // Run the finalize nodes, the OptimizerLoop will be done only when they all finish
436  _unfinishedCounter = 0; // This counter indicates how many branches are not finished
437  for (int i=0 ; i<_nbOfBranches.getIntValue() ; i++)
439  {
440  DEBTRACE("Launching finalize node for branch " << i)
443  }
444  else
445  // There should not be any running branch at this point
447  return YACS::NOEVENT;
448  }
449 }
std::string OptimizerLoop::getAlgLib ( ) const
virtual

Return the name of the algorithm library.

Definition at line 792 of file OptimizerLoop.cxx.

References _alglib.

Referenced by YACS::HMI::EditionOptimizerLoop::onModifyLib(), YACS::HMI::EditionOptimizerLoop::update(), and YACS::ENGINE::VisitorSaveSchema::visitOptimizerLoop().

793 {
794  return _alglib;
795 }
InputPort * OptimizerLoop::getInputPort ( const std::string &  name) const throw (Exception)
virtual

Get an input port given its name.

Contrary to YACS::ENGINE::ComposedNode::getOutputPort, this method is NOT recursive and so the leaf of type ElementaryNode aggregating this InputPort is directly invoked.

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 266 of file OptimizerLoop.cxx.

References YACS::ENGINE::DynParaLoop::getInputPort().

267 {
268  if (name == NAME_OF_ALGO_INIT_PORT)
269  return (InputPort *)&_algoInitPort;
270  else if (name == NAME_OF_OUT_POOL_INPUT)
271  return (InputPort *)&_retPortForOutPool;
272  else
273  return DynParaLoop::getInputPort(name);
274 }
std::list< InputPort * > OptimizerLoop::getLocalInputPorts ( ) const
virtual

redefined on derived class of ComposedNode. by default a ComposedNode has no port by itself

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 284 of file OptimizerLoop.cxx.

References _algoInitPort, _retPortForOutPool, YACS::ENGINE::DynParaLoop::getLocalInputPorts(), and PMMLBasicsTestLauncher::ret.

285 {
286  list<InputPort *> ret=DynParaLoop::getLocalInputPorts();
287  ret.push_back((InputPort *)&_algoInitPort);
288  ret.push_back((InputPort *)&_retPortForOutPool);
289  return ret;
290 }
std::list< OutputPort * > OptimizerLoop::getLocalOutputPorts ( ) const
virtual

redefined on derived class of ComposedNode. by default a ComposedNode has no port by itself

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 826 of file OptimizerLoop.cxx.

References _algoResultPort, YACS::ENGINE::DynParaLoop::getLocalOutputPorts(), and PMMLBasicsTestLauncher::ret.

827 {
828  list<OutputPort *> ret = DynParaLoop::getLocalOutputPorts();
829  ret.push_front((OutputPort *)&_algoResultPort);
830  return ret;
831 }
int OptimizerLoop::getNumberOfInputPorts ( ) const
virtual

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 261 of file OptimizerLoop.cxx.

References YACS::ENGINE::DynParaLoop::getNumberOfInputPorts().

262 {
264 }
int OptimizerLoop::getNumberOfOutputPorts ( ) const
virtual

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 814 of file OptimizerLoop.cxx.

References YACS::ENGINE::DynParaLoop::getNumberOfOutputPorts().

815 {
817 }
OutPort * OptimizerLoop::getOutPort ( const std::string &  name) const throw (Exception)
virtual
Note
: Contrary to getOutputPort method, this method returns the output port at highest level, possible. That is to say in some ComposedNode, like ForEachLoop or Switch, an outport inside 'this' is seen differently than the true outport.

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 833 of file OptimizerLoop.cxx.

References YACS::ENGINE::DynParaLoop::getOutPort().

Referenced by OptimizerLoop().

834 {
835  return (name == NAME_OF_ALGO_RESULT_PORT) ? (OutPort *)&_algoResultPort :
837 }
OutputPort * OptimizerLoop::getOutputPort ( const std::string &  name) const throw (Exception)
virtual

Get an output port given its name.

Contrary to YACS::ENGINE::ComposedNode::getInputPort, this method is recursive and go down hierarchy step by step to complete its work.

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 840 of file OptimizerLoop.cxx.

References YACS::ENGINE::DynParaLoop::getOutputPort().

Referenced by initInterceptors().

841 {
842  return (name == NAME_OF_ALGO_RESULT_PORT) ? (OutputPort *)&_algoResultPort :
844 }
void OptimizerLoop::getReadyTasks ( std::vector< Task * > &  tasks)
virtual

Implements YACS::ENGINE::Node.

Definition at line 296 of file OptimizerLoop.cxx.

References YACS::ENGINE::DynParaLoop::_execFinalizeNodes, YACS::ENGINE::DynParaLoop::_execInitNodes, YACS::ENGINE::DynParaLoop::_execNodes, YACS::ENGINE::DynParaLoop::_node, _nodeForSpecialCases, YACS::ENGINE::Node::_state, YACS::ACTIVATED, YACS::ENGINE::ElementaryNode::getReadyTasks(), and YACS::TOACTIVATE.

297 {
298  if(!_node)
299  return;
301  {
303  {
305  return ;
306  }
307  vector<Node *>::iterator iter;
308  for (iter=_execNodes.begin() ; iter!=_execNodes.end() ; iter++)
309  (*iter)->getReadyTasks(tasks);
310  for (iter=_execInitNodes.begin() ; iter!=_execInitNodes.end() ; iter++)
311  (*iter)->getReadyTasks(tasks);
312  for (iter=_execFinalizeNodes.begin() ; iter!=_execFinalizeNodes.end() ; iter++)
313  (*iter)->getReadyTasks(tasks);
314  }
315 }
std::list< InputPort * > OptimizerLoop::getSetOfInputPort ( ) const
virtual

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 276 of file OptimizerLoop.cxx.

References _algoInitPort, _retPortForOutPool, YACS::ENGINE::DynParaLoop::getSetOfInputPort(), and PMMLBasicsTestLauncher::ret.

277 {
278  list<InputPort *> ret=DynParaLoop::getSetOfInputPort();
279  ret.push_back((InputPort *)&_algoInitPort);
280  ret.push_back((InputPort *)&_retPortForOutPool);
281  return ret;
282 }
std::list< OutputPort * > OptimizerLoop::getSetOfOutputPort ( ) const
virtual

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 819 of file OptimizerLoop.cxx.

References _algoResultPort, YACS::ENGINE::DynParaLoop::getSetOfOutputPort(), and PMMLBasicsTestLauncher::ret.

820 {
821  list<OutputPort *> ret = DynParaLoop::getSetOfOutputPort();
822  ret.push_back((OutputPort *)&_algoResultPort);
823  return ret;
824 }
virtual std::string YACS::ENGINE::OptimizerLoop::getSymbol ( ) const
inlinevirtual

Definition at line 96 of file OptimizerLoop.hxx.

Referenced by YACS::HMI::EditionOptimizerLoop::onModifyEntry(), YACS::HMI::EditionOptimizerLoop::update(), and YACS::ENGINE::VisitorSaveSchema::visitOptimizerLoop().

96 { return _symbol; }
void OptimizerLoop::init ( bool  start = true)
virtual

initialisation of all input and output ports and gates, for execution

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 150 of file OptimizerLoop.cxx.

References _algoInitPort, _algoResultPort, _convergenceReachedWithOtherCalc, _retPortForOutPool, YACS::ENGINE::DynParaLoop::cleanDynGraph(), cleanInterceptors(), YACS::ENGINE::OutputPort::exInit(), YACS::ENGINE::InputPort::exInit(), and YACS::ENGINE::DynParaLoop::init().

151 {
152  DynParaLoop::init(start);
153  _algoInitPort.exInit(start);
154  _retPortForOutPool.exInit(start);
157  cleanDynGraph();
159 }
void OptimizerLoop::initInterceptors ( unsigned  nbOfBr)
protected

Perform initialization of interceptors. WARNING _execNodes have to be created before.

Definition at line 620 of file OptimizerLoop.cxx.

References _algoResultPort, YACS::ENGINE::DynParaLoop::_execInitNodes, YACS::ENGINE::DynParaLoop::_execNodes, YACS::ENGINE::DynParaLoop::_initNode, _interceptors, _interceptorsForOutPool, YACS::ENGINE::DynParaLoop::_node, _retPortForOutPool, YACS::ENGINE::OutPort::addInPort(), YACS::ENGINE::AnyInputPort::clone(), YACS::ENGINE::InputPort::clone(), YACS::ENGINE::Node::clone(), YACS::ENGINE::OutputPort::edAddInputPort(), YACS::ENGINE::InPort::edSetOutPort(), YACS::ENGINE::ComposedNode::getAllOutPortsLeavingCurrentScope(), YACS::ENGINE::Port::getNode(), YACS::ENGINE::Node::getOutPortName(), getOutputPort(), YACS::ENGINE::InputPort::getPublicRepresentant(), YACS::ENGINE::OutputPort::getSetOfPhyLinks(), CORBAEngineTest::i, and YACS::ENGINE::ComposedNode::isInMyDescendance().

Referenced by exUpdateState().

621 {
622  //For all classical outputports leaving 'this'
623  set<OutPort *> portsToIntercept=getAllOutPortsLeavingCurrentScope();
624  portsToIntercept.erase(&_algoResultPort);
625  for(set<OutPort *>::iterator iter=portsToIntercept.begin();iter!=portsToIntercept.end();iter++)
626  {
627  OutputPort *portC=(OutputPort *)(*iter);//Warrantied by OptimizerLoop::buildDelegateOf
628  const set<InputPort *>& links=portC->getSetOfPhyLinks();
629  for(set<InputPort *>::const_iterator iter2=links.begin();iter2!=links.end();iter2++)
630  {
631 #ifdef NOCOVARIANT
632  InputPort *reprCur=dynamic_cast<InputPort *>((*iter2)->getPublicRepresentant());
633 #else
634  InputPort *reprCur=(*iter2)->getPublicRepresentant();
635 #endif
636  if(!isInMyDescendance(reprCur->getNode()))
637  {//here we've got an out of scope link : Let's intercept it
638  if(_interceptors.find(reprCur)==_interceptors.end())
639  {
640  _interceptors[reprCur].resize(nbOfBr);
641  for(unsigned i=0;i<nbOfBr;i++)
642  {
644  InputPort *clone=reprCur->clone(0);
645  _interceptors[reprCur][i]=clone;
646  portExecC->edAddInputPort(clone);
647  }
648  }
649  else
650  {
651  for(unsigned i=0;i<nbOfBr;i++)
652  {
654  portExecC->edAddInputPort(_interceptors[reprCur][i]);
655  }
656  }
657  }
658  }
659  }
660  // For out pool
661  _interceptorsForOutPool.resize(nbOfBr);
662  set< OutPort * > links=_retPortForOutPool.edSetOutPort();
663  for(unsigned i=0;i<nbOfBr;i++)
665  for(set<OutPort *>::iterator iter2=links.begin();iter2!=links.end();iter2++)
666  for(unsigned j=0;j<nbOfBr;j++)
667  {
668  OutPort *portExec;
669  Node *whatType=isInMyDescendance((*iter2)->getNode());
670  if(whatType==_node)
671  {
672  portExec=_execNodes[j]->getOutPort(_node->getOutPortName(*iter2));
673  portExec->addInPort(_interceptorsForOutPool[j]);
674  }
675  else if(whatType==_initNode && whatType!=0)//This case should never happend. Useless !
676  {
677  portExec=_execInitNodes[j]->getOutPort(_node->getOutPortName(*iter2));
678  portExec->addInPort(_interceptorsForOutPool[j]);
679  }
680  }
681 }
bool OptimizerLoop::isFullyBusy ( unsigned &  branchId) const
protected

Returns if a dynamic branch is available.

Parameters
branchIdOut param. Only usable if returned value is equal to false.

Definition at line 606 of file OptimizerLoop.cxx.

References YACS::ENGINE::DynParaLoop::_execIds, CORBAEngineTest::i, YACS::ENGINE::ComposedNode::isFinished(), NOT_INITIALIZED_BRANCH_ID, and NOT_RUNNING_BRANCH_ID.

Referenced by launchMaxOfSamples().

607 {
608  bool isFinished=true;
609  unsigned i;
610  for(i=0;i<_execIds.size() && isFinished;i++)
612  if(!isFinished)
613  branchId=i-1;
614  return isFinished;
615 }
bool OptimizerLoop::isFullyLazy ( ) const
protected

Definition at line 594 of file OptimizerLoop.cxx.

References YACS::ENGINE::DynParaLoop::_execIds, CORBAEngineTest::i, NOT_INITIALIZED_BRANCH_ID, and NOT_RUNNING_BRANCH_ID.

Referenced by updateStateOnFinishedEventFrom().

595 {
596  bool isLazy=true;
597  for(unsigned i=0;i<_execIds.size() && isLazy;i++)
599  return isLazy;
600 }
void OptimizerLoop::launchMaxOfSamples ( bool  first)
protected

Definition at line 560 of file OptimizerLoop.cxx.

References YACS::ENGINE::DynParaLoop::_execIds, YACS::ENGINE::DynParaLoop::_execInitNodes, YACS::ENGINE::DynParaLoop::_execNodes, YACS::ENGINE::DynParaLoop::_initializingCounter, YACS::ENGINE::DynParaLoop::_initNode, _initNodeUpdated, _myPool, YACS::ENGINE::DynParaLoop::_nbOfEltConsumed, YACS::ENGINE::Pool::getNextSampleWithHighestPriority(), CORBAEngineTest::i, isFullyBusy(), YACS::ENGINE::Pool::markIdAsInUse(), NOT_INITIALIZED_BRANCH_ID, and YACS::ENGINE::DynParaLoop::putValueOnBranch().

Referenced by exUpdateState(), and updateStateOnFinishedEventFrom().

561 {
562  int id;
563  unsigned char priority;
564  Any *val;
565  unsigned i;
566  for (val = _myPool.getNextSampleWithHighestPriority(id, priority);
567  !isFullyBusy(i) && val;
568  val = _myPool.getNextSampleWithHighestPriority(id, priority))
569  {
571  first=true; // node is not initialized (first pass)
572  else
573  first=false; // node is initialized (second pass)
574  _execIds[i]=id;
576  if(_initNode && !_initNodeUpdated[i])
577  {
578  putValueOnBranch(val,i,first);
579  _execInitNodes[i]->exUpdateState();
580  _initNodeUpdated[i]=true;
582  }
583  else
584  {
585  if(!first)
586  _execNodes[i]->init(first);
587  putValueOnBranch(val,i,first);
588  _execNodes[i]->exUpdateState();
590  }
591  }
592 }
void OptimizerLoop::loadAlgorithm ( )
protectedvirtual

Load the algorithm from the dynamic library.

Reimplemented in YACS::ENGINE::SalomeOptimizerLoop.

Definition at line 758 of file OptimizerLoop.cxx.

References _alg, _alglib, YACS::ENGINE::Node::_errorDetails, _loader, _myPool, _symbol, YACS::ENGINE::Node::modified(), YACS::Exception::what(), and YASSERT.

Referenced by YACS::ENGINE::SalomeOptimizerLoop::loadAlgorithm(), and setAlgorithm().

759 {
760  YASSERT(_alg == NULL)
761 
762  if (_loader != NULL) {
763  delete _loader;
764  _loader = NULL;
765  }
766  _loader = new YACS::BASES::DynLibLoader(_alglib);
767  OptimizerAlgBaseFactory algFactory = NULL;
768 
769  if (_alglib != "" && _symbol != "")
770  {
771  try
772  {
773  _errorDetails = "";
774  algFactory = (OptimizerAlgBaseFactory)_loader->getHandleOnSymbolWithName(_symbol);
775  }
776  catch (YACS::Exception& e)
777  {
778  _errorDetails = e.what();
779  modified();
780  throw;
781  }
782  }
783 
784  if (algFactory != NULL)
785  _alg = algFactory(&_myPool);
786 }
void OptimizerLoop::pushValueOutOfScopeForCase ( unsigned  branchId)
protected

Typically called when _alg has decided that convergence has been reached. In this case the links leaving the current scope are activated and filled with value of the branch specified by 'branchId' that is the branch in which the convergence has been reached.

Definition at line 687 of file OptimizerLoop.cxx.

References _interceptors.

Referenced by updateStateOnFinishedEventFrom().

688 {
689  map<InputPort *, std::vector<InputPort *> >::iterator iter;
690  for(iter=_interceptors.begin();iter!=_interceptors.end();iter++)
691  (*iter).first->put((*iter).second[branchId]->get());
692 }
void OptimizerLoop::selectRunnableTasks ( std::vector< Task * > &  tasks)
virtual

Implements YACS::ENGINE::Scheduler.

Definition at line 292 of file OptimizerLoop.cxx.

293 {
294 }
void OptimizerLoop::setAlgorithm ( const std::string &  alglib,
const std::string &  symbol,
bool  checkLinks = true,
Proc procForTypes = NULL 
)
virtual

Set the algorithm library name and factory name (symbol in library) to create the algorithm and change it if the node is not connected.

throw an exception if the node is connected

Definition at line 703 of file OptimizerLoop.cxx.

References _alg, _alglib, _algoInitPort, _algoResultPort, _retPortForOutPool, YACS::ENGINE::DynParaLoop::_splittedPort, _symbol, checkTypeCode(), YACS::ENGINE::RefCounter::decrRef(), YACS::ENGINE::InPort::edGetNumberOfLinks(), YACS::ENGINE::OutPort::edGetNumberOfOutLinks(), YACS::ENGINE::DataPort::edSetType(), YACS::ENGINE::Node::getProc(), YACS::ENGINE::OptimizerAlgBase::getTCForAlgoInitProxy(), YACS::ENGINE::OptimizerAlgBase::getTCForAlgoResultProxy(), YACS::ENGINE::OptimizerAlgBase::getTCForInProxy(), YACS::ENGINE::OptimizerAlgBase::getTCForOutProxy(), loadAlgorithm(), YACS::ENGINE::Node::modified(), NAME_OF_ALGO_INIT_PORT, NAME_OF_ALGO_RESULT_PORT, NAME_OF_OUT_POOL_INPUT, YACS::ENGINE::DynParaLoop::NAME_OF_SPLITTED_SEQ_OUT, YACS::ENGINE::AnyInputPort::put(), and YACS::ENGINE::OptimizerAlgBase::setProc().

Referenced by YACS::HMI::CommandSetAlgo::localExecute(), YACS::HMI::CommandSetAlgo::localReverse(), OptimizerLoop(), YACS::ENGINE::SalomeOptimizerLoop::SalomeOptimizerLoop(), YACS::ENGINE::SalomeOptimizerLoop::simpleClone(), and simpleClone().

705 {
706  if(checkLinks)
707  {
712  throw Exception("The OptimizerLoop node must be disconnected before setting the algorithm");
713  }
714 
715  _symbol = symbol;
716  _alglib = alglib;
717 
718  if (_alg) {
719  _alg->decrRef();
720  _alg = NULL;
721  }
722 
723  loadAlgorithm();
724 
725  if(_alg)
726  {
727  _alg->setProc((procForTypes == NULL) ? getProc() : procForTypes);
728 
729  // Delete the values in the input ports if they were initialized
730  _retPortForOutPool.put((Any *)NULL);
731  _algoInitPort.put((Any *)NULL);
732 
733  // Change the type of the ports
738  }
739 
740  modified();
741 }
Node * OptimizerLoop::simpleClone ( ComposedNode father,
bool  editionOnly = true 
) const
protectedvirtual

Implements YACS::ENGINE::Node.

Reimplemented in YACS::ENGINE::SalomeOptimizerLoop.

Definition at line 137 of file OptimizerLoop.cxx.

References _alglib, _symbol, YACS::ENGINE::Node::getProc(), OptimizerLoop(), and setAlgorithm().

138 {
139  OptimizerLoop* ol=new OptimizerLoop(*this,father,editionOnly);
140  // TODO: Remove this const_cast (find a better design to get the type codes from the original node)
141  Proc * procForTypes = ol->getProc();
142  if (procForTypes == NULL) {
143  const Proc * origProc = getProc();
144  procForTypes = const_cast<Proc *>(origProc);
145  }
146  ol->setAlgorithm(_alglib, _symbol, false, procForTypes);
147  return ol;
148 }
virtual std::string YACS::ENGINE::OptimizerLoop::typeName ( )
inlinevirtual

Reimplemented from YACS::ENGINE::ComposedNode.

Reimplemented in YACS::ENGINE::SalomeOptimizerLoop.

Definition at line 101 of file OptimizerLoop.hxx.

101 {return "YACS__ENGINE__OptimizerLoop";}
YACS::Event OptimizerLoop::updateStateOnFailedEventFrom ( Node node,
const Executor execInst 
)
protectedvirtual

Method used to notify the node that a child node has failed.

Notify the slave thread of the error, update the current state and return the change state

Parameters
node: the child node that has failed
Returns
the state change

Reimplemented from YACS::ENGINE::DynParaLoop.

Definition at line 459 of file OptimizerLoop.cxx.

References _alg, _myPool, DEBTRACE, YACS::ENGINE::Pool::destroyAll(), YACS::ENGINE::OptimizerAlgBase::finishProxy(), YACS::ENGINE::Node::getErrorReport(), YACS::ENGINE::Node::getName(), YACS::ENGINE::OptimizerAlgBase::setError(), and YACS::ENGINE::DynParaLoop::updateStateOnFailedEventFrom().

460 {
461  DEBTRACE("OptimizerLoop::updateStateOnFailedEventFrom " << node->getName());
462  _alg->setError(string("Error during the execution of YACS node ") + node->getName() +
463  ": " + node->getErrorReport());
464  _alg->finishProxy();
466  DEBTRACE("OptimizerLoop::updateStateOnFailedEventFrom: returned from error notification.");
467  return DynParaLoop::updateStateOnFailedEventFrom(node,execInst);
468 }
YACS::Event OptimizerLoop::updateStateOnFinishedEventFrom ( Node node)
virtual

Implements YACS::ENGINE::ComposedNode.

Definition at line 317 of file OptimizerLoop.cxx.

References _alg, _convergenceReachedWithOtherCalc, YACS::ENGINE::Node::_errorDetails, YACS::ENGINE::DynParaLoop::_execIds, YACS::ENGINE::DynParaLoop::_execNodes, YACS::ENGINE::DynParaLoop::_finalizeNode, YACS::ENGINE::DynParaLoop::_initializingCounter, YACS::ENGINE::DynParaLoop::_initNode, _interceptorsForOutPool, _myPool, YACS::ENGINE::DynParaLoop::_nbOfEltConsumed, YACS::ENGINE::DynParaLoop::_unfinishedCounter, YACS::ABORT, YACS::ENGINE::Pool::destroyCurrentCase(), YACS::DONE, YACS::ENGINE::Pool::empty(), YACS::ERROR, YACS::ENGINE::Node::exForwardFailed(), YACS::FAILED, finalize(), YACS::ENGINE::DynParaLoop::FINALIZE_NODE, YACS::FINISH, YACS::ENGINE::OptimizerAlgBase::finishProxy(), YACS::ENGINE::OptimizerAlgBase::getError(), YACS::ENGINE::DynParaLoop::getIdentityOfNotifyerNode(), YACS::ENGINE::Pool::getNextSampleWithHighestPriority(), YACS::ENGINE::Node::getState(), YACS::ENGINE::OptimizerAlgBase::hasError(), CORBAEngineTest::i, YACS::ENGINE::DynParaLoop::INIT_NODE, YACS::ENGINE::ComposedNode::isFinished(), isFullyLazy(), launchMaxOfSamples(), YACS::NOEVENT, NOT_INITIALIZED_BRANCH_ID, NOT_RUNNING_BRANCH_ID, pushValueOutOfScopeForCase(), YACS::ENGINE::Pool::putOutSampleAt(), YACS::ENGINE::Pool::setCurrentId(), YACS::ENGINE::Node::setState(), YACS::ENGINE::OptimizerAlgBase::takeDecisionProxy(), YACS::ENGINE::DynParaLoop::WORK_NODE, and YASSERT.

318 {
319  if (getState() == YACS::FAILED)
320  {
321  // This happens when a valid computation on a branch finishes after an error on another branch.
322  // In this case we just ignore the new result because the algorithm has already been terminated.
323  return YACS::NOEVENT;
324  }
325  unsigned int id;
326  switch(getIdentityOfNotifyerNode(node,id))
327  {
328  case INIT_NODE:
329  {
330  _execNodes[id]->exUpdateState();
334  break;
335  }
336  case WORK_NODE:
337  {
339  { //This case happens when alg has reached its convergence whereas other calculations still compute
341  if(!isFullyLazy())
342  return YACS::NOEVENT;
343  else
344  return finalize();
345  }
349  if (_alg->hasError()) {
350  _errorDetails = string("An error happened in the control algorithm of optimizer loop: ") +
351  _alg->getError();
352  _alg->finishProxy();
354  return YACS::ABORT;
355  }
356 
358  if(_myPool.empty())
359  {
362  if(!isFullyLazy())
363  {// This case happens when the hand is returned to continue, whereas some other are working in parallel for nothing.
365  return YACS::NOEVENT;
366  }
367  return finalize();
368  }
370  int newId;
371  unsigned char priority;
372  Any *val=_myPool.getNextSampleWithHighestPriority(newId, priority);
373  if(!val)
374  {
375  bool isFinished=true;
376  for(int i=0;i<_execIds.size() && isFinished;i++)
378  if(isFinished)
379  {
380  std::cerr <<"OptimizerLoop::updateStateOnFinishedEventFrom: Alg has not inserted more cases whereas last element has been calculated !" << std::endl;
382  exForwardFailed();
383  _alg->finishProxy();
384  return YACS::FINISH;
385  }
386  return YACS::NOEVENT;
387  }
388  launchMaxOfSamples(false);
389  break;
390  }
391  case FINALIZE_NODE:
392  {
394  if (_unfinishedCounter == 0)
395  {
398  return YACS::FINISH;
399  }
400  else
401  return YACS::NOEVENT;
402  break;
403  }
404  default:
405  YASSERT(false);
406  }
407  return YACS::NOEVENT;
408 }

Friends And Related Function Documentation

friend class FakeNodeForOptimizerLoop
friend

Definition at line 58 of file OptimizerLoop.hxx.

Referenced by exUpdateState().

Member Data Documentation

OptimizerAlgBase* YACS::ENGINE::OptimizerLoop::_alg
protected

Definition at line 67 of file OptimizerLoop.hxx.

Referenced by checkBasicConsistency(), YACS::ENGINE::FakeNodeForOptimizerLoop::execute(), exUpdateState(), finalize(), YACS::ENGINE::SalomeOptimizerLoop::loadAlgorithm(), loadAlgorithm(), setAlgorithm(), updateStateOnFailedEventFrom(), updateStateOnFinishedEventFrom(), and ~OptimizerLoop().

bool YACS::ENGINE::OptimizerLoop::_algInitOnFile
protected

Definition at line 62 of file OptimizerLoop.hxx.

std::string YACS::ENGINE::OptimizerLoop::_alglib
protected

Definition at line 64 of file OptimizerLoop.hxx.

Referenced by checkBasicConsistency(), getAlgLib(), YACS::ENGINE::SalomeOptimizerLoop::loadAlgorithm(), loadAlgorithm(), setAlgorithm(), YACS::ENGINE::SalomeOptimizerLoop::simpleClone(), and simpleClone().

AnyInputPort YACS::ENGINE::OptimizerLoop::_algoInitPort
protected

Definition at line 65 of file OptimizerLoop.hxx.

Referenced by exUpdateState(), getLocalInputPorts(), getSetOfInputPort(), init(), and setAlgorithm().

AnyOutputPort YACS::ENGINE::OptimizerLoop::_algoResultPort
protected

Definition at line 75 of file OptimizerLoop.hxx.

Referenced by buildDelegateOf(), YACS::ENGINE::FakeNodeForOptimizerLoop::execute(), exUpdateState(), finalize(), getLocalOutputPorts(), getSetOfOutputPort(), init(), initInterceptors(), and setAlgorithm().

bool YACS::ENGINE::OptimizerLoop::_convergenceReachedWithOtherCalc
protected

Definition at line 70 of file OptimizerLoop.hxx.

Referenced by init(), and updateStateOnFinishedEventFrom().

std::vector<bool> YACS::ENGINE::OptimizerLoop::_initNodeUpdated
protected

Definition at line 69 of file OptimizerLoop.hxx.

Referenced by exUpdateState(), and launchMaxOfSamples().

std::map<InputPort *, std::vector<InputPort *> > YACS::ENGINE::OptimizerLoop::_interceptors
protected

outputports interceptors leaving current scope.

Definition at line 74 of file OptimizerLoop.hxx.

Referenced by cleanInterceptors(), initInterceptors(), and pushValueOutOfScopeForCase().

std::vector<AnyInputPort *> YACS::ENGINE::OptimizerLoop::_interceptorsForOutPool
protected

Definition at line 72 of file OptimizerLoop.hxx.

Referenced by cleanInterceptors(), initInterceptors(), and updateStateOnFinishedEventFrom().

::YACS::BASES::DynLibLoader* YACS::ENGINE::OptimizerLoop::_loader
protected

Definition at line 66 of file OptimizerLoop.hxx.

Referenced by loadAlgorithm(), and ~OptimizerLoop().

Pool YACS::ENGINE::OptimizerLoop::_myPool
protected

Definition at line 61 of file OptimizerLoop.hxx.

Referenced by exUpdateState(), launchMaxOfSamples(), YACS::ENGINE::SalomeOptimizerLoop::loadAlgorithm(), loadAlgorithm(), updateStateOnFailedEventFrom(), and updateStateOnFinishedEventFrom().

FakeNodeForOptimizerLoop* YACS::ENGINE::OptimizerLoop::_nodeForSpecialCases
protected

Definition at line 71 of file OptimizerLoop.hxx.

Referenced by exUpdateState(), getReadyTasks(), and ~OptimizerLoop().

AnyInputPort YACS::ENGINE::OptimizerLoop::_retPortForOutPool
protected

Definition at line 68 of file OptimizerLoop.hxx.

Referenced by buildDelegateOf(), checkCFLinks(), checkControlDependancy(), getLocalInputPorts(), getSetOfInputPort(), init(), initInterceptors(), OptimizerLoop(), and setAlgorithm().

std::string YACS::ENGINE::OptimizerLoop::_symbol
protected

Definition at line 63 of file OptimizerLoop.hxx.

Referenced by checkBasicConsistency(), YACS::ENGINE::SalomeOptimizerLoop::loadAlgorithm(), loadAlgorithm(), setAlgorithm(), YACS::ENGINE::SalomeOptimizerLoop::simpleClone(), and simpleClone().

const char OptimizerLoop::NAME_OF_ALGO_INIT_PORT = "algoInit"
staticprotected

Definition at line 137 of file OptimizerLoop.hxx.

Referenced by setAlgorithm().

const char OptimizerLoop::NAME_OF_ALGO_RESULT_PORT = "algoResults"
staticprotected

Definition at line 139 of file OptimizerLoop.hxx.

Referenced by setAlgorithm().

const char OptimizerLoop::NAME_OF_OUT_POOL_INPUT = "evalResults"
staticprotected

Definition at line 138 of file OptimizerLoop.hxx.

Referenced by setAlgorithm().

const int OptimizerLoop::NOT_INITIALIZED_BRANCH_ID =-1973
staticprotected

Definition at line 136 of file OptimizerLoop.hxx.

Referenced by exUpdateState(), finalize(), isFullyBusy(), isFullyLazy(), launchMaxOfSamples(), and updateStateOnFinishedEventFrom().

const int OptimizerLoop::NOT_RUNNING_BRANCH_ID =-1973012217
staticprotected

Definition at line 135 of file OptimizerLoop.hxx.

Referenced by finalize(), isFullyBusy(), isFullyLazy(), and updateStateOnFinishedEventFrom().


The documentation for this class was generated from the following files: