hi
authorChengsong
Sat, 22 Jan 2022 21:42:50 +0000
changeset 394 4b22587fb667
parent 393 3954579ebdaf
child 395 5bffeacdf17e
hi
thys2/zre7.sc
--- a/thys2/zre7.sc	Sat Jan 22 10:48:09 2022 +0000
+++ b/thys2/zre7.sc	Sat Jan 22 21:42:50 2022 +0000
@@ -8,7 +8,7 @@
 //import pprint._
 
 import scala.util.Try
-
+import pprint._
 
 
 abstract class Val
@@ -76,7 +76,7 @@
 def check_before_down(c: Ctx, r: Rexp, d: Int = 0) : List[Zipper] = {
     mems.get((pos, r)) match {
         case Some(m) => 
-            //m.parents = c::m.parents
+            m.parents = c::m.parents//:::List(c)
             m.result.find(tup2 => tup2._1 == pos) match {
                 // case Some((i, v)) => 
                 //   original_up(v, c, d)
@@ -88,6 +88,8 @@
             mems = mems + ((pos, r) -> m)
             original_down(r, m, d)
     }
+    // val m = Mem(c::Nil, MList.empty[(Int, Val)])
+    // original_down(r, m, d)
 }
 
 //mems  pstart r  --> m parents [(pend, vres), ...]
@@ -95,13 +97,41 @@
 //012
 //seq a a 
 //0 a~a --> m ... [(2, Sequ a a)]
-
+        // c match {
+        //     case StarC(mst, vst, rst) => print(s"StarC $vst\t")
+        //     case SeqC(mse, pr, unp) => print(s"SeqC $unp\t")
+        //     case AltC(mal, w) => print(s"AltC ${w(Empty)}\t")
+        //     case RootC => print("Root")
+        // }
+def reorderCtx(cs: List[Ctx]): List[Ctx] = {
+    Nil
+}
 
 def mem_up(vres: Val, m: Mem, rec_depth : Int = 0) : List[Zipper] = {
     m.result += (pos -> vres)
-    m.parents.flatMap((c: Ctx) =>
+    //m.parents = m.parents.reverse
+          
+    // if(m.parents.size > 1){//println()
+    //     println()  
+    //     println("each of the contexts")
+    //     m.parents.reverse.foreach (c =>
+    //         println(simpleCtxDisplay(c))
+    //     )
+    //     println("after distinctCtx")
+    //     distinctCtx(m.parents.reverse).foreach(c =>
+    //         println(simpleCtxDisplay(c))
+    //     )
+    //     //println(s"vs is $vss")
+    
+    // }
+    //.distinctBy(zipBackToRegex(_))
+    (m.parents).distinctBy(zipBackToRegex(_)).flatMap((c: Ctx) =>
         original_up(vres, c, rec_depth)
-    )
+    )    
+    // m.parents.reverse.flatMap((c: Ctx) =>
+    //     original_up(vres, c, rec_depth)
+    // )
+    // original_up(vres, m.parents.last, rec_depth)
 }
 
 def original_down(r: Rexp, m: Mem, d: Int = 0) : List[Zipper] = (r, m) match {
@@ -112,19 +142,21 @@
         else 
             Nil
     }
-    case (ONE, m) => mem_up(Empty, m, d + 1)
-    case (SEQ(r1, r2), m) =>
-          
-        val mprime = Mem(AltC(m, x => x )::Nil, MList.empty[(Int, Val)])
-         
-        check_before_down(SeqC(mprime, Nil, List(r2)), r1, d)
+    case (ONE, m) => Nil//mem_up(Empty, m, d + 1)
+    case (SEQ(r1, r2), m) =>  
+        // if(nullable(r1)){
+        //     val mprime = Mem(AltC(m, x => x )::Nil, MList.empty[(Int, Val)])
+        //     check_before_down(SeqC(mprime, Nil, List(r2)), r1, d) :::
+        //     check_before_down(SeqC(mprime, mkeps(r1)::Nil, Nil), r2, d)
+        // }
+        // else
+            check_before_down(SeqC(m, Nil, List(r2)), r1, d)
     case (ALT(r1, r2), m) => 
-         
         check_before_down(AltC(m, Left(_)), r1, d) ::: 
         check_before_down(AltC(m, Right(_)), r2, d)
     case (STAR(r0), m) =>
-         
-        check_before_down(StarC(m, Nil, r0), r0, d)
+        check_before_down(StarC(m, Nil, r0), r0, d) :::
+        mem_up(Stars(Nil), m, d + 1)
     case (_, _) => throw new Exception("original down unexpected r or m")
 }
 
