-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdump_prereqs.py
66 lines (55 loc) · 1.86 KB
/
dump_prereqs.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
"""
python3 dump_prereqs.py FA22
python3 dump_prereqs.py FA22 table > files/blocked.csv
"""
import json
import sys
from typing import Dict, List, Set
from parse import prereqs
from parse_defs import CourseCode, Prerequisite
Prereqs = Dict[CourseCode, List[List[Prerequisite]]]
def dump_prereqs(all_reqs: Prereqs) -> None:
"""
Creates prereqs.json for reports/prereq-tree.tsx.
"""
with open("./reports/output/prereqs.json", "w") as file:
json.dump(
{
str(course_code): [
[str(alt.course_code) for alt in req] for req in reqs
]
for course_code, reqs in all_reqs.items()
},
file,
)
def prereqs_satisfied(taken: Set[CourseCode], reqs: List[List[Prerequisite]]) -> bool:
for req in reqs:
for alt in req:
if alt.course_code in taken:
return True
return False
def blocking_table(all_reqs: Prereqs) -> None:
"""
Creates a CSV listing how many courses each course blocks.
"""
print("Course,Courses blocked")
# Not efficient, but more closely mimics the algorithm that prereq-tree uses
for blocker in sorted(all_reqs.keys()):
taken: Set[CourseCode] = {blocker}
while True:
new_courses: Set[CourseCode] = set()
for course_code, reqs in all_reqs.items():
if not reqs or course_code in taken:
continue
if prereqs_satisfied(taken, reqs):
new_courses.add(course_code)
if new_courses:
taken |= new_courses
else:
break
print(f"{blocker},{len(taken) - 1}")
if __name__ == "__main__":
if len(sys.argv) > 2 and sys.argv[2] == "table":
blocking_table(prereqs(sys.argv[1]))
else:
dump_prereqs(prereqs(sys.argv[1]))