7 #include "MaxSATFormula.h" 10 #include "core/SolverTypes.h" 21 solver =
new TSolver(1, _CARD_TOTALIZER_);
22 formula =
new MaxSATFormula();
23 formula->setProblemType(_WEIGHTED_);
36 for (
unsigned i = 0; i < clauses.size(); i++) {
38 std::vector<Lit> clauseVector = clauses[i].getLits();
39 for (
unsigned j = 0; j < clauseVector.size(); j++) {
40 clauseVec.push(clauseVector[j]);
42 addToFormula(clauseVec, weight);
52 for (
unsigned j = 0; j < data.highLevelVars.size(); j++) {
53 vec<Lit> highLevelClause;
54 highLevelClause.clear();
55 highLevelClause.push(mkLit(data.highLevelVars[j][i],
false));
56 addToFormula(highLevelClause, data.highLevelVarWeights[i]);
75 assert(data.predefinedConstraintVars[clauseType].size() == 1);
76 Lit l = mkLit(data.predefinedConstraintVars[clauseType][0],
false);
77 if (data.predefinedClausesWeights[clauseType] != 0) {
78 addToFormula(l, data.predefinedClausesWeights[clauseType]);
83 assert(data.predefinedConstraintVars[clauseType].size() ==
85 Lit l = mkLit(data.predefinedConstraintVars[clauseType][course],
false);
86 if (data.predefinedClausesWeights[clauseType] != 0) {
87 addToFormula(l, data.predefinedClausesWeights[clauseType]);
106 Lit l = mkLit(data.customConstraintVars[index],
false);
108 addToFormula(l, weight);
119 for (
unsigned i = 0; i < data.existingAssignmentVars.size(); i++) {
120 for (
unsigned j = 0; j < data.existingAssignmentVars[i].size(); j++) {
121 for (
unsigned k = 0; k < data.existingAssignmentVars[i][j].size(); k++) {
122 if (data.existingAssignmentVars[i][j][k] == l_Undef) {
127 if (data.existingAssignmentVars[i][j][k] == l_True) {
128 clause.push(mkLit(data.fieldValueVars[i][j][k]));
130 clause.push(~mkLit(data.fieldValueVars[i][j][k]));
132 addToFormula(clause, data.existingAssignmentWeights[j]);
149 formula->addHardClause(input);
150 }
else if (weight > 0) {
151 formula->addSoftClause(weight, input);
163 inputLits.push(input);
164 addToFormula(inputLits, weight);
186 solver->loadFormula(formula);
187 model = solver->tSearch();
188 if (model.size() == 0) {
191 if (checkAllTrue(Utils::flattenVector<Var>(data.highLevelVars)) &&
192 checkAllTrue(data.predefinedConstraintVars) &&
193 checkAllTrue(data.customConstraintVars)) {
208 if (model.size() == 0) {
211 for (
unsigned i = 0; i < inputs.size(); i++) {
212 if (model[inputs[i]] == l_False) {
228 if (model.size() == 0) {
231 for (
auto &i : inputs) {
233 if (model[j] == l_False)
return false;
248 if (model.size() == 0) {
251 if (model[v] == l_False) {
263 Var var = formula->nVars();
277 Lit p = mkLit(formula->nVars(), sign);
287 LOG(INFO) <<
"All high level clauses were satisfied";
288 displayChangesInGivenAssignment();
291 LOG(WARNING) <<
"Some high level clauses were not satisfied";
292 displayUnsatisfiedOutputReasons();
293 displayChangesInGivenAssignment();
296 LOG(WARNING) <<
"Not Solved";
305 for (
unsigned i = 0; i < data.existingAssignmentVars.size(); i++) {
306 for (
unsigned j = 0; j < data.existingAssignmentVars[i].size(); j++) {
307 for (
unsigned k = 0; k < data.existingAssignmentVars[i][j].size(); k++) {
308 if (data.existingAssignmentVars[i][j][k] == l_True &&
309 model[data.fieldValueVars[i][j][k]] == l_False) {
310 LOG(WARNING) <<
"Value of field " 311 << Utils::getFieldTypeName(
FieldType(j)) <<
" " 312 << Utils::getFieldName(
FieldType(j), k, data)
313 <<
" for course " << data.courses[i].getName()
314 <<
" changed from 'True' to 'False'";
315 }
else if (data.existingAssignmentVars[i][j][k] == l_False &&
316 model[data.fieldValueVars[i][j][k]] == l_True) {
317 LOG(WARNING) <<
"Value of field " 318 << Utils::getFieldTypeName(
FieldType(j)) <<
" " 319 << Utils::getFieldName(
FieldType(j), k, data)
320 <<
" for course " << data.courses[i].getName()
321 <<
" changed from 'False' to 'True'";
332 for (
unsigned i = 0; i < data.courses.size(); i++) {
333 LOG(INFO) <<
"Course : " << data.courses[i].getName();
334 for (
unsigned j = 0; j < data.fieldValueVars[i][FieldType::slot].size();
336 if (isVarTrue(data.fieldValueVars[i][FieldType::slot][j])) {
337 LOG(INFO) <<
"Slot : " << data.slots[j].getName();
341 j < data.fieldValueVars[i][FieldType::instructor].size(); j++) {
342 if (isVarTrue(data.fieldValueVars[i][FieldType::instructor][j])) {
343 LOG(INFO) <<
"Instructor : " << data.instructors[j].getName();
347 j < data.fieldValueVars[i][FieldType::classroom].size(); j++) {
348 if (isVarTrue(data.fieldValueVars[i][FieldType::classroom][j])) {
349 LOG(INFO) <<
"Classroom : " << data.classrooms[j].getName();
352 for (
unsigned j = 0; j < data.fieldValueVars[i][FieldType::segment].size();
354 if (isVarTrue(data.fieldValueVars[i][FieldType::segment][j])) {
355 LOG(INFO) <<
"Segment : " << data.segments[j].getName();
358 for (
unsigned j = 0; j < data.fieldValueVars[i][FieldType::isMinor].size();
360 if (isVarTrue(data.fieldValueVars[i][FieldType::isMinor][j])) {
361 LOG(INFO) <<
"Is Minor : " << data.isMinors[j].getName();
364 for (
unsigned j = 0; j < data.fieldValueVars[i][FieldType::program].size();
366 if (isVarTrue(data.fieldValueVars[i][FieldType::program][j])) {
367 LOG(INFO) <<
"Program : " << data.programs[j].getNameWithType();
380 std::ofstream fileObject;
381 fileObject.open(fileName);
382 fileObject <<
"name,class_size,instructor,segment,is_minor,";
383 for (
unsigned i = 0; i < data.programs.size(); i += 2) {
384 fileObject << data.programs[i].getName() <<
",";
386 fileObject <<
"classroom,slot" << std::endl;
387 for (
unsigned i = 0; i < data.courses.size(); i++) {
388 fileObject << data.courses[i].getName() <<
"," 389 << data.courses[i].getClassSize() <<
",";
391 j < data.fieldValueVars[i][FieldType::instructor].size(); j++) {
392 if (isVarTrue(data.fieldValueVars[i][FieldType::instructor][j])) {
393 fileObject << data.instructors[j].getName();
397 for (
unsigned j = 0; j < data.fieldValueVars[i][FieldType::segment].size();
399 if (isVarTrue(data.fieldValueVars[i][FieldType::segment][j])) {
400 fileObject << data.segments[j].getName();
404 for (
unsigned j = 0; j < data.fieldValueVars[i][FieldType::isMinor].size();
406 if (isVarTrue(data.fieldValueVars[i][FieldType::isMinor][j])) {
407 fileObject << data.isMinors[j].getName();
411 for (
unsigned j = 0; j < data.fieldValueVars[i][FieldType::program].size();
413 if (isVarTrue(data.fieldValueVars[i][FieldType::program][j])) {
414 fileObject << data.programs[j].getCourseTypeName() <<
",";
415 }
else if (isVarTrue(data.fieldValueVars[i][FieldType::program][j + 1])) {
416 fileObject << data.programs[j + 1].getCourseTypeName() <<
",";
422 j < data.fieldValueVars[i][FieldType::classroom].size(); j++) {
423 if (isVarTrue(data.fieldValueVars[i][FieldType::classroom][j])) {
424 fileObject << data.classrooms[j].getName();
428 for (
unsigned j = 0; j < data.fieldValueVars[i][FieldType::slot].size();
430 if (isVarTrue(data.fieldValueVars[i][FieldType::slot][j])) {
431 fileObject << data.slots[j].getName();
434 fileObject << std::endl;
444 for (
unsigned i = 0; i < data.highLevelVars.size(); i++) {
445 for (
unsigned j = 0; j < data.highLevelVars[i].size(); j++) {
446 if (!isVarTrue(data.highLevelVars[i][j])) {
447 LOG(WARNING) <<
"Field : " << Utils::getFieldTypeName(
FieldType(j))
448 <<
" of Course : " << data.courses[i].getName()
449 <<
" could not be satisfied";
453 for (
unsigned i = 0; i < data.predefinedConstraintVars.size(); i++) {
454 if (!checkAllTrue(data.predefinedConstraintVars[i]) &&
455 data.predefinedClausesWeights[i] != 0) {
456 LOG(WARNING) <<
"Predefined Constraint : " 458 <<
" could not be satisfied";
461 for (
unsigned i = 0; i < data.customConstraintVars.size(); i++) {
462 if (!isVarTrue(data.customConstraintVars[i])) {
463 LOG(WARNING) <<
"Custom Constraint : " << i + 1 <<
" for course " 464 << data.courses[data.customMap[i + 1]].getName()
465 <<
" could not be satisfied";
std::vector< CClause > getClauses() const
Gets the clauses in this object.
PredefinedClauses
Enum that represents all the predefined constraints.
FieldType
Enum that represents all the field types.
static const int FIELD_COUNT
Class for representing a set of clauses.