@@ -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