Description:
MERGED change set (408:410) from web/judge in branch combined-with-judge (fixed time_limit option bug) git-svn-id: http://theory.cpe.ku.ac.th/grader/judge/trunk/scripts@411 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r73:34ddb0155d6f - - 1 file changed: 1 inserted, 1 deleted

@@ -1,223 +1,223
1 #!/usr/bin/ruby
1 #!/usr/bin/ruby
2
2
3 require 'erb'
3 require 'erb'
4 require 'fileutils'
4 require 'fileutils'
5 require File.join(File.dirname(__FILE__),'lib/import_helper')
5 require File.join(File.dirname(__FILE__),'lib/import_helper')
6
6
7 JUDGE_ENVIRONMENTS = [:grading, :exam]
7 JUDGE_ENVIRONMENTS = [:grading, :exam]
8 ENV_INFO = {
8 ENV_INFO = {
9 :grading => {
9 :grading => {
10 :ev_dir => 'ev',
10 :ev_dir => 'ev',
11 :raw_prefix => '',
11 :raw_prefix => '',
12 },
12 },
13 :exam => {
13 :exam => {
14 :ev_dir => 'ev-exam',
14 :ev_dir => 'ev-exam',
15 :raw_prefix => 'ex.',
15 :raw_prefix => 'ex.',
16 }
16 }
17 }
17 }
18
18
19 def input_filename(dir,i)
19 def input_filename(dir,i)
20 "#{dir}/input-#{i}.txt"
20 "#{dir}/input-#{i}.txt"
21 end
21 end
22
22
23 def answer_filename(dir,i)
23 def answer_filename(dir,i)
24 "#{dir}/answer-#{i}.txt"
24 "#{dir}/answer-#{i}.txt"
25 end
25 end
26
26
27 def build_testrun_info_from_dir(num_testruns, importing_test_dir, raw_prefix='')
27 def build_testrun_info_from_dir(num_testruns, importing_test_dir, raw_prefix='')
28 filenames = Dir["#{importing_test_dir}/#{raw_prefix}*.in"].collect do |filename|
28 filenames = Dir["#{importing_test_dir}/#{raw_prefix}*.in"].collect do |filename|
29 File.basename((/(.*)\.in/.match(filename))[1])
29 File.basename((/(.*)\.in/.match(filename))[1])
30 end
30 end
31 build_testrun_info(num_testruns,filenames,raw_prefix)
31 build_testrun_info(num_testruns,filenames,raw_prefix)
32 end
32 end
33
33
34 def copy_testcase(importing_test_dir,fname,dir,i)
34 def copy_testcase(importing_test_dir,fname,dir,i)
35 system("cp #{importing_test_dir}/#{fname}.in #{input_filename(dir,i)}")
35 system("cp #{importing_test_dir}/#{fname}.in #{input_filename(dir,i)}")
36 system("cp #{importing_test_dir}/#{fname}.sol #{answer_filename(dir,i)}")
36 system("cp #{importing_test_dir}/#{fname}.sol #{answer_filename(dir,i)}")
37 end
37 end
38
38
39 def process_options(options)
39 def process_options(options)
40 - i = 4
40 + i = 3
41 while i<ARGV.length
41 while i<ARGV.length
42 if ARGV[i]=='-t'
42 if ARGV[i]=='-t'
43 options[:time_limit] = ARGV[i+1].to_f if ARGV.length>i+1
43 options[:time_limit] = ARGV[i+1].to_f if ARGV.length>i+1
44 i += 1
44 i += 1
45 end
45 end
46 if ARGV[i]=='-m'
46 if ARGV[i]=='-m'
47 options[:mem_limit] = ARGV[i+1].to_i if ARGV.length>i+1
47 options[:mem_limit] = ARGV[i+1].to_i if ARGV.length>i+1
48 i += 1
48 i += 1
49 end
49 end
50 i += 1
50 i += 1
51 end
51 end
52 end
52 end
53
53
54 def print_usage
54 def print_usage
55 puts "using: import_problem_new name dir check [options]
55 puts "using: import_problem_new name dir check [options]
56
56
57 where: name = problem_name (put '-' (dash) to use dir name)
57 where: name = problem_name (put '-' (dash) to use dir name)
58 dir = importing testcase directory
58 dir = importing testcase directory
59 check = check script, which can be
59 check = check script, which can be
60 'integer', 'text' (for standard script),
60 'integer', 'text' (for standard script),
61 path_to_your_script, or
61 path_to_your_script, or
62 'wrapper:(path_to_your_wrapped_script)'
62 'wrapper:(path_to_your_wrapped_script)'
63 options: -t time-limit (in seconds)
63 options: -t time-limit (in seconds)
64 -m memory-limit (in megabytes)
64 -m memory-limit (in megabytes)
65
65
66 The script looks at test data files in the dir of the forms: *.in and
66 The script looks at test data files in the dir of the forms: *.in and
67 *.sol and import them to the evaluation dir for their environment,
67 *.sol and import them to the evaluation dir for their environment,
68 based on their prefixes.
68 based on their prefixes.
69
69
70 Currently supporting environments are:"
70 Currently supporting environments are:"
71
71
72 JUDGE_ENVIRONMENTS.each do |env|
72 JUDGE_ENVIRONMENTS.each do |env|
73 prefix = ENV_INFO[env][:raw_prefix]
73 prefix = ENV_INFO[env][:raw_prefix]
74 prefix = 'no prefix' if prefix==''
74 prefix = 'no prefix' if prefix==''
75 puts " * #{env}"
75 puts " * #{env}"
76 puts " import to: #{ENV_INFO[env][:ev_dir]}"
76 puts " import to: #{ENV_INFO[env][:ev_dir]}"
77 puts " prefix with: #{prefix} (e.g., #{ENV_INFO[env][:raw_prefix]}1.in, #{ENV_INFO[env][:raw_prefix]}5a.sol)"
77 puts " prefix with: #{prefix} (e.g., #{ENV_INFO[env][:raw_prefix]}1.in, #{ENV_INFO[env][:raw_prefix]}5a.sol)"
78 end
78 end
79
79
80 puts"
80 puts"
81 For each environment, the script
81 For each environment, the script
82 * creates a directory for a problem in ev dir of that environment,
82 * creates a directory for a problem in ev dir of that environment,
83 * copies testdata in the old format and create standard testcase config file
83 * copies testdata in the old format and create standard testcase config file
84 * copies a check script for grading
84 * copies a check script for grading
85 * creates a test_request template in the ev dir + '/test_request'
85 * creates a test_request template in the ev dir + '/test_request'
86
86
87 For wrapped checked script see comment in templates/check_wrapper for
87 For wrapped checked script see comment in templates/check_wrapper for
88 information."
88 information."
89 end
89 end
90
90
91 def count_testruns(testcase_dir, raw_prefix)
91 def count_testruns(testcase_dir, raw_prefix)
92 n = 0
92 n = 0
93 begin
93 begin
94 # check for test case n+1
94 # check for test case n+1
95 if ((Dir["#{testcase_dir}/#{raw_prefix}#{n+1}.in"].length==0) and
95 if ((Dir["#{testcase_dir}/#{raw_prefix}#{n+1}.in"].length==0) and
96 (Dir["#{testcase_dir}/#{raw_prefix}#{n+1}[a-z].in"].length==0))
96 (Dir["#{testcase_dir}/#{raw_prefix}#{n+1}[a-z].in"].length==0))
97 return n
97 return n
98 end
98 end
99 n += 1
99 n += 1
100 end while true
100 end while true
101 end
101 end
102
102
103 def import_problem(ev_dir, problem, testcase_dir, num_testruns, raw_prefix, check_script, options)
103 def import_problem(ev_dir, problem, testcase_dir, num_testruns, raw_prefix, check_script, options)
104 testrun_info = build_testrun_info_from_dir(num_testruns, testcase_dir, raw_prefix)
104 testrun_info = build_testrun_info_from_dir(num_testruns, testcase_dir, raw_prefix)
105
105
106 problem_dir = "#{ev_dir}/#{problem}"
106 problem_dir = "#{ev_dir}/#{problem}"
107
107
108 # start working
108 # start working
109 puts "creating directories"
109 puts "creating directories"
110
110
111 system("mkdir #{problem_dir}")
111 system("mkdir #{problem_dir}")
112 system("mkdir #{problem_dir}/script")
112 system("mkdir #{problem_dir}/script")
113 system("mkdir #{problem_dir}/test_cases")
113 system("mkdir #{problem_dir}/test_cases")
114
114
115 puts "copying testcases"
115 puts "copying testcases"
116
116
117 tr_num = 0
117 tr_num = 0
118
118
119 num_testcases = 0
119 num_testcases = 0
120
120
121 testrun_info.each do |testrun|
121 testrun_info.each do |testrun|
122 tr_num += 1
122 tr_num += 1
123 puts "testrun: #{tr_num}"
123 puts "testrun: #{tr_num}"
124
124
125 testrun.each do |testcase_info|
125 testrun.each do |testcase_info|
126 testcase_num, testcase_fname = testcase_info
126 testcase_num, testcase_fname = testcase_info
127
127
128 puts "copy #{testcase_fname} to #{testcase_num}"
128 puts "copy #{testcase_fname} to #{testcase_num}"
129
129
130 system("mkdir #{problem_dir}/test_cases/#{testcase_num}")
130 system("mkdir #{problem_dir}/test_cases/#{testcase_num}")
131 copy_testcase("#{testcase_dir}",testcase_fname,"#{problem_dir}/test_cases/#{testcase_num}",testcase_num)
131 copy_testcase("#{testcase_dir}",testcase_fname,"#{problem_dir}/test_cases/#{testcase_num}",testcase_num)
132
132
133 num_testcases += 1
133 num_testcases += 1
134 end
134 end
135 end
135 end
136
136
137 # generating all_tests.cfg
137 # generating all_tests.cfg
138 puts "generating testcase config file"
138 puts "generating testcase config file"
139
139
140 template = File.open(SCRIPT_DIR + "/templates/all_tests.cfg.erb").read
140 template = File.open(SCRIPT_DIR + "/templates/all_tests.cfg.erb").read
141 all_test_cfg = ERB.new(template)
141 all_test_cfg = ERB.new(template)
142
142
143 cfg_file = File.open("#{problem_dir}/test_cases/all_tests.cfg","w")
143 cfg_file = File.open("#{problem_dir}/test_cases/all_tests.cfg","w")
144 cfg_file.puts all_test_cfg.result binding
144 cfg_file.puts all_test_cfg.result binding
145 cfg_file.close
145 cfg_file.close
146
146
147 # copy check script
147 # copy check script
148 if res = /^wrapper:(.*)$/.match(check_script)
148 if res = /^wrapper:(.*)$/.match(check_script)
149 # wrapper script
149 # wrapper script
150 check_script_fname = res[1]
150 check_script_fname = res[1]
151 script_name = File.basename(check_script_fname)
151 script_name = File.basename(check_script_fname)
152 check_wrapper_template = File.open(SCRIPT_DIR + "/templates/check_wrapper").read
152 check_wrapper_template = File.open(SCRIPT_DIR + "/templates/check_wrapper").read
153 check_wrapper = ERB.new(check_wrapper_template)
153 check_wrapper = ERB.new(check_wrapper_template)
154
154
155 check_file = File.open("#{problem_dir}/script/check","w")
155 check_file = File.open("#{problem_dir}/script/check","w")
156 check_file.puts check_wrapper.result
156 check_file.puts check_wrapper.result
157 check_file.close
157 check_file.close
158
158
159 File.chmod(0755,"#{problem_dir}/script/check")
159 File.chmod(0755,"#{problem_dir}/script/check")
160
160
161 system("cp #{check_script_fname} #{problem_dir}/script/#{script_name}")
161 system("cp #{check_script_fname} #{problem_dir}/script/#{script_name}")
162 else
162 else
163 if File.exists?(SCRIPT_DIR + "/templates/check.#{check_script}")
163 if File.exists?(SCRIPT_DIR + "/templates/check.#{check_script}")
164 check_script_fname = SCRIPT_DIR + "/templates/check.#{check_script}"
164 check_script_fname = SCRIPT_DIR + "/templates/check.#{check_script}"
165 else
165 else
166 check_script_fname = check_script
166 check_script_fname = check_script
167 end
167 end
168 system("cp #{check_script_fname} #{problem_dir}/script/check")
168 system("cp #{check_script_fname} #{problem_dir}/script/check")
169 end
169 end
170
170
171 # generating test_request directory
171 # generating test_request directory
172 puts "generating test_request template"
172 puts "generating test_request template"
173 FileUtils.mkdir_p("#{ev_dir}/test_request/#{problem}/script")
173 FileUtils.mkdir_p("#{ev_dir}/test_request/#{problem}/script")
174 FileUtils.mkdir_p("#{ev_dir}/test_request/#{problem}/test_cases/1")
174 FileUtils.mkdir_p("#{ev_dir}/test_request/#{problem}/test_cases/1")
175
175
176 template = File.open(SCRIPT_DIR + "/templates/test_request_all_tests.cfg.erb").read
176 template = File.open(SCRIPT_DIR + "/templates/test_request_all_tests.cfg.erb").read
177 test_request_all_test_cfg = ERB.new(template)
177 test_request_all_test_cfg = ERB.new(template)
178
178
179 cfg_file = File.open("#{ev_dir}/test_request/#{problem}/test_cases/all_tests.cfg","w")
179 cfg_file = File.open("#{ev_dir}/test_request/#{problem}/test_cases/all_tests.cfg","w")
180 cfg_file.puts test_request_all_test_cfg.result
180 cfg_file.puts test_request_all_test_cfg.result
181 cfg_file.close
181 cfg_file.close
182
182
183 system("cp #{SCRIPT_DIR}/templates/check_empty #{ev_dir}/test_request/#{problem}/script/check")
183 system("cp #{SCRIPT_DIR}/templates/check_empty #{ev_dir}/test_request/#{problem}/script/check")
184 system("cp #{SCRIPT_DIR}/templates/answer-1.txt #{ev_dir}/test_request/#{problem}/test_cases/1")
184 system("cp #{SCRIPT_DIR}/templates/answer-1.txt #{ev_dir}/test_request/#{problem}/test_cases/1")
185
185
186 puts "done"
186 puts "done"
187 end
187 end
188
188
189
189
190 SCRIPT_DIR = File.dirname(__FILE__)
190 SCRIPT_DIR = File.dirname(__FILE__)
191
191
192 # print usage
192 # print usage
193 if (ARGV.length < 3) or (ARGV[2][0,1]=="-")
193 if (ARGV.length < 3) or (ARGV[2][0,1]=="-")
194 print_usage
194 print_usage
195 exit(127)
195 exit(127)
196 end
196 end
197
197
198 # processing arguments
198 # processing arguments
199 problem = ARGV[0]
199 problem = ARGV[0]
200 testcase_dir = ARGV[1]
200 testcase_dir = ARGV[1]
201 problem = File.basename(testcase_dir) if problem=="-"
201 problem = File.basename(testcase_dir) if problem=="-"
202 check_script = ARGV[2]
202 check_script = ARGV[2]
203 options = {:time_limit => 1, :mem_limit => 16}
203 options = {:time_limit => 1, :mem_limit => 16}
204 process_options(options)
204 process_options(options)
205
205
206 JUDGE_ENVIRONMENTS.each do |env|
206 JUDGE_ENVIRONMENTS.each do |env|
207 ev_dir = ENV_INFO[env][:ev_dir]
207 ev_dir = ENV_INFO[env][:ev_dir]
208 raw_prefix = ENV_INFO[env][:raw_prefix]
208 raw_prefix = ENV_INFO[env][:raw_prefix]
209
209
210 num_testruns = count_testruns(testcase_dir,raw_prefix)
210 num_testruns = count_testruns(testcase_dir,raw_prefix)
211
211
212 puts ""
212 puts ""
213 puts "*** Environment: #{env} (#{num_testruns} test runs) ***"
213 puts "*** Environment: #{env} (#{num_testruns} test runs) ***"
214 puts ""
214 puts ""
215
215
216 import_problem(ev_dir,
216 import_problem(ev_dir,
217 problem,
217 problem,
218 testcase_dir,
218 testcase_dir,
219 num_testruns,
219 num_testruns,
220 raw_prefix,
220 raw_prefix,
221 check_script,
221 check_script,
222 options)
222 options)
223 end
223 end
You need to be logged in to leave comments. Login now