Skip to content

Commit eb7fd9e

Browse files
Add virtual translate method to solver_factory class (#7780)
* Initial plan * Add virtual translate method to solver_factory base class and all implementations Co-authored-by: NikolajBjorner <[email protected]> * Add documentation for the translate method in solver_factory Co-authored-by: NikolajBjorner <[email protected]> --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: NikolajBjorner <[email protected]>
1 parent 237891c commit eb7fd9e

File tree

5 files changed

+32
-0
lines changed

5 files changed

+32
-0
lines changed

src/smt/smt_solver.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,10 @@ class smt_solver_factory : public solver_factory {
527527
solver * operator()(ast_manager & m, params_ref const & p, bool proofs_enabled, bool models_enabled, bool unsat_core_enabled, symbol const & logic) override {
528528
return mk_smt_solver(m, p, logic);
529529
}
530+
531+
solver_factory* translate(ast_manager& m) override {
532+
return alloc(smt_solver_factory);
533+
}
530534
};
531535
}
532536

src/solver/combined_solver.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,12 @@ class combined_solver_factory : public solver_factory {
424424
(*m_f2)(m, p, proofs_enabled, models_enabled, unsat_core_enabled, logic),
425425
p);
426426
}
427+
428+
solver_factory* translate(ast_manager& m) override {
429+
solver_factory* translated_f1 = m_f1->translate(m);
430+
solver_factory* translated_f2 = m_f2->translate(m);
431+
return alloc(combined_solver_factory, translated_f1, translated_f2);
432+
}
427433
};
428434

429435
solver_factory * mk_combined_solver_factory(solver_factory * f1, solver_factory * f2) {

src/solver/solver.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ class solver_factory {
3232
public:
3333
virtual ~solver_factory() = default;
3434
virtual solver * operator()(ast_manager & m, params_ref const & p, bool proofs_enabled, bool models_enabled, bool unsat_core_enabled, symbol const & logic) = 0;
35+
/**
36+
\brief Create a clone of the solver factory for the given ast_manager.
37+
The clone should be functionally equivalent but associated with the target manager.
38+
*/
39+
virtual solver_factory* translate(ast_manager& m) = 0;
3540
};
3641

3742
solver_factory * mk_smt_strategic_solver_factory(symbol const & logic = symbol::null);

src/solver/tactic2solver.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,11 @@ class tactic2solver_factory : public solver_factory {
390390
solver * operator()(ast_manager & m, params_ref const & p, bool proofs_enabled, bool models_enabled, bool unsat_core_enabled, symbol const & logic) override {
391391
return mk_tactic2solver(m, m_tactic.get(), p, proofs_enabled, models_enabled, unsat_core_enabled, logic);
392392
}
393+
394+
solver_factory* translate(ast_manager& m) override {
395+
tactic* translated_tactic = m_tactic->translate(m);
396+
return alloc(tactic2solver_factory, translated_tactic);
397+
}
393398
};
394399

395400
class tactic_factory2solver_factory : public solver_factory {
@@ -402,6 +407,10 @@ class tactic_factory2solver_factory : public solver_factory {
402407
tactic * t = (*m_factory)(m, p);
403408
return mk_tactic2solver(m, t, p, proofs_enabled, models_enabled, unsat_core_enabled, logic);
404409
}
410+
411+
solver_factory* translate(ast_manager& m) override {
412+
return alloc(tactic_factory2solver_factory, m_factory);
413+
}
405414
};
406415
}
407416

src/tactic/portfolio/smt_strategic_solver.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ class smt_nested_solver_factory : public solver_factory {
6060
auto s = mk_tactic2solver(m, t, p, proofs_enabled, models_enabled, unsat_core_enabled, logic);
6161
return s;
6262
}
63+
64+
solver_factory* translate(ast_manager& m) override {
65+
return alloc(smt_nested_solver_factory);
66+
}
6367
};
6468

6569
tactic * mk_tactic_for_logic(ast_manager & m, params_ref const & p, symbol const & logic) {
@@ -185,6 +189,10 @@ class smt_strategic_solver_factory : public solver_factory {
185189
mk_solver_for_logic(m, p, l),
186190
p);
187191
}
192+
193+
solver_factory* translate(ast_manager& m) override {
194+
return alloc(smt_strategic_solver_factory, m_logic);
195+
}
188196
};
189197

190198
solver_factory * mk_smt_strategic_solver_factory(symbol const & logic) {

0 commit comments

Comments
 (0)