49 SmartPointer<Domain<T, D>> levelSetA =
nullptr;
50 SmartPointer<Domain<T, D>> levelSetB =
nullptr;
53 bool updatePointData =
true;
54 bool pruneResult =
true;
57 auto &grid = levelSetA->getGrid();
58 auto newlsDomain = SmartPointer<Domain<T, D>>::New(grid);
62 newDomain.initialize(domain.getNewSegmentation(), domain.getAllocation());
64 const bool updateData = updatePointData;
67 std::vector<std::vector<unsigned>> newDataSourceIds;
68 std::vector<std::vector<bool>> newDataLS;
71 newDataLS.resize(newDataSourceIds.size());
74#pragma omp parallel num_threads(newDomain.getNumberOfSegments())
78 p = omp_get_thread_num();
81 auto &domainSegment = newDomain.getDomainSegment(p);
83 viennahrle::Index<D> currentVector =
84 (p == 0) ? grid.getMinGridPoint()
85 : newDomain.getSegmentation()[p - 1];
87 viennahrle::Index<D>
const endVector =
89 ? newDomain.getSegmentation()[p]
90 : grid.incrementIndices(grid.getMaxGridPoint());
92 viennahrle::ConstSparseIterator<hrleDomainType> itA(
93 levelSetA->getDomain(), currentVector);
94 viennahrle::ConstSparseIterator<hrleDomainType> itB(
95 levelSetB->getDomain(), currentVector);
97 while (currentVector < endVector) {
98 const auto &comparison = comp(itA.getValue(), itB.getValue());
99 const auto ¤tValue = comparison.first;
103 domainSegment.insertNextDefinedPoint(currentVector, currentValue);
106 const bool originLS = comparison.second;
107 newDataLS[p].push_back(originLS);
108 const auto originPointId =
109 (originLS) ? itA.getPointId() : itB.getPointId();
110 newDataSourceIds[p].push_back(originPointId);
113 domainSegment.insertNextUndefinedPoint(
118 switch (Compare(itA.getEndIndices(), itB.getEndIndices())) {
128 Max(itA.getStartIndices().get(), itB.getStartIndices().get());
133 for (
unsigned i = 1; i < newDataLS.size(); ++i) {
134 newDataLS[0].insert(newDataLS[0].end(), newDataLS[i].begin(),
137 newDataSourceIds[0].insert(newDataSourceIds[0].end(),
138 newDataSourceIds[i].begin(),
139 newDataSourceIds[i].end());
147 const auto &AData = levelSetA->getPointData();
148 const auto &BData = levelSetB->getPointData();
149 auto &newData = newlsDomain->getPointData();
152 for (
unsigned i = 0; i < AData.getScalarDataSize(); ++i) {
153 auto scalarDataLabel = AData.getScalarDataLabel(i);
154 auto BPointer = BData.getScalarData(scalarDataLabel,
true);
155 if (BPointer !=
nullptr) {
156 auto APointer = AData.getScalarData(i);
159 scalars.resize(newlsDomain->getNumberOfPoints());
160 for (
unsigned j = 0; j < newlsDomain->getNumberOfPoints(); ++j) {
161 scalars[j] = (newDataLS[0][j])
162 ? APointer->at(newDataSourceIds[0][j])
163 : BPointer->at(newDataSourceIds[0][j]);
165 newData.insertNextScalarData(scalars, scalarDataLabel);
170 for (
unsigned i = 0; i < AData.getVectorDataSize(); ++i) {
171 auto vectorDataLabel = AData.getVectorDataLabel(i);
172 auto BPointer = BData.getVectorData(vectorDataLabel,
true);
173 if (BPointer !=
nullptr) {
174 auto APointer = AData.getVectorData(i);
177 vectors.resize(newlsDomain->getNumberOfPoints());
178 for (
unsigned j = 0; j < newlsDomain->getNumberOfPoints(); ++j) {
179 vectors[j] = (newDataLS[0][j])
180 ? APointer->at(newDataSourceIds[0][j])
181 : BPointer->at(newDataSourceIds[0][j]);
183 newData.insertNextVectorData(vectors, vectorDataLabel);
194 pruner.setRemoveStrayZeros(
true);
201 levelSetA->deepCopy(newlsDomain);
205 auto &hrleDomain = levelSetA->getDomain();
206#pragma omp parallel num_threads(hrleDomain.getNumberOfSegments())
210 p = omp_get_thread_num();
212 auto &domainSegment = hrleDomain.getDomainSegment(p);
215 for (
unsigned i = 0; i < domainSegment.definedValues.size(); ++i) {
216 domainSegment.definedValues[i] = -domainSegment.definedValues[i];
220 if (domainSegment.undefinedValues.size() < 1) {
223 if (domainSegment.undefinedValues.size() < 2) {
234 for (
unsigned dim = 0; dim <
D; ++dim) {
235 for (
unsigned c = 0; c < domainSegment.runTypes[dim].size(); ++c) {
236 if (domainSegment.runTypes[dim][c] ==
237 viennahrle::RunTypeValues::UNDEF_PT) {
238 domainSegment.runTypes[dim][c] =
239 viennahrle::RunTypeValues::UNDEF_PT + 1;
240 }
else if (domainSegment.runTypes[dim][c] ==
241 viennahrle::RunTypeValues::UNDEF_PT + 1) {
242 domainSegment.runTypes[dim][c] =
243 viennahrle::RunTypeValues::UNDEF_PT;
248 levelSetA->finalize();
251 static std::pair<T, bool> minComp(
const T &a,
const T &b) {
252 bool AIsSmaller = a < b;
254 return std::make_pair(a,
true);
256 return std::make_pair(b,
false);
259 static std::pair<T, bool> maxComp(
const T &a,
const T &b) {
260 bool AIsLarger = a > b;
262 return std::make_pair(a,
true);
264 return std::make_pair(b,
false);
267 static std::pair<T, bool> relativeComplementComp(
const T &a,
const T &b) {
268 return maxComp(a, -b);
277 : levelSetA(passedlsDomain), operation(passedOperation) {}
283 : levelSetA(passedlsDomainA), levelSetB(passedlsDomainB),
284 operation(passedOperation){};
288 levelSetA = passedlsDomain;
294 levelSetB = passedlsDomain;
299 operation = passedOperation;
305 operationComp = passedOperationComp;
317 if (levelSetA ==
nullptr) {
318 Logger::getInstance()
319 .addWarning(
"No level set was passed to BooleanOperation. Not "
320 "performing operation.")
325 if (
static_cast<unsigned>(operation) < 3) {
326 if (levelSetB ==
nullptr) {
327 Logger::getInstance()
328 .addWarning(
"Only one level set was passed to BooleanOperation, "
329 "although two were required. Not performing operation.")
337 booleanOpInternal(&BooleanOperation::maxComp);
340 booleanOpInternal(&BooleanOperation::minComp);
343 booleanOpInternal(&BooleanOperation::relativeComplementComp);
349 if (operationComp ==
nullptr) {
350 Logger::getInstance()
351 .addWarning(
"No comparator supplied to custom BooleanOperation. "
352 "Not performing operation.")
356 booleanOpInternal(operationComp);
Class containing all information about the level set, including the dimensions of the domain,...
Definition lsDomain.hpp:27
viennahrle::Domain< T, D > DomainType
Definition lsDomain.hpp:32
static constexpr T NEG_VALUE
Definition lsDomain.hpp:52
unsigned getNumberOfSegments() const
returns the number of segments, the levelset is split into. This is useful for algorithm parallelisat...
Definition lsDomain.hpp:148
void finalize(int newWidth)
this function sets a new levelset width and finalizes the levelset, so it is ready for use by other a...
Definition lsDomain.hpp:112
static constexpr T POS_VALUE
Definition lsDomain.hpp:51