mirror of
https://github.com/Z3Prover/z3
synced 2025-04-15 13:28:47 +00:00
add decide callback
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
c8d12975c9
commit
8218f25222
|
@ -414,6 +414,7 @@ def mk_dotnet(dotnet):
|
||||||
|
|
||||||
for name, ret, sig in Closures:
|
for name, ret, sig in Closures:
|
||||||
sig = sig.replace("void*","voidp").replace("unsigned","uint")
|
sig = sig.replace("void*","voidp").replace("unsigned","uint")
|
||||||
|
sig = sig.replace("Z3_ast*","ref IntPtr").replace("uint*","ref uint").replace("Z3_lbool*","ref int")
|
||||||
ret = ret.replace("void*","voidp").replace("unsigned","uint")
|
ret = ret.replace("void*","voidp").replace("unsigned","uint")
|
||||||
if "*" in sig or "*" in ret:
|
if "*" in sig or "*" in ret:
|
||||||
continue
|
continue
|
||||||
|
@ -1349,7 +1350,8 @@ z3_ml_callbacks = frozenset([
|
||||||
'Z3_solver_propagate_final',
|
'Z3_solver_propagate_final',
|
||||||
'Z3_solver_propagate_eq',
|
'Z3_solver_propagate_eq',
|
||||||
'Z3_solver_propagate_diseq',
|
'Z3_solver_propagate_diseq',
|
||||||
'Z3_solver_propagate_created'
|
'Z3_solver_propagate_created',
|
||||||
|
'Z3_solver_propagate_decide'
|
||||||
])
|
])
|
||||||
|
|
||||||
def mk_ml(ml_src_dir, ml_output_dir):
|
def mk_ml(ml_src_dir, ml_output_dir):
|
||||||
|
|
|
@ -55,6 +55,14 @@ namespace Microsoft.Z3
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public delegate void CreatedEh(Expr term);
|
public delegate void CreatedEh(Expr term);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delegate type for callback into solver's branching
|
||||||
|
/// <param name="term">A bit-vector or Boolean used for branching</param>
|
||||||
|
/// <param name="idx">If the term is a bit-vector, then an index into the bit-vector being branched on</param>
|
||||||
|
/// <param name="phase">Set phase to -1 (false) or 1 (true) to override solver's phase</param>
|
||||||
|
/// </summary>
|
||||||
|
public delegate void DecideEh(ref Expr term, ref uint idx, ref int phase);
|
||||||
|
|
||||||
Solver solver;
|
Solver solver;
|
||||||
Context ctx;
|
Context ctx;
|
||||||
GCHandle gch;
|
GCHandle gch;
|
||||||
|
@ -64,6 +72,7 @@ namespace Microsoft.Z3
|
||||||
EqEh eq_eh;
|
EqEh eq_eh;
|
||||||
EqEh diseq_eh;
|
EqEh diseq_eh;
|
||||||
CreatedEh created_eh;
|
CreatedEh created_eh;
|
||||||
|
DecideEh decide_eh;
|
||||||
|
|
||||||
|
|
||||||
static void _push(voidp ctx, Z3_solver_callback cb) {
|
static void _push(voidp ctx, Z3_solver_callback cb) {
|
||||||
|
@ -137,6 +146,20 @@ namespace Microsoft.Z3
|
||||||
prop.callback = IntPtr.Zero;
|
prop.callback = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _decide(voidp ctx, Z3_solver_callback cb, ref Z3_ast a, ref uint idx, ref int phase) {
|
||||||
|
var gch = GCHandle.FromIntPtr(ctx);
|
||||||
|
var prop = (UserPropagator)gch.Target;
|
||||||
|
var t = Expr.Create(prop.ctx, a);
|
||||||
|
var u = t;
|
||||||
|
prop.callback = cb;
|
||||||
|
prop.decide_eh(ref t, ref idx, ref phase);
|
||||||
|
prop.callback = IntPtr.Zero;
|
||||||
|
if (u != t) {
|
||||||
|
a = t.NativeObject;
|
||||||
|
}
|
||||||
|
t.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Propagator constructor from a solver class.
|
/// Propagator constructor from a solver class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -266,6 +289,19 @@ namespace Microsoft.Z3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set decision callback
|
||||||
|
/// </summary>
|
||||||
|
public DecideEh Decide
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
this.decide_eh = value;
|
||||||
|
if (solver != null)
|
||||||
|
Native.Z3_solver_propagate_decide(ctx.nCtx, solver.NativeObject, _decide);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Track assignments to a term
|
/// Track assignments to a term
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -6801,6 +6801,7 @@ extern "C" {
|
||||||
In case the expression is a bitvector the bit to split on is determined by the bit argument and the
|
In case the expression is a bitvector the bit to split on is determined by the bit argument and the
|
||||||
truth-value to try first is given by is_pos. In case the truth value is undefined the solver will decide.
|
truth-value to try first is given by is_pos. In case the truth value is undefined the solver will decide.
|
||||||
|
|
||||||
|
def_API('Z3_solver_propagate_decide', VOID, (_in(CONTEXT), _in(SOLVER), _fnptr(Z3_decide_eh)))
|
||||||
*/
|
*/
|
||||||
void Z3_API Z3_solver_propagate_decide(Z3_context c, Z3_solver s, Z3_decide_eh decide_eh);
|
void Z3_API Z3_solver_propagate_decide(Z3_context c, Z3_solver s, Z3_decide_eh decide_eh);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue