From 1f72ffce79413c617840f9a4ca1a33e4f81d974e Mon Sep 17 00:00:00 2001 From: aletempiac Date: Mon, 25 Mar 2024 14:23:43 +0100 Subject: [PATCH] Improving ACD performance with bail-out conditions --- src/map/if/acd/ac_decomposition.hpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/map/if/acd/ac_decomposition.hpp b/src/map/if/acd/ac_decomposition.hpp index 0ad1e34c2..a384cc2e1 100644 --- a/src/map/if/acd/ac_decomposition.hpp +++ b/src/map/if/acd/ac_decomposition.hpp @@ -232,7 +232,7 @@ private: best_cost = multiplicity + additional_cost; best_free_set = i; - if ( !ps.use_first ) + if ( !ps.use_first && multiplicity > 2 ) { continue; } @@ -270,7 +270,7 @@ private: best_cost = multiplicity + additional_cost; best_free_set = i; - if ( !ps.use_first ) + if ( !ps.use_first && multiplicity > 2 ) { continue; } @@ -478,6 +478,13 @@ private: pComb[i] = pInvPerm[i] = i; } + /* early bail-out conditions */ + uint32_t bail_multiplicity = 2; + if ( best_multiplicity < UINT32_MAX ) + { + bail_multiplicity = ( best_multiplicity >> 1 ) + ( best_multiplicity & 1 ); + } + /* enumerate combinations */ do { @@ -490,6 +497,11 @@ private: { bestPerm[i] = pComb[i]; } + + if ( best_cost <= bail_multiplicity ) + { + break; + } } } while ( combinations_offset_next( free_set_size, offset, pComb, pInvPerm, tt ) );