Home My Page Projects Code Snippets Project Openings diderot

# SCM Repository

[diderot] Diff of /branches/charisee/src/compiler/high-il/normalize-ein.sml
 [diderot] / branches / charisee / src / compiler / high-il / normalize-ein.sml

# Diff of /branches/charisee/src/compiler/high-il/normalize-ein.sml

revision 2608, Fri May 2 18:04:54 2014 UTC revision 2795, Tue Nov 4 21:58:11 2014 UTC
# Line 61  Line 61
61                          val E.Partial d3=d1                          val E.Partial d3=d1
62                          in (1,E.Conv(v,alpha,h,d2@d3)) end                          in (1,E.Conv(v,alpha,h,d2@d3)) end
63      | E.Field _   => (0,E.Apply(d1,e1))      | E.Field _   => (0,E.Apply(d1,e1))
64      | E.Probe _   => (0,E.Apply(d1,e1))      | E.Probe _   => (0,E.Apply(d1,e1)) (*FIX ME, Should be error actually apply of a tensor result*)
65      | E.Apply(E.Partial d2,e2)  => let      | E.Apply(E.Partial d2,e2)  => let
66                          val E.Partial d3=d1                          val E.Partial d3=d1
67                          in (1,E.Apply(E.Partial(d3@d2),e2)) end                          in (1,E.Apply(E.Partial(d3@d2),e2)) end
# Line 127  Line 127
127
128
129

(*fun K gg=String.concatWith "," (List.map (fn (E.V e1,_,_)=> (Int.toString(e1))) gg)*)
fun K _= " "
fun Kt gg=List.map (fn e1=> print(String.concat["[", (K e1),"]"])) gg

