bool MPI_Base :: MakeAssignsFromMasks( unsigned *full_mask, unsigned *part_mask, unsigned *mask_value, vec< vec<Lit> > &dummy_vec ) { // for predict with minisat2.2. convert masks to vector of Literals unsigned variate_vars_count = 0; full_mask_var_count = 0; for ( unsigned i = 0; i < FULL_MASK_LEN; i++ ) { variate_vars_count += BitCount( full_mask[i] ^ part_mask[i] ); full_mask_var_count += BitCount( full_mask[i] ); } // determine count of assumptions and lenght of every one int problems_count = 1 << variate_vars_count; dummy_vec.resize( problems_count ); for( int i=0; i < dummy_vec.size(); ++i ) dummy_vec[i].resize( full_mask_var_count ); unsigned mask, range_mask_ind; int range_mask; unsigned index; int cur_var_ind; bool IsPositiveLiteral, IsAddingLiteral; for ( int lint = 0; lint < problems_count; lint++ ) { range_mask = 1; range_mask_ind = 1; index = 0; for ( unsigned i = 0; i < FULL_MASK_LEN; i++ ) { for ( unsigned j = 0; j < UINT_LEN; j++ ) { mask = ( 1 << j ); cur_var_ind = i * UINT_LEN + j; IsAddingLiteral = false; if ( part_mask[i] & mask ) { // one common vector send by control process IsPositiveLiteral = ( mask_value[i] & mask ) ? true : false; IsAddingLiteral = true; } else if ( full_mask[i] & mask ) { // set of vectors IsPositiveLiteral = ( lint & range_mask ) ? true : false; range_mask = 1 << range_mask_ind; range_mask_ind++; IsAddingLiteral = true; } if ( !IsAddingLiteral ) continue; dummy_vec[lint][index++] = IsPositiveLiteral ? mkLit( cur_var_ind ) : ~mkLit( cur_var_ind ); } } } return true; }
inline Lit mkNegLit (Atom var) { return mkLit(var, true); }
inline Lit mkPosLit (Atom var) { return mkLit(var, false); }