| /**CFile**************************************************************** |
| |
| FileName [msatSort.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 [Sorting clauses.] |
| |
| Author [Alan Mishchenko <alanmi@eecs.berkeley.edu>] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - January 1, 2004.] |
| |
| Revision [$Id: msatSort.c,v 1.0 2004/01/01 1:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "msatInt.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| static int Msat_SolverSortCompare( Msat_Clause_t ** ppC1, Msat_Clause_t ** ppC2 ); |
| |
| // Returns a random float 0 <= x < 1. Seed must never be 0. |
| static double drand(double seed) { |
| int q; |
| seed *= 1389796; |
| q = (int)(seed / 2147483647); |
| seed -= (double)q * 2147483647; |
| return seed / 2147483647; } |
| |
| // Returns a random integer 0 <= x < size. Seed must never be 0. |
| static int irand(double seed, int size) { |
| return (int)(drand(seed) * size); } |
| |
| static void Msat_SolverSort( Msat_Clause_t ** array, int size, double seed ); |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Msat_SolverSort the learned clauses in the increasing order of activity.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Msat_SolverSortDB( Msat_Solver_t * p ) |
| { |
| Msat_ClauseVec_t * pVecClauses; |
| Msat_Clause_t ** pLearned; |
| int nLearned; |
| // read the parameters |
| pVecClauses = Msat_SolverReadLearned( p ); |
| nLearned = Msat_ClauseVecReadSize( pVecClauses ); |
| pLearned = Msat_ClauseVecReadArray( pVecClauses ); |
| // Msat_SolverSort the array |
| // qMsat_SolverSort( (void *)pLearned, nLearned, sizeof(Msat_Clause_t *), |
| // (int (*)(const void *, const void *)) Msat_SolverSortCompare ); |
| // printf( "Msat_SolverSorting.\n" ); |
| Msat_SolverSort( pLearned, nLearned, 91648253 ); |
| /* |
| if ( nLearned > 2 ) |
| { |
| printf( "Clause 1: %0.20f\n", Msat_ClauseReadActivity(pLearned[0]) ); |
| printf( "Clause 2: %0.20f\n", Msat_ClauseReadActivity(pLearned[1]) ); |
| printf( "Clause 3: %0.20f\n", Msat_ClauseReadActivity(pLearned[2]) ); |
| } |
| */ |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Comparison procedure for two clauses.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Msat_SolverSortCompare( Msat_Clause_t ** ppC1, Msat_Clause_t ** ppC2 ) |
| { |
| float Value1 = Msat_ClauseReadActivity( *ppC1 ); |
| float Value2 = Msat_ClauseReadActivity( *ppC2 ); |
| if ( Value1 < Value2 ) |
| return -1; |
| if ( Value1 > Value2 ) |
| return 1; |
| return 0; |
| } |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [Selection sort for small array size.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Msat_SolverSortSelection( Msat_Clause_t ** array, int size ) |
| { |
| Msat_Clause_t * tmp; |
| int i, j, best_i; |
| for ( i = 0; i < size-1; i++ ) |
| { |
| best_i = i; |
| for (j = i+1; j < size; j++) |
| { |
| if ( Msat_ClauseReadActivity(array[j]) < Msat_ClauseReadActivity(array[best_i]) ) |
| best_i = j; |
| } |
| tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp; |
| } |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [The original MiniSat sorting procedure.] |
| |
| Description [This procedure is used to preserve trace-equivalence |
| with the orignal C++ implemenation of the solver.] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Msat_SolverSort( Msat_Clause_t ** array, int size, double seed ) |
| { |
| if (size <= 15) |
| Msat_SolverSortSelection( array, size ); |
| else |
| { |
| Msat_Clause_t * pivot = array[irand(seed, size)]; |
| Msat_Clause_t * tmp; |
| int i = -1; |
| int j = size; |
| |
| for(;;) |
| { |
| do i++; while( Msat_ClauseReadActivity(array[i]) < Msat_ClauseReadActivity(pivot) ); |
| do j--; while( Msat_ClauseReadActivity(pivot) < Msat_ClauseReadActivity(array[j]) ); |
| |
| if ( i >= j ) break; |
| |
| tmp = array[i]; array[i] = array[j]; array[j] = tmp; |
| } |
| Msat_SolverSort(array , i , seed); |
| Msat_SolverSort(&array[i], size-i, seed); |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |