From 8f3dd7736e18334b23238dcc8c819e6c7154c3f8 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Sun, 9 Jul 2017 14:11:53 -0700 Subject: [PATCH] Add support for outputting CNF --- src/Backend/inc_solver.c | 4 ++++ src/Backend/nodeedge.c | 49 +++++++++++++++++++++++++++------------- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/Backend/inc_solver.c b/src/Backend/inc_solver.c index b9cc549..4e0649a 100644 --- a/src/Backend/inc_solver.c +++ b/src/Backend/inc_solver.c @@ -49,6 +49,10 @@ void addArrayClauseLiteral(IncrementalSolver * This, uint numliterals, int * lit flushBufferSolver(This); } } + This->buffer[This->offset++]=0; + if (This->offset==IS_BUFFERSIZE) { + flushBufferSolver(This); + } } void finishedClauses(IncrementalSolver * This) { diff --git a/src/Backend/nodeedge.c b/src/Backend/nodeedge.c index fd805b4..be406eb 100644 --- a/src/Backend/nodeedge.c +++ b/src/Backend/nodeedge.c @@ -369,16 +369,16 @@ void convertConstraint(CNF *cnf, VectorEdge *stack, Edge root, bool backtrackLit //trivally unsat Edge newvar=constraintNewVar(cnf); Literal var=getEdgeVar(newvar); - Literal clause[] = {var, -var, 0}; - addArrayClauseLiteral(cnf->solver, 3, clause); + Literal clause[] = {var, -var}; + addArrayClauseLiteral(cnf->solver, 2, clause); return; } else { //trivially true return; } } else if (edgeIsVarConst(root)) { - Literal clause[] = { getEdgeVar(root), 0}; - addArrayClauseLiteral(cnf->solver, 2, clause); + Literal clause[] = { getEdgeVar(root)}; + addArrayClauseLiteral(cnf->solver, 1, clause); return; } @@ -514,11 +514,11 @@ bool propagate(CNF *cnf, CNFExpr * dest, CNFExpr * src, bool negate) { } else if (isProxy(dest)) { bool alwaysTrue = (negate ? alwaysFalseCNF(src) : alwaysTrueCNF(src)); if (alwaysTrue) { - Literal clause[] = {getProxy(dest), 0}; - addArrayClauseLiteral(cnf->solver, 2, clause); + Literal clause[] = {getProxy(dest)}; + addArrayClauseLiteral(cnf->solver, 1, clause); } else { - Literal clause[] = {-getProxy(dest), 0}; - addArrayClauseLiteral(cnf->solver, 2, clause); + Literal clause[] = {-getProxy(dest)}; + addArrayClauseLiteral(cnf->solver, 1, clause); } dest = allocCNFExprBool(negate ? alwaysFalseCNF(src) : alwaysTrueCNF(src)); @@ -546,20 +546,37 @@ void saveCNF(CNF *cnf, CNFExpr* exp, Edge e, bool sign) { } } -void constrainCNF(CNF * cnf, Literal l, CNFExpr *exp) { - if (alwaysTrueCNF(exp)) { +void constrainCNF(CNF * cnf, Literal lcond, CNFExpr *expr) { + if (alwaysTrueCNF(expr)) { return; - } else if (alwaysFalseCNF(exp)) { - Literal clause[] = {-l, 0}; - addArrayClauseLiteral(cnf->solver, 2, clause); + } else if (alwaysFalseCNF(expr)) { + Literal clause[] = {-lcond}; + addArrayClauseLiteral(cnf->solver, 1, clause); return; } - //FIXME + for(uint i=0;isingletons);i++) { + Literal l=getLiteralLitVector(&expr->singletons,i); + Literal clause[] = {-lcond, l}; + addArrayClauseLiteral(cnf->solver, 1, clause); + } + for(uint i=0;iclauses);i++) { + LitVector *lv=getVectorLitVector(&expr->clauses,i); + addClauseLiteral(cnf->solver, -lcond); //Add first literal + addArrayClauseLiteral(cnf->solver, getSizeLitVector(lv), lv->literals); //Add rest + } } -void outputCNF(CNF *cnf, CNFExpr *exp) { - +void outputCNF(CNF *cnf, CNFExpr *expr) { + for(uint i=0;isingletons);i++) { + Literal l=getLiteralLitVector(&expr->singletons,i); + Literal clause[] = {l}; + addArrayClauseLiteral(cnf->solver, 1, clause); + } + for(uint i=0;iclauses);i++) { + LitVector *lv=getVectorLitVector(&expr->clauses,i); + addArrayClauseLiteral(cnf->solver, getSizeLitVector(lv), lv->literals); + } } CNFExpr* fillArgs(CNF *cnf, Edge e, bool isNeg, Edge * largestEdge) { -- 2.34.1