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 2458, Tue Oct 8 19:42:58 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.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
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
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
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.2458 changed lines Added in v.2460