The Gaudi Framework  master (da3d77e1)
Validators.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #ifndef VALIDATORS_H_
12 #define VALIDATORS_H_
13 
14 #include "../../EventSlot.h"
15 #include "../PrecedenceRulesGraph.h"
16 #include "IGraphVisitor.h"
17 
18 #include <algorithm>
19 #include <map>
20 #include <set>
21 #include <sstream>
22 #include <unordered_map>
23 #include <vector>
24 
25 namespace concurrency {
26 
27  //--------------------------------------------------------------------------
29  public:
32 
33  bool visitEnter( AlgorithmNode& ) const override { return false; }
34  bool visitEnter( DataNode& ) const override { return false; }
35  bool visitEnter( ConditionNode& ) const override { return false; }
36 
37  bool visit( DecisionNode& ) override;
38 
39  std::string reply() const { return m_status.str(); }
40  bool passed() const { return !m_foundViolations; }
41  void reset() override {
42  m_foundViolations = false;
43  m_status.clear();
44  }
45 
46  private:
47  std::ostringstream m_status{ " No 'Concurrent'/'Prompt' contradictions found" };
48  bool m_foundViolations{ false };
49  };
50 
51  //--------------------------------------------------------------------------
53  public:
55  ActiveLineageScout( const EventSlot* slot, const ControlFlowNode& node )
56  : m_slot( slot ), m_startNode( node ), m_previousNodeName( node.name() ) {}
57 
60 
61  bool visitEnter( AlgorithmNode& ) const override { return false; }
62  bool visitEnter( DataNode& ) const override { return false; }
63  bool visitEnter( ConditionNode& ) const override { return false; }
64 
65  bool visit( DecisionNode& ) override;
66 
67  void reset() override {
68  m_active = true;
70  }
71 
72  virtual bool reply() const { return m_active; }
73 
74  virtual void visitParents( DecisionNode& );
75 
76  protected:
77  const EventSlot* m_slot;
79  bool m_active{ true };
81  };
82 
83  //--------------------------------------------------------------------------
84  class SubSlotScout final : public ActiveLineageScout {
85  public:
87  SubSlotScout( const EventSlot* slot, const ControlFlowNode& node )
88  : ActiveLineageScout( slot, node ), m_foundEntryPoint( slot->parentSlot == nullptr ) {}
89 
90  void reset() override {
91  m_active = true;
92 
93  // Only look for an entry point if we're in a sub-slot
96  }
97 
98  bool reply() const override { return m_active && m_foundEntryPoint; }
99 
100  void visitParents( DecisionNode& ) override;
101 
102  private:
103  bool m_foundEntryPoint{ true };
104  };
105 
106  //--------------------------------------------------------------------------
108  public:
109  using IGraphVisitor::visit;
111 
112  bool visitEnter( DataNode& ) const override { return false; }
113  bool visitEnter( ConditionNode& ) const override { return false; }
114 
115  bool visit( DecisionNode& ) override;
116  bool visit( AlgorithmNode& ) override;
117 
118  bool positive() const { return m_positive; }
119  bool negative() const { return m_negative; }
120 
121  void reset() override {
122  m_positive = false;
123  m_negative = false;
124  }
125 
126  private:
127  bool m_positive{ false };
128  bool m_negative{ false };
129  };
130 
131  //--------------------------------------------------------------------------
133  public:
134  using IGraphVisitor::visit;
136 
137  bool visitEnter( AlgorithmNode& ) const override { return false; }
138  bool visitEnter( DecisionNode& ) const override { return false; }
139 
140  bool visit( DataNode& ) override;
141  bool visit( ConditionNode& ) override;
142 
143  std::string reply() const;
144  bool passed() const {
146  []( const auto& pr ) { return pr.second.size() == 1; } );
147  }
148  void reset() override {
149  m_foundViolations = false;
152  }
153 
154  private:
155  bool m_foundViolations{ false };
156 
157  using visitor_book =
161  };
162 
170  public:
171  using IGraphVisitor::visit;
173 
174  bool visitEnter( ConditionNode& ) const override { return false; }
175  bool visitEnter( DecisionNode& ) const override { return false; }
176  bool visitEnter( AlgorithmNode& node ) const override {
177  // check if the node was already visited
178  return m_lowlinks.find( &node ) != m_lowlinks.end() ? false : true;
179  }
180 
181  bool visit( AlgorithmNode& nodeAt ) override;
182 
183  bool passed() const {
184  return m_scc.empty() ||
185  !std::any_of( m_scc.begin(), m_scc.end(), []( const auto& pr ) { return pr.second.size() > 1; } );
186  }
187 
188  std::string reply();
189 
190  void reset() override {
191  m_nodes_count = 0;
192  m_stack.clear();
193  m_lowlinks.clear();
194  m_scc.clear();
195  m_status = std::ostringstream{ " No strongly connected components found in DF realm" };
196  }
197 
198  private:
199  bool on_stack( const AlgorithmNode& node ) const {
200  return std::find( m_stack.begin(), m_stack.end(), &node ) != m_stack.end() ? true : false;
201  }
202 
203  unsigned int m_nodes_count{ 0 };
204 
208 
209  std::ostringstream m_status{ " No strongly connected components found in DF realm" };
210  };
211 
212 } // namespace concurrency
213 
214 #endif /* VALIDATORS_H_ */
concurrency::ProductionAmbiguityFinder::reset
void reset() override
Definition: Validators.h:148
concurrency::SubSlotScout::m_foundEntryPoint
bool m_foundEntryPoint
Definition: Validators.h:103
concurrency::ProductionAmbiguityFinder::m_conditionalProducers
visitor_book m_conditionalProducers
Definition: Validators.h:159
std::string
STL class.
concurrency::TarjanSCCFinder::visitEnter
bool visitEnter(ConditionNode &) const override
Definition: Validators.h:174
concurrency::ActiveLineageScout::visitEnter
bool visitEnter(AlgorithmNode &) const override
Definition: Validators.h:61
concurrency::NodePropertiesValidator::visitEnter
bool visitEnter(AlgorithmNode &) const override
Definition: Validators.h:33
concurrency::ProductionAmbiguityFinder::m_foundViolations
bool m_foundViolations
Definition: Validators.h:155
concurrency::ConditionalLineageFinder::visitEnter
bool visitEnter(DataNode &) const override
Definition: Validators.h:112
concurrency::NodePropertiesValidator::passed
bool passed() const
Definition: Validators.h:40
concurrency::ConditionalLineageFinder::positive
bool positive() const
Definition: Validators.h:118
concurrency::NodePropertiesValidator::reply
std::string reply() const
Definition: Validators.h:39
concurrency::TarjanSCCFinder::visitEnter
bool visitEnter(DecisionNode &) const override
Definition: Validators.h:175
concurrency::ProductionAmbiguityFinder::visitEnter
bool visitEnter(DecisionNode &) const override
Definition: Validators.h:138
std::vector
STL class.
std::find
T find(T... args)
concurrency::NodePropertiesValidator::m_status
std::ostringstream m_status
Definition: Validators.h:47
EventSlot
Class representing an event slot.
Definition: EventSlot.h:24
concurrency::ActiveLineageScout::m_previousNodeName
std::string m_previousNodeName
Definition: Validators.h:80
concurrency::ControlFlowNode::name
const std::string & name() const
Get node name.
Definition: PrecedenceRulesGraph.h:429
concurrency::ActiveLineageScout::visitEnter
bool visitEnter(ConditionNode &) const override
Definition: Validators.h:63
concurrency::ActiveLineageScout::m_slot
const EventSlot * m_slot
Definition: Validators.h:77
concurrency::ActiveLineageScout::visit
bool visit(DecisionNode &) override
Definition: Validators.cpp:38
concurrency::ConditionalLineageFinder::reset
void reset() override
Definition: Validators.h:121
concurrency::SubSlotScout
Definition: Validators.h:84
concurrency::ProductionAmbiguityFinder
Definition: Validators.h:132
std::all_of
T all_of(T... args)
concurrency::ActiveLineageScout::reply
virtual bool reply() const
Definition: Validators.h:72
concurrency::TarjanSCCFinder::visit
bool visit(AlgorithmNode &nodeAt) override
Definition: Validators.cpp:235
concurrency::ActiveLineageScout::reset
void reset() override
Definition: Validators.h:67
concurrency::IGraphVisitor
Definition: IGraphVisitor.h:21
std::ostringstream::clear
T clear(T... args)
concurrency::AlgorithmNode
Definition: PrecedenceRulesGraph.h:484
concurrency::TarjanSCCFinder::reply
std::string reply()
Definition: Validators.cpp:281
concurrency::TarjanSCCFinder::m_stack
std::vector< AlgorithmNode * > m_stack
Definition: Validators.h:207
concurrency::ConditionNode
Definition: PrecedenceRulesGraph.h:591
concurrency::ProductionAmbiguityFinder::visit
bool visit(DataNode &) override
Definition: Validators.cpp:143
concurrency::SubSlotScout::reset
void reset() override
Definition: Validators.h:90
concurrency::TarjanSCCFinder::m_lowlinks
std::unordered_map< AlgorithmNode *, std::pair< unsigned int, unsigned int > > m_lowlinks
Definition: Validators.h:205
IGraphVisitor.h
concurrency::NodePropertiesValidator::m_foundViolations
bool m_foundViolations
Definition: Validators.h:48
EventSlot::parentSlot
EventSlot * parentSlot
Pointer to parent slot (null for top level)
Definition: EventSlot.h:96
concurrency::ProductionAmbiguityFinder::m_unconditionalProducers
visitor_book m_unconditionalProducers
Definition: Validators.h:160
concurrency::NodePropertiesValidator::reset
void reset() override
Definition: Validators.h:41
concurrency::ConditionalLineageFinder::visit
bool visit(DecisionNode &) override
Definition: Validators.cpp:104
concurrency::IGraphVisitor::visit
virtual bool visit(DecisionNode &)
Definition: IGraphVisitor.h:26
concurrency::ConditionalLineageFinder::negative
bool negative() const
Definition: Validators.h:119
concurrency::ConditionalLineageFinder
Definition: Validators.h:107
GaudiPython.Bindings.nullptr
nullptr
Definition: Bindings.py:87
concurrency::ActiveLineageScout::visitEnter
bool visitEnter(DataNode &) const override
Definition: Validators.h:62
concurrency::ActiveLineageScout
Definition: Validators.h:52
concurrency::ConditionalLineageFinder::m_positive
bool m_positive
Definition: Validators.h:127
concurrency::ActiveLineageScout::ActiveLineageScout
ActiveLineageScout(const EventSlot *slot, const ControlFlowNode &node)
Constructor.
Definition: Validators.h:55
std::map< DataNode *, std::set< AlgorithmNode *, CompareNodes< AlgorithmNode * > >, CompareNodes< DataNode * > >
concurrency::TarjanSCCFinder::on_stack
bool on_stack(const AlgorithmNode &node) const
Definition: Validators.h:199
concurrency
Definition: PrecedenceRulesGraph.cpp:38
concurrency::NodePropertiesValidator::visitEnter
bool visitEnter(ConditionNode &) const override
Definition: Validators.h:35
concurrency::ProductionAmbiguityFinder::visitEnter
bool visitEnter(AlgorithmNode &) const override
Definition: Validators.h:137
concurrency::IGraphVisitor::visitEnter
virtual bool visitEnter(DecisionNode &) const
Definition: IGraphVisitor.h:25
concurrency::SubSlotScout::SubSlotScout
SubSlotScout(const EventSlot *slot, const ControlFlowNode &node)
Constructor.
Definition: Validators.h:87
concurrency::ActiveLineageScout::m_active
bool m_active
Definition: Validators.h:79
concurrency::DecisionNode
Definition: PrecedenceRulesGraph.h:439
concurrency::ActiveLineageScout::visitParents
virtual void visitParents(DecisionNode &)
Definition: Validators.cpp:66
std::ostringstream
STL class.
concurrency::TarjanSCCFinder::m_scc
std::map< unsigned int, std::vector< AlgorithmNode * > > m_scc
Definition: Validators.h:206
concurrency::ConditionalLineageFinder::visitEnter
bool visitEnter(ConditionNode &) const override
Definition: Validators.h:113
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
std::map::begin
T begin(T... args)
concurrency::NodePropertiesValidator
Definition: Validators.h:28
concurrency::TarjanSCCFinder::visitEnter
bool visitEnter(AlgorithmNode &node) const override
Definition: Validators.h:176
concurrency::ControlFlowNode
Definition: PrecedenceRulesGraph.h:414
concurrency::ConditionalLineageFinder::m_negative
bool m_negative
Definition: Validators.h:128
concurrency::TarjanSCCFinder::passed
bool passed() const
Definition: Validators.h:183
std::ostringstream::str
T str(T... args)
concurrency::ActiveLineageScout::m_startNode
const ControlFlowNode & m_startNode
Definition: Validators.h:78
concurrency::DataNode
Definition: PrecedenceRulesGraph.h:553
concurrency::NodePropertiesValidator::visitEnter
bool visitEnter(DataNode &) const override
Definition: Validators.h:34
concurrency::CompareNodes
Definition: PrecedenceRulesGraph.h:616
std::map::end
T end(T... args)
concurrency::SubSlotScout::reply
bool reply() const override
Definition: Validators.h:98
concurrency::SubSlotScout::visitParents
void visitParents(DecisionNode &) override
Definition: Validators.cpp:79
concurrency::ProductionAmbiguityFinder::passed
bool passed() const
Definition: Validators.h:144
concurrency::TarjanSCCFinder::reset
void reset() override
Definition: Validators.h:190
concurrency::NodePropertiesValidator::visit
bool visit(DecisionNode &) override
Definition: Validators.cpp:18
concurrency::TarjanSCCFinder
Definition: Validators.h:169
concurrency::ProductionAmbiguityFinder::reply
std::string reply() const
Definition: Validators.cpp:192
concurrency::TarjanSCCFinder::m_status
std::ostringstream m_status
Definition: Validators.h:209
std::unordered_map
STL class.
concurrency::TarjanSCCFinder::m_nodes_count
unsigned int m_nodes_count
Definition: Validators.h:203