12 #include <tracking/trackFindingCDC/ca/Path.h>
13 #include <tracking/trackFindingCDC/ca/AutomatonCell.h>
15 #include <tracking/trackFindingCDC/utilities/WeightedRelation.h>
27 namespace TrackFindingCDC {
39 template<
class ACellHolder>
40 class CellularPathFollower {
45 const std::vector<ACellHolder*>& cellHolders,
46 const std::vector<WeightedRelation<ACellHolder>>& cellHolderRelations,
47 Weight minStateToFollow = -INFINITY)
const
49 B2ASSERT(
"Expected the relations to be sorted",
50 std::is_sorted(cellHolderRelations.begin(), cellHolderRelations.end()));
53 std::vector<Path<ACellHolder> > paths;
56 Path<ACellHolder> path;
58 for (ACellHolder* cellHolder : cellHolders) {
59 const AutomatonCell& automatonCell = cellHolder->getAutomatonCell();
68 path.push_back(cellHolder);
84 const std::vector<WeightedRelation<ACellHolder>>& cellHolderRelations,
85 Weight minStateToFollow = -INFINITY)
const
87 assert(std::is_sorted(cellHolderRelations.begin(), cellHolderRelations.end()));
90 if (not startCellHolder)
return path;
98 path.push_back(startCellHolder);
102 ACellHolder* cellHolder = path.back();
104 auto continuations = asRange(std::equal_range(cellHolderRelations.begin(),
105 cellHolderRelations.end(),
111 ACellHolder* neighbor = relation.getTo();
112 path.push_back(neighbor);
129 const std::vector<WeightedRelation<ACellHolder>>& cellHolderRelations,
132 auto growPathByRelation = [&](
const WeightedRelation<ACellHolder>& neighborRelation) {
134 ACellHolder* neighbor(neighborRelation.getTo());
135 path.push_back(neighbor);
141 ACellHolder* lastCellHolder = path.back();
143 auto continuations = asRange(std::equal_range(cellHolderRelations.begin(),
144 cellHolderRelations.end(),
146 int nRelationsUsed = std::count_if(continuations.begin(),
150 if (nRelationsUsed == 0) {
152 paths.push_back(path);
161 Weight minStateToFollow)
164 automatonCell.hasStartFlag() and
165 not automatonCell.hasMaskedFlag() and
166 not automatonCell.hasCycleFlag() and
167 minStateToFollow <= automatonCell.getCellState();
176 ACellHolder* cellHolderPtr(relation.
getFrom());
177 ACellHolder* neighborCellHolderPtr(relation.
getTo());
179 if (not cellHolderPtr or not neighborCellHolderPtr)
return false;
181 ACellHolder& cellHolder = *cellHolderPtr;
183 ACellHolder& neighborCellHolder = *neighborCellHolderPtr;
193 Weight relationWeight,
194 ACellHolder& neighborCellHolder)
196 const AutomatonCell& automatonCell = cellHolder.getAutomatonCell();
197 const AutomatonCell& neighborAutomatonCell = neighborCellHolder.getAutomatonCell();