mirror of
https://github.com/Z3Prover/z3
synced 2026-02-19 23:14:40 +00:00
Implement Z3_optimize_translate for context translation (#8072)
* Initial plan * Implement Z3_optimize_translate functionality Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Fix compilation errors and add tests for optimize translate Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Revert changes to opt_solver.cpp as requested Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
This commit is contained in:
parent
3a09b0d2b5
commit
1081916973
6 changed files with 155 additions and 0 deletions
|
|
@ -481,4 +481,22 @@ extern "C" {
|
|||
Z3_CATCH;
|
||||
}
|
||||
|
||||
Z3_optimize Z3_API Z3_optimize_translate(Z3_context c, Z3_optimize o, Z3_context target) {
|
||||
Z3_TRY;
|
||||
LOG_Z3_optimize_translate(c, o, target);
|
||||
RESET_ERROR_CODE();
|
||||
|
||||
// Translate the opt::context to the target manager
|
||||
opt::context* translated_ctx = to_optimize_ptr(o)->translate(mk_c(target)->m());
|
||||
|
||||
// Create a new Z3_optimize_ref in the target context
|
||||
Z3_optimize_ref* result_ref = alloc(Z3_optimize_ref, *mk_c(target));
|
||||
result_ref->m_opt = translated_ctx;
|
||||
mk_c(target)->save_object(result_ref);
|
||||
|
||||
Z3_optimize result = of_optimize(result_ref);
|
||||
RETURN_Z3(result);
|
||||
Z3_CATCH_RETURN(nullptr);
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
|||
|
|
@ -3317,6 +3317,7 @@ namespace z3 {
|
|||
Z3_optimize m_opt;
|
||||
|
||||
public:
|
||||
struct translate {};
|
||||
class handle final {
|
||||
unsigned m_h;
|
||||
public:
|
||||
|
|
@ -3324,6 +3325,12 @@ namespace z3 {
|
|||
unsigned h() const { return m_h; }
|
||||
};
|
||||
optimize(context& c):object(c) { m_opt = Z3_mk_optimize(c); Z3_optimize_inc_ref(c, m_opt); }
|
||||
optimize(context & c, optimize const& src, translate): object(c) {
|
||||
Z3_optimize o = Z3_optimize_translate(src.ctx(), src, c);
|
||||
check_error();
|
||||
m_opt = o;
|
||||
Z3_optimize_inc_ref(c, m_opt);
|
||||
}
|
||||
optimize(optimize const & o):object(o), m_opt(o.m_opt) {
|
||||
Z3_optimize_inc_ref(o.ctx(), o.m_opt);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -379,6 +379,23 @@ extern "C" {
|
|||
void* ctx,
|
||||
Z3_model_eh model_eh);
|
||||
|
||||
/**
|
||||
\brief Copy an optimization context from a source to a target context.
|
||||
|
||||
This function allows translating an optimization context from one Z3_context
|
||||
to another. This is useful when working with multiple contexts and needing to
|
||||
transfer optimization problems between them.
|
||||
|
||||
\param c Source context containing the optimization context to translate
|
||||
\param o The optimization context to translate from the source context
|
||||
\param target Target context where the optimization context will be created
|
||||
|
||||
\return A new optimization context in the target context with the same state
|
||||
|
||||
def_API('Z3_optimize_translate', OPTIMIZE, (_in(CONTEXT), _in(OPTIMIZE), _in(CONTEXT)))
|
||||
*/
|
||||
Z3_optimize Z3_API Z3_optimize_translate(Z3_context c, Z3_optimize o, Z3_context target);
|
||||
|
||||
|
||||
/**@}*/
|
||||
/**@}*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue