Skip to content

Commit c44657d

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents 9d5a8d1 + 2bea12f commit c44657d

24 files changed

Lines changed: 536 additions & 461 deletions

.dockerignore

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# SBT build artifacts
2+
target/
3+
project/target/
4+
project/project/
5+
6+
# IntelliJ / VSCode / Metals IDE metadata
7+
.idea/
8+
*.iml
9+
.vscode/
10+
.metals/
11+
.bloop/
12+
.bsp/
13+
14+
# Logs and caches
15+
*.log
16+
.history
17+
.cache/
18+
coursier-cache/
19+
.ivy2/
20+
21+
# OS/Tool-specific files
22+
.DS_Store
23+
Thumbs.db
24+
25+
# Test reports
26+
test-output/
27+
benchOutput/
28+
evaluationLogs/
29+
30+
# JARs or packaged files
31+
*.jar
32+
*.zip
33+
*.tgz
34+
35+
# Git-related
36+
.git/
37+
.gitignore

Dockerfile

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
FROM openjdk:17-slim
2+
3+
# install sbt
4+
RUN apt-get update && apt-get install curl gnupg -yqq
5+
RUN echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | tee /etc/apt/sources.list.d/sbt.list
6+
RUN echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | tee /etc/apt/sources.list.d/sbt_old.list
7+
RUN curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/scalasbt-release.gpg --import
8+
RUN chmod 644 /etc/apt/trusted.gpg.d/scalasbt-release.gpg
9+
RUN apt-get update && apt-get install -y sbt
10+
11+
# import the source code
12+
WORKDIR /source
13+
COPY . .
14+
15+
# setup the volume to store benchmark results
16+
VOLUME /results
17+
18+
# compile
19+
RUN sbt maf/compile

code/jvm/src/main/scala/maf/cli/experiments/SchemeAnalyses.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package maf.cli.experiments
22

33
import maf.language.scheme._
4+
import maf.modular.scheme.aam._
45
import maf.modular._
56
import maf.language.symbolic.lattices.*
67
import maf.modular.adaptive._
@@ -141,13 +142,23 @@ object SchemeAnalyses:
141142
}
142143
}
143144

145+
def aamGCAnalysis(prg: SchemeExp, k: Int) =
146+
new SchemeAAMGCAnalysis(prg, k)
147+
144148
def modflocalAnalysis(prg: SchemeExp, k: Int) =
145149
new SchemeModFLocal(prg)
146150
with SchemeConstantPropagationDomain
147151
with SchemeModFLocalCallSiteSensitivity(k)
148152
with FIFOWorklistAlgorithm[SchemeExp]
149153
with SchemeModFLocalAnalysisResults
150154

155+
def modflocalFSAnalysis(prg: SchemeExp, k: Int, gc: Boolean = true) =
156+
new SchemeModFLocalFS(prg, gc)
157+
with SchemeConstantPropagationDomain
158+
with SchemeModFLocalCallSiteSensitivity(k)
159+
with FIFOWorklistAlgorithm[SchemeExp]
160+
with SchemeModFLocalFSAnalysisResults
161+
151162
// Flow sensitive analysis
152163
def modFFlowSensitive(prg: SchemeExp) =
153164
new SimpleFlowSensitiveAnalysis(prg)

code/jvm/src/main/scala/maf/cli/experiments/aam/Performance.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package maf.cli.experiments.aam
22

33
import maf.cli.experiments.performance.*
4-
import scala.concurrent.duration._
54
import maf.aam.*
65
import maf.language.scheme.*
76
import maf.modular.Metric
@@ -55,7 +54,7 @@ object ScvPerformanceComparison extends AAMPerformanceComparison:
5554
override def maxWarmupRuns = 5
5655
override def analysisRuns = 20
5756

58-
override def analysisTime = Timeout.start(Duration(180, MINUTES)) // maximum time to spend *on a single analysis run*
57+
override def analysisTime = ??? //Timeout.start(Duration(180, MINUTES)) // maximum time to spend *on a single analysis run*
5958

6059
override def parseProgram(txt: String): SchemeExp =
6160
val result = SchemeBegin(ContractSchemeMutableVarBoxer.transform(List(ContractSchemeParser.parse(txt))), Identity.none)

code/jvm/src/main/scala/maf/cli/experiments/precision/AnalysisComparison.scala

Lines changed: 78 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package maf.cli.experiments.precision
22

3+
import maf.modular.scheme.aam._
34
import maf.cli.experiments._
45
import maf.language.scheme._
56
import maf.lattice._
67
import maf.lattice.interfaces.{BoolLattice, CharLattice, IntLattice, RealLattice, StringLattice, SymbolLattice}
78
import maf.util._
89
import maf.util.benchmarks._
10+
import maf.language.scheme.primitives.SchemePrelude
911

1012
import scala.concurrent.duration._
1113

