Skip to content
This repository has been archived by the owner on Oct 1, 2020. It is now read-only.

Commit

Permalink
Implemented from_str
Browse files Browse the repository at this point in the history
  • Loading branch information
duane committed Aug 24, 2016
1 parent a5ca465 commit ca5f043
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 39 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ path = "src/lib.rs"

[dependencies]
prettytable-rs = "0.6.2"
lalrpop-util = "0.11.0"
lalrpop-util = "0.12.0"
itertools = "0.4.16"

[build-dependencies]
Expand Down
15 changes: 14 additions & 1 deletion src/abs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -596,4 +596,17 @@ impl From<Var> for RawLinearExpression {
fn from(var: Var) -> RawLinearExpression {
LinearExpression::term(var, 1.0)
}
}
}

use std::str::FromStr;
use grammar::*;

impl FromStr for RawLinearExpression {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match parse_Expression(s) {
Ok(result) => Ok(result),
Err(e) => Err(format!("{:?}", e))
}
}
}
13 changes: 13 additions & 0 deletions src/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,19 @@ impl<V> LinearRelation<V> where V: Ord + Clone + Hash + Debug + Display {
}
}

use std::str::FromStr;
use grammar::*;

impl FromStr for RawLinearRelation {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match parse_LinearRelation(s) {
Ok(result) => Ok(result),
Err(e) => Err(format!("{:?}", e))
}
}
}

