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

SCM Repository

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

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

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

revision 2459, Wed Oct 9 19:09:21 2013 UTC revision 2460, Wed Oct 9 19:09:26 2013 UTC
# Line 47  Line 47 
47          (* end case *)          (* end case *)
48           end           end
49    
 (*  
   
 fun mkEps(e)= (case e  
     of E.Apply(E.Partial [E.V a], E.Prod( e2::m ))=> (0,e)  
      | E.Apply(E.Partial [E.V a,E.V b], E.Prod( (E.Epsilon(i,j,k))::m ))=>  
         (if(a=i andalso b=j) then (1,E.Const(0.0))  
         else if(a=i andalso b=k) then (1,E.Const(0.0))  
         else if(a=j andalso b=i) then (1,E.Const(0.0))  
         else if(a=j andalso b=k) then (1,E.Const(0.0))  
         else if(a=k andalso b=j) then (1,E.Const(0.0))  
         else if(a=k andalso b=i) then (1,E.Const(0.0))  
         else (0,e))  
     |_=> (0,e)  
     (*end case*))  
   
   
50    
 fun mkSumApply(E.Sum(c,E.Apply(d, e))) = (case e  
     of E.Tensor(a,[])=> (0,E.Const(0.0))  
     | E.Tensor _=> (0,E.Sum(c,E.Apply(d,e)))  
     | E.Field _ =>(0, E.Sum(c, E.Apply(d,e)))  
     | E.Const _=> (1,E.Const(0.0))  
     | E.Add l => (1,E.Add(List.map (fn e => E.Sum(c,E.Apply(d, e))) l))  
     | E.Sub(e2, e3) =>(1, E.Sub(E.Sum(c,E.Apply(d, e2)), E.Sum(c,E.Apply(d, e3))))  
     | E.Prod((E.Epsilon c)::e2)=> mkEps(E.Apply(d,e))  
     | E.Prod[E.Tensor(a,[]), e2]=>  (1, E.Prod[ E.Tensor(a,[]), E.Sum(c,E.Apply(d, e2))]  )  
     | E.Prod((E.Tensor(a,[]))::e2)=>  (1, E.Prod[E.Tensor(a,[]), E.Sum(c,E.Apply(d, E.Prod e2))] )  
     | E.Prod es =>   (let  
         fun prod [e] = (E.Apply(d, e))  
         | prod(e1::e2)=(let val l= prod(e2) val m= E.Prod[e1,l]  
             val lr=e2 @[E.Apply(d,e1)]   val(b,a) =mkProd lr  
             in ( E.Add[ a, m] ) end)  
         | prod _= (E.Const(1.0))  
             in (1, E.Sum(c,prod es))  end)  
     | _=> (0,E.Sum(c,E.Apply(d,e)))  
     (*end case*))  
   
    *)  
