Updated to use the most recent version of OR-tools (v9.5), and added add_mult_eq functionality

This commit is contained in:
hamilcarBarca17
2023-03-09 12:43:12 -07:00
parent 9d38c4acb9
commit 20bc0eeefc
2 changed files with 205 additions and 103 deletions
+44 -5
View File
@@ -349,9 +349,9 @@ impl CpModelBuilder {
/// assert!(x_val != z_val);
/// assert!(y_val != z_val);
/// ```
pub fn add_all_different(&mut self, vars: impl IntoIterator<Item = IntVar>) -> Constraint {
pub fn add_all_different(&mut self, exprs: impl IntoIterator<Item = impl Into<LinearExpr>>) -> Constraint {
self.add_cst(CstEnum::AllDiff(proto::AllDifferentConstraintProto {
vars: vars.into_iter().map(|v| v.0).collect(),
exprs: exprs.into_iter().map(|e| e.into().into()).collect(),
}))
}
@@ -548,6 +548,36 @@ impl CpModelBuilder {
self.add_linear_constraint(lhs.into() - rhs.into(), [(i64::MIN, -1), (1, i64::MAX)])
}
/// Adds a constraint that force the `target` to be equal to the
/// product of the given `exprs`.
///
/// # Example
///
/// ```
/// # use cp_sat::builder::{CpModelBuilder, LinearExpr};
/// # use cp_sat::proto::CpSolverStatus;
/// let mut model = CpModelBuilder::default();
/// let x = model.new_int_var([(0, 10)]);
/// let y = model.new_int_var([(5, 15)]);
/// let m = model.new_int_var([(-200, 200)]);
/// model.add_mult_eq(m, [x, y]);
/// model.maximize(m);
/// let response = model.solve();
/// assert_eq!(response.status(), CpSolverStatus::Optimal);
/// assert_eq!(150., response.objective_value);
/// assert_eq!(150, m.solution_value(&response));
/// ```
pub fn add_mult_eq(
&mut self,
target: impl Into<LinearExpr>,
exprs: impl IntoIterator<Item = impl Into<LinearExpr>>,
) -> Constraint {
self.add_cst(CstEnum::IntProd(proto::LinearArgumentProto {
target: Some(target.into().into()),
exprs: exprs.into_iter().map(|e| e.into().into()).collect(),
}))
}
/// Adds a constraint that force the `target` to be equal to the
/// minimum of the given `exprs`.
///
@@ -572,9 +602,9 @@ impl CpModelBuilder {
target: impl Into<LinearExpr>,
exprs: impl IntoIterator<Item = impl Into<LinearExpr>>,
) -> Constraint {
self.add_cst(CstEnum::LinMin(proto::LinearArgumentProto {
target: Some(target.into().into()),
exprs: exprs.into_iter().map(|e| e.into().into()).collect(),
self.add_cst(CstEnum::LinMax(proto::LinearArgumentProto {
target: Some((-target.into()).into()),
exprs: exprs.into_iter().map(|e| (-e.into()).into()).collect(),
}))
}
@@ -607,6 +637,7 @@ impl CpModelBuilder {
exprs: exprs.into_iter().map(|e| e.into().into()).collect(),
}))
}
fn add_cst(&mut self, cst: CstEnum) -> Constraint {
let index = self.proto.constraints.len();
self.proto.constraints.push(proto::ConstraintProto {
@@ -690,6 +721,10 @@ impl CpModelBuilder {
coeffs: expr.coeffs.into_vec(),
offset: expr.constant as f64,
scaling_factor: 1.,
integer_before_offset: 0,
integer_after_offset: 0,
integer_scaling_factor: 0,
scaling_was_exact: true,
domain: vec![],
});
}
@@ -719,6 +754,10 @@ impl CpModelBuilder {
coeffs: expr.coeffs.into_vec(),
offset: -expr.constant as f64,
scaling_factor: -1.,
integer_before_offset: 0,
integer_after_offset: 0,
integer_scaling_factor: 0,
scaling_was_exact: true,
domain: vec![],
});
}