Move LinExpr into linexpr module
This commit is contained in:
parent
25a6634069
commit
d8323a144f
@ -4,7 +4,7 @@ use num_rational::Ratio;
|
||||
use num_traits::Zero;
|
||||
use std::rc::Rc;
|
||||
|
||||
use crate::{Constraint, Error, LinExpr, PsResult, PuzzleSearch, Val, VarToken};
|
||||
use crate::{Constraint, Error, linexpr::LinExpr, PsResult, PuzzleSearch, Val, VarToken};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Equality {
|
||||
|
46
src/lib.rs
46
src/lib.rs
@ -8,16 +8,14 @@ mod linexpr;
|
||||
mod puzzle;
|
||||
mod ranges;
|
||||
|
||||
use core::fmt;
|
||||
use num_rational::Rational32;
|
||||
use num_traits::Signed;
|
||||
use std::collections::HashMap;
|
||||
use std::ops;
|
||||
|
||||
pub use constraint::Constraint;
|
||||
pub use error::Error;
|
||||
pub use puzzle::Puzzle;
|
||||
pub use puzzle::PuzzleSearch;
|
||||
pub use linexpr::LinExpr;
|
||||
|
||||
/// A puzzle variable token.
|
||||
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
|
||||
@ -29,48 +27,6 @@ pub type Val = i32;
|
||||
/// The type of the coefficients in a linear expression.
|
||||
pub type Coef = Rational32;
|
||||
|
||||
/// A linear expression.
|
||||
///
|
||||
/// ```text
|
||||
/// constant + coef1 * var1 + coef2 * var2 + ...
|
||||
/// ```
|
||||
#[derive(Clone)]
|
||||
pub struct LinExpr {
|
||||
constant: Coef,
|
||||
|
||||
// The non-zero coefficients in the linear expression. If, after
|
||||
// some manipulations, the coefficient is 0, then it must be
|
||||
// removed from the map.
|
||||
coef: HashMap<VarToken, Coef>,
|
||||
}
|
||||
|
||||
impl fmt::Display for LinExpr {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "{}", self.constant)?;
|
||||
|
||||
for (tok, coef) in self.coef.iter() {
|
||||
if coef.is_negative() {
|
||||
if coef.abs() == Rational32::from_integer(1) {
|
||||
write!(f, " - x{}", tok.0)?;
|
||||
} else {
|
||||
write!(f, " - {} * x{}", coef.abs(), tok.0)?;
|
||||
}
|
||||
} else if coef.abs() == Rational32::from_integer(1) {
|
||||
write!(f, " + x{}", tok.0)?;
|
||||
} else {
|
||||
write!(f, " + {} * x{}", coef, tok.0)?;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for LinExpr {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "LinExpr {{ {} }}", self)
|
||||
}
|
||||
}
|
||||
|
||||
/// A result during a puzzle solution search (Err = contradiction).
|
||||
pub type PsResult<T> = Result<T, Error>;
|
||||
|
@ -1,13 +1,57 @@
|
||||
//! Linear expressions.
|
||||
|
||||
use num_rational::{Ratio, Rational32};
|
||||
use num_traits::{One, Zero};
|
||||
use num_traits::{One, Signed, Zero};
|
||||
use std::collections::hash_map::Entry;
|
||||
use std::collections::HashMap;
|
||||
use std::convert::From;
|
||||
use std::fmt;
|
||||
use std::ops::{Add, Mul, Neg, Sub};
|
||||
|
||||
use crate::{Coef, LinExpr, VarToken};
|
||||
use crate::{Coef, VarToken};
|
||||
|
||||
/// A linear expression.
|
||||
///
|
||||
/// ```text
|
||||
/// constant + coef1 * var1 + coef2 * var2 + ...
|
||||
/// ```
|
||||
#[derive(Clone)]
|
||||
pub struct LinExpr {
|
||||
pub(crate) constant: Coef,
|
||||
|
||||
// The non-zero coefficients in the linear expression. If, after
|
||||
// some manipulations, the coefficient is 0, then it must be
|
||||
// removed from the map.
|
||||
pub(crate) coef: HashMap<VarToken, Coef>,
|
||||
}
|
||||
|
||||
impl fmt::Display for LinExpr {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "{}", self.constant)?;
|
||||
|
||||
for (tok, coef) in self.coef.iter() {
|
||||
if coef.is_negative() {
|
||||
if coef.abs() == Rational32::from_integer(1) {
|
||||
write!(f, " - x{}", tok.0)?;
|
||||
} else {
|
||||
write!(f, " - {} * x{}", coef.abs(), tok.0)?;
|
||||
}
|
||||
} else if coef.abs() == Rational32::from_integer(1) {
|
||||
write!(f, " + x{}", tok.0)?;
|
||||
} else {
|
||||
write!(f, " + {} * x{}", coef, tok.0)?;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for LinExpr {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "LinExpr {{ {} }}", self)
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! impl_commutative_op {
|
||||
($LHS:ident + $RHS:ident) => {
|
||||
|
@ -12,8 +12,8 @@ use std::rc::Rc;
|
||||
|
||||
use crate::constraint;
|
||||
use crate::Error;
|
||||
use crate::{Constraint, LinExpr, PsResult, Solution, Val, VarToken};
|
||||
|
||||
use crate::{Constraint, PsResult, Solution, Val, VarToken};
|
||||
use crate::linexpr::LinExpr;
|
||||
use crate::ranges::Ranges;
|
||||
|
||||
/// A collection of candidates.
|
||||
|
@ -183,6 +183,10 @@ impl Constraint for Nonogram {
|
||||
fn substitute(&self, _search: VarToken, _replace: VarToken) -> PsResult<Rc<dyn Constraint>> {
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
fn propagate(&self, _search: &mut PuzzleSearch, _var: VarToken, _val: Val) -> PsResult<()> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------*/
|
||||
|
Loading…
Reference in New Issue
Block a user