a1 marking script
This commit is contained in:
parent
02c4fc911a
commit
a05f2eca8f
|
@ -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