Skip to content

Commit 877b5b0

Browse files
figtracerampagent
andauthored
feat(symbolic): summarize portfolio diagnostics (#14849)
* feat(symbolic): summarize portfolio diagnostics Amp-Thread-ID: https://ampcode.com/threads/T-019e4487-e080-741d-b8ab-62d5aa43573a Co-authored-by: Amp <amp@ampcode.com> * Address symbolic portfolio diagnostics review Amp-Thread-ID: https://ampcode.com/threads/T-019e3bf2-923d-727e-82f5-40ca3e956694 Co-authored-by: Amp <amp@ampcode.com> * Fix transaction request clippy warning Amp-Thread-ID: https://ampcode.com/threads/T-019e3bf2-923d-727e-82f5-40ca3e956694 Co-authored-by: Amp <amp@ampcode.com> * Revert "Fix transaction request clippy warning" This reverts commit 884799d. * Allow transaction request enum size lint Amp-Thread-ID: https://ampcode.com/threads/T-019e3bf2-923d-727e-82f5-40ca3e956694 Co-authored-by: Amp <amp@ampcode.com> * Disambiguate portfolio diagnostics re-export Amp-Thread-ID: https://ampcode.com/threads/T-019e3bf2-923d-727e-82f5-40ca3e956694 Co-authored-by: Amp <amp@ampcode.com> * Use enum for solver outcomes Amp-Thread-ID: https://ampcode.com/threads/T-019e3bf2-923d-727e-82f5-40ca3e956694 Co-authored-by: Amp <amp@ampcode.com> --------- Co-authored-by: Amp <amp@ampcode.com>
1 parent 7411445 commit 877b5b0

10 files changed

Lines changed: 391 additions & 60 deletions

File tree

crates/evm/symbolic/README.md

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,31 @@ For latency-sensitive local runs, start with a small portfolio such as
231231
can still use more CPU and be slower when one fast solver already handles most
232232
queries. `--symbolic-dump-smt` prints each solver's configured order and launch
233233
delay with the per-query portfolio outcomes so solver mixes can be compared
234-
without changing execution semantics.
234+
without changing execution semantics. It also prints an aggregate portfolio
235+
summary at the end of the run, for example:
236+
237+
```text
238+
--- symbolic solver portfolio summary ---
239+
queries: 48
240+
solver runs: 64
241+
rescue solver runs: 0
242+
not-started solver runs: 32
243+
non-primary wins: 0
244+
rescue wins: 0
245+
cancelled after winner: 0
246+
invalid models: 0
247+
solver errors: 0
248+
winner counts:
249+
yices-smt2 --bvconst-in-decimal: 48
250+
launch counts:
251+
yices-smt2 --bvconst-in-decimal: 48
252+
z3 -in -smt2: 16
253+
outcome counts:
254+
not-started: 32
255+
sat-valid: 32
256+
unsat: 32
257+
```
258+
235259
Forge warns when a configured portfolio is degraded because one or more solver
236260
entries are not available, but it still uses the entries that can be invoked.
237261

crates/evm/symbolic/src/executor.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ impl SymbolicExecutor {
1313
Self { config, solver: Box::new(solver) }
1414
}
1515

16+
/// Returns staged solver portfolio diagnostics collected by this executor.
17+
pub fn portfolio_diagnostics(&self) -> Option<PortfolioDiagnostics> {
18+
self.solver.portfolio_diagnostics().cloned()
19+
}
20+
1621
/// Executes one function symbolically against an already-deployed test contract.
1722
///
1823
/// The input executor supplies the deployed bytecode, storage backend, caller, and

crates/evm/symbolic/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ mod abi;
5555
mod executor;
5656
mod runtime;
5757

58-
pub use runtime::{SymbolicError, SymbolicRunInput};
58+
pub use runtime::{PortfolioDiagnostics, SymbolicError, SymbolicRunInput};
5959

6060
/// Symbolic solver names with built-in command-line mappings.
6161
pub const BUILTIN_SYMBOLIC_SOLVERS: &[&str] =

crates/evm/symbolic/src/runtime.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,16 @@ pub(crate) use evm::*;
1919
pub(crate) use expressions::*;
2020
pub(crate) use memory::*;
2121
pub(crate) use precompiles::*;
22-
pub(crate) use solver::*;
22+
pub use solver::PortfolioDiagnostics;
23+
pub(crate) use solver::{
24+
SmtLibSubprocessSolver, SymbolicSolver, solver_portfolio_availability_warning,
25+
};
26+
#[cfg(test)]
27+
pub(crate) use solver::{
28+
SolverCommand, SolverOutcome, SolverRunSummary, fallback_single_var_model,
29+
named_solver_command, parse_model, solver_commands_for_config, split_solver_command,
30+
validate_solver_model_output,
31+
};
2332
pub(crate) use state::*;
2433

2534
pub struct SymbolicRunInput<'a, FEN: FoundryEvmNetwork> {

0 commit comments

Comments
 (0)