Skip to content

Add a new delegate to allow API tracing #505

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 27 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
0e4656f
Trace: Add API tracing
daniel-raffler Aug 14, 2025
f7ef298
Trace: Apply error-prone patch
daniel-raffler Aug 14, 2025
9acb1d7
Trace: Fix checkstyle issues
daniel-raffler Aug 14, 2025
63f2864
Trace: Log prover creation
daniel-raffler Aug 14, 2025
0b0e604
Trace: Write trace directly to a file
daniel-raffler Aug 15, 2025
4080a59
Trace: Fix prefix in ArrayFormulaManager.equivalence
daniel-raffler Aug 15, 2025
40d81d2
Trace: Use full path when printing ProverOptions in the trace
daniel-raffler Aug 15, 2025
84c7143
Trace: Log creation of the solver context
daniel-raffler Aug 15, 2025
28575eb
Trace: Log access to the model
daniel-raffler Aug 15, 2025
e7dfc70
Trace: Apply error-prone patch
daniel-raffler Aug 15, 2025
010fb1e
Trace: Remove ;
daniel-raffler Aug 15, 2025
8ac6c0c
Trace: Add "resource" annotation for TraceModel.getModel
daniel-raffler Aug 15, 2025
d2958ed
Trace: Add a superclass TraceBasicProverEnvironment for TraceProverEn…
daniel-raffler Aug 15, 2025
fb252cd
Trace: Apply error-prone patch
daniel-raffler Aug 15, 2025
fef1635
Trace: Add bitvector support
daniel-raffler Aug 19, 2025
cb7a7d2
Trace: Add floating point support
daniel-raffler Aug 19, 2025
7c432fc
Trace: Specify the solver backend in the trace when creating a new co…
daniel-raffler Aug 19, 2025
c676391
Trace: Add a note
daniel-raffler Aug 19, 2025
299c901
Trace: Add printing support for ArrayFormulaTypes
daniel-raffler Aug 20, 2025
d229219
Trace: Catch I/O exceptions directly in the logger
daniel-raffler Aug 20, 2025
a187568
Trace: Add support for visitors
daniel-raffler Aug 20, 2025
0590364
Trace: Allow parsing and printing
daniel-raffler Aug 20, 2025
b0dd829
Trace: Fix checkstyle issue
daniel-raffler Aug 21, 2025
2ed82e5
Trace: Throw an exception when trying to get the variable for an obje…
daniel-raffler Aug 21, 2025
3ce7e7b
Trace: Make TraceLogger package-private
daniel-raffler Aug 21, 2025
2d35c3d
Trace: Add support for printing more formula types
daniel-raffler Aug 21, 2025
b273c25
Trace: Apply refaster patch
daniel-raffler Aug 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/org/sosy_lab/java_smt/SolverContextFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.sosy_lab.java_smt.delegate.logging.LoggingSolverContext;
import org.sosy_lab.java_smt.delegate.statistics.StatisticsSolverContext;
import org.sosy_lab.java_smt.delegate.synchronize.SynchronizedSolverContext;
import org.sosy_lab.java_smt.delegate.trace.TraceSolverContext;
import org.sosy_lab.java_smt.solvers.bitwuzla.BitwuzlaSolverContext;
import org.sosy_lab.java_smt.solvers.boolector.BoolectorSolverContext;
import org.sosy_lab.java_smt.solvers.cvc4.CVC4SolverContext;
Expand Down Expand Up @@ -95,6 +96,11 @@ public enum Solvers {
@Option(secure = true, description = "Apply additional checks to catch common user errors.")
private boolean useDebugMode = false;

@Option(
secure = true,
description = "Enable API tracing to record all calls to the JavaSMT library")
private boolean trace = false;

@Option(
secure = true,
description = "Counts all operations and interactions towards the SMT solver.")
Expand Down Expand Up @@ -230,6 +236,9 @@ public SolverContext generateContext(Solvers solverToCreate)
if (useDebugMode) {
context = new DebuggingSolverContext(solverToCreate, config, context);
}
if (trace) {
context = new TraceSolverContext(solverToCreate, config, context);
}
if (collectStatistics) {
// statistics need to be the most outer wrapping layer.
context = new StatisticsSolverContext(context);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/*
* This file is part of JavaSMT,
* an API wrapper for a collection of SMT solvers:
* https://github.com/sosy-lab/java-smt
*
* SPDX-FileCopyrightText: 2025 Dirk Beyer <https://www.sosy-lab.org>
*
* SPDX-License-Identifier: Apache-2.0
*/

package org.sosy_lab.java_smt.delegate.trace;

import org.sosy_lab.java_smt.api.ArrayFormula;
import org.sosy_lab.java_smt.api.ArrayFormulaManager;
import org.sosy_lab.java_smt.api.BooleanFormula;
import org.sosy_lab.java_smt.api.Formula;
import org.sosy_lab.java_smt.api.FormulaType;

@SuppressWarnings("MethodTypeParameterName")
public class TraceArrayFormulaManager implements ArrayFormulaManager {
private final ArrayFormulaManager delegate;
private final TraceLogger logger;

TraceArrayFormulaManager(ArrayFormulaManager pDelegate, TraceLogger pLogger) {
delegate = pDelegate;
logger = pLogger;
}

@Override
public <TI extends Formula, TE extends Formula> TE select(
ArrayFormula<TI, TE> pArray, TI pIndex) {
return logger.logDef(
"mgr.getArrayFormulaManager()",
String.format("select(%s, %s)", logger.toVariable(pArray), logger.toVariable(pIndex)),
() -> delegate.select(pArray, pIndex));
}

@Override
public <TI extends Formula, TE extends Formula> ArrayFormula<TI, TE> store(
ArrayFormula<TI, TE> pArray, TI pIndex, TE pValue) {
return logger.logDef(
"mgr.getArrayFormulaManager()",
String.format(
"store(%s, %s, %s)",
logger.toVariable(pArray), logger.toVariable(pIndex), logger.toVariable(pValue)),
() -> delegate.store(pArray, pIndex, pValue));
}

@Override
public <
TI extends Formula,
TE extends Formula,
FTI extends FormulaType<TI>,
FTE extends FormulaType<TE>>
ArrayFormula<TI, TE> makeArray(String pName, FTI pIndexType, FTE pElementType) {
return logger.logDef(
"mgr.getArrayFormulaManager()",
String.format(
"makeArray(\"%s\", %s, %s)",
pName, logger.printFormulaType(pIndexType), logger.printFormulaType(pElementType)),
() -> delegate.makeArray(pName, pIndexType, pElementType));
}

@Override
public <
TI extends Formula,
TE extends Formula,
FTI extends FormulaType<TI>,
FTE extends FormulaType<TE>>
ArrayFormula<TI, TE> makeArray(FTI pIndexType, FTE pElementType, TE defaultElement) {
throw new UnsupportedOperationException();
}

@Override
public <TI extends Formula, TE extends Formula> BooleanFormula equivalence(
ArrayFormula<TI, TE> pArray1, ArrayFormula<TI, TE> pArray2) {
return logger.logDef(
"mgr.getArrayFormulaManager()",
String.format(
"equivalence(%s, %s)", logger.toVariable(pArray1), logger.toVariable(pArray2)),
() -> delegate.equivalence(pArray1, pArray2));
}

@Override
public <TI extends Formula> FormulaType<TI> getIndexType(ArrayFormula<TI, ?> pArray) {
return delegate.getIndexType(pArray);
}

@Override
public <TE extends Formula> FormulaType<TE> getElementType(ArrayFormula<?, TE> pArray) {
return delegate.getElementType(pArray);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/*
* This file is part of JavaSMT,
* an API wrapper for a collection of SMT solvers:
* https://github.com/sosy-lab/java-smt
*
* SPDX-FileCopyrightText: 2025 Dirk Beyer <https://www.sosy-lab.org>
*
* SPDX-License-Identifier: Apache-2.0
*/

package org.sosy_lab.java_smt.delegate.trace;

import java.util.Collection;
import java.util.List;
import java.util.Optional;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.sosy_lab.java_smt.api.BasicProverEnvironment;
import org.sosy_lab.java_smt.api.BooleanFormula;
import org.sosy_lab.java_smt.api.Model;
import org.sosy_lab.java_smt.api.SolverException;

public class TraceBasicProverEnvironment<T> implements BasicProverEnvironment<T> {
private final BasicProverEnvironment<T> delegate;
private final TraceLogger logger;

TraceBasicProverEnvironment(BasicProverEnvironment<T> pDelegate, TraceLogger pLogger) {
delegate = pDelegate;
logger = pLogger;
}

@Override
public void pop() {
logger.logStmt(logger.toVariable(this), "pop()", delegate::pop);
}

@Override
public @Nullable T addConstraint(BooleanFormula constraint) throws InterruptedException {
return logger.logDef(
logger.toVariable(this),
String.format("addConstraint(%s)", logger.toVariable(constraint)),
() -> delegate.addConstraint(constraint));
}

@Override
public void push() throws InterruptedException {
logger.logStmt(logger.toVariable(this), "push()", delegate::push);
}

@Override
public int size() {
return delegate.size();
}

@Override
public boolean isUnsat() throws SolverException, InterruptedException {
return logger.logDef(logger.toVariable(this), "isUnsat()", delegate::isUnsat);
}

@Override
public boolean isUnsatWithAssumptions(Collection<BooleanFormula> assumptions)
throws SolverException, InterruptedException {
throw new UnsupportedOperationException();
}

@SuppressWarnings("resource")
@Override
public Model getModel() throws SolverException {
return logger.logDef(
logger.toVariable(this), "getModel()", () -> new TraceModel(delegate.getModel(), logger));
}

@Override
public List<BooleanFormula> getUnsatCore() {
throw new UnsupportedOperationException();
}

@Override
public Optional<List<BooleanFormula>> unsatCoreOverAssumptions(
Collection<BooleanFormula> assumptions) throws SolverException, InterruptedException {
throw new UnsupportedOperationException();
}

@Override
public void close() {
logger.logStmt(logger.toVariable(this), "close()", delegate::close);
}

@Override
public <R> R allSat(AllSatCallback<R> callback, List<BooleanFormula> important)
throws InterruptedException, SolverException {
throw new UnsupportedOperationException();
}
}
Loading