Skip to content

Commit 3109172

Browse files
authored
Merge pull request #443 from MyskYko/fix4
QBF using CaDiCaL
2 parents cb971e0 + 13205cc commit 3109172

File tree

8 files changed

+101
-13
lines changed

8 files changed

+101
-13
lines changed

src/aig/gia/giaQbf.c

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "sat/bsat/satStore.h"
2424
#include "misc/extra/extra.h"
2525
#include "sat/glucose/AbcGlucose.h"
26+
#include "sat/cadical/cadicalSolver.h"
2627
#include "misc/util/utilTruth.h"
2728
#include "base/io/ioResub.h"
2829

@@ -45,6 +46,7 @@ struct Qbf_Man_t_
4546
sat_solver * pSatVer; // verification instance
4647
sat_solver * pSatSyn; // synthesis instance
4748
bmcg_sat_solver*pSatSynG; // synthesis instance
49+
cadical_solver* pSatSynC; // synthesis instance
4850
Vec_Int_t * vValues; // variable values
4951
Vec_Int_t * vParMap; // parameter mapping
5052
Vec_Int_t * vLits; // literals for the SAT solver
@@ -534,7 +536,7 @@ void Gia_QbfDumpFileInv( Gia_Man_t * pGia, int nPars )
534536
SeeAlso []
535537
536538
***********************************************************************/
537-
Qbf_Man_t * Gia_QbfAlloc( Gia_Man_t * pGia, int nPars, int fGlucose, int fVerbose )
539+
Qbf_Man_t * Gia_QbfAlloc( Gia_Man_t * pGia, int nPars, int fGlucose, int fCadical, int fVerbose )
538540
{
539541
Qbf_Man_t * p;
540542
Cnf_Dat_t * pCnf;
@@ -551,11 +553,13 @@ Qbf_Man_t * Gia_QbfAlloc( Gia_Man_t * pGia, int nPars, int fGlucose, int fVerbos
551553
p->pSatVer = (sat_solver *)Cnf_DataWriteIntoSolver( pCnf, 1, 0 );
552554
p->pSatSyn = sat_solver_new();
553555
p->pSatSynG = fGlucose ? bmcg_sat_solver_start() : NULL;
556+
p->pSatSynC = fCadical ? cadical_solver_new() : NULL;
554557
p->vValues = Vec_IntAlloc( Gia_ManPiNum(pGia) );
555558
p->vParMap = Vec_IntStartFull( nPars );
556559
p->vLits = Vec_IntAlloc( nPars );
557560
sat_solver_setnvars( p->pSatSyn, nPars );
558561
if ( p->pSatSynG ) bmcg_sat_solver_set_nvars( p->pSatSynG, nPars );
562+
if ( p->pSatSynC ) cadical_solver_setnvars( p->pSatSynC, nPars );
559563
Cnf_DataFree( pCnf );
560564
return p;
561565
}
@@ -564,6 +568,7 @@ void Gia_QbfFree( Qbf_Man_t * p )
564568
sat_solver_delete( p->pSatVer );
565569
sat_solver_delete( p->pSatSyn );
566570
if ( p->pSatSynG ) bmcg_sat_solver_stop( p->pSatSynG );
571+
if ( p->pSatSynC ) cadical_solver_delete( p->pSatSynC );
567572
Vec_IntFree( p->vLits );
568573
Vec_IntFree( p->vValues );
569574
Vec_IntFree( p->vParMap );
@@ -749,6 +754,21 @@ int Gia_QbfAddCofactorG( Qbf_Man_t * p, Gia_Man_t * pCof )
749754
Cnf_DataFree( pCnf );
750755
return 1;
751756
}
757+
int Gia_QbfAddCofactorC( Qbf_Man_t * p, Gia_Man_t * pCof )
758+
{
759+
Cnf_Dat_t * pCnf = (Cnf_Dat_t *)Mf_ManGenerateCnf( pCof, 8, 0, 1, 0, 0 );
760+
int i, iFirstVar = pCnf->nVars - Gia_ManPiNum(pCof); //-1
761+
pCnf->pMan = NULL;
762+
Cnf_SpecialDataLift( pCnf, cadical_solver_nvars(p->pSatSynC), iFirstVar, iFirstVar + Gia_ManPiNum(p->pGia) );
763+
for ( i = 0; i < pCnf->nClauses; i++ )
764+
if ( !cadical_solver_addclause( p->pSatSynC, pCnf->pClauses[i], pCnf->pClauses[i+1] ) )
765+
{
766+
Cnf_DataFree( pCnf );
767+
return 0;
768+
}
769+
Cnf_DataFree( pCnf );
770+
return 1;
771+
}
752772

