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