a1 marking script

This commit is contained in:
quackerd 2020-10-17 22:35:03 -04:00
parent 02c4fc911a
commit a05f2eca8f
1 changed files with 148 additions and 0 deletions

148
350/mark.py Normal file
View File

@ -0,0 +1,148 @@
import sys
import os
import traceback
DEBUG = False
# scheme format:
# [case string, [avg_wait, max_wait, overall_wait, total_sim], [scores] ]
# -1: skip
AVG_WT_IDX = 0
MAX_WT_IDX = 1
OVA_WT_IDX = 2
TOT_SIM_IDX = 3
CHK_ARR_STR = ["avg_wait", "max_wait", "overall_wait", "total_sim"]
scheme = [
["sp3 1 150 1 1 0", [0, -1, -1, -1], [2, 0, 0, 0]],
["sp3 1 150 1 1 1", [0, -1, -1, -1], [2, 0, 0 ,0]],
["sp3 5 100 10 1 0", [-1, -1, 10, -1], [0, 0, 3, 0] ],
["sp3 5 100 10 1 0", [-1, -1, 10, -1], [0, 0, 2, 0] ],
["sp3 2 300 0 1 1", [-1, 18, -1, 6], [0, 1.5, 0, 1.5] ],
["sp3 2 300 0 1 1", [-1, 18, -1, 6], [0, 1, 0, 1] ],
["sp3 6 100 0 1 0", [-1, 58, -1, 5], [0, 1.5, 0, 1.5] ],
["sp3 6 100 0 1 1", [-1, 58, -1, 5], [0, 1, 0, 1] ],
["sp3 10 80 0 1 0", [-1, 98, -1, 4], [0, 1.5, 0, 1.5] ],
["sp3 10 80 0 1 1", [-1, 98, -1, 4], [0, 1, 0, 1] ],
]
def mark_case(lines, param, chk_arr, grd_arr):
if DEBUG:
print("\nChecking " + param + " ...")
total_succ = [True, True, True, True]
parsed_succ = [0, 0, 0, 0]
failed_succ = [-1, -1, -1, -1]
start = False
for line in lines:
if line.startswith("========================== Using parameters"):
if not start:
if line.find(param) != -1:
start = True
continue
else:
# next case
break
if not start:
continue
if line.startswith("N:") or \
line.startswith("E:") or \
line.startswith("S:") or \
line.startswith("W:"):
elements = line.split()
if len(elements) != 11:
raise Exception("Line " + line + " cannot be parsed")
parsed_succ[AVG_WT_IDX] = int(float(elements[5]) * 1000)
parsed_succ[MAX_WT_IDX] = int(float(elements[9]) * 1000)
if DEBUG:
print("Parsed: \"" + line + "\" " + " a_wait: " + str(parsed_succ[AVG_WT_IDX]) + " m_wait: " + str(parsed_succ[MAX_WT_IDX]))
if total_succ[AVG_WT_IDX] and (chk_arr[AVG_WT_IDX] != -1) and (parsed_succ[AVG_WT_IDX] > chk_arr[AVG_WT_IDX]):
total_succ[AVG_WT_IDX] = False
failed_succ[AVG_WT_IDX] = parsed_succ[AVG_WT_IDX]
if total_succ[MAX_WT_IDX] and (chk_arr[MAX_WT_IDX] != -1) and (parsed_succ[MAX_WT_IDX] > chk_arr[MAX_WT_IDX]):
total_succ[MAX_WT_IDX] = False
failed_succ[MAX_WT_IDX] = parsed_succ[MAX_WT_IDX]
continue
if line.startswith("all:"):
elements = line.split()
if len(elements) != 7:
raise Exception("Line " + line + " cannot be parsed")
parsed_succ[OVA_WT_IDX] = float(elements[4])
if DEBUG:
print("Parsed: \"" + line + "\" " + " avg_time: " + str(parsed_succ[OVA_WT_IDX]))
if total_succ[OVA_WT_IDX] and (chk_arr[OVA_WT_IDX] != -1) and (parsed_succ[OVA_WT_IDX] > chk_arr[OVA_WT_IDX]):
total_succ[OVA_WT_IDX] = False
failed_succ[OVA_WT_IDX] = parsed_succ[OVA_WT_IDX]
if line.startswith("Simulation: "):
elements = line.split()
if len(elements) != 5:
print("Line " + line + " cannot be parsed")
exit(1)
parsed_succ[TOT_SIM_IDX] = float(elements[1])
if DEBUG:
print("Parsed: \"" + line + "\" " + " sim_time: " + str(parsed_succ[TOT_SIM_IDX]))
if total_succ[TOT_SIM_IDX] and (chk_arr[TOT_SIM_IDX] != -1) and (parsed_succ[TOT_SIM_IDX] > chk_arr[TOT_SIM_IDX]):
total_succ[TOT_SIM_IDX] = False
failed_succ[TOT_SIM_IDX] = parsed_succ[TOT_SIM_IDX]
if not start:
raise Exception("Case " + param + " not found ")
print("Case \"" + param + "\":")
total_mark = 0
for i in range(len(total_succ)):
if not total_succ[i]:
print(" [FAIL +0] " + CHK_ARR_STR[i] + " " + str(failed_succ[i]) + " > " + str(chk_arr[i]))
else:
if chk_arr[i] != -1:
print(" [PASS +" + str(grd_arr[i]) + "] " + CHK_ARR_STR[i])
total_mark = total_mark + grd_arr[i]
return total_mark
def mark(fp: str):
with open(fp, "r") as f:
lines = f.read().splitlines()
tot_mark = 0
for i in range(0, len(scheme)):
tot_mark = tot_mark + mark_case(lines, scheme[i][0], scheme[i][1], scheme[i][2])
print("Total mark: " + str(tot_mark))
def mark_dir(fp: dir):
for ed in os.walk(fp):
try:
print("Username: " + os.path.basename(ed[0]))
mark(os.path.join(fp, ed[0], "runTests.log"))
except Exception as e:
print("Failed to mark due to: " + str(e))
#traceback.print_exc()
print("\n")
def main():
if len(sys.argv) != 2:
print("Usage: python mark.py [student submission dir]")
exit(1)
mark_dir(sys.argv[1])
main()