degree checking 50% degrees running

This commit is contained in:
Coding with Peter 2023-06-15 07:55:57 -07:00
parent 2a15748d5a
commit dc512850f3
2 changed files with 73 additions and 27 deletions

View File

@ -1596,8 +1596,29 @@ def create_calendar_event():
if "id" in result: if "id" in result:
print("ok, id#", result["id"]) print("ok, id#", result["id"])
def utc_to_local(utc_str):
if not utc_str: return ""
utc_dt = datetime.strptime(utc_str, '%Y-%m-%dT%H:%M:%SZ')
# Set the UTC timezone
utc_tz = pytz.timezone('UTC')
# Convert the UTC datetime to the Pacific Time Zone
pacific_tz = pytz.timezone('US/Pacific')
pacific_dt = utc_dt.astimezone(pacific_tz)
return pacific_dt.strftime('%a %b %d, %Y %#I:%M%p')
def list_all_assignments():
course = input("the course id> ")
u = url + f"/api/v1/courses/{course}/assignments"
c = fetch(u)
#print(json.dumps(c,indent=2))
for a in c:
p = 'not published'
if a['published'] == True: p = 'published'
date = utc_to_local(a['due_at'])
print(f"{a['name']}\t{p}\t{date}")
@ -1637,6 +1658,7 @@ if __name__ == "__main__":
30: ['Quick course list', quick_sem_course_list ], 30: ['Quick course list', quick_sem_course_list ],
31: ['Cross list CWE courses', xlist_cwe], 31: ['Cross list CWE courses', xlist_cwe],
34: ['Create calendar event', create_calendar_event], 34: ['Create calendar event', create_calendar_event],
35: ['list all assignments', list_all_assignments],
40: ['Enroll GOTT Workshops', enroll_gott_workshops_su23], 40: ['Enroll GOTT Workshops', enroll_gott_workshops_su23],
# 24: ['Add course evals to whole semester',instructor_list_to_activate_evals], # 24: ['Add course evals to whole semester',instructor_list_to_activate_evals],

View File

