Skip to content

Commit 9b11f24

Browse files
committed
Include due dates in projects
1 parent e1e31b3 commit 9b11f24

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

psplib/ProjectInstance.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,13 @@ class Project:
9494
The activities indices that belong to this project.
9595
release_date
9696
The earliest start time of this project.
97+
due_date
98+
The due date of this project, if available. Default is ``None``.
9799
"""
98100

99101
activities: list[int]
100102
release_date: int = 0
103+
due_date: Optional[int] = None
101104

102105
@property
103106
def num_activities(self):

psplib/parse_mplib.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,20 @@ def parse_mplib(loc: Union[str, Path]) -> ProjectInstance:
3333
id2idx: dict[str, int] = {} # maps activity names to idcs
3434

3535
for project_idx in range(1, num_projects + 1):
36-
num_activities, release_date = map(int, next(lines).split())
36+
project_data = list(map(int, next(lines).split()))
37+
38+
if len(project_data) == 3:
39+
# Modified MPLIB instances that include due date.
40+
num_activities, release_date, due_date = project_data
41+
else:
42+
# Original MPLIB instances do not include due date.
43+
num_activities, release_date = project_data
44+
due_date = None
45+
3746
next(lines) # denotes used resources, implies that demand > 0
3847

3948
idcs = [len(activities) + idx for idx in range(num_activities)]
40-
projects.append(Project(idcs, release_date))
49+
projects.append(Project(idcs, release_date, due_date))
4150

4251
for activity_idx in range(1, num_activities + 1):
4352
line = next(lines).split()

tests/test_parse_mplib.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def test_mplib_set1():
3434
for project in instance.projects:
3535
assert_equal(project.num_activities, 62)
3636
assert_equal(project.release_date, 0)
37+
assert_equal(project.due_date, None)
3738

3839

3940
def test_mplib_set2():
@@ -66,3 +67,21 @@ def test_mplib_set2():
6667
for project in instance.projects:
6768
assert_equal(project.num_activities, 52)
6869
assert_equal(project.release_date, 0)
70+
assert_equal(project.due_date, None)
71+
72+
73+
def test_mplib_set1_with_due_date():
74+
"""
75+
Tests that the instance ``MPLIB1_Set1_0_due_date.rcmp`` is correctly
76+
parsed, which includes due dates for each project.
77+
"""
78+
instance = parse_mplib(relative("data/MPLIB1_Set1_0_due_date.rcmp"))
79+
80+
# It's the same as the original instance, but now due dates.
81+
due_dates = [113, 96, 117, 138, 216, 233]
82+
83+
assert_equal(instance.num_projects, 6)
84+
for idx, project in enumerate(instance.projects):
85+
assert_equal(project.num_activities, 62)
86+
assert_equal(project.release_date, 0)
87+
assert_equal(project.due_date, due_dates[idx])

0 commit comments

Comments
 (0)