Skip to content

Commit 89bb1c3

Browse files
committed
Debugged OrderedSet::intersectionComplement
1 parent 766da8f commit 89bb1c3

4 files changed

Lines changed: 36 additions & 45 deletions

File tree

sbg/map_detail.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,8 @@ AtomicMapVector reduce(const MultiDimInter& mdi, const ExpressionImpl& expr
385385
return reduce(reducible_interval, reducible_expr);
386386
}
387387

388-
template<typename SetMDIImpl>
389-
MapVector MapDetail::MDICollectionReduce(const SetMDIImpl& s
388+
template<typename CompactSetImpl>
389+
MapVector MapDetail::MDICollectionReduce(const CompactSetImpl& s
390390
, const ExpressionImpl& expr)
391391
{
392392
MapVector result;
@@ -397,7 +397,7 @@ MapVector MapDetail::MDICollectionReduce(const SetMDIImpl& s
397397
MultiDimInter mdi_copy = mdi;
398398
ExpressionImpl expr_copy = expr;
399399
for (const AtomicMap& r : reduced) {
400-
UnorderedSet domain;
400+
CompactSetImpl domain;
401401
mdi_copy[k_reduce] = r.first;
402402
domain.pushBack(mdi_copy);
403403
expr_copy[k_reduce] = r.second;

sbg/ord_set.cpp

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,13 @@ namespace LIB {
3131
namespace detail {
3232

3333
////////////////////////////////////////////////////////////////////////////////
34-
// Auxiliary functions
34+
// Auxiliary functions ---------------------------------------------------------
3535
////////////////////////////////////////////////////////////////////////////////
3636

3737
/**
3838
* @brief Checks if the both set pieces overlap.
3939
*/
40-
bool overlap(const MultiDimInter& mdi1
41-
, const MultiDimInter& mdi2)
40+
bool overlap(const MultiDimInter& mdi1, const MultiDimInter& mdi2)
4241
{
4342
const auto max1 = mdi1.maxElem();
4443
const auto min1 = mdi1.minElem();
@@ -430,29 +429,32 @@ OrderedSet OrderedSet::complementAtom() const
430429
return OrderedSet{std::move(result)};
431430
}
432431

433-
std::size_t OrderedSet::intersectionComplement(const OrderedSet& local_complement
434-
, const MultiDimInter& mdi)
432+
void OrderedSet::intersectionComplement(const OrderedSet&
433+
local_complement, const MultiDimInter& mdi)
435434
{
436435
// Special cases
437436
if (isEmpty()) {
438-
return 0;
437+
return;
439438
}
440439

441440
// General case
442-
std::size_t i = 0;
441+
443442
// Values in the partial result "before" the current MDI all belong to the
444443
// complement of the processed MDIs, the current MDI and also to the remaining
445444
// MDIs, so there's no need to keep calculating with them.
445+
OrderedSet result;
446+
auto it = _pieces.begin();
446447
for (const MultiDimInter& elem : _pieces) {
447448
if (!(elem.maxElem() < mdi.minElem())) {
448449
break;
449450
}
450-
++i;
451+
++it;
451452
}
453+
result._pieces.insert(result.end(), std::make_move_iterator(_pieces.begin())
454+
, std::make_move_iterator(it));
452455

453456
NAT global_position = 0;
454-
OrderedSet result;
455-
for (auto it = _pieces.begin() + i; it != _pieces.end(); ++it) {
457+
for (; it != _pieces.end(); ++it) {
456458
const MultiDimInter& elem = *it;
457459
global_position = result.advanceHint(global_position, elem);
458460
// Discard elements in the complement of processed MDIs that belong to the
@@ -472,8 +474,6 @@ std::size_t OrderedSet::intersectionComplement(const OrderedSet& local_complemen
472474
}
473475
}
474476
_pieces = std::move(result._pieces);
475-
476-
return i;
477477
}
478478

479479
OrderedSet OrderedSet::complement() const
@@ -483,23 +483,16 @@ OrderedSet OrderedSet::complement() const
483483
}
484484

485485
OrderedSet result = OrderedSet{_pieces.front()}.complementAtom();
486-
std::size_t i = 0;
487486
std::size_t j = 0;
488487
for (const MultiDimInter& mdi : _pieces) {
489488
if (j > 0) {
490489
OrderedSet c = OrderedSet{mdi}.complementAtom();
491-
i = result.intersectionComplement(c, mdi);
490+
result.intersectionComplement(c, mdi);
492491
}
493492
++j;
494493
}
495494

496-
// Calculate remnant
497-
OrderedSet remnant;
498-
for (j = 0; j < i; ++j) {
499-
remnant.pushBack(result._pieces[j]);
500-
}
501-
502-
return std::move(remnant).disjointCup(std::move(result));
495+
return result;
503496
}
504497

505498
OrderedSet OrderedSet::difference(const OrderedSet& other) const
@@ -583,26 +576,26 @@ OrderedSet OrderedSet::disjointCup(OrderedSet&& other) &&
583576
, std::make_move_iterator(other._pieces.end()));
584577
result.insert(result.end(), std::make_move_iterator(_pieces.begin())
585578
, std::make_move_iterator(_pieces.end()));
586-
}
587-
588-
// General case
589-
auto it1 = _pieces.begin();
590-
auto end1 = _pieces.end();
591-
auto it2 = other._pieces.begin();
592-
auto end2 = other._pieces.end();
593-
while (it1 != end1 && it2 != end2) {
594-
if (*it1 < *it2) {
595-
result.push_back(*it1);
596-
++it1;
597-
} else {
598-
result.push_back(*it2);
599-
++it2;
579+
} else{
580+
// General case
581+
auto it1 = _pieces.begin();
582+
auto end1 = _pieces.end();
583+
auto it2 = other._pieces.begin();
584+
auto end2 = other._pieces.end();
585+
while (it1 != end1 && it2 != end2) {
586+
if (*it1 < *it2) {
587+
result.push_back(*it1);
588+
++it1;
589+
} else {
590+
result.push_back(*it2);
591+
++it2;
592+
}
600593
}
594+
result.insert(result.end(), std::make_move_iterator(it1)
595+
, std::make_move_iterator(end1));
596+
result.insert(result.end(), std::make_move_iterator(it2)
597+
, std::make_move_iterator(end2));
601598
}
602-
result.insert(result.end(), std::make_move_iterator(it1)
603-
, std::make_move_iterator(end1));
604-
result.insert(result.end(), std::make_move_iterator(it2)
605-
, std::make_move_iterator(end2));
606599

607600
return OrderedSet{std::move(result)};
608601
}

sbg/ord_set.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class OrderedSet {
103103
* which represents the complement of an ordered set, and an ordered set
104104
* (other), which represents the complement of an atomic ordered set.
105105
*/
106-
std::size_t intersectionComplement(const OrderedSet& other
106+
void intersectionComplement(const OrderedSet& other
107107
, const MultiDimInter& mdi);
108108

109109
/**

sbg/set_fact.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ Set OrdSetFact::createSet(const FixedPointsInfo& info)
7575
return Set{SetKind::kOrdered, info};
7676
}
7777

78-
////////////////////////////////////////////////////////////////////////////////
79-
8078
////////////////////////////////////////////////////////////////////////////////
8179
// Ordered Unidimensional Dense Set Factory ------------------------------------
8280
////////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)