Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/ein16/synth/d2/run.py
ViewVC logotype

Annotation of /branches/ein16/synth/d2/run.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4236 - (view) (download) (as text)

1 : cchiw 3865 import sys
2 :     import re
3 :     import os
4 :     from test_createField import createField
5 :     from test_writeDiderot import writeDiderot
6 : cchiw 3915 from test_eval import eval
7 : cchiw 3865 from test_compare import compare
8 :     from test_observed import observed
9 : cchiw 3939 from obj_apply import *
10 :     from obj_ex import *
11 :     from obj_field import *
12 :     from set import *
13 :    
14 : cchiw 3915 # unu grid -i inputfile.nrrd | unu save -f text
15 :     # ^ where all the points are.
16 : cchiw 3865
17 : cchiw 4210 opr_max = 17
18 :     layer = int(sys.argv[1])
19 :     args = int(sys.argv[2])
20 : cchiw 3946 isVis15 = false
21 : cchiw 4188
22 : cchiw 4230 fld="mon_ein" #directory to save programs
23 :    
24 : cchiw 4212 #global vars
25 :     #rtn = []
26 :     rst_cnt = 0
27 :     rst_total = 0
28 :     rst_good = 0
29 :     rst_eh = 0
30 :     rst_terrible = 0
31 :     rst_compile = 0
32 : cchiw 4230 rst_cumulative = 0
33 : cchiw 4212
34 :     runtimepath = "" #path to branch testing
35 : cchiw 4230
36 : cchiw 3940 if isVis15:
37 : cchiw 4212 runtimepath = "/Users/chariseechiw/diderot/vis15/bin/diderotc --exec "
38 : cchiw 3940 else:
39 : cchiw 4212 runtimepath = "/Users/chariseechiw/diderot/ein16/bin/diderotc "
40 : cchiw 3915
41 : cchiw 3939 def clean():
42 :     # Clean up
43 :     os.system("rm *.o")
44 :     os.system("rm *.pyc")
45 :     os.system("rm *.h")
46 :     os.system("rm *.nrrd")
47 : cchiw 4196 os.system("rm *.cxx")
48 : cchiw 4236 os.system("rm *.diderot")
49 : cchiw 4196 os.system("rm fs3d-vec2")
50 :     os.system("rm fs3d-vec2")
51 : cchiw 3874
52 : cchiw 3946 def write(e):
53 :     print (e)
54 : cchiw 4210 def writeall(e):
55 : cchiw 4230 #print (e)
56 : cchiw 3946 # if it works continue
57 : cchiw 4236 f = open("rst/results_Final_1.txt", 'a+')
58 : cchiw 3946 f.write(e)
59 :     f.close()
60 : cchiw 4210 def writesummary(e):
61 : cchiw 4230 #print (e)
62 : cchiw 4210 # if it works continue
63 : cchiw 4236 f = open("rst/results_summary_1.txt", 'a+')
64 : cchiw 4210 f.write(e)
65 :     f.close()
66 :    
67 :     def writetys(e):
68 : cchiw 4230 #print (e)
69 : cchiw 4210 # if it works continue
70 : cchiw 4236 f = open("rst/results_tys_1.txt", 'a+')
71 : cchiw 4210 f.write(e)
72 :     f.close()
73 :    
74 : cchiw 4230 branch=""
75 :     # branch
76 :     if isVis15:
77 :     branch ="vis15"
78 :     else:
79 :     branch = "ein16"
80 :    
81 : cchiw 4212 def write_results(pre):
82 :     global rst_compile
83 :     global rst_good
84 :     global rst_eh
85 :     global rst_terrible
86 :     global rst_cnt
87 :     global rst_total
88 :     global layer
89 :     global args
90 : cchiw 4230 # global rst_cumulative
91 : cchiw 4188 x= "\n"
92 : cchiw 4212 if(rst_good==rst_cnt):
93 : cchiw 4188 x+="PASS:"
94 :     else:
95 : cchiw 4196 x+="CHECK:"
96 : cchiw 4230 x+= "cmd: "+str(layer)+" "+str(args)+" "+"- "+pre+"- "+branch
97 : cchiw 4158 if(rst_good>0):
98 : cchiw 4212 x+=" A:"+str(rst_good)+"|"+str(rst_cnt)
99 : cchiw 4158 if(rst_eh>0):
100 : cchiw 4212 x+=" B:"+str( rst_eh)+"|"+str(rst_cnt)
101 : cchiw 4158 if(rst_terrible>0):
102 : cchiw 4212 x+=" D:"+str( rst_terrible)+"|"+str(rst_cnt)
103 : cchiw 4158 if(rst_compile>0):
104 : cchiw 4230 x+=" did not run :"+str( rst_compile)+"|"+str(rst_total)
105 :     x+= " ran: "+str(rst_cnt)+"|" +str(rst_total)+" cumulative: "+str(rst_cumulative)
106 : cchiw 4188 x+="\n***************************************************\n"
107 : cchiw 3946 print (x)
108 : cchiw 4210 writeall(x)
109 :     writesummary(x)
110 : cchiw 3946
111 : cchiw 4210 ##################################################################################################
112 :     # iterate over ty2
113 :     def is_unary():
114 :     if(layer==2):
115 :     return true
116 :     else:
117 :     return false
118 :     # get outer operator
119 :     def get_outer(ex_outer):
120 :     if(is_unary()):
121 :     return op_unary[ex_outer]
122 :     else:
123 :     return op_binary[ex_outer]
124 :     # length of operators
125 :     def getN():
126 :     if(is_unary()):
127 :     return len(op_unary)
128 :     else:
129 :     return 6 #len(op_binary)
130 : cchiw 3946
131 : cchiw 4210 # get specific outer operator
132 :     def get_fty(ex_ty2):
133 :     if(is_unary()):
134 :     print "found unary"
135 :     return []
136 :     else:
137 :     print "not unary"
138 :     fty =l_all_F[ex_ty2]
139 :     return [fty]
140 :    
141 :     def idToOpr_outer(ex_outer):
142 :     return get_outer(ex_outer).name
143 :    
144 :     def idToOpr_inner(ex_opr):
145 : cchiw 4230 # print "idToOpr_inner ex_opr",ex_opr
146 : cchiw 4210 return get_single_exampleName(ex_opr)
147 :    
148 :     ##################################################################################################
149 : cchiw 3939 # already created app object
150 : cchiw 4188 def central(app, coeffs, dimF,ex_opr, ex_num ,id):
151 : cchiw 4230 print "############################################inside central############################################"
152 :     os.system("rm data/output.txt")
153 :     os.system("rm data/output.nrrd")
154 :     os.system("rm "+output+".txt")
155 :     os.system("rm *.nrrd")
156 :     #print "out",output+".txt"
157 : cchiw 4210 names= "t_"+str(ex_opr)+"_"+str(id)+"_"+str(ex_num)#+"_"+str(app.oty.id)
158 : cchiw 4230 print "names",names
159 : cchiw 4210 #apply.oprToStr(app)
160 :     writetys("\n\t-"+apply.get_all_FieldTys(app)+"|"+ names)
161 : cchiw 3939 # testing positions
162 :     positions = get_positions(dimF)
163 : cchiw 3946 #print "positions",positions
164 : cchiw 3939 # samples
165 :     outSize = get_size(dimF)
166 :     #create synthetic field data with diderot
167 :     createField(app, outSize, coeffs)
168 :     #create diderot program with operator
169 : cchiw 4230 print "about to write program"
170 : cchiw 3940 writeDiderot(p_Observ, app, positions, output, runtimepath, isVis15)
171 : cchiw 4212 #read observed data
172 : cchiw 4230 print "about to observe"
173 : cchiw 4212 observed_data = observed(app, output)
174 :     global rst_compile
175 :     global rst_good
176 :     global rst_eh
177 :     global rst_terrible
178 :     global rst_cnt
179 : cchiw 4230 global rst_cumulative
180 :     print "observed data from python",observed_data
181 : cchiw 4212 if (len(observed_data)<2):
182 : cchiw 4230 print "fail did not find data"
183 :     rst_compile += 1
184 : cchiw 4212 rtn = "diderot could not handle program"
185 : cchiw 4230 x = ("\n\t-"+rtn+" "+names)
186 :     # print ("rst_cnt",rst_cnt)
187 :     writeall(x)
188 :    
189 :     names= "c__"+str(ex_opr)+"_"+str(id)+"_"+str(ex_num)+"_"+str(app.oty.id)
190 : cchiw 4212 path = fld+"/"+names
191 :     os.system("mkdir "+path)
192 :     os.system("cp data/output5_p_observ.diderot "+path+"/"+names+".diderot")
193 :     os.system("cp output5_p_observ.diderot "+path+"/"+names+".diderot")
194 :     os.system("cp data/inputfile_0.nrrd "+path+"/inputfile_0.nrrd")
195 :     os.system("cp data/inputfile_1.nrrd "+path+"/inputfile_1.nrrd")
196 :     os.system("cp data/inputfilecat_2.nrrd "+path+"/inputfilecat_2.nrrd")
197 :     os.system("cp data/inputfile_2.nrrd "+path+"/inputfile_2.nrrd")
198 :     a= "\n\nterrible-data"
199 : cchiw 4230 b= "\n\nobserved data from "+branch+" "+str(observed_data)
200 :     # correct values from python
201 :     correct_data = eval(app , positions)
202 : cchiw 4212 c= "\n\ncorrect data from python"+str(correct_data)
203 :     d="\n\n coeffs"+str(coeffs)
204 :     f = open(path+"/rst.txt", 'w+')
205 : cchiw 4230 f.write(a+b+c+d+"\n\n")
206 : cchiw 4212 f.close()
207 : cchiw 4230 return
208 :     else:
209 :     #correct values from python
210 :     correct_data = eval(app , positions)
211 :     print "correct data from python", correct_data
212 :     #--------------------Comparison
213 :     #compare observed and correct data
214 :     rtn_all = compare(app, observed_data, correct_data)
215 :     (rtn_1, rst_good_1, rst_eh_1, rst_terrible_1, rst_compile_1) = rtn_all
216 :     # collect results
217 :     rtn = []
218 :     rtn += rtn_1
219 :     rst_good += rst_good_1
220 :     rst_eh += rst_eh_1
221 :     rst_terrible += rst_terrible_1
222 :     rst_compile += rst_compile_1
223 :     rst_cnt += 1
224 :     rst_cumulative +=1
225 :     x = ("\n\t-"+rtn_1+" "+names)
226 :     # print ("rst_cnt",rst_cnt)
227 :     writeall(x)
228 : cchiw 4236 if (rst_terrible_1==10):
229 : cchiw 4230 writesummary(x)
230 :     names= "t_"+str(ex_opr)+"_"+str(id)+"_"+str(ex_num)+"_"+str(app.oty.id)
231 :     path = fld+"/"+names
232 :     os.system("mkdir "+path)
233 :     os.system("cp data/output5_p_observ.diderot "+path+"/"+names+".diderot")
234 :     os.system("cp output5_p_observ.diderot "+path+"/"+names+".diderot")
235 :     os.system("cp data/inputfile_0.nrrd "+path+"/inputfile_0.nrrd")
236 :     os.system("cp data/inputfile_1.nrrd "+path+"/inputfile_1.nrrd")
237 :     os.system("cp data/inputfilecat_2.nrrd "+path+"/inputfilecat_2.nrrd")
238 :     os.system("cp data/inputfile_2.nrrd "+path+"/inputfile_2.nrrd")
239 :     a= "\n\nterrible-data"
240 :     b= "\n\nobserved data from "+branch+" "+str(observed_data)
241 :     c= "\n\ncorrect data from python"+str(correct_data)
242 :     d="\n\n coeffs"+str(coeffs)
243 :     f = open(path+"/rst.txt", 'w+')
244 :     f.write(a+b+c+d+"\n\n"+rtn_1)
245 :     f.close()
246 :     clean()
247 :     return
248 : cchiw 4212 return
249 : cchiw 3874
250 : cchiw 4210 ########################################### specific ex. #######################################################
251 : cchiw 3939 # get example from list of examples
252 : cchiw 4210 def single_specific_ex(ex_opr, ex_num):
253 : cchiw 3946 #print "single specific ex"
254 : cchiw 3939 (name,opr,ishape)= get_single_example(int(ex_opr), int(ex_num))
255 :     #create app object
256 :     (app, coeffs, dimF,_) = mkApply_fld(name, opr, ishape, inputfile)
257 :     # main
258 : cchiw 4212 global rst_total
259 :     rst_total+= 1
260 :     return central(app, coeffs, dimF,ex_opr, ex_num,0)
261 : cchiw 4188
262 : cchiw 3939 # checks to see if specific ex works
263 : cchiw 4210 def embed_base_specific_ex(ex_opr, ex_outer, ex_num, ex_ty2):
264 : cchiw 4212 global rst_total
265 :     rst_total+= 1
266 : cchiw 4230 # print ("rst_total",rst_total)
267 :     #print ("embed_base_specific_ex: ex_opr,",ex_opr, " ex_outer:",ex_outer," ex_num: ", ex_num, " ex_ty2:", ex_ty2)
268 : cchiw 4210 opr_outer = get_outer(ex_outer)
269 :     fty= get_fty(ex_ty2)
270 :     id = ex_outer
271 :     # get result after applying operators
272 :     def get_tshape(opr1, ishape):
273 : cchiw 4230 print ("inside get_shape",opr1.name, ishape)
274 :    
275 : cchiw 4210 arity=opr1.arity
276 :     #print "checking for first time in rum.py"
277 : cchiw 4230 print ("tshape- inner:",opr1.name,"ishape",ishape[0].name)
278 :     if(len(ishape)>1):
279 :     print (",",ishape[1].name)
280 :     def get():
281 :     if(arity==1):
282 :     print ("arity 1")
283 :     return applyUnaryOp(opr1,ishape)
284 :     elif(arity==2):
285 :     print ("arity 2")
286 :     return applyBinaryOp(opr1, ishape)
287 :     (tf0, shape0) = get()
288 :     if(tf0):
289 :     print "shape-rtn-name",shape0.name
290 :     else:
291 :     print "shape-rtn-err",shape0
292 :     return (tf0, shape0)
293 :    
294 : cchiw 3939 # current example
295 :     (name,opr_inner,ishape)= get_single_example(ex_opr, ex_num)
296 : cchiw 3946 # first layer
297 : cchiw 4230 (tf1, tshape1) = get_tshape(opr_inner,ishape)
298 :     if(tf1==false):
299 : cchiw 4212 return
300 : cchiw 3939 else:
301 : cchiw 4230 #second layer, adds second field type
302 :     ishape = ishape+fty
303 :     (tf2, tshape2) = get_tshape(opr_outer,[tshape1]+fty)
304 :     # checks to see if specific ex works
305 :     if(tf2==true):# if it works continue
306 :     write("\n\t\t typechecks ")
307 :     #create app object
308 :     name = opr_outer.name+"("+opr_inner.name+")"
309 :     #print "before mkapply twice"
310 :     (app, coeffs, dimF) = mkApply_twice(name, opr_inner,opr_outer, ishape, inputfile)
311 :     #print "\nafter mk apply twice:\n",apply.toStr(app,0 )
312 :     # main part
313 :     central(app, coeffs, dimF,ex_opr, ex_num,id)
314 :     return
315 :     else:
316 :     x = "\n\t\tskipped did not apply "+opr_outer.name+" to ("+tshape2+","
317 :     write(x)
318 :     return
319 : cchiw 4212 return
320 : cchiw 4230 return
321 : cchiw 3939
322 : cchiw 4210 ################################################## iterating ###############################################
323 :     def embed_base_iter_ty2(ex_opr, ex_outer):
324 : cchiw 4212 #iterating ex_num from 0...n
325 :     def embed_base_iter_num(ex_opr, ex_outer, ex_ty2, n):
326 :     #print ("embed_base_iter_num: ex_opr,",ex_opr, " ex_outer:",ex_outer, " ex_ty2:", ex_ty2, " n:", n)
327 :     for ex_num in range(n):
328 :     embed_base_specific_ex(ex_opr, ex_outer, ex_num, ex_ty2)
329 :     return
330 :     #print "embed_base_iter_ty2: ex_opr",ex_opr, " ex_outer:",ex_outer
331 : cchiw 4210 if(is_unary()):
332 :     gty=-1
333 :     nn = len(get_ex(ex_opr).tys)
334 : cchiw 4212 embed_base_iter_num(ex_opr, ex_outer, gty, nn)
335 : cchiw 4210 else:
336 :     ex = get_ex(ex_opr)
337 :     n = len(ex.tys)
338 :     m = len(l_all_F) # use all field types as extra types
339 :     for ex_ty2 in range(m): #extra type
340 : cchiw 4212 embed_base_iter_num(ex_opr, ex_outer, ex_ty2, n)
341 : cchiw 4230 return
342 : cchiw 4210
343 : cchiw 4212 #iterating ex_outer from 0...length(potential outer_operators)
344 : cchiw 4210 def embed_base_iter_outer(ex_opr):
345 : cchiw 4212 # print "\nembed_base_iter_outer: ex_opr",ex_opr
346 : cchiw 4210 n = getN()
347 : cchiw 4212 y = idToOpr_inner(ex_opr)+" |"+str(ex_opr)
348 :     writeall(y)
349 : cchiw 4210 #have ex_opr iterating over ex_outer
350 :     for ex_outer in range(n):
351 : cchiw 4212 global rst_cnt
352 :     rst_cnt = 0
353 :     global rst_total
354 :     rst_total = 0
355 :     global rst_compile
356 :     rst_compile = 0
357 :     global rst_good
358 :     rst_good = 0
359 :     global rst_eh
360 :     rst_eh = 0
361 :     global rst_terrible
362 :     rst_terrible = 0
363 :     y = idToOpr_outer(ex_outer)+ "_"+idToOpr_inner(ex_opr)+" |"+str(ex_opr)+"_"+str(ex_outer)
364 :     writetys("\n"+y)
365 :     writeall(y)
366 :     embed_base_iter_ty2(ex_opr, ex_outer)
367 :     write_results(y)
368 :     return
369 : cchiw 3939
370 : cchiw 4212 #run all possible examples from 0...n
371 :     def embed2_iter_inner(n):
372 : cchiw 3946 for ex_opr in range(n):
373 : cchiw 4212 embed_base_iter_outer(ex_opr)
374 :     return
375 : cchiw 3939
376 : cchiw 4210 #run all examples for a specific operator
377 :     def single_all_ops(ex_opr):
378 :     ex = get_ex(ex_opr)
379 :     #print(example.get_oprname(ex))
380 :     n = len(ex.tys)
381 :     if (n==0):
382 : cchiw 4212 return
383 : cchiw 4210 y = "\n\n"+idToOpr_inner(ex_opr)+" |"+str(ex_opr)
384 :     writetys(y)
385 : cchiw 4212 writeall(y)
386 : cchiw 4230 global rst_cnt
387 :     rst_cnt = 0
388 :     global rst_total
389 :     rst_total = 0
390 :     global rst_compile
391 :     rst_compile = 0
392 :     global rst_good
393 :     rst_good = 0
394 :     global rst_eh
395 :     rst_eh = 0
396 :     global rst_terrible
397 :     rst_terrible = 0
398 : cchiw 4210 for ex_num in range(n):
399 : cchiw 4212 single_specific_ex(ex_opr, ex_num)
400 :     return
401 : cchiw 4210
402 :     ##################################################################################################
403 :     ##################################################################################################
404 :     if (layer==1):
405 :     if(args==0):
406 :     # iterate over single layer
407 :     rtn = []
408 :     for ex_opr in range(opr_max+1):
409 : cchiw 4212 single_all_ops(ex_opr)
410 :     write_results(str(ex_opr)+"("+get_exname(ex_opr)+")--")
411 : cchiw 4230 x= "\n***************************************************\n #cumulative: "+str(rst_cumulative)
412 :     print (x)
413 :     writeall(x)
414 :     writesummary(x)
415 : cchiw 4210 elif (args==1):
416 :     # iterate over single layer
417 :     ex_opr = int(sys.argv[3])
418 : cchiw 4212 single_all_ops(ex_opr)
419 :     write_results(str(ex_opr)+"("+get_exname(ex_opr)+")--")
420 : cchiw 4230 elif (args==2):
421 :     ex_opr = int(sys.argv[3])
422 :     ex_num = int(sys.argv[4])
423 :     ex = get_ex(ex_opr)
424 :     n = len(ex.tys)
425 :     if(ex_num>n):
426 :     raise Exception ("unsupported num:"+str(ex_num)+"|"+str(n))
427 :     single_specific_ex(ex_opr, ex_num)
428 :     write_results(str(ex_opr)+"("+get_exname(ex_opr)+")--")
429 :     else:
430 :     raise Exception ("unsupported number of args")
431 : cchiw 4210 elif (layer==2):
432 :     if(args==0):
433 :     #run all the programs
434 : cchiw 4212 embed2_iter_inner (opr_max+1)
435 :     write_results("all")
436 : cchiw 4230 x= "\n***************************************************\n #cumulative: "+str(rst_cumulative)
437 :     print (x)
438 :     writeall(x)
439 :     writesummary(x)
440 : cchiw 4210 elif(args==1):
441 :     # iterate over double layer with unary operator
442 :     ex_opr = int(sys.argv[3])
443 : cchiw 4212 embed_base_iter_outer(ex_opr)
444 : cchiw 4230 x= "\n***************************************************\n #cumulative: "+str(rst_cumulative)
445 :     print (x)
446 :     writeall(x)
447 :     writesummary(x)
448 :     elif (args==2):
449 :     ex_opr = int(sys.argv[3])
450 :     ex_outer = int(sys.argv[4])#outer binary operator
451 :     if(ex_outer>len(op_binary )):
452 :     raise Exception ("outer2 needs to be less than "+str(len(op_binary)))
453 :     y = "\n\n"+idToOpr_outer(ex_outer)+ "_"+idToOpr_inner(ex_opr)+" |"+str(ex_opr)+"_"+str(ex_outer)
454 :     writetys(y)
455 :     writeall(y)
456 :     embed_base_iter_ty2(ex_opr, ex_outer)
457 :     write_results(str(ex_opr)+" "+str(ex_outer)+":")
458 :     x= "\n***************************************************\n #cumulative: "+str(rst_cumulative)
459 :     print (x)
460 :     writeall(x)
461 :     writesummary(x)
462 : cchiw 4210 elif(args==3):
463 :     # run a specific iterate over double layer with unary operator
464 :     ex_opr = int(sys.argv[3])
465 :     ex_outer= int(sys.argv[4])
466 :     if((ex_outer)> 10):
467 :     raise Exception("not unary id:"+str(ex_outer))
468 :     ex_num = int(sys.argv[5])
469 :     ex_ty2 = None
470 : cchiw 4212 embed_base_specific_ex(ex_opr, ex_outer, ex_num, ex_ty2)
471 :     write_results(str(ex_opr)+"("+get_exname(ex_opr)+")--"+ str(ex_num))
472 : cchiw 4210 elif (layer==3):
473 : cchiw 3946 # number from generated list of types (not type id.)
474 : cchiw 4188 ex_opr = int(sys.argv[3]) #inside operator
475 : cchiw 4230 if(ex_opr<12):
476 :     raise Exception("not possible to iterate over all unary ops")
477 : cchiw 4210 if(args==0):
478 :     raise Exception("not possible to iterate over all binary operators")
479 :     elif (args==1):
480 :     # and all possible outer operators
481 : cchiw 4212 embed_base_iter_outer(ex_opr)
482 : cchiw 4210 elif (args==2):
483 :     ex_outer = int(sys.argv[4])#outer binary operator
484 :     if(ex_outer>len(op_binary )):
485 :     raise Exception ("outer2 needs to be less than "+str(len(op_binary)))
486 :     y = "\n\n"+idToOpr_outer(ex_outer)+ "_"+idToOpr_inner(ex_opr)+" |"+str(ex_opr)+"_"+str(ex_outer)
487 :     writetys(y)
488 :     writeall(y)
489 : cchiw 4212 embed_base_iter_ty2(ex_opr, ex_outer)
490 :     write_results(str(ex_opr)+" "+str(ex_outer)+":")
491 : cchiw 4210 elif (args==4):
492 :     ex_outer = int(sys.argv[4]) # outer binary operator
493 :     ex_num = int(sys.argv[5]) # inside type on list
494 :     ex_ty2 = int(sys.argv[6]) # extra type (not in text file)
495 : cchiw 4212 embed_base_specific_ex(ex_opr, ex_outer, ex_num, ex_ty2)
496 :     write_results(str(ex_opr)+" "+str(ex_outer)+" "+str(ex_num)+" "+str(ex_ty2)+":")
497 : cchiw 3939 else:
498 :     raise "unsupported"
499 : cchiw 4236
500 :     clean()

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0