Skip to content
151 changes: 81 additions & 70 deletions generated/scheduled_times_dump.example.json
Original file line number Diff line number Diff line change
@@ -1,71 +1,82 @@
{
"LastName, FirstName": [
{
"start": "10:00AM",
"day": "MONDAY",
"end": "12:00PM"
},
{
"start": "10:00AM",
"day": "WEDNESDAY",
"end": "12:00PM"
},
{
"start": "10:00AM",
"day": "FRIDAY",
"end": "12:00PM"
},
{
"start": "4:00PM",
"day": "MONDAY",
"end": "6:00PM"
},
{
"start": "4:00PM",
"day": "WEDNESDAY",
"end": "6:00PM"
},
{
"start": "4:00PM",
"day": "FRIDAY",
"end": "6:00PM"
},
{
"start": "12:00PM",
"day": "MONDAY",
"end": "2:00PM"
},
{
"start": "12:00PM",
"day": "WEDNESDAY",
"end": "2:00PM"
},
{
"start": "12:00PM",
"day": "FRIDAY",
"end": "2:00PM"
}
],
"LastName2, FirstName2": [
{
"start": "9:00AM",
"day": "MONDAY",
"end": "10:30AM"
},
{
"start": "9:00AM",
"day": "WEDNESDAY",
"end": "10:30AM"
},
{
"start": "11:00AM",
"day": "MONDAY",
"end": "1:00PM"
},
{
"start": "11:00AM",
"day": "WEDNESDAY",
"end": "1:00PM"
}
]
}
"teachers": {
"LastName, FirstName": [
{
"start": "10:00AM",
"day": "MONDAY",
"end": "12:00PM"
},
{
"start": "10:00AM",
"day": "WEDNESDAY",
"end": "12:00PM"
},
{
"start": "10:00AM",
"day": "FRIDAY",
"end": "12:00PM"
},
{
"start": "4:00PM",
"day": "MONDAY",
"end": "6:00PM"
},
{
"start": "4:00PM",
"day": "WEDNESDAY",
"end": "6:00PM"
},
{
"start": "4:00PM",
"day": "FRIDAY",
"end": "6:00PM"
},
{
"start": "12:00PM",
"day": "MONDAY",
"end": "2:00PM"
},
{
"start": "12:00PM",
"day": "WEDNESDAY",
"end": "2:00PM"
},
{
"start": "12:00PM",
"day": "FRIDAY",
"end": "2:00PM"
}
],
"LastName2, FirstName2": [
{
"start": "9:00AM",
"day": "MONDAY",
"end": "10:30AM"
},
{
"start": "9:00AM",
"day": "WEDNESDAY",
"end": "10:30AM"
},
{
"start": "11:00AM",
"day": "MONDAY",
"end": "1:00PM"
},
{
"start": "11:00AM",
"day": "WEDNESDAY",
"end": "1:00PM"
}
]
},
"rooms": {
"Room 101": [
{
"start": "8:00AM",
"day": "TUESDAY",
"end": "9:30AM"
}
]
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.acme.schooltimetabling.DefaultTimes;
package org.acme.schooltimetabling.defaultTimes;

import java.util.BitSet;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.acme.schooltimetabling.DefaultTimes;
package org.acme.schooltimetabling.defaultTimes;

import org.acme.schooltimetabling.constants.Constants;
import org.acme.schooltimetabling.constants.Days;
Expand Down Expand Up @@ -26,18 +26,28 @@ public class DefaultTimeAll implements DefaultTime{
final DateTimeFormatter FORMATTER = Constants.TIME_FORMATTER;
EnumSet<Days> defaultDays = EnumSet.allOf(Days.class);

List<LocalTime> acceptableTimes = List.of(
//I'm trying to set preferred times outside of prime time to help solver push more lectures into this time.
List<LocalTime> preferredTimes = List.of(
LocalTime.parse("7:00AM", FORMATTER),
LocalTime.parse("8:00AM", FORMATTER),
LocalTime.parse("3:00PM", FORMATTER),
LocalTime.parse("4:00PM", FORMATTER),
LocalTime.parse("5:00PM", FORMATTER)

);

for(LocalTime localTime : preferredTimes){
INSTANCE.preference.or(BitSetHelper.timeSlotBitSet(localTime, NUM_BLOCKS_FULL_HOUR, defaultDays));
}


List<LocalTime> acceptableTimes = List.of(
LocalTime.parse("9:00AM", FORMATTER),
LocalTime.parse("10:00AM", FORMATTER),
LocalTime.parse("11:00AM", FORMATTER),
LocalTime.parse("12:00PM", FORMATTER),
LocalTime.parse("1:00PM", FORMATTER),
LocalTime.parse("2:00PM", FORMATTER),
LocalTime.parse("3:00PM", FORMATTER),
LocalTime.parse("4:00PM", FORMATTER),
LocalTime.parse("5:00PM", FORMATTER)
LocalTime.parse("2:00PM", FORMATTER)
);
for(LocalTime localTime : acceptableTimes) {
INSTANCE.acceptable.or(BitSetHelper.timeSlotBitSet(localTime, NUM_BLOCKS_FULL_HOUR, defaultDays));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.acme.schooltimetabling.DefaultTimes;
package org.acme.schooltimetabling.defaultTimes;

import org.acme.schooltimetabling.constants.Constants;
import org.acme.schooltimetabling.constants.Days;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.acme.schooltimetabling.DefaultTimes;
package org.acme.schooltimetabling.defaultTimes;

import org.acme.schooltimetabling.constants.Constants;
import org.acme.schooltimetabling.constants.Days;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.acme.schooltimetabling.DefaultTimes;
package org.acme.schooltimetabling.defaultTimes;

import java.util.List;
import java.util.Random;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import ai.timefold.solver.core.api.domain.lookup.PlanningId;

import java.util.BitSet;

public class Room {

@PlanningId
Expand All @@ -12,18 +14,25 @@ public class Room {
* of what is needed for scheduling. Anything else is for debugging
* but even that could be found in the hashmaps that have been created*/
private int ID;

private BitSet prescheduled;

public static boolean hasPrescheduled = false;

public Room() {
}

public Room(String id, String name) {
this.id = id;
this.name = name;
this.prescheduled = new BitSet();
}

public Room(String id, String name, int ID){
this.id = id;
this.name = name;
this.ID = ID;
this.prescheduled = new BitSet();
}

@Override
Expand All @@ -46,4 +55,12 @@ public String getName() {
public int getID() {
return ID;
}

public BitSet getPrescheduled(){
return (BitSet) prescheduled.clone();
}

public void prescheduleUpdate(BitSet addBitset){
if(addBitset != null) this.prescheduled.or(addBitset);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,14 @@ public class Faculty extends Teacher{
final int NUM_BLOCKS_FULL_HOUR = 2;
List<LocalTime> facultyTimes;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("h:mma");
EnumSet<Days> facultyDays = EnumSet.of(Days.MONDAY, Days.WEDNESDAY, Days.FRIDAY);
EnumSet<Days> facultyDays;

try{
//set special bits for testing
if(Constants.TESTING){
LocalTime localTime = LocalTime.parse("9:00PM", formatter);
BitSet temp = BitSetHelper.timeSlotBitSet(localTime, NUM_BLOCKS_FULL_HOUR,
EnumSet.of(Days.MONDAY, Days.WEDNESDAY, Days.FRIDAY));
EnumSet.of(Days.MONDAY, Days.TUESDAY, Days.WEDNESDAY, Days.THURSDAY));
FACULTY_CONFLICT.or(temp);
}
/*CSC faculty times*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.acme.schooltimetabling.helperClasses;
import org.acme.schooltimetabling.constants.Constants;
import org.acme.schooltimetabling.constants.Days;
import org.acme.schooltimetabling.helperClasses.PrescheduleObject.PrescheduledWindow;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -212,4 +213,18 @@ public static BitSet timeJsonToBs(Map<String, String> time) {
bitSet.set(dayOffset + startBlock, dayOffset + endBlock);
return bitSet;
}

public static BitSet timeJsonToBs(PrescheduledWindow time) {
if (time == null) {
throw new IllegalArgumentException("Time window must not be null");
}

Map<String, String> mappedTime = Map.of(
"day", time.getDay(),
"start", time.getStart(),
"end", time.getEnd()
);

return timeJsonToBs(mappedTime);
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package org.acme.schooltimetabling.helperClasses.Generators;

import org.acme.schooltimetabling.DefaultTimes.DefaultTime;
import org.acme.schooltimetabling.DefaultTimes.DefaultTimeRegistry;
import org.acme.schooltimetabling.defaultTimes.DefaultTime;
import org.acme.schooltimetabling.defaultTimes.DefaultTimeRegistry;
import org.acme.schooltimetabling.constants.Constants;
import org.acme.schooltimetabling.constants.Preference;
import org.acme.schooltimetabling.domain.lesson.Lesson;
import org.acme.schooltimetabling.domain.teacher.Faculty;
import org.acme.schooltimetabling.helperClasses.ParseInput;
import org.acme.schooltimetabling.helperClasses.PrescheduleObject;
import org.acme.schooltimetabling.helperClasses.ScheduleConfig;
import org.acme.schooltimetabling.helperClasses.ScheduleFormat;
import org.acme.schooltimetabling.domain.teacher.Teacher;
Expand All @@ -21,7 +22,8 @@ public class LessonGenerator extends Generator{
public static boolean OLD_studio_detected = false;
public static boolean proper_studio_detected = false;
private static final Logger LOGGER = LoggerFactory.getLogger(LessonGenerator.class);
private static final Map<String, List<Map<String, String>>> PRESCHED_TIMES = ParseInput.readPrescheduledFile();
private static final PrescheduleObject PRESCHED_TIMES = ScheduleConfig.getPrescheduledFileName() != null ?
ParseInput.readPrescheduledFile() : null;
/**
* Keeps track of the next available section number available for a course
*/
Expand Down Expand Up @@ -195,12 +197,12 @@ private static Teacher getTeacher(Map<String, Teacher> teacherHashMap, String te
teacher = noSurveyTeacher(teacherName, defaultTime);

//add prescheduled times if possible
if(PRESCHED_TIMES.containsKey(teacherName)){
if(PRESCHED_TIMES != null && PRESCHED_TIMES.getTeachers().containsKey(teacherName)){
LOGGER.info(String.format("Found a prescheduled time for '%s'. Adding the time to their conflict bitset.",
teacherName));

try {
BitSet addConflict = TeacherGenerator.createPreschedBs(PRESCHED_TIMES.get(teacherName));
BitSet addConflict = TeacherGenerator.createPreschedBs(PRESCHED_TIMES.getTeachers().get(teacherName));
teacher.getAcceptable().andNot(addConflict);
teacher.getPreferences().andNot(addConflict);
teacher.getConflict().or(addConflict);
Expand Down Expand Up @@ -327,19 +329,24 @@ private static boolean skipCourse(String modifier, String name, String config){
private static Teacher noSurveyTeacher(String name, DefaultTime defaultTime){
final int LAST_NAME_POS = 0;
String[] nameFragments = name.split(",");
boolean isFaculty = Constants.FACULTY_LAST_NAMES.contains(nameFragments[LAST_NAME_POS]);

if(Constants.FACULTY_LAST_NAMES.contains(nameFragments[LAST_NAME_POS])){
LOGGER.info(String.format("Found teacher '%s' to be a faculty member. Promoting Teacher obj to Faculty"
if(isFaculty){
LOGGER.info(String.format("Found teacher '%s' to be a faculty member. Promoting to Faculty"
, name));
return new Faculty(TeacherGenerator.getNextTeacherID(), name, new BitSet(), new BitSet(), new BitSet(),
return new Faculty(TeacherGenerator.getNextTeacherID(), name,
defaultTime.getPreference(),
defaultTime.getAcceptable(),
defaultTime.getConflict(),
Preference.NEUTRAL);
}
else{
return new Teacher(TeacherGenerator.getNextTeacherID(), name,
defaultTime.getPreference(),
defaultTime.getAcceptable(),
defaultTime.getConflict(),
Preference.NEUTRAL);
}

return new Teacher(TeacherGenerator.getNextTeacherID(), name,
defaultTime.getPreference(),
defaultTime.getAcceptable(),
defaultTime.getConflict(),
Preference.NEUTRAL);
}


Expand Down
Loading
Loading