@@ -19,10 +21,10 @@ abstract class AnalysisComparison[Num: IntLattice, Rea: RealLattice, Bln: BoolLa
1921
def otherAnalyses(): List[(SchemeExp => Analysis, String)]
2022

2123
// and can, optionally, be configured in its timeouts (default: 5min.)
22-
def analysisTimeout(): Timeout.T = Timeout.start(Duration(45, MINUTES)) //timeout for (non-base) analyses
23-
def concreteTimeout(): Timeout.T = Timeout.none //timeout for concrete interpreter
24+
def analysisTimeout(): Timeout.T = Timeout.start(Duration(30, SECONDS)) //timeout for (non-base) analyses
25+
def concreteTimeout(): Timeout.T = Timeout.start(Duration(30, SECONDS)) //timeout for concrete interpreter
2426

25-
def concreteRuns() = 5
27+
def concreteRuns() = 3
2628

2729
// keep the results of the benchmarks in a table
2830
var results: Table[Option[Int]] = Table.empty[Option[Int]]
@@ -63,38 +65,86 @@ object AnalysisComparison1
6365
ConstantPropagation.S,
6466
ConstantPropagation.Sym
6567
]:
68+
6669
val k = 0
67-
val l = 1000
70+
71+
lazy val aam: (SchemeExp => Analysis, String) = (new SchemeAAMGCAnalysis(_, k), s"$k-CFA AAM")
72+
lazy val dss: (SchemeExp => Analysis, String) = (SchemeAnalyses.modflocalAnalysis(_, k), s"$k-CFA DSS")
73+
6874
def baseAnalysis(prg: SchemeExp): Analysis =
69-
SchemeAnalyses.kCFAAnalysis(prg, k)
70-
def otherAnalyses() =
71-
// run some regular k-cfa analyses
75+
SchemeAnalyses.contextInsensitiveAnalysis(prg) //context-insensitive analysis
76+
def otherAnalyses() = aam :: dss :: Nil
77+
78+
def gambit = List("array1.scm",
79+
"deriv.scm",
80+
// "graphs.scm",
81+
"nqueens.scm",
82+
"puzzle.scm",
83+
"sum.scm",
84+
"triangl.scm",
85+
"browse.scm",
86+
"destruc.scm",
87+
"lattice.scm",
88+
"paraffins.scm",
89+
"sboyer.scm",
90+
"sumloop.scm",
91+
"wc.scm",
92+
"cat.scm",
93+
"diviter.scm",
94+
"matrix.scm",
95+
"perm9.scm",
96+
"scheme.scm",
97+
"tail.scm",
98+
"compiler.scm",
99+
"earley.scm",
100+
"mazefun.scm",
101+
"peval.scm",
102+
"slatex.scm",
103+
"tak.scm",
104+
"ctak.scm",
105+
"fibc.scm",
106+
"nboyer.scm",
107+
"primes.scm",
108+
"string.scm",
109+
"trav1.scm"
110+
).map(file => s"test/R5RS/various/$file")
111+
112+
def gabriel = List(
113+
"boyer",
114+
"browse",
115+
"cpstak",
116+
"dderiv",
117+
"deriv",
118+
"destruc",
119+
"diviter",
120+
"divrec",
121+
"puzzle",
122+
"takl",
123+
"triangl"
124+
).map(name => s"test/R5RS/gabriel/$name.scm")
125+
126+
def sas2025 =
72127
List(
73-
//(SchemeAnalyses.modflocalAnalysis(_, 0), "0-CFA DSS"),
74-
//(SchemeAnalyses.modflocalAnalysisAdaptiveA(_, k, l), s"$k-CFA DSS w/ ASW (l = $l)")
128+
"test/R5RS/gambit/deriv.scm",
129+
"test/R5RS/gambit/tak.scm",
130+
"test/R5RS/various/grid.scm",
131+
"test/R5RS/various/regex.scm",
132+
"test/R5RS/various/rsa.scm"
75133
)
76134

77-
def main(args: Array[String]) = runBenchmarks(
78-
Set(
79-
"test/R5RS/various/mceval.scm"
80-
)
81-
)
82-
83-
def check(path: Benchmark) =
84-
val txt = Reader.loadFile(path)
85-
val prg = SchemeParser.parseProgram(txt)
86-
val con = runInterpreter(prg, path).get
87-
val Terminated(abs) = runAnalysis(SchemeAnalyses.fullArgContextSensitiveAnalysis(_), "analysis", prg, path)
88-
val allKeys = con.keys ++ abs.keys
89-
allKeys.foreach { k =>
90-
val absVal = abs.getOrElse(k, "")
91-
val concVal = con.getOrElse(k, "")
92-
if absVal != concVal then println(s"$k -> $absVal ; $concVal ")
93-
}
94135

95-
def runBenchmarks(benchmarks: Set[Benchmark]) =
136+
def main(args: Array[String]) = runBenchmarks(sas2025)
137+
138+
override def parseProgram(txt: String): SchemeExp =
139+
val parsed = SchemeParser.parse(txt)
140+
val prelud = SchemePrelude.addPrelude(parsed, incl = Set("__toplevel_cons", "__toplevel_cdr", "__toplevel_set-cdr!"))
141+
val transf = SchemeMutableVarBoxer.transform(prelud)
142+
SchemeParser.undefine(transf)
143+
144+
def runBenchmarks(benchmarks: List[Benchmark]) =
145+
assert(benchmarks.size == benchmarks.toSet.size)
96146
benchmarks.foreach(runBenchmark)
97147
println(results.prettyString(format = _.map(_.toString()).getOrElse("TIMEOUT")))
98-
val writer = Writer.open("benchOutput/precision/adaptive-precision-benchmarks.csv")
148+
val writer = Writer.open("benchOutput/precision/precision-benchmarks.csv")
99149
Writer.write(writer, results.toCSVString(format = _.map(_.toString()).getOrElse("TIMEOUT"), rowName = "benchmark"))
100150
Writer.close(writer)

0 commit comments

Comments
 (0)