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

SCM Repository

[diderot] Annotation of /branches/charisee/src/compiler/high-il/app-ein.sml
ViewVC logotype

Annotation of /branches/charisee/src/compiler/high-il/app-ein.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2605 - (view) (download)

1 : cchiw 2507 (* examples.sml
2 :     *
3 :     * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     * All rights reserved.
5 :     *)
6 :    
7 :     structure App = struct
8 :    
9 :     local
10 :    
11 :     structure E = Ein
12 :     structure P = Printer
13 :     in
14 :    
15 :     fun insert (key, value) d =fn s =>
16 : cchiw 2510 if s = key then SOME value
17 :     else d s
18 : cchiw 2507
19 :     fun lookup k d = d k
20 :     val empty =fn key =>NONE
21 :    
22 : cchiw 2605 fun mapId(i ,dict,shift)=(case (lookup i dict)
23 :     of NONE =>i+shift
24 :     | SOME(j)=>j
25 : cchiw 2507 (*end case*))
26 :    
27 : cchiw 2605 fun mapIndex(v ,dict,shift)= (case (lookup v dict)
28 :     of NONE =>let val E.V(i)=v in E.V(i+shift) end
29 : cchiw 2508 | SOME(j)=>j
30 : cchiw 2605 (*end case*))
31 : cchiw 2507
32 : cchiw 2605 fun mapId2(i ,dict,shift)= (case (lookup i dict)
33 :     of NONE =>(print "Err out of range";i+shift)
34 :     | SOME(j)=>j
35 :     (*end case*))
36 : cchiw 2508
37 : cchiw 2605 fun rewriteSubst(e,subId,mx,paramShift,sumShift)=let
38 :    
39 :     fun insertIndex([],_,dict,shift)=(dict,shift)
40 :     | insertIndex(e1::es, n,dict,_)=(case e1
41 :     of E.V e=> insertIndex(es, n+1, insert(E.V n ,E.V e) dict,e-n)
42 :     | E.C e => insertIndex(es, n+1, insert(E.V n ,E.C e) dict,e-n)
43 : cchiw 2515 (*end case*))
44 : cchiw 2507
45 :     val (subMu,shift)=insertIndex(mx,0,empty,0)
46 :     val shift'=Int.max(sumShift, shift)
47 : cchiw 2508 fun mapMu(E.V i)= mapIndex((E.V i), subMu, shift')
48 :     | mapMu c = c
49 : cchiw 2507 fun mapAlpha mx=List.map mapMu mx
50 : cchiw 2508 fun mapSingle(i)=let val E.V v=mapIndex(E.V i,subMu, shift')
51 :     in v end
52 : cchiw 2507 fun mapSum []=[]
53 :     | mapSum ((a,b,c)::e)=[((mapMu a),b,c)]@mapSum(e)
54 : cchiw 2508 fun mapParam(id)= mapId2(id, subId, 0)
55 : cchiw 2507 fun apply e=(case e
56 : cchiw 2605 of Ein.Const _ => e
57 :     | Ein.Value _ => raise Fail "expression before expand"
58 :     | Ein.Krn _ => raise Fail "expression before expand"
59 :     | Ein.Img _ => raise Fail "expression before expand"
60 :     | Ein.Tensor(id, mx) => Ein.Tensor(mapParam id,mapAlpha mx)
61 :     | Ein.Field(id, mx) => Ein.Field(mapParam id,mapAlpha mx)
62 :     | Ein.Delta (i,j) => Ein.Delta(mapMu i,mapMu j)
63 :     | Ein.Epsilon(i, j, k) => Ein.Epsilon(mapSingle i, mapSingle j, mapSingle k)
64 :     | Ein.Sum(c,esum) => Ein.Sum(mapSum c, apply esum)
65 :     | Ein.Neg e => Ein.Neg(apply e)
66 :     | Ein.Lift e => Ein.Lift(apply e)
67 :     | Ein.Add es => Ein.Add(List.map apply es)
68 :     | Ein.Sub(e1, e2) => Ein.Sub(apply e1, apply e2)
69 :     | Ein.Prod es => Ein.Prod(List.map apply es)
70 :     | Ein.Div(e1, e2) => Ein.Div(apply e1, apply e2)
71 :     | Ein.Partial mx => E.Partial (mapAlpha mx)
72 :     | Ein.Apply(e1, e2) => Ein.Apply(apply e1, apply e2)
73 :     | Ein.Conv (v,mx,h,ux) => Ein.Conv(mapParam v, mapAlpha mx, mapParam h, mapAlpha ux)
74 :     | Ein.Probe(f, pos) => Ein.Probe(apply f, apply pos)
75 : cchiw 2507 (*end case*))
76 :     in apply e end
77 :    
78 :    
79 :    
80 :    
81 :     (*params subst*)
82 :     fun rewriteParams(params, params2, place)=let
83 :     val beg=List.take(params,place)
84 :     val next=List.drop(params,place+1)
85 :     val params'=beg@params2@next
86 :     val n= length(params)
87 :     val n2=length(params2)
88 :     val nbeg=length(beg)
89 :     val nnext=length(next)
90 :    
91 :     fun createDict(0,shift1, shift2,dict)= dict
92 : cchiw 2515 | createDict(n,shift1, shift2,dict)=createDict(n-1,shift1,shift2, insert(n+shift1,n+shift2) dict)
93 : cchiw 2507
94 :     val origId=createDict(nnext,place,place+n2-1,empty)
95 :     val subId=createDict(n2,~1,place-1,empty)
96 : cchiw 2605 in (params',origId,subId,nbeg) end
97 : cchiw 2507
98 :    
99 :     fun splitEin(Ein.EIN{params, index, body})=(params,index,body)
100 :    
101 :     (*Looks for params id that match substitution*)
102 :     fun app(Ein.EIN{params, index, body},place,e2)=let
103 :    
104 : cchiw 2515 val changed = ref 0
105 :    
106 : cchiw 2507 val (params2,index2,body2)=splitEin(e2)
107 :     val (params',origId,substId,paramShift)=rewriteParams(params,params2,place)
108 :     val err="Wrong size for Subst"
109 :    
110 :     val sumIndex=ref (length index)
111 :     fun rewrite(id,mx ,e)=let
112 :     val ref x=sumIndex
113 :     in
114 :     if(id=place) then
115 : cchiw 2515 if(length(mx)=length(index2)) then
116 :     (changed:=1; rewriteSubst(body2,substId,mx,paramShift,x))
117 : cchiw 2553 else ( raise Fail(err);E.Const 0)
118 : cchiw 2507 else (case e
119 :     of E.Tensor(id,mx)=>E.Tensor(mapId(id,origId,0), mx)
120 :     | E.Field(id,mx)=> E.Field(mapId(id,origId,0), mx)
121 : cchiw 2605 | _ => raise Fail"Id error:Term to be replaced is not a Tensor or Fields"
122 : cchiw 2507 (*end case*))
123 :     end
124 :     fun sumI(e)=let
125 :     val (E.V v,_,_)=List.nth(e, length(e)-1)
126 :     in v end
127 :    
128 :     fun apply e=(case e
129 : cchiw 2605 of Ein.Value _ => raise Fail "expression before expand"
130 :     | Ein.Krn _ => raise Fail "expression before expand"
131 :     | Ein.Img _ => raise Fail "expression before expand"
132 :     | Ein.Const _ => e
133 :     | Ein.Delta _ => e
134 :     | Ein.Epsilon(i, j, k) => e
135 :     | Ein.Partial mx => e
136 :     | Ein.Tensor(id, mx) => rewrite (id,mx,e)
137 :     | Ein.Field(id, mx) => rewrite (id,mx,e)
138 :     | Ein.Sum(c,esum) => (sumIndex:=sumI(c); Ein.Sum(c, apply esum))
139 :     | Ein.Lift e => Ein.Lift(apply e)
140 :     | Ein.Neg e => Ein.Neg(apply e)
141 :     | Ein.Add es => Ein.Add(List.map apply es)
142 :     | Ein.Sub(e1, e2) => Ein.Sub(apply e1, apply e2)
143 :     | Ein.Prod es => Ein.Prod(List.map apply es)
144 :     | Ein.Div(e1, e2) => Ein.Div(apply e1, apply e2)
145 :     | Ein.Apply(e1, e2) => Ein.Apply(apply e1, apply e2)
146 :     | Ein.Conv (v,mx,h,ux) => Ein.Conv(mapId(v, origId,0), mx, mapId(h,origId,0), ux)
147 :     | Ein.Probe(f, pos) => Ein.Probe(apply f, apply pos)
148 :    
149 : cchiw 2507 (*end case*))
150 :     val body''=apply body
151 : cchiw 2515 val ref g=changed
152 : cchiw 2507 in
153 : cchiw 2515 ( g,Ein.EIN{params=params', index=index, body=body''})
154 : cchiw 2507 end
155 :    
156 :    
157 :     end; (* local *)
158 :    
159 :     end (* local *)

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