From f968d2f8c9ca7d0bef36fc1b75c048939ee97b2e Mon Sep 17 00:00:00 2001 From: Mohammed Ghannam Date: Sat, 25 Jan 2025 09:55:13 +0100 Subject: [PATCH 1/2] Generic parametr setter and getter --- src/lib.rs | 2 ++ src/model.rs | 32 ++++++++++++++++++++++++++ src/param.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 src/param.rs diff --git a/src/lib.rs b/src/lib.rs index 92f8be2..30dc2de 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -68,6 +68,8 @@ pub use col::*; /// Contains the `Row` struct, which represents a row in an LP relaxation. pub mod row; +mod param; + pub use row::*; /// A macro for calling a `SCIP` function and returning an error if the return code is not `SCIP_OKAY`. diff --git a/src/model.rs b/src/model.rs index 9a78c6b..c14975f 100644 --- a/src/model.rs +++ b/src/model.rs @@ -10,6 +10,7 @@ use crate::{ffi, Row, Separator}; use crate::{BranchRule, HeurTiming, Heuristic, Pricer}; use scip_sys::SCIP; use std::rc::Rc; +use crate::param::ScipParameter; /// Represents an optimization model. #[non_exhaustive] @@ -1319,6 +1320,21 @@ impl Model { .to_string() } + /// Returns the value of a SCIP paramter. + pub fn param(&self, param: &str) -> P { + P::get(self, param) + } + + /// Tries to set the value of a SCIP parameter and returns the same `Model` instance if successful. + pub fn try_set_param(self, param: &str, value: P) -> Result, Retcode> { + P::set(self, param, value) + } + + /// Sets the value of a SCIP parameter. + pub fn set_param(self, param: &str, value: P) -> Model { + P::set(self, param, value).expect("Failed to set parameter") + } + /// Returns the value of a SCIP boolean parameter. pub fn bool_param(&self, param: &str) -> bool { self.scip @@ -1907,6 +1923,22 @@ mod tests { .set_int_param("display/verblevel", 0) .unwrap(); } + + #[test] + fn generic_params() { + let model = Model::new() + .hide_output() + .include_default_plugins() + .create_prob("test") + .set_obj_sense(ObjSense::Maximize) + .set_param("display/verblevel", 0) + .set_param("limits/time", 0.0) + .set_param("limits/memory", 0.0); + + assert_eq!(model.param::("display/verblevel"), 0); + assert_eq!(model.param::("limits/time"), 0.0); + assert_eq!(model.param::("limits/memory"), 0.0); + } #[test] fn free_transform() { diff --git a/src/param.rs b/src/param.rs new file mode 100644 index 0000000..faa1014 --- /dev/null +++ b/src/param.rs @@ -0,0 +1,64 @@ +use crate::{Model, Retcode}; + +pub trait ScipParameter: Sized { + fn set(model: Model, name: &str, value: Self) -> Result, Retcode>; + fn get(model: &Model, name: &str) -> Self; +} + +impl ScipParameter for f64 { + fn set(model: Model, name: &str, value: f64) -> Result, Retcode> { + let model = model.set_real_param(name, value)?; + Ok(model) + } + + fn get(model: &Model, name: &str) -> f64 { + model.real_param(name) + } +} + + +impl ScipParameter for i32 { + fn set(model: Model, name: &str, value: i32) -> Result, Retcode> { + let model = model.set_int_param(name, value)?; + Ok(model) + } + + fn get(model: &Model, name: &str) -> i32 { + model.int_param(name) + } +} + +impl ScipParameter for bool { + fn set(model: Model, name: &str, value: bool) -> Result, Retcode> { + let model = model.set_bool_param(name, value)?; + Ok(model) + } + + fn get(model: &Model, name: &str) -> bool { + model.bool_param(name) + } +} + + +impl ScipParameter for i64 { + fn set(model: Model, name: &str, value: i64) -> Result, Retcode> { + let model = model.set_longint_param(name, value)?; + Ok(model) + } + + fn get(model: &Model, name: &str) -> i64 { + model.longint_param(name) + } +} + + +impl ScipParameter for String { + fn set(model: Model, name: &str, value: String) -> Result, Retcode> { + let model = model.set_str_param(name, &value)?; + Ok(model) + } + + fn get(model: &Model, name: &str) -> String { + model.str_param(name) + } +} From ada47f15dfbc4d88c84db9ae42406c0db997ce03 Mon Sep 17 00:00:00 2001 From: Mohammed Ghannam Date: Sat, 25 Jan 2025 09:56:07 +0100 Subject: [PATCH 2/2] Cargo fmt --- src/lib.rs | 2 +- src/model.rs | 12 ++++++++---- src/param.rs | 13 +++++-------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 30dc2de..4e52d02 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -66,9 +66,9 @@ mod scip; pub mod col; pub use col::*; +mod param; /// Contains the `Row` struct, which represents a row in an LP relaxation. pub mod row; -mod param; pub use row::*; diff --git a/src/model.rs b/src/model.rs index c14975f..7bfde09 100644 --- a/src/model.rs +++ b/src/model.rs @@ -1,6 +1,7 @@ use crate::constraint::Constraint; use crate::eventhdlr::Eventhdlr; use crate::node::Node; +use crate::param::ScipParameter; use crate::retcode::Retcode; use crate::scip::ScipPtr; use crate::solution::{SolError, Solution}; @@ -10,7 +11,6 @@ use crate::{ffi, Row, Separator}; use crate::{BranchRule, HeurTiming, Heuristic, Pricer}; use scip_sys::SCIP; use std::rc::Rc; -use crate::param::ScipParameter; /// Represents an optimization model. #[non_exhaustive] @@ -1326,7 +1326,11 @@ impl Model { } /// Tries to set the value of a SCIP parameter and returns the same `Model` instance if successful. - pub fn try_set_param(self, param: &str, value: P) -> Result, Retcode> { + pub fn try_set_param( + self, + param: &str, + value: P, + ) -> Result, Retcode> { P::set(self, param, value) } @@ -1923,7 +1927,7 @@ mod tests { .set_int_param("display/verblevel", 0) .unwrap(); } - + #[test] fn generic_params() { let model = Model::new() @@ -1934,7 +1938,7 @@ mod tests { .set_param("display/verblevel", 0) .set_param("limits/time", 0.0) .set_param("limits/memory", 0.0); - + assert_eq!(model.param::("display/verblevel"), 0); assert_eq!(model.param::("limits/time"), 0.0); assert_eq!(model.param::("limits/memory"), 0.0); diff --git a/src/param.rs b/src/param.rs index faa1014..de22574 100644 --- a/src/param.rs +++ b/src/param.rs @@ -7,7 +7,7 @@ pub trait ScipParameter: Sized { impl ScipParameter for f64 { fn set(model: Model, name: &str, value: f64) -> Result, Retcode> { - let model = model.set_real_param(name, value)?; + let model = model.set_real_param(name, value)?; Ok(model) } @@ -16,10 +16,9 @@ impl ScipParameter for f64 { } } - impl ScipParameter for i32 { fn set(model: Model, name: &str, value: i32) -> Result, Retcode> { - let model = model.set_int_param(name, value)?; + let model = model.set_int_param(name, value)?; Ok(model) } @@ -30,7 +29,7 @@ impl ScipParameter for i32 { impl ScipParameter for bool { fn set(model: Model, name: &str, value: bool) -> Result, Retcode> { - let model = model.set_bool_param(name, value)?; + let model = model.set_bool_param(name, value)?; Ok(model) } @@ -39,10 +38,9 @@ impl ScipParameter for bool { } } - impl ScipParameter for i64 { fn set(model: Model, name: &str, value: i64) -> Result, Retcode> { - let model = model.set_longint_param(name, value)?; + let model = model.set_longint_param(name, value)?; Ok(model) } @@ -51,10 +49,9 @@ impl ScipParameter for i64 { } } - impl ScipParameter for String { fn set(model: Model, name: &str, value: String) -> Result, Retcode> { - let model = model.set_str_param(name, &value)?; + let model = model.set_str_param(name, &value)?; Ok(model) }