14#include <framework/logging/Logger.h>
43 template<
class ContainerType,
class NodeType,
class NeighbourContainerType,
class NodeCompatibilityCheckerType>
47 using Path = std::vector<NodeType*>;
57 bool findPaths(ContainerType& aNetwork, std::vector<Path>& paths,
unsigned int pathLimit,
bool storeSubsets =
false)
61 std::vector<Path> allNodePaths;
63 if (aNode->getMetaInfo().isSeed() ==
false) {
67 NeighbourContainerType& innerNeighbours = aNode->getInnerNodes();
68 if (innerNeighbours.empty()) {
71 if (aNode->getOuterNodes().empty()) {
81 if (allNodePaths.size() > pathLimit) {
82 B2WARNING(
"Number of collected paths is too large: skipping the event and not processing it."
83 <<
LogVar(
"Number of node paths", allNodePaths.size()) <<
LogVar(
"Current limit of paths", pathLimit));
93 static std::string
printPaths(
const std::vector<Path>& allPaths)
95 std::stringstream out;
96 unsigned int longestPath = 0, longesPathIndex = 0, index = 0;
97 out <<
"Print " << allPaths.size() <<
" paths:";
98 for (
Path const& aPath : allPaths) {
99 if (longestPath < aPath.size()) {
100 longestPath = aPath.size();
101 longesPathIndex = index;
103 out <<
"\n" <<
"path " << index <<
": length " << aPath.size() <<
", entries:\n";
104 for (
auto* entry : aPath) {
105 out << entry->getEntry() <<
"| ";
109 out <<
"\n" <<
"longest path was " << longesPathIndex <<
" with length of " << longestPath <<
"\n";
120 for (
auto* entry : aPath) {
121 newPath.push_back(entry);
131 allNodePaths.push_back(newPath);
141 if (currentPath.size() > 30) {
142 B2WARNING(
"findPathsRecursive reached a path length of over 30. Stopping Path here!");
147 NeighbourContainerType viableNeighbours;
148 for (
size_t iNeighbour = 0; iNeighbour < innerNeighbours.size(); ++iNeighbour) {
150 viableNeighbours.push_back(innerNeighbours[iNeighbour]);
160 for (
size_t iNeighbour = 0; iNeighbour < viableNeighbours.size(); ++iNeighbour) {
162 if (iNeighbour == viableNeighbours.size() - 1) {
163 currentPath.push_back(viableNeighbours[iNeighbour]);
164 NeighbourContainerType& newNeighbours = viableNeighbours[iNeighbour]->getInnerNodes();
170 newPath.push_back(viableNeighbours[iNeighbour]);
171 NeighbourContainerType& newNeighbours = viableNeighbours[iNeighbour]->getInnerNodes();
Path finder for generic ContainerType.
unsigned int nRecursiveCalls
Counter for number of recursive calls.
void storeAcceptedPath(Path newPath, std::vector< Path > &allNodePaths) const
Tests length requirement on a path before adding it to path vector.
NodeCompatibilityCheckerType m_compatibilityChecker
protected Data members:
std::vector< NodeType * > Path
Using Path for vector of pointers to NodeTypes.
Path clone(const Path &aPath) const
Copies path to create an identical one.
unsigned int nTrees
Counter for number of trees found.
unsigned int minPathLength
public Data members:
static std::string printPaths(const std::vector< Path > &allPaths)
Prints information about all paths provided in a vector of paths.
void findPathsRecursive(std::vector< Path > &allNodePaths, Path ¤tPath, NeighbourContainerType &innerNeighbours)
Recursive pathFinder: Collects all possible segment combinations to build paths.
bool m_storeSubsets
flag if subsets should be stored or not
bool findPaths(ContainerType &aNetwork, std::vector< Path > &paths, unsigned int pathLimit, bool storeSubsets=false)
Main functionality of this class Evaluates provided network and creates all allowed paths.
Class to store variables with their name which were sent to the logging service.
NodeType
Enum of possible Nodes in parsing tree.
Abstract base class for different kinds of events.