summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/src/solving.rs3
-rw-r--r--lua-bindings/src/lib.rs12
-rw-r--r--z3-solver/src/lib.rs14
3 files changed, 26 insertions, 3 deletions
diff --git a/core/src/solving.rs b/core/src/solving.rs
index da053e7..bfe3ff3 100644
--- a/core/src/solving.rs
+++ b/core/src/solving.rs
@@ -135,6 +135,9 @@ pub trait SolverContext {
135 result 135 result
136 } 136 }
137 137
138 fn float_maximize(&mut self, value: Float);
139 fn float_minimize(&mut self, value: Float);
140
138 // Bools 141 // Bools
139 142
140 fn new_free_bool(&mut self) -> Bool; 143 fn new_free_bool(&mut self) -> Bool;
diff --git a/lua-bindings/src/lib.rs b/lua-bindings/src/lib.rs
index fb56b5a..86a759d 100644
--- a/lua-bindings/src/lib.rs
+++ b/lua-bindings/src/lib.rs
@@ -61,6 +61,18 @@ impl LuaUserData for Float {
61 r.solver_ctx().float_abs(f.0) 61 r.solver_ctx().float_abs(f.0)
62 })))) 62 }))))
63 }); 63 });
64
65 methods.add_method("maximize", |_lua, f: &Float, _: ()| {
66 let f = *f;
67 runtime_thread_do(Box::new(move |r| r.solver_ctx().float_maximize(f.0)));
68 Ok(())
69 });
70
71 methods.add_method("minimize", |_lua, f: &Float, _: ()| {
72 let f = *f;
73 runtime_thread_do(Box::new(move |r| r.solver_ctx().float_minimize(f.0)));
74 Ok(())
75 });
64 } 76 }
65} 77}
66 78
diff --git a/z3-solver/src/lib.rs b/z3-solver/src/lib.rs
index 6ad7ffc..2085768 100644
--- a/z3-solver/src/lib.rs
+++ b/z3-solver/src/lib.rs
@@ -13,7 +13,7 @@ use std::collections::HashMap;
13#[derive(Debug)] 13#[derive(Debug)]
14pub struct Z3Context<'z3> { 14pub struct Z3Context<'z3> {
15 ctx: &'z3 z3::Context, 15 ctx: &'z3 z3::Context,
16 solver: z3::Solver<'z3>, 16 solver: z3::Optimize<'z3>,
17 17
18 floats: HashMap<VariableHandle, z3::ast::Real<'z3>>, 18 floats: HashMap<VariableHandle, z3::ast::Real<'z3>>,
19 max_float_id: u32, 19 max_float_id: u32,
@@ -57,7 +57,7 @@ impl<'z3> Z3Context<'z3> {
57 pub fn new(ctx: &'z3 z3::Context) -> Self { 57 pub fn new(ctx: &'z3 z3::Context) -> Self {
58 Self { 58 Self {
59 ctx, 59 ctx,
60 solver: z3::Solver::new(ctx), 60 solver: z3::Optimize::new(ctx),
61 floats: HashMap::new(), 61 floats: HashMap::new(),
62 max_float_id: 0, 62 max_float_id: 0,
63 bools: HashMap::new(), 63 bools: HashMap::new(),
@@ -115,7 +115,7 @@ impl<'z3> Z3Context<'z3> {
115 115
116impl<'z3> SolverContext for Z3Context<'z3> { 116impl<'z3> SolverContext for Z3Context<'z3> {
117 fn solve<'a>(&'a self) -> Box<dyn SolverModel + 'a> { 117 fn solve<'a>(&'a self) -> Box<dyn SolverModel + 'a> {
118 match self.solver.check() { 118 match self.solver.check(&[]) {
119 z3::SatResult::Unsat | z3::SatResult::Unknown => panic!("Failed solving"), 119 z3::SatResult::Unsat | z3::SatResult::Unknown => panic!("Failed solving"),
120 z3::SatResult::Sat => {} 120 z3::SatResult::Sat => {}
121 } 121 }
@@ -241,6 +241,14 @@ impl<'z3> SolverContext for Z3Context<'z3> {
241 self.anon_bool(result) 241 self.anon_bool(result)
242 } 242 }
243 243
244 fn float_maximize(&mut self, value: Float) {
245 self.solver.maximize(&self.float(value));
246 }
247
248 fn float_minimize(&mut self, value: Float) {
249 self.solver.minimize(&self.float(value));
250 }
251
244 // Bools 252 // Bools
245 253
246 fn new_free_bool(&mut self) -> Bool { 254 fn new_free_bool(&mut self) -> Bool {