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

SCM Repository

[diderot] Diff of /branches/ein16/synth/d2/test_eval.py
ViewVC logotype

Diff of /branches/ein16/synth/d2/test_eval.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3939, Tue Jun 7 18:06:23 2016 UTC revision 3946, Sat Jun 11 00:39:19 2016 UTC
# Line 13  Line 13 
13    
14    
15  # ***************************  unary operators ***************************  # ***************************  unary operators ***************************
 # negation  of field  
 def fn_negation(exp):  
     return -1*exp  
16  # binary operators  # binary operators
17  def fn_add(exp1,exp2):  def fn_add(exp1,exp2):
18      return exp1+exp2      return exp1+exp2
# Line 33  Line 30 
30      exp_t = field.get_data(t)      exp_t = field.get_data(t)
31      ityp1 = field.get_ty(t)      ityp1 = field.get_ty(t)
32      shape1 = fty.get_shape(ityp1)      shape1 = fty.get_shape(ityp1)
33      print "exp_s",exp_s,"exp_t",exp_t      #print "exp_s",exp_s,"exp_t",exp_t
34      if(field.is_Scalar(t)):      if(field.is_Scalar(t)):
35          return  exp_s*  exp_t          return  exp_s*  exp_t
36      elif(field.is_Vector(t)):      elif(field.is_Vector(t)):
# Line 46  Line 43 
43          [n1,n2] =  shape1          [n1,n2] =  shape1
44          rtn = []          rtn = []
45          for i in range(n1):          for i in range(n1):
46                tmp = []
47              for j in range(n2):              for j in range(n2):
48                  rtn.append(exp_s*exp_t[i][j])                  tmp.append(exp_s*exp_t[i][j])
49                rtn.append(tmp)
50          return rtn          return rtn
51      elif(field.is_Ten3(t)):      elif(field.is_Ten3(t)):
52          [n1,n2,n3] =  shape1          [n1,n2,n3] =  shape1
53          rtn = []          rtn = []
54          for i in range(n1):          for i in range(n1):
55                tmpI = []
56              for j in range(n2):              for j in range(n2):
57                    tmpJ = []
58                  for k in range(n3):                  for k in range(n3):
59                      rtn.append(exp_s*exp_t[i][j][k])                      tmpJ.append(exp_s*exp_t[i][j][k])
60                    tmpI.append(tmpJ)
61                rtn.append(tmpI)
62          return rtn          return rtn
63      else:      else:
64          raise "unsupported scaling"          raise "unsupported scaling"
65    
66    # negation  of field
67    def fn_negation(exp):
68    
69        return -1*exp
70    
71    
72  #evaluate cross product  #evaluate cross product
73  def fn_cross(fld1, fld2):  def fn_cross(fld1, fld2):
74      exp1 = field.get_data(fld1)      exp1 = field.get_data(fld1)
# Line 135  Line 144 
144      if(n!=dim):      if(n!=dim):
145         raise (" type not supported for jacob")         raise (" type not supported for jacob")
146      if(n==2):      if(n==2):
147          return [diff(exp[0],x), diff(exp[0],y),          return [[diff(exp[0],x), diff(exp[0],y)],
148                  diff(exp[1],x), diff(exp[1],y)]                  [diff(exp[1],x), diff(exp[1],y)]]
149      elif(n==3):      elif(n==3):
150          return  [diff(exp[0],x), diff(exp[0],y), diff(exp[0],z),          return  [[diff(exp[0],x), diff(exp[0],y), diff(exp[0],z)],
151                   diff(exp[1],x), diff(exp[1],y), diff(exp[1],z),                   [diff(exp[1],x), diff(exp[1],y), diff(exp[1],z)],
152                   diff(exp[2],x), diff(exp[2],y), diff(exp[2],z)]                   [diff(exp[2],x), diff(exp[2],y), diff(exp[2],z)]]
153      else:      else:
154          raise "unsupported type for divergence"          raise "unsupported type for divergence"
155    
# Line 152  Line 161 
161      exp2 = field.get_data(fld2)      exp2 = field.get_data(fld2)
162      ityp2 = field.get_ty(fld2)      ityp2 = field.get_ty(fld2)
163      rtn=[]      rtn=[]
164        #print "exp1",exp1,"ityp1",ityp1.name,"-length",len(exp1)
165        #print "exp2",exp2,"ityp2",ityp2.name,"-length",len(exp2)
166    
167      if(fty.is_Vector(ityp1)):      if(fty.is_Vector(ityp1)):
168          n1= fty.get_vecLength(ityp1)          n1= fty.get_vecLength(ityp1)
169          if(fty.is_Vector(ityp2)):          if(fty.is_Vector(ityp2)):
170              #both vectors              #both vectors
171              n2= fty.get_vecLength(ityp2)              n2= fty.get_vecLength(ityp2)
172              for i in  range(n1):              for i in  range(n1):
173                    tmpI = []
174                  for j in range(n2):                  for j in range(n2):
175                      rtn.append(exp1[i]*exp2[j])                      tmpI.append(exp1[i]*exp2[j])
176                    rtn.append(tmpI)
177              return rtn              return rtn
178          elif(fty.is_Matrix(ityp2)):          elif(fty.is_Matrix(ityp2)):
179              [n2,n3] = fty.get_shape(ityp2)              [n2,n3] = fty.get_shape(ityp2)
180              for i in  range(n1):              for i in  range(n1):
181                    tmpI = []
182                  for j in range(n2):                  for j in range(n2):
183                        tmpJ = []
184                      for k in range(n3):                      for k in range(n3):
185                          rtn.append(exp1[i]*exp2[j][k])                          tmpJ.append(exp1[i]*exp2[j][k])
186                        tmpI.append(tmpJ)
187                    rtn.append(tmpI)
188              return rtn              return rtn
189      elif(fty.is_Matrix(ityp1)):      elif(fty.is_Matrix(ityp1)):
190          [n1,n2] = fty.get_shape(ityp1)          [n1,n2] = fty.get_shape(ityp1)
191          if(fty.is_Vector(ityp2)):          if(fty.is_Vector(ityp2)):
192              n3= fty.get_vecLength(ityp2)              n3= fty.get_vecLength(ityp2)
193              for i in  range(n1):              for i in  range(n1):
194                    tmpI = []
195                  for j in range(n2):                  for j in range(n2):
196                        tmpJ = []
197                      for k in range(n3):                      for k in range(n3):
198                          rtn.append(exp1[i][j]*exp2[k])                          tmpJ.append(exp1[i][j]*exp2[k])
199                        tmpI.append(tmpJ)
200                    rtn.append(tmpI)
201              return rtn              return rtn
202          elif(fty.is_Matrix(ityp2)):          elif(fty.is_Matrix(ityp2)):
203              [n3,n4] = fty.get_shape(ityp2)              [n3,n4] = fty.get_shape(ityp2)
204              for i in  range(n1):              for i in  range(n1):
205                    tmpI = []
206                  for j in range(n2):                  for j in range(n2):
207                        tmpJ = []
208                      for k in range(n3):                      for k in range(n3):
209                            tmpK = []
210                          for l in range(n4):                          for l in range(n4):
211                              rtn.append(exp1[i][j]*exp2[k][l])                              tmpK.append(exp1[i][j]*exp2[k][l])
212                            tmpJ.append(tmpK)
213                        tmpI.append(tmpJ)
214                    rtn.append(tmpI)
215              return rtn              return rtn
216          else:          else:
217              raise "outer product is not supported"              raise "outer product is not supported"
# Line 220  Line 248 
248              return rtn              return rtn
249          elif(fty.is_Ten3(ityp2)):          elif(fty.is_Ten3(ityp2)):
250              [n2,n3] = fty.drop_last(ityp2)              [n2,n3] = fty.drop_last(ityp2)
251              rtni=[]              rtn = []
252              for i in  range(n2):              for i in  range(n2):
253                  rtnj=[]                  tmpJ = []
254                  for j in  range(n3):                  for j in  range(n3):
255                      sumrtn=0                      sumrtn=0
256                      for s in  range(n1):                      for s in  range(n1):
257                          curr = exp1[s]*exp2[s][i][j]                          curr = exp1[s]*exp2[s][i][j]
258                          sumrtn += curr                          sumrtn += curr
259                      rtni.append(sumrtn)                      tmpJ.append(sumrtn)
260                      #rtnj.append(sumrtn)                  rtn.append(tmpJ)
261              return rtni              return rtn
262          else:          else:
263              raise "inner product is not supported"              raise "inner product is not supported"
264      elif(fty.is_Matrix(ityp1)):      elif(fty.is_Matrix(ityp1)):
# Line 253  Line 281 
281              ns = fty.get_vecLength(ityp2)              ns = fty.get_vecLength(ityp2)
282              rtn=[]              rtn=[]
283              for i in  range(n1):              for i in  range(n1):
284                    tmpI=[]
285                  for j in  range(n2):                  for j in  range(n2):
286                      sumrtn=0                      sumrtn=0
287                      for s in  range(ns):                      for s in  range(ns):
288                          curr = exp1[i][j][s]*exp2[s]                          curr = exp1[i][j][s]*exp2[s]
289                          sumrtn += curr                          sumrtn += curr
290                      rtn.append(sumrtn)                      tmpI.append(sumrtn)
291                    rtn.append(tmpI)
292              return rtn              return rtn
293          else:          else:
294              raise "inner product is not supported"              raise "inner product is not supported"
# Line 281  Line 311 
311          rtn.append(x)          rtn.append(x)
312      return rtn      return rtn
313    
314    def applyToM(vec, unary):
315        rtn = []
316        for i in vec:
317            tmpI = []
318            for v in i:
319                tmpI.append(unary(v))
320            rtn.append(tmpI)
321        return rtn
322    
323    def applyToT3(vec, unary):
324        rtn = []
325        for i in vec:
326            tmpI = []
327            for j in i:
328                tmpJ = []
329                for v in j:
330                    tmpJ.append(unary(v))
331                tmpI.append(tmpJ)
332            rtn.append(tmpI)
333        return rtn
334    
335  # ***************************  apply to scalars or vectors ***************************  # ***************************  apply to scalars or vectors ***************************
336  #apply operators to expression  #apply operators to expression
337  # return output types and expression  # return output types and expression
# Line 317  Line 368 
368      else:      else:
369          raise Exception("unsupported unary operator:"+ fn_name.name)          raise Exception("unsupported unary operator:"+ fn_name.name)
370    
371    def applyToExp_U_M(fn_name, fld):
372        exp = field.get_data(fld)
373        if(op_probe==fn_name): #probing
374            return exp
375        elif(op_negation==fn_name): #negation
376    
377            return applyToM(exp, fn_negation)
378        elif(op_jacob==fn_name): #jacob
379            return fn_jacob(fld)
380        else:
381            raise Exception("unsupported unary operator:"+ fn_name.name)
382    
383  def applyToExp_U_T3(fn_name, fld):  def applyToExp_U_T3(fn_name, fld):
384      exp = field.get_data(fld)      exp = field.get_data(fld)
385      if(op_probe==fn_name): #probing      if(op_probe==fn_name): #probing
386          return exp          return exp
387      elif(op_negation==fn_name): #negation      elif(op_negation==fn_name): #negation
388          return applyToVector(exp, fn_negation)  
389            return applyToT3(exp, fn_negation)
390      elif(op_jacob==fn_name): #jacob      elif(op_jacob==fn_name): #jacob
391          return fn_jacob(fld)          return fn_jacob(fld)
392      else:      else:
# Line 389  Line 453 
453          return applyToExp_U_S(fn_name, fld)          return applyToExp_U_S(fn_name, fld)
454      elif(field.is_Vector(fld)): # input is a vector field      elif(field.is_Vector(fld)): # input is a vector field
455          return applyToExp_U_V(fn_name, fld)          return applyToExp_U_V(fn_name, fld)
456        elif(field.is_Matrix(fld)): # input is a vector field
457            return applyToExp_U_M(fn_name, fld)
458      else:      else:
459          return applyToExp_U_T3(fn_name, fld)          return applyToExp_U_T3(fn_name, fld)
460    
461  def binary(e):  def binary(e):
462      (f, g) =apply.get_binary(e)      (f, g) =apply.get_binary(e)
463        #print "binary- f: ",str(field.get_data(f)), " g: ",str(field.get_data(g))
464      if (field.is_Scalar(f) and field.is_Scalar(g)): # input is a scalar field      if (field.is_Scalar(f) and field.is_Scalar(g)): # input is a scalar field
465          return applyToExp_B_S(e)          return applyToExp_B_S(e)
466      elif (field.is_Vector(f)):# input is a vector field      elif (field.is_Vector(f)):# input is a vector field
# Line 405  Line 472 
472           return applyToExp_B_uneven(e)           return applyToExp_B_uneven(e)
473    
474  def applyUnaryOnce(oexp_inner,app_inner,app_outer):  def applyUnaryOnce(oexp_inner,app_inner,app_outer):
475        print "applyUnaryOnce"
476      #apply.toStr(app_inner)      #apply.toStr(app_inner)
477      oty_inner = apply.get_oty(app_inner)      oty_inner = apply.get_oty(app_inner)
478      oty_outer = apply.get_oty(app_outer)      oty_outer = apply.get_oty(app_outer)
479      opr_outer = app_outer.opr      opr_outer = app_outer.opr
480        #print "oexp_inner",oexp_inner,"opr_outer",opr_outer.name
481      lhs_tmp = field(true, "tmp", oty_inner, "", oexp_inner, "")      lhs_tmp = field(true, "tmp", oty_inner, "", oexp_inner, "")
482      app_tmp = apply("tmp", opr_outer, lhs_tmp, None, oty_outer, true)      app_tmp = apply("tmp", opr_outer, lhs_tmp, None, oty_outer, true, true)
483      oexp_tmp =unary(app_tmp)      oexp_tmp =unary(app_tmp)
484        #print " oexp_tmp", oexp_tmp
485        return (oty_outer, oexp_tmp)
486    
487    def applyBinaryOnce(oexp_inner,app_inner,app_outer,rhs):
488        oty_inner = apply.get_oty(app_inner)
489        oty_outer = apply.get_oty(app_outer)
490        opr_outer = app_outer.opr
491    
492        lhs_tmp = field(true, "tmp", oty_inner, "", oexp_inner, "")
493    
494        app_tmp = apply("tmp", opr_outer, lhs_tmp, rhs, oty_outer, true,true)
495        oexp_tmp =binary(app_tmp)
496      return (oty_outer, oexp_tmp)      return (oty_outer, oexp_tmp)
497    
498    
# Line 419  Line 500 
500  def sort(e):  def sort(e):
501      #apply.toStr(e)      #apply.toStr(e)
502      arity = apply.get_arity(e)      arity = apply.get_arity(e)
503      if(e.isroot): # is root      if(e.isrootlhs): # is root
504          #print "sort is a root"          #print "sort is a root"
505          oty = apply.get_oty(e)          oty = apply.get_oty(e)
506          if (arity ==1):          if (arity ==1):
# Line 431  Line 512 
512      else:      else:
513          app_outer = e          app_outer = e
514          arity_outer = arity          arity_outer = arity
515          #print "not a root"          #print "app_outer",app_outer.opr.name
516          if (arity_outer==1):  #assuming both arity          if (arity_outer==1):  #assuming both arity
517              app_inner = apply.get_unary(app_outer)              app_inner = apply.get_unary(app_outer)
518                #print "outer(1) app_inner:",app_inner.opr.name
519              arity_inner=  app_inner.opr.arity              arity_inner=  app_inner.opr.arity
520              if (arity_inner==1):              if (arity_inner==1):
521                  oexp_inner = unary(app_inner)                  oexp_inner = unary(app_inner)
522    
523                  (oty_outer, oexp_tmp) =  applyUnaryOnce(oexp_inner ,app_inner, app_outer)                  (oty_outer, oexp_tmp) =  applyUnaryOnce(oexp_inner ,app_inner, app_outer)
524    
525                  return (oty_outer, oexp_tmp)                  return (oty_outer, oexp_tmp)
526              elif(arity_inner==2):              elif(arity_inner==2):
527                  oexp_inner = binary(app_inner)                  oexp_inner = binary(app_inner)
528                  (oty_outer, oexp_tmp) =  applyUnaryOnce(oexp_inner ,app_inner, app_outer)                  (oty_outer, oexp_tmp) =  applyUnaryOnce(oexp_inner ,app_inner, app_outer)
529    
530                    return (oty_outer, oexp_tmp)
531                else:
532                    raise Exception ("arity is not supported: "+str(arity_outer))
533            elif (arity_outer==2):
534                (app_inner, G) = apply.get_binary(app_outer)
535                arity_inner=  app_inner.opr.arity
536                #print "outer(2) app_inner",app_inner.opr.name
537                if (arity_inner==1):
538                    oexp_inner = unary(app_inner)
539                    rhs = G
540                    (oty_outer, oexp_tmp) =  applyBinaryOnce(oexp_inner, app_inner, app_outer, rhs)
541                    return (oty_outer, oexp_tmp)
542                elif(arity_inner==2):
543                    oexp_inner = binary(app_inner)
544                    #print "applying binary frst time", oexp_inner
545                    rhs = G
546                    (oty_outer, oexp_tmp) =  applyBinaryOnce(oexp_inner, app_inner, app_outer, rhs)
547                    #print "applying binary second time",  oexp_tmp
548                  return (oty_outer, oexp_tmp)                  return (oty_outer, oexp_tmp)
549              else:              else:
550                  raise Exception ("arity is not supported: "+str(arity_outer))                  raise Exception ("arity is not supported: "+str(arity_outer))
# Line 472  Line 575 
575      return rtn      return rtn
576    
577  #evaluate vector field [exp,exp]  #evaluate vector field [exp,exp]
578    def eval_mat_d2(pos0, pos1, mat):
579        #print "eval_vec_d2 vec:",vec
580        rtn = []
581        print "eval_mat_d2 mat",mat
582        for i in mat:
583            for v in i:
584                rtn.append(eval_d2(pos0, pos1, v))
585        return rtn
586    
587    def eval_ten3_d2(pos0, pos1, ten3):
588        #print "eval_vec_d2 vec:",vec
589        rtn = []
590        for i in ten3:
591            for j in i:
592                for v in j:
593                    rtn.append(eval_d2(pos0, pos1, v))
594        return rtn
595    
596    
597    
598    #evaluate vector field [exp,exp]
599  def eval_vec_d3(pos0, pos1, pos2, vec):  def eval_vec_d3(pos0, pos1, pos2, vec):
600      rtn = []      rtn = []
601      for v in vec:      for v in vec:
# Line 479  Line 603 
603      return rtn      return rtn
604    
605    
606    #evaluate vector field [exp,exp]
607    def eval_mat_d3(pos0, pos1, pos2, mat):
608        #print "eval_vec_d2 vec:",vec
609        rtn = []
610        for i in mat:
611            for v in i:
612                rtn.append(eval_d3(pos0, pos1, pos2, v))
613        return rtn
614    
615    def eval_ten3_d3(pos0, pos1, pos2,ten3):
616        rtn = []
617        for i in ten3:
618            for j in i:
619                for v in j:
620                    rtn.append(eval_d3(pos0, pos1, pos2, v))
621        return rtn
622    
623    
624  def iter_d2(k, pos, exp):  def iter_d2(k, pos, exp):
625      corr = []      corr = []
626      #print "iter expr:", exp      #print "iter expr:", exp
# Line 505  Line 647 
647    
648  def probeField(otyp1,pos, ortn):  def probeField(otyp1,pos, ortn):
649      dim = fty.get_dim(otyp1)      dim = fty.get_dim(otyp1)
650        #print "output type"+otyp1.name
651      if (dim==2):      if (dim==2):
652          def get_k():          def get_k():
653              if (fty.is_ScalarField(otyp1)): # output is a scalar field              if (fty.is_ScalarField(otyp1)): # output is a scalar field
654                  return eval_d2                  return eval_d2
655              else:              elif (fty.is_VectorField(otyp1)):
656                  return eval_vec_d2                  return eval_vec_d2
657                elif (fty.is_Matrix(otyp1)):
658                    return eval_mat_d2
659                elif(fty.is_Ten3(otyp1)):
660                    return eval_ten3_d2
661                else:
662                    raise "error"+otyp1.name
663          return iter_d2(get_k(), pos, ortn)          return iter_d2(get_k(), pos, ortn)
664      elif (dim==3):      elif (dim==3):
665          def get_k():          def get_k():
666              if (fty.is_ScalarField(otyp1)): # output is a scalar field              if (fty.is_ScalarField(otyp1)): # output is a scalar field
667                  return eval_d3                  return eval_d3
668              else:              elif (fty.is_VectorField(otyp1)):
669                  return eval_vec_d3                  return eval_vec_d3
670                elif (fty.is_Matrix(otyp1)):
671                    return eval_mat_d3
672                elif(fty.is_Ten3(otyp1)):
673                    return eval_ten3_d3
674                else:
675                    raise "error"+otyp1.name
676          return iter_d3(get_k(), pos, ortn)          return iter_d3(get_k(), pos, ortn)
677      else:      else:
678          raise "unsupported dimension"          raise "unsupported dimension"
# Line 526  Line 681 
681    
682  # operators with scalar field and vector field  # operators with scalar field and vector field
683  def eval(app, pos):  def eval(app, pos):
684        #print "evalname",app.name
685      # print "inside eval exp:", field.toStr(app.exp[0])      # print "inside eval exp:", field.toStr(app.exp[0])
686      #apply.toStr(app)      #apply.toStr(app)
687      (otyp1, ortn) = sort(app) #apply operations to expressions      (otyp1, ortn) = sort(app) #apply operations to expressions

Legend:
Removed from v.3939  
changed lines
  Added in v.3946

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