Loading [MathJax]/jax/output/HTML-CSS/config.js
The Gaudi Framework  master (d98a2936)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Validators.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 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 #pragma once
12 
13 #include "../../EventSlot.h"
14 #include "../PrecedenceRulesGraph.h"
15 #include "IGraphVisitor.h"
16 
17 #include <algorithm>
18 #include <map>
19 #include <set>
20 #include <sstream>
21 #include <unordered_map>
22 #include <vector>
23 
24 namespace concurrency {
25 
26  //--------------------------------------------------------------------------
28  public:
31 
32  bool visitEnter( AlgorithmNode& ) const override { return false; }
33  bool visitEnter( DataNode& ) const override { return false; }
34  bool visitEnter( ConditionNode& ) const override { return false; }
35 
36  bool visit( DecisionNode& ) override;
37 
38  std::string reply() const { return m_status.str(); }
39  bool passed() const { return !m_foundViolations; }
40  void reset() override {
41  m_foundViolations = false;
42  m_status.clear();
43  }
44 
45  private:
46  std::ostringstream m_status{ " No 'Concurrent'/'Prompt' contradictions found" };
47  bool m_foundViolations{ false };
48  };
49 
50  //--------------------------------------------------------------------------
52  public:
54  ActiveLineageScout( const EventSlot* slot, const ControlFlowNode& node )
55  : m_slot( slot ), m_startNode( node ), m_previousNodeName( node.name() ) {}
56 
59 
60  bool visitEnter( AlgorithmNode& ) const override { return false; }
61  bool visitEnter( DataNode& ) const override { return false; }
62  bool visitEnter( ConditionNode& ) const override { return false; }
63 
64  bool visit( DecisionNode& ) override;
65 
66  void reset() override {
67  m_active = true;
69  }
70 
71  virtual bool reply() const { return m_active; }
72 
73  virtual void visitParents( DecisionNode& );
74 
75  protected:
76  const EventSlot* m_slot;
78  bool m_active{ true };
79  std::string m_previousNodeName;
80  };
81 
82  //--------------------------------------------------------------------------
83  class SubSlotScout final : public ActiveLineageScout {
84  public:
86  SubSlotScout( const EventSlot* slot, const ControlFlowNode& node )
87  : ActiveLineageScout( slot, node ), m_foundEntryPoint( slot->parentSlot == nullptr ) {}
88 
89  void reset() override {
90  m_active = true;
91 
92  // Only look for an entry point if we're in a sub-slot
95  }
96 
97  bool reply() const override { return m_active && m_foundEntryPoint; }
98 
99  void visitParents( DecisionNode& ) override;
100 
101  private:
102  bool m_foundEntryPoint{ true };
103  };
104 
105  //--------------------------------------------------------------------------
107  public:
108  using IGraphVisitor::visit;
110 
111  bool visitEnter( DataNode& ) const override { return false; }
112  bool visitEnter( ConditionNode& ) const override { return false; }
113 
114  bool visit( DecisionNode& ) override;
115  bool visit( AlgorithmNode& ) override;
116 
117  bool positive() const { return m_positive; }
118  bool negative() const { return m_negative; }
119 
120  void reset() override {
121  m_positive = false;
122  m_negative = false;
123  }
124 
125  private:
126  bool m_positive{ false };
127  bool m_negative{ false };
128  };
129 
130  //--------------------------------------------------------------------------
132  public:
133  using IGraphVisitor::visit;
135 
136  bool visitEnter( AlgorithmNode& ) const override { return false; }
137  bool visitEnter( DecisionNode& ) const override { return false; }
138 
139  bool visit( DataNode& ) override;
140  bool visit( ConditionNode& ) override;
141 
142  std::string reply() const;
143  bool passed() const {
144  return std::all_of( m_unconditionalProducers.begin(), m_unconditionalProducers.end(),
145  []( const auto& pr ) { return pr.second.size() == 1; } );
146  }
147  void reset() override {
148  m_foundViolations = false;
149  m_conditionalProducers.clear();
150  m_unconditionalProducers.clear();
151  }
152 
153  private:
154  bool m_foundViolations{ false };
155 
156  using visitor_book =
157  std::map<DataNode*, std::set<AlgorithmNode*, CompareNodes<AlgorithmNode*>>, CompareNodes<DataNode*>>;
160  };
161 
169  public:
170  using IGraphVisitor::visit;
172 
173  bool visitEnter( ConditionNode& ) const override { return false; }
174  bool visitEnter( DecisionNode& ) const override { return false; }
175  bool visitEnter( AlgorithmNode& node ) const override {
176  // check if the node was already visited
177  return m_lowlinks.find( &node ) != m_lowlinks.end() ? false : true;
178  }
179 
180  bool visit( AlgorithmNode& nodeAt ) override;
181 
182  bool passed() const {
183  return m_scc.empty() ||
184  !std::any_of( m_scc.begin(), m_scc.end(), []( const auto& pr ) { return pr.second.size() > 1; } );
185  }
186 
187  std::string reply();
188 
189  void reset() override {
190  m_nodes_count = 0;
191  m_stack.clear();
192  m_lowlinks.clear();
193  m_scc.clear();
194  m_status = std::ostringstream{ " No strongly connected components found in DF realm" };
195  }
196 
197  private:
198  bool on_stack( const AlgorithmNode& node ) const {
199  return std::find( m_stack.begin(), m_stack.end(), &node ) != m_stack.end() ? true : false;
200  }
201 
202  unsigned int m_nodes_count{ 0 };
203 
204  std::unordered_map<AlgorithmNode*, std::pair<unsigned int, unsigned int>> m_lowlinks;
205  std::map<unsigned int, std::vector<AlgorithmNode*>> m_scc;
206  std::vector<AlgorithmNode*> m_stack;
207 
208  std::ostringstream m_status{ " No strongly connected components found in DF realm" };
209  };
210 
211 } // namespace concurrency
concurrency::ProductionAmbiguityFinder::reset
void reset() override
Definition: Validators.h:147
concurrency::SubSlotScout::m_foundEntryPoint
bool m_foundEntryPoint
Definition: Validators.h:102
concurrency::ProductionAmbiguityFinder::m_conditionalProducers
visitor_book m_conditionalProducers
Definition: Validators.h:158
concurrency::TarjanSCCFinder::visitEnter
bool visitEnter(ConditionNode &) const override
Definition: Validators.h:173
concurrency::ActiveLineageScout::visitEnter
bool visitEnter(AlgorithmNode &) const override
Definition: Validators.h:60
concurrency::NodePropertiesValidator::visitEnter
bool visitEnter(AlgorithmNode &) const override
Definition: Validators.h:32
concurrency::ProductionAmbiguityFinder::visitor_book
std::map< DataNode *, std::set< AlgorithmNode *, CompareNodes< AlgorithmNode * > >, CompareNodes< DataNode * > > visitor_book
Definition: Validators.h:157
concurrency::ProductionAmbiguityFinder::m_foundViolations
bool m_foundViolations
Definition: Validators.h:154
concurrency::ConditionalLineageFinder::visitEnter
bool visitEnter(DataNode &) const override
Definition: Validators.h:111
concurrency::NodePropertiesValidator::passed
bool passed() const
Definition: Validators.h:39
concurrency::ConditionalLineageFinder::positive
bool positive() const
Definition: Validators.h:117
concurrency::NodePropertiesValidator::reply
std::string reply() const
Definition: Validators.h:38
concurrency::TarjanSCCFinder::visitEnter
bool visitEnter(DecisionNode &) const override
Definition: Validators.h:174
concurrency::ProductionAmbiguityFinder::visitEnter
bool visitEnter(DecisionNode &) const override
Definition: Validators.h:137
concurrency::NodePropertiesValidator::m_status
std::ostringstream m_status
Definition: Validators.h:46
EventSlot
Class representing an event slot.
Definition: EventSlot.h:23
concurrency::ActiveLineageScout::m_previousNodeName
std::string m_previousNodeName
Definition: Validators.h:79
concurrency::ControlFlowNode::name
const std::string & name() const
Get node name.
Definition: PrecedenceRulesGraph.h:430
concurrency::ActiveLineageScout::visitEnter
bool visitEnter(ConditionNode &) const override
Definition: Validators.h:62
concurrency::ActiveLineageScout::m_slot
const EventSlot * m_slot
Definition: Validators.h:76
concurrency::ActiveLineageScout::visit
bool visit(DecisionNode &) override
Definition: Validators.cpp:38
concurrency::ConditionalLineageFinder::reset
void reset() override
Definition: Validators.h:120
concurrency::SubSlotScout
Definition: Validators.h:83
concurrency::ProductionAmbiguityFinder
Definition: Validators.h:131
concurrency::ActiveLineageScout::reply
virtual bool reply() const
Definition: Validators.h:71
concurrency::TarjanSCCFinder::visit
bool visit(AlgorithmNode &nodeAt) override
Definition: Validators.cpp:235
concurrency::ActiveLineageScout::reset
void reset() override
Definition: Validators.h:66
concurrency::IGraphVisitor
Definition: IGraphVisitor.h:20
concurrency::AlgorithmNode
Definition: PrecedenceRulesGraph.h:485
concurrency::TarjanSCCFinder::reply
std::string reply()
Definition: Validators.cpp:281
concurrency::TarjanSCCFinder::m_stack
std::vector< AlgorithmNode * > m_stack
Definition: Validators.h:206
concurrency::ConditionNode
Definition: PrecedenceRulesGraph.h:592
concurrency::ProductionAmbiguityFinder::visit
bool visit(DataNode &) override
Definition: Validators.cpp:143
concurrency::SubSlotScout::reset
void reset() override
Definition: Validators.h:89
concurrency::TarjanSCCFinder::m_lowlinks
std::unordered_map< AlgorithmNode *, std::pair< unsigned int, unsigned int > > m_lowlinks
Definition: Validators.h:204
IGraphVisitor.h
concurrency::NodePropertiesValidator::m_foundViolations
bool m_foundViolations
Definition: Validators.h:47
EventSlot::parentSlot
EventSlot * parentSlot
Pointer to parent slot (null for top level)
Definition: EventSlot.h:95
concurrency::ProductionAmbiguityFinder::m_unconditionalProducers
visitor_book m_unconditionalProducers
Definition: Validators.h:159
concurrency::NodePropertiesValidator::reset
void reset() override
Definition: Validators.h:40
concurrency::ConditionalLineageFinder::visit
bool visit(DecisionNode &) override
Definition: Validators.cpp:104
concurrency::IGraphVisitor::visit
virtual bool visit(DecisionNode &)
Definition: IGraphVisitor.h:25
concurrency::ConditionalLineageFinder::negative
bool negative() const
Definition: Validators.h:118
concurrency::ConditionalLineageFinder
Definition: Validators.h:106
GaudiPython.Bindings.nullptr
nullptr
Definition: Bindings.py:87
concurrency::ActiveLineageScout::visitEnter
bool visitEnter(DataNode &) const override
Definition: Validators.h:61
concurrency::ActiveLineageScout
Definition: Validators.h:51
concurrency::ConditionalLineageFinder::m_positive
bool m_positive
Definition: Validators.h:126
concurrency::ActiveLineageScout::ActiveLineageScout
ActiveLineageScout(const EventSlot *slot, const ControlFlowNode &node)
Constructor.
Definition: Validators.h:54
concurrency::TarjanSCCFinder::on_stack
bool on_stack(const AlgorithmNode &node) const
Definition: Validators.h:198
concurrency
Definition: PrecedenceRulesGraph.cpp:38
concurrency::NodePropertiesValidator::visitEnter
bool visitEnter(ConditionNode &) const override
Definition: Validators.h:34
concurrency::ProductionAmbiguityFinder::visitEnter
bool visitEnter(AlgorithmNode &) const override
Definition: Validators.h:136
concurrency::IGraphVisitor::visitEnter
virtual bool visitEnter(DecisionNode &) const
Definition: IGraphVisitor.h:24
concurrency::SubSlotScout::SubSlotScout
SubSlotScout(const EventSlot *slot, const ControlFlowNode &node)
Constructor.
Definition: Validators.h:86
concurrency::ActiveLineageScout::m_active
bool m_active
Definition: Validators.h:78
concurrency::DecisionNode
Definition: PrecedenceRulesGraph.h:440
concurrency::ActiveLineageScout::visitParents
virtual void visitParents(DecisionNode &)
Definition: Validators.cpp:66
concurrency::TarjanSCCFinder::m_scc
std::map< unsigned int, std::vector< AlgorithmNode * > > m_scc
Definition: Validators.h:205
concurrency::ConditionalLineageFinder::visitEnter
bool visitEnter(ConditionNode &) const override
Definition: Validators.h:112
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
concurrency::NodePropertiesValidator
Definition: Validators.h:27
concurrency::TarjanSCCFinder::visitEnter
bool visitEnter(AlgorithmNode &node) const override
Definition: Validators.h:175
concurrency::ControlFlowNode
Definition: PrecedenceRulesGraph.h:415
concurrency::ConditionalLineageFinder::m_negative
bool m_negative
Definition: Validators.h:127
concurrency::TarjanSCCFinder::passed
bool passed() const
Definition: Validators.h:182
concurrency::ActiveLineageScout::m_startNode
const ControlFlowNode & m_startNode
Definition: Validators.h:77
concurrency::DataNode
Definition: PrecedenceRulesGraph.h:554
concurrency::NodePropertiesValidator::visitEnter
bool visitEnter(DataNode &) const override
Definition: Validators.h:33
concurrency::CompareNodes
Definition: PrecedenceRulesGraph.h:617
concurrency::SubSlotScout::reply
bool reply() const override
Definition: Validators.h:97
concurrency::SubSlotScout::visitParents
void visitParents(DecisionNode &) override
Definition: Validators.cpp:79
concurrency::ProductionAmbiguityFinder::passed
bool passed() const
Definition: Validators.h:143
concurrency::TarjanSCCFinder::reset
void reset() override
Definition: Validators.h:189
concurrency::NodePropertiesValidator::visit
bool visit(DecisionNode &) override
Definition: Validators.cpp:18
concurrency::TarjanSCCFinder
Definition: Validators.h:168
concurrency::ProductionAmbiguityFinder::reply
std::string reply() const
Definition: Validators.cpp:192
concurrency::TarjanSCCFinder::m_status
std::ostringstream m_status
Definition: Validators.h:208
concurrency::TarjanSCCFinder::m_nodes_count
unsigned int m_nodes_count
Definition: Validators.h:202