51    
52    
53  fun rmEpsIndex(_,_,[])=[]  fun rmEpsIndex(_,_,[])=[]
# Line 112  Line 75 
75                      E.Sum(s'',E.Prod([E.Delta(E.V s,E.V u), E.Delta(E.V t,E.V v)] @e3)),                      E.Sum(s'',E.Prod([E.Delta(E.V s,E.V u), E.Delta(E.V t,E.V v)] @e3)),
76                      E.Sum(s'',E.Prod([E.Delta(E.V s,E.V v), E.Delta(E.V t,E.V u)]@e3)))                      E.Sum(s'',E.Prod([E.Delta(E.V s,E.V v), E.Delta(E.V t,E.V u)]@e3)))
77    
78              in (case (eps,s')                  in (case (eps,es,s')
79                  of ([],[]) =>(1,deltas)                  of ([],[],[]) =>(1,deltas)
80                  |([],_)=>(1,E.Sum(s',deltas))                  |([],_,[]) =>(1,E.Prod( es@[deltas]))
81                  |(_,[])=>(1,E.Prod(eps@[deltas]))                  |([],[],_)=>(1,E.Sum(s',deltas))
82                  |(_,_) =>(1, E.Sum(s', E.Prod(eps@[deltas])))                  |([],_,_)=>(1,E.Sum(s',E.Prod(es@[deltas])))
83                    |(_,_,[])=>(1,E.Prod(eps@es@[deltas]))
84                    |_ =>(1, E.Sum(s', E.Prod(eps@es@[deltas])))
85                     )                     )
86               end               end
87    
# Line 195  Line 160 
160      | E.Prod(E.Tensor(a,[])::e1::[])=>(1,E.Prod[E.Tensor(a,[]),E.Apply(E.Partial d,E.Sum(c,e1))])      | E.Prod(E.Tensor(a,[])::e1::[])=>(1,E.Prod[E.Tensor(a,[]),E.Apply(E.Partial d,E.Sum(c,e1))])
161    
162      | E.Prod(E.Tensor(a,[])::e2)=>(1,E.Prod[E.Tensor(a,[]),E.Apply(E.Partial d,E.Sum(c,E.Prod e2))])      | E.Prod(E.Tensor(a,[])::e2)=>(1,E.Prod[E.Tensor(a,[]),E.Apply(E.Partial d,E.Sum(c,E.Prod e2))])
163    (*  | E.Prod es=> (let  
164        | E.Prod es=>(let
165          fun prod [e1] =E.Apply(E.Partial d,e1)          fun prod [e1] =E.Apply(E.Partial d,e1)
166            | prod (E.Epsilon eps1::es) = (E.Apply(E.Partial d, E.Prod (E.Epsilon eps1::es)))
167            | prod (E.Delta e1::es) = (E.Apply(E.Partial d, E.Prod (E.Delta e1::es)))
168            | prod (E.Prod e1::es)=prod(e1@es)
169          | prod(e1::e2)=(let          | prod(e1::e2)=(let
170              val l= prod(e2) val m= E.Prod[e1,l]              val l= prod(e2)
171              val lr=e2 @[E.Apply(E.Partial d,e1)] val(b,a) =mkProd lr              val (_, a)= mkProd[e1,l]
172              in  E.Add[a,m]              val lr=e2 @[E.Apply(E.Partial d,e1)]
173                val(_,b) =mkProd lr
174                in  E.Add[b,a]
175              end)              end)
176          in (1,prod es) end)*)          val chainrule=prod es
177            in (1,E.Sum(c, chainrule)) end)
178      |_=>(0,E.Apply(E.Partial d,E.Sum(c,e)))      |_=>(0,E.Apply(E.Partial d,E.Sum(c,e)))
179      (* end case*))      (* end case*))
180    
# Line 217  Line 189 
189      | E.Prod(E.Tensor(a,[])::e2)=>(1,E.Prod[E.Tensor(a,[]),E.Apply(E.Partial d,E.Prod e2)])      | E.Prod(E.Tensor(a,[])::e2)=>(1,E.Prod[E.Tensor(a,[]),E.Apply(E.Partial d,E.Prod e2)])
190      | E.Prod es=> (let      | E.Prod es=> (let
191          fun prod [e1] =(0,E.Apply(E.Partial d,e1))          fun prod [e1] =(0,E.Apply(E.Partial d,e1))
192            | prod (E.Epsilon eps1::es) = (0,E.Apply(E.Partial d, E.Prod (E.Epsilon eps1::es)))
193            | prod (E.Delta e1::es) = (0,E.Apply(E.Partial d, E.Prod (E.Delta e1::es)))
194             | prod (E.Prod e1::es)=prod(e1@es)
195          | prod(E.Tensor t::e2)=(let          | prod(E.Tensor t::e2)=(let
196              val (change,l)= prod(e2) val m= E.Prod[E.Tensor t,l]              val (_,l)= prod(e2) val m= E.Prod[E.Tensor t,l]
197              val lr=e2 @[E.Apply(E.Partial d,E.Tensor t)] val(b,a) =mkProd lr              val lr=e2 @[E.Apply(E.Partial d,E.Tensor t)] val(b,a) =mkProd lr
198              in  (1,E.Add[a,m])              in  (1,E.Add[a,m])
199              end)              end)
200          | prod(E.Field f::e2)=(let          | prod(E.Field f::e2)=(let
201              val (change,l)= prod(e2) val m= E.Prod[E.Field f,l]              val (_,l)= prod(e2) val m= E.Prod[E.Field f,l]
202              val lr=e2 @[E.Apply(E.Partial d,E.Field f)] val(b,a) =mkProd lr              val lr=e2 @[E.Apply(E.Partial d,E.Field f)] val(b,a) =mkProd lr
203              in  (1,E.Add[a,m])              in  (1,E.Add[a,m])
204              end)              end)
205          | prod e = (0,E.Apply(E.Partial d, E.Prod e))          | prod e = (0,E.Apply(E.Partial d, E.Prod e))
206                  (*)prod (e1::e2)= E.Apply(E.Partial d, E.Prod ([e1]@e2))  
 *)  
207    
208          val (a,b)= prod es          val (a,b)= prod es
209    
# Line 266  Line 239 
239              | matchprod(num,[],rest,eps::epsx)=              | matchprod(num,[],rest,eps::epsx)=
240                  matchprod(num,rest,[],epsx)                  matchprod(num,rest,[],epsx)
241              | matchprod(num,E.V p::px,rest,eps::epsx)=              | matchprod(num,E.V p::px,rest,eps::epsx)=
242                  if(p=eps) then matchprod(num+1,px,rest,epsx)                  if(p=eps) then (matchprod(num+1,rest@px,[],epsx))
243                  else matchprod(num,px,rest@[E.V p], eps::epsx)                  else matchprod(num,px,rest@[E.V p], eps::epsx)
244              | matchprod(num,p::px,rest,eps)=              | matchprod(num,p::px,rest,eps)=
245                  matchprod(num,px,rest,eps)                  matchprod(num,px,rest,eps)
# Line 375  Line 348 
348    
349                | E.Apply(E.Partial d,E.Sum(c,e))=>let                | E.Apply(E.Partial d,E.Sum(c,e))=>let
350                      val(c,e')=mkApplySum(E.Apply(E.Partial d,E.Sum(c, rewriteBody e)))                      val(c,e')=mkApplySum(E.Apply(E.Partial d,E.Sum(c, rewriteBody e)))
351                  in (case c of 1=>(changed:=true;e')                      val e''=(case e'
352                      |_=> e')end                          of E.Apply(d,E.Sum s)=>E.Apply(d,rewriteBody(E.Sum s))
353                            |_=> e')
354                    in (print "bb";case c of 1=>(changed:=true;e'')
355                        |_=> e'')end
356                | E.Apply(E.Partial [],e)=> e                | E.Apply(E.Partial [],e)=> e
357    
358                | E.Apply(E.Partial p, e)=>let                | E.Apply(E.Partial p, e)=>let
# Line 395  Line 371 
371                | E.Sum(c,E.Sub(e1,e2))=>(changed:=true; E.Sub(E.Sum(c,e1),E.Sum(c,e2)))                | E.Sum(c,E.Sub(e1,e2))=>(changed:=true; E.Sub(E.Sum(c,e1),E.Sum(c,e2)))
372                | E.Sum(c,E.Prod(E.Epsilon eps1::E.Epsilon eps2::ps))=>                | E.Sum(c,E.Prod(E.Epsilon eps1::E.Epsilon eps2::ps))=>
373                     let val (i,e,rest)=epsToDels(body)                     let val (i,e,rest)=epsToDels(body)
374                     in (case (i, e,rest)                  in (print "eps to dels \n ";case (i, e,rest)
375                          of (1,[e1],_) =>(changed:=true;e1)                  of (1,[e1],r) =>(print "changed\n";changed:=true;e1)
376                          |(0,eps,[])=>body                  |(0,eps,[])=>(print "non";body)
377                          |(0,eps,rest)=>(let                          |(0,eps,rest)=>(let
378                              val p'=rewriteBody(E.Prod rest)                              val p'=rewriteBody(E.Prod rest)
379                              val p''= (case p' of E.Prod p=>p |e=>[e])                              val p''= (case p' of E.Prod p=>p |e=>[e])
# Line 420  Line 396 
396                          | E.Sum(c',E.Apply(d',e'))  => (let                          | E.Sum(c',E.Apply(d',e'))  => (let
397                              val s'=rewriteBody(E.Sum(c',e'))                              val s'=rewriteBody(E.Sum(c',e'))
398                             in (case s'                             in (case s'
399                                  of E.Sum([],e'')=>E.Apply(d',e'')                                  of E.Sum([],e'')=> rewriteBody (E.Apply(d',e''))
400                                  | E.Sum(s'',e'') => E.Sum(s'',E.Apply(d',e''))                                  | E.Sum(s'',e'') => E.Sum(s'',rewriteBody(E.Apply(d',e'')))
401                                  | _ => E.Apply(d',s'))                                  | _ => E.Apply(d',s'))
402    
403                              end)                              end)
# Line 442  Line 418 
418              val body' = rewriteBody body              val body' = rewriteBody body
419              in              in
420                if !changed                if !changed
421                     then (changed := false; print " \n \t => \n \t ";print( P.printbody body');print "\n";loop body')                     then (changed := false; loop body')
422                  else (P.printbody(body');body')                  else body'
423              end              end
424      val b = loop body      val b = loop body
425      in      in

Legend:
Removed from v.2459  
changed lines
  Added in v.2460

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