75 if (levelSet ==
nullptr) {
77 .addError(
"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 for
103 auto &domainSegment = newDomain.getDomainSegment(p);
105 viennahrle::Index<D>
const startVector =
106 (p == 0) ? grid.getMinGridPoint()
107 : newDomain.getSegmentation()[p - 1];
109 viennahrle::Index<D>
const endVector =
111 ? newDomain.getSegmentation()[p]
112 : grid.incrementIndices(grid.getMaxGridPoint());
115 neighborIt(domain, startVector);
116 neighborIt.getIndices() < endVector; neighborIt.next()) {
117 auto ¢erIt = neighborIt.getCenter();
118 bool centerSign = isNegative(centerIt.getValue());
119 if (centerIt.isDefined()) {
120 bool keepPoint =
true;
122 if (std::abs(centerIt.getValue()) != 0.) {
125 checkNeighbourSigns(neighborIt, isSignDifferentOrZero<T>);
127 keepPoint = checkNeighbourSigns(neighborIt, isSignDifferent<T>);
135 if (std::abs(centerIt.getValue()) == 0.) {
136 bool overWritePoint =
false;
138 for (
int i = 0; i <
D; i++) {
139 const auto &negVal = neighborIt.getNeighbor(i).getValue();
140 const auto &posVal = neighborIt.getNeighbor(
D + i).getValue();
144 if (!isMonotone(negVal, posVal)) {
145 overWritePoint =
true;
147 std::abs(negVal) < std::abs(posVal) ? negVal : posVal;
151 if (overWritePoint) {
152 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
160 domainSegment.insertNextDefinedPoint(neighborIt.getIndices(),
161 centerIt.getValue());
163 newDataSourceIds[p].push_back(centerIt.getPointId());
167 domainSegment.insertNextUndefinedPoint(
168 neighborIt.getIndices(),
172 domainSegment.insertNextUndefinedPoint(
173 neighborIt.getIndices(),
181 newlsDomain->getPointData().translateFromMultiData(
182 levelSet->getPointData(), newDataSourceIds);
189 levelSet->finalize(2);