753773
/**Function*************************************************************
754774
@@ -766,16 +786,20 @@ void Gia_QbfOnePattern( Qbf_Man_t * p, Vec_Int_t * vValues )
766786
int i;
767787
Vec_IntClear( vValues );
768788
for ( i = 0; i < p->nPars; i++ )
769-
Vec_IntPush( vValues, p->pSatSynG ? bmcg_sat_solver_read_cex_varvalue(p->pSatSynG, i) : sat_solver_var_value(p->pSatSyn, i) );
789+
Vec_IntPush( vValues, p->pSatSynC ? cadical_solver_get_var_value(p->pSatSynC, i) :
790+
p->pSatSynG ? bmcg_sat_solver_read_cex_varvalue(p->pSatSynG, i) : sat_solver_var_value(p->pSatSyn, i) );
770791
}
771792
void Gia_QbfPrint( Qbf_Man_t * p, Vec_Int_t * vValues, int Iter )
772793
{
773794
printf( "%5d : ", Iter );
774795
assert( Vec_IntSize(vValues) == p->nVars );
775796
Vec_IntPrintBinary( vValues ); printf( " " );
776-
printf( "Var =%7d ", p->pSatSynG ? bmcg_sat_solver_varnum(p->pSatSynG) : sat_solver_nvars(p->pSatSyn) );
777-
printf( "Cla =%7d ", p->pSatSynG ? bmcg_sat_solver_clausenum(p->pSatSynG) : sat_solver_nclauses(p->pSatSyn) );
778-
printf( "Conf =%9d ", p->pSatSynG ? bmcg_sat_solver_conflictnum(p->pSatSynG) : sat_solver_nconflicts(p->pSatSyn) );
797+
printf( "Var =%7d ", p->pSatSynC ? cadical_solver_nvars(p->pSatSynC) :
798+
p->pSatSynG ? bmcg_sat_solver_varnum(p->pSatSynG) : sat_solver_nvars(p->pSatSyn) );
799+
printf( "Cla =%7d ", p->pSatSynC ? cadical_solver_nclauses(p->pSatSynC) :
800+
p->pSatSynG ? bmcg_sat_solver_clausenum(p->pSatSynG) : sat_solver_nclauses(p->pSatSyn) );
801+
printf( "Conf =%9d ", p->pSatSynC ? cadical_solver_nconflicts(p->pSatSynC) :
802+
p->pSatSynG ? bmcg_sat_solver_conflictnum(p->pSatSynG) : sat_solver_nconflicts(p->pSatSyn) );
779803
Abc_PrintTime( 1, "Time", Abc_Clock() - p->clkStart );
780804
}
781805

@@ -869,9 +893,9 @@ void Gia_QbfLearnConstraint( Qbf_Man_t * p, Vec_Int_t * vValues )
869893
SeeAlso []
870894
871895
***********************************************************************/
872-
int Gia_QbfSolve( Gia_Man_t * pGia, int nPars, int nIterLimit, int nConfLimit, int nTimeOut, int nEncVars, int fGlucose, int fVerbose )
896+
int Gia_QbfSolve( Gia_Man_t * pGia, int nPars, int nIterLimit, int nConfLimit, int nTimeOut, int nEncVars, int fGlucose, int fCadical, int fVerbose )
873897
{
874-
Qbf_Man_t * p = Gia_QbfAlloc( pGia, nPars, fGlucose, fVerbose );
898+
Qbf_Man_t * p = Gia_QbfAlloc( pGia, nPars, fGlucose, fCadical, fVerbose );
875899
Gia_Man_t * pCof;
876900
int i, status, RetValue = 0;
877901
abctime clk;
@@ -886,12 +910,15 @@ int Gia_QbfSolve( Gia_Man_t * pGia, int nPars, int nIterLimit, int nConfLimit, i
886910
// generate next constraint
887911
assert( Vec_IntSize(p->vValues) == p->nVars );
888912
pCof = Gia_QbfCofactor( pGia, nPars, p->vValues, p->vParMap );
889-
status = p->pSatSynG ? Gia_QbfAddCofactorG( p, pCof ) : Gia_QbfAddCofactor( p, pCof );
913+
status = p->pSatSynC ? Gia_QbfAddCofactorC( p, pCof ) :
914+
p->pSatSynG ? Gia_QbfAddCofactorG( p, pCof ) : Gia_QbfAddCofactor( p, pCof );
890915
Gia_ManStop( pCof );
891916
if ( status == 0 ) { RetValue = 1; break; }
892917
// synthesize next assignment
893918
clk = Abc_Clock();
894-
if ( p->pSatSynG )
919+
if ( p->pSatSynC )
920+
status = cadical_solver_solve( p->pSatSynC, NULL, NULL, 0, 0, 0, 0 );
921+
else if ( p->pSatSynG )
895922
status = bmcg_sat_solver_solve( p->pSatSynG, NULL, 0 );
896923
else
897924
status = sat_solver_solve( p->pSatSyn, NULL, NULL, (ABC_INT64_T)nConfLimit, 0, 0, 0 );

src/base/abci/abc.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51291,7 +51291,7 @@ int Abc_CommandAbc9Qbf( Abc_Frame_t * pAbc, int argc, char ** argv )
5129151291
{
5129251292
extern void Gia_QbfDumpFile( Gia_Man_t * pGia, int nPars );
5129351293
extern void Gia_QbfDumpFileInv( Gia_Man_t * pGia, int nPars );
51294-
extern int Gia_QbfSolve( Gia_Man_t * pGia, int nPars, int nIterLimit, int nConfLimit, int nTimeOut, int nEncVars, int fGlucose, int fVerbose );
51294+
extern int Gia_QbfSolve( Gia_Man_t * pGia, int nPars, int nIterLimit, int nConfLimit, int nTimeOut, int nEncVars, int fGlucose, int fCadical, int fVerbose );
5129551295
int c, nPars = -1;
5129651296
int nIterLimit = 0;
5129751297
int nConfLimit = 0;
@@ -51300,9 +51300,10 @@ int Abc_CommandAbc9Qbf( Abc_Frame_t * pAbc, int argc, char ** argv )
5130051300
int fDumpCnf = 0;
5130151301
int fDumpCnf2 = 0;
5130251302
int fGlucose = 0;
51303+
int fCadical = 0;
5130351304
int fVerbose = 0;
5130451305
Extra_UtilGetoptReset();
51305-
while ( ( c = Extra_UtilGetopt( argc, argv, "PICTKdegvh" ) ) != EOF )
51306+
while ( ( c = Extra_UtilGetopt( argc, argv, "PICTKdegcvh" ) ) != EOF )
5130651307
{
5130751308
switch ( c )
5130851309
{
@@ -51370,6 +51371,9 @@ int Abc_CommandAbc9Qbf( Abc_Frame_t * pAbc, int argc, char ** argv )
5137051371
case 'g':
5137151372
fGlucose ^= 1;
5137251373
break;
51374+
case 'c':
51375+
fCadical ^= 1;
51376+
break;
5137351377
case 'v':
5137451378
fVerbose ^= 1;
5137551379
break;
@@ -51404,11 +51408,11 @@ int Abc_CommandAbc9Qbf( Abc_Frame_t * pAbc, int argc, char ** argv )
5140451408
else if ( fDumpCnf2 )
5140551409
Gia_QbfDumpFileInv( pAbc->pGia, nPars );
5140651410
else
51407-
Gia_QbfSolve( pAbc->pGia, nPars, nIterLimit, nConfLimit, nTimeOut, nEncVars, fGlucose, fVerbose );
51411+
Gia_QbfSolve( pAbc->pGia, nPars, nIterLimit, nConfLimit, nTimeOut, nEncVars, fGlucose, fCadical, fVerbose );
5140851412
return 0;
5140951413

5141051414
usage:
51411-
Abc_Print( -2, "usage: &qbf [-PICTK num] [-degvh]\n" );
51415+
Abc_Print( -2, "usage: &qbf [-PICTK num] [-degcvh]\n" );
5141251416
Abc_Print( -2, "\t solves QBF problem EpVxM(p,x)\n" );
5141351417
Abc_Print( -2, "\t-P num : number of parameters p (should be the first PIs) [default = %d]\n", nPars );
5141451418
Abc_Print( -2, "\t-I num : quit after the given iteration even if unsolved [default = %d]\n", nIterLimit );
@@ -51418,6 +51422,7 @@ int Abc_CommandAbc9Qbf( Abc_Frame_t * pAbc, int argc, char ** argv )
5141851422
Abc_Print( -2, "\t-d : toggle dumping QDIMACS file instead of solving (complemented QBF) [default = %s]\n", fDumpCnf? "yes": "no" );
5141951423
Abc_Print( -2, "\t-e : toggle dumping QDIMACS file instead of solving (original QBF) [default = %s]\n", fDumpCnf2? "yes": "no" );
5142051424
Abc_Print( -2, "\t-g : toggle using Glucose 3.0 by Gilles Audemard and Laurent Simon [default = %s]\n", fGlucose? "yes": "no" );
51425+
Abc_Print( -2, "\t-c : toggle using CaDiCaL by Armin Biere [default = %s]\n", fCadical? "yes": "no" );
5142151426
Abc_Print( -2, "\t-v : toggle verbose output [default = %s]\n", fVerbose? "yes": "no" );
5142251427
Abc_Print( -2, "\t-h : print the command usage\n\n");
5142351428
Abc_Print( -2, "\t As an example of using this command, consider specification (the three-input AND-gate) and implementation\n");

src/sat/cadical/cadical.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,6 +982,10 @@ class Solver {
982982
//
983983
static void build (FILE *file, const char *prefix = "c ");
984984

985+
// Extra APIs
986+
int clauses ();
987+
int conflicts ();
988+
985989
private:
986990
//==== start of state ====================================================
987991

src/sat/cadical/cadicalSolver.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,36 @@ int cadical_solver_get_var_value(cadical_solver* s, int v) {
261261
return ccadical_val((CCaDiCaL*)s->p, v + 1) > 0;
262262
}
263263

264+
/**Function*************************************************************
265+
266+
Synopsis [get number of clauses]
267+
268+
Description []
269+
270+
SideEffects []
271+
272+
SeeAlso []
273+
274+
***********************************************************************/
275+
int cadical_solver_nclauses(cadical_solver* s) {
276+
return ccadical_clauses((CCaDiCaL*)s->p);
277+
}
278+
279+
/**Function*************************************************************
280+
281+
Synopsis [get number of conflicts]
282+
283+
Description []
284+
285+
SideEffects []
286+
287+
SeeAlso []
288+
289+
***********************************************************************/
290+
int cadical_solver_nconflicts(cadical_solver* s) {
291+
return ccadical_conflicts((CCaDiCaL*)s->p);
292+
}
293+
264294

265295
/**Function*************************************************************
266296

src/sat/cadical/cadicalSolver.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ extern int cadical_solver_nvars(cadical_solver* s);
6565
extern int cadical_solver_addvar(cadical_solver* s);
6666
extern void cadical_solver_setnvars(cadical_solver* s,int n);
6767
extern int cadical_solver_get_var_value(cadical_solver* s, int v);
68+
extern int cadical_solver_nclauses(cadical_solver* s);
69+
extern int cadical_solver_nconflicts(cadical_solver* s);
6870
extern Vec_Int_t * cadical_solve_cnf( Cnf_Dat_t * pCnf, char * pArgs, int nConfs, int nTimeLimit, int fSat, int fUnsat, int fPrintCex, int fVerbose );
6971

7072
ABC_NAMESPACE_HEADER_END

src/sat/cadical/cadical_ccadical.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,4 +208,12 @@ int ccadical_is_inconsistent(CCaDiCaL *ptr) {
208208
return ((Wrapper *) ptr)->solver->inconsistent ();
209209
}
210210

211+
int ccadical_clauses(CCaDiCaL *ptr) {
212+
return ((Wrapper *) ptr)->solver->clauses ();
213+
}
214+
215+
int ccadical_conflicts(CCaDiCaL *ptr) {
216+
return ((Wrapper *) ptr)->solver->conflicts ();
217+
}
218+
211219
ABC_NAMESPACE_IMPL_END

src/sat/cadical/cadical_solver.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1759,6 +1759,16 @@ void Solver::error (const char *fmt, ...) {
17591759
va_end (ap);
17601760
}
17611761

1762+
/*------------------------------------------------------------------------*/
1763+
1764+
int Solver::clauses () {
1765+
return internal->stats.added.total;
1766+
}
1767+
1768+
int Solver::conflicts () {
1769+
return internal->stats.conflicts;
1770+
}
1771+
17621772
} // namespace CaDiCaL
17631773

17641774
ABC_NAMESPACE_IMPL_END

src/sat/cadical/ccadical.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ int ccadical_reserve_difference (CCaDiCaL *, int number_of_vars);
5858

5959
void ccadical_reserve(CCaDiCaL *, int min_max_var);
6060
int ccadical_is_inconsistent(CCaDiCaL *);
61+
int ccadical_clauses(CCaDiCaL *);
62+
int ccadical_conflicts(CCaDiCaL *);
6163

6264
/*------------------------------------------------------------------------*/
6365

0 commit comments

Comments
 (0)