summaryrefslogtreecommitdiffstats
path: root/src/sat/msat/msatOrderJ.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sat/msat/msatOrderJ.c')
-rw-r--r--src/sat/msat/msatOrderJ.c472
1 files changed, 0 insertions, 472 deletions
diff --git a/src/sat/msat/msatOrderJ.c b/src/sat/msat/msatOrderJ.c
deleted file mode 100644
index 4db7ff7b..00000000
--- a/src/sat/msat/msatOrderJ.c
+++ /dev/null
@@ -1,472 +0,0 @@
-/**CFile****************************************************************
-
- FileName [msatOrder.c]
-
- PackageName [A C version of SAT solver MINISAT, originally developed
- in C++ by Niklas Een and Niklas Sorensson, Chalmers University of
- Technology, Sweden: http://www.cs.chalmers.se/~een/Satzoo.]
-
- Synopsis [The manager of variable assignment.]
-
- Author [Alan Mishchenko <alanmi@eecs.berkeley.edu>]
-
- Affiliation [UC Berkeley]
-
- Date [Ver. 1.0. Started - January 1, 2004.]
-
- Revision [$Id: msatOrder.c,v 1.0 2005/05/30 1:00:00 alanmi Exp $]
-
-***********************************************************************/
-
-#include "msatInt.h"
-
-/*
-The J-boundary (justification boundary) is defined as a set of unassigned
-variables belonging to the cone of interest, such that for each of them,
-there exist an adjacent assigned variable in the cone of interest.
-*/
-
-////////////////////////////////////////////////////////////////////////
-/// DECLARATIONS ///
-////////////////////////////////////////////////////////////////////////
-
-typedef struct Msat_OrderVar_t_ Msat_OrderVar_t;
-typedef struct Msat_OrderRing_t_ Msat_OrderRing_t;
-
-// the variable data structure
-struct Msat_OrderVar_t_
-{
- Msat_OrderVar_t * pNext;
- Msat_OrderVar_t * pPrev;
- int Num;
-};
-
-// the ring of variables data structure (J-boundary)
-struct Msat_OrderRing_t_
-{
- Msat_OrderVar_t * pRoot;
- int nItems;
-};
-
-// the variable package data structure
-struct Msat_Order_t_
-{
- Msat_Solver_t * pSat; // the SAT solver
- Msat_OrderVar_t * pVars; // the storage for variables
- int nVarsAlloc; // the number of variables allocated
- Msat_OrderRing_t rVars; // the J-boundary as a ring of variables
-};
-
-//The solver can communicate to the variable order the following parts:
-//- the array of current assignments (pSat->pAssigns)
-//- the array of variable activities (pSat->pdActivity)
-//- the array of variables currently in the cone (pSat->vConeVars)
-//- the array of arrays of variables adjucent to each(pSat->vAdjacents)
-
-#define Msat_OrderVarIsInBoundary( p, i ) ((p)->pVars[i].pNext)
-#define Msat_OrderVarIsAssigned( p, i ) ((p)->pSat->pAssigns[i] != MSAT_VAR_UNASSIGNED)
-#define Msat_OrderVarIsUsedInCone( p, i ) ((p)->pSat->vVarsUsed->pArray[i])
-
-// iterator through the entries in J-boundary
-#define Msat_OrderRingForEachEntry( pRing, pVar, pNext ) \
- for ( pVar = pRing, \
- pNext = pVar? pVar->pNext : NULL; \
- pVar; \
- pVar = (pNext != pRing)? pNext : NULL, \
- pNext = pVar? pVar->pNext : NULL )
-
-static void Msat_OrderRingAddLast( Msat_OrderRing_t * pRing, Msat_OrderVar_t * pVar );
-static void Msat_OrderRingRemove( Msat_OrderRing_t * pRing, Msat_OrderVar_t * pVar );
-
-extern int timeSelect;
-extern int timeAssign;
-
-////////////////////////////////////////////////////////////////////////
-/// FUNCTION DEFINITIONS ///
-////////////////////////////////////////////////////////////////////////
-
-/**Function*************************************************************
-
- Synopsis [Allocates the ordering structure.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Msat_Order_t * Msat_OrderAlloc( Msat_Solver_t * pSat )
-{
- Msat_Order_t * p;
- p = ALLOC( Msat_Order_t, 1 );
- memset( p, 0, sizeof(Msat_Order_t) );
- p->pSat = pSat;
- Msat_OrderSetBounds( p, pSat->nVarsAlloc );
- return p;
-}
-
-/**Function*************************************************************
-
- Synopsis [Sets the bound of the ordering structure.]
-
- Description [Should be called whenever the SAT solver is resized.]
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Msat_OrderSetBounds( Msat_Order_t * p, int nVarsMax )
-{
- int i;
- // add variables if they are missing
- if ( p->nVarsAlloc < nVarsMax )
- {
- p->pVars = REALLOC( Msat_OrderVar_t, p->pVars, nVarsMax );
- for ( i = p->nVarsAlloc; i < nVarsMax; i++ )
- {
- p->pVars[i].pNext = p->pVars[i].pPrev = NULL;
- p->pVars[i].Num = i;
- }
- p->nVarsAlloc = nVarsMax;
- }
-}
-
-/**Function*************************************************************
-
- Synopsis [Cleans the ordering structure.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Msat_OrderClean( Msat_Order_t * p, Msat_IntVec_t * vCone )
-{
- Msat_OrderVar_t * pVar, * pNext;
- // quickly undo the ring
- Msat_OrderRingForEachEntry( p->rVars.pRoot, pVar, pNext )
- pVar->pNext = pVar->pPrev = NULL;
- p->rVars.pRoot = NULL;
- p->rVars.nItems = 0;
-}
-
-/**Function*************************************************************
-
- Synopsis [Checks that the J-boundary is okay.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-int Msat_OrderCheck( Msat_Order_t * p )
-{
- Msat_OrderVar_t * pVar, * pNext;
- Msat_IntVec_t * vRound;
- int * pRound, nRound;
- int * pVars, nVars, i, k;
- int Counter = 0;
-
- // go through all the variables in the boundary
- Msat_OrderRingForEachEntry( p->rVars.pRoot, pVar, pNext )
- {
- assert( !Msat_OrderVarIsAssigned(p, pVar->Num) );
- // go though all the variables in the neighborhood
- // and check that it is true that there is least one assigned
- vRound = (Msat_IntVec_t *)Msat_ClauseVecReadEntry( p->pSat->vAdjacents, pVar->Num );
- nRound = Msat_IntVecReadSize( vRound );
- pRound = Msat_IntVecReadArray( vRound );
- for ( i = 0; i < nRound; i++ )
- {
- if ( !Msat_OrderVarIsUsedInCone(p, pRound[i]) )
- continue;
- if ( Msat_OrderVarIsAssigned(p, pRound[i]) )
- break;
- }
-// assert( i != nRound );
-// if ( i == nRound )
-// return 0;
- if ( i == nRound )
- Counter++;
- }
- if ( Counter > 0 )
- printf( "%d(%d) ", Counter, p->rVars.nItems );
-
- // we may also check other unassigned variables in the cone
- // to make sure that if they are not in J-boundary,
- // then they do not have an assigned neighbor
- nVars = Msat_IntVecReadSize( p->pSat->vConeVars );
- pVars = Msat_IntVecReadArray( p->pSat->vConeVars );
- for ( i = 0; i < nVars; i++ )
- {
- assert( Msat_OrderVarIsUsedInCone(p, pVars[i]) );
- // skip assigned vars, vars in the boundary, and vars not used in the cone
- if ( Msat_OrderVarIsAssigned(p, pVars[i]) ||
- Msat_OrderVarIsInBoundary(p, pVars[i]) )
- continue;
- // make sure, it does not have assigned neighbors
- vRound = (Msat_IntVec_t *)Msat_ClauseVecReadEntry( p->pSat->vAdjacents, pVars[i] );
- nRound = Msat_IntVecReadSize( vRound );
- pRound = Msat_IntVecReadArray( vRound );
- for ( k = 0; k < nRound; k++ )
- {
- if ( !Msat_OrderVarIsUsedInCone(p, pRound[k]) )
- continue;
- if ( Msat_OrderVarIsAssigned(p, pRound[k]) )
- break;
- }
-// assert( k == nRound );
-// if ( k != nRound )
-// return 0;
- }
- return 1;
-}
-
-/**Function*************************************************************
-
- Synopsis [Frees the ordering structure.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Msat_OrderFree( Msat_Order_t * p )
-{
- free( p->pVars );
- free( p );
-}
-
-/**Function*************************************************************
-
- Synopsis [Selects the next variable to assign.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-int Msat_OrderVarSelect( Msat_Order_t * p )
-{
- Msat_OrderVar_t * pVar, * pNext, * pVarBest;
- double * pdActs = p->pSat->pdActivity;
- double dfActBest;
-// int clk = clock();
-
- pVarBest = NULL;
- dfActBest = -1.0;
- Msat_OrderRingForEachEntry( p->rVars.pRoot, pVar, pNext )
- {
- if ( dfActBest < pdActs[pVar->Num] )
- {
- dfActBest = pdActs[pVar->Num];
- pVarBest = pVar;
- }
- }
-//timeSelect += clock() - clk;
-//timeAssign += clock() - clk;
-
-//if ( pVarBest && pVarBest->Num % 1000 == 0 )
-//printf( "%d ", p->rVars.nItems );
-
-// Msat_OrderCheck( p );
- if ( pVarBest )
- {
- assert( Msat_OrderVarIsUsedInCone(p, pVarBest->Num) );
- return pVarBest->Num;
- }
- return MSAT_ORDER_UNKNOWN;
-}
-
-/**Function*************************************************************
-
- Synopsis [Updates J-boundary when the variable is assigned.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Msat_OrderVarAssigned( Msat_Order_t * p, int Var )
-{
- Msat_IntVec_t * vRound;
- int i;//, clk = clock();
-
- // make sure the variable is in the boundary
- assert( Var < p->nVarsAlloc );
- // if it is not in the boundary (initial decision, random decision), do not remove
- if ( Msat_OrderVarIsInBoundary( p, Var ) )
- Msat_OrderRingRemove( &p->rVars, &p->pVars[Var] );
- // add to the boundary those neighbors that are (1) unassigned, (2) not in boundary
- // because for them we know that there is a variable (Var) which is assigned
- vRound = (Msat_IntVec_t *)p->pSat->vAdjacents->pArray[Var];
- for ( i = 0; i < vRound->nSize; i++ )
- {
- if ( !Msat_OrderVarIsUsedInCone(p, vRound->pArray[i]) )
- continue;
- if ( Msat_OrderVarIsAssigned(p, vRound->pArray[i]) )
- continue;
- if ( Msat_OrderVarIsInBoundary(p, vRound->pArray[i]) )
- continue;
- Msat_OrderRingAddLast( &p->rVars, &p->pVars[vRound->pArray[i]] );
- }
-//timeSelect += clock() - clk;
-// Msat_OrderCheck( p );
-}
-
-/**Function*************************************************************
-
- Synopsis [Updates the order after a variable is unassigned.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Msat_OrderVarUnassigned( Msat_Order_t * p, int Var )
-{
- Msat_IntVec_t * vRound, * vRound2;
- int i, k;//, clk = clock();
-
- // make sure the variable is not in the boundary
- assert( Var < p->nVarsAlloc );
- assert( !Msat_OrderVarIsInBoundary( p, Var ) );
- // go through its neigbors - if one of them is assigned add this var
- // add to the boundary those neighbors that are not there already
- // this will also get rid of variable outside of the current cone
- // because they are unassigned in Msat_SolverPrepare()
- vRound = (Msat_IntVec_t *)p->pSat->vAdjacents->pArray[Var];
- for ( i = 0; i < vRound->nSize; i++ )
- if ( Msat_OrderVarIsAssigned(p, vRound->pArray[i]) )
- break;
- if ( i != vRound->nSize )
- Msat_OrderRingAddLast( &p->rVars, &p->pVars[Var] );
-
- // unassigning a variable may lead to its adjacents dropping from the boundary
- for ( i = 0; i < vRound->nSize; i++ )
- if ( Msat_OrderVarIsInBoundary(p, vRound->pArray[i]) )
- { // the neighbor is in the J-boundary (and unassigned)
- assert( !Msat_OrderVarIsAssigned(p, vRound->pArray[i]) );
- vRound2 = (Msat_IntVec_t *)p->pSat->vAdjacents->pArray[vRound->pArray[i]];
- // go through its neighbors and determine if there is at least one assigned
- for ( k = 0; k < vRound2->nSize; k++ )
- if ( Msat_OrderVarIsAssigned(p, vRound2->pArray[k]) )
- break;
- if ( k == vRound2->nSize ) // there is no assigned vars, delete this one
- Msat_OrderRingRemove( &p->rVars, &p->pVars[vRound->pArray[i]] );
- }
-//timeSelect += clock() - clk;
-// Msat_OrderCheck( p );
-}
-
-/**Function*************************************************************
-
- Synopsis [Updates the order after a variable changed weight.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Msat_OrderUpdate( Msat_Order_t * p, int Var )
-{
-}
-
-
-/**Function*************************************************************
-
- Synopsis [Adds node to the end of the ring.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Msat_OrderRingAddLast( Msat_OrderRing_t * pRing, Msat_OrderVar_t * pVar )
-{
-//printf( "adding %d\n", pVar->Num );
- // check that the node is not in a ring
- assert( pVar->pPrev == NULL );
- assert( pVar->pNext == NULL );
- // if the ring is empty, make the node point to itself
- pRing->nItems++;
- if ( pRing->pRoot == NULL )
- {
- pRing->pRoot = pVar;
- pVar->pPrev = pVar;
- pVar->pNext = pVar;
- return;
- }
- // if the ring is not empty, add it as the last entry
- pVar->pPrev = pRing->pRoot->pPrev;
- pVar->pNext = pRing->pRoot;
- pVar->pPrev->pNext = pVar;
- pVar->pNext->pPrev = pVar;
-
- // move the root so that it points to the new entry
-// pRing->pRoot = pRing->pRoot->pPrev;
-}
-
-/**Function*************************************************************
-
- Synopsis [Removes the node from the ring.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Msat_OrderRingRemove( Msat_OrderRing_t * pRing, Msat_OrderVar_t * pVar )
-{
-//printf( "removing %d\n", pVar->Num );
- // check that the var is in a ring
- assert( pVar->pPrev );
- assert( pVar->pNext );
- pRing->nItems--;
- if ( pRing->nItems == 0 )
- {
- assert( pRing->pRoot == pVar );
- pVar->pPrev = NULL;
- pVar->pNext = NULL;
- pRing->pRoot = NULL;
- return;
- }
- // move the root if needed
- if ( pRing->pRoot == pVar )
- pRing->pRoot = pVar->pNext;
- // move the root to the next entry after pVar
- // this way all the additions to the list will be traversed first
-// pRing->pRoot = pVar->pPrev;
- // delete the node
- pVar->pPrev->pNext = pVar->pNext;
- pVar->pNext->pPrev = pVar->pPrev;
- pVar->pPrev = NULL;
- pVar->pNext = NULL;
-}
-
-
-////////////////////////////////////////////////////////////////////////
-/// END OF FILE ///
-////////////////////////////////////////////////////////////////////////
-
-