@@ -134,21 +166,22 @@
 (v, c) match {
     case (v, SeqC(m, v1::Nil, Nil)) => 
         mem_up(Sequ(v1, v), m, d + 1)
-    case (v, SeqC(m, Nil, u1::Nil)) => 
-        check_before_down(SeqC(m, v::Nil, Nil), u1, d)
+    case (v, SeqC(m, vs, u1::Nil)) => 
+        check_before_down(SeqC(m, v::vs, Nil), u1, d)
     case (v, AltC(m, wrap)) => m.result.find(tup2 => tup2._1 == pos) match {
         case Some( (i, vPrime)  ) => 
             m.result += (i -> wrap(v))
             Nil
         case None => 
             mem_up(wrap(v), m, d + 1)
-    } //mem_up(AL1(r), par)
+    } //mem_up(AL1(v), par)
     //case (v, StarC(m, vs, r0)) => throw new Exception("why not hit starC")
 
     case (v, RootC) => 
         Nil
-    case (v, StarC(m, vs, r0) ) => mem_up(Stars(v::vs), m, d + 1) ::: 
-        check_before_down(StarC(m, v::vs, r0), r0, d)
+    case (v, StarC(m, vs, r0) ) => //mem_up(Stars(v::vs), m, d + 1) //::: 
+        check_before_down(StarC(m, v::vs, r0), r0, d) :::
+        mem_up(Stars((v::vs).reverse), m, d + 1)
     case (_, _) => throw new Exception("hit unexpected context")
 }
 
@@ -157,8 +190,12 @@
 
 def derive(p: Int, z: Zipper) : List[Zipper] = {
     pos = p
+    //println(s"z's actual size is ${actualZipperSize(z::Nil)}")
+    
     z match {
-        case (v, m) => mem_up(v, m)
+        case (v, m) => 
+            
+            mem_up(v, m)
         case _ => throw new Exception("error")
     }
 }
@@ -168,7 +205,7 @@
     val m_top = Mem(RootC::Nil, MList.empty[(Int, Val)])
     val c_top = SeqC(m_top, Nil, r::Nil)
     val m_r = Mem(c_top::Nil, MList.empty[(Int, Val)])
-    println(s"initial zipper is (ZERO, $m_r)")
+    println(s"initial zipper is (Empty, $m_r)")
     (Empty, m_r)//TODO: which val should we start with? Maybe Empty, maybe doesn't matter
     // val dummyRexp = ONE
     // val dummyMem = Mem()
@@ -195,7 +232,7 @@
     //TODO: when multiple results stored in m, which one to choose?
     case AltC(m, wrap) => 
         plug_mem(wrap(v), m)
-    case StarC(m, vs, r0) => plug_mem(Stars(v::vs), m)
+    case StarC(m, vs, r0) => plug_mem(Stars((v::vs).reverse), m)
 }
 
 }
@@ -308,7 +345,7 @@
 // println("printing out re0")
 // println(asciir)
 // val re1s = lex(re0, "aabc")
-
+ 
 def actualZipperSize(zs: List[Zipper]) : Int = zs match {
     case Nil => 0
     case z::zs1 => countParents(z._2) + actualZipperSize(zs1)
@@ -326,51 +363,128 @@
         case StarC(m, _, _) => countParents(m)
     }
 }
