Exemple #1
0
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;
}
Exemple #2
0
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;
}