diff options
author | Minijackson <minijackson@riseup.net> | 2023-01-25 16:08:21 +0100 |
---|---|---|
committer | Minijackson <minijackson@riseup.net> | 2023-01-25 16:08:21 +0100 |
commit | aded390750171429dca8e7e4d83e3fca76718cbf (patch) | |
tree | 4adc7dc6f4369af3305b8045e0a8514d0f0bf762 | |
parent | 794ce6e18b22ff3887870050e0992c0814fea9b5 (diff) | |
download | diaphragm-aded390750171429dca8e7e4d83e3fca76718cbf.tar.gz diaphragm-aded390750171429dca8e7e4d83e3fca76718cbf.zip |
solving: add minimize/maximize
-rw-r--r-- | core/src/solving.rs | 3 | ||||
-rw-r--r-- | lua-bindings/src/lib.rs | 12 | ||||
-rw-r--r-- | z3-solver/src/lib.rs | 14 |
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)] |
14 | pub struct Z3Context<'z3> { | 14 | pub 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 | ||
116 | impl<'z3> SolverContext for Z3Context<'z3> { | 116 | impl<'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 { |