Show More
Commit Description:
handle the case when problem id or submission id is null. Grader will simply skip such request. Add more report on console (for command line grading)...
Commit Description:
handle the case when problem id or submission id is null. Grader will simply skip such request. Add more report on console (for command line grading)
(mercurial grafted from d233105d3965c5368c9b33125f390e39b25f910e)
References:
File last commit:
Show/Diff file:
Action:
import_problem
| 236 lines
| 6.7 KiB
| text/plain
| TextLexer
|
|
r143 | #!/usr/bin/env ruby | ||
|
r0 | |||
require 'erb' | ||||
|
r23 | require 'fileutils' | ||
|
r63 | require File.join(File.dirname(__FILE__),'lib/import_helper') | ||
|
r0 | |||
|
r80 | JUDGE_ENVIRONMENTS = [:grading, :exam] | ||
ENV_INFO = { | ||||
:grading => { | ||||
:ev_dir => 'ev', | ||||
:raw_prefix => '', | ||||
}, | ||||
:exam => { | ||||
:ev_dir => 'ev-exam', | ||||
:raw_prefix => 'ex.', | ||||
} | ||||
} | ||||
|
r0 | def input_filename(dir,i) | ||
"#{dir}/input-#{i}.txt" | ||||
end | ||||
def answer_filename(dir,i) | ||||
"#{dir}/answer-#{i}.txt" | ||||
end | ||||
|
r80 | def build_testrun_info_from_dir(num_testruns, importing_test_dir, raw_prefix='') | ||
filenames = Dir["#{importing_test_dir}/#{raw_prefix}*.in"].collect do |filename| | ||||
|
r63 | File.basename((/(.*)\.in/.match(filename))[1]) | ||
end | ||||
|
r80 | build_testrun_info(num_testruns,filenames,raw_prefix) | ||
|
r63 | end | ||
def copy_testcase(importing_test_dir,fname,dir,i) | ||||
|
r100 | FileUtils.cp("#{importing_test_dir}/#{fname}.in", "#{input_filename(dir,i)}") | ||
FileUtils.cp("#{importing_test_dir}/#{fname}.sol", "#{answer_filename(dir,i)}") | ||||
|
r0 | end | ||
def process_options(options) | ||||
|
r80 | i = 3 | ||
|
r0 | while i<ARGV.length | ||
if ARGV[i]=='-t' | ||||
|
r52 | options[:time_limit] = ARGV[i+1].to_f if ARGV.length>i+1 | ||
|
r0 | i += 1 | ||
end | ||||
if ARGV[i]=='-m' | ||||
options[:mem_limit] = ARGV[i+1].to_i if ARGV.length>i+1 | ||||
i += 1 | ||||
end | ||||
i += 1 | ||||
end | ||||
end | ||||
|
r80 | def print_usage | ||
puts "using: import_problem_new name dir check [options] | ||||
where: name = problem_name (put '-' (dash) to use dir name) | ||||
dir = importing testcase directory | ||||
check = check script, which can be | ||||
'integer', 'text' (for standard script), | ||||
path_to_your_script, or | ||||
'wrapper:(path_to_your_wrapped_script)' | ||||
options: -t time-limit (in seconds) | ||||
-m memory-limit (in megabytes) | ||||
The script looks at test data files in the dir of the forms: *.in and | ||||
*.sol and import them to the evaluation dir for their environment, | ||||
based on their prefixes. | ||||
Currently supporting environments are:" | ||||
JUDGE_ENVIRONMENTS.each do |env| | ||||
prefix = ENV_INFO[env][:raw_prefix] | ||||
prefix = 'no prefix' if prefix=='' | ||||
puts " * #{env}" | ||||
puts " import to: #{ENV_INFO[env][:ev_dir]}" | ||||
puts " prefix with: #{prefix} (e.g., #{ENV_INFO[env][:raw_prefix]}1.in, #{ENV_INFO[env][:raw_prefix]}5a.sol)" | ||||
end | ||||
puts" | ||||
For each environment, the script | ||||
* creates a directory for a problem in ev dir of that environment, | ||||
* copies testdata in the old format and create standard testcase config file | ||||
* copies a check script for grading | ||||
* creates a test_request template in the ev dir + '/test_request' | ||||
For wrapped checked script see comment in templates/check_wrapper for | ||||
information." | ||||
end | ||||
def count_testruns(testcase_dir, raw_prefix) | ||||
n = 0 | ||||
begin | ||||
# check for test case n+1 | ||||
if ((Dir["#{testcase_dir}/#{raw_prefix}#{n+1}.in"].length==0) and | ||||
(Dir["#{testcase_dir}/#{raw_prefix}#{n+1}[a-z].in"].length==0)) | ||||
return n | ||||
end | ||||
n += 1 | ||||
end while true | ||||
end | ||||
|
r100 | def create_dir_if_not_exists(dir) | ||
if ! FileTest.exists? dir | ||||
FileUtils.mkdir(dir) | ||||
end | ||||
end | ||||
|
r80 | def import_problem(ev_dir, problem, testcase_dir, num_testruns, raw_prefix, check_script, options) | ||
testrun_info = build_testrun_info_from_dir(num_testruns, testcase_dir, raw_prefix) | ||||
if !(FileTest.exists? ev_dir) | ||||
puts "Testdata dir (#{ev_dir}) not found." | ||||
return | ||||
end | ||||
problem_dir = "#{ev_dir}/#{problem}" | ||||
# start working | ||||
puts "creating directories" | ||||
|
r100 | create_dir_if_not_exists("#{problem_dir}") | ||
create_dir_if_not_exists("#{problem_dir}/script") | ||||
create_dir_if_not_exists("#{problem_dir}/test_cases") | ||||
|
r80 | |||
puts "copying testcases" | ||||
tr_num = 0 | ||||
num_testcases = 0 | ||||
testrun_info.each do |testrun| | ||||
tr_num += 1 | ||||
puts "testrun: #{tr_num}" | ||||
testrun.each do |testcase_info| | ||||
testcase_num, testcase_fname = testcase_info | ||||
puts "copy #{testcase_fname} to #{testcase_num}" | ||||
|
r100 | create_dir_if_not_exists("#{problem_dir}/test_cases/#{testcase_num}") | ||
|
r80 | copy_testcase("#{testcase_dir}",testcase_fname,"#{problem_dir}/test_cases/#{testcase_num}",testcase_num) | ||
num_testcases += 1 | ||||
end | ||||
end | ||||
# generating all_tests.cfg | ||||
puts "generating testcase config file" | ||||
template = File.open(SCRIPT_DIR + "/templates/all_tests.cfg.erb").read | ||||
all_test_cfg = ERB.new(template) | ||||
cfg_file = File.open("#{problem_dir}/test_cases/all_tests.cfg","w") | ||||
cfg_file.puts all_test_cfg.result binding | ||||
cfg_file.close | ||||
# copy check script | ||||
if res = /^wrapper:(.*)$/.match(check_script) | ||||
# wrapper script | ||||
check_script_fname = res[1] | ||||
script_name = File.basename(check_script_fname) | ||||
check_wrapper_template = File.open(SCRIPT_DIR + "/templates/check_wrapper").read | ||||
check_wrapper = ERB.new(check_wrapper_template) | ||||
check_file = File.open("#{problem_dir}/script/check","w") | ||||
|
r81 | check_file.puts check_wrapper.result binding | ||
|
r80 | check_file.close | ||
File.chmod(0755,"#{problem_dir}/script/check") | ||||
|
r100 | FileUtils.cp("#{check_script_fname}", "#{problem_dir}/script/#{script_name}") | ||
|
r80 | else | ||
if File.exists?(SCRIPT_DIR + "/templates/check.#{check_script}") | ||||
check_script_fname = SCRIPT_DIR + "/templates/check.#{check_script}" | ||||
else | ||||
check_script_fname = check_script | ||||
end | ||||
|
r145 | FileUtils.cp("#{check_script_fname}", "#{problem_dir}/script/check", :preserve => true) | ||
|
r80 | end | ||
# generating test_request directory | ||||
puts "generating test_request template" | ||||
FileUtils.mkdir_p("#{ev_dir}/test_request/#{problem}/script") | ||||
FileUtils.mkdir_p("#{ev_dir}/test_request/#{problem}/test_cases/1") | ||||
template = File.open(SCRIPT_DIR + "/templates/test_request_all_tests.cfg.erb").read | ||||
test_request_all_test_cfg = ERB.new(template) | ||||
cfg_file = File.open("#{ev_dir}/test_request/#{problem}/test_cases/all_tests.cfg","w") | ||||
cfg_file.puts test_request_all_test_cfg.result | ||||
cfg_file.close | ||||
|
r100 | FileUtils.cp("#{SCRIPT_DIR}/templates/check_empty", | ||
"#{ev_dir}/test_request/#{problem}/script/check") | ||||
FileUtils.cp("#{SCRIPT_DIR}/templates/answer-1.txt", | ||||
"#{ev_dir}/test_request/#{problem}/test_cases/1") | ||||
|
r80 | |||
puts "done" | ||||
end | ||||
|
r23 | SCRIPT_DIR = File.dirname(__FILE__) | ||
|
r0 | |||
# print usage | ||||
|
r80 | if (ARGV.length < 3) or (ARGV[2][0,1]=="-") | ||
print_usage | ||||
|
r0 | exit(127) | ||
end | ||||
# processing arguments | ||||
problem = ARGV[0] | ||||
testcase_dir = ARGV[1] | ||||
|
r47 | problem = File.basename(testcase_dir) if problem=="-" | ||
|
r80 | check_script = ARGV[2] | ||
|
r0 | options = {:time_limit => 1, :mem_limit => 16} | ||
process_options(options) | ||||
|
r80 | JUDGE_ENVIRONMENTS.each do |env| | ||
ev_dir = ENV_INFO[env][:ev_dir] | ||||
raw_prefix = ENV_INFO[env][:raw_prefix] | ||||
|
r63 | |||
|
r80 | num_testruns = count_testruns(testcase_dir,raw_prefix) | ||
|
r0 | |||
|
r80 | puts "" | ||
puts "*** Environment: #{env} (#{num_testruns} test runs) ***" | ||||
puts "" | ||||
|
r28 | |||
|
r80 | import_problem(ev_dir, | ||
problem, | ||||
testcase_dir, | ||||
num_testruns, | ||||
raw_prefix, | ||||
check_script, | ||||
options) | ||||
|
r26 | end | ||