Skip to content

Commit

Permalink
fix: stabilize Meeting Scheduling benchmark
Browse files Browse the repository at this point in the history
  • Loading branch information
triceo committed Jan 10, 2025
1 parent c1749b0 commit b574c26
Show file tree
Hide file tree
Showing 26 changed files with 159,279 additions and 591 deletions.
9,143 changes: 9,143 additions & 0 deletions data/meetingscheduling/meetingscheduling-100-320-5.json

Large diffs are not rendered by default.

Binary file not shown.
9,143 changes: 9,143 additions & 0 deletions data/meetingscheduling/unsolved/100meetings-320timegrains-5rooms.json

Large diffs are not rendered by default.

Binary file not shown.
19,129 changes: 19,129 additions & 0 deletions data/meetingscheduling/unsolved/200meetings-640timegrains-5rooms.json

Large diffs are not rendered by default.

Binary file not shown.
38,411 changes: 38,411 additions & 0 deletions data/meetingscheduling/unsolved/400meetings-1280timegrains-5rooms.json

Large diffs are not rendered by default.

Binary file not shown.
5,111 changes: 5,111 additions & 0 deletions data/meetingscheduling/unsolved/50meetings-160timegrains-5rooms.json

Large diffs are not rendered by default.

Binary file not shown.
78,209 changes: 78,209 additions & 0 deletions data/meetingscheduling/unsolved/800meetings-2560timegrains-5rooms.json

Large diffs are not rendered by default.

Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package ai.timefold.solver.benchmarks.examples.common.persistence;

import java.io.File;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
Expand Down Expand Up @@ -58,9 +57,4 @@ protected <Key_, Value_, Index_> Map<Key_, Value_> deduplicateMap(Map<Key_, Valu
return newMap;
}

