Performance improvement and fixes

This commit is contained in:
aletempiac 2024-03-22 19:19:35 +01:00
parent 8a314db8dc
commit 6aacf524aa
1 changed files with 34 additions and 20 deletions

View File

@ -118,11 +118,12 @@ public:
} }
if ( late_arriving > ps.max_free_set_vars ) if ( late_arriving > ps.max_free_set_vars )
{ {
ps.max_free_set_vars = late_arriving; return -1; /* on average avoiding this computation leads to better quality */
// ps.max_free_set_vars = late_arriving;
} }
/* return a high cost if too many late arriving variables */ /* return a high cost if too many late arriving variables */
if ( late_arriving > ps.lut_size - 1 || late_arriving > ps.max_free_set_vars ) if ( late_arriving > ps.lut_size - 1 )
{ {
return -1; return -1;
} }
@ -632,13 +633,10 @@ private:
uint32_t k = 0; uint32_t k = 0;
for ( uint32_t j = 0; j < num_vars - best_free_set; ++j ) for ( uint32_t j = 0; j < num_vars - best_free_set; ++j )
{ {
if ( !kitty::has_var( tt, j ) )
continue;
if ( !kitty::has_var( tt, care, j ) ) if ( !kitty::has_var( tt, care, j ) )
{ {
/* fix truth table */ /* fix truth table */
adjust_truth_table_on_dc( tt, care, j ); adjust_truth_table_on_dc( tt, care, tt.num_vars(), j );
continue; continue;
} }
@ -788,7 +786,14 @@ private:
} }
} }
support_minimization_encodings = std::vector<std::array<uint32_t, 2>>( num_combs ); support_minimization_encodings = std::vector<std::array<uint32_t, 2>>( num_combs );
generate_support_minimization_encodings_rec<false>( 0, 0, 0, count ); generate_support_minimization_encodings_rec<false, true>( 0, 0, 0, count );
}
else if ( best_multiplicity > 8 )
{
/* combinations are 2^(mu - 1) */
num_combs = 1u << ( best_multiplicity - 1 );
support_minimization_encodings = std::vector<std::array<uint32_t, 2>>( num_combs );
generate_support_minimization_encodings_rec<false, false>( 0, 0, 0, count );
} }
else else
{ {
@ -798,18 +803,18 @@ private:
num_combs = ( num_combs << 1 ) + num_combs; num_combs = ( num_combs << 1 ) + num_combs;
} }
support_minimization_encodings = std::vector<std::array<uint32_t, 2>>( num_combs ); support_minimization_encodings = std::vector<std::array<uint32_t, 2>>( num_combs );
generate_support_minimization_encodings_rec<true>( 0, 0, 0, count ); generate_support_minimization_encodings_rec<true, false>( 0, 0, 0, count );
} }
assert( count == num_combs ); assert( count == num_combs );
} }
template<bool enable_dcset> template<bool enable_dcset, bool equal_size_partition>
void generate_support_minimization_encodings_rec( uint32_t onset, uint32_t offset, uint32_t var, uint32_t& count ) void generate_support_minimization_encodings_rec( uint32_t onset, uint32_t offset, uint32_t var, uint32_t& count )
{ {
if ( var == best_multiplicity ) if ( var == best_multiplicity )
{ {
if ( !enable_dcset ) if ( equal_size_partition )
{ {
/* sets must be equally populated */ /* sets must be equally populated */
if ( __builtin_popcount( onset ) != __builtin_popcount( offset ) ) if ( __builtin_popcount( onset ) != __builtin_popcount( offset ) )
@ -827,12 +832,12 @@ private:
/* var in DCSET */ /* var in DCSET */
if ( enable_dcset ) if ( enable_dcset )
{ {
generate_support_minimization_encodings_rec<enable_dcset>( onset, offset, var + 1, count ); generate_support_minimization_encodings_rec<enable_dcset, equal_size_partition>( onset, offset, var + 1, count );
} }
/* move var in ONSET */ /* move var in ONSET */
onset |= 1 << var; onset |= 1 << var;
generate_support_minimization_encodings_rec<enable_dcset>( onset, offset, var + 1, count ); generate_support_minimization_encodings_rec<enable_dcset, equal_size_partition>( onset, offset, var + 1, count );
onset &= ~( 1 << var ); onset &= ~( 1 << var );
/* remove symmetries */ /* remove symmetries */
@ -843,7 +848,7 @@ private:
/* move var in OFFSET */ /* move var in OFFSET */
offset |= 1 << var; offset |= 1 << var;
generate_support_minimization_encodings_rec<enable_dcset>( onset, offset, var + 1, count ); generate_support_minimization_encodings_rec<enable_dcset, equal_size_partition>( onset, offset, var + 1, count );
offset &= ~( 1 << var ); offset &= ~( 1 << var );
} }
@ -1042,6 +1047,13 @@ private:
for ( uint32_t j = 0; j < iset_support; ++j ) for ( uint32_t j = 0; j < iset_support; ++j )
{ {
cost += has_var_support( tt, care, iset_support, j ) ? 1 : 0; cost += has_var_support( tt, care, iset_support, j ) ? 1 : 0;
// if ( !has_var_support( tt, care, iset_support, j ) )
// {
// /* adjust truth table and care set */
// adjust_truth_table_on_dc( tt, care, iset_support, j );
// continue;
// }
// ++cost;
} }
/* discard solutions with support over LUT size */ /* discard solutions with support over LUT size */
@ -1186,7 +1198,7 @@ private:
return res; return res;
} }
bool covering_improve( std::vector<encoding_column>& matrix, std::array<uint32_t, 6>& solution ) bool covering_improve( std::vector<encoding_column> const& matrix, std::array<uint32_t, 6>& solution )
{ {
/* performs one iteration of local search */ /* performs one iteration of local search */
uint32_t best_cost = 0, local_cost = 0; uint32_t best_cost = 0, local_cost = 0;
@ -1233,21 +1245,23 @@ private:
return improved; return improved;
} }
void adjust_truth_table_on_dc( STT& tt, STT& care, uint32_t var_index ) void adjust_truth_table_on_dc( STT& tt, STT& care, uint32_t real_num_vars, uint32_t var_index )
{ {
assert( var_index < tt.num_vars() ); assert( var_index < real_num_vars );
assert( tt.num_vars() == care.num_vars() ); assert( tt.num_vars() == care.num_vars() );
if ( tt.num_vars() <= 6 || var_index < 6 ) const uint32_t num_blocks = real_num_vars <= 6 ? 1 : ( 1 << ( real_num_vars - 6 ) );
if ( real_num_vars <= 6 || var_index < 6 )
{ {
auto it_tt = std::begin( tt._bits ); auto it_tt = std::begin( tt._bits );
auto it_care = std::begin( care._bits ); auto it_care = std::begin( care._bits );
while ( it_tt != std::end( tt._bits ) ) while ( it_tt != std::begin( tt._bits ) + num_blocks )
{ {
uint64_t new_bits = *it_tt & *it_care; uint64_t new_bits = *it_tt & *it_care;
*it_tt = ( ( new_bits | ( new_bits >> ( uint64_t( 1 ) << var_index ) ) ) & kitty::detail::projections_neg[var_index] ) | *it_tt = ( ( new_bits | ( new_bits >> ( uint64_t( 1 ) << var_index ) ) ) & kitty::detail::projections_neg[var_index] ) |
( ( new_bits | ( new_bits << ( uint64_t( 1 ) << var_index ) ) ) & kitty::detail::projections[var_index] ); ( ( new_bits | ( new_bits << ( uint64_t( 1 ) << var_index ) ) ) & kitty::detail::projections[var_index] );
*it_care = *it_care | ( *it_care >> ( uint64_t( 1 ) << var_index ) ); *it_care = ( *it_care | ( *it_care >> ( uint64_t( 1 ) << var_index ) ) ) & kitty::detail::projections_neg[var_index];
*it_care = *it_care | ( *it_care << ( uint64_t( 1 ) << var_index ) );
++it_tt; ++it_tt;
++it_care; ++it_care;
@ -1256,7 +1270,7 @@ private:
} }
const auto step = 1 << ( var_index - 6 ); const auto step = 1 << ( var_index - 6 );
for ( auto i = 0u; i < static_cast<uint32_t>( tt.num_blocks() ); i += 2 * step ) for ( auto i = 0u; i < static_cast<uint32_t>( num_blocks ); i += 2 * step )
{ {
for ( auto j = 0; j < step; ++j ) for ( auto j = 0; j < step; ++j )
{ {