+//(a+aa)* \a --> (1 + a)(a+aa)* --> (a+aa)* + (1+a)(a+aa)*
 
-def zipperSimp(zs: List[Zipper]) : List[Zipper] = {
-    zs.distinctBy(z => zipBackMem(z._2))
-}
+//a(a+aa)* + 1(a+aa)* + (a+aa)*
 
-def zipBackToRegex(c: Ctx, r: Rexp = ONE) : List[Rexp] = {
+//a~(a + aa)* \a -> 1 ~ (a + aa)* 
+//va <-----> m --> SeqC(m1, pr, "a") --> AltC(m4, Right)--> StarC(m2, vs, "a" + "aa") --> SeqC(m) ---> Root
+//           ^
+//           ---> AltC(m4, Left) 
+def zipBackToRegex(c: Ctx, r: Rexp = ONE) : Rexp = {
     c match {
-        case RootC => r::Nil
-        case SeqC(m, pr, Nil) => zipBackMem(m, r)
-        case SeqC(m, pr, unp::Nil) => zipBackMem(m, SEQ(r, unp))
-        case AltC(m, w) => zipBackMem(m, r)
-        case StarC(m, vs, r0) => zipBackMem(m, SEQ(r, STAR(r0)))
+        case RootC => r
+        case SeqC(m, pr, Nil) => zipBackToRegex(m.parents.head, r)
+        case SeqC(m, pr, unp::Nil) => zipBackToRegex(m.parents.head, SEQ(r, unp))
+        case AltC(m, w) => zipBackToRegex(m.parents.head, r)
+        case StarC(m, vs, r0) => zipBackToRegex(m.parents.head, SEQ(r, STAR(r0)))
     }
 }
 
-def zipBackMem(m: Mem, r: Rexp = ONE) : List[Rexp] = {
-    m.parents.flatMap(c => zipBackToRegex(c, r))
+def zipperSimp(z: Zipper) : Unit = z match {
+    case (v, m) => //m.parents = m.parents.distinctBy(c => zipBackToRegex(c))
 }
 
+def distinctCtx(cs: List[Ctx]) : List[Ctx] = cs.distinctBy(c => zipBackToRegex(c))
+
+
+def simpleCtxDisplay(c: Ctx, indent : Int = 0) : String = c match {
+    case SeqC(m, pr, unp) => "Sc[m:" ++ printMem(m, indent + 1) ++ 
+        "pr:" ++ pr.map(v => shortValOutput(v)).mkString(", ") ++ " unp:" ++ unp.map(r2 => shortRexpOutput(r2)).mkString(", ") ++ "]"
+    case AltC(m, w) =>
+        w(Empty) match {
+            case Left(_) => s"Ac(m:${printMem(m, indent + 1)}, Left(_))"
+            case Right(_) => s"Ac(m:${printMem(m, indent + 1)}, Right(_))"
+            case Empty => s"Ac(m:${printMem(m, indent + 1)}, id)"
+        } 
+    case StarC(m, vs, r0) => s"StarC[m:" ++ printMem(m, indent + 1) ++ 
+        "vs:" ++ vs.map(v => shortValOutput(v)).mkString(", ") ++ " r0: " ++ shortRexpOutput(r0)
+    case RootC => "Root"
+    //case AL1(r) => s"(+${shortRexpOutput(r)})"
+    //case STAR(r) => "STAR(" ++ shortRexpOutput(r) ++ ")"
+    //case RTOP => "RTOP"
+  }
+
+def printMem(m: Mem, indent: Int = 0) : String = {
+   "M(par:" ++
+   m.parents.map(c => simpleCtxDisplay(c, indent + 1)).mkString("(",",", ")")  ++
+  (", results:")  ++
+  (for(iRexp <- m.result) 
+    yield iRexp match {case (p: Int, v: Val) => s"$p->${shortValOutput(v)}"}
+  ).mkString("(",",", ")")  ++ 
+   ")" 
+}
+
+def shortRexpOutput(r: Rexp) : String = r match {
+    case CHAR(c) => c.toString
+    case ONE => "1"
+    case ZERO => "0"
+    case SEQ(r1, r2) => "[" ++ shortRexpOutput(r1) ++ "~" ++ shortRexpOutput(r2) ++ "]"
+    case ALT(r1, r2) => "(" ++ shortRexpOutput(r1) ++ "+" ++ shortRexpOutput(r2) ++ ")"
+    case STAR(r) => "[" ++ shortRexpOutput(r) ++ "]*"
+    //case STAR(r) => "STAR(" ++ shortRexpOutput(r) ++ ")"
+    case RTOP => "RTOP"
+  }
+
+def shortValOutput(v: Val) : String = v match {
+    case Left(v) => "L(" ++ shortValOutput(v) ++ ")"
+    case Right(v) => "R(" ++ shortValOutput(v) ++ ")"
+    case Empty => "e"
+    case Sequ(v1, v2) => "[" ++ shortValOutput(v1) ++ "~" ++ shortValOutput(v2) ++ "]"
+    case Chr(a) => a.toString
+    case Stars(vs) => "Stars" ++ vs.map(shortValOutput(_)).mkString("[", ",", "]")
+    case _ => "???"
+}
+
+
 //def crystalizeZipper
 
-mems.clear()
-val re1 = ("a" | "aa").%
-val re1ss = lex(re1, "aaaaa")
+for(i <- 1 to 10) {
+    mems.clear()
+println(s"there are $i number of a's")
+val re1 = (("a" | "b") ~ "c" | ("b" | "e") ~ "c" ) ~ "f"//("a" | "aa" |"ab").%
+val re1Lexed = lex(re1, "bcf")//"a"*i+"b")
+
+//drawZippers(re1Lexed)
+println("size of actual zipper (including memoized contexts")
+println(actualZipperSize(re1Lexed))
+//println(re1Lexed)
+//re1Lexed.foreach(zipperSimp(_))
+//println(actualZipperSize(re1S))
+val re1resPlugged = plug_all(re1Lexed)
+//println(actualZipperSize(re1Lexed))
 
-//drawZippers(re1ss)
-println(actualZipperSize(re1ss))
-//println(re1ss)
-val re1S = zipperSimp(re1ss)
-//println(actualZipperSize(re1S))
+println("value extracted")
+re1resPlugged.foreach(v => {
+        val Sequ(Empty, vp) = v
+        println(vp)
+}
+)
 
+  val mb = 1024*1024
+val runtime = Runtime.getRuntime
+println("ALL RESULTS IN MB")
+println("** Used Memory:  " + (runtime.totalMemory - runtime.freeMemory) / mb)
+println("** Free Memory:  " + runtime.freeMemory / mb)
+println("** Total Memory: " + runtime.totalMemory / mb)
+println("** Max Memory:   " + runtime.maxMemory / mb)
+
+}
 
 mems.clear()
-val re2 = ALT("a", "bc")
+val re2 = SEQ(ONE, "a")
 val re2res = lex(re2, "a")
-// //lex(1~a, "a") --> lexRecurse((1v, m  (SeqC(m (RootC, Nil), Nil, [1~a] ) )))
+//lex(1~a, "a") --> lexRecurse((1v, m  (SeqC(m (RootC, Nil), Nil, [1~a] ) )))
 
 
 println(re2res)
 
 val re2resPlugged = plug_all(re2res)
- re2resPlugged.foreach(v => {
-         val Sequ(Empty, vp) = v
-         println(vp)
-}) 
+re2resPlugged.foreach(v => {
+        val Sequ(Empty, vp) = v
+        println(vp)
+}
+)
 
 // println("remaining regex")
 // println(re1ss.flatMap(z => zipBackMem(z._2)))