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

SCM Repository

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

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

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

revision 2608, Fri May 2 18:04:54 2014 UTC revision 2611, Mon May 5 21:21:12 2014 UTC
# 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                    | (0,_,_,_,[])   =>  body
230                  val ref x=sumIndex                  | (0,_,_,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                    | (0,_,_,_,_)=>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.2611

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