130  (*Apply normalize to each term in product list  (*Apply normalize to each term in product list
131  or Apply normalize to tail of each list*)  or Apply normalize to tail of each list*)
132  fun normalize (Ein.EIN{params, index, body}) = let  fun normalize (Ein.EIN{params, index, body}) = let
(* val _ = print(String.concat["\n IN NORMALIZE@", P.printbody(body),"@\n"])*)
133        val changed = ref false        val changed = ref false
val sumIndex=ref []
134
135        fun rewriteBody body =(case body        fun rewriteBody body =(case body
136              of E.Const _    => body              of E.Const _    => body
# Line 169  Line 162
162
163                  (**************Apply, Sum, Probe**************)                  (**************Apply, Sum, Probe**************)
164              | E.Apply(E.Partial [],e)=> e              | E.Apply(E.Partial [],e)=> e
165              | E.Apply(E.Partial d1, e1)=>let              | E.Apply(E.Partial d1, e1) =>
166                    let
167                  val e2 = rewriteBody e1                  val e2 = rewriteBody e1
168                  val (c,e3)=mkapply(E.Partial d1,e2)                  val (c,e3)=mkapply(E.Partial d1,e2)
169                  in (case c of 1=>(changed:=true;e3)| _ =>e3 (*end case*))                  in (case c of 1=>(changed:=true;e3)| _ =>e3 (*end case*))
# Line 177  Line 171
171              | E.Apply _=> raise Fail" Not well-formed Apply expression"              | E.Apply _=> raise Fail" Not well-formed Apply expression"
172              | E.Sum([],e)=> (changed:=true;rewriteBody e)              | E.Sum([],e)=> (changed:=true;rewriteBody e)
173              | E.Sum(c,e)=>let              | E.Sum(c,e)=>let
174                  val ref x=sumIndex                  val (c,e')=mkSum(c,rewriteBody e)
175                  val c'=[c]@x                  in (case c of 0 => e'|_ => (changed:=true;e'))
val e'=(sumIndex:=c';rewriteBody e)
val ref s=sumIndex
val z=hd(s)
val (cng,e2)=(sumIndex:=tl(s);mkSum(z,e'))
in (case cng
of 1=> (changed:=true;e2)
|_=> e2
(*end case*))
176                  end                  end
177                | E.Probe(u,v)=>  let              | E.Probe(u,v)              =>
178                    let
179                  val (c',b')=mkprobe(rewriteBody u,rewriteBody v)                  val (c',b')=mkprobe(rewriteBody u,rewriteBody v)
180                  in (case c'                  in (case c'
181                      of 1=> (changed:=true;b')                      of 1=> (changed:=true;b')
182                      |_=> b'                      |_=> b'
183                      (*end case*))                      (*end case*))
184                  end                  end

185                  (*************Product**************)                  (*************Product**************)
186                | E.Prod [] => raise Fail"missing elements in product"                | E.Prod [] => raise Fail"missing elements in product"
187                | E.Prod [e1] => rewriteBody e1                | E.Prod [e1] => rewriteBody e1
# Line 210  Line 196
196                  (changed :=true; E.Sub(E.Prod([e1,e2]@e4), E.Prod([e1,e3]@e4 )))                  (changed :=true; E.Sub(E.Prod([e1,e2]@e4), E.Prod([e1,e3]@e4 )))
197
198

199                  (*************Product EPS **************)                  (*************Product EPS **************)
200
201                | E.Prod(E.Epsilon(i,j,k)::E.Apply(E.Partial d,e)::es)=>let                | E.Prod(E.Epsilon(i,j,k)::E.Apply(E.Partial d,e)::es)=>let
# Line 224  Line 209
209                          in b end                          in b end
210                  end                  end
211                | E.Prod(E.Epsilon(i,j,k)::E.Conv(V,alpha, h, d)::es)=>let                | E.Prod(E.Epsilon(i,j,k)::E.Conv(V,alpha, h, d)::es)=>let

212                  val change= G.matchEps(0,d,[],[i,j,k])                  val change= G.matchEps(0,d,[],[i,j,k])
213                  in case (change,es)                  in case (change,es)
214                      of (1,_) =>(changed:=true; E.Const 0)                      of (1,_) =>(changed:=true; E.Const 0)
# Line 235  Line 219
219                          in b end                          in b end
220                  end                  end
221

222                | E.Prod[(E.Epsilon(e1,e2,e3)), E.Tensor(_,[E.V i1,E.V i2])]=>                | E.Prod[(E.Epsilon(e1,e2,e3)), E.Tensor(_,[E.V i1,E.V i2])]=>
223                      if(e2=i1 andalso e3=i2) then (changed :=true;E.Const(0))                      if(e2=i1 andalso e3=i2) then (changed :=true;E.Const(0))
224                      else body                      else body
225
226                | E.Prod(E.Epsilon eps1::ps)=> (case (G.epsToDels(E.Epsilon eps1::ps))
227              | E.Prod(E.Epsilon eps1::ps)=>                  of (1,e,[],_,_)      =>(changed:=true;e)(* Changed to Deltas *)
228                  let                  | (1,e,sx,_,_)      =>(changed:=true;E.Sum(sx,e))(* Changed to Deltas *)
229                    | (_,_,_,_,[])   =>  body
230                  val ref x=sumIndex                  | (_,_,_,epsAll,rest) => let
val (i,s',e,rest)=G.epsToDels(x,body)
in (case (i, e,rest)
of (1,[e1],_) =>(changed:=true;sumIndex:=s';e1)
|(0,eps,[])=>body
| _ => let
231                          val p'=rewriteBody(E.Prod rest)                          val p'=rewriteBody(E.Prod rest)
232                          val p''= (case p' of E.Prod p=>p |e=>[e])                          val(_,b)= F.mkProd(epsAll@[p'])
val(_,b)= F.mkProd (e@p'')
233                          in b end                          in b end
234                          (*end case*))                          (*end case*))
end
| E.Prod(E.Sum(c1,E.Prod(E.Epsilon e1::es1))::E.Sum(c2,E.Prod(E.Epsilon e2::es2))::es)=>let
val ref x=sumIndex

val m= Kt x
235
236                  val c'= [c1@c2]@x              | E.Prod(E.Sum(c1,E.Prod(E.Epsilon e1::es1))::E.Sum(c2,E.Prod(E.Epsilon e2::es2))::es) =>
237                  val (i,s',e,rest)=G.epsToDels(c', E.Prod([E.Epsilon e1, E.Epsilon e2]@es1@es2@es))                  (case G.epsToDels([E.Epsilon e1, E.Epsilon e2]@es1@es2@es)
238                   val gsg=Kt s'                  of (1,e,sx,_,_)=> (changed:=true; E.Sum(c1@c2@sx,e))
239                    | (_,_,_,_,_)=>let

in (case (i, e,rest)
of (1,[e1],_)=> (changed:=true;sumIndex:=s';let
val ss=List.nth(s',((length s')-2))
in
E.Sum(ss,e1) end )
| _=>let
240                          val eA=rewriteBody(E.Sum(c1,E.Prod(E.Epsilon e1::es1)))                          val eA=rewriteBody(E.Sum(c1,E.Prod(E.Epsilon e1::es1)))
241                          val eB=rewriteBody(E.Prod(E.Sum(c2,E.Prod(E.Epsilon e2::es2))::es))                          val eB=rewriteBody(E.Prod(E.Sum(c2,E.Prod(E.Epsilon e2::es2))::es))
242                          val (_,e)=F.mkProd([eA,eB])                          val (_,e)=F.mkProd([eA,eB])
243                          in e                          in e
244                          end                          end
245                      (*end case*))                      (*end case*))
end
246
247              | E.Prod(E.Delta d::es)=>let              | E.Prod(E.Delta d::es)=>let
248                  val (pre',eps, dels,post)= F.filterGreek(E.Delta d::es)                  val (pre',eps, dels,post)= F.filterGreek(E.Delta d::es)
249                  val ref x=sumIndex                  val (change,a)=G.reduceDelta(eps, dels, post)
val (change,i',a)=G.reduceDelta(x, eps, dels, post)

250                  in (case (change,a)                  in (case (change,a)
251                      of (0, _)=> E.Prod [E.Delta d,rewriteBody(E.Prod es)]                      of (0, _)=> E.Prod [E.Delta d,rewriteBody(E.Prod es)]
252                      | (_, E.Prod p)=>let                      | (_, E.Prod p)=>let
253                          val (_, p') = F.mkProd p                          val (_, p') = F.mkProd p
254                          in (changed:=true;sumIndex:=i';p') end                          in (changed:=true;p') end
255                      | _ => (changed:=true;sumIndex:=i';a )                      | _ => (changed:=true;a )
256                      (*end case*))                      (*end case*))
257                      end                      end
258
# Line 317  Line 278
278                          of 1=> (print(String.concat["\nN =>",Int.toString(count),"--",P.printbody(body')]);1)                          of 1=> (print(String.concat["\nN =>",Int.toString(count),"--",P.printbody(body')]);1)
279                          | _=> 1)                          | _=> 1)
280                      in                      in
281                          (changed := false ;sumIndex:=[];loop(body',count+1))                          (changed := false ;loop(body',count+1))
282                      end                      end
283                  else (body',count)                  else (body',count)
284              end              end

Legend:
 Removed from v.2608 changed lines Added in v.2795