Skip to content

Commit a50e349

Browse files
author
Martin Jonáš
committed
merge submissions
#189: UltimateEliminator submission 2025 #188: Z3-Siri Submission 2025 #187: OSTRICH version 2 #186: yicesQS submission to the 2025 SMT comp #185: Bitwuzla 2025 submission. #184: Yices2 Submission SMTCOMP 2025 #183: cvc5 for SMT-COMP 2025 #182: Create iProver #181: Z3-Owl Submission 2025 #179: Z3-alpha SMT-COMP 2025 #178: Z3-Noodler-Mocha Submission for SMT-COMP 2025 #177: `bv_decide` submission 2025 #176: OpenSMT (min-ucore) submission 2025 #175: Z3-Noodler submission 2025 #172: SMTS submission 2025 #171: Bitwuzla-MachBV Submission for SMT-COMP 2025 #170: Z3-Parti-Z3++ Submission for SMT-COMP 2025 #169: STP-Parti-Bitwuzla Submission for SMT-COMP 2025 #168: SMTInterpol submission 2025 #167: OpenSMT submission 2025 #165: Amaya 2025 #164: SMT-RAT submission #163: COLIBRI submission #162: [Submission] colibri2 #156: upload z3-inc-z3++
26 parents f55066f + f765394 + fe5b442 + 7b228da + c596849 + 45f86e6 + 1b11a64 + 025abe9 + f84a566 + 2d44bf7 + 68dd9b1 + a5d65c7 + bd881ff + 4b9df71 + cfeb4d0 + 5d5d6a1 + 4c1131c + 8fa14b5 + 103b24e + 9c86c28 + c98ef10 + 5818110 + 77efcab + af50527 + d3208d9 + b469968 commit a50e349

40 files changed

+1391
-45
lines changed

archive/2024/participants/index.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,9 @@
6767
David Chocholatý,
6868
Lukáš Holík,
6969
Ondřej Lengál</td><td><a href="https://drive.google.com/uc?export=download&amp;id=1XSj2PiVJLDx-JQyJRt76OEloC0dWFJqH">Archive</a></td><td><a href=https://github.com/VeriFIT/z3-noodler/blob/devel/doc/noodler/z3-noodler-system-description-2024.pdf>System description</a></td></tr><tr><td><a href=https://github.com/shaowei-cai-group/Z3-Parti-Z3pp-at-SMT-COMP-2024>Z3-Parti-Z3++</a></td><td></td><td></td><td></td><td></td><td>X</td><td>X</td><td class=authors>Mengyu Zhao,
70-
Shaowei Cai</td><td><a href=https://zenodo.org/records/11627838/files/Z3-Parti-Z3++.zip>Archive</a></td><td><a href=https://github.com/shaowei-cai-group/Z3-Parti-Z3pp-at-SMT-COMP-2024/blob/master/Z3_Parti_Z3pp_at_SMT_COMP_2024.pdf>System description</a></td></tr></tbody></table></section><footer></footer></div></body></html>
70+
Shaowei Cai</td><td><a href=https://zenodo.org/records/11627838/files/Z3-Parti-Z3++.zip>Archive</a></td><td><a href=https://github.com/shaowei-cai-group/Z3-Parti-Z3pp-at-SMT-COMP-2024/blob/master/Z3_Parti_Z3pp_at_SMT_COMP_2024.pdf>System description</a></td></tr></tbody></table>
71+
72+
The opening value of the NYSE Composite Index on 2024-06-17 was 17817.26, resulting in a competition seed of 17817 + 42417166 = <b>42434983</b>.
73+
</section><footer></footer>
74+
</div>
75+
</body></html>

archive/2024/results/index.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

