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
565fefec
Commit
565fefec
authored
Dec 06, 2011
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Proof-logging in the updated solver.
parent
35733eb1
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
163 additions
and
65 deletions
+163
-65
src/sat/bsat/satProof.c
+146
-39
src/sat/bsat/satSolver2.c
+9
-21
src/sat/bsat/satSolver2.h
+8
-5
No files found.
src/sat/bsat/satProof.c
View file @
565fefec
...
@@ -64,10 +64,11 @@ static inline int Proof_NodeSize (int nEnts) { return sizeo
...
@@ -64,10 +64,11 @@ static inline int Proof_NodeSize (int nEnts) { return sizeo
#define Proof_ForeachNodeVec( pVec, p, pNode, i ) \
#define Proof_ForeachNodeVec( pVec, p, pNode, i ) \
for ( i = 0; (i < Vec_IntSize(pVec)) && ((pNode) = Proof_NodeRead(p, Vec_IntEntry(pVec,i))); i++ )
for ( i = 0; (i < Vec_IntSize(pVec)) && ((pNode) = Proof_NodeRead(p, Vec_IntEntry(pVec,i))); i++ )
#define Proof_NodeForeachFanin( p, pNode, pFanin, i ) \
#define Proof_NodeForeachFanin( p, pNode, pFanin, i ) \
for ( i = 0; (i < (int)pNode->nEnts) && (((pFanin) = ((pNode->pEnts[i] & 1) ? NULL : Proof_NodeRead(p, pNode->pEnts[i] >> 1))), 1); i++ )
for ( i = 0; (i < (int)pNode->nEnts) && (((pFanin) = (pNode->pEnts[i] & 1) ? NULL : Proof_NodeRead(p, pNode->pEnts[i] >> 2)), 1); i++ )
#define Proof_NodeForeachFanin2( p, pNode, pFanin, iFanin, i ) \
#define Proof_NodeForeachLeaf( pLeaves, pNode, pLeaf, i ) \
for ( i = 0; (i < (int)pNode->nEnts) && (((pFanin) = ((pNode->pEnts[i] & 1) ? NULL : Proof_NodeRead(p, pNode->pEnts[i] >> 1))), ((iFanin) = ((pNode->pEnts[i] & 1) ? pNode->pEnts[i] >> 1 : 0)), 1); i++ )
for ( i = 0; (i < (int)pNode->nEnts) && (((pLeaf) = (pNode->pEnts[i] & 1) ? Proof_NodeRead(pLeaves, pNode->pEnts[i] >> 2) : NULL), 1); i++ )
#define Proof_NodeForeachFaninRoot( 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 ///
/// FUNCTION DEFINITIONS ///
...
@@ -125,7 +126,7 @@ void Proof_CleanCollected( Vec_Int_t * vProof, Vec_Int_t * vUsed )
...
@@ -125,7 +126,7 @@ void Proof_CleanCollected( Vec_Int_t * vProof, Vec_Int_t * vUsed )
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
void
Proof_CollectUsed
Int
(
Vec_Int_t
*
p
,
satset
*
pNode
,
Vec_Int_t
*
vUsed
,
Vec_Int_t
*
vStack
)
void
Proof_CollectUsed
_iter
(
Vec_Int_t
*
p
,
satset
*
pNode
,
Vec_Int_t
*
vUsed
,
Vec_Int_t
*
vStack
)
{
{
satset
*
pNext
;
satset
*
pNext
;
int
i
,
hNode
;
int
i
,
hNode
;
...
@@ -167,7 +168,37 @@ void Proof_CollectUsedInt( Vec_Int_t * p, satset * pNode, Vec_Int_t * vUsed, Vec
...
@@ -167,7 +168,37 @@ void Proof_CollectUsedInt( Vec_Int_t * p, satset * pNode, Vec_Int_t * vUsed, Vec
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
void
Proof_CollectUsedRec
(
Vec_Int_t
*
p
,
satset
*
pNode
,
Vec_Int_t
*
vUsed
)
Vec_Int_t
*
Proof_CollectUsedIter
(
Vec_Int_t
*
vProof
,
Vec_Int_t
*
vRoots
,
int
hRoot
)
{
Vec_Int_t
*
vUsed
,
*
vStack
;
assert
(
(
hRoot
>
0
)
^
(
vRoots
!=
NULL
)
);
vUsed
=
Vec_IntAlloc
(
1000
);
vStack
=
Vec_IntAlloc
(
1000
);
if
(
hRoot
)
Proof_CollectUsed_iter
(
vProof
,
Proof_NodeRead
(
vProof
,
hRoot
),
vUsed
,
vStack
);
else
{
satset
*
pNode
;
int
i
;
Proof_ForeachNodeVec
(
vRoots
,
vProof
,
pNode
,
i
)
Proof_CollectUsed_iter
(
vProof
,
pNode
,
vUsed
,
vStack
);
}
Vec_IntFree
(
vStack
);
return
vUsed
;
}
/**Function*************************************************************
Synopsis [Recursively visits useful proof nodes.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Proof_CollectUsed_rec
(
Vec_Int_t
*
p
,
satset
*
pNode
,
Vec_Int_t
*
vUsed
)
{
{
satset
*
pNext
;
satset
*
pNext
;
int
i
;
int
i
;
...
@@ -176,7 +207,7 @@ void Proof_CollectUsedRec( Vec_Int_t * p, satset * pNode, Vec_Int_t * vUsed )
...
@@ -176,7 +207,7 @@ void Proof_CollectUsedRec( Vec_Int_t * p, satset * pNode, Vec_Int_t * vUsed )
pNode
->
Id
=
1
;
pNode
->
Id
=
1
;
Proof_NodeForeachFanin
(
p
,
pNode
,
pNext
,
i
)
Proof_NodeForeachFanin
(
p
,
pNode
,
pNext
,
i
)
if
(
pNext
&&
!
pNext
->
Id
)
if
(
pNext
&&
!
pNext
->
Id
)
Proof_CollectUsed
R
ec
(
p
,
pNext
,
vUsed
);
Proof_CollectUsed
_r
ec
(
p
,
pNext
,
vUsed
);
Vec_IntPush
(
vUsed
,
Proof_NodeHandle
(
p
,
pNode
)
);
Vec_IntPush
(
vUsed
,
Proof_NodeHandle
(
p
,
pNode
)
);
}
}
...
@@ -191,22 +222,20 @@ void Proof_CollectUsedRec( Vec_Int_t * p, satset * pNode, Vec_Int_t * vUsed )
...
@@ -191,22 +222,20 @@ void Proof_CollectUsedRec( Vec_Int_t * p, satset * pNode, Vec_Int_t * vUsed )
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
Vec_Int_t
*
Proof_CollectUsed
(
Vec_Int_t
*
vProof
,
Vec_Int_t
*
vRoots
,
int
hRoot
)
Vec_Int_t
*
Proof_CollectUsed
Rec
(
Vec_Int_t
*
vProof
,
Vec_Int_t
*
vRoots
,
int
hRoot
)
{
{
Vec_Int_t
*
vUsed
,
*
vStack
;
Vec_Int_t
*
vUsed
,
*
vStack
;
assert
(
(
hRoot
>
0
)
^
(
vRoots
!=
NULL
)
);
assert
(
(
hRoot
>
0
)
^
(
vRoots
!=
NULL
)
);
vUsed
=
Vec_IntAlloc
(
1000
);
vUsed
=
Vec_IntAlloc
(
1000
);
vStack
=
Vec_IntAlloc
(
1000
);
vStack
=
Vec_IntAlloc
(
1000
);
if
(
hRoot
)
if
(
hRoot
)
// Proof_CollectUsedInt( vProof, Proof_NodeRead(vProof, hRoot), vUsed, vStack );
Proof_CollectUsed_rec
(
vProof
,
Proof_NodeRead
(
vProof
,
hRoot
),
vUsed
);
Proof_CollectUsedRec
(
vProof
,
Proof_NodeRead
(
vProof
,
hRoot
),
vUsed
);
else
else
{
{
satset
*
pNode
;
satset
*
pNode
;
int
i
;
int
i
;
Proof_ForeachNodeVec
(
vRoots
,
vProof
,
pNode
,
i
)
Proof_ForeachNodeVec
(
vRoots
,
vProof
,
pNode
,
i
)
// Proof_CollectUsedInt( vProof, pNode, vUsed, vStack );
Proof_CollectUsed_rec
(
vProof
,
pNode
,
vUsed
);
Proof_CollectUsedRec
(
vProof
,
pNode
,
vUsed
);
}
}
Vec_IntFree
(
vStack
);
Vec_IntFree
(
vStack
);
return
vUsed
;
return
vUsed
;
...
@@ -279,9 +308,9 @@ satset * Proof_CheckReadOne( Vec_Int_t * vClauses, Vec_Int_t * vProof, Vec_Int_t
...
@@ -279,9 +308,9 @@ satset * Proof_CheckReadOne( Vec_Int_t * vClauses, Vec_Int_t * vProof, Vec_Int_t
{
{
satset
*
pAnt
;
satset
*
pAnt
;
if
(
iAnt
&
1
)
if
(
iAnt
&
1
)
return
Proof_NodeRead
(
vClauses
,
iAnt
>>
1
);
return
Proof_NodeRead
(
vClauses
,
iAnt
>>
2
);
assert
(
iAnt
>
0
);
assert
(
iAnt
>
0
);
pAnt
=
Proof_NodeRead
(
vProof
,
iAnt
>>
1
);
pAnt
=
Proof_NodeRead
(
vProof
,
iAnt
>>
2
);
assert
(
pAnt
->
Id
>
0
);
assert
(
pAnt
->
Id
>
0
);
return
Proof_NodeRead
(
vResolves
,
pAnt
->
Id
);
return
Proof_NodeRead
(
vResolves
,
pAnt
->
Id
);
}
}
...
@@ -303,7 +332,7 @@ void Proof_Check( Vec_Int_t * vClauses, Vec_Int_t * vProof, int hRoot )
...
@@ -303,7 +332,7 @@ void Proof_Check( Vec_Int_t * vClauses, Vec_Int_t * vProof, int hRoot )
satset
*
pSet
,
*
pSet0
,
*
pSet1
;
satset
*
pSet
,
*
pSet0
,
*
pSet1
;
int
i
,
k
,
Counter
=
0
,
clk
=
clock
();
int
i
,
k
,
Counter
=
0
,
clk
=
clock
();
// collect visited clauses
// collect visited clauses
vUsed
=
Proof_CollectUsed
(
vProof
,
NULL
,
hRoot
);
vUsed
=
Proof_CollectUsed
Rec
(
vProof
,
NULL
,
hRoot
);
Proof_CleanCollected
(
vProof
,
vUsed
);
Proof_CleanCollected
(
vProof
,
vUsed
);
// perform resolution steps
// perform resolution steps
vTemp
=
Vec_IntAlloc
(
1000
);
vTemp
=
Vec_IntAlloc
(
1000
);
...
@@ -433,6 +462,8 @@ void Sat_ProofReduce( Vec_Int_t * p, Vec_Int_t * vRoots )
...
@@ -433,6 +462,8 @@ void Sat_ProofReduce( Vec_Int_t * p, Vec_Int_t * vRoots )
Vec_IntShrink
(
p
,
nSize
);
Vec_IntShrink
(
p
,
nSize
);
}
}
/**Function*************************************************************
/**Function*************************************************************
Synopsis [Computes UNSAT core.]
Synopsis [Computes UNSAT core.]
...
@@ -444,29 +475,31 @@ void Sat_ProofReduce( Vec_Int_t * p, Vec_Int_t * vRoots )
...
@@ -444,29 +475,31 @@ void Sat_ProofReduce( Vec_Int_t * p, Vec_Int_t * vRoots )
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
Vec_Int_t
*
Sat_ProofCore
(
Vec_Int_t
*
vProof
,
int
nRoots
,
Vec_Int_t
*
vRoots
)
Vec_Int_t
*
Sat_ProofCore
(
Vec_Int_t
*
vProof
,
Vec_Int_t
*
vRoots
)
{
{
unsigned
*
pSeen
;
Vec_Int_t
*
vCore
,
*
vUsed
;
Vec_Int_t
*
vCore
,
*
vUsed
;
satset
*
pNode
;
satset
*
pNode
,
*
pFanin
;
int
i
,
*
pBeg
;
int
i
,
k
,
clk
=
clock
();
;
// collect visited clauses
// collect visited clauses
vUsed
=
Proof_CollectUsed
(
vProof
,
vRoots
,
0
);
vUsed
=
Proof_CollectUsed
Iter
(
vProof
,
vRoots
,
0
);
//
find the core
//
collect core clauses
vCore
=
Vec_IntAlloc
(
1000
);
vCore
=
Vec_IntAlloc
(
1000
);
pSeen
=
ABC_CALLOC
(
unsigned
,
Aig_BitWordNum
(
nRoots
)
);
Proof_ForeachNodeVec
(
vUsed
,
vProof
,
pNode
,
i
)
Proof_ForeachNodeVec
(
vUsed
,
vProof
,
pNode
,
i
)
{
{
pNode
->
Id
=
0
;
pNode
->
Id
=
0
;
for
(
pBeg
=
pNode
->
pEnts
;
pBeg
<
pNode
->
pEnts
+
pNode
->
nEnts
;
pBeg
++
)
Proof_NodeForeachLeaf
(
vRoots
,
pNode
,
pFanin
,
k
)
if
(
(
*
pBeg
&
1
)
&&
!
Aig_InfoHasBit
((
unsigned
*
)
pBeg
,
*
pBeg
>>
1
)
)
if
(
pFanin
&&
!
pFanin
->
mark
)
{
{
Aig_InfoSetBit
(
(
unsigned
*
)
pBeg
,
*
pBeg
>>
1
)
;
pFanin
->
mark
=
1
;
Vec_IntPush
(
vCore
,
(
*
pBeg
>>
1
)
-
1
);
Vec_IntPush
(
vCore
,
Proof_NodeHandle
(
vRoots
,
pFanin
)
);
}
}
}
}
// clean core clauses
Proof_ForeachNodeVec
(
vCore
,
vRoots
,
pNode
,
i
)
pNode
->
mark
=
0
;
Vec_IntFree
(
vUsed
);
Vec_IntFree
(
vUsed
);
ABC_FREE
(
pSeen
);
printf
(
"Collected %d core clauses. "
,
Vec_IntSize
(
vCore
)
);
Abc_PrintTime
(
1
,
"Time"
,
clock
()
-
clk
);
return
vCore
;
return
vCore
;
}
}
...
@@ -474,7 +507,7 @@ Vec_Int_t * Sat_ProofCore( Vec_Int_t * vProof, int nRoots, Vec_Int_t * vRoots )
...
@@ -474,7 +507,7 @@ Vec_Int_t * Sat_ProofCore( Vec_Int_t * vProof, int nRoots, Vec_Int_t * vRoots )
Synopsis [Computes interpolant of the proof.]
Synopsis [Computes interpolant of the proof.]
Description [Aassuming that
global vars and A-clauses
are marked.]
Description [Aassuming that
vars/clause of partA
are marked.]
SideEffects []
SideEffects []
...
@@ -483,19 +516,81 @@ Vec_Int_t * Sat_ProofCore( Vec_Int_t * vProof, int nRoots, Vec_Int_t * vRoots )
...
@@ -483,19 +516,81 @@ Vec_Int_t * Sat_ProofCore( Vec_Int_t * vProof, int nRoots, Vec_Int_t * vRoots )
***********************************************************************/
***********************************************************************/
Aig_Man_t
*
Sat_ProofInterpolant
(
Vec_Int_t
*
vClauses
,
Vec_Int_t
*
vProof
,
int
hRoot
,
Vec_Int_t
*
vGlobVars
)
Aig_Man_t
*
Sat_ProofInterpolant
(
Vec_Int_t
*
vClauses
,
Vec_Int_t
*
vProof
,
int
hRoot
,
Vec_Int_t
*
vGlobVars
)
{
{
Vec_Int_t
*
vUsed
;
Vec_Int_t
*
vUsed
,
*
vCore
,
*
vVarMap
;
Vec_Int_t
*
vUsedNums
,
*
vCoreNums
;
satset
*
pNode
,
*
pFanin
;
Aig_Man_t
*
pAig
;
Aig_Man_t
*
pAig
;
int
i
;
Aig_Obj_t
*
pObj
;
int
i
,
k
,
iVar
,
Entry
;
// collect core clauses
vCore
=
Sat_ProofCore
(
vProof
,
vClauses
);
// collect visited clauses
// collect visited clauses
vUsed
=
Proof_CollectUsed
(
vProof
,
NULL
,
hRoot
);
vUsed
=
Proof_CollectUsedRec
(
vProof
,
NULL
,
hRoot
);
Proof_CleanCollected
(
vProof
,
vUsed
);
// start the AIG
// start the AIG
pAig
=
Aig_ManStart
(
10000
);
pAig
=
Aig_ManStart
(
10000
);
pAig
->
pName
=
Aig_UtilStrsav
(
"interpol"
);
pAig
->
pName
=
Aig_UtilStrsav
(
"interpol"
);
for
(
i
=
0
;
i
<
Vec_IntSize
(
vGlobVars
);
i
++
)
for
(
i
=
0
;
i
<
Vec_IntSize
(
vGlobVars
);
i
++
)
Aig_ObjCreatePi
(
pAig
);
Aig_ObjCreatePi
(
pAig
);
// map variables into their global numbers
vVarMap
=
Vec_IntStartFull
(
Vec_IntFindMax
(
vGlobVars
)
+
1
);
Vec_IntForEachEntry
(
vGlobVars
,
Entry
,
i
)
Vec_IntWriteEntry
(
vVarMap
,
Entry
,
i
);
// copy the numbers out and derive interpol for clause
vCoreNums
=
Vec_IntAlloc
(
Vec_IntSize
(
vCore
)
);
Proof_ForeachNodeVec
(
vCore
,
vClauses
,
pNode
,
i
)
{
if
(
pNode
->
partA
)
{
pObj
=
Aig_ManConst0
(
pAig
);
satset_foreach_var
(
pNode
,
iVar
,
k
)
if
(
iVar
<
Vec_IntSize
(
vVarMap
)
&&
Vec_IntEntry
(
vVarMap
,
iVar
)
>=
0
)
pObj
=
Aig_Or
(
pAig
,
pObj
,
Aig_IthVar
(
pAig
,
iVar
)
);
}
else
pObj
=
Aig_ManConst1
(
pAig
);
// remember the interpolant
Vec_IntPush
(
vCoreNums
,
pNode
->
Id
);
pNode
->
Id
=
Aig_ObjToLit
(
pObj
);
}
Vec_IntFree
(
vVarMap
);
// copy the numbers out and derive interpol for resolvents
vUsedNums
=
Vec_IntAlloc
(
Vec_IntSize
(
vUsed
)
);
Proof_ForeachNodeVec
(
vUsed
,
vProof
,
pNode
,
i
)
{
assert
(
pNode
->
nEnts
>
1
);
Proof_NodeForeachFaninRoot
(
vProof
,
vClauses
,
pNode
,
pFanin
,
k
)
{
if
(
k
==
0
)
pObj
=
Aig_ObjFromLit
(
pAig
,
pFanin
->
Id
);
else
if
(
pNode
->
pEnts
[
k
]
&
2
)
// variable of A
pObj
=
Aig_Or
(
pAig
,
pObj
,
Aig_ObjFromLit
(
pAig
,
pFanin
->
Id
)
);
else
pObj
=
Aig_And
(
pAig
,
pObj
,
Aig_ObjFromLit
(
pAig
,
pFanin
->
Id
)
);
}
// remember the interpolant
Vec_IntPush
(
vUsedNums
,
pNode
->
Id
);
pNode
->
Id
=
Aig_ObjToLit
(
pObj
);
}
// save the result
Aig_ObjCreatePo
(
pAig
,
pObj
);
Aig_ManCleanup
(
pAig
);
// move the results back
Proof_ForeachNodeVec
(
vCore
,
vClauses
,
pNode
,
i
)
pNode
->
Id
=
Vec_IntEntry
(
vCoreNums
,
i
);
Proof_ForeachNodeVec
(
vUsed
,
vProof
,
pNode
,
i
)
pNode
->
Id
=
Vec_IntEntry
(
vUsedNums
,
i
);
// cleanup
Vec_IntFree
(
vCore
);
Vec_IntFree
(
vUsed
);
Vec_IntFree
(
vCoreNums
);
Vec_IntFree
(
vUsedNums
);
return
pAig
;
return
pAig
;
}
}
...
@@ -503,7 +598,6 @@ Aig_Man_t * Sat_ProofInterpolant( Vec_Int_t * vClauses, Vec_Int_t * vProof, int
...
@@ -503,7 +598,6 @@ Aig_Man_t * Sat_ProofInterpolant( Vec_Int_t * vClauses, Vec_Int_t * vProof, int
Sat_ProofTest(
Sat_ProofTest(
&s->clauses, // clauses
&s->clauses, // clauses
&s->proof_clas, // proof clauses
&s->proof_clas, // proof clauses
&s->proof_vars, // proof variables
NULL, // proof roots
NULL, // proof roots
veci_begin(&s->claProofs)[clause_read(s, s->iLearntLast)->Id)], // one root
veci_begin(&s->claProofs)[clause_read(s, s->iLearntLast)->Id)], // one root
&s->glob_vars ); // global variables (for interpolation)
&s->glob_vars ); // global variables (for interpolation)
...
@@ -520,23 +614,35 @@ Aig_Man_t * Sat_ProofInterpolant( Vec_Int_t * vClauses, Vec_Int_t * vProof, int
...
@@ -520,23 +614,35 @@ Aig_Man_t * Sat_ProofInterpolant( Vec_Int_t * vClauses, Vec_Int_t * vProof, int
SeeAlso []
SeeAlso []
***********************************************************************/
***********************************************************************/
void
Sat_ProofTest
(
veci
*
pClauses
,
veci
*
pProof
,
veci
*
p
Vars
,
veci
*
pRoots
,
int
hRoot
,
veci
*
pGlobVars
)
void
Sat_ProofTest
(
veci
*
pClauses
,
veci
*
pProof
,
veci
*
p
Roots
,
int
hRoot
)
{
{
Vec_Int_t
*
vClauses
=
(
Vec_Int_t
*
)
pClauses
;
Vec_Int_t
*
vClauses
=
(
Vec_Int_t
*
)
pClauses
;
Vec_Int_t
*
vProof
=
(
Vec_Int_t
*
)
pProof
;
Vec_Int_t
*
vProof
=
(
Vec_Int_t
*
)
pProof
;
Vec_Int_t
*
vVars
=
(
Vec_Int_t
*
)
pVars
;
Vec_Int_t
*
vRoots
=
(
Vec_Int_t
*
)
pRoots
;
Vec_Int_t
*
vRoots
=
(
Vec_Int_t
*
)
pRoots
;
Vec_Int_t
*
vGlobVars
=
(
Vec_Int_t
*
)
pGlobVars
;
Vec_Int_t
*
vUsed
,
*
vCore
;
Vec_Int_t
*
vUsed
;
// int i, Entry;
// int i, Entry;
// collect visited clauses
// collect visited clauses
vUsed
=
Proof_CollectUsed
(
vProof
,
NULL
,
hRoot
);
vUsed
=
Proof_CollectUsed
Rec
(
vProof
,
NULL
,
hRoot
);
Proof_CleanCollected
(
vProof
,
vUsed
);
Proof_CleanCollected
(
vProof
,
vUsed
);
printf
(
"Found %d useful resolution nodes.
\n
"
,
Vec_IntSize
(
vUsed
)
);
Vec_IntFree
(
vUsed
);
// collect visited clauses
vUsed
=
Proof_CollectUsedIter
(
vProof
,
NULL
,
hRoot
);
Proof_CleanCollected
(
vProof
,
vUsed
);
printf
(
"Found %d useful resolution nodes.
\n
"
,
Vec_IntSize
(
vUsed
)
);
Vec_IntFree
(
vUsed
);
vCore
=
Sat_ProofCore
(
vProof
,
vClauses
);
Vec_IntFree
(
vCore
);
// Vec_IntForEachEntry( vUsed, Entry, i )
// Vec_IntForEachEntry( vUsed, Entry, i )
// printf( "%d ", Entry );
// printf( "%d ", Entry );
// printf( "\n" );
// printf( "\n" );
/*
printf( "Found %d useful resolution nodes.\n", Vec_IntSize(vUsed) );
printf( "Found %d useful resolution nodes.\n", Vec_IntSize(vUsed) );
Vec_IntFree( vUsed );
Vec_IntFree( vUsed );
vUsed = Proof_CollectAll( vProof );
vUsed = Proof_CollectAll( vProof );
...
@@ -544,6 +650,7 @@ void Sat_ProofTest( veci * pClauses, veci * pProof, veci * pVars, veci * pRoots,
...
@@ -544,6 +650,7 @@ void Sat_ProofTest( veci * pClauses, veci * pProof, veci * pVars, veci * pRoots,
Vec_IntFree( vUsed );
Vec_IntFree( vUsed );
Proof_Check( vClauses, vProof, hRoot );
Proof_Check( vClauses, vProof, hRoot );
*/
}
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
...
...
src/sat/bsat/satSolver2.c
View file @
565fefec
...
@@ -85,13 +85,13 @@ struct varinfo_t
...
@@ -85,13 +85,13 @@ struct varinfo_t
{
{
unsigned
val
:
2
;
// variable value
unsigned
val
:
2
;
// variable value
unsigned
pol
:
1
;
// last polarity
unsigned
pol
:
1
;
// last polarity
unsigned
glo
:
1
;
// global
variable
unsigned
partA
:
1
;
// partA
variable
unsigned
tag
:
4
;
// conflict analysis tags
unsigned
tag
:
4
;
// conflict analysis tags
unsigned
lev
:
24
;
// variable level
unsigned
lev
:
24
;
// variable level
};
};
int
var_is_
global
(
sat_solver2
*
s
,
int
v
)
{
return
s
->
vi
[
v
].
glo
;
}
int
var_is_
partA
(
sat_solver2
*
s
,
int
v
)
{
return
s
->
vi
[
v
].
partA
;
}
void
var_set_
global
(
sat_solver2
*
s
,
int
v
,
int
glo
)
{
s
->
vi
[
v
].
glo
=
glo
;
if
(
glo
)
veci_push
(
&
s
->
glob_vars
,
v
)
;
}
void
var_set_
partA
(
sat_solver2
*
s
,
int
v
,
int
partA
)
{
s
->
vi
[
v
].
partA
=
partA
;
}
static
inline
int
var_value
(
sat_solver2
*
s
,
int
v
)
{
return
s
->
vi
[
v
].
val
;
}
static
inline
int
var_value
(
sat_solver2
*
s
,
int
v
)
{
return
s
->
vi
[
v
].
val
;
}
static
inline
int
var_polar
(
sat_solver2
*
s
,
int
v
)
{
return
s
->
vi
[
v
].
pol
;
}
static
inline
int
var_polar
(
sat_solver2
*
s
,
int
v
)
{
return
s
->
vi
[
v
].
pol
;
}
...
@@ -145,7 +145,7 @@ static inline void solver2_clear_marks(sat_solver2* s) {
...
@@ -145,7 +145,7 @@ static inline void solver2_clear_marks(sat_solver2* s) {
static
inline
satset
*
clause_read
(
sat_solver2
*
s
,
cla
h
)
{
return
satset_read
(
&
s
->
clauses
,
h
);
}
static
inline
satset
*
clause_read
(
sat_solver2
*
s
,
cla
h
)
{
return
satset_read
(
&
s
->
clauses
,
h
);
}
static
inline
cla
clause_handle
(
sat_solver2
*
s
,
satset
*
c
)
{
return
satset_handle
(
&
s
->
clauses
,
c
);
}
static
inline
cla
clause_handle
(
sat_solver2
*
s
,
satset
*
c
)
{
return
satset_handle
(
&
s
->
clauses
,
c
);
}
static
inline
int
clause_check
(
sat_solver2
*
s
,
satset
*
c
)
{
return
satset_check
(
&
s
->
clauses
,
c
);
}
static
inline
int
clause_check
(
sat_solver2
*
s
,
satset
*
c
)
{
return
satset_check
(
&
s
->
clauses
,
c
);
}
static
inline
int
clause_proofid
(
sat_solver2
*
s
,
satset
*
c
)
{
return
c
->
learnt
?
veci_begin
(
&
s
->
claProofs
)[
c
->
Id
]
<<
1
:
(
clause_handle
(
s
,
c
)
<<
1
)
|
1
;
}
static
inline
int
clause_proofid
(
sat_solver2
*
s
,
satset
*
c
,
int
partA
)
{
return
c
->
learnt
?
(
veci_begin
(
&
s
->
claProofs
)[
c
->
Id
]
<<
2
)
|
(
partA
<<
1
)
:
(
clause_handle
(
s
,
c
)
<<
2
)
|
1
;
}
//static inline int var_reason (sat_solver2* s, int v) { return (s->reasons[v]&1) ? 0 : s->reasons[v] >> 1; }
//static inline int var_reason (sat_solver2* s, int v) { return (s->reasons[v]&1) ? 0 : s->reasons[v] >> 1; }
//static inline int lit_reason (sat_solver2* s, int l) { return (s->reasons[lit_var(l)&1]) ? 0 : s->reasons[lit_var(l)] >> 1; }
//static inline int lit_reason (sat_solver2* s, int l) { return (s->reasons[lit_var(l)&1]) ? 0 : s->reasons[lit_var(l)] >> 1; }
...
@@ -180,10 +180,7 @@ static inline void proof_chain_start( sat_solver2* s, satset* c )
...
@@ -180,10 +180,7 @@ static inline void proof_chain_start( sat_solver2* s, satset* c )
s
->
iStartChain
=
veci_size
(
&
s
->
proof_clas
);
s
->
iStartChain
=
veci_size
(
&
s
->
proof_clas
);
veci_push
(
&
s
->
proof_clas
,
0
);
veci_push
(
&
s
->
proof_clas
,
0
);
veci_push
(
&
s
->
proof_clas
,
0
);
veci_push
(
&
s
->
proof_clas
,
0
);
veci_push
(
&
s
->
proof_clas
,
clause_proofid
(
s
,
c
)
);
veci_push
(
&
s
->
proof_clas
,
clause_proofid
(
s
,
c
,
0
)
);
veci_push
(
&
s
->
proof_vars
,
0
);
veci_push
(
&
s
->
proof_vars
,
0
);
veci_push
(
&
s
->
proof_vars
,
0
);
}
}
}
}
...
@@ -192,8 +189,7 @@ static inline void proof_chain_resolve( sat_solver2* s, satset* cls, int Var )
...
@@ -192,8 +189,7 @@ static inline void proof_chain_resolve( sat_solver2* s, satset* cls, int Var )
if
(
s
->
fProofLogging
)
if
(
s
->
fProofLogging
)
{
{
satset
*
c
=
cls
?
cls
:
var_unit_clause
(
s
,
Var
);
satset
*
c
=
cls
?
cls
:
var_unit_clause
(
s
,
Var
);
veci_push
(
&
s
->
proof_clas
,
clause_proofid
(
s
,
c
)
);
veci_push
(
&
s
->
proof_clas
,
clause_proofid
(
s
,
c
,
var_is_partA
(
s
,
Var
))
);
veci_push
(
&
s
->
proof_vars
,
Var
);
// printf( "%d %d ", clause_proofid(s, c), Var );
// printf( "%d %d ", clause_proofid(s, c), Var );
}
}
}
}
...
@@ -1225,9 +1221,7 @@ sat_solver2* sat_solver2_new(void)
...
@@ -1225,9 +1221,7 @@ sat_solver2* sat_solver2_new(void)
veci_new
(
&
s
->
mark_levels
);
veci_new
(
&
s
->
mark_levels
);
veci_new
(
&
s
->
min_lit_order
);
veci_new
(
&
s
->
min_lit_order
);
veci_new
(
&
s
->
min_step_order
);
veci_new
(
&
s
->
min_step_order
);
veci_new
(
&
s
->
glob_vars
);
veci_new
(
&
s
->
proof_clas
);
veci_push
(
&
s
->
proof_clas
,
-
1
);
veci_new
(
&
s
->
proof_clas
);
veci_push
(
&
s
->
proof_clas
,
-
1
);
veci_new
(
&
s
->
proof_vars
);
veci_push
(
&
s
->
proof_vars
,
-
1
);
veci_new
(
&
s
->
claActs
);
veci_push
(
&
s
->
claActs
,
-
1
);
veci_new
(
&
s
->
claActs
);
veci_push
(
&
s
->
claActs
,
-
1
);
veci_new
(
&
s
->
claProofs
);
veci_push
(
&
s
->
claProofs
,
-
1
);
veci_new
(
&
s
->
claProofs
);
veci_push
(
&
s
->
claProofs
,
-
1
);
...
@@ -1256,8 +1250,6 @@ sat_solver2* sat_solver2_new(void)
...
@@ -1256,8 +1250,6 @@ sat_solver2* sat_solver2_new(void)
{
{
s
->
proof_clas
.
cap
=
(
1
<<
20
);
s
->
proof_clas
.
cap
=
(
1
<<
20
);
s
->
proof_clas
.
ptr
=
ABC_REALLOC
(
int
,
s
->
proof_clas
.
ptr
,
s
->
proof_clas
.
cap
);
s
->
proof_clas
.
ptr
=
ABC_REALLOC
(
int
,
s
->
proof_clas
.
ptr
,
s
->
proof_clas
.
cap
);
s
->
proof_vars
.
cap
=
(
1
<<
20
);
s
->
proof_vars
.
ptr
=
ABC_REALLOC
(
int
,
s
->
proof_vars
.
ptr
,
s
->
proof_clas
.
cap
);
}
}
return
s
;
return
s
;
}
}
...
@@ -1306,16 +1298,14 @@ void sat_solver2_delete(sat_solver2* s)
...
@@ -1306,16 +1298,14 @@ void sat_solver2_delete(sat_solver2* s)
{
{
satset
*
c
=
clause_read
(
s
,
s
->
iLearntLast
);
satset
*
c
=
clause_read
(
s
,
s
->
iLearntLast
);
// report statistics
// report statistics
assert
(
veci_size
(
&
s
->
proof_clas
)
==
veci_size
(
&
s
->
proof_vars
)
);
printf
(
"Used %6.2f Mb for proof-logging. Unit clauses = %d.
\n
"
,
2
.
0
*
veci_size
(
&
s
->
proof_clas
)
/
(
1
<<
20
),
s
->
nUnits
);
printf
(
"Used %6.2f Mb for proof-logging. Unit clauses = %d.
\n
"
,
8
.
0
*
veci_size
(
&
s
->
proof_clas
)
/
(
1
<<
20
),
s
->
nUnits
);
Sat_ProofTest
(
Sat_ProofTest
(
&
s
->
clauses
,
// clauses
&
s
->
clauses
,
// clauses
&
s
->
proof_clas
,
// proof clauses
&
s
->
proof_clas
,
// proof clauses
&
s
->
proof_vars
,
// proof variables
NULL
,
// proof roots
NULL
,
// proof roots
veci_begin
(
&
s
->
claProofs
)[
c
->
Id
]
,
// one root
veci_begin
(
&
s
->
claProofs
)[
c
->
Id
]
// one root
&
s
->
glob_vars
);
// global variables (for interpolation)
);
// delete vectors
// delete vectors
veci_delete
(
&
s
->
order
);
veci_delete
(
&
s
->
order
);
...
@@ -1328,9 +1318,7 @@ void sat_solver2_delete(sat_solver2* s)
...
@@ -1328,9 +1318,7 @@ void sat_solver2_delete(sat_solver2* s)
veci_delete
(
&
s
->
mark_levels
);
veci_delete
(
&
s
->
mark_levels
);
veci_delete
(
&
s
->
min_lit_order
);
veci_delete
(
&
s
->
min_lit_order
);
veci_delete
(
&
s
->
min_step_order
);
veci_delete
(
&
s
->
min_step_order
);
veci_delete
(
&
s
->
glob_vars
);
veci_delete
(
&
s
->
proof_clas
);
veci_delete
(
&
s
->
proof_clas
);
veci_delete
(
&
s
->
proof_vars
);
veci_delete
(
&
s
->
claActs
);
veci_delete
(
&
s
->
claActs
);
veci_delete
(
&
s
->
claProofs
);
veci_delete
(
&
s
->
claProofs
);
veci_delete
(
&
s
->
clauses
);
veci_delete
(
&
s
->
clauses
);
...
...
src/sat/bsat/satSolver2.h
View file @
565fefec
...
@@ -68,8 +68,8 @@ extern void sat_solver2_store_mark_clauses_a( sat_solver2 * s );
...
@@ -68,8 +68,8 @@ extern void sat_solver2_store_mark_clauses_a( sat_solver2 * s );
extern
void
*
sat_solver2_store_release
(
sat_solver2
*
s
);
extern
void
*
sat_solver2_store_release
(
sat_solver2
*
s
);
// global variables
// global variables
extern
int
var_is_
global
(
sat_solver2
*
s
,
int
v
);
extern
int
var_is_
partA
(
sat_solver2
*
s
,
int
v
);
extern
void
var_set_
global
(
sat_solver2
*
s
,
int
v
,
int
glo
);
extern
void
var_set_
partA
(
sat_solver2
*
s
,
int
v
,
int
partA
);
// clause grouping (these two only work after creating a clause before the solver is called)
// clause grouping (these two only work after creating a clause before the solver is called)
extern
int
clause_is_partA
(
sat_solver2
*
s
,
int
handle
);
extern
int
clause_is_partA
(
sat_solver2
*
s
,
int
handle
);
extern
void
clause_set_partA
(
sat_solver2
*
s
,
int
handle
,
int
partA
);
extern
void
clause_set_partA
(
sat_solver2
*
s
,
int
handle
,
int
partA
);
...
@@ -143,7 +143,6 @@ struct sat_solver2_t
...
@@ -143,7 +143,6 @@ struct sat_solver2_t
// proof logging
// proof logging
veci
proof_clas
;
// sequence of proof clauses
veci
proof_clas
;
// sequence of proof clauses
veci
proof_vars
;
// sequence of proof variables
int
iStartChain
;
// temporary variable to remember beginning of the current chain in proof logging
int
iStartChain
;
// temporary variable to remember beginning of the current chain in proof logging
int
nUnits
;
// the total number of unit clauses
int
nUnits
;
// the total number of unit clauses
...
@@ -177,9 +176,13 @@ static inline void satset_print (satset * c) {
...
@@ -177,9 +176,13 @@ static inline void satset_print (satset * c) {
printf
(
"}
\n
"
);
printf
(
"}
\n
"
);
}
}
#define satset_foreach_entry( p, c, h, s ) \
#define satset_foreach_entry( p, c, h, s ) \
for ( h = s; (h < veci_size(p)) && (((c) = satset_read(p, h)), 1); h += satset_size(c->nEnts) )
for ( h = s; (h < veci_size(p)) && (((c) = satset_read(p, h)), 1); h += satset_size(c->nEnts) )
#define satset_foreach_var( p, var, i ) \
for ( i = 0; (i < (int)(p)->nEnts) && ((var) = lit_var((p)->pEnts[i])); i++ )
#define satset_foreach_lit( p, lit, i ) \
for ( i = 0; (i < (int)(p)->nEnts) && ((lit) = (p)->pEnts[i]); i++ )
//=================================================================================================
//=================================================================================================
// Public APIs:
// Public APIs:
...
@@ -245,7 +248,7 @@ static inline int sat_solver2_set_random(sat_solver2* s, int fNotUseRandom)
...
@@ -245,7 +248,7 @@ static inline int sat_solver2_set_random(sat_solver2* s, int fNotUseRandom)
return
fNotUseRandomOld
;
return
fNotUseRandomOld
;
}
}
extern
void
Sat_ProofTest
(
veci
*
pClauses
,
veci
*
pProof
,
veci
*
p
Vars
,
veci
*
pRoots
,
int
hRoot
,
veci
*
pGlobVars
);
extern
void
Sat_ProofTest
(
veci
*
pClauses
,
veci
*
pProof
,
veci
*
p
Roots
,
int
hRoot
);
ABC_NAMESPACE_HEADER_END
ABC_NAMESPACE_HEADER_END
...
...
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