diff --git a/test/scheduleGenerator/v3.py b/test/scheduleGenerator/v3.py index 1970d21..a2ff45c 100644 --- a/test/scheduleGenerator/v3.py +++ b/test/scheduleGenerator/v3.py @@ -345,25 +345,34 @@ def generateScheduleV3( conflicts = [] for student in students: - print(student["Pupil #"]) + #print("====New Student====") + # print(student["Pupil #"]) blocks = [student["schedule"][block] for block in student["schedule"]] + #print("Blocks: ", blocks) origin = list(block) exceptions = [] count, hasConflict = 0, True initialCount = sum(1 for b in blocks if len(b)==1) + #print("Initial Count: ", initialCount) if initialCount == student["classes"]: + #print("Classes already set") hasConflict = False if initialCount < student["expectedClasses"]: + #print("New Conflict 1: Missing Classes") conflicts.append({ "Pupil #": student["Pupil #"], "Email": "", "Conflict": "Missing classes" }) + #print("Begin conflic Check...") + #print("Has Conflict: ", hasConflict) while hasConflict: + #print("Retrieve clash...") # Get clash if len(exceptions) > 0: + #print("Exceptions exists, make new list to ignore exceptions") blocks = [elem for i, elem in enumerate(blocks) if i not in exceptions] exceptCopy = list(exceptions) while len(exceptCopy) > 0: @@ -371,32 +380,50 @@ def generateScheduleV3( blocks.insert(minIndex, ['nil']) count = sum(1 for b in blocks if len(b)==1) + #print("New Count: ", count) if count < student["expectedClasses"]: + #print("There must be a clash...") if count == student["classes"]: + #print("New Conflict 2: Missing Classes") conflicts.append({ "Pupil #": student["Pupil #"], "Email": "", "Conflict": "Missing classes" }) hasConflict = False + #print("end conflicts...") break blockLens = [len(block) for block in blocks] index = blockLens.index(max(blockLens)) + #print("Block Lengths: ", blockLens) + #print("Clash Index: ", index) blockOut = f"block{index+1}" + #print("blockOut: ", blockOut) done = False moveIndex = 0 + #print("moveIndex: ", moveIndex) freeBlocks = [blockIndex for blockIndex in range(len(blocks)) if len(blocks[blockIndex]) == 0] + #print("Free blocks: ", freeBlocks) + #print("Begin attempt to move...") while not done: classOut = blocks[index][moveIndex] + #print("classOut: ",classOut) found = False + #print("begin check for blocks in running...") for block in running: - if found: break + #print("Block: ", block) + if found: + #print("Found, breaking check for blocks in running") + break if list(running).index(block) != index and list(running).index(block) in freeBlocks: + #print("This block is available, begin check for classes in this block") for cname in running[block]: + #print("Class: ", cname) if cname[:-2] == blocks[index][moveIndex][:-2] and len(running[block][cname]["students"]) < classCap: + #print("Exists! This class matches target and has space!") studentData = { "Pupil #": student["Pupil #"], "index": student["studentIndex"] @@ -412,24 +439,47 @@ def generateScheduleV3( running[block][cname]["students"].append(studentData) found, done = True, True + #print("Found: ", found) + #print("done: ", done) break + # else: + #print("This class does not match the target, or this class is full") + #print("Found: ", found) + # else: + #print("This block is the conflict, or is not free") + + #print("end check for blocks in running...") if not found: + #print("Could not find a solution for this class") if moveIndex < len(blocks[index])-1: + #print("Trying next class") moveIndex += 1 elif moveIndex == len(blocks[index])-1: + #print("No more attempts possible, add to exceptions") if index not in exceptions: exceptions.append(index) + conflicts.append({ + "Pupil #": student["Pupil #"], + "Email": "", + "Conflict": "Error" + }) + done = True + hasConflict = False else: print('impossible err 3') - elif found: done = True - + elif found: + done = True + #print("Done: ", done) + else: print('impossible err 2') elif count == student["expectedClasses"]: + #print("No conflicts") if len(exceptions) > 0: + #print("Exceptions exist, new conflict 3: More than one class per block") for i in range(len(exceptions)): blocks[i] = origin[i] @@ -441,6 +491,7 @@ def generateScheduleV3( hasConflict = False elif count > student["expectedClasses"]: + #print("New conflict 4: More classes than expected") conflicts.append({ "Pupil #": student["Pupil #"], "Email": "", diff --git a/test/tinker.py b/test/tinker.py index 1cf378a..442f928 100644 --- a/test/tinker.py +++ b/test/tinker.py @@ -45,6 +45,17 @@ if __name__ == '__main__': timetable["Version"] = 3 timetable["timetable"] = generateScheduleV3(sampleStudents, samplemockCourses, 40, "./output/students.json", "./output/conflicts.json") + f = open('./output/conflicts.json') + conflicts = json.load(f) + + print(f"{len(conflicts)}/{len(sampleStudents)} have errors") + percent = len(conflicts) / len(sampleStudents) * 100 + + print(f"{round(percent, 2)}% errors") + print(f"{100-(round(percent, 2))}% success") + + f.close() + else: print("Invalid argument") exit()