impl<V> Display for LinearRelation<V> where V: Ord + Clone + Hash + Debug + Display {
fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
fmt.write_str(format!("{} {} {}",
Expand Down
49 changes: 33 additions & 16 deletions src/problem.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,15 +118,13 @@ impl Problem {
///
/// ```
/// extern crate constraint;
/// use constraint::abs::RawLinearExpression;
/// use constraint::expr::{RawLinearRelation, Relation};
/// use constraint::problem::{Problem, ProblemObjective};
/// use constraint::var::Var;
/// use constraint::expr::RawLinearRelation;
/// use constraint::problem::{Problem, RawProblemObjective};
/// use std::str::FromStr;
///
/// fn main() {
/// let x = Var::external(String::from("x"));
/// let objective = ProblemObjective::Minimize(RawLinearExpression::from(x.clone()));
/// let constraints = vec!(RawLinearRelation::new(RawLinearExpression::from(x.clone()), Relation::EQ, RawLinearExpression::from(5.0)));
/// let objective = RawProblemObjective::from_str("minimize(x)").unwrap();
/// let constraints = vec!(RawLinearRelation::from_str("x == 5").unwrap());
/// let _ = Problem::new(objective, constraints);
/// }
/// ```
Expand Down Expand Up @@ -177,19 +175,15 @@ impl Problem {
///
/// ```
/// extern crate constraint;
/// use constraint::abs::RawLinearExpression;
/// use constraint::expr::{approx_eq, RawLinearRelation, Relation};
/// use constraint::problem::{Problem, ProblemObjective};
/// use constraint::expr::approx_eq;
/// use constraint::tableau::Tableau;
/// use std::str::FromStr;
/// use constraint::var::Var;
///
/// fn main() {
/// let x = Var::external(String::from("x"));
/// let objective = ProblemObjective::Minimize(RawLinearExpression::from(x.clone()));
/// let constraints = vec!(RawLinearRelation::new(RawLinearExpression::from(x.clone()), Relation::EQ, RawLinearExpression::from(5.0)));
/// let problem = Problem::new(objective, constraints);
/// let tableau = problem.augmented_simplex().unwrap();
/// let tableau = Tableau::from_str("minimize(x);x==5").unwrap();
/// let basic_feasible_solution = tableau.get_basic_feasible_solution();
/// assert!(approx_eq(5.0, *basic_feasible_solution.get(&x).unwrap()));
/// assert!(approx_eq(5.0, *basic_feasible_solution.get(&Var::external(String::from("x"))).unwrap()));
/// }
pub fn augmented_simplex(&self) -> Result<Tableau, String> {
let mut slack_namer = Namer::new("s_");
Expand Down Expand Up @@ -314,6 +308,29 @@ impl Display for Problem {
}
}

use std::str::FromStr;
use grammar::*;

impl FromStr for RawProblemObjective {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match parse_ProblemObjective(s) {
Ok(result) => Ok(result),
Err(e) => Err(format!("{:?}", e))
}
}
}

impl FromStr for Problem {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match parse_Problem(s) {
Ok(result) => Ok(result),
Err(e) => Err(format!("{:?}", e))
}
}
}

#[cfg(test)]
mod test {
use grammar::*;
Expand Down
59 changes: 38 additions & 21 deletions src/tableau.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ use expr::*;
use problem::*;
use std::collections::{BTreeSet, HashMap, HashSet};
use std::collections::hash_map;
use std::str::FromStr;
use grammar::parse_Problem;

use prettytable::Table;
use prettytable::row::Row;
Expand Down Expand Up @@ -111,15 +113,14 @@ impl Tableau {
///
/// ```
/// extern crate constraint;
/// use constraint::abs::RawLinearExpression;
/// use constraint::expr::approx_eq;
/// use constraint::tableau::Tableau;
/// use constraint::problem::ProblemObjective;
/// use constraint::var::Var;
/// use constraint::problem::RawProblemObjective;
/// use std::str::FromStr;
///
/// fn main() {
/// let mut tableau = Tableau::new();
/// tableau.set_objective(ProblemObjective::Maximize(RawLinearExpression::from(Var::external(String::from("x")))));
/// tableau.set_objective(RawProblemObjective::from_str("minimize(x)").unwrap());
/// let x_ref = {tableau.index.external(String::from("x"))};
/// assert!(approx_eq(1.0, tableau.get_objective().get_expr().get_coefficient(&x_ref)));
/// }
Expand All @@ -139,10 +140,11 @@ impl Tableau {
/// use constraint::abs::RawLinearExpression;
/// use constraint::tableau::Tableau;
/// use constraint::var::Var;
/// use std::str::FromStr;
///
/// fn main() {
/// let mut tableau = Tableau::new();
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from(Var::external(String::from("s1"))).plus(&RawLinearExpression::from(10.0)), false).is_ok());
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from_str("s1+10").unwrap(), false).is_ok());
/// let x_ref = {tableau.index.external(String::from("x"))};
/// assert!(tableau.is_basic(&x_ref));
/// let s1_ref = {tableau.index.external(String::from("s1"))};
Expand All @@ -163,10 +165,11 @@ impl Tableau {
/// use constraint::abs::RawLinearExpression;
/// use constraint::tableau::Tableau;
/// use constraint::var::Var;
/// use std::str::FromStr;
///
/// fn main() {
/// let mut tableau = Tableau::new();
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from(Var::external(String::from("s1"))).plus(&RawLinearExpression::from(10.0)), false).is_ok());
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from_str("s1+10").unwrap(), false).is_ok());
/// let x_ref = {tableau.index.external(String::from("x"))};
/// let s1_ref = {tableau.index.external(String::from("s1"))};
/// let c_ref = {tableau.index.external(String::from("c"))};
Expand All @@ -190,10 +193,11 @@ impl Tableau {
/// use constraint::expr::approx_eq;
/// use constraint::tableau::Tableau;
/// use constraint::var::Var;
/// use std::str::FromStr;
///
/// fn main() {
/// let mut tableau = Tableau::new();
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from(Var::external(String::from("s1"))).plus(&RawLinearExpression::from(10.0)), false).is_ok());
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from_str("s1+10").unwrap(), false).is_ok());
/// let x_ref = {tableau.index.external(String::from("x"))};
/// let s1_ref = {tableau.index.external(String::from("s1"))};
/// let basic = tableau.get_basic(&x_ref).unwrap();
Expand All @@ -215,10 +219,11 @@ impl Tableau {
/// use constraint::abs::RawLinearExpression;
/// use constraint::tableau::Tableau;
/// use constraint::var::Var;
/// use std::str::FromStr;
///
/// fn main() {
/// let mut tableau = Tableau::new();
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from(Var::external(String::from("s1"))).plus(&RawLinearExpression::from(10.0)), false).is_ok());
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from_str("s1+10").unwrap(), false).is_ok());
/// let s1_ref = {tableau.index.external(String::from("s1"))};
/// let mut keys = tableau.parametric_vars();
/// assert_eq!(1, keys.len());
Expand All @@ -239,10 +244,11 @@ impl Tableau {
/// use constraint::abs::RawLinearExpression;
/// use constraint::tableau::{TABLEAU_OBJECTIVE_VARIABLE, Tableau};
/// use constraint::var::{Var, VarRef};
/// use std::str::FromStr;
///
/// fn main() {
/// let mut tableau = Tableau::new();
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from(Var::external(String::from("s1"))).plus(&RawLinearExpression::from(10.0)), false).is_ok());
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from_str("s1+10").unwrap(), false).is_ok());
/// let keys: Vec<VarRef> = tableau.basic_vars().map(|s|s.clone()).collect();
/// assert_eq!(2, keys.len());
/// let x_ref = {tableau.index.external(String::from("x"))};
Expand All @@ -265,10 +271,11 @@ impl Tableau {
/// use constraint::abs::RawLinearExpression;
/// use constraint::tableau::Tableau;
/// use constraint::var::Var;
/// use std::str::FromStr;
///
/// fn main() {
/// let mut tableau = Tableau::new();
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from(Var::external(String::from("s1"))).plus(&RawLinearExpression::from(10.0)), false).is_ok());
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from_str("s1+10").unwrap(), false).is_ok());
/// let s1_ref = {tableau.index.external(String::from("s1"))};
/// let keys = tableau.get_parametric_vars();
/// assert_eq!(1, keys.len());
Expand All @@ -289,10 +296,11 @@ impl Tableau {
/// use constraint::abs::RawLinearExpression;
/// use constraint::tableau::Tableau;
/// use constraint::var::Var;
/// use std::str::FromStr;
///
/// fn main() {
/// let mut tableau = Tableau::new();
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from(Var::external(String::from("s1"))).plus(&RawLinearExpression::from(10.0)), false).is_ok());
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from_str("s1+10").unwrap(), false).is_ok());
/// let s1_ref = {tableau.index.external(String::from("s1"))};
/// let x_ref = {tableau.index.external(String::from("x"))};
/// let vars = tableau.get_basic_vars_for_param(&s1_ref);
Expand Down Expand Up @@ -354,12 +362,13 @@ impl Tableau {
/// use constraint::expr::approx_eq;
/// use constraint::tableau::Tableau;
/// use constraint::var::Var;
/// use std::str::FromStr;
///
/// fn main() {
/// let x = Var::external(String::from("x"));
/// let s1 = Var::internal(String::from("s1"));
/// let mut tableau = Tableau::new();
/// assert!(tableau.add_row(x.clone(), RawLinearExpression::from(s1.clone()).plus(&RawLinearExpression::from(10.0)), false).is_ok());
/// assert!(tableau.add_row(x.clone(), RawLinearExpression::from_str("s1+10").unwrap(), false).is_ok());
/// let basic = tableau.get_basic(&tableau.index.get(&String::from("x")).unwrap()).unwrap();
/// assert!(approx_eq(1.0, basic.get_coefficient(&tableau.index.get(&String::from("s1")).unwrap())));
/// assert!(approx_eq(10.0, basic.get_constant()));
Expand Down Expand Up @@ -427,10 +436,11 @@ impl Tableau {
/// use constraint::expr::approx_eq;
/// use constraint::tableau::Tableau;
/// use constraint::var::Var;
/// use std::str::FromStr;
///
/// fn main() {
/// let mut tableau = Tableau::new();
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from(Var::external(String::from("s1"))).plus(&RawLinearExpression::from(10.0)), false).is_ok());
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from_str("s1+10").unwrap(), false).is_ok());
/// let x_ref = {tableau.index.external(String::from("x"))};
/// let s1_ref = {tableau.index.external(String::from("s1"))};
/// {
Expand Down Expand Up @@ -481,10 +491,11 @@ impl Tableau {
/// use constraint::expr::approx_eq;
/// use constraint::tableau::Tableau;
/// use constraint::var::Var;
/// use std::str::FromStr;
///
/// fn main() {
/// let mut tableau = Tableau::new();
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from(Var::external(String::from("s1"))).plus(&RawLinearExpression::from(10.0)), false).is_ok());
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from_str("s1+10").unwrap(), false).is_ok());
/// let s1_ref = {tableau.index.external(String::from("s1"))};
/// let x_ref = {tableau.index.external(String::from("x"))};
/// assert!(tableau.substitute(&s1_ref, &InternedLinearExpression::from(-8.0)).is_ok());
Expand All @@ -511,16 +522,12 @@ impl Tableau {
/// use constraint::expr::approx_eq;
/// use constraint::tableau::Tableau;
/// use constraint::var::Var;
/// use std::str::FromStr;
///
/// fn main() {
/// let mut tableau = Tableau::new();
/// assert!(tableau.add_row(Var::external(String::from("x")),
/// RawLinearExpression::from(Var::external(String::from("s1"))).
/// plus(&RawLinearExpression::from(10.0)), false).is_ok());
/// assert!(tableau.add_row(Var::external(String::from("y")),
/// RawLinearExpression::from(Var::external(String::from("s1"))).
/// plus(&RawLinearExpression::term(Var::external(String::from("s2")), 5.2)).
/// plus(&RawLinearExpression::from(-72.3)), false).is_ok());
/// assert!(tableau.add_row(Var::external(String::from("x")), RawLinearExpression::from_str("s1+10").unwrap(), false).is_ok());
/// assert!(tableau.add_row(Var::external(String::from("y")), RawLinearExpression::from_str("s1+5.2s2+-72.3").unwrap(), false).is_ok());
/// let solution = tableau.get_basic_feasible_solution();
/// let x_ref = {tableau.index.external(String::from("x"))};
/// let y_ref = {tableau.index.external(String::from("y"))};
Expand Down Expand Up @@ -619,6 +626,16 @@ impl Tableau {
}
}

impl FromStr for Tableau {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match parse_Problem(s) {
Ok(result) => result.augmented_simplex(),
Err(e) => Err(format!("{:?}", e))
}
}
}

#[cfg(test)]
mod test {
extern crate itertools;
Expand Down

0 comments on commit ca5f043

Please sign in to comment.