rustplex 0.3.0

A linear programming solver based on the Simplex algorithm for Rust
Documentation
use crate::{
    common::expression::{impl_expr_display, impl_expr_ops, ExprVariable},
    standard_form::variable::StandardVariableKey,
};
use slotmap::new_key_type;
use std::fmt;

new_key_type! {
    pub struct DictionaryVariableKey;
}

impl fmt::Display for DictionaryVariableKey {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "DictionaryVariableKey({:?})", self.0)
    }
}

impl ExprVariable for DictionaryVariableKey {}

impl_expr_ops!(DictionaryVariableKey);
impl_expr_display!(DictionaryVariableKey);

#[derive(Debug, Clone)]
pub enum DictionaryVariable {
    NonSlack(StandardVariableKey),
    Slack(usize),
    Auxiliary,
}

impl DictionaryVariable {
    pub fn new_non_slack(var: StandardVariableKey) -> Self {
        DictionaryVariable::NonSlack(var)
    }

    pub fn new_slack(index: usize) -> Self {
        DictionaryVariable::Slack(index)
    }

    pub fn new_auxiliary() -> Self {
        DictionaryVariable::Auxiliary
    }
}

impl fmt::Display for DictionaryVariable {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            DictionaryVariable::NonSlack(var) => write!(f, "DictVar({})", var),
            DictionaryVariable::Slack(index) => write!(f, "DictVar(Slack_{})", index),
            DictionaryVariable::Auxiliary => write!(f, "DictVar(Aux)"),
        }
    }
}