75 if (levelSet ==
nullptr) {
77 .addWarning(
"No level set was passed to Prune.")
81 if (levelSet->getNumberOfPoints() == 0) {
85 auto &grid = levelSet->getGrid();
86 auto newlsDomain = SmartPointer<Domain<T, D>>::New(grid);
90 newDomain.initialize(domain.getNewSegmentation(), domain.getAllocation());
92 const bool updateData = updatePointData;
93 const bool removeZeros = removeStrayZeros;
96 std::vector<std::vector<unsigned>> newDataSourceIds;
100#pragma omp parallel num_threads(newDomain.getNumberOfSegments())
104 p = omp_get_thread_num();
107 auto &domainSegment = newDomain.getDomainSegment(p);
109 viennahrle::Index<D>
const startVector =
110 (p == 0) ? grid.getMinGridPoint()
111 : newDomain.getSegmentation()[p - 1];
113 viennahrle::Index<D>
const endVector =
115 ? newDomain.getSegmentation()[p]
116 : grid.incrementIndices(grid.getMaxGridPoint());
119 neighborIt(domain, startVector);
120 neighborIt.getIndices() < endVector; neighborIt.next()) {
121 auto ¢erIt = neighborIt.getCenter();
122 bool centerSign = isNegative(centerIt.getValue());
123 if (centerIt.isDefined()) {
124 bool keepPoint =
true;
126 if (std::abs(centerIt.getValue()) != 0.) {
129 checkNeighbourSigns(neighborIt, isSignDifferentOrZero<T>);
131 keepPoint = checkNeighbourSigns(neighborIt, isSignDifferent<T>);
139 if (std::abs(centerIt.getValue()) == 0.) {
140 bool overWritePoint =
false;
142 for (
int i = 0; i <
D; i++) {
143 const auto &negVal = neighborIt.getNeighbor(i).getValue();
144 const auto &posVal = neighborIt.getNeighbor(
D + i).getValue();
148 if (!isMonotone(negVal, posVal)) {
149 overWritePoint =
true;
151 std::abs(negVal) < std::abs(posVal) ? negVal : posVal;
155 if (overWritePoint) {
156 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
164 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
165 centerIt.getValue());
167 newDataSourceIds[p].push_back(centerIt.getPointId());
171 domainSegment.insertNextUndefinedPoint(
172 neighborIt.getIndices(),
176 domainSegment.insertNextUndefinedPoint(
177 neighborIt.getIndices(),
185 newlsDomain->getPointData().translateFromMultiData(
186 levelSet->getPointData(), newDataSourceIds);
193 levelSet->finalize(2);