Timetabler
clauses.cpp
1 #include "clauses.h"
2 
3 #include <iostream>
4 #include <vector>
5 #include "cclause.h"
6 #include "core/SolverTypes.h"
7 #include "global_vars.h"
8 #include "utils.h"
9 
10 using namespace NSPACE;
11 
17 Clauses::Clauses(const std::vector<CClause> &clauses) {
18  this->clauses = clauses;
19 }
20 
26 Clauses::Clauses(const CClause &clause) {
27  clauses.clear();
28  clauses.push_back(clause);
29 }
30 
37 Clauses::Clauses(const Lit &lit) {
38  clauses.clear();
39  CClause clause(lit);
40  clauses.push_back(clause);
41 }
42 
51 Clauses::Clauses(const Var &var) {
52  clauses.clear();
53  CClause clause(var);
54  clauses.push_back(clause);
55 }
56 
60 Clauses::Clauses() { clauses.clear(); }
61 
72  if (clauses.size() == 0) {
73  CClause clause;
74  return Clauses(clause);
75  }
76  Clauses negationClause(~(clauses[0]));
77  for (unsigned i = 1; i < clauses.size(); i++) {
78  std::vector<CClause> negationClauseVector = ~(clauses[i]);
79  Clauses negationThisClause(negationClauseVector);
80  negationClause = (negationClause | negationThisClause);
81  }
82  return negationClause;
83 }
84 
98 Clauses Clauses::operator&(const Clauses &other) {
99  std::vector<CClause> thisClauses = clauses;
100  std::vector<CClause> otherClauses = other.clauses;
101  thisClauses.insert(std::end(thisClauses), std::begin(otherClauses),
102  std::end(otherClauses));
103  Clauses result(thisClauses);
104  return result;
105 }
106 
115 Clauses Clauses::operator&(const CClause &other) {
116  Clauses otherClauses(other);
117  return operator&(otherClauses);
118 }
119 
150  if (other.getClauses().size() == 0) {
151  Clauses result = other;
152  return result;
153  }
154  // x and y are auxiliary variables for the sets of the clauses that are being
155  // disjunctioned
156  Lit x = timetabler->newLiteral();
157  Lit y = timetabler->newLiteral();
158  Clauses result(CClause(x) | CClause(y));
159  vec<Lit> xrep;
160  xrep.push(x);
161  vec<Lit> yrep;
162  yrep.push(y);
163  for (unsigned i = 0; i < clauses.size(); i++) {
164  // c1 is the auxiliary variable for a ith clause
165  Lit c1 = timetabler->newLiteral();
166  xrep.push(~c1);
167  vec<Lit> clause;
168  clause.push(c1);
169  clause.push(~x);
170  timetabler->addToFormula(clause, -1);
171  CClause c1rep(~c1);
172  for (unsigned j = 0; j < clauses[i].getLits().size(); j++) {
173  c1rep.addLits(clauses[i].getLits()[j]);
174  vec<Lit> clause;
175  clause.push(c1);
176  clause.push(~clauses[i].getLits()[j]);
177  timetabler->addToFormula(clause, -1);
178  }
179  timetabler->addClauses(c1rep, -1);
180  }
181  for (unsigned i = 0; i < other.clauses.size(); i++) {
182  // c1 is the auxiliary variable for a ith clause
183  Lit c1 = timetabler->newLiteral();
184  yrep.push(~c1);
185  vec<Lit> clause;
186  clause.push(c1);
187  clause.push(~y);
188  timetabler->addToFormula(clause, -1);
189  CClause c1rep(~c1);
190  for (unsigned j = 0; j < other.clauses[i].getLits().size(); j++) {
191  c1rep.addLits(other.clauses[i].getLits()[j]);
192  vec<Lit> clause;
193  clause.push(c1);
194  clause.push(~other.clauses[i].getLits()[j]);
195  timetabler->addToFormula(clause, -1);
196  }
197  timetabler->addClauses(c1rep, -1);
198  }
199  timetabler->addToFormula(xrep, -1);
200  timetabler->addToFormula(yrep, -1);
201  return result;
202 }
203 
213  Clauses otherClauses(other);
214  return operator|(otherClauses);
215 }
216 
229  Clauses negateThis = operator~();
230  return (negateThis | other);
231 }
232 
238 void Clauses::addClauses(const CClause &other) { clauses.push_back(other); }
239 
245 void Clauses::addClauses(const std::vector<CClause> &other) {
246  clauses.insert(std::end(clauses), std::begin(other), std::end(other));
247 }
248 
254 void Clauses::addClauses(const Clauses &other) {
255  std::vector<CClause> otherClauses = other.getClauses();
256  addClauses(otherClauses);
257 }
258 
264 std::vector<CClause> Clauses::getClauses() const { return clauses; }
265 
270  for (CClause c : clauses) {
271  c.printClause();
272  }
273  LOG_DEBUG(INFO) << "";
274 }
275 
279 void Clauses::clear() { clauses.clear(); }
Class for representing a clause.
Definition: cclause.h:21
Clauses()
Constructs the Clauses object, with no clauses in it.
Definition: clauses.cpp:60
Lit newLiteral(bool sign=false)
Calls the formula to issue a new literal and returns it.
Definition: timetabler.cpp:276
std::vector< CClause > getClauses() const
Gets the clauses in this object.
Definition: clauses.cpp:264
Clauses operator>>(const Clauses &)
Defines the implication operation between two sets of Clauses.
Definition: clauses.cpp:228
Clauses operator|(const Clauses &)
Defines the disjunction operation between two sets of clauses.
Definition: clauses.cpp:149
Timetabler * timetabler
Definition: main.cpp:90
void print()
Displays the clauses in this object.
Definition: clauses.cpp:269
void addToFormula(vec< Lit > &, int)
Add a given vec of literals with the given weight to the formula.
Definition: timetabler.cpp:147
void addClauses(const CClause &)
Adds a CClause to the set of clauses.
Definition: clauses.cpp:238
void addLits(const Lit &)
Adds a Lit, a literal, to the clause.
Definition: cclause.cpp:251
void clear()
Clears the Clauses object by removing all the clauses.
Definition: clauses.cpp:279
Class for representing a set of clauses.
Definition: clauses.h:23
Clauses operator~()
Defines the negation operation on a set of clauses.
Definition: clauses.cpp:71
void addClauses(const std::vector< CClause > &, int)
Adds clauses to the solver with specified weights.
Definition: timetabler.cpp:35