The Gaudi Framework  v29r0 (ff2e7097)
PrecedenceRulesGraph.h
Go to the documentation of this file.
1 #ifndef GAUDIHIVE_PRECEDENCERULESGRAPH_H
2 #define GAUDIHIVE_PRECEDENCERULESGRAPH_H
3 
4 // std includes
5 #include <algorithm>
6 #include <chrono>
7 #include <sstream>
8 #include <unordered_map>
9 #include <vector>
10 
11 #include <boost/filesystem.hpp>
12 #include <boost/graph/adjacency_list.hpp>
13 #include <boost/graph/graphml.hpp>
14 #include <boost/variant.hpp>
15 
16 // fwk includes
17 #include "AlgsExecutionStates.h"
18 #include "EventSlot.h"
19 #include "GaudiKernel/Algorithm.h"
21 #include "GaudiKernel/ICondSvc.h"
23 #include "IGraphVisitor.h"
24 
25 namespace precedence
26 {
27  using boost::static_visitor;
28 
29  // Precedence trace utilities ==============================================
30  struct AlgoTraceProps {
32  AlgoTraceProps( const std::string& name, int index, int rank, double runtime )
33  : m_name( name ), m_index( index ), m_rank( rank ), m_runtime( runtime )
34  {
35  }
37  int m_index{-1};
38  int m_rank{-1};
39  int m_runtime{-1}; // ns
40  int m_eccentricity{-1};
41  };
42 
43  using PrecTrace = boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, AlgoTraceProps>;
44  using AlgoTraceVertex = boost::graph_traits<PrecTrace>::vertex_descriptor;
45 
46  // Precedence rules utilities ==============================================
47  struct AlgoProps {
48  AlgoProps() {}
49  AlgoProps( Algorithm* algo, uint nodeIndex, uint algoIndex, bool inverted, bool allPass )
50  : m_name( algo->name() )
51  , m_nodeIndex( nodeIndex )
52  , m_algoIndex( algoIndex )
53  , m_algorithm( algo )
54  , m_inverted( inverted )
55  , m_allPass( allPass )
56  , m_isIOBound( algo->isIOBound() )
57  {
58  }
59 
61  int m_nodeIndex{-1};
62  int m_algoIndex{-1};
63  int m_rank{-1};
65  Algorithm* m_algorithm{nullptr};
66 
68  bool m_inverted{false};
70  bool m_allPass{false};
72  bool m_isIOBound{false};
73  };
74 
76  DecisionHubProps( const std::string& name, uint nodeIndex, bool modeConcurrent, bool modePromptDecision,
77  bool modeOR, bool allPass )
78  : m_name( name )
79  , m_nodeIndex( nodeIndex )
80  , m_modeConcurrent( modeConcurrent )
81  , m_modePromptDecision( modePromptDecision )
82  , m_modeOR( modeOR )
83  , m_allPass( allPass )
84  {
85  }
86 
89 
96  bool m_modeOR;
98  bool m_allPass;
99  };
100 
101  struct DataProps {
102  DataProps( const DataObjID& id ) : m_id( id ) {}
103 
105  };
106 
107  // Vertex unpacking ========================================================
108 
109  struct VertexName : static_visitor<std::string> {
110  std::string operator()( const AlgoProps& props ) const { return props.m_name; }
111 
112  std::string operator()( const DecisionHubProps& props ) const { return props.m_name; }
113 
114  std::string operator()( const DataProps& props ) const { return props.m_id.fullKey(); }
115  };
116 
117  struct GroupMode : static_visitor<std::string> {
118  std::string operator()( const AlgoProps& ) const { return ""; }
119 
121  {
122  return props.m_modeConcurrent ? "Concurrent" : "Sequential";
123  }
124 
125  std::string operator()( const DataProps& ) const { return ""; }
126  };
127 
128  struct GroupLogic : static_visitor<std::string> {
129  std::string operator()( const AlgoProps& ) const { return ""; }
130 
131  std::string operator()( const DecisionHubProps& props ) const { return props.m_modeOR ? "OR" : "AND"; }
132 
133  std::string operator()( const DataProps& ) const { return ""; }
134  };
135 
136  struct GroupExit : static_visitor<std::string> {
137  std::string operator()( const AlgoProps& ) const { return ""; }
138 
140  {
141  return props.m_modePromptDecision ? "Early" : "Late";
142  }
143 
144  std::string operator()( const DataProps& ) const { return ""; }
145  };
146 
147  struct DecisionNegation : static_visitor<std::string> {
148  std::string operator()( const AlgoProps& props ) const { return props.m_inverted ? "Inverted" : "Non-inverted"; }
149 
150  std::string operator()( const DecisionHubProps& ) const { return ""; }
151 
152  std::string operator()( const DataProps& ) const { return ""; }
153  };
154 
155  struct AllPass : static_visitor<std::string> {
156  std::string operator()( const AlgoProps& props ) const { return props.m_allPass ? "Optimist" : "Realist"; }
157 
158  std::string operator()( const DecisionHubProps& props ) const { return props.m_allPass ? "Optimist" : "Realist"; }
159 
160  std::string operator()( const DataProps& ) const { return ""; }
161  };
162 
163  struct CFDecision : static_visitor<std::string> {
164  CFDecision( const EventSlot& slot ) : m_slot( slot ) {}
165 
166  std::string operator()( const AlgoProps& props ) const
167  {
168  return std::to_string( m_slot.controlFlowState.at( props.m_nodeIndex ) );
169  }
170 
172  {
173  return std::to_string( m_slot.controlFlowState.at( props.m_nodeIndex ) );
174  }
175 
176  std::string operator()( const DataProps& ) const { return ""; }
177 
179  };
180 
181  struct FSMState : static_visitor<std::string> {
182  FSMState( const EventSlot& slot ) : m_slot( slot ) {}
183 
184  std::string operator()( const AlgoProps& props ) const
185  {
187  State state = m_slot.algsStates[props.m_algoIndex];
188  switch ( state ) {
189  case State::INITIAL:
190  return "INITIAL";
191  case State::CONTROLREADY:
192  return "CONTROLREADY";
193  case State::DATAREADY:
194  return "DATAREADY";
195  case State::EVTACCEPTED:
196  return "EVTACCEPTED";
197  case State::EVTREJECTED:
198  return "EVTREJECTED";
199  case State::ERROR:
200  return "ERROR";
201  default:
202  return "UKNOWN";
203  }
204  }
205 
206  std::string operator()( const DecisionHubProps& ) const { return ""; }
207 
208  std::string operator()( const DataProps& ) const { return ""; }
209 
211  };
212 
213  struct StartTime : static_visitor<std::string> {
214  StartTime( SmartIF<ITimelineSvc> timelineSvc ) : m_timelineSvc( timelineSvc ) {}
215 
216  std::string operator()( const AlgoProps& props ) const
217  {
218 
219  std::string startTime = "UKNOWN";
220 
221  if ( m_timelineSvc.isValid() ) {
222 
223  TimelineEvent te{};
224  te.algorithm = props.m_name;
225  m_timelineSvc->getTimelineEvent( te );
226  startTime = std::to_string(
227  std::chrono::duration_cast<std::chrono::nanoseconds>( te.start.time_since_epoch() ).count() );
228  }
229 
230  return startTime;
231  }
232 
233  std::string operator()( const DecisionHubProps& ) const { return ""; }
234 
235  std::string operator()( const DataProps& ) const { return ""; }
236 
238  };
239 
240  struct EndTime : static_visitor<std::string> {
241  EndTime( SmartIF<ITimelineSvc> timelineSvc ) : m_timelineSvc( timelineSvc ) {}
242 
243  std::string operator()( const AlgoProps& props ) const
244  {
245 
246  std::string endTime = "UKNOWN";
247 
248  if ( m_timelineSvc.isValid() ) {
249 
250  TimelineEvent te{};
251  te.algorithm = props.m_name;
252  m_timelineSvc->getTimelineEvent( te );
253  endTime =
254  std::to_string( std::chrono::duration_cast<std::chrono::nanoseconds>( te.end.time_since_epoch() ).count() );
255  }
256 
257  return endTime;
258  }
259 
260  std::string operator()( const DecisionHubProps& ) const { return ""; }
261 
262  std::string operator()( const DataProps& ) const { return ""; }
263 
265  };
266 
267  struct Duration : static_visitor<std::string> {
268  Duration( SmartIF<ITimelineSvc> timelineSvc ) : m_timelineSvc( timelineSvc ) {}
269 
270  std::string operator()( const AlgoProps& props ) const
271  {
272 
273  std::string time = "UKNOWN";
274 
275  if ( m_timelineSvc.isValid() ) {
276 
277  TimelineEvent te;
278  te.algorithm = props.m_name;
279  m_timelineSvc->getTimelineEvent( te );
280  time = std::to_string( std::chrono::duration_cast<std::chrono::nanoseconds>( te.end - te.start ).count() );
281  }
282 
283  return time;
284  }
285 
286  std::string operator()( const DecisionHubProps& ) const { return ""; }
287 
288  std::string operator()( const DataProps& ) const { return ""; }
289 
291  };
292 
293  struct Operations : static_visitor<std::string> {
294  std::string operator()( const AlgoProps& props ) const { return props.m_isIOBound ? "IO-bound" : "CPU-bound"; }
295 
296  std::string operator()( const DecisionHubProps& ) const { return ""; }
297 
298  std::string operator()( const DataProps& ) const { return ""; }
299  };
300 
301  static inline std::ostream& operator<<( std::ostream& os, const AlgoProps& ) { return os << "Algo"; }
302  static inline std::ostream& operator<<( std::ostream& os, const DecisionHubProps& ) { return os << "DecisionHub"; }
303  static inline std::ostream& operator<<( std::ostream& os, const DataProps& ) { return os << "Data"; }
304 
305  //=========================================================================
306 
307  using VariantVertexProps = boost::variant<AlgoProps, DecisionHubProps, DataProps>;
308  using PRGraph = boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, VariantVertexProps>;
309  using PRVertexDesc = boost::graph_traits<PRGraph>::vertex_descriptor;
310 
311 } // namespace prules
312 
313 struct Cause {
314  enum class source { Root, Task };
315 
318 };
319 
320 namespace concurrency
321 {
322 
324  class PrecedenceRulesGraph;
325 
327  using precedence::AlgoProps;
329  using precedence::DataProps;
331 
332  // ==========================================================================
334  {
335  public:
337  ControlFlowNode( PrecedenceRulesGraph& graph, unsigned int nodeIndex, const std::string& name )
338  : m_graph( &graph ), m_nodeIndex( nodeIndex ), m_nodeName( name )
339  {
340  }
342  virtual ~ControlFlowNode() {}
343 
345  virtual bool accept( IGraphVisitor& visitor ) = 0;
347  virtual void printState( std::stringstream& output, AlgsExecutionStates& states,
348  const std::vector<int>& node_decisions, const unsigned int& recursionLevel ) const = 0;
350  const unsigned int& getNodeIndex() const { return m_nodeIndex; }
352  const std::string& getNodeName() const { return m_nodeName; }
353 
354  public:
356 
357  protected:
359  std::string stateToString( const int& stateId ) const;
360  unsigned int m_nodeIndex;
362  };
363 
365  {
366  public:
368  DecisionNode( PrecedenceRulesGraph& graph, unsigned int nodeIndex, const std::string& name, bool modeConcurrent,
369  bool modePromptDecision, bool modeOR, bool allPass )
370  : ControlFlowNode( graph, nodeIndex, name )
371  , m_modeConcurrent( modeConcurrent )
372  , m_modePromptDecision( modePromptDecision )
373  , m_modeOR( modeOR )
374  , m_allPass( allPass )
375  , m_children()
376  {
377  }
378 
380  ~DecisionNode() override;
381 
383  bool accept( IGraphVisitor& visitor ) override;
385  void addParentNode( DecisionNode* node );
387  void addDaughterNode( ControlFlowNode* node );
389  const std::vector<ControlFlowNode*>& getDaughters() const { return m_children; }
391  void printState( std::stringstream& output, AlgsExecutionStates& states, const std::vector<int>& node_decisions,
392  const unsigned int& recursionLevel ) const override;
393 
394  public:
401  bool m_modeOR;
403  bool m_allPass;
408  };
409 
410  // ==========================================================================
411  class DataNode;
412 
414  {
415  public:
417  AlgorithmNode( PrecedenceRulesGraph& graph, Algorithm* algoPtr, unsigned int nodeIndex, unsigned int algoIndex,
418  bool inverted, bool allPass )
419  : ControlFlowNode( graph, nodeIndex, algoPtr->name() )
420  , m_algorithm( algoPtr )
421  , m_algoIndex( algoIndex )
422  , m_algoName( algoPtr->name() )
423  , m_inverted( inverted )
424  , m_allPass( allPass )
425  , m_rank( -1 )
426  , m_isIOBound( algoPtr->isIOBound() ){};
428  ~AlgorithmNode();
429 
431  bool accept( IGraphVisitor& visitor ) override;
432 
434  void addParentNode( DecisionNode* node );
436  const std::vector<DecisionNode*>& getParentDecisionHubs() const { return m_parents; }
437 
439  void addOutputDataNode( DataNode* node );
441  void addInputDataNode( DataNode* node );
443  const std::vector<DataNode*>& getOutputDataNodes() const { return m_outputs; }
446 
448  void setRank( float& rank ) { m_rank = rank; }
450  const float& getRank() const { return m_rank; }
451 
453  Algorithm* getAlgorithm() const { return m_algorithm; }
455  const unsigned int& getAlgoIndex() const { return m_algoIndex; }
456 
458  void setIOBound( bool value ) { m_isIOBound = value; }
460  bool isIOBound() const { return m_isIOBound; }
461 
463  bool isOptimist() const { return m_allPass; };
465  bool isLiar() const { return m_inverted; };
466 
468  void printState( std::stringstream& output, AlgsExecutionStates& states, const std::vector<int>& node_decisions,
469  const unsigned int& recursionLevel ) const override;
470 
471  public:
474 
475  private:
479  unsigned int m_algoIndex;
485  bool m_allPass;
487  float m_rank;
490 
495  };
496 
497  // ==========================================================================
498  class DataNode
499  {
500  public:
502  DataNode( PrecedenceRulesGraph& graph, const DataObjID& path ) : m_graph( &graph ), m_data_object_path( path ) {}
503 
504  const DataObjID& getPath() { return m_data_object_path; }
505 
507  bool accept( IGraphVisitor& visitor )
508  {
509  if ( visitor.visitEnter( *this ) ) return visitor.visit( *this );
510  return true;
511  }
514  {
515  if ( std::find( m_producers.begin(), m_producers.end(), node ) == m_producers.end() )
516  m_producers.push_back( node );
517  }
520  {
521  if ( std::find( m_consumers.begin(), m_consumers.end(), node ) == m_consumers.end() )
522  m_consumers.push_back( node );
523  }
525  const std::vector<AlgorithmNode*>& getProducers() const { return m_producers; }
527  const std::vector<AlgorithmNode*>& getConsumers() const { return m_consumers; }
528 
529  public:
531 
532  private:
536  };
537 
538  class ConditionNode : public DataNode
539  {
540  public:
543  : DataNode( graph, path ), m_condSvc( condSvc )
544  {
545  }
546 
550  bool accept( IGraphVisitor& visitor )
551  {
552  if ( visitor.visitEnter( *this ) ) return visitor.visit( *this );
553  return true;
554  }
555 
556  public:
557  // Service for Conditions handling
559  };
560 
561  // ==========================================================================
565 
568 
570  virtual ~IPrecedenceRulesGraph() = default;
571  };
572 
573  class PrecedenceRulesGraph : public CommonMessaging<IPrecedenceRulesGraph>
574  {
575  public:
578  : m_headNode( 0 )
579  , m_nodeCounter( 0 )
580  , m_algoCounter( 0 )
581  , m_svcLocator( svc )
582  , m_name( name )
583  , m_initTime( std::chrono::system_clock::now() )
584  {
585  }
588  {
589  if ( m_headNode != 0 ) delete m_headNode;
590  }
591 
593  StatusCode initialize();
594 
596  void accept( const std::string& algo_name, IGraphVisitor& visitor ) const;
597 
599  StatusCode addDataNode( const DataObjID& dataPath );
601  DataNode* getDataNode( const DataObjID& dataPath ) const;
603  void registerIODataObjects( const Algorithm* algo );
605  StatusCode buildDataDependenciesRealm();
606 
608  void addHeadNode( const std::string& headName, bool modeConcurrent, bool modePromptDecision, bool modeOR,
609  bool allPass );
611  DecisionNode* getHeadNode() const { return m_headNode; };
613  StatusCode addAlgorithmNode( Algorithm* daughterAlgo, const std::string& parentName, bool inverted, bool allPass );
615  AlgorithmNode* getAlgorithmNode( const std::string& algoName ) const;
617  StatusCode addDecisionHubNode( Algorithm* daughterAlgo, const std::string& parentName, bool modeConcurrent,
618  bool modePromptDecision, bool modeOR, bool allPass );
620  unsigned int getControlFlowNodeCounter() const { return m_nodeCounter; }
621 
623  void rankAlgorithms( IGraphVisitor& ranker ) const;
624 
626  const std::string& name() const override { return m_name; }
628  SmartIF<ISvcLocator>& serviceLocator() const override { return m_svcLocator; }
630  const std::chrono::system_clock::time_point getInitTime() const { return m_initTime; }
631 
634  const unsigned int& recursionLevel ) const
635  {
636  m_headNode->printState( output, states, node_decisions, recursionLevel );
637  }
638 
640  PRVertexDesc node( const std::string& ) const;
641 
643  std::string dumpDataFlow() const;
645  std::string dumpControlFlow() const;
647  void dumpPrecRules( const boost::filesystem::path&, const EventSlot& slot );
649  void dumpPrecTrace( const boost::filesystem::path& );
651  void addEdgeToPrecTrace( const AlgorithmNode* u, const AlgorithmNode* v );
653  void dumpControlFlow( std::ostringstream&, ControlFlowNode*, const int& ) const;
654 
655  private:
667 
669  unsigned int m_nodeCounter;
671  unsigned int m_algoCounter;
672 
676 
678 
684 
686  bool m_conditionsRealmEnabled{false};
687  };
688 
689 } // namespace concurrency
690 #endif
std::vector< DataNode * > m_outputs
Algorithm outputs (DataNodes)
boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, VariantVertexProps > PRGraph
std::string operator()(const DecisionHubProps &props) const
const unsigned int & getAlgoIndex() const
Get algorithm index.
std::string operator()(const DecisionHubProps &) const
std::vector< DecisionNode * > m_parents
Direct parent nodes.
AlgoTraceProps(const std::string &name, int index, int rank, double runtime)
ControlFlowNode(PrecedenceRulesGraph &graph, unsigned int nodeIndex, const std::string &name)
Constructor.
std::string operator()(const AlgoProps &props) const
unsigned int m_algoIndex
The index of the algorithm.
const std::chrono::system_clock::time_point getInitTime() const
std::string operator()(const AlgoProps &props) const
DecisionNode(PrecedenceRulesGraph &graph, unsigned int nodeIndex, const std::string &name, bool modeConcurrent, bool modePromptDecision, bool modeOR, bool allPass)
Constructor.
AlgoProps(Algorithm *algo, uint nodeIndex, uint algoIndex, bool inverted, bool allPass)
precedence::PrecTrace m_precTrace
facilities for algorithm precedence tracing
void setIOBound(bool value)
Set the I/O-boundness flag.
boost::graph_traits< PrecTrace >::vertex_descriptor AlgoTraceVertex
boost::graph_traits< PRGraph >::vertex_descriptor PRVertexDesc
const std::chrono::system_clock::time_point m_initTime
std::string m_algoName
The name of the algorithm.
const std::vector< DataNode * > & getInputDataNodes() const
Get all consumer nodes.
bool isOptimist() const
Check if positive control flow decision is enforced.
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
AlgoNodesMap m_algoNameToAlgoNodeMap
Index: map of algorithm&#39;s name to AlgorithmNode.
virtual bool visit(DecisionNode &)
Definition: IGraphVisitor.h:18
bool accept(IGraphVisitor &visitor)
Need to hide the (identical) base method with this one so that visitEnter(ConditionNode&) and visit(C...
void setRank(float &rank)
Set Algorithm rank.
std::vector< ControlFlowNode * > m_children
All direct daughter nodes in the tree.
std::string operator()(const AlgoProps &) const
T to_string(T...args)
std::string operator()(const DecisionHubProps &props) const
DataProps(const DataObjID &id)
void printState(std::stringstream &output, AlgsExecutionStates &states, const std::vector< int > &node_decisions, const unsigned int &recursionLevel) const
Print a string representing the control flow state.
std::map< std::string, precedence::AlgoTraceVertex > m_prec_trace_map
std::vector< DecisionNode * > m_parents
Control flow parents of an AlgorithmNode (DecisionNodes)
bool m_isIOBound
If an algorithm is blocking.
STL namespace.
SmartIF< ITimelineSvc > m_timelineSvc
const std::vector< DataNode * > & getOutputDataNodes() const
Get all supplier nodes.
std::string algorithm
Definition: ITimelineSvc.h:18
std::string operator()(const DataProps &) const
unsigned int m_algoCounter
Total number of algorithm nodes in the graph.
bool m_allPass
Whether always passing regardless of daughter results.
std::string operator()(const AlgoProps &props) const
std::string operator()(const AlgoProps &props) const
bool m_inverted
Whether the selection result is negated or not.
bool m_allPass
Whether always passing regardless of daughter results.
std::string operator()(const DataProps &) const
const std::vector< DecisionNode * > & getParentDecisionHubs() const
Get all parent decision hubs.
std::string operator()(const DecisionHubProps &props) const
bool isIOBound() const
Check if algorithm is I/O-bound.
~PrecedenceRulesGraph() override
Destructor.
SmartIF< ITimelineSvc > m_timelineSvc
virtual bool visitEnter(DecisionNode &) const
Definition: IGraphVisitor.h:17
STL class.
Algorithm * getAlgorithm() const
get Algorithm representatives
std::string operator()(const DecisionHubProps &) const
virtual ~ControlFlowNode()
Destructor.
std::string operator()(const DataProps &) const
bool m_modeOR
Whether acting as "and" (false) or "or" node (true)
std::string operator()(const AlgoProps &props) const
time_point end
Definition: ITimelineSvc.h:21
std::string operator()(const AlgoProps &) const
std::string operator()(const DataProps &) const
std::string operator()(const DataProps &) const
SmartIF< ITimelineSvc > m_timelineSvc
const float & getRank() const
Get Algorithm rank.
boost::variant< AlgoProps, DecisionHubProps, DataProps > VariantVertexProps
The AlgsExecutionStates encodes the state machine for the execution of algorithms within a single eve...
std::string operator()(const DecisionHubProps &) const
precedence::PRGraph m_PRGraph
BGL-based graph of precedence rules.
PrecedenceRulesGraph * m_graph
std::string operator()(const DataProps &) const
const DataObjID & getPath()
DecisionNode * m_headNode
the head node of the control flow graph
std::string operator()(const DecisionHubProps &) const
std::vector< AlgorithmNode * > m_consumers
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:28
const std::vector< ControlFlowNode * > & getDaughters() const
Get children nodes.
bool accept(IGraphVisitor &visitor)
Entry point for a visitor.
std::string operator()(const AlgoProps &props) const
boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, AlgoTraceProps > PrecTrace
const std::vector< AlgorithmNode * > & getConsumers() const
Get all data object consumers.
std::string operator()(const DecisionHubProps &) const
DataNode(PrecedenceRulesGraph &graph, const DataObjID &path)
Constructor.
bool m_modePromptDecision
Whether to evaluate the hub decision ASA its child decisions allow to do that.
std::string operator()(const AlgoProps &props) const
bool m_allPass
Whether the selection result is relevant or always "pass".
FSMState(const EventSlot &slot)
bool m_inverted
Whether the selection result is negated or not.
PrecedenceRulesGraph(const std::string &name, SmartIF< ISvcLocator > svc)
Constructor.
bool m_modePromptDecision
Whether to evaluate the hub decision ASA its child decisions allow to do that.
Algorithm * m_algorithm
Algorithm representative behind the AlgorithmNode.
time_point start
Definition: ITimelineSvc.h:20
StartTime(SmartIF< ITimelineSvc > timelineSvc)
float m_rank
Algorithm rank of any kind.
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:78
std::string operator()(const DecisionHubProps &) const
T find(T...args)
std::vector< InputHandle_t< In > > m_inputs
std::string operator()(const AlgoProps &props) const
std::vector< DataNode * > m_inputs
Algorithm inputs (DataNodes)
bool m_modeConcurrent
Whether all daughters will be evaluated concurrently or sequentially.
Clock::time_point time_point
Definition: ITimelineSvc.h:11
std::vector< AlgorithmNode * > m_producers
std::string operator()(const DataProps &) const
std::string operator()(const AlgoProps &props) const
std::string operator()(const DataProps &) const
unsigned int m_nodeCounter
Total number of nodes in the graph.
Class representing the event slot.
Definition: EventSlot.h:11
DecisionHubProps(const std::string &name, uint nodeIndex, bool modeConcurrent, bool modePromptDecision, bool modeOR, bool allPass)
std::string operator()(const DecisionHubProps &props) const
bool isLiar() const
Check if control flow logic is always inverted.
PrecedenceRulesGraph * m_graph
AlgorithmNode(PrecedenceRulesGraph &graph, Algorithm *algoPtr, unsigned int nodeIndex, unsigned int algoIndex, bool inverted, bool allPass)
Constructor.
bool m_modeOR
Whether acting as "and" (false) or "or" node (true)
const std::string & getNodeName() const
Get node name.
const unsigned int & getNodeIndex() const
Get node index.
bool m_modeConcurrent
Whether all daughters will be evaluated concurrently or sequentially.
std::string operator()(const DecisionHubProps &props) const
EndTime(SmartIF< ITimelineSvc > timelineSvc)
State
Execution states of the algorithms.
std::string fullKey() const
Definition: DataObjID.cpp:54
STL class.
std::string operator()(const DataProps &) const
const std::string & name() const override
Retrieve name of the service.
bool m_isIOBound
If an algorithm is blocking.
std::string operator()(const DecisionHubProps &props) const
Duration(SmartIF< ITimelineSvc > timelineSvc)
std::string operator()(const AlgoProps &) const
std::string operator()(const DataProps &props) const
std::string m_sourceName
bool m_allPass
Whether the selection result is relevant or always "pass".
AlgoInputsMap m_algoNameToAlgoInputsMap
Indexes: maps of algorithm&#39;s name to algorithm&#39;s inputs/outputs.
void addProducerNode(AlgorithmNode *node)
Add relationship to producer AlgorithmNode.
const std::vector< AlgorithmNode * > & getProducers() const
Get all data object producers.
DataNodesMap m_dataPathToDataNodeMap
Index: map of data path to DataNode.
unsigned int getControlFlowNodeCounter() const
Get total number of control flow graph nodes.
std::string operator()(const DataProps &) const
SmartIF< ISvcLocator > m_svcLocator
Service locator (needed to access the MessageSvc)
ConditionNode(PrecedenceRulesGraph &graph, const DataObjID &path, SmartIF< ICondSvc > condSvc)
Constructor.
DecisionNode * getHeadNode() const
Get head node.
std::string operator()(const DataProps &) const
CFDecision(const EventSlot &slot)
void addConsumerNode(AlgorithmNode *node)
Add relationship to consumer AlgorithmNode.
DecisionHubsMap m_decisionNameToDecisionHubMap
Index: map of decision&#39;s name to DecisionHub.