a1 marking script
This commit is contained in:
parent
02c4fc911a
commit
a05f2eca8f
148
350/mark.py
Normal file
148
350/mark.py
Normal 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()
|
Loading…
Reference in New Issue
Block a user