8 #include "core/SolverTypes.h" 41 for (
unsigned i = 0; i < vars[course1][fieldType].size(); i++) {
45 Clauses conjunction(field1 & field2);
49 result = result | conjunction;
72 for (
unsigned i = 0; i < vars[course1][fieldType].size(); i++) {
74 resultClause.
addLits(~mkLit(vars[course1][fieldType][i],
false));
75 resultClause.
addLits(~mkLit(vars[course2][fieldType][i],
false));
92 for (
unsigned i = 0; i < vars[course1][FieldType::program].size(); i++) {
97 Clauses conjunction(field1 & field2);
101 result = result | conjunction;
121 for (
unsigned i = 0; i < vars[course1][FieldType::program].size(); i++) {
124 resultClause.
addLits(~mkLit(vars[course1][FieldType::program][i],
false));
125 resultClause.
addLits(~mkLit(vars[course2][FieldType::program][i],
false));
145 Clauses notSegmentIntersecting =
146 Clauses(notIntersectingTimeField(course1, course2, FieldType::segment));
148 Clauses(notIntersectingTimeField(course1, course2, FieldType::slot));
149 return (notSegmentIntersecting | notSlotIntersecting);
165 assert(fieldType == FieldType::segment || fieldType == FieldType::slot);
166 assert(vars[course1][fieldType].size() == vars[course2][fieldType].size());
167 assert(course1 != course2);
169 for (
unsigned i = 0; i < vars[course1][fieldType].size(); i++) {
170 Clauses hasFieldValue1(vars[course1][fieldType][i]);
172 for (
unsigned j = 0; j < vars[course1][fieldType].size(); j++) {
173 if ((fieldType == FieldType::segment &&
176 (fieldType == FieldType::slot &&
182 result.
addClauses(hasFieldValue1 >> notIntersecting1);
201 Clauses atLeastOne =
Clauses(hasAtLeastOneFieldValueTrue(course, fieldType));
202 Clauses atMostOne =
Clauses(hasAtMostOneFieldValueTrue(course, fieldType));
203 return (atLeastOne & atMostOne);
217 std::vector<Var> varsToUse = getAllowedVars(course, fieldType);
219 for (
unsigned i = 0; i < varsToUse.size(); i++) {
244 std::vector<Var> varsToUse = getAllowedVars(course, fieldType);
246 for (
unsigned i = 0; i < vars[course][fieldType].size(); i++) {
247 for (
unsigned j = i + 1; j < vars[course][fieldType].size(); j++) {
248 Clauses first(vars[course][fieldType][i]);
249 Clauses second(vars[course][fieldType][j]);
271 std::vector<Var> ConstraintEncoder::getAllowedVars(
int course,
273 std::vector<Var> varsToUse;
275 if (fieldType != FieldType::classroom) {
276 varsToUse = vars[course][fieldType];
278 for (
unsigned i = 0; i < vars[course][fieldType].size(); i++) {
281 varsToUse.push_back(vars[course][fieldType][i]);
297 Clauses result(vars[course][FieldType::isMinor]
312 for (
unsigned i = 0; i < vars[course][FieldType::slot].size(); i++) {
330 for (
unsigned i = 0; i < vars[course][FieldType::program].size(); i++) {
348 for (
unsigned i = 0; i < vars[course][FieldType::program].size(); i++) {
367 for (
unsigned i = 0; i < vars[course][FieldType::slot].size(); i++) {
387 for (
unsigned i = 0; i < vars[course][FieldType::program].size(); i += 2) {
389 resultClause.
addLits(~mkLit(vars[course][FieldType::program][i],
false));
391 ~mkLit(vars[course][FieldType::program][i + 1],
false));
411 int course,
FieldType fieldType, std::vector<int> indexList) {
413 for (
unsigned i = 0; i < indexList.size(); i++) {
Class for representing a clause.
void createLitAndAdd(const Var &)
Creates a Lit, a literal, given a variable, a Var, and adds it to the clause.
Clauses isCoreCourse(int)
Gives Clauses that represent that a Course is a core Course.
std::vector< Segment > segments
Clauses hasSameFieldTypeAndValue(int, int, FieldType)
Gives Clauses that represent that a pair of courses have the same field value for a given FieldType...
std::vector< Classroom > classrooms
std::vector< Slot > slots
Clauses programAtMostOneOfCoreOrElective(int)
Gives Clauses that represent that for a Course, it can be a part of a Program as at most one out of c...
Clauses isMinorCourse(int)
Gives Clauses that represent that a given Course is a minor Course.
Clauses slotInMinorTime(int)
Gives Clauses that represent that a given Course must have a minor Slot.
Clauses notIntersectingTimeField(int, int, FieldType)
Gives Clauses that represent that a pair of courses cannot have an intersecting value for a given Fie...
Clauses hasExactlyOneFieldValueTrue(int, FieldType)
Gives Clauses that represent that a Course can have exactly one field value of a given FieldType to b...
Clauses hasCommonProgram(int, int)
Gives Clauses that represent that a pair of courses are core for a given Program. ...
Clauses hasFieldTypeListedValues(int, FieldType, std::vector< int >)
Gives Clauses that represent that a Course has a field value for a given FieldType out of a list of p...
Clauses courseInMorningTime(int)
Gives Clauses that represent that a Course is scheduled in a morning Slot.
FieldType
Enum that represents all the field types.
Clauses isElectiveCourse(int)
Gives Clauses that represent that a Course is an elective Course.
void addClauses(const CClause &)
Adds a CClause to the set of clauses.
std::vector< Course > courses
void addLits(const Lit &)
Adds a Lit, a literal, to the clause.
Clauses hasSameFieldTypeNotSameValue(int, int, FieldType)
Gives Clauses that represent that a pair of courses do not have the same field value for a given Fiel...
Clauses hasNoCommonCoreProgram(int, int)
Gives Clauses that represent that at least one out of a pair of courses is not core for a given Progr...
Class for representing a set of clauses.
Clauses notIntersectingTime(int, int)
Gives Clauses that represent that a pair of courses cannot have an intersecting schedule.
ConstraintEncoder(Timetabler *)
Constructs the ConstraintEncoder object.
std::vector< Program > programs
std::vector< std::vector< std::vector< Var > > > fieldValueVars
Clauses hasAtLeastOneFieldValueTrue(int, FieldType)
Gives Clauses that represent that a Course can have at least one field value of a given FieldType to ...
Clauses hasAtMostOneFieldValueTrue(int, FieldType)
Gives Clauses that represent that a Course can have at most one field value of a given FieldType to b...