smtcomp/defs.py

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,8 +1227,6 @@ class Participation(BaseModel, extra="forbid"):
12271227
divisions: add all the logics of those divisions in each track
12281228
logics: add all the specified logics in each selected track it exists
12291229
1230-
aws_repository should be used only in conjunction with Cloud and Parallel track
1231-
12321230
archive and command should not be used with Cloud and Parallel track. They superseed the one given at the root.
12331231
"""
12341232

@@ -1237,18 +1235,10 @@ class Participation(BaseModel, extra="forbid"):
12371235
divisions: list[Division] = []
12381236
archive: Archive | None = None
12391237
command: Command | None = None
1240-
aws_repository: str | None = None
12411238
experimental: bool = False
12421239

12431240
@model_validator(mode="after")
12441241
def check_archive(self) -> Participation:
1245-
aws_track = {Track.Cloud, Track.Parallel}
1246-
if self.aws_repository is None and not set(self.tracks).isdisjoint(aws_track):
1247-
raise ValueError("aws_repository is required by Cloud and Parallel track")
1248-
if self.aws_repository is not None and not set(self.tracks).issubset(aws_track):
1249-
raise ValueError("aws_repository can be used only with Cloud and Parallel track")
1250-
if (self.archive is not None or self.command is not None) and not set(self.tracks).isdisjoint(aws_track):
1251-
raise ValueError("archive and command field can't be used with Cloud and Parallel track")
12521242
return self
12531243

12541244
def get(self, d: None | dict[Track, dict[Division, set[Logic]]] = None) -> dict[Track, dict[Division, set[Logic]]]:
@@ -1274,8 +1264,6 @@ def get_logics_by_track(self) -> dict[Track, set[Logic]]:
12741264
def complete(self, archive: Archive | None, command: Command | None) -> ParticipationCompleted:
12751265
archive = cast(Archive, archive if self.archive is None else self.archive)
12761266
command = cast(Command, command if self.command is None else self.command)
1277-
if (self.aws_repository is not None) or set(self.tracks).issubset({Track.Cloud, Track.Parallel}):
1278-
raise ValueError("can't complete Cloud and Parallel track participations")
12791267
return ParticipationCompleted(
12801268
tracks=self.get(), archive=archive, command=command, experimental=self.experimental
12811269
)
@@ -1339,14 +1327,10 @@ class Submission(BaseModel, extra="forbid"):
13391327

13401328
@model_validator(mode="after")
13411329
def check_archive(self) -> Submission:
1342-
if self.archive is None and not all(p.archive or p.aws_repository for p in self.participations.root):
1343-
raise ValueError(
1344-
"Field archive (or aws_repository) is needed in all participations if not present at the root"
1345-
)
1346-
if self.command is None and not all(p.command or p.aws_repository for p in self.participations.root):
1347-
raise ValueError(
1348-
"Field command (or aws_repository) is needed in all participations if not present at the root"
1349-
)
1330+
if self.archive is None and not all(p.archive for p in self.participations.root):
1331+
raise ValueError("Field archive is needed in all participations if not present at the root")
1332+
if self.command is None and not all(p.command for p in self.participations.root):
1333+
raise ValueError("Field command is needed in all participations if not present at the root")
13501334

13511335
def check_archive(archive: None | Archive) -> None:
13521336
if archive:
@@ -1364,7 +1348,7 @@ def uniq_id(self) -> str:
13641348

13651349
def complete_participations(self) -> list[ParticipationCompleted]:
13661350
"""Push defaults from the submission into participations"""
1367-
return [p.complete(self.archive, self.command) for p in self.participations.root if p.aws_repository is None]
1351+
return [p.complete(self.archive, self.command) for p in self.participations.root]
13681352

13691353

13701354
class Smt2File(BaseModel):

smtcomp/generate_website_page.py

Lines changed: 163 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import math
12
import functools, itertools
2-
from typing import Set, Dict, Optional, cast, List, DefaultDict
3+
from collections import defaultdict
4+
from typing import Set, Dict, Optional, cast, List, DefaultDict, Tuple
35
from pathlib import Path, PurePath
46
from smtcomp import defs
57
from rich import progress
@@ -139,6 +141,38 @@ class PodiumSummaryResults(BaseModel):
139141
layout: Literal["results_summary"] = "results_summary"
140142

141143

144+
class PodiumStepOverallScore(BaseModel):
145+
name: str
146+
contribution: float_6dig # nn_D * log10 N_D
147+
division: str
148+
tieBreakTimeScore: float_6dig
149+
150+
151+
class PodiumBestOverall(BaseModel):
152+
resultdate: str
153+
year: int
154+
results: str
155+
participants: str
156+
track: track_name
157+
recognition: Literal["best_overall"] = "best_overall"
158+
winner_seq: str
159+
winner_par: str
160+
winner_sat: str
161+
winner_unsat: str
162+
winner_24s: str
163+
winner_seq_score: float_6dig
164+
winner_par_score: float_6dig
165+
winner_sat_score: float_6dig
166+
winner_unsat_score: float_6dig
167+
winner_24s_score: float_6dig
168+
sequential: list[PodiumStepOverallScore]
169+
parallel: list[PodiumStepOverallScore]
170+
sat: list[PodiumStepOverallScore]
171+
unsat: list[PodiumStepOverallScore]
172+
twentyfour: list[PodiumStepOverallScore]
173+
layout: Literal["result_comp"] = "result_comp"
174+
175+
142176
class PodiumStepBiggestLead(BaseModel):
143177
name: str
144178
second: str
@@ -367,7 +401,7 @@ def get_kind(a: PodiumDivision, k: smtcomp.scoring.Kind) -> list[PodiumStep]:
367401

368402

369403
# Computes the new global ranking based on the distance between the winner of a
370-
# division and the second solver in a division as defined in secion 7.3.1 of
404+
# division and the second solver in a division as defined in section 7.3.1 of
371405
# the SMT-COMP'19 rules.
372406
#
373407
# data : The podium as returned by process_csv.
@@ -456,6 +490,130 @@ def get_winner(l: List[PodiumStepBiggestLead] | None) -> str:
456490
)
457491

458492

493+
# Compute normalized correctness score
494+
#
495+
# normalized correctness score: nnD = (nD /ND)**2 if eD == 0
496+
# = -2 otherwise
497+
def normalized_correctness_score(
498+
data: dict[str, PodiumDivision], scores: pl.LazyFrame, track: defs.Track, k: smtcomp.scoring.Kind
499+
) -> list[PodiumStepOverallScore]:
500+
501+
podiumSteps: list[PodiumStepOverallScore] = []
502+
503+
for division, div_data in data.items():
504+
solvers_in_div = get_kind(div_data, k)
505+
if len(solvers_in_div) <= 1:
506+
continue
507+
508+
N_D = get_N_D(scores, data, division, track)
509+
for sol_in_div in solvers_in_div:
510+
if sol_in_div.errorScore == 0:
511+
nn_D = (sol_in_div.correctScore / N_D) ** 2
512+
else:
513+
nn_D = -2
514+
515+
podiumSteps.append(
516+
PodiumStepOverallScore(
517+
name=sol_in_div.name,
518+
contribution=nn_D * (math.log10(N_D) if N_D > 0 else 0),
519+
tieBreakTimeScore=sol_in_div.CPUScore if k == smtcomp.scoring.Kind.seq else sol_in_div.WallScore,
520+
division=division,
521+
)
522+
)
523+
podiumSteps = sorted(podiumSteps, key=lambda x: (x.contribution, x.tieBreakTimeScore), reverse=True)
524+
return podiumSteps
525+
526+
527+
# N_D := total number of check sats in division D if Incremental Track
528+
# total number of asserts in division D if Unsat Core Track
529+
# total number of benchmarks otherwise
530+
def get_N_D(scores: pl.LazyFrame, data: dict[str, PodiumDivision], division: str, track: defs.Track) -> int:
531+
if track == defs.Track.Incremental:
532+
return int(
533+
scores.unique(["division", "file"])
534+
.group_by(["division"])
535+
.agg([pl.col("check_sats").sum().alias("total_check_sats")])
536+
.filter(pl.col("division") == int(defs.Division[division]))
537+
.collect()["total_check_sats"][0]
538+
)
539+
540+
elif track == defs.Track.UnsatCore:
541+
return int(
542+
scores.unique(["division", "file"])
543+
.group_by(["division"])
544+
.agg([pl.col("asserts").sum().alias("total_asserts")])
545+
.filter(pl.col("division") == int(defs.Division[division]))
546+
.collect()["total_asserts"][0]
547+
)
548+
549+
return data[division].n_benchmarks
550+
551+
552+
# Computes the best overall ranking as specified in Section 7.3.1 of
553+
# SMT-COMP 2025 rules. I.e:
554+
#
555+
# normalized correctness score: nnD = (nD /ND)**2 if eD == 0
556+
# = -2 otherwise
557+
# overall score : sum_D nnD*log10 ND
558+
#
559+
# For the choices, see the footnote in the rules.
560+
#
561+
def best_overall_ranking(
562+
config: defs.Config, scores: pl.LazyFrame, data: dict[str, PodiumDivision], track: defs.Track
563+
) -> PodiumBestOverall:
564+
def get_winner(
565+
l: Optional[List[PodiumStepOverallScore]],
566+
scores: pl.LazyFrame,
567+
data: dict[str, PodiumDivision],
568+
track: defs.Track,
569+
) -> Tuple[str, float]:
570+
if l is None or not l:
571+
return ("-", 0.0)
572+
else:
573+
podium: DefaultDict[str, Dict[str, float]] = defaultdict(lambda: {"score": 0.0, "tie_break_time": 0.0})
574+
for entry in l:
575+
podium[entry.name]["score"] += entry.contribution
576+
podium[entry.name]["tie_break_time"] += entry.tieBreakTimeScore
577+
winner, winner_data = max(podium.items(), key=lambda item: (item[1]["score"], -item[1]["tie_break_time"]))
578+
return (winner, winner_data["score"])
579+
580+
sequential = normalized_correctness_score(data, scores, track, smtcomp.scoring.Kind.seq)
581+
parallel = normalized_correctness_score(data, scores, track, smtcomp.scoring.Kind.par)
582+
sat = normalized_correctness_score(data, scores, track, smtcomp.scoring.Kind.sat)
583+
unsat = normalized_correctness_score(data, scores, track, smtcomp.scoring.Kind.unsat)
584+
twentyfour = normalized_correctness_score(data, scores, track, smtcomp.scoring.Kind.twentyfour)
585+
586+
if track in (defs.Track.Cloud, defs.Track.Parallel):
587+
winner_seq = ("-", 0.0)
588+
sequential = []
589+
else:
590+
winner_seq = get_winner(sequential, scores, data, track)
591+
592+
return PodiumBestOverall(
593+
resultdate="2024-07-08",
594+
year=config.current_year,
595+
track=track,
596+
results=f"results_{config.current_year}",
597+
participants=f"participants_{config.current_year}",
598+
recognition="best_overall",
599+
winner_seq=winner_seq[0],
600+
winner_par=get_winner(parallel, scores, data, track)[0],
601+
winner_sat=get_winner(sat, scores, data, track)[0],
602+
winner_unsat=get_winner(unsat, scores, data, track)[0],
603+
winner_24s=get_winner(twentyfour, scores, data, track)[0],
604+
winner_seq_score=winner_seq[1],
605+
winner_par_score=get_winner(parallel, scores, data, track)[1],
606+
winner_sat_score=get_winner(sat, scores, data, track)[1],
607+
winner_unsat_score=get_winner(unsat, scores, data, track)[1],
608+
winner_24s_score=get_winner(twentyfour, scores, data, track)[1],
609+
sequential=sequential,
610+
parallel=parallel,
611+
sat=sat,
612+
unsat=unsat,
613+
twentyfour=twentyfour,
614+
)
615+
616+
459617
def largest_contribution_ranking(
460618
config: defs.Config,
461619
virtual_datas: Dict[str, PodiumDivision],
@@ -634,6 +792,9 @@ def export_results(config: defs.Config, selection: pl.LazyFrame, results: pl.Laz
634792
all_divisions.append(data)
635793

636794
if for_division:
795+
data_best_overall = best_overall_ranking(config, scores, datas, track)
796+
(dst / f"best-overall-{page_suffix}.md").write_text(data_best_overall.model_dump_json(indent=1))
797+
637798
bigdata = biggest_lead_ranking(config, datas, track)
638799
(dst / f"biggest-lead-{page_suffix}.md").write_text(bigdata.model_dump_json(indent=1))
639800

smtcomp/test_generation.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,20 @@ def compute_results_read_podium_division(
176176
(config.web_results / f"{logic.name.lower()}-{page_suffix}.md").read_text()
177177
)
178178
return podium
179+
180+
181+
def compute_results_read_podium_best_overall(
182+
config: defs.Config, track: defs.Track, check_sound_solvers: list[str] = []
183+
) -> smtcomp.generate_website_page.PodiumBestOverall:
184+
185+
results, selection = smtcomp.results.helper_get_results(config, [], track)
186+
if check_sound_solvers:
187+
scores = smtcomp.scoring.add_disagreements_info(results, track)
188+
sound_solvers = scores.filter(sound_solver=True).select("solver").unique().collect()["solver"].sort().to_list()
189+
assert sound_solvers == check_sound_solvers
190+
smtcomp.generate_website_page.export_results(config, selection, results, track)
191+
page_suffix = smtcomp.generate_website_page.page_track_suffix(track)
192+
podium = smtcomp.generate_website_page.PodiumBestOverall.model_validate_json(
193+
(config.web_results / f"best-overall-{page_suffix}.md").read_text()
194+
)
195+
return podium

submissions/Amaya.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"name": "Amaya",
3+
"contributors": [
4+
"Vojtěch Havlena", "Michal Hečko", "Lukáš Holík", "Ondřej Lengál"
5+
],
6+
"contacts": ["Michal Hečko <[email protected]>", "Ondřej Lengál <[email protected]>"],
7+
"archive": {
8+
"url": "https://zenodo.org/records/15630432/files/amaya-smtcomp25-v2.tar.gz",
9+
"h": { "sha256": "133058d14b7cb1ef45261e9d02ef3e6f76589dd3551c73870e318e2d3a75ad54" }
10+
},
11+
"website": "https://github.com/MichalHe/amaya",
12+
"system_description": "https://raw.githubusercontent.com/VeriFIT/amaya-smt-comp/master/system-description-2025/main.pdf",
13+
"command": ["amaya/run.sh"],
14+
"solver_type": "Standalone",
15+
"seed": "587087",
16+
"participations": [
17+
{
18+
"tracks": ["SingleQuery"],
19+
"logics": ["LIA", "NIA"]
20+
}
21+
]
22+
}

submissions/Bitwuzla-0-7-0.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"name": "Bitwuzla-0-7-0",
3+
"archive": {
4+
"url": "https://zenodo.org/records/15649785/files/Bitwuzla-0-7-0.zip"
5+
},
6+
"contributors": ["Aina Niemetz", "Mathias Preiner"],
7+
"contacts": ["Mathias Preiner <[email protected]>"],
8+
"website": "https://bitwuzla.github.io",
9+
"system_description": "https://link.springer.com/content/pdf/10.1007/978-3-031-37703-7_1",
10+
"command": [ "./bitwuzla" ],
11+
"solver_type": "Standalone",
12+
"seed": 42,
13+
"participations": [
14+
{ "tracks": ["SingleQuery"], "logics": "QF_BV" }
15+
],
16+
"competitive": false
17+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"name": "Bitwuzla-MachBV",
3+
"contributors": [
4+
"Xiang Zhang",
5+
"Shaohuang Chen",
6+
"Mengyu Zhao",
7+
"Shaowei Cai"
8+
],
9+
"contacts": [
10+
"Xiang Zhang <[email protected]>"
11+
],
12+
"archive": {
13+
"url": "https://zenodo.org/records/15642045/files/Bitwuzla-MachBV.zip"
14+
},
15+
"website": "https://github.com/Andeviking/Bitwuzla-MachBV-at-SMT-COMP-2025",
16+
"system_description": "https://github.com/Andeviking/Bitwuzla-MachBV-at-SMT-COMP-2025/blob/main/Bitwuzla_MachBV_at_SMT_COMP_2025.pdf",
17+
"command": [
18+
"./MachBV"
19+
],
20+
"solver_type": "derived",
21+
"seed": "1126300213",
22+
"participations": [
23+
{
24+
"tracks": [
25+
"SingleQuery"
26+
],
27+
"logics": [
28+
"QF_BV"
29+
]
30+
}
31+
]
32+
}

submissions/COLIBRI.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"name": "COLIBRI",
3+
"contributors": [
4+
"Bruno Marre", "François Bobot", "Christophe Junke"
5+
],
6+
"contacts": ["Christophe Junke <[email protected]>"],
7+
"archive": {
8+
"url": "https://git.frama-c.com/pub/colibri/-/releases/2025.06/downloads/bundle-v5",
9+
"h": { "sha256": "f251f170c75a96af9ccde9859ac349e5c1cdd6fa6aeca779cb1ef4b9a8134871" }
10+
},
11+
"website": "http://colibri.frama-c.com/",
12+
"system_description": "https://colibri.frama-c.com/assets/documents/colibri_2025.pdf",
13+
"command": ["colibri-2025.06-v5/colibri", "--memlimit", "5000"],
14+
"solver_type": "Standalone",
15+
"participations": [
16+
{
17+
"tracks": ["SingleQuery"],
18+
"logics": "QF_.*FP.*"
19+
}
20+
],
21+
"seed": 0
22+
}

0 commit comments

Comments
 (0)