Skip to content

Commit

Permalink
add trait for solvers that support cardinality constraints
Browse files Browse the repository at this point in the history
this addressess @lovasoa 's comment rust-or#39 (comment)

also upgrades russcip dependency to one that supports cardinality constraints.
  • Loading branch information
yonch committed Oct 5, 2023
1 parent 627342d commit 194c7ce
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 4 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ coin_cbc = { version = "0.1", optional = true, default-features = false }
minilp = { version = "0.2", optional = true }
lpsolve = { version = "0.1", optional = true }
highs = { version = "1.5.0", optional = true }
russcip = { version = "0.2.4", optional = true }
russcip = { version = "0.2.6", optional = true }
lp-solvers = { version = "1.0.0", features = ["cplex"], optional = true }
fnv = "1.0.5"

Expand Down
7 changes: 7 additions & 0 deletions src/cardinality_constraint_solver_trait.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
use crate::{Variable, constraint::ConstraintReference};

/// A trait for solvers that support cardinality constraints
pub trait CardinalityConstraintSolver {
/// Add cardinality constraint. Constrains the number of non-zero variables from `vars` to at most `rhs`.
fn add_cardinality_constraint(&mut self, vars: &[Variable], rhs: usize) -> ConstraintReference;
}
2 changes: 2 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
//!

pub use affine_expression_trait::IntoAffineExpression;
pub use cardinality_constraint_solver_trait::CardinalityConstraintSolver;
pub use constraint::Constraint;
pub use expression::Expression;
#[cfg_attr(docsrs, doc(cfg(feature = "minilp")))]
Expand Down Expand Up @@ -149,6 +150,7 @@ mod expression;
#[macro_use]
pub mod variable;
mod affine_expression_trait;
mod cardinality_constraint_solver_trait;
pub mod constraint;
pub mod solvers;
mod variables_macro;
8 changes: 5 additions & 3 deletions src/solvers/scip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ use russcip::WithSolutions;

use crate::variable::{UnsolvedProblem, VariableDefinition};
use crate::{
CardinalityConstraintSolver,
constraint::ConstraintReference,
solvers::{ObjectiveDirection, ResolutionError, Solution, SolverModel},
};
Expand Down Expand Up @@ -81,9 +82,11 @@ impl SCIPProblem {
pub fn as_inner_mut(&mut self) -> &mut Model<ProblemCreated> {
&mut self.model
}
}

impl CardinalityConstraintSolver for SCIPProblem {
/// Add cardinality constraint. Constrains the number of non-zero variables to at most `rhs`.
pub fn add_cardinality_constraint(&mut self, vars: &[Variable], rhs: usize) -> ConstraintReference {
fn add_cardinality_constraint(&mut self, vars: &[Variable], rhs: usize) -> ConstraintReference {
let scip_vars = vars.iter()
.map(|v| Rc::clone(&self.id_for_var[v]))
.collect::<Vec<_>>();
Expand All @@ -97,7 +100,6 @@ impl SCIPProblem {

ConstraintReference { index }
}

}

impl SolverModel for SCIPProblem {
Expand Down Expand Up @@ -175,7 +177,7 @@ impl Solution for SCIPSolved {

#[cfg(test)]
mod tests {
use crate::{constraint, variable, variables, Solution, SolverModel};
use crate::{constraint, variable, variables, Solution, SolverModel, CardinalityConstraintSolver};

use super::scip;

Expand Down

0 comments on commit 194c7ce

Please sign in to comment.