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

SCM Repository

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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : cchiw 3865 # -*- coding: utf-8 -*-
2 :    
3 :     from __future__ import unicode_literals
4 :    
5 :     import codecs
6 :     import sys
7 :     import os
8 :     import re
9 : cchiw 3874
10 : cchiw 3915
11 : cchiw 3939 from obj_ex import *
12 : cchiw 3915 from obj_apply import *
13 :     from obj_ty import *
14 :     from obj_operator import *
15 : cchiw 3939 from obj_field import *
16 : cchiw 3915
17 : cchiw 3865 template="template/foo.ddro" # template
18 :    
19 :     #strings in diderot template
20 :     foo_in="foo_in"
21 :     foo_outTen="foo_outTen"
22 :     foo_op ="foo_op"
23 :     foo_probe ="foo_probe"
24 :     foo_length="foo_length"
25 :     #otherwise variables in diderot program
26 :     foo_out="out"
27 :    
28 : cchiw 3874 def fieldName(i):
29 :     return "F"+str(i)
30 :     opfieldname1="G"
31 :    
32 : cchiw 3865 # type of field
33 : cchiw 3915 def fieldShape(f, fldty):
34 : cchiw 3939 foo = fty.toDiderot(fldty)
35 : cchiw 3865 f.write(foo.encode('utf8'))
36 :    
37 :     #field input line
38 : cchiw 3874 #f: file to write to
39 :     #k:continuity
40 :     #itypes: types for input field
41 :     #inputlist: name for input data
42 : cchiw 3939 def inShape(f,appC):
43 :     app = apply.get_root_app(appC)
44 : cchiw 3874 i=0
45 : cchiw 3939 exps = apply.get_exps(app)
46 :     for exp in exps:
47 :     dim = field.get_dim(exp)
48 :     #print ("exp:", field.toStr(exp))
49 : cchiw 3915 fieldShape(f, exp.fldty)
50 : cchiw 3939 if (field.get_isField(exp)):
51 :     foo= fieldName(i)+" = "+exp.krn+u'⊛'+" image(\""+exp.inputfile+".nrrd\");\n"
52 :     f.write(foo.encode('utf8'))
53 :     else: #tensor type
54 :     foo= fieldName(i)+" = "+str(field.get_data(exp))+";\n"
55 :     f.write(foo.encode('utf8'))
56 : cchiw 3874 i+=1
57 : cchiw 3865
58 :    
59 :     #instaniate output tensor
60 :     def outLine(f, type):
61 : cchiw 3939 otype = fty.get_tensorType(type)
62 : cchiw 3865 foo="\toutput "
63 : cchiw 3939 if (ty_scalarT==otype):
64 : cchiw 3865 foo+="tensor []"+foo_out+" = 0.0"
65 : cchiw 3939 elif(ty_vec2T==otype):
66 : cchiw 3865 foo+= "tensor [2] "+foo_out+" = [0.0, 0.0]"
67 : cchiw 3939 elif(ty_vec3T==otype):
68 :     foo+= "tensor [3] "+foo_out+" = [0.0, 0.0, 0.0]"
69 :     elif(ty_mat2x2T==otype):
70 : cchiw 3874 foo+= "tensor [2,2] "+foo_out+" = [[0.0, 0.0],[0.0, 0.0]]"
71 : cchiw 3939 elif(ty_mat3x3T==otype):
72 :     foo+= "tensor [3,3] "+foo_out+" = [[0.0, 0.0, 0.0],[0.0, 0.0, 0.0],[0.0, 0.0, 0.0]]"
73 :     elif(ty_ten2x2x2T==otype):
74 :     foo+= "tensor [2,2,2] "+foo_out+" = [[[0.0, 0.0],[0.0, 0.0]],[[0.0, 0.0],[0.0, 0.0]]]"
75 :     elif(ty_ten3x3x3T==otype):
76 :     foo+= "tensor [3,3,3] "+foo_out+" = [[[0.0, 0.0, 0.0],[0.0, 0.0, 0.0],[0.0, 0.0, 0.0]],[[0.0, 0.0, 0.0],[0.0, 0.0, 0.0],[0.0, 0.0, 0.0]],[[0.0, 0.0, 0.0],[0.0, 0.0, 0.0],[0.0, 0.0, 0.0]]]"
77 :    
78 : cchiw 3865 else:
79 : cchiw 3939 raise Exception("unsupported input type",otype)
80 : cchiw 3865 foo+= ";\n"
81 :     f.write(foo.encode('utf8'))
82 :    
83 : cchiw 3915 #write operation between fields
84 :     def gotop1(f,app):
85 :     op1=app.opr
86 :     arity=app.opr.arity
87 :     itypes=apply.get_types(app)
88 : cchiw 3874 foo = opfieldname1+" = "
89 :     if (arity==1):
90 : cchiw 3939 (ft, typ2) = applyUnaryOp(op1,itypes)
91 :     if(ft==false):
92 :     raise "unsupported application of unary operator"
93 : cchiw 3915 fieldShape(f, typ2)
94 :     foo += (op1.symb)+fieldName(0)
95 : cchiw 3874 elif(arity==2):
96 : cchiw 3939 (ft,typ2) = applyBinaryOp(op1,itypes)
97 :     if(ft==false):
98 :     raise "unsupported application of binary operator"
99 : cchiw 3915 fieldShape(f, typ2)
100 :     foo += fieldName(0)+(op1.symb)+fieldName(1)
101 : cchiw 3874 else:
102 :     raise Exception("unsupported arity")
103 :     foo += ";\n"
104 : cchiw 3865 f.write(foo.encode('utf8'))
105 :    
106 : cchiw 3939 #write operation between fields
107 :     def gotop2(f,app_outer):
108 :     opr_outer=app_outer.opr
109 :     app_inner=apply.get_unary(app_outer)
110 :     opr_inner=app_inner.opr
111 :     arity= opr_inner.arity
112 :     itypes=apply.get_types(app_inner)
113 :     foo = opfieldname1+" = "
114 :     #checks inside arity
115 :     #assumes outside arity is one
116 :     if (arity==1):
117 :     (_, typ_inner) = applyUnaryOp(opr_inner,itypes)
118 :     (_, typ_outer) = applyUnaryOp(opr_outer,[typ_inner])
119 :     fieldShape(f, typ_outer)
120 :     foo += (opr_outer.symb)+"("+(opr_inner.symb)+fieldName(0)+")"
121 :     elif(arity==2):
122 :     (_, typ_inner)= applyBinaryOp(opr_inner,itypes)
123 :     (_, typ_outer) = applyUnaryOp(opr_outer,[typ_inner])
124 :     fieldShape(f, typ_outer)
125 :     foo += (opr_outer.symb)+"("+fieldName(0)+(opr_inner.symb)+fieldName(1)+")"
126 :    
127 :     else:
128 :     raise Exception("unsupported arity")
129 :     foo += ";\n"
130 :     f.write(foo.encode('utf8'))
131 :    
132 :     def replaceOp(f,app):
133 :     if(app.isroot):
134 :     return gotop1(f,app)
135 :     else: #twice embedded
136 :     return gotop2(f,app)
137 :    
138 : cchiw 3865 def indexG(f, pos):
139 :     i=0
140 :     foo=""
141 : cchiw 3874 #pos.insert(0,pos[0])
142 : cchiw 3865 p=str(pos[0])
143 :     foo += "\t\tif(i=="+str(i)+"){\n"
144 : cchiw 3874 foo += "\t\t\t"+foo_out+" = "+opfieldname1+"("+p+");\n"
145 : cchiw 3865 foo += "\t\t}\n"
146 :     i=i+1
147 :     for p1 in pos:
148 :     p=str(p1)
149 : cchiw 3939 foo += "\t\telse if(i=="+str(i)+"){\n"
150 : cchiw 3874 foo += "\t\t\t"+foo_out+" = "+opfieldname1+"("+p+");\n"
151 : cchiw 3865 foo += "\t\t}\n"
152 :     i=i+1
153 :     f.write(foo.encode('utf8'))
154 :    
155 :     def setLength(f, n):
156 :     foo="int length ="+str(n)+";"
157 :     f.write(foo.encode('utf8'))
158 :    
159 :     #itype: shape of fields
160 :     #otype: output tensor
161 :     #op1: unary operation involved
162 : cchiw 3915 def readDiderot(p_out,app,pos):
163 : cchiw 3865 #read diderot template
164 :     ftemplate = open(template, 'r')
165 :     ftemplate.readline()
166 :     #write diderot program
167 :     f = open(p_out+".diderot", 'w+')
168 :     for line in ftemplate:
169 :     # is it initial field line?
170 :     a0 = re.search(foo_in, line)
171 :     if a0:
172 :     #replace field input line
173 : cchiw 3915
174 :     inShape(f,app)
175 : cchiw 3865 continue
176 :     # is it output tensor line?
177 :     b0 = re.search(foo_outTen, line)
178 :     if b0:
179 : cchiw 3915 outLine(f, app.oty)
180 : cchiw 3865 continue
181 :     # operation on field
182 :     c0 = re.search(foo_op,line)
183 :     if c0:
184 : cchiw 3939 replaceOp(f, app)
185 : cchiw 3865 continue
186 :     # index field at position
187 :     d0 = re.search(foo_probe,line)
188 :     if d0:
189 :     indexG(f, pos)
190 :     continue
191 :     # length number of positions
192 :     e0=re.search(foo_length, line)
193 :     if e0:
194 :     setLength(f,len(pos))
195 :     continue
196 :     # nothing is being replaced
197 :     else:
198 :     f.write(line)
199 :    
200 :     ftemplate.close()
201 :     f.close()
202 :    
203 : cchiw 3940 def runDiderot(p_out, app, pos, output, runtimepath, isVis):
204 :     if(isVis):
205 :     outSize = len(pos)
206 :     w_shape=" -s 1 "+str(outSize * outSize)
207 :     # os.system("./"+p_out+"| unu save -f nrrd -o tmp.nrrd")
208 :     #os.system("unu reshape -i tmp.nrrd "+w_shape+" | unu save -f text -o "+p_out+".txt")
209 :     else:
210 :     os.system("./"+p_out)
211 :    
212 :     def writeDiderot(p_out, app, pos, output, runtimepath, isVis):
213 : cchiw 3915 readDiderot(p_out,app,pos)
214 : cchiw 3865 # compile and run diderot program
215 : cchiw 3940 print runtimepath
216 : cchiw 3865 os.system(" echo \"pout "+p_out+"\"")
217 :     os.system(" echo \"create diderot program "+p_out+".diderot \"")
218 : cchiw 3940 os.system(runtimepath+" "+p_out+".diderot")
219 :     runDiderot(p_out, app, pos, output, runtimepath,isVis)
220 : cchiw 3865 os.system("cp "+p_out+".txt "+output+".txt")
221 :     os.system("cp "+p_out+".diderot "+output+".diderot")
222 : cchiw 3874 os.system("cp "+p_out+".c "+output+".c")
223 : cchiw 3865 os.system(" echo \"copied diderot program to "+output+".diderot \"")
224 :     os.system(" echo \"copied o-out "+output+".txt \"")
225 :     os.system("rm "+p_out+"*")

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