Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
abc
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
abc
Commits
b5c3992b
Commit
b5c3992b
authored
Dec 08, 2011
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Proof-logging in the updated solver.
parent
c985e17d
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
334 additions
and
133 deletions
+334
-133
src/sat/bsat/satProof.c
+332
-131
src/sat/bsat/satSolver2.c
+1
-1
src/sat/bsat/satSolver2.h
+1
-1
No files found.
src/sat/bsat/satProof.c
View file @
b5c3992b
...
...
@@ -34,8 +34,70 @@ ABC_NAMESPACE_IMPL_START
Root clauses are given by their handles.
They are marked by bitshifting by 2 bits up and setting the LSB to 1
*/
/*
// data-structure to record resolvents of the proof
typedef
struct
Rec_Int_t_
Rec_Int_t
;
struct
Rec_Int_t_
{
int
nShift
;
// log number of entries on a page
int
Mask
;
// mask for entry number on a page
int
nSize
;
// the total number of entries
int
nLast
;
// the total number of entries before last append
Vec_Ptr_t
*
vPages
;
// memory pages
};
static
inline
Rec_Int_t
*
Rec_IntAlloc
(
int
nShift
)
{
Rec_Int_t
*
p
;
p
=
ABC_CALLOC
(
Rec_Int_t
,
1
);
p
->
nShift
=
nShift
;
p
->
Mask
=
(
1
<<
nShift
)
-
1
;
p
->
vPages
=
Vec_PtrAlloc
(
50
);
return
p
;
}
static
inline
int
Rec_IntSize
(
Rec_Int_t
*
p
)
{
return
p
->
nSize
;
}
static
inline
int
Rec_IntSizeLast
(
Rec_Int_t
*
p
)
{
return
p
->
nLast
;
}
static
inline
void
Rec_IntPush
(
Rec_Int_t
*
p
,
int
Entry
)
{
if
(
(
p
->
nSize
>>
p
->
nShift
)
==
Vec_PtrSize
(
p
->
vPages
)
)
Vec_PtrPush
(
p
->
vPages
,
ABC_ALLOC
(
int
,
p
->
Mask
+
1
)
);
((
int
*
)
p
->
vPages
->
pArray
[
p
->
nSize
>>
p
->
nShift
])[
p
->
nSize
++
&
p
->
Mask
]
=
Entry
;
}
static
inline
void
Rec_IntAppend
(
Rec_Int_t
*
p
,
int
*
pArray
,
int
nSize
)
{
assert
(
nSize
<=
p
->
Mask
);
if
(
(
p
->
nSize
&
p
->
Mask
)
+
nSize
>=
p
->
Mask
)
{
Rec_IntPush
(
p
,
0
);
p
->
nSize
=
((
p
->
nSize
>>
p
->
nShift
)
+
1
)
*
(
p
->
Mask
+
1
);
}
if
(
(
p
->
nSize
>>
p
->
nShift
)
==
Vec_PtrSize
(
p
->
vPages
)
)
Vec_PtrPush
(
p
->
vPages
,
ABC_ALLOC
(
int
,
p
->
Mask
+
1
)
);
// assert( (p->nSize >> p->nShift) + 1 == Vec_PtrSize(p->vPages) );
memmove
(
(
int
*
)
p
->
vPages
->
pArray
[
p
->
nSize
>>
p
->
nShift
]
+
(
p
->
nSize
&
p
->
Mask
),
pArray
,
sizeof
(
int
)
*
nSize
);
p
->
nLast
=
p
->
nSize
;
p
->
nSize
+=
nSize
;
}
static
inline
int
Rec_IntEntry
(
Rec_Int_t
*
p
,
int
i
)
{
return
((
int
*
)
p
->
vPages
->
pArray
[
i
>>
p
->
nShift
])[
i
&
p
->
Mask
];
}
static
inline
int
*
Rec_IntEntryP
(
Rec_Int_t
*
p
,
int
i
)
{
return
(
int
*
)
p
->
vPages
->
pArray
[
i
>>
p
->
nShift
]
+
(
i
&
p
->
Mask
);
}
static
inline
void
Rec_IntFree
(
Rec_Int_t
*
p
)
{
Vec_PtrFreeFree
(
p
->
vPages
);
ABC_FREE
(
p
);
}
/*
typedef struct satset_t satset;
struct satset_t
{
...
...
@@ -55,10 +117,12 @@ struct satset_t
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
static
inline
satset
*
Proof_NodeRead
(
Vec_Int_t
*
p
,
cla
h
)
{
return
satset_read
(
(
veci
*
)
p
,
h
);
}
static
inline
cla
Proof_NodeHandle
(
Vec_Int_t
*
p
,
satset
*
c
)
{
return
satset_handle
(
(
veci
*
)
p
,
c
);
}
static
inline
int
Proof_NodeCheck
(
Vec_Int_t
*
p
,
satset
*
c
)
{
return
satset_check
(
(
veci
*
)
p
,
c
);
}
static
inline
int
Proof_NodeSize
(
int
nEnts
)
{
return
sizeof
(
satset
)
/
4
+
nEnts
;
}
static
inline
satset
*
Proof_NodeRead
(
Vec_Int_t
*
p
,
cla
h
)
{
return
satset_read
(
(
veci
*
)
p
,
h
);
}
static
inline
cla
Proof_NodeHandle
(
Vec_Int_t
*
p
,
satset
*
c
)
{
return
satset_handle
(
(
veci
*
)
p
,
c
);
}
static
inline
int
Proof_NodeCheck
(
Vec_Int_t
*
p
,
satset
*
c
)
{
return
satset_check
(
(
veci
*
)
p
,
c
);
}
static
inline
int
Proof_NodeSize
(
int
nEnts
)
{
return
sizeof
(
satset
)
/
4
+
nEnts
;
}
static
inline
satset
*
Proof_ResolveRead
(
Rec_Int_t
*
p
,
cla
h
)
{
return
(
satset
*
)
Rec_IntEntryP
(
p
,
h
);
}
// iterating through nodes in the proof
#define Proof_ForeachNode( p, pNode, h ) \
...
...
@@ -74,6 +138,7 @@ static inline int Proof_NodeSize (int nEnts) { return sizeo
#define Proof_NodeForeachFaninLeaf( p, pLeaves, pNode, pFanin, i ) \
for ( i = 0; (i < (int)pNode->nEnts) && ((pFanin) = (pNode->pEnts[i] & 1) ? Proof_NodeRead(pLeaves, pNode->pEnts[i] >> 2) : Proof_NodeRead(p, pNode->pEnts[i] >> 2)); i++ )
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
...
...
@@ -289,132 +354,9 @@ Vec_Int_t * Proof_CollectUsedRec( Vec_Int_t * vProof, Vec_Int_t * vRoots, int hR
}
return
vUsed
;
}
/**Function*************************************************************
Synopsis [Performs one resultion step.]
Description [Returns ID of the resolvent if success, and -1 if failure.]
SideEffects []
SeeAlso []
***********************************************************************/
satset
*
Proof_ResolveOne
(
Vec_Int_t
*
p
,
satset
*
c1
,
satset
*
c2
,
Vec_Int_t
*
vTemp
)
{
satset
*
c
;
int
i
,
k
,
hNode
,
Var
=
-
1
,
Count
=
0
;
// find resolution variable
for
(
i
=
0
;
i
<
(
int
)
c1
->
nEnts
;
i
++
)
for
(
k
=
0
;
k
<
(
int
)
c2
->
nEnts
;
k
++
)
if
(
(
c1
->
pEnts
[
i
]
^
c2
->
pEnts
[
k
])
==
1
)
{
Var
=
(
c1
->
pEnts
[
i
]
>>
1
);
Count
++
;
}
if
(
Count
==
0
)
{
printf
(
"Cannot find resolution variable
\n
"
);
return
NULL
;
}
if
(
Count
>
1
)
{
printf
(
"Found more than 1 resolution variables
\n
"
);
return
NULL
;
}
// perform resolution
Vec_IntClear
(
vTemp
);
for
(
i
=
0
;
i
<
(
int
)
c1
->
nEnts
;
i
++
)
if
(
(
c1
->
pEnts
[
i
]
>>
1
)
!=
Var
)
Vec_IntPush
(
vTemp
,
c1
->
pEnts
[
i
]
);
for
(
i
=
0
;
i
<
(
int
)
c2
->
nEnts
;
i
++
)
if
(
(
c2
->
pEnts
[
i
]
>>
1
)
!=
Var
)
Vec_IntPushUnique
(
vTemp
,
c2
->
pEnts
[
i
]
);
// move to the new one
hNode
=
Vec_IntSize
(
p
);
Vec_IntPush
(
p
,
0
);
// placeholder
Vec_IntPush
(
p
,
0
);
Vec_IntForEachEntry
(
vTemp
,
Var
,
i
)
Vec_IntPush
(
p
,
Var
);
c
=
Proof_NodeRead
(
p
,
hNode
);
c
->
nEnts
=
Vec_IntSize
(
vTemp
);
return
c
;
}
/**Function*************************************************************
Synopsis [Checks the proof for consitency.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
satset
*
Proof_CheckReadOne
(
Vec_Int_t
*
vClauses
,
Vec_Int_t
*
vProof
,
Vec_Int_t
*
vResolves
,
int
iAnt
)
{
satset
*
pAnt
;
if
(
iAnt
&
1
)
return
Proof_NodeRead
(
vClauses
,
iAnt
>>
2
);
assert
(
iAnt
>
0
);
pAnt
=
Proof_NodeRead
(
vProof
,
iAnt
>>
2
);
assert
(
pAnt
->
Id
>
0
);
return
Proof_NodeRead
(
vResolves
,
pAnt
->
Id
);
}
/**Function*************************************************************
Synopsis [Checks the proof for consitency.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Proof_Check
(
Vec_Int_t
*
vClauses
,
Vec_Int_t
*
vProof
,
int
hRoot
)
{
Vec_Int_t
*
vUsed
,
*
vResolves
,
*
vTemp
;
satset
*
pSet
,
*
pSet0
,
*
pSet1
;
int
i
,
k
,
Counter
=
0
,
clk
=
clock
();
// collect visited clauses
vUsed
=
Proof_CollectUsedRec
(
vProof
,
NULL
,
hRoot
);
// vUsed = Proof_CollectUsedIter( vProof, NULL, hRoot );
Proof_CleanCollected
(
vProof
,
vUsed
);
// perform resolution steps
vTemp
=
Vec_IntAlloc
(
1000
);
vResolves
=
Vec_IntAlloc
(
1000
);
Vec_IntPush
(
vResolves
,
-
1
);
Proof_ForeachNodeVec
(
vUsed
,
vProof
,
pSet
,
i
)
{
pSet0
=
Proof_CheckReadOne
(
vClauses
,
vProof
,
vResolves
,
pSet
->
pEnts
[
0
]
);
for
(
k
=
1
;
k
<
(
int
)
pSet
->
nEnts
;
k
++
)
{
pSet1
=
Proof_CheckReadOne
(
vClauses
,
vProof
,
vResolves
,
pSet
->
pEnts
[
k
]
);
pSet0
=
Proof_ResolveOne
(
vResolves
,
pSet0
,
pSet1
,
vTemp
);
}
pSet
->
Id
=
Proof_NodeHandle
(
vResolves
,
pSet0
);
//printf( "Clause for proof %d: ", Vec_IntEntry(vUsed, i) );
//satset_print( pSet0 );
Counter
++
;
}
Vec_IntFree
(
vTemp
);
// clean the proof
Proof_CleanCollected
(
vProof
,
vUsed
);
// compare the final clause
printf
(
"Used %6.2f Mb for resolvents.
\n
"
,
4
.
0
*
Vec_IntSize
(
vResolves
)
/
(
1
<<
20
)
);
if
(
pSet0
->
nEnts
>
0
)
printf
(
"Cound not derive the empty clause. "
);
else
printf
(
"Proof verification successful. "
);
Abc_PrintTime
(
1
,
"Time"
,
clock
()
-
clk
);
// cleanup
Vec_IntFree
(
vResolves
);
Vec_IntFree
(
vUsed
);
}
/**Function*************************************************************
...
...
@@ -449,6 +391,7 @@ Vec_Int_t * Sat_ProofCollectCore( Vec_Int_t * vClauses, Vec_Int_t * vProof, Vec_
return
vCore
;
}
/**Function*************************************************************
Synopsis [Computes UNSAT core.]
...
...
@@ -591,10 +534,7 @@ void Sat_ProofReduce( veci * pProof, veci * pRoots )
pNode
->
Id
=
hNewHandle
;
hNewHandle
+=
Proof_NodeSize
(
pNode
->
nEnts
);
Proof_NodeForeachFanin
(
vProof
,
pNode
,
pFanin
,
k
)
if
(
pFanin
)
{
assert
(
(
pNode
->
pEnts
[
k
]
>>
2
)
==
Proof_NodeHandle
(
vProof
,
pFanin
)
);
pNode
->
pEnts
[
k
]
=
(
pFanin
->
Id
<<
2
)
|
(
pNode
->
pEnts
[
k
]
&
2
);
}
}
// update roots
Proof_ForeachNodeVec
(
vRoots
,
vProof
,
pNode
,
i
)
...
...
@@ -618,6 +558,267 @@ void Sat_ProofReduce( veci * pProof, veci * pRoots )
Vec_IntShrink
(
vProof
,
hNewHandle
);
}
#if 0
/**Function*************************************************************
Synopsis [Performs one resultion step.]
Description [Returns ID of the resolvent if success, and -1 if failure.]
SideEffects []
SeeAlso []
***********************************************************************/
satset * Proof_ResolveOne( Vec_Int_t * p, satset * c1, satset * c2, Vec_Int_t * vTemp )
{
satset * c;
int i, k, hNode, Var = -1, Count = 0;
// find resolution variable
for ( i = 0; i < (int)c1->nEnts; i++ )
for ( k = 0; k < (int)c2->nEnts; k++ )
if ( (c1->pEnts[i] ^ c2->pEnts[k]) == 1 )
{
Var = (c1->pEnts[i] >> 1);
Count++;
}
if ( Count == 0 )
{
printf( "Cannot find resolution variable\n" );
return NULL;
}
if ( Count > 1 )
{
printf( "Found more than 1 resolution variables\n" );
return NULL;
}
// perform resolution
Vec_IntClear( vTemp );
for ( i = 0; i < (int)c1->nEnts; i++ )
if ( (c1->pEnts[i] >> 1) != Var )
Vec_IntPush( vTemp, c1->pEnts[i] );
for ( i = 0; i < (int)c2->nEnts; i++ )
if ( (c2->pEnts[i] >> 1) != Var )
Vec_IntPushUnique( vTemp, c2->pEnts[i] );
// move to the new one
hNode = Vec_IntSize( p );
Vec_IntPush( p, 0 ); // placeholder
Vec_IntPush( p, 0 );
Vec_IntForEachEntry( vTemp, Var, i )
Vec_IntPush( p, Var );
c = Proof_NodeRead( p, hNode );
c->nEnts = Vec_IntSize(vTemp);
return c;
}
/**Function*************************************************************
Synopsis [Checks the proof for consitency.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
satset * Proof_CheckReadOne( Vec_Int_t * vClauses, Vec_Int_t * vProof, Vec_Int_t * vResolves, int iAnt )
{
satset * pAnt;
if ( iAnt & 1 )
return Proof_NodeRead( vClauses, iAnt >> 2 );
assert( iAnt > 0 );
pAnt = Proof_NodeRead( vProof, iAnt >> 2 );
assert( pAnt->Id > 0 );
return Proof_NodeRead( vResolves, pAnt->Id );
}
/**Function*************************************************************
Synopsis [Checks the proof for consitency.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Proof_Check( Vec_Int_t * vClauses, Vec_Int_t * vProof, int hRoot )
{
Vec_Int_t * vUsed, * vResolves, * vTemp;
satset * pSet, * pSet0, * pSet1;
int i, k, Counter = 0, clk = clock();
// collect visited clauses
vUsed = Proof_CollectUsedRec( vProof, NULL, hRoot );
// vUsed = Proof_CollectUsedIter( vProof, NULL, hRoot );
Proof_CleanCollected( vProof, vUsed );
// perform resolution steps
vTemp = Vec_IntAlloc( 1000 );
vResolves = Vec_IntAlloc( 1000 );
Vec_IntPush( vResolves, -1 );
Proof_ForeachNodeVec( vUsed, vProof, pSet, i )
{
pSet0 = Proof_CheckReadOne( vClauses, vProof, vResolves, pSet->pEnts[0] );
for ( k = 1; k < (int)pSet->nEnts; k++ )
{
pSet1 = Proof_CheckReadOne( vClauses, vProof, vResolves, pSet->pEnts[k] );
pSet0 = Proof_ResolveOne( vResolves, pSet0, pSet1, vTemp );
}
pSet->Id = Proof_NodeHandle( vResolves, pSet0 );
//printf( "Clause for proof %d: ", Vec_IntEntry(vUsed, i) );
//satset_print( pSet0 );
Counter++;
}
Vec_IntFree( vTemp );
// clean the proof
Proof_CleanCollected( vProof, vUsed );
// compare the final clause
printf( "Used %6.2f Mb for resolvents.\n", 4.0 * Vec_IntSize(vResolves) / (1<<20) );
if ( pSet0->nEnts > 0 )
printf( "Cound not derive the empty clause. " );
else
printf( "Proof verification successful. " );
Abc_PrintTime( 1, "Time", clock() - clk );
// cleanup
Vec_IntFree( vResolves );
Vec_IntFree( vUsed );
}
#endif
/**Function*************************************************************
Synopsis [Performs one resultion step.]
Description [Returns ID of the resolvent if success, and -1 if failure.]
SideEffects []
SeeAlso []
***********************************************************************/
satset
*
Proof_ResolveOne
(
Rec_Int_t
*
p
,
satset
*
c1
,
satset
*
c2
,
Vec_Int_t
*
vTemp
)
{
satset
*
c
;
int
i
,
k
,
Var
=
-
1
,
Count
=
0
;
// find resolution variable
for
(
i
=
0
;
i
<
(
int
)
c1
->
nEnts
;
i
++
)
for
(
k
=
0
;
k
<
(
int
)
c2
->
nEnts
;
k
++
)
if
(
(
c1
->
pEnts
[
i
]
^
c2
->
pEnts
[
k
])
==
1
)
{
Var
=
(
c1
->
pEnts
[
i
]
>>
1
);
Count
++
;
}
if
(
Count
==
0
)
{
printf
(
"Cannot find resolution variable
\n
"
);
return
NULL
;
}
if
(
Count
>
1
)
{
printf
(
"Found more than 1 resolution variables
\n
"
);
return
NULL
;
}
// perform resolution
Vec_IntClear
(
vTemp
);
Vec_IntPush
(
vTemp
,
0
);
// placeholder
Vec_IntPush
(
vTemp
,
0
);
for
(
i
=
0
;
i
<
(
int
)
c1
->
nEnts
;
i
++
)
if
(
(
c1
->
pEnts
[
i
]
>>
1
)
!=
Var
)
Vec_IntPush
(
vTemp
,
c1
->
pEnts
[
i
]
);
for
(
i
=
0
;
i
<
(
int
)
c2
->
nEnts
;
i
++
)
if
(
(
c2
->
pEnts
[
i
]
>>
1
)
!=
Var
)
Vec_IntPushUnique
(
vTemp
,
c2
->
pEnts
[
i
]
);
// create new resolution entry
Rec_IntAppend
(
p
,
Vec_IntArray
(
vTemp
),
Vec_IntSize
(
vTemp
)
);
// return the new entry
c
=
Proof_ResolveRead
(
p
,
Rec_IntSizeLast
(
p
)
);
c
->
nEnts
=
Vec_IntSize
(
vTemp
)
-
2
;
return
c
;
}
/**Function*************************************************************
Synopsis [Checks the proof for consitency.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
satset
*
Proof_CheckReadOne
(
Vec_Int_t
*
vClauses
,
Vec_Int_t
*
vProof
,
Rec_Int_t
*
vResolves
,
int
iAnt
)
{
satset
*
pAnt
;
if
(
iAnt
&
1
)
return
Proof_NodeRead
(
vClauses
,
iAnt
>>
2
);
assert
(
iAnt
>
0
);
pAnt
=
Proof_NodeRead
(
vProof
,
iAnt
>>
2
);
assert
(
pAnt
->
Id
>
0
);
return
Proof_ResolveRead
(
vResolves
,
pAnt
->
Id
);
}
/**Function*************************************************************
Synopsis [Checks the proof for consitency.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Proof_Check
(
Vec_Int_t
*
vClauses
,
Vec_Int_t
*
vProof
,
int
hRoot
)
{
Rec_Int_t
*
vResolves
;
Vec_Int_t
*
vUsed
,
*
vTemp
;
satset
*
pSet
,
*
pSet0
,
*
pSet1
;
int
i
,
k
,
Counter
=
0
,
clk
=
clock
();
// collect visited clauses
// vUsed = Proof_CollectUsedRec( vProof, NULL, hRoot );
vUsed
=
Proof_CollectUsedIter
(
vProof
,
NULL
,
hRoot
);
Proof_CleanCollected
(
vProof
,
vUsed
);
// perform resolution steps
vTemp
=
Vec_IntAlloc
(
1000
);
vResolves
=
Rec_IntAlloc
(
20
);
Rec_IntPush
(
vResolves
,
-
1
);
Proof_ForeachNodeVec
(
vUsed
,
vProof
,
pSet
,
i
)
{
pSet0
=
Proof_CheckReadOne
(
vClauses
,
vProof
,
vResolves
,
pSet
->
pEnts
[
0
]
);
for
(
k
=
1
;
k
<
(
int
)
pSet
->
nEnts
;
k
++
)
{
pSet1
=
Proof_CheckReadOne
(
vClauses
,
vProof
,
vResolves
,
pSet
->
pEnts
[
k
]
);
pSet0
=
Proof_ResolveOne
(
vResolves
,
pSet0
,
pSet1
,
vTemp
);
}
pSet
->
Id
=
Rec_IntSizeLast
(
vResolves
);
//printf( "Clause for proof %d: ", Vec_IntEntry(vUsed, i) );
//satset_print( pSet0 );
Counter
++
;
}
Vec_IntFree
(
vTemp
);
// clean the proof
Proof_CleanCollected
(
vProof
,
vUsed
);
// compare the final clause
printf
(
"Used %6.2f Mb for resolvents.
\n
"
,
4
.
0
*
Rec_IntSize
(
vResolves
)
/
(
1
<<
20
)
);
if
(
pSet0
->
nEnts
>
0
)
printf
(
"Cound not derive the empty clause. "
);
else
printf
(
"Proof verification successful. "
);
Abc_PrintTime
(
1
,
"Time"
,
clock
()
-
clk
);
// cleanup
Rec_IntFree
(
vResolves
);
Vec_IntFree
(
vUsed
);
}
/**Function*************************************************************
Synopsis [Computes interpolant of the proof.]
...
...
src/sat/bsat/satSolver2.c
View file @
b5c3992b
...
...
@@ -1450,7 +1450,7 @@ void solver2_reducedb(sat_solver2* s)
extern
void
Sat_ProofReduce
(
veci
*
pProof
,
veci
*
pRoots
);
satset
*
c
;
cla
h
,
*
pArray
,
*
pArray2
;
int
Counter
=
0
,
CounterStart
=
s
->
stats
.
learnts
*
2
/
3
;
int
Counter
=
0
,
CounterStart
=
s
->
stats
.
learnts
*
3
/
4
;
// 2/
3;
int
i
,
j
,
k
,
hTemp
,
hHandle
,
clk
=
clock
();
static
int
TimeTotal
=
0
;
...
...
src/sat/bsat/satSolver2.h
View file @
b5c3992b
...
...
@@ -32,7 +32,7 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
ABC_NAMESPACE_HEADER_START
//
#define USE_FLOAT_ACTIVITY
#define USE_FLOAT_ACTIVITY
//=================================================================================================
// Public interface:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment