Skip to content

Commit a095dfe

Browse files
committed
Optimize removal of trivial DDs
Search only in those match_dfs that satisfy RHS. This set is minimized before checking using MinimizeDifferentialSet(). In order to optimize this method, additional bitset comparison was removed from std::sort because it does not affect the results.
1 parent 27e006d commit a095dfe

1 file changed

Lines changed: 27 additions & 19 deletions

File tree

src/core/algorithms/dd/fastdd/util/hybrid_evidence_inverter.h

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,8 @@ class HybridEvidenceInverter {
6262

6363
std::vector<Bitset> MinimizeDifferentialSet(std::vector<Bitset> bitsets) const {
6464
LOG_TRACE("Start minimize");
65-
std::ranges::sort(bitsets, [](Bitset const& a, Bitset const& b) {
66-
int diff = b.count() - a.count();
67-
return diff != 0 ? diff < 0 : b < a;
68-
});
65+
std::ranges::sort(bitsets,
66+
[](Bitset const& a, Bitset const& b) { return a.count() > b.count(); });
6967
LOG_TRACE("Sorted");
7068

7169
TreeSearch<Bitset> negative_search;
@@ -80,6 +78,7 @@ class HybridEvidenceInverter {
8078
}
8179

8280
std::vector<std::vector<DifferentialFunction>> Minimize(std::vector<Bitset> covers,
81+
std::vector<Bitset> cur_match_dfs,
8382
std::size_t rhs_column,
8483
std::size_t rhs_offset) {
8584
std::shared_ptr<TranslatingMinimizeTree<Bitset>> minimize_tree;
@@ -100,7 +99,7 @@ class HybridEvidenceInverter {
10099
minimized_lhs.reserve(minimized_bitsets.size());
101100
for (auto const& bitset : minimized_bitsets) {
102101
// check if LHS is not trivial
103-
if (std::ranges::any_of(match_dfs_, [&bitset](auto const& match_df) {
102+
if (std::ranges::any_of(cur_match_dfs, [&bitset](auto const& match_df) {
104103
return bitset.is_subset_of(match_df);
105104
})) {
106105
std::vector<DifferentialFunction> lhs;
@@ -275,43 +274,52 @@ class HybridEvidenceInverter {
275274

276275
for (std::size_t i = 0; i != dif_funcs_.size(); ++i) {
277276
for (std::size_t j = dif_funcs_[i].size(); j != 0; --j) {
278-
boost::dynamic_bitset<> cur_bitset =
279-
dif_func_to_not_satisfied_bitsets_[dif_func_info_->dif_func_nums_[i] + j -
280-
1];
281-
if (cur_bitset.none()) {
277+
std::size_t const dif_func_index = dif_func_info_->dif_func_nums_[i] + j - 1;
278+
boost::dynamic_bitset<> not_satisfied_bitset =
279+
dif_func_to_not_satisfied_bitsets_[dif_func_index];
280+
boost::dynamic_bitset<> satisfied_bitset =
281+
dif_func_to_satisfied_bitsets_[dif_func_index];
282+
if (not_satisfied_bitset.none() || satisfied_bitset.none()) {
282283
continue;
283284
}
284-
std::vector<Bitset> cur_diff_bitsets;
285-
cur_diff_bitsets.reserve(cur_bitset.count());
286-
for (std::size_t index = cur_bitset.find_first();
287-
index != boost::dynamic_bitset<>::npos; index = cur_bitset.find_next(index)) {
285+
std::vector<Bitset> not_satisfied_diff_bitsets;
286+
not_satisfied_diff_bitsets.reserve(not_satisfied_bitset.count());
287+
std::vector<Bitset> satisfied_diff_bitsets;
288+
satisfied_diff_bitsets.reserve(satisfied_bitset.count());
289+
for (std::size_t index = 0; index != match_dfs_.size(); ++index) {
288290
Bitset diff_bitset = match_dfs_[index];
289291
for (std::size_t k = dif_func_info_->dif_func_nums_[i];
290292
k != dif_func_info_->dif_func_nums_[i + 1]; ++k) {
291293
diff_bitset.set(k, false);
292294
}
293-
cur_diff_bitsets.push_back(std::move(diff_bitset));
295+
if (not_satisfied_bitset[index]) {
296+
not_satisfied_diff_bitsets.push_back(std::move(diff_bitset));
297+
} else {
298+
satisfied_diff_bitsets.push_back(std::move(diff_bitset));
299+
}
294300
}
295301
LOG_DEBUG("Col {}; Dif_func {}; {}", i, j - 1, dif_funcs_[i][j - 1].ToString());
296-
cur_diff_bitsets = MinimizeDifferentialSet(std::move(cur_diff_bitsets));
297-
LOG_TRACE("Minimized differential set: {}", cur_diff_bitsets.size());
302+
not_satisfied_diff_bitsets =
303+
MinimizeDifferentialSet(std::move(not_satisfied_diff_bitsets));
304+
satisfied_diff_bitsets = MinimizeDifferentialSet(std::move(satisfied_diff_bitsets));
298305

299306
std::vector<Bitset> covers;
300307
if constexpr (strategy_ == HittingSetEnumerationStrategy::EvidenceInverter) {
301-
EvidenceInverter<Bitset> inverter(std::move(cur_diff_bitsets),
308+
EvidenceInverter<Bitset> inverter(std::move(not_satisfied_diff_bitsets),
302309
dif_func_info_->dif_func_num_,
303310
column_to_dif_funcs_, i);
304311
LOG_DEBUG("Built inverter");
305312
covers = inverter.GetCovers();
306313
} else {
307-
MMCS<Bitset> mmcs(std::move(cur_diff_bitsets), column_to_dif_funcs_, i);
314+
MMCS<Bitset> mmcs(std::move(not_satisfied_diff_bitsets), column_to_dif_funcs_,
315+
i);
308316
LOG_DEBUG("Built MMCS");
309317
covers = mmcs.GetCovers();
310318
}
311319
LOG_DEBUG("Got covers: {}", covers.size());
312320

313321
std::vector<std::vector<DifferentialFunction>> minimized_covers =
314-
Minimize(std::move(covers), i, j - 1);
322+
Minimize(std::move(covers), std::move(satisfied_diff_bitsets), i, j - 1);
315323
LOG_DEBUG("Minimized covers: {}", minimized_covers.size());
316324
cur_result_size += minimized_covers.size();
317325
cur_result.push_back(std::move(minimized_covers));

0 commit comments

Comments
 (0)