ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
msatSort.c
Go to the documentation of this file.
1
20
21#include "msatInt.h"
22
24
25
29
30static int Msat_SolverSortCompare( Msat_Clause_t ** ppC1, Msat_Clause_t ** ppC2 );
31
32// Returns a random float 0 <= x < 1. Seed must never be 0.
33static double drand(double seed) {
34 int q;
35 seed *= 1389796;
36 q = (int)(seed / 2147483647);
37 seed -= (double)q * 2147483647;
38 return seed / 2147483647; }
39
40// Returns a random integer 0 <= x < size. Seed must never be 0.
41static int irand(double seed, int size) {
42 return (int)(drand(seed) * size); }
43
44static void Msat_SolverSort( Msat_Clause_t ** array, int size, double seed );
45
49
62{
63 Msat_ClauseVec_t * pVecClauses;
64 Msat_Clause_t ** pLearned;
65 int nLearned;
66 // read the parameters
67 pVecClauses = Msat_SolverReadLearned( p );
68 nLearned = Msat_ClauseVecReadSize( pVecClauses );
69 pLearned = Msat_ClauseVecReadArray( pVecClauses );
70 // Msat_SolverSort the array
71// qMsat_SolverSort( (void *)pLearned, nLearned, sizeof(Msat_Clause_t *),
72// (int (*)(const void *, const void *)) Msat_SolverSortCompare );
73// printf( "Msat_SolverSorting.\n" );
74 Msat_SolverSort( pLearned, nLearned, 91648253 );
75/*
76 if ( nLearned > 2 )
77 {
78 printf( "Clause 1: %0.20f\n", Msat_ClauseReadActivity(pLearned[0]) );
79 printf( "Clause 2: %0.20f\n", Msat_ClauseReadActivity(pLearned[1]) );
80 printf( "Clause 3: %0.20f\n", Msat_ClauseReadActivity(pLearned[2]) );
81 }
82*/
83}
84
96int Msat_SolverSortCompare( Msat_Clause_t ** ppC1, Msat_Clause_t ** ppC2 )
97{
98 float Value1 = Msat_ClauseReadActivity( *ppC1 );
99 float Value2 = Msat_ClauseReadActivity( *ppC2 );
100 if ( Value1 < Value2 )
101 return -1;
102 if ( Value1 > Value2 )
103 return 1;
104 return 0;
105}
106
107
119void Msat_SolverSortSelection( Msat_Clause_t ** array, int size )
120{
121 Msat_Clause_t * tmp;
122 int i, j, best_i;
123 for ( i = 0; i < size-1; i++ )
124 {
125 best_i = i;
126 for (j = i+1; j < size; j++)
127 {
128 if ( Msat_ClauseReadActivity(array[j]) < Msat_ClauseReadActivity(array[best_i]) )
129 best_i = j;
130 }
131 tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp;
132 }
133}
134
147void Msat_SolverSort( Msat_Clause_t ** array, int size, double seed )
148{
149 if (size <= 15)
150 Msat_SolverSortSelection( array, size );
151 else
152 {
153 Msat_Clause_t * pivot = array[irand(seed, size)];
154 Msat_Clause_t * tmp;
155 int i = -1;
156 int j = size;
157
158 for(;;)
159 {
160 do i++; while( Msat_ClauseReadActivity(array[i]) < Msat_ClauseReadActivity(pivot) );
161 do j--; while( Msat_ClauseReadActivity(pivot) < Msat_ClauseReadActivity(array[j]) );
162
163 if ( i >= j ) break;
164
165 tmp = array[i]; array[i] = array[j]; array[j] = tmp;
166 }
167 Msat_SolverSort(array , i , seed);
168 Msat_SolverSort(&array[i], size-i, seed);
169 }
170}
171
175
176
178
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Cube * p
Definition exorList.c:222
Cube ** ppC2
Definition exorList.c:1014
Cube ** ppC1
Definition exorList.c:1013
int Msat_ClauseVecReadSize(Msat_ClauseVec_t *p)
Msat_Clause_t ** Msat_ClauseVecReadArray(Msat_ClauseVec_t *p)
float Msat_ClauseReadActivity(Msat_Clause_t *pC)
Definition msatClause.c:295
typedefABC_NAMESPACE_HEADER_START struct Msat_Clause_t_ Msat_Clause_t
INCLUDES ///.
Definition msatInt.h:57
Msat_ClauseVec_t * Msat_SolverReadLearned(Msat_Solver_t *p)
void Msat_SolverSortDB(Msat_Solver_t *p)
FUNCTION DEFINITIONS ///.
Definition msatSort.c:61
void Msat_SolverSortSelection(Msat_Clause_t **array, int size)
Definition msatSort.c:119
struct Msat_ClauseVec_t_ Msat_ClauseVec_t
Definition msat.h:46
typedefABC_NAMESPACE_HEADER_START struct Msat_Solver_t_ Msat_Solver_t
INCLUDES ///.
Definition msat.h:42
unsigned long long size
Definition giaNewBdd.h:39