def _scheduling_satisfiable(casename): students, sessions = _open_scheduling_case(casename) formula = lab.boolify_scheduling_problem(copy.deepcopy(students), copy.deepcopy(sessions)) sched = lab.satisfying_assignment(formula) assert sched is not None unplaced_students = set(students) for var, val in sched.items(): if val: student, session = var.split('_') assert student in unplaced_students, "Students should be assigned at most one session." unplaced_students.remove(student) assert student in students, "This is not a valid student." assert session in sessions, "This is not a valid session." assert session in students[ student], "Student should be assigned a desired session." assert sessions[session] >= 1, "This session is over-capacity." sessions[session] -= 1 assert not unplaced_students, "Some students were not placed into a section!"
def satisfiable(self, casename): students, sessions = self.opencase(casename) formula = lab.boolify_scheduling_problem(copy.deepcopy(students), copy.deepcopy(sessions)) sched = lab.satisfying_assignment(formula) self.assertIsNotNone(sched) unplaced_students = set(students) for var, val in sched.items(): if val: student, session = var.split('_') self.assertIn( student, unplaced_students, "Students should be assigned at most one session.") unplaced_students.remove(student) self.assertIn(student, students, "This is not a valid student.") self.assertIn(session, students[student], "Student should be assigned a desired session.") self.assertIn(session, sessions, "This is not a valid session.") self.assertTrue(sessions[session] >= 1, "This session is over-capacity.") sessions[session] -= 1 self.assertEqual(len(unplaced_students), 0)
def test_schedule(self): students, sessions = ({'Alice': {'basement', 'penthouse'}, 'Bob': {'kitchen'}, 'Charles': {'basement', 'kitchen'}, 'Dana': {'kitchen', 'penthouse', 'basement'}}, {'basement': 1, 'kitchen': 2, 'penthouse': 4}) cnf = lab.boolify_scheduling_problem(students, sessions) print(lab.satisfying_assignment(cnf))
def satisfiable(self, casename): students, sessions = self.opencase(casename) formula = lab.boolify_scheduling_problem(copy.deepcopy(students), copy.deepcopy(sessions)) sched = lab.satisfying_assignment(formula) self.assertIsNotNone(sched) unplaced_students = set(students) for var, val in sched.items(): if val: student, session = var.split('_') self.assertIn(student, unplaced_students) unplaced_students.remove(student) self.assertIn(student, students) self.assertIn(session, students[student]) self.assertIn(session, sessions) self.assertTrue(sessions[session] >= 1) sessions[session] -= 1 self.assertEqual(len(unplaced_students), 0)
def unsatisfiable(self, casename): students, sessions = self.opencase(casename) sched = lab.satisfying_assignment( lab.boolify_scheduling_problem(copy.deepcopy(students), copy.deepcopy(sessions))) self.assertIsNone(sched)
def _scheduling_unsatisfiable(casename): students, sessions = _open_scheduling_case(casename) sched = lab.satisfying_assignment( lab.boolify_scheduling_problem(copy.deepcopy(students), copy.deepcopy(sessions))) assert sched is None