Belle II Software development
TreeTraversal.h
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8#pragma once
9
10#include <tracking/trackFindingCDC/findlets/base/Findlet.h>
11
12#include <tracking/trackFindingCDC/utilities/Relation.h>
13#include <tracking/trackFindingCDC/utilities/Range.h>
14
15#include <framework/logging/Logger.h>
16
17#include <vector>
18#include <string>
19
20namespace Belle2 {
25 class ModuleParamList;
26 namespace TrackFindingCDC {
50 template <class AStateRejecter, class AState, class AResult = std::vector<const AState*> >
51 class TreeTraversal : public Findlet<const AState* const, const Relation<AState>, AResult> {
52 private:
55
56 public:
59 : Super()
60 {
62 }
63
65 void exposeParameters(ModuleParamList* moduleParamList, const std::string& prefix) final
66 {
67 m_stateRejecter.exposeParameters(moduleParamList, prefix);
68 }
69
76 void apply(const std::vector<const AState*>& seededStates,
77 const std::vector<Relation<AState>>& stateRelations,
78 std::vector<AResult>& results) override;
79
80 private:
82 void traverseTree(std::vector<const AState*>& path,
83 const std::vector<Relation<AState>>& stateRelations,
84 std::vector<AResult>& results);
85
86 private:
88 AStateRejecter m_stateRejecter;
89 };
90
91 template <class AStateRejecter, class AState, class AResult>
93 const std::vector<const AState*>& seededStates,
94 const std::vector<Relation<AState>>& stateRelations,
95 std::vector<AResult>& results)
96 {
97 B2ASSERT("Expected relation to be sorted",
98 std::is_sorted(stateRelations.begin(), stateRelations.end()));
99
100 std::vector<const AState*> path;
101 for (const AState* state : seededStates) {
102 B2DEBUG(25, "Starting with new seed...");
103 path.push_back(state);
104 traverseTree(path, stateRelations, results);
105 path.pop_back();
106 B2DEBUG(25, "... finished with seed");
107 }
108 assert(path.empty());
109 }
110
111 template <class AStateRejecter, class AState, class AResult>
113 std::vector<const AState*>& path,
114 const std::vector<Relation<AState>>& stateRelations,
115 std::vector<AResult>& results)
116 {
117 // Implement only graph traversal logic and leave the extrapolation and selection to the
118 // rejecter.
119 const AState* currentState = path.back();
120 auto continuations =
121 std::equal_range(stateRelations.begin(), stateRelations.end(), currentState);
122
123 std::vector<AState*> childStates;
124 for (const Relation<AState>& continuation : asRange(continuations)) {
125 AState* childState = continuation.getTo();
126 childStates.push_back(childState);
127 }
128
129 // Do everything with child states, linking, extrapolation, teaching, discarding, what have
130 // you.
131 const std::vector<const AState*>& constPath = path;
132 m_stateRejecter.apply(constPath, childStates);
133
134 if (childStates.empty()) {
135 B2DEBUG(25, "Terminating this route, as there are no possible child states.");
136 results.emplace_back(path);
137 return;
138 }
139
140 // Traverse the tree from each new state on
141 B2DEBUG(25, "Having found " << childStates.size() << " child states.");
142 for (const AState* childState : childStates) {
143 if (std::count(path.begin(), path.end(), childState)) {
144 // Cycle detected -- is this the best handling?
145 // Other options: Raise and exception and bail out of this seed
146 continue;
147 }
148 path.push_back(childState);
149 traverseTree(path, stateRelations, results);
150 path.pop_back();
151 }
152 }
153 }
155}
The Module parameter list class.
void addProcessingSignalListener(ProcessingSignalListener *psl)
Register a processing signal listener to be notified.
Interface for a minimal algorithm part that wants to expose some parameters to a module.
Definition: Findlet.h:26
Type for two related objects.
Definition: Relation.h:21
General implementation of a tree search algorithm using a given classes as state and results and one ...
Definition: TreeTraversal.h:51
void traverseTree(std::vector< const AState * > &path, const std::vector< Relation< AState > > &stateRelations, std::vector< AResult > &results)
Implementation of the traverseTree function.
void apply(const std::vector< const AState * > &seededStates, const std::vector< Relation< AState > > &stateRelations, std::vector< AResult > &results) override
Main function of this findlet: traverse a tree starting from a given seed states.
Definition: TreeTraversal.h:92
void exposeParameters(ModuleParamList *moduleParamList, const std::string &prefix) final
Expose the parameters of the subfindlet.
Definition: TreeTraversal.h:65
AStateRejecter m_stateRejecter
State rejecter to decide which available continuations should be traversed next.
Definition: TreeTraversal.h:88
TreeTraversal()
Construct this findlet and add the subfindlet as listener.
Definition: TreeTraversal.h:58
Abstract base class for different kinds of events.