@ -323,28 +323,44 @@ def is_noncourse_new_section(noncourse_line):
rule_lookup = { rule_lookup = {
'take_all_prereq': ['RN PROGRAM PREREQUISITES', 'PREREQUISITES', ], 'take_all_prereq': ['RN PROGRAM PREREQUISITES', 'PREREQUISITES', ],
'take at least n courses': ['(\d+) courses total', 'SELECT (ONE|TWO) OF THE FOLLOWING', 'Select (one|two|three)', 'Select (\d+) courses', 'take at least n courses': ['(One) of the following:',
'Choose (one) or more', 'Choose (one|two|three) of the classes listed', '(\d+) courses total',
'Choose (\w+) of the following','Choose (one|two|three)', 'Choose ([\d\w]+) courses from', 'ANY (COURSE) NOT USED IN',
'ANY (COURSE) NOT USED IN', 'Select (1)', 'Select (one) of the following REQUIRED CORE', 'Choose (One) Course:',
'(One) of the following:', 'LIST [AB]: Select (\d)', 'Choose (One) Course:', ], 'Choose (one) or more',
'take at least n units': ['LIST A \((\d+) units\)', 'LIST B \((\d+) units\)', 'LIST C \- Any course .*\((\d+) units\)', '(\d+) units total', 'Choose (one|two|three) of the classes listed',
'Select (\d+) units', 'Any combination totaling (\d+) units', 'Choose (one|two|three)',
'Choose (\w+) units from classes listed', 'Choose a minimum of ([\w\d]+) units from', 'Choose ([\d\w]+) courses from',
'Choose any combination of courses for a minimum of ([\w\d]+) units\:?', 'Choose (\w+) of the following',
'Choose ([\w\d]+) units', 'Choose courses for at least ([\w\d]+) units', 'LIST [AB]: Select (\d)',
'Choose a minimum of (\d+) units', 'Select any (\d+)\-\d+ units from the following'], 'Select (1)',
'Select (one) of the following REQUIRED CORE',
'SELECT (ONE|TWO) OF THE FOLLOWING', 'Select (one|two|three)',
'Select (\d+) courses', ],
'take at least n units': [ '(\d+) units total',
'Any combination totaling (\d+) units',
'Choose (eight|\d+) units',
'Choose (\w+) units from classes listed',
'Choose a minimum of ([\w\d]+) units from',
'Choose a minimum of (\d+) units',
'Choose any combination of courses for a minimum of ([\w\d]+) units\:?',
'Choose courses for at least ([\w\d]+) units',
'LIST A \((\d+) units\)',
'LIST B \((\d+) units\)',
'LIST C \- Any course .*\((\d+) units\)',
'Select (\d+) units',
'Select any (\d+)\-\d+ units from the following',],
'electives': ['Electives', 'Recommended electives?:', ], 'electives': ['Electives', 'Recommended electives?:', ],
'take_all': ['RN PROGRAM', 'REQUIRED CORE', 'CORE COURSES', 'ADDITIONAL REQUIREMENTS','REQUIREMENTS:', 'Requirements', 'Core Requirements', 'take_all': ['RN PROGRAM', 'REQUIRED CORE', 'CORE COURSES', 'ADDITIONAL REQUIREMENTS','REQUIREMENTS:',
'Requirements', 'Core Requirements',
'Required Core', 'REQUIRED', 'LVN PROGRAM', 'Student Teaching Practicum', '^LIST A:?$', '^LIST B:$', 'Required Core', 'REQUIRED', 'LVN PROGRAM', 'Student Teaching Practicum', '^LIST A:?$', '^LIST B:$',
'Program Requirements', 'Required Courses:', 'PROGRAM REQUIREMENTS (5 Units)', 'PROGRAM REQUIREMENTS (162 Hours)', 'Program Requirements', 'Required Courses:', 'PROGRAM REQUIREMENTS (5 Units)',
'PROGRAM REQUIREMENTS (162 Hours)',
], ],
} }
def lookup_rule(line): def lookup_rule(line):
verbose = 0 verbose = 0
if re.search(rule_lookup['take at least n units'][8], line):
print(f"line: {line} matched: {rule_lookup['take at least n units'][8]}")
for key in rule_lookup.keys(): for key in rule_lookup.keys():
for each in rule_lookup[key]: for each in rule_lookup[key]:
m = re.search(each, line) m = re.search(each, line)
@ -600,15 +616,7 @@ def create_degree_mzn():
%% %%
%% or what courses they'd still need for it %% or what courses they'd still need for it
include "base_courses.mzn";
%%
%% Set up all courses
int: numcourses = [[numcourses]];
array[1..numcourses] of string:
all_courses = [ [[allcourses]] ];
array[1..numcourses] of float:
all_units = [ [[allunits]] ];
%% Courses student took %% Courses student took
array[1..numcourses] of bool: student_taken; array[1..numcourses] of bool: student_taken;
@ -623,6 +631,14 @@ array[1..numcourses] of bool: student_taken;
output = substitute_template_var(output, 'degreename', this_course[0]) output = substitute_template_var(output, 'degreename', this_course[0])
out_file.write("\n".join(output)) out_file.write("\n".join(output))
for r in this_course[1:]:
if re.search(r'^electives', r):
this_course.remove(r)
#
#
# EACH RULE
#
for n,rule in enumerate(this_course[1:]): for n,rule in enumerate(this_course[1:]):
@ -704,9 +720,9 @@ constraint sum(j in 1..numcourses)(bool2float(rule_[[n]]_selected[j]) * all_unit
################### ###################
m1 = re.search(r'take_all from (.*)$', rule) m1 = re.search(r'(take_all|take_all_prereq) from (.*)$', rule)
if m1: if m1:
crs = m1.group(1).strip(',').split(",") crs = m1.group(2).strip(',').split(",")
crs = [ re.sub(r'\s+','',x) for x in crs ] crs = [ re.sub(r'\s+','',x) for x in crs ]
print(f"\ttake all from {crs}") print(f"\ttake all from {crs}")
# take n courses # take n courses
@ -802,6 +818,7 @@ def check_student_degrees():
records = grades_to_vectors(boolean=1) records = grades_to_vectors(boolean=1)
i = 0 i = 0
needed = defaultdict(dict) needed = defaultdict(dict)
completion = defaultdict(dict)
# took no classes? # took no classes?
empty_student = {} empty_student = {}
@ -823,7 +840,7 @@ def check_student_degrees():
print(f"student: {r[0]}, taken {crs}") print(f"student: {r[0]}, taken {crs}")
for degree in os.listdir('cache/program_check'): for degree in os.listdir('cache/program_check'):
m1 = re.match(r'(.*)\.mzn', degree) m1 = re.match(r'(.*)\.mzn', degree)
if m1: if m1 and degree != 'base_courses.mzn':
try: try:
d = m1.group(1) d = m1.group(1)
@ -837,6 +854,10 @@ def check_student_degrees():
# Create an Instance of the n-Queens model for Gecode # Create an Instance of the n-Queens model for Gecode
instance = Instance(gecode, deg_model) instance = Instance(gecode, deg_model)
# Add the base courses data file
#instance = instance.add_file("base_courses.dzn")
# Assign student courses taken # Assign student courses taken
s = f"student_taken = [" + ','.join( [ str(x) for x in r[1]] ) + "];" s = f"student_taken = [" + ','.join( [ str(x) for x in r[1]] ) + "];"
instance.add_string(s) instance.add_string(s)
@ -852,6 +873,7 @@ def check_student_degrees():
if str(r[0]) == "0": if str(r[0]) == "0":
empty_student[d] = r1['total units'] empty_student[d] = r1['total units']
needed[r[0]][d] = r1['total units'] needed[r[0]][d] = r1['total units']
completion[r[0]][d] = r1['total units'] / empty_student[d]
if r1['total units']>0 and r1['total units'] < lowest: if r1['total units']>0 and r1['total units'] < lowest:
lowest = r1['total units'] lowest = r1['total units']
lowest_deg = d lowest_deg = d
@ -872,6 +894,8 @@ def check_student_degrees():
df = pd.DataFrame.from_dict(needed, orient='index') df = pd.DataFrame.from_dict(needed, orient='index')
df.to_csv('cache/program_check/needed.csv') df.to_csv('cache/program_check/needed.csv')
df2 = pd.DataFrame.from_dict(completion, orient='index')
df2.to_csv('cache/program_check/needed_percentage.csv')
if __name__ == "__main__": if __name__ == "__main__":
options = { 1: ['parsing example',parser] , options = { 1: ['parsing example',parser] ,