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 2515, Mon Dec 2 03:42:14 2013 UTC revision 2576, Wed Apr 2 04:36:30 2014 UTC
# Line 14  Line 14 
14      | mkAdd(e)=let      | mkAdd(e)=let
15      fun flatten((i, (E.Add l)::l'))= flatten(1,l@l')      fun flatten((i, (E.Add l)::l'))= flatten(1,l@l')
16          |flatten(i,((E.Const c):: l'))=          |flatten(i,((E.Const c):: l'))=
17              if (c>0.0 orelse c<0.0) then let              if (c>0 orelse c<0) then let
18                      val(b,a)=flatten(i,l') in (b,[E.Const c]@a) end                      val(b,a)=flatten(i,l') in (b,[E.Const c]@a) end
19              else flatten(1,l')              else flatten(1,l')
20          | flatten(i,[])=(i,[])          | flatten(i,[])=(i,[])
# Line 23  Line 23 
23    
24       val (b,a)=flatten(0,e)       val (b,a)=flatten(0,e)
25      in case a      in case a
26       of [] => (1,E.Const(1.0))       of [] => (1,E.Const(1))
27                  | [e] => (1,e)                  | [e] => (1,e)
28                  | es => (b,E.Add es)                  | es => (b,E.Add es)
29                  (* end case *)                  (* end case *)
# Line 34  Line 34 
34      | mkProd(e)=let      | mkProd(e)=let
35      fun flatten(i,((E.Prod l)::l'))= flatten(1,l@l')      fun flatten(i,((E.Prod l)::l'))= flatten(1,l@l')
36          |flatten(i,((E.Const c)::l'))=          |flatten(i,((E.Const c)::l'))=
37                  if(c>0.0 orelse  0.0>c) then (3,[E.Const 0.0])                  if(c>0 orelse  0>c) then (3,[E.Const 0])
38                  else flatten(i,l')                  else flatten(i,l')
39           | flatten(i,[])=(i,[])           | flatten(i,[])=(i,[])
40           | flatten (i,e::l') =  let val(a,b)=flatten(i,l') in (a,[e]@b) end           | flatten (i,e::l') =  let val(a,b)=flatten(i,l') in (a,[e]@b) end
41       val (change,a)=flatten(0,e)       val (change,a)=flatten(0,e)
42       in if(change=3) then (1,E.Const(0.0))       in if(change=3) then (1,E.Const(0))
43          else case a          else case a
44          of [] => (1,E.Const(0.0))          of [] => (1,E.Const(0))
45          | [e] => (1,e)          | [e] => (1,e)
46          | es => (change, E.Prod es)          | es => (change, E.Prod es)
47          (* end case *)          (* end case *)
# Line 194  Line 194 
194    
195  (*Apply*)  (*Apply*)
196  fun mkApply(E.Apply(E.Partial d,e))=(case e  fun mkApply(E.Apply(E.Partial d,e))=(case e
197      of E.Tensor(a,[])=>(1,E.Const 0.0)      of E.Tensor(a,[])=>(1,E.Const 0)
198      | E.Const _ =>(1,E.Const 0.0)      | E.Const _ =>(1,E.Const 0)
199      | E.Delta _ =>(1,E.Const 0.0)      | E.Delta _ =>(1,E.Const 0)
200      | E.Value _ =>(1,E.Const 0.0)      | E.Value _ =>(1,E.Const 0)
201      | E.Epsilon _ =>(1,E.Const 0.0)      | E.Epsilon _ =>(1,E.Const 0)
202      | E.Conv (fid,alpha,tid, delta)=> (1, E.Conv(fid,alpha, tid, delta@d))      | E.Conv (fid,alpha,tid, delta)=> (1, E.Conv(fid,alpha, tid, delta@d))
203      | E.Add l => (1,E.Add(List.map (fn e => E.Apply(E.Partial d, e)) l))      | E.Add l => (1,E.Add(List.map (fn e => E.Apply(E.Partial d, e)) l))
204      | E.Sub(e2, e3) =>(1, E.Sub(E.Apply(E.Partial d, e2), E.Apply(E.Partial d, e3)))      | E.Sub(e2, e3) =>(1, E.Sub(E.Apply(E.Partial d, e2), E.Apply(E.Partial d, e3)))
# Line 231  Line 231 
231             (*             (*
232    
233  fun epsapply(c,eps,dels,post)=let  fun epsapply(c,eps,dels,post)=let
234      fun  applyEps(change,count,[],[],rest,done)= (print "kkk";(0,E.Const 0.0))      fun  applyEps(change,count,[],[],rest,done)= (print "kkk";(0,E.Const 0))
235          | applyEps(change,count,eps,epsrest,[],done)=(print "yyyy";(0,E.Const 0.0))          | applyEps(change,count,eps,epsrest,[],done)=(print "yyyy";(0,E.Const 0))
236          | applyEps(change,count,[],epsrest,r::rest,done)=(print "bb";applyEps(change,count,epsrest,[],rest,done@[r]))          | applyEps(change,count,[],epsrest,r::rest,done)=(print "bb";applyEps(change,count,epsrest,[],rest,done@[r]))
237          | applyEps(change,count,eps1::eps,epsrest,r::rest,done)=( print "lrr";(case (r,eps1)          | applyEps(change,count,eps1::eps,epsrest,r::rest,done)=( print "lrr";(case (r,eps1)
238              of (E.Sum(c2,E.Prod(E.Epsilon eps2::s2)),_)=> let              of (E.Sum(c2,E.Prod(E.Epsilon eps2::s2)),_)=> let
# Line 248  Line 248 
248                  end                  end
249              | (E.Conv(v,vx, h ,d),E.Epsilon(i,j,k))=> let              | (E.Conv(v,vx, h ,d),E.Epsilon(i,j,k))=> let
250                  val change'= matchEps(0,d,[],[i,j,k])                  val change'= matchEps(0,d,[],[i,j,k])
251                  in (case change' of 1=>  (1,E.Const 0.0)                  in (case change' of 1=>  (1,E.Const 0)
252                      |_=>  applyEps(0,count,epsrest@[eps1],[],rest,done@[r]))                      |_=>  applyEps(0,count,epsrest@[eps1],[],rest,done@[r]))
253                  end                  end
254              |_=>applyEps(0,count,epsrest@[eps1],[],rest,done@[r])              |_=>applyEps(0,count,epsrest@[eps1],[],rest,done@[r])
# Line 266  Line 266 
266    
267    
268                  *)                  *)
269    
270     (*print summation range*)
271                  fun handleIndex e= (case e                  fun handleIndex e= (case e
272                  of E.C(cx)=> String.concat["'",Int.toString(cx),"'"]                  of E.C(cx)=> String.concat["'",Int.toString(cx),"'"]
273                  |  E.V(ix)=> Int.toString(ix)                  |  E.V(ix)=> Int.toString(ix)
274                  )                  )
   
   
   
275  fun handleSumRange (mu,lb,ub)= print(String.concat[(handleIndex mu),"[",Int.toString(lb),"-",Int.toString(ub),"]"])  fun handleSumRange (mu,lb,ub)= print(String.concat[(handleIndex mu),"[",Int.toString(lb),"-",Int.toString(ub),"]"])
   
276                  fun printSx e=(print "\n $";List.map handleSumRange e; print "$")                  fun printSx e=(print "\n $";List.map handleSumRange e; print "$")
277    
278    fun K gg=String.concatWith "," (List.map (fn (E.V e1,_,_)=> (Int.toString(e1))) gg)
279    fun Kt gg=List.map (fn e1=> print(String.concat["[", (K e1),"]"])) gg
280    
281  (*Apply normalize to each term in product list  (*Apply normalize to each term in product list
282  or Apply normalize to tail of each list*)  or Apply normalize to tail of each list*)
283  fun normalize (Ein.EIN{params, index, body}) = let  fun normalize (Ein.EIN{params, index, body}) = let
284         val f= print"IN NORMALIZE"
285        val changed = ref false        val changed = ref false
286        val sumIndex=ref []        val sumIndex=ref []
287    
# Line 294  Line 293 
293                | E.Value _ =>body                | E.Value _ =>body
294                | E.Epsilon _=>body                | E.Epsilon _=>body
295                | E.Conv _=>body                | E.Conv _=>body
296    
297                  | E.Neg(E.Neg e)=> rewriteBody e
298                | E.Neg e => E.Neg(rewriteBody e)                | E.Neg e => E.Neg(rewriteBody e)
299                | E.Add es => let val (change,body')= mkAdd(List.map rewriteBody es)                | E.Add es => let val (change,body')= mkAdd(List.map rewriteBody es)
300                     in if (change=1) then ( changed:=true;body') else body' end                     in if (change=1) then ( changed:=true;body') else body' end
301                | E.Sub(a, E.Field f)=> (changed:=true;E.Add[a, E.Neg(E.Field(f))])                | E.Sub(a, E.Field f)=> (changed:=true;E.Add[a, E.Neg(E.Field(f))])
302                  | E.Sub(E.Sub(a,b),E.Sub(c,d))=> rewriteBody(E.Sub(E.Add[a,d],E.Add[b,c]))
303                  | E.Sub(E.Sub(a,b),e2)=>rewriteBody (E.Sub(a,E.Add[b,e2]))
304                  | E.Sub(e1,E.Sub(c,d))=>rewriteBody(E.Add([E.Sub(e1,c),d]))
305                | E.Sub (a,b)=>  E.Sub(rewriteBody a, rewriteBody b)                | E.Sub (a,b)=>  E.Sub(rewriteBody a, rewriteBody b)
306                  | E.Div(E.Div(a,b),E.Div(c,d))=> rewriteBody (E.Div(E.Prod[a,d],E.Prod[b,c]))
307                  | E.Div(E.Div(a,b),c)=> rewriteBody (E.Div(a, E.Prod[b,c]))
308                  | E.Div(a,E.Div(b,c))=>  rewriteBody (E.Div(E.Prod[a,c],b))
309                | E.Div (a, b) => E.Div(rewriteBody a, rewriteBody b)                | E.Div (a, b) => E.Div(rewriteBody a, rewriteBody b)
310                | E.Partial _=>body                | E.Partial _=>body
311                | E.Krn(tid,deltas,pos)=> E.Krn(tid,deltas, (rewriteBody pos))                | E.Krn(tid,deltas,pos)=> E.Krn(tid,deltas, (rewriteBody pos))
# Line 330  Line 337 
337                | 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
338                   val change= matchEps(0,d,[],[i,j,k])                   val change= matchEps(0,d,[],[i,j,k])
339                   in case (change,es)                   in case (change,es)
340                  of (1,_) =>(changed:=true; E.Const 0.0)                  of (1,_) =>(changed:=true; E.Const 0)
341                      | (_,[]) =>E.Prod[E.Epsilon(i,j,k),rewriteBody (E.Apply(E.Partial d,e))]                      | (_,[]) =>E.Prod[E.Epsilon(i,j,k),rewriteBody (E.Apply(E.Partial d,e))]
342                      |(_,_)=> let                      |(_,_)=> let
343                          val a=rewriteBody(E.Prod([E.Apply(E.Partial d,e)]@ es))                          val a=rewriteBody(E.Prod([E.Apply(E.Partial d,e)]@ es))
# Line 341  Line 348 
348    
349                  val change= matchEps(0,d,[],[i,j,k])                  val change= matchEps(0,d,[],[i,j,k])
350                  in case (change,es)                  in case (change,es)
351                      of (1,_) =>(changed:=true; E.Const 0.0)                      of (1,_) =>(changed:=true; E.Const 0)
352                      | (_,[]) =>E.Prod[E.Epsilon(i,j,k),E.Conv(V,alpha, h, d)]                      | (_,[]) =>E.Prod[E.Epsilon(i,j,k),E.Conv(V,alpha, h, d)]
353                      | (_,_) =>let                      | (_,_) =>let
354                          val a=rewriteBody(E.Prod([E.Conv(V,alpha, h, d)]@ es))                          val a=rewriteBody(E.Prod([E.Conv(V,alpha, h, d)]@ es))
# Line 351  Line 358 
358    
359    
360                | 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])]=>
361                      if(e2=i1 andalso e3=i2) then (changed :=true;E.Const(0.0))                      if(e2=i1 andalso e3=i2) then (changed :=true;E.Const(0))
362                      else body                      else body
363    
364    
# Line 372  Line 379 
379                   end                   end
380              | E.Prod(E.Sum(c1,E.Prod(E.Epsilon e1::es1))::E.Sum(c2,E.Prod(E.Epsilon e2::es2))::es)=>let              | E.Prod(E.Sum(c1,E.Prod(E.Epsilon e1::es1))::E.Sum(c2,E.Prod(E.Epsilon e2::es2))::es)=>let
381                  val ref x=sumIndex                  val ref x=sumIndex
382                    val y=print "in here, intial sum \n "
383    
384                    val m= Kt x
385    
386                  val c'= [c1@c2]@x                  val c'= [c1@c2]@x
387                  val (i,s',e,rest)=epsToDels(c', E.Prod([E.Epsilon e1, E.Epsilon e2]@es1@es2@es))                  val (i,s',e,rest)=epsToDels(c', E.Prod([E.Epsilon e1, E.Epsilon e2]@es1@es2@es))
388                    val mmmm=print "\n changed to \n "
389                    val gsg=Kt s'
390    
391                    val ui=print "\n POst getting index"
392                  in (case (i, e,rest)                  in (case (i, e,rest)
393                      of (1,[e1],_)=> (changed:=true;sumIndex:=s';e1)                      of (1,[e1],_)=> (changed:=true;sumIndex:=s';let
394                            val ss=List.nth(s',((length s')-2))
395                            in
396                                E.Sum(ss,e1) end )
397                      | _=>let                      | _=>let
398                          val eA=rewriteBody(E.Sum(c1,E.Prod(E.Epsilon e1::es1)))                          val eA=rewriteBody(E.Sum(c1,E.Prod(E.Epsilon e1::es1)))
399                          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))
# Line 443  Line 461 
461                | E.Sum(c, E.Prod(E.Const e::es))=>(changed:=true;E.Prod[E.Const e,E.Sum(c, E.Prod es)])                | E.Sum(c, E.Prod(E.Const e::es))=>(changed:=true;E.Prod[E.Const e,E.Sum(c, E.Prod es)])
462                | E.Sum(c, E.Prod(E.Value v::es))=>(changed:=true; E.Prod [E.Value v, E.Sum(c, E.Prod es)])                | E.Sum(c, E.Prod(E.Value v::es))=>(changed:=true; E.Prod [E.Value v, E.Sum(c, E.Prod es)])
463                | E.Sum(c, E.Prod(E.Tensor(id,[])::es))=> (changed:=true;E.Prod [E.Tensor(id,[]), E.Sum(c, E.Prod es)])                | E.Sum(c, E.Prod(E.Tensor(id,[])::es))=> (changed:=true;E.Prod [E.Tensor(id,[]), E.Sum(c, E.Prod es)])
             (*  
   
              | E.Sum(c,E.Prod ps')=>let  
                 val e'=rewriteBody(E.Prod ps')  
   
                 in (case e'  
                     of E.Prod ps=> let  
                         val (pre,eps,dels,post)=filter2(ps,[],[],[],[])  
                         in (case eps  
                             of []=> E.Sum(c,rewriteBody (E.Prod ps'))  
                             |_=> let  
                                 val (change, exp)=epsapply(c,eps,dels,post)  
                                 val z=(print "SS=";print(Int.toString(change));print "---")  
                                 in (case change  
                                     of 1 => (changed:=true; print"yyy";exp)  
                                     |_=> (print "P";body)  
                                 (*end case*))  
                                 end)  
                         end  
                     |_=> E.Sum(c, e')  
                     (*end case*))  
                 end  
   
                     *)  
   
464                  | E.Sum(c,e)=>let                  | E.Sum(c,e)=>let
465                        val ggg=print "IN SUMM"
466                      val ref x=sumIndex                      val ref x=sumIndex
467                      val c'=[c]@x                      val c'=[c]@x
468                        val AA=print "\n Started"
469                        val A= Kt c'
470                      val e'=(sumIndex:=c';rewriteBody e)                      val e'=(sumIndex:=c';rewriteBody e)
471                      val ref s=sumIndex                      val ref s=sumIndex
472                        val CC=print "\n After call we got this"
473                        val C= Kt s
474                      val z=hd(s)                      val z=hd(s)
475                        val BB=print "\n ENDED-HEAD"
476                        val B= Kt [z]
477                        val DD=print "\n ENDED-TL"
478                        val D=Kt (tl(s))
479                  in (sumIndex:=tl(s);E.Sum(z, e')) end                  in (sumIndex:=tl(s);E.Sum(z, e')) end
480    
481              (*******************Probe*****************)              (*******************Probe*****************)
# Line 491  Line 490 
490                  (changed:=true;E.Div(rewriteBody(E.Probe(a, x)),b))                  (changed:=true;E.Div(rewriteBody(E.Probe(a, x)),b))
491              | E.Probe(E.Prod p, x)=>let              | E.Probe(E.Prod p, x)=>let
492                  val (p',x')= (rewriteBody (E.Prod p), rewriteBody x)                  val (p',x')= (rewriteBody (E.Prod p), rewriteBody x)
493                  fun  probeprod([],rest) =                  fun  probeprod([],[e1]) =e1
494                          (print "err-Did not find field/Conv"; body)                    | probeprod([],rest) = E.Prod rest
495                    | probeprod(E.Const c::es,rest)=                    | probeprod(E.Const c::es,rest)=
496                          (changed:=true;probeprod(es,rest@[E.Const c]))                          (changed:=true;probeprod(es,rest@[E.Const c]))
497                    | probeprod(E.Tensor t::es,rest)=                    | probeprod(E.Tensor t::es,rest)=
# Line 508  Line 507 
507                    | probeprod(E.Partial e::es, rest)=                    | probeprod(E.Partial e::es, rest)=
508                          (changed:=true;probeprod(es, rest@[E.Partial e]))                          (changed:=true;probeprod(es, rest@[E.Partial e]))
509                    | probeprod(E.Field f::es,rest)=                    | probeprod(E.Field f::es,rest)=
510                          (changed:=true;E.Prod(rest@[E.Probe(E.Field f, x')] @es))                          (changed:=true;print "\n $#$ Found Field";probeprod(es,rest@[E.Probe(E.Field f, x')]))
511    
512                          (*  (changed:=true;E.Prod(rest@[E.Probe(E.Field f, x')] @es))*)
513                    | probeprod(E.Conv f::es,rest)=                    | probeprod(E.Conv f::es,rest)=
514                          (changed:=true;E.Prod(rest@[E.Probe(E.Conv f, x')] @es))                              (changed:=true;print "\n $#$ Found Field";probeprod(es,rest@[E.Probe(E.Conv f, x')]))
515    
516                            (*(changed:=true;E.Prod(rest@[E.Probe(E.Conv f, x')] @es))*)
517                    | probeprod(E.Prod p::es , rest)=                    | probeprod(E.Prod p::es , rest)=
518                          (changed:=true;probeprod(p@es,rest))                          (changed:=true;probeprod(p@es,rest))
519                    | probeprod(_,[])=body                    | probeprod(_,[])=body
# Line 538  Line 541 
541              end              end
542    
543      val (b,count) = loop(body,0)      val (b,count) = loop(body,0)
544        val g=print "out of normalize"
545      val j=(print "Final Counter:";print(Int.toString(count));print"\n\n\n")      val j=(print "Final CounterXX:";print(Int.toString(count));print"\n\n\n")
546      in      in
547                  (Ein.EIN{params=params, index=index, body=b},count)                  (Ein.EIN{params=params, index=index, body=b},count)
548      end      end

Legend:
Removed from v.2515  
changed lines
  Added in v.2576

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