int tree_lookahead() { int i, _forced_literals; struct treeNode _treeNode, *_treeArray; #ifdef LONG_LOOK forced_literals = 0; if( long_lookahead( forced_literal_array, &forced_literals ) == UNSAT ) return UNSAT; if( long_fix_forced_literals() == UNSAT ) return UNSAT; #endif init_lookahead_procedure(); #ifdef ITERATE_LOOKAHEAD do { _forced_literals = forced_literals; #endif _treeArray = treeArray; for( i = tree_elements-1; i >= 0; i-- ) { _treeNode = *(_treeArray++); if( _treeNode.literal == lastChanged ) return SAT; currentTimeStamp += _treeNode.gap; if( currentTimeStamp >= LOOK_MAX ) { currentTimeStamp -= _treeNode.gap; // is dit nodig? return SAT; } if( treelookvar(_treeNode.literal) == UNSAT ) return UNSAT; currentTimeStamp -= _treeNode.gap; if( forced_literals > _forced_literals ) { if( IS_FIXED( _treeNode.literal ) && ( Rank[NR(_treeNode.literal)] < Rank_trigger) ) { Rank_trigger = Rank[NR(_treeNode.literal)]; printf("c forced var with Rank %i\n", Rank_trigger ); } _forced_literals = forced_literals; lastChanged = _treeNode.literal; } } #ifdef ITERATE_LOOKAHEAD currentTimeStamp += 2 * tree_elements; } while( lastChanged != 0 ); #endif return SAT; }
int serial_lookahead() { int i, j, sign, nrval, varnr, imp, iterTmp; init_lookahead_procedure(); #ifdef ITERATE_LOOKAHEAD do { #endif if( ( currentTimeStamp + 4 * lookaheadArrayLength ) >= LOOK_MAX ) { printf("c CTS: %i; LOOK_MAX: %i\n", currentTimeStamp, LOOK_MAX ); //cleanLookahead(); } iterCounter = 0; for( i = 0; i < lookaheadArrayLength; i++ ) { iterTmp = iterCounter; varnr = lookaheadArray[ i ]; if( varnr == lastChanged ) break; if( IS_FORCED(varnr) ) continue; lookAheadCount++; for( sign = 1; sign >= -1; sign -= 2 ) { nrval = varnr * sign; currentTimeStamp += 2; if( look_IFIUP(nrval) == UNSAT ) { if( look_fix_forced_literal(-nrval) == UNSAT ) return UNSAT; lastChanged = varnr; continue; } #ifdef AUTARKY if( new_binaries == 0 ) { look_fix_forced_literal(nrval); lastChanged = varnr; continue; } #endif NBCounter [ nrval ] = new_binaries; WNBCounter[ nrval ] = weighted_new_binaries; #ifdef DOUBLELOOK if( check_doublelook( nrval ) == UNSAT ) return UNSAT; if( IS_FORCED( nrval ) ) { lastChanged = varnr; continue; } #endif for( j = 2; j < BinaryImp[ -nrval ][ 0 ]; j++ ) { imp = BinaryImp[ -nrval ][ j ]; if( timeAssignments[ imp ] == currentTimeStamp ) { necessary_assignments++; if( look_fix_forced_literal(imp) == UNSAT ) return UNSAT; } } } } #ifdef ITERATE_LOOKAHEAD } while( iterCounter ); #endif return SAT; }
int tree_lookahead() { int i, _forced_literals, _hyper_bins; struct treeNode _treeNode, *_treeArray; forced_literals = 0; hyper_bins = 0; lastChanged = 0; init_lookahead_procedure(); if( treebased_lookahead() == UNSAT ) return UNSAT; #ifdef ITERATE_LOOKAHEAD do { _forced_literals = forced_literals; _hyper_bins = hyper_bins; if( depth == 0 ) { // for( i = 1; i <= nrofvars; i++ ) { hyperTRD[ i ] = 0; hyperTRD[ -i ] = 0; } // transitive_red( ); // transitive_reduction( ); // clean_bImp(); lastChanged = 0; } #endif _treeArray = treeArray; for( i = tree_elements-1; i >= 0; i-- ) { _treeNode = *(_treeArray++); if( _treeNode.literal == lastChanged ) { if( depth == 0 ) printf("c found %i NHBRs\n", hyper_bins ); return SAT; } currentTimeStamp += _treeNode.gap; if( currentTimeStamp >= LOOK_MAX ) { currentTimeStamp -= _treeNode.gap; // is dit nodig? return SAT; } if( treelookvar(_treeNode.literal) == UNSAT ) { if( depth == 0 ) printf("c found %i NHBRs\n", hyper_bins ); return UNSAT; } currentTimeStamp -= _treeNode.gap; if( forced_literals > _forced_literals ) { if( IS_FIXED( _treeNode.literal ) && ( Rank[NR(_treeNode.literal)] < Rank_trigger) ) { Rank_trigger = Rank[NR(_treeNode.literal)]; printf("c forced var with Rank %i\n", Rank_trigger ); } _forced_literals = forced_literals; lastChanged = _treeNode.literal; } if( (depth == 0) && (hyper_bins > _hyper_bins) ) { _hyper_bins = hyper_bins; lastChanged = _treeNode.literal; } } #ifdef ITERATE_LOOKAHEAD currentTimeStamp += 2 * tree_elements; if( (depth == 0) && (lastChanged != 0) ) { if( treebased_lookahead() == UNSAT ) return UNSAT; } } while( lastChanged != 0 ); #endif if( depth == 0 ) printf("c found %i NHBRs\n", hyper_bins ); return SAT; }