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

SCM Repository

[diderot] Annotation of /branches/charisee/src/compiler/mid-to-low/check-ein.sml
ViewVC logotype

Annotation of /branches/charisee/src/compiler/mid-to-low/check-ein.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2615 - (view) (download)

1 : cchiw 2611 (* See if this is properly formed EIN Operator*)
2 :     structure checkEin = struct
3 :     local
4 :     structure E = Ein
5 :     structure P=Printer
6 :    
7 :     in
8 :    
9 :     fun insert (key, value) d =fn s =>
10 :     if s = key then SOME value
11 :     else d s
12 :    
13 :     fun lookup k d = d k
14 :     val empty =fn key =>NONE
15 :    
16 :     fun err str=raise Fail str
17 :    
18 :     fun checkEIN e=let
19 :    
20 :     val Ein.EIN{params=params, index=index, body=body}=e
21 :    
22 :     val size=length(index)
23 :    
24 :     fun mkMapp(0,mapp)=mapp
25 :     | mkMapp(n,mapp)=let
26 :     val dict=insert(n-1, 0) mapp
27 :     in mkMapp(n-1,dict) end
28 :    
29 :    
30 :     val mapp=mkMapp(size,empty)
31 :    
32 :     fun mkSumMapp([],mapp)=mapp
33 : cchiw 2615 | mkSumMapp(e1::ns,mapp)=(case e1
34 :     of (E.V n,_,_)=>let
35 :     val dict=insert(n, 0) mapp
36 :     in mkSumMapp(ns,dict) end
37 :     | _ =>raise Fail"non-variable index in summation")
38 : cchiw 2611
39 :    
40 :     fun checkIndex([],dict)=dict
41 :     | checkIndex(E.C _::es,dict)=checkIndex(es,dict)
42 :     | checkIndex(E.V v::es,dict) = (case lookup v dict
43 :     of SOME s=> let
44 :     val d'=insert(v, s+1) dict
45 :     in checkIndex(es,d')
46 :     end
47 :     | NONE => err(String.concat["\n Poorly written EIN Operator: Unknown Index ",Int.toString(v),":\n--",P.printerE(e),"\n"])
48 :     (*end case*))
49 :    
50 :    
51 :     fun checkKrnIndex([],dict)=dict
52 :     | checkKrnIndex(E.C _::es,dict)=checkKrnIndex(es,dict)
53 :     | checkKrnIndex(E.V v::es,dict) = (case lookup v dict
54 :     of SOME s=> let
55 :     val d'=insert(v, 2) dict
56 :     in checkKrnIndex(es,d')
57 :     end
58 :    
59 :     | NONE => err(String.concat["\n Poorly written EIN Operator: Unknown Index ",Int.toString(v),":\n--",P.printerE(e),"\n"])
60 :     (*end case*))
61 :    
62 :    
63 :    
64 :     fun checkSumIndex([],dict)=dict
65 :     | checkSumIndex((E.C _,_,_)::es,dict)=checkSumIndex(es,dict)
66 :     | checkSumIndex((E.V v,_,_)::es,dict) = (case lookup v dict
67 :     of SOME 2=> checkSumIndex(es,dict)
68 :     | SOME c =>err(String.concat["\n Poorly written EIN Operator: Doesn't have two summation indices ",Int.toString(v),":\n--", "Just this many", Int.toString(c),P.printerE(e),"\n"])
69 :     | _ => err(String.concat["\n Poorly written EIN Operator: Doesn't have two summation indices ",Int.toString(v),":\n--",P.printerE(e),"\n"])
70 :     (*end case*))
71 :    
72 :    
73 :     fun checkEin(body,mapp)=let
74 :    
75 :     fun add([],dict)=dict
76 :     | add(e1::es,dict)=let
77 :     val dict'=checkEin(e1, dict)
78 :     in
79 :     add(es, dict')
80 :     end
81 :    
82 :     in (case body
83 :     of E.Tensor(id, ix) => checkIndex(ix,mapp)
84 :     | E.Neg e => checkEin(e,mapp)
85 :     | E.Add e => add(e,mapp)
86 :     | E.Prod e => add(e,mapp)
87 :     | E.Sub (e1,e2) => add([e1,e2],mapp)
88 :     | E.Div(e1,e2) => add([e1,e2],mapp)
89 :     | E.Img(_,alpha,pos) => let
90 :     val d'=checkIndex(alpha,mapp)
91 :     in
92 :     add(pos,d')
93 :     end
94 :    
95 :     | E.Krn(_,delta,pos) => let
96 :     val dels=List.map (fn(_, e)=>e) delta
97 :     val mapp'=checkKrnIndex(dels, mapp)
98 :     in checkEin(pos,mapp')
99 :     end
100 :     | E.Const _ => mapp
101 :     | E.Delta ( i, j) => checkIndex([i, j], mapp)
102 :     | E.Epsilon(i,j,k) => checkIndex([E.V i, E.V j, E.V k], mapp)
103 :     | E.Value v => checkIndex([E.V v], mapp)
104 :     | E.Sum(sx,e) => let
105 :     val dict=mkSumMapp(sx,mapp)
106 :     val d'=checkEin(e,dict)
107 :     in
108 :     checkSumIndex(sx,d')
109 :     end
110 :     | E.Conv _ => raise Fail "Conv- Should have been expanded"
111 :     | E.Field _ => raise Fail "Field- Should have been expanded"
112 :     | E.Partial _ => raise Fail "Partial- Should have been expanded"
113 :     | E.Apply _ => raise Fail "Apply- Should have been expanded"
114 :     | E.Lift _ => raise Fail "Lift- Should have been expanded"
115 :     | E.Probe(e,x) => raise Fail "Probe- Should have been expanded"
116 :     (*end case*))
117 :     end
118 :    
119 :    
120 :     val newMapp=checkEin(body,mapp)
121 :    
122 :    
123 :     fun checkMapp 0= 1
124 :     | checkMapp n=let
125 :     val n'=n-1
126 :     in (case (lookup n' newMapp)
127 :     of NONE => raise Fail("Did not find Outer Index"^Int.toString(n))
128 :     | SOME _ =>checkMapp n'
129 :     (*end case*))
130 :     end
131 :    
132 :    
133 :     in
134 :     checkMapp size
135 :     end
136 :    
137 :     end (* local *)
138 :    
139 :     end

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