forked from lijwen2748/aaltaf
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathaaltasolver.cpp
More file actions
157 lines (144 loc) · 3.38 KB
/
Copy pathaaltasolver.cpp
File metadata and controls
157 lines (144 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
* File: aaltasolver.cpp
* Author: Jianwen Li
* Note: An inheritance class from Minisat::Solver for Aalta use
* Created on August 15, 2017
*/
#include "aaltasolver.h"
#include <iostream>
#include <vector>
using namespace std;
using namespace Minisat;
namespace aalta
{
Lit AaltaSolver::SAT_lit (int id)
{
assert (id != 0);
int var = abs(id)-1;
while (var >= nVars()) newVar();
return ( (id > 0) ? mkLit(var) : ~mkLit(var) );
}
int AaltaSolver::lit_id (Lit l)
{
if (sign(l))
return -(var(l) + 1);
else
return var(l) + 1;
}
bool AaltaSolver::solve_assumption ()
{
lbool ret = solveLimited (assumption_);
if (verbose_)
{
cout << "solve_with_assumption: assumption_ is" << endl;
for (int i = 0; i < assumption_.size (); i ++)
cout << lit_id (assumption_[i]) << ", ";
cout << endl;
}
if (ret == l_True)
return true;
else if (ret == l_Undef)
exit (0);
return false;
}
//return the model from SAT solver when it provides SAT
std::vector<int> AaltaSolver::get_model ()
{
std::vector<int> res;
res.resize (nVars (), 0);
for (int i = 0; i < nVars (); i ++)
{
if (model[i] == l_True)
res[i] = i+1;
else if (model[i] == l_False)
res[i] = -(i+1);
}
if (verbose_)
{
cout << "original model from SAT solver is" << endl;
for (int i = 0; i < res.size (); i ++)
cout << res[i] << ", ";
cout << endl;
}
return res;
}
//return the UC from SAT solver when it provides UNSAT
std::vector<int> AaltaSolver::get_uc ()
{
std::vector<int> reason;
if (verbose_)
cout << "get uc: \n";
for (int k = 0; k < conflict.size(); k++)
{
Lit l = conflict[k];
reason.push_back (-lit_id (l));
if (verbose_)
cout << -lit_id (l) << ", ";
}
if (verbose_)
cout << endl;
return reason;
}
void AaltaSolver::add_clause (std::vector<int>& v)
{
vec<Lit> lits;
for (std::vector<int>::iterator it = v.begin (); it != v.end (); it ++)
lits.push (SAT_lit (*it));
/*
if (verbose_)
{
cout << "Adding clause " << endl << "(";
for (int i = 0; i < lits.size (); i ++)
cout << lit_id (lits[i]) << ", ";
cout << ")" << endl;
cout << "Before adding, size of clauses is " << clauses.size () << endl;
}
*/
addClause (lits);
/*
if (verbose_)
cout << "After adding, size of clauses is " << clauses.size () << endl;
*/
}
void AaltaSolver::add_clause (int id)
{
std::vector<int> v;
v.push_back (id);
add_clause (v);
}
void AaltaSolver::add_clause (int id1, int id2)
{
std::vector<int> v;
v.push_back (id1);
v.push_back (id2);
add_clause (v);
}
void AaltaSolver::add_clause (int id1, int id2, int id3)
{
std::vector<int> v;
v.push_back (id1);
v.push_back (id2);
v.push_back (id3);
add_clause (v);
}
void AaltaSolver::add_clause (int id1, int id2, int id3, int id4)
{
std::vector<int> v;
v.push_back (id1);
v.push_back (id2);
v.push_back (id3);
v.push_back (id4);
add_clause (v);
}
void AaltaSolver::print_clauses ()
{
cout << "clauses in SAT solver: \n";
for (int i = 0; i < clauses.size (); i ++)
{
Clause& c = ca[clauses[i]];
for (int j = 0; j < c.size (); j ++)
cout << lit_id (c[j]) << ", ";
cout << endl;
}
}
}