From 9f388bbb6aadfe32740fe5c45a4421e76dd9f459 Mon Sep 17 00:00:00 2001
From: 13518104 Kevin Austin Stefano <13518104@std.stei.itb.ac.id>
Date: Sat, 6 Mar 2021 20:02:58 +0700
Subject: [PATCH] Add grader

---
 src/grade-openmp.sh                | 35 ++++++++++++++++++++++++
 src/grade-openmpi.sh               | 35 ++++++++++++++++++++++++
 src/python_script/check_openmp.py  | 43 ++++++++++++++++++++++++++++++
 src/python_script/check_openmpi.py | 43 ++++++++++++++++++++++++++++++
 src/python_script/get_testcase.py  | 24 +++++++++++++++++
 src/python_script/submit_file.py   | 16 +++++++++++
 6 files changed, 196 insertions(+)
 create mode 100644 src/grade-openmp.sh
 create mode 100644 src/grade-openmpi.sh
 create mode 100644 src/python_script/check_openmp.py
 create mode 100644 src/python_script/check_openmpi.py
 create mode 100644 src/python_script/get_testcase.py
 create mode 100644 src/python_script/submit_file.py

diff --git a/src/grade-openmp.sh b/src/grade-openmp.sh
new file mode 100644
index 0000000..9fb5275
--- /dev/null
+++ b/src/grade-openmp.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+if [ "$#" -ne 2 ]; then
+    echo "Usage: ./autograde.sh 13518056 13518104"
+    exit
+fi
+
+rm -rf $2/*
+
+rm -rf ./tmp
+mkdir ./tmp
+mkdir ./tmp/testcases
+
+if ! python3 ./python_script/get_testcase.py $1; then
+    exit
+fi
+
+testcases_names=()
+
+readarray -d '' testcases_names < <(find ./tmp/testcases -type f -print0)
+
+for tc in ${testcases_names[@]}; do
+    ./openmp-script.sh $tc
+done
+
+if ! python3 ./python_script/check_openmp.py $1 $2; then
+    exit
+fi
+
+zip -r $1.zip .
+
+if ! python3 ./python_script/submit_file.py $1 $1.zip; then
+    exit
+fi
+echo "Thank you for using our service!"
diff --git a/src/grade-openmpi.sh b/src/grade-openmpi.sh
new file mode 100644
index 0000000..010c5c4
--- /dev/null
+++ b/src/grade-openmpi.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+if [ "$#" -ne 2 ]; then
+    echo "Usage: ./autograde.sh 13518056 13518104"
+    exit
+fi
+
+rm -rf $2/*
+
+rm -rf ./tmp
+mkdir ./tmp
+mkdir ./tmp/testcases
+
+if ! python3 ./python_script/get_testcase.py $1; then
+    exit
+fi
+
+testcases_names=()
+
+readarray -d '' testcases_names < <(find ./tmp/testcases -type f -print0)
+
+for tc in ${testcases_names[@]}; do
+    ./openmpi-script.sh $tc
+done
+
+if ! python3 ./python_script/check_openmpi.py $1 $2; then
+    exit
+fi
+
+zip -r $1.zip .
+
+if ! python3 ./python_script/submit_file.py $1 $1.zip then
+    exit
+fi
+echo "Thank you for using our service!"
diff --git a/src/python_script/check_openmp.py b/src/python_script/check_openmp.py
new file mode 100644
index 0000000..7021a04
--- /dev/null
+++ b/src/python_script/check_openmp.py
@@ -0,0 +1,43 @@
+import os
+import sys
+import requests
+
+from os import walk
+
+nim = sys.argv[1]
+openmp_dir = sys.argv[2]
+
+url = 'http://100.25.13.77/api/v1/check'
+
+body = {
+    'nim': nim,
+    'is_openmp': True,
+    'answers': [],
+}
+
+_, _, openmp_files = next(walk(openmp_dir))
+
+for file in openmp_files:
+    total_node = file.split('_')[0]
+    testcase_id = file.split('_')[1]
+    f = open(os.path.join(openmp_dir, file), 'r')
+    content = f.read()
+    f.close()
+    answer = {
+        'total_node': int(total_node),
+        'testcase_id': int(testcase_id),
+        'answer': content,
+    }
+    body['answers'].append(answer)
+
+response = requests.post(url = url, json = body)
+
+print('OpenMP Status Code:', response.status_code)
+if response.status_code != 200:
+    sys.exit(-1)
+else:
+    data = response.json()
+    results = data['results']
+    for result in results:
+        print('Total Node:', result['total_node'])
+        print('Correct:', result['is_accepted'])
diff --git a/src/python_script/check_openmpi.py b/src/python_script/check_openmpi.py
new file mode 100644
index 0000000..d484f39
--- /dev/null
+++ b/src/python_script/check_openmpi.py
@@ -0,0 +1,43 @@
+import os
+import sys
+import requests
+
+from os import walk
+
+nim = sys.argv[1]
+openmpi_dir = sys.argv[2]
+
+url = 'http://100.25.13.77/api/v1/check'
+
+body = {
+    'nim': nim,
+    'is_openmp': False,
+    'answers': [],
+}
+
+_, _, openmpi_files = next(walk(openmpi_dir))
+
+for file in openmpi_files:
+    total_node = file.split('_')[0]
+    testcase_id = file.split('_')[1]
+    f = open(os.path.join(openmpi_dir, file), 'r')
+    content = f.read()
+    f.close()
+    answer = {
+        'total_node': int(total_node),
+        'testcase_id': int(testcase_id),
+        'answer': content,
+    }
+    body['answers'].append(answer)
+
+response = requests.post(url = url, json = body)
+
+print('OpenMPI Status Code:', response.status_code)
+if response.status_code != 200:
+    sys.exit(-1)
+else:
+    data = response.json()
+    results = data['results']
+    for result in results:
+        print('Total Node:', result['total_node'])
+        print('Correct:', result['is_accepted'])
diff --git a/src/python_script/get_testcase.py b/src/python_script/get_testcase.py
new file mode 100644
index 0000000..ec6c763
--- /dev/null
+++ b/src/python_script/get_testcase.py
@@ -0,0 +1,24 @@
+import os
+import sys
+import requests
+
+nim = sys.argv[1]
+
+url = 'http://100.25.13.77/api/v1/testcase'
+
+params = {
+    'nim': nim,
+}
+
+response = requests.get(url = url, params = params)
+
+data = response.json()
+
+for tc in data['set']:
+    total_node = tc['total_node']
+    tc_id = tc['testcase_id']
+    content = tc['question']
+    filename = str(total_node) + '_' + str(tc_id)
+    f = open(os.path.join('tmp', 'testcases', filename), 'w')
+    f.write(content)
+    f.close()
diff --git a/src/python_script/submit_file.py b/src/python_script/submit_file.py
new file mode 100644
index 0000000..e764211
--- /dev/null
+++ b/src/python_script/submit_file.py
@@ -0,0 +1,16 @@
+import os
+import sys
+import requests
+
+from os import walk
+
+nim = sys.argv[1]
+filename = sys.argv[2]
+
+url = 'http://100.25.13.77/api/v1/submit?nim={nim}'.format(nim = nim)
+files = {
+    'file': open(filename, 'rb')
+}
+
+response = requests.post(url = url, files = files)
+print('Submission Status Code: {statusCode}'.format(statusCode = response.status_code))
-- 
GitLab