@Override
public final void write(Solution_ solution, File outputSolutionFile) {
throw new UnsupportedOperationException();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import ai.timefold.solver.benchmarks.examples.common.app.CommonApp;
import ai.timefold.solver.benchmarks.examples.meetingscheduling.domain.MeetingSchedule;
import ai.timefold.solver.benchmarks.examples.meetingscheduling.persistence.MeetingSchedulingXlsxFileIO;
import ai.timefold.solver.benchmarks.examples.meetingscheduling.persistence.MeetingSchedulingSolutionFileIO;
import ai.timefold.solver.persistence.common.api.domain.solution.SolutionFileIO;

public class MeetingSchedulingApp extends CommonApp<MeetingSchedule> {
Expand All @@ -13,7 +13,7 @@ public class MeetingSchedulingApp extends CommonApp<MeetingSchedule> {
public static final String DATA_DIR_NAME = "meetingscheduling";

public static void main(String[] args) {
var solution = new MeetingSchedulingApp().solve("100meetings-320timegrains-5rooms.xlsx");
var solution = new MeetingSchedulingApp().solve("100meetings-320timegrains-5rooms.json");
System.out.println("Done: " + solution);
}

Expand All @@ -25,7 +25,7 @@ public MeetingSchedulingApp() {

@Override
public SolutionFileIO<MeetingSchedule> createSolutionFileIO() {
return new MeetingSchedulingXlsxFileIO();
return new MeetingSchedulingSolutionFileIO();
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
package ai.timefold.solver.benchmarks.examples.meetingscheduling.domain;

import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;

import ai.timefold.solver.benchmarks.examples.common.persistence.jackson.JacksonUniqueIdGenerator;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({
@JsonSubTypes.Type(value = RequiredAttendance.class, name = "required"),
@JsonSubTypes.Type(value = PreferredAttendance.class, name = "preferred"),
})
@JsonIdentityInfo(generator = JacksonUniqueIdGenerator.class)
public abstract class Attendance extends AbstractPersistable {

private Person person;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,12 @@
import java.util.Locale;

import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
import ai.timefold.solver.benchmarks.examples.common.persistence.jackson.JacksonUniqueIdGenerator;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIdentityInfo(generator = JacksonUniqueIdGenerator.class)
public class Day extends AbstractPersistable
implements Comparable<Day> {

Expand All @@ -29,10 +34,12 @@ public void setDayOfYear(int dayOfYear) {
this.dayOfYear = dayOfYear;
}

@JsonIgnore
public String getDateString() {
return DAY_FORMATTER.format(toDate());
}

@JsonIgnore
public LocalDate toDate() {
return LocalDate.ofYearDay(LocalDate.now().getYear(), dayOfYear);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import java.util.List;

import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
import ai.timefold.solver.benchmarks.examples.common.persistence.jackson.JacksonUniqueIdGenerator;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIdentityInfo(generator = JacksonUniqueIdGenerator.class)
public class Meeting extends AbstractPersistable {

private String topic;
private List<Person> speakerList;
private String content;
private boolean entireGroupMeeting;
/**
* Multiply by {@link TimeGrain#GRAIN_LENGTH_IN_MINUTES} to get duration in minutes.
*/
Expand Down Expand Up @@ -39,30 +41,6 @@ public void setTopic(String topic) {
this.topic = topic;
}

public List<Person> getSpeakerList() {
return speakerList;
}

public void setSpeakerList(List<Person> speakerList) {
this.speakerList = speakerList;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}

public boolean isEntireGroupMeeting() {
return entireGroupMeeting;
}

public void setEntireGroupMeeting(boolean entireGroupMeeting) {
this.entireGroupMeeting = entireGroupMeeting;
}

public int getDurationInGrains() {
return durationInGrains;
}
Expand Down Expand Up @@ -91,18 +69,11 @@ public void setPreferredAttendanceList(List<PreferredAttendance> preferredAttend
// Complex methods
// ************************************************************************

@JsonIgnore
public int getRequiredCapacity() {
return requiredAttendanceList.size() + preferredAttendanceList.size();
}

public String getDurationString() {
return (durationInGrains * TimeGrain.GRAIN_LENGTH_IN_MINUTES) + " minutes";
}

public String getLabel() {
return topic;
}

@Override
public String toString() {
return topic;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package ai.timefold.solver.benchmarks.examples.meetingscheduling.domain;

import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
import ai.timefold.solver.benchmarks.examples.common.persistence.jackson.JacksonUniqueIdGenerator;
import ai.timefold.solver.core.api.domain.entity.PlanningEntity;
import ai.timefold.solver.core.api.domain.entity.PlanningPin;
import ai.timefold.solver.core.api.domain.variable.PlanningVariable;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;

@PlanningEntity
@JsonIdentityInfo(generator = JacksonUniqueIdGenerator.class)
public class MeetingAssignment extends AbstractPersistable {

private Meeting meeting;
Expand Down Expand Up @@ -90,27 +95,31 @@ public int calculateOverlap(MeetingAssignment other) {
return Math.min(end, otherEnd) - Math.max(start, otherStart);
}

@JsonIgnore
public Integer getLastTimeGrainIndex() {
if (startingTimeGrain == null) {
return null;
}
return startingTimeGrain.getGrainIndex() + meeting.getDurationInGrains() - 1;
}

@JsonIgnore
public String getStartingDateTimeString() {
if (startingTimeGrain == null) {
return null;
}
return startingTimeGrain.getDateTimeString();
}

@JsonIgnore
public int getRoomCapacity() {
if (room == null) {
return 0;
}
return room.getCapacity();
}

@JsonIgnore
public int getRequiredCapacity() {
return meeting.getRequiredCapacity();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package ai.timefold.solver.benchmarks.examples.meetingscheduling.domain;

import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
import ai.timefold.solver.benchmarks.examples.common.persistence.jackson.JacksonUniqueIdGenerator;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;

@JsonIdentityInfo(generator = JacksonUniqueIdGenerator.class)
public class Person extends AbstractPersistable {

private String fullName;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package ai.timefold.solver.benchmarks.examples.meetingscheduling.domain;

import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
import ai.timefold.solver.benchmarks.examples.common.persistence.jackson.JacksonUniqueIdGenerator;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;

@JsonIdentityInfo(generator = JacksonUniqueIdGenerator.class)
public class Room extends AbstractPersistable {

private String name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@
import java.util.Objects;

import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
import ai.timefold.solver.benchmarks.examples.common.persistence.jackson.JacksonUniqueIdGenerator;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIdentityInfo(generator = JacksonUniqueIdGenerator.class)
public class TimeGrain extends AbstractPersistable
implements Comparable<TimeGrain> {

Expand Down Expand Up @@ -57,25 +62,30 @@ public void setStartingMinuteOfDay(int startingMinuteOfDay) {
this.startingMinuteOfDay = startingMinuteOfDay;
}

@JsonIgnore
public LocalDate getDate() {
return day.toDate();
}

@JsonIgnore
public LocalTime getTime() {
return LocalTime.of(startingMinuteOfDay / 60, startingMinuteOfDay % 60);
}

@JsonIgnore
public LocalDateTime getDateTime() {
return LocalDateTime.of(getDate(), getTime());
}

@JsonIgnore
public String getTimeString() {
int hourOfDay = startingMinuteOfDay / 60;
int minuteOfHour = startingMinuteOfDay % 60;
return (hourOfDay < 10 ? "0" : "") + hourOfDay
+ ":" + (minuteOfHour < 10 ? "0" : "") + minuteOfHour;
}

@JsonIgnore
public String getDateTimeString() {
return day.getDateString() + " " + getTimeString();
}
Expand Down
Loading

0 comments on commit b574c26

Please sign in to comment.