diff --git a/src/main/scala/esmeta/es/util/fuzzer/FSTree.scala b/src/main/scala/esmeta/es/util/fuzzer/FSTree.scala index 9fa10c9885..bfc615342f 100644 --- a/src/main/scala/esmeta/es/util/fuzzer/FSTree.scala +++ b/src/main/scala/esmeta/es/util/fuzzer/FSTree.scala @@ -63,6 +63,8 @@ class FSTreeWrapper( ) { val fixedSensMap = MMap.empty[List[String], Int] var root: FSTree = FSTree(status = FSTreeStatus.Noticed, depth = 0) + var rootHits: Long = 0 + var rootMisses: Long = 0 def sensDistr: Map[Int, Int] = root.stacks.groupBy(_.size).transform((_, v) => v.size).withDefault(_ => 0) @@ -107,6 +109,7 @@ class FSTreeWrapper( stacks.foreach { s => root.touchByStack(s.take(config.maxSensitivity), isHit = true) } + rootHits += stacks.size MinifyFuzz.sampler("FSTree.touch") += System.currentTimeMillis() - startTime /** Insert feature stacks from a single script into the tree. The script @@ -122,6 +125,7 @@ class FSTreeWrapper( stacks.foreach { s => root.touchByStack(s.take(config.maxSensitivity), isHit = false) } + rootMisses += stacks.size MinifyFuzz.sampler("FSTree.touch") += System.currentTimeMillis() - startTime def apply(stack: List[String]): Int = @@ -202,7 +206,12 @@ class FSTreeWrapper( isHit: Boolean, ): Unit = if isHit then hits += 1 else misses += 1 - updateMyChiSqValue() + + if (config.useLocalCorrelation) + updateMyLocalChiSqValue() + else + updateMyGlobalChiSqValue() + updateMyStatus() stack match { @@ -221,7 +230,7 @@ class FSTreeWrapper( } } - private def updateMyChiSqValue(): Unit = + private def updateMyLocalChiSqValue(): Unit = chiSqValue = computeFeatureChiSq( hits = hits, misses = misses, @@ -229,6 +238,14 @@ class FSTreeWrapper( pMisses = parentMisses, ) + private def updateMyGlobalChiSqValue(): Unit = + chiSqValue = computeFeatureChiSq( + hits = hits, + misses = misses, + pHits = rootHits, + pMisses = rootMisses, + ) + private def updateMyStatus(): Unit = status match { case Noticed => @@ -344,6 +361,7 @@ case class FSTreeConfig( oneSided: Boolean = true, isSelective: Boolean = true, useSrv: Boolean = true, + useLocalCorrelation: Boolean = false, ) /** Status of a node in the tree diff --git a/src/main/scala/esmeta/es/util/fuzzer/Fuzzer.scala b/src/main/scala/esmeta/es/util/fuzzer/Fuzzer.scala index fcb5dab90d..26e42dea1b 100644 --- a/src/main/scala/esmeta/es/util/fuzzer/Fuzzer.scala +++ b/src/main/scala/esmeta/es/util/fuzzer/Fuzzer.scala @@ -278,7 +278,6 @@ class Fuzzer( BuiltinSynthesizer(cfg.spec.algorithms).initPool .map(BuiltinSynthesizer(cfg.spec.algorithms).name -> _), ) - .take(42) lazy val logDir: String = s"$FUZZ_LOG_DIR/fuzz-$dateStr" lazy val symlink: String = s"$FUZZ_LOG_DIR/recent" diff --git a/src/main/scala/esmeta/phase/Fuzz.scala b/src/main/scala/esmeta/phase/Fuzz.scala index 74f77cee0d..a9b27945dc 100644 --- a/src/main/scala/esmeta/phase/Fuzz.scala +++ b/src/main/scala/esmeta/phase/Fuzz.scala @@ -9,7 +9,6 @@ import esmeta.es.* import esmeta.es.util.fuzzer.{Fuzzer, FSTreeConfig} import esmeta.es.util.{UnitWalker, Coverage, ValidityChecker} import esmeta.spec.util.GrammarGraph -import esmeta.synthesizer.{SimpleSynthesizer, BuiltinSynthesizer} import scala.collection.mutable.ArrayBuffer /** `fuzz` phase */ diff --git a/src/main/scala/esmeta/phase/MinifyFuzz.scala b/src/main/scala/esmeta/phase/MinifyFuzz.scala index 9b4f120c8c..e5f6b75d92 100644 --- a/src/main/scala/esmeta/phase/MinifyFuzz.scala +++ b/src/main/scala/esmeta/phase/MinifyFuzz.scala @@ -52,10 +52,14 @@ case object MinifyFuzz extends Phase[CFG, Coverage] { minTouch = config.fsMinTouch, oneSided = config.oneSided, isSelective = config.isSelectiveOpt - .getOrElse( - throw new Exception("sensitivity type is not set"), - ), + .getOrElse { + println( + "Sensitivity type is not set. Use selective by default.", + ) + true + }, useSrv = config.useSrv, + useLocalCorrelation = config.useLocalCorrelation, ), keepBugs = config.keepBugs, minifyCmd = config.minifier, @@ -194,6 +198,18 @@ case object MinifyFuzz extends Phase[CFG, Coverage] { BoolOption(c => c.useSrv = false), "use the CLI to transpile scripts (default: server).", ), + ( + "correlation-type", + StrOption((c, s) => + c.useLocalCorrelation = s match { + case "local" => true + case "global" => false + case _ => + error("invalid correlation type: please set local or global") + }, + ), + "set the correlation type: local or global", + ), ) case class Config( var log: Boolean = false, @@ -216,5 +232,6 @@ case object MinifyFuzz extends Phase[CFG, Coverage] { var minifier: Option[String] = None, var onlineTest: Boolean = false, var useSrv: Boolean = true, + var useLocalCorrelation: Boolean = false, ) }