thys2/zre7.sc
changeset 394 4b22587fb667
parent 393 3954579ebdaf
equal deleted inserted replaced
393:3954579ebdaf 394:4b22587fb667
     6 import scala.collection.mutable.{Map => MMap}
     6 import scala.collection.mutable.{Map => MMap}
     7 import scala.collection.mutable.{ArrayBuffer => MList}
     7 import scala.collection.mutable.{ArrayBuffer => MList}
     8 //import pprint._
     8 //import pprint._
     9 
     9 
    10 import scala.util.Try
    10 import scala.util.Try
    11 
    11 import pprint._
    12 
    12 
    13 
    13 
    14 abstract class Val
    14 abstract class Val
    15 case object Empty extends Val
    15 case object Empty extends Val
    16 case class Chr(c: Char) extends Val
    16 case class Chr(c: Char) extends Val
    74 //[R(Sequ(a, a)), vs]
    74 //[R(Sequ(a, a)), vs]
    75 //[L(a), L(a), vs]
    75 //[L(a), L(a), vs]
    76 def check_before_down(c: Ctx, r: Rexp, d: Int = 0) : List[Zipper] = {
    76 def check_before_down(c: Ctx, r: Rexp, d: Int = 0) : List[Zipper] = {
    77     mems.get((pos, r)) match {
    77     mems.get((pos, r)) match {
    78         case Some(m) => 
    78         case Some(m) => 
    79             //m.parents = c::m.parents
    79             m.parents = c::m.parents//:::List(c)
    80             m.result.find(tup2 => tup2._1 == pos) match {
    80             m.result.find(tup2 => tup2._1 == pos) match {
    81                 // case Some((i, v)) => 
    81                 // case Some((i, v)) => 
    82                 //   original_up(v, c, d)
    82                 //   original_up(v, c, d)
    83                 case None => 
    83                 case None => 
    84                   List()
    84                   List()
    86         case None => 
    86         case None => 
    87             val m = Mem(c::Nil, MList.empty[(Int, Val)])
    87             val m = Mem(c::Nil, MList.empty[(Int, Val)])
    88             mems = mems + ((pos, r) -> m)
    88             mems = mems + ((pos, r) -> m)
    89             original_down(r, m, d)
    89             original_down(r, m, d)
    90     }
    90     }
       
    91     // val m = Mem(c::Nil, MList.empty[(Int, Val)])
       
    92     // original_down(r, m, d)
    91 }
    93 }
    92 
    94 
    93 //mems  pstart r  --> m parents [(pend, vres), ...]
    95 //mems  pstart r  --> m parents [(pend, vres), ...]
    94 //aaa
    96 //aaa
    95 //012
    97 //012
    96 //seq a a 
    98 //seq a a 
    97 //0 a~a --> m ... [(2, Sequ a a)]
    99 //0 a~a --> m ... [(2, Sequ a a)]
    98 
   100         // c match {
       
   101         //     case StarC(mst, vst, rst) => print(s"StarC $vst\t")
       
   102         //     case SeqC(mse, pr, unp) => print(s"SeqC $unp\t")
       
   103         //     case AltC(mal, w) => print(s"AltC ${w(Empty)}\t")
       
   104         //     case RootC => print("Root")
       
   105         // }
       
   106 def reorderCtx(cs: List[Ctx]): List[Ctx] = {
       
   107     Nil
       
   108 }
    99 
   109 
   100 def mem_up(vres: Val, m: Mem, rec_depth : Int = 0) : List[Zipper] = {
   110 def mem_up(vres: Val, m: Mem, rec_depth : Int = 0) : List[Zipper] = {
   101     m.result += (pos -> vres)
   111     m.result += (pos -> vres)
   102     m.parents.flatMap((c: Ctx) =>
   112     //m.parents = m.parents.reverse
       
   113           
       
   114     // if(m.parents.size > 1){//println()
       
   115     //     println()  
       
   116     //     println("each of the contexts")
       
   117     //     m.parents.reverse.foreach (c =>
       
   118     //         println(simpleCtxDisplay(c))
       
   119     //     )
       
   120     //     println("after distinctCtx")
       
   121     //     distinctCtx(m.parents.reverse).foreach(c =>
       
   122     //         println(simpleCtxDisplay(c))
       
   123     //     )
       
   124     //     //println(s"vs is $vss")
       
   125     
       
   126     // }
       
   127     //.distinctBy(zipBackToRegex(_))
       
   128     (m.parents).distinctBy(zipBackToRegex(_)).flatMap((c: Ctx) =>
   103         original_up(vres, c, rec_depth)
   129         original_up(vres, c, rec_depth)
   104     )
   130     )    
       
   131     // m.parents.reverse.flatMap((c: Ctx) =>
       
   132     //     original_up(vres, c, rec_depth)
       
   133     // )
       
   134     // original_up(vres, m.parents.last, rec_depth)
   105 }
   135 }
   106 
   136 
   107 def original_down(r: Rexp, m: Mem, d: Int = 0) : List[Zipper] = (r, m) match {
   137 def original_down(r: Rexp, m: Mem, d: Int = 0) : List[Zipper] = (r, m) match {
   108     case (CHAR(b), m) => {
   138     case (CHAR(b), m) => {
   109         if (input(pos) == b) {
   139         if (input(pos) == b) {
   110             List((Chr(b), m)) 
   140             List((Chr(b), m)) 
   111         }
   141         }
   112         else 
   142         else 
   113             Nil
   143             Nil
   114     }
   144     }
   115     case (ONE, m) => mem_up(Empty, m, d + 1)
   145     case (ONE, m) => Nil//mem_up(Empty, m, d + 1)
   116     case (SEQ(r1, r2), m) =>
   146     case (SEQ(r1, r2), m) =>  
   117           
   147         // if(nullable(r1)){
   118         val mprime = Mem(AltC(m, x => x )::Nil, MList.empty[(Int, Val)])
   148         //     val mprime = Mem(AltC(m, x => x )::Nil, MList.empty[(Int, Val)])
   119          
   149         //     check_before_down(SeqC(mprime, Nil, List(r2)), r1, d) :::
   120         check_before_down(SeqC(mprime, Nil, List(r2)), r1, d)
   150         //     check_before_down(SeqC(mprime, mkeps(r1)::Nil, Nil), r2, d)
       
   151         // }
       
   152         // else
       
   153             check_before_down(SeqC(m, Nil, List(r2)), r1, d)
   121     case (ALT(r1, r2), m) => 
   154     case (ALT(r1, r2), m) => 
   122          
       
   123         check_before_down(AltC(m, Left(_)), r1, d) ::: 
   155         check_before_down(AltC(m, Left(_)), r1, d) ::: 
   124         check_before_down(AltC(m, Right(_)), r2, d)
   156         check_before_down(AltC(m, Right(_)), r2, d)
   125     case (STAR(r0), m) =>
   157     case (STAR(r0), m) =>
   126          
   158         check_before_down(StarC(m, Nil, r0), r0, d) :::
   127         check_before_down(StarC(m, Nil, r0), r0, d)
   159         mem_up(Stars(Nil), m, d + 1)
   128     case (_, _) => throw new Exception("original down unexpected r or m")
   160     case (_, _) => throw new Exception("original down unexpected r or m")
   129 }
   161 }
   130 
   162 
   131 def original_up(v: Val, c: Ctx, d: Int = 0) : List[Zipper] = 
   163 def original_up(v: Val, c: Ctx, d: Int = 0) : List[Zipper] = 
   132 {
   164 {
   133 
   165 
   134 (v, c) match {
   166 (v, c) match {
   135     case (v, SeqC(m, v1::Nil, Nil)) => 
   167     case (v, SeqC(m, v1::Nil, Nil)) => 
   136         mem_up(Sequ(v1, v), m, d + 1)
   168         mem_up(Sequ(v1, v), m, d + 1)
   137     case (v, SeqC(m, Nil, u1::Nil)) => 
   169     case (v, SeqC(m, vs, u1::Nil)) => 
   138         check_before_down(SeqC(m, v::Nil, Nil), u1, d)
   170         check_before_down(SeqC(m, v::vs, Nil), u1, d)
   139     case (v, AltC(m, wrap)) => m.result.find(tup2 => tup2._1 == pos) match {
   171     case (v, AltC(m, wrap)) => m.result.find(tup2 => tup2._1 == pos) match {
   140         case Some( (i, vPrime)  ) => 
   172         case Some( (i, vPrime)  ) => 
   141             m.result += (i -> wrap(v))
   173             m.result += (i -> wrap(v))
   142             Nil
   174             Nil
   143         case None => 
   175         case None => 
   144             mem_up(wrap(v), m, d + 1)
   176             mem_up(wrap(v), m, d + 1)
   145     } //mem_up(AL1(r), par)
   177     } //mem_up(AL1(v), par)
   146     //case (v, StarC(m, vs, r0)) => throw new Exception("why not hit starC")
   178     //case (v, StarC(m, vs, r0)) => throw new Exception("why not hit starC")
   147 
   179 
   148     case (v, RootC) => 
   180     case (v, RootC) => 
   149         Nil
   181         Nil
   150     case (v, StarC(m, vs, r0) ) => mem_up(Stars(v::vs), m, d + 1) ::: 
   182     case (v, StarC(m, vs, r0) ) => //mem_up(Stars(v::vs), m, d + 1) //::: 
   151         check_before_down(StarC(m, v::vs, r0), r0, d)
   183         check_before_down(StarC(m, v::vs, r0), r0, d) :::
       
   184         mem_up(Stars((v::vs).reverse), m, d + 1)
   152     case (_, _) => throw new Exception("hit unexpected context")
   185     case (_, _) => throw new Exception("hit unexpected context")
   153 }
   186 }
   154 
   187 
   155 }
   188 }
   156 
   189 
   157 
   190 
   158 def derive(p: Int, z: Zipper) : List[Zipper] = {
   191 def derive(p: Int, z: Zipper) : List[Zipper] = {
   159     pos = p
   192     pos = p
       
   193     //println(s"z's actual size is ${actualZipperSize(z::Nil)}")
       
   194     
   160     z match {
   195     z match {
   161         case (v, m) => mem_up(v, m)
   196         case (v, m) => 
       
   197             
       
   198             mem_up(v, m)
   162         case _ => throw new Exception("error")
   199         case _ => throw new Exception("error")
   163     }
   200     }
   164 }
   201 }
   165 //let e' = Seq([]) in 
   202 //let e' = Seq([]) in 
   166 //
   203 //
   167 def init_zipper(r: Rexp) : Zipper = {
   204 def init_zipper(r: Rexp) : Zipper = {
   168     val m_top = Mem(RootC::Nil, MList.empty[(Int, Val)])
   205     val m_top = Mem(RootC::Nil, MList.empty[(Int, Val)])
   169     val c_top = SeqC(m_top, Nil, r::Nil)
   206     val c_top = SeqC(m_top, Nil, r::Nil)
   170     val m_r = Mem(c_top::Nil, MList.empty[(Int, Val)])
   207     val m_r = Mem(c_top::Nil, MList.empty[(Int, Val)])
   171     println(s"initial zipper is (ZERO, $m_r)")
   208     println(s"initial zipper is (Empty, $m_r)")
   172     (Empty, m_r)//TODO: which val should we start with? Maybe Empty, maybe doesn't matter
   209     (Empty, m_r)//TODO: which val should we start with? Maybe Empty, maybe doesn't matter
   173     // val dummyRexp = ONE
   210     // val dummyRexp = ONE
   174     // val dummyMem = Mem()
   211     // val dummyMem = Mem()
   175 
   212 
   176 }
   213 }
   193             Nil
   230             Nil
   194 
   231 
   195     //TODO: when multiple results stored in m, which one to choose?
   232     //TODO: when multiple results stored in m, which one to choose?
   196     case AltC(m, wrap) => 
   233     case AltC(m, wrap) => 
   197         plug_mem(wrap(v), m)
   234         plug_mem(wrap(v), m)
   198     case StarC(m, vs, r0) => plug_mem(Stars(v::vs), m)
   235     case StarC(m, vs, r0) => plug_mem(Stars((v::vs).reverse), m)
   199 }
   236 }
   200 
   237 
   201 }
   238 }
   202 
   239 
   203 
   240 
   306 // val (rgraph, re0root) = makeGraphFromObject(re0)
   343 // val (rgraph, re0root) = makeGraphFromObject(re0)
   307 // val asciir = GraphLayout.renderGraph(rgraph)
   344 // val asciir = GraphLayout.renderGraph(rgraph)
   308 // println("printing out re0")
   345 // println("printing out re0")
   309 // println(asciir)
   346 // println(asciir)
   310 // val re1s = lex(re0, "aabc")
   347 // val re1s = lex(re0, "aabc")
   311 
   348  
   312 def actualZipperSize(zs: List[Zipper]) : Int = zs match {
   349 def actualZipperSize(zs: List[Zipper]) : Int = zs match {
   313     case Nil => 0
   350     case Nil => 0
   314     case z::zs1 => countParents(z._2) + actualZipperSize(zs1)
   351     case z::zs1 => countParents(z._2) + actualZipperSize(zs1)
   315 }
   352 }
   316 
   353 
   324         case SeqC(m, pr, unp) => countParents(m)
   361         case SeqC(m, pr, unp) => countParents(m)
   325         case AltC(m, w) => countParents(m)
   362         case AltC(m, w) => countParents(m)
   326         case StarC(m, _, _) => countParents(m)
   363         case StarC(m, _, _) => countParents(m)
   327     }
   364     }
   328 }
   365 }
   329 
   366 //(a+aa)* \a --> (1 + a)(a+aa)* --> (a+aa)* + (1+a)(a+aa)*
   330 def zipperSimp(zs: List[Zipper]) : List[Zipper] = {
   367 
   331     zs.distinctBy(z => zipBackMem(z._2))
   368 //a(a+aa)* + 1(a+aa)* + (a+aa)*
   332 }
   369 
   333 
   370 //a~(a + aa)* \a -> 1 ~ (a + aa)* 
   334 def zipBackToRegex(c: Ctx, r: Rexp = ONE) : List[Rexp] = {
   371 //va <-----> m --> SeqC(m1, pr, "a") --> AltC(m4, Right)--> StarC(m2, vs, "a" + "aa") --> SeqC(m) ---> Root
       
   372 //           ^
       
   373 //           ---> AltC(m4, Left) 
       
   374 def zipBackToRegex(c: Ctx, r: Rexp = ONE) : Rexp = {
   335     c match {
   375     c match {
   336         case RootC => r::Nil
   376         case RootC => r
   337         case SeqC(m, pr, Nil) => zipBackMem(m, r)
   377         case SeqC(m, pr, Nil) => zipBackToRegex(m.parents.head, r)
   338         case SeqC(m, pr, unp::Nil) => zipBackMem(m, SEQ(r, unp))
   378         case SeqC(m, pr, unp::Nil) => zipBackToRegex(m.parents.head, SEQ(r, unp))
   339         case AltC(m, w) => zipBackMem(m, r)
   379         case AltC(m, w) => zipBackToRegex(m.parents.head, r)
   340         case StarC(m, vs, r0) => zipBackMem(m, SEQ(r, STAR(r0)))
   380         case StarC(m, vs, r0) => zipBackToRegex(m.parents.head, SEQ(r, STAR(r0)))
   341     }
   381     }
   342 }
   382 }
   343 
   383 
   344 def zipBackMem(m: Mem, r: Rexp = ONE) : List[Rexp] = {
   384 def zipperSimp(z: Zipper) : Unit = z match {
   345     m.parents.flatMap(c => zipBackToRegex(c, r))
   385     case (v, m) => //m.parents = m.parents.distinctBy(c => zipBackToRegex(c))
   346 }
   386 }
       
   387 
       
   388 def distinctCtx(cs: List[Ctx]) : List[Ctx] = cs.distinctBy(c => zipBackToRegex(c))
       
   389 
       
   390 
       
   391 def simpleCtxDisplay(c: Ctx, indent : Int = 0) : String = c match {
       
   392     case SeqC(m, pr, unp) => "Sc[m:" ++ printMem(m, indent + 1) ++ 
       
   393         "pr:" ++ pr.map(v => shortValOutput(v)).mkString(", ") ++ " unp:" ++ unp.map(r2 => shortRexpOutput(r2)).mkString(", ") ++ "]"
       
   394     case AltC(m, w) =>
       
   395         w(Empty) match {
       
   396             case Left(_) => s"Ac(m:${printMem(m, indent + 1)}, Left(_))"
       
   397             case Right(_) => s"Ac(m:${printMem(m, indent + 1)}, Right(_))"
       
   398             case Empty => s"Ac(m:${printMem(m, indent + 1)}, id)"
       
   399         } 
       
   400     case StarC(m, vs, r0) => s"StarC[m:" ++ printMem(m, indent + 1) ++ 
       
   401         "vs:" ++ vs.map(v => shortValOutput(v)).mkString(", ") ++ " r0: " ++ shortRexpOutput(r0)
       
   402     case RootC => "Root"
       
   403     //case AL1(r) => s"(+${shortRexpOutput(r)})"
       
   404     //case STAR(r) => "STAR(" ++ shortRexpOutput(r) ++ ")"
       
   405     //case RTOP => "RTOP"
       
   406   }
       
   407 
       
   408 def printMem(m: Mem, indent: Int = 0) : String = {
       
   409    "M(par:" ++
       
   410    m.parents.map(c => simpleCtxDisplay(c, indent + 1)).mkString("(",",", ")")  ++
       
   411   (", results:")  ++
       
   412   (for(iRexp <- m.result) 
       
   413     yield iRexp match {case (p: Int, v: Val) => s"$p->${shortValOutput(v)}"}
       
   414   ).mkString("(",",", ")")  ++ 
       
   415    ")" 
       
   416 }
       
   417 
       
   418 def shortRexpOutput(r: Rexp) : String = r match {
       
   419     case CHAR(c) => c.toString
       
   420     case ONE => "1"
       
   421     case ZERO => "0"
       
   422     case SEQ(r1, r2) => "[" ++ shortRexpOutput(r1) ++ "~" ++ shortRexpOutput(r2) ++ "]"
       
   423     case ALT(r1, r2) => "(" ++ shortRexpOutput(r1) ++ "+" ++ shortRexpOutput(r2) ++ ")"
       
   424     case STAR(r) => "[" ++ shortRexpOutput(r) ++ "]*"
       
   425     //case STAR(r) => "STAR(" ++ shortRexpOutput(r) ++ ")"
       
   426     case RTOP => "RTOP"
       
   427   }
       
   428 
       
   429 def shortValOutput(v: Val) : String = v match {
       
   430     case Left(v) => "L(" ++ shortValOutput(v) ++ ")"
       
   431     case Right(v) => "R(" ++ shortValOutput(v) ++ ")"
       
   432     case Empty => "e"
       
   433     case Sequ(v1, v2) => "[" ++ shortValOutput(v1) ++ "~" ++ shortValOutput(v2) ++ "]"
       
   434     case Chr(a) => a.toString
       
   435     case Stars(vs) => "Stars" ++ vs.map(shortValOutput(_)).mkString("[", ",", "]")
       
   436     case _ => "???"
       
   437 }
       
   438 
   347 
   439 
   348 //def crystalizeZipper
   440 //def crystalizeZipper
   349 
   441 
       
   442 for(i <- 1 to 10) {
       
   443     mems.clear()
       
   444 println(s"there are $i number of a's")
       
   445 val re1 = (("a" | "b") ~ "c" | ("b" | "e") ~ "c" ) ~ "f"//("a" | "aa" |"ab").%
       
   446 val re1Lexed = lex(re1, "bcf")//"a"*i+"b")
       
   447 
       
   448 //drawZippers(re1Lexed)
       
   449 println("size of actual zipper (including memoized contexts")
       
   450 println(actualZipperSize(re1Lexed))
       
   451 //println(re1Lexed)
       
   452 //re1Lexed.foreach(zipperSimp(_))
       
   453 //println(actualZipperSize(re1S))
       
   454 val re1resPlugged = plug_all(re1Lexed)
       
   455 //println(actualZipperSize(re1Lexed))
       
   456 
       
   457 println("value extracted")
       
   458 re1resPlugged.foreach(v => {
       
   459         val Sequ(Empty, vp) = v
       
   460         println(vp)
       
   461 }
       
   462 )
       
   463 
       
   464   val mb = 1024*1024
       
   465 val runtime = Runtime.getRuntime
       
   466 println("ALL RESULTS IN MB")
       
   467 println("** Used Memory:  " + (runtime.totalMemory - runtime.freeMemory) / mb)
       
   468 println("** Free Memory:  " + runtime.freeMemory / mb)
       
   469 println("** Total Memory: " + runtime.totalMemory / mb)
       
   470 println("** Max Memory:   " + runtime.maxMemory / mb)
       
   471 
       
   472 }
       
   473 
   350 mems.clear()
   474 mems.clear()
   351 val re1 = ("a" | "aa").%
   475 val re2 = SEQ(ONE, "a")
   352 val re1ss = lex(re1, "aaaaa")
       
   353 
       
   354 //drawZippers(re1ss)
       
   355 println(actualZipperSize(re1ss))
       
   356 //println(re1ss)
       
   357 val re1S = zipperSimp(re1ss)
       
   358 //println(actualZipperSize(re1S))
       
   359 
       
   360 
       
   361 mems.clear()
       
   362 val re2 = ALT("a", "bc")
       
   363 val re2res = lex(re2, "a")
   476 val re2res = lex(re2, "a")
   364 // //lex(1~a, "a") --> lexRecurse((1v, m  (SeqC(m (RootC, Nil), Nil, [1~a] ) )))
   477 //lex(1~a, "a") --> lexRecurse((1v, m  (SeqC(m (RootC, Nil), Nil, [1~a] ) )))
   365 
   478 
   366 
   479 
   367 println(re2res)
   480 println(re2res)
   368 
   481 
   369 val re2resPlugged = plug_all(re2res)
   482 val re2resPlugged = plug_all(re2res)
   370  re2resPlugged.foreach(v => {
   483 re2resPlugged.foreach(v => {
   371          val Sequ(Empty, vp) = v
   484         val Sequ(Empty, vp) = v
   372          println(vp)
   485         println(vp)
   373 }) 
   486 }
       
   487 )
   374 
   488 
   375 // println("remaining regex")
   489 // println("remaining regex")
   376 // println(re1ss.flatMap(z => zipBackMem(z._2)))
   490 // println(re1ss.flatMap(z => zipBackMem(z._2)))
   377 
   491 
   378 
   492