blob: 229128dcf12999a39169f7fd558b13e89aaafe70 [file] [log] [blame]
use ::std::ops;
use {
Term,
Variable,
Expression,
WeightedRelation,
PartialConstraint,
Constraint
};
// Relation
impl ops::BitOr<WeightedRelation> for f64 {
type Output = PartialConstraint;
fn bitor(self, r: WeightedRelation) -> PartialConstraint {
PartialConstraint(self.into(), r)
}
}
impl ops::BitOr<WeightedRelation> for f32 {
type Output = PartialConstraint;
fn bitor(self, r: WeightedRelation) -> PartialConstraint {
(self as f64).bitor(r)
}
}
impl ops::BitOr<WeightedRelation> for Variable {
type Output = PartialConstraint;
fn bitor(self, r: WeightedRelation) -> PartialConstraint {
PartialConstraint(self.into(), r)
}
}
impl ops::BitOr<WeightedRelation> for Term {
type Output = PartialConstraint;
fn bitor(self, r: WeightedRelation) -> PartialConstraint {
PartialConstraint(self.into(), r)
}
}
impl ops::BitOr<WeightedRelation> for Expression {
type Output = PartialConstraint;
fn bitor(self, r: WeightedRelation) -> PartialConstraint {
PartialConstraint(self.into(), r)
}
}
impl ops::BitOr<f64> for PartialConstraint {
type Output = Constraint;
fn bitor(self, rhs: f64) -> Constraint {
let (op, s) = self.1.into();
Constraint::new(self.0 - rhs, op, s)
}
}
impl ops::BitOr<f32> for PartialConstraint {
type Output = Constraint;
fn bitor(self, rhs: f32) -> Constraint {
self.bitor(rhs as f64)
}
}
impl ops::BitOr<Variable> for PartialConstraint {
type Output = Constraint;
fn bitor(self, rhs: Variable) -> Constraint {
let (op, s) = self.1.into();
Constraint::new(self.0 - rhs, op, s)
}
}
impl ops::BitOr<Term> for PartialConstraint {
type Output = Constraint;
fn bitor(self, rhs: Term) -> Constraint {
let (op, s) = self.1.into();
Constraint::new(self.0 - rhs, op, s)
}
}
impl ops::BitOr<Expression> for PartialConstraint {
type Output = Constraint;
fn bitor(self, rhs: Expression) -> Constraint {
let (op, s) = self.1.into();
Constraint::new(self.0 - rhs, op, s)
}
}
// Variable
impl ops::Add<f64> for Variable {
type Output = Expression;
fn add(self, v: f64) -> Expression {
Expression::new(vec![Term::new(self, 1.0)], v)
}
}
impl ops::Add<f32> for Variable {
type Output = Expression;
fn add(self, v: f32) -> Expression {
self.add(v as f64)
}
}
impl ops::Add<Variable> for f64 {
type Output = Expression;
fn add(self, v: Variable) -> Expression {
Expression::new(vec![Term::new(v, 1.0)], self)
}
}
impl ops::Add<Variable> for f32 {
type Output = Expression;
fn add(self, v: Variable) -> Expression {
(self as f64).add(v)
}
}
impl ops::Add<Variable> for Variable {
type Output = Expression;
fn add(self, v: Variable) -> Expression {
Expression::new(vec![Term::new(self, 1.0), Term::new(v, 1.0)], 0.0)
}
}
impl ops::Add<Term> for Variable {
type Output = Expression;
fn add(self, t: Term) -> Expression {
Expression::new(vec![Term::new(self, 1.0), t], 0.0)
}
}
impl ops::Add<Variable> for Term {
type Output = Expression;
fn add(self, v: Variable) -> Expression {
Expression::new(vec![self, Term::new(v, 1.0)], 0.0)
}
}
impl ops::Add<Expression> for Variable {
type Output = Expression;
fn add(self, mut e: Expression) -> Expression {
e.terms.push(Term::new(self, 1.0));
e
}
}
impl ops::Add<Variable> for Expression {
type Output = Expression;
fn add(mut self, v: Variable) -> Expression {
self.terms.push(Term::new(v, 1.0));
self
}
}
impl ops::Neg for Variable {
type Output = Term;
fn neg(self) -> Term {
Term::new(self, -1.0)
}
}
impl ops::Sub<f64> for Variable {
type Output = Expression;
fn sub(self, v: f64) -> Expression {
Expression::new(vec![Term::new(self, 1.0)], -v)
}
}
impl ops::Sub<f32> for Variable {
type Output = Expression;
fn sub(self, v: f32) -> Expression {
self.sub(v as f64)
}
}
impl ops::Sub<Variable> for f64 {
type Output = Expression;
fn sub(self, v: Variable) -> Expression {
Expression::new(vec![Term::new(v, -1.0)], self)
}
}
impl ops::Sub<Variable> for f32 {
type Output = Expression;
fn sub(self, v: Variable) -> Expression {
(self as f64).sub(v)
}
}
impl ops::Sub<Variable> for Variable {
type Output = Expression;
fn sub(self, v: Variable) -> Expression {
Expression::new(vec![Term::new(self, 1.0), Term::new(v, -1.0)], 0.0)
}
}
impl ops::Sub<Term> for Variable {
type Output = Expression;
fn sub(self, t: Term) -> Expression {
Expression::new(vec![Term::new(self, 1.0), -t], 0.0)
}
}
impl ops::Sub<Variable> for Term {
type Output = Expression;
fn sub(self, v: Variable) -> Expression {
Expression::new(vec![self, Term::new(v, -1.0)], 0.0)
}
}
impl ops::Sub<Expression> for Variable {
type Output = Expression;
fn sub(self, mut e: Expression) -> Expression {
e.negate();
e.terms.push(Term::new(self, 1.0));
e
}
}
impl ops::Sub<Variable> for Expression {
type Output = Expression;
fn sub(mut self, v: Variable) -> Expression {
self.terms.push(Term::new(v, -1.0));
self
}
}
impl ops::Mul<f64> for Variable {
type Output = Term;
fn mul(self, v: f64) -> Term {
Term::new(self, v)
}
}
impl ops::Mul<f32> for Variable {
type Output = Term;
fn mul(self, v: f32) -> Term {
self.mul(v as f64)
}
}
impl ops::Mul<Variable> for f64 {
type Output = Term;
fn mul(self, v: Variable) -> Term {
Term::new(v, self)
}
}
impl ops::Mul<Variable> for f32 {
type Output = Term;
fn mul(self, v: Variable) -> Term {
(self as f64).mul(v)
}
}
impl ops::Div<f64> for Variable {
type Output = Term;
fn div(self, v: f64) -> Term {
Term::new(self, 1.0 / v)
}
}
impl ops::Div<f32> for Variable {
type Output = Term;
fn div(self, v: f32) -> Term {
self.div(v as f64)
}
}
// Term
impl ops::Mul<f64> for Term {
type Output = Term;
fn mul(mut self, v: f64) -> Term {
self.coefficient *= v;
self
}
}
impl ops::Mul<f32> for Term {
type Output = Term;
fn mul(self, v: f32) -> Term {
self.mul(v as f64)
}
}
impl ops::Mul<Term> for f64 {
type Output = Term;
fn mul(self, mut t: Term) -> Term {
t.coefficient *= self;
t
}
}
impl ops::Mul<Term> for f32 {
type Output = Term;
fn mul(self, t: Term) -> Term {
(self as f64).mul(t)
}
}
impl ops::Div<f64> for Term {
type Output = Term;
fn div(mut self, v: f64) -> Term {
self.coefficient /= v;
self
}
}
impl ops::Div<f32> for Term {
type Output = Term;
fn div(self, v: f32) -> Term {
self.div(v as f64)
}
}
impl ops::Add<f64> for Term {
type Output = Expression;
fn add(self, v: f64) -> Expression {
Expression::new(vec![self], v)
}
}
impl ops::Add<f32> for Term {
type Output = Expression;
fn add(self, v: f32) -> Expression {
self.add(v as f64)
}
}
impl ops::Add<Term> for f64 {
type Output = Expression;
fn add(self, t: Term) -> Expression {
Expression::new(vec![t], self)
}
}
impl ops::Add<Term> for f32 {
type Output = Expression;
fn add(self, t: Term) -> Expression {
(self as f64).add(t)
}
}
impl ops::Add<Term> for Term {
type Output = Expression;
fn add(self, t: Term) -> Expression {
Expression::new(vec![self, t], 0.0)
}
}
impl ops::Add<Expression> for Term {
type Output = Expression;
fn add(self, mut e: Expression) -> Expression {
e.terms.push(self);
e
}
}
impl ops::Add<Term> for Expression {
type Output = Expression;
fn add(mut self, t: Term) -> Expression {
self.terms.push(t);
self
}
}
impl ops::Neg for Term {
type Output = Term;
fn neg(mut self) -> Term {
self.coefficient = -self.coefficient;
self
}
}
impl ops::Sub<f64> for Term {
type Output = Expression;
fn sub(self, v: f64) -> Expression {
Expression::new(vec![self], -v)
}
}
impl ops::Sub<f32> for Term {
type Output = Expression;
fn sub(self, v: f32) -> Expression {
self.sub(v as f64)
}
}
impl ops::Sub<Term> for f64 {
type Output = Expression;
fn sub(self, t: Term) -> Expression {
Expression::new(vec![-t], self)
}
}
impl ops::Sub<Term> for f32 {
type Output = Expression;
fn sub(self, t: Term) -> Expression {
(self as f64).sub(t)
}
}
impl ops::Sub<Term> for Term {
type Output = Expression;
fn sub(self, t: Term) -> Expression {
Expression::new(vec![self, -t], 0.0)
}
}
impl ops::Sub<Expression> for Term {
type Output = Expression;
fn sub(self, mut e: Expression) -> Expression {
e.negate();
e.terms.push(self);
e
}
}
impl ops::Sub<Term> for Expression {
type Output = Expression;
fn sub(mut self, t: Term) -> Expression {
self.terms.push(-t);
self
}
}
// Expression
impl ops::Mul<f64> for Expression {
type Output = Expression;
fn mul(mut self, v: f64) -> Expression {
self.constant *= v;
for t in &mut self.terms {
*t = *t * v;
}
self
}
}
impl ops::Mul<f32> for Expression {
type Output = Expression;
fn mul(self, v: f32) -> Expression {
self.mul(v as f64)
}
}
impl ops::Mul<Expression> for f64 {
type Output = Expression;
fn mul(self, mut e: Expression) -> Expression {
e.constant *= self;
for t in &mut e.terms {
*t = *t * self;
}
e
}
}
impl ops::Mul<Expression> for f32 {
type Output = Expression;
fn mul(self, e: Expression) -> Expression {
(self as f64).mul(e)
}
}
impl ops::Div<f64> for Expression {
type Output = Expression;
fn div(mut self, v: f64) -> Expression {
self.constant /= v;
for t in &mut self.terms {
*t = *t / v;
}
self
}
}
impl ops::Div<f32> for Expression {
type Output = Expression;
fn div(self, v: f32) -> Expression {
self.div(v as f64)
}
}
impl ops::Add<f64> for Expression {
type Output = Expression;
fn add(mut self, v: f64) -> Expression {
self.constant += v;
self
}
}
impl ops::Add<f32> for Expression {
type Output = Expression;
fn add(self, v: f32) -> Expression {
self.add(v as f64)
}
}
impl ops::Add<Expression> for f64 {
type Output = Expression;
fn add(self, mut e: Expression) -> Expression {
e.constant += self;
e
}
}
impl ops::Add<Expression> for f32 {
type Output = Expression;
fn add(self, e: Expression) -> Expression {
(self as f64).add(e)
}
}
impl ops::Add<Expression> for Expression {
type Output = Expression;
fn add(mut self, mut e: Expression) -> Expression {
self.terms.append(&mut e.terms);
self.constant += e.constant;
self
}
}
impl ops::Neg for Expression {
type Output = Expression;
fn neg(mut self) -> Expression {
self.negate();
self
}
}
impl ops::Sub<f64> for Expression {
type Output = Expression;
fn sub(mut self, v: f64) -> Expression {
self.constant -= v;
self
}
}
impl ops::Sub<f32> for Expression {
type Output = Expression;
fn sub(self, v: f32) -> Expression {
self.sub(v as f64)
}
}
impl ops::Sub<Expression> for f64 {
type Output = Expression;
fn sub(self, mut e: Expression) -> Expression {
e.negate();
e.constant += self;
e
}
}
impl ops::Sub<Expression> for f32 {
type Output = Expression;
fn sub(self, e: Expression) -> Expression {
(self as f64).sub(e)
}
}
impl ops::Sub<Expression> for Expression {
type Output = Expression;
fn sub(mut self, mut e: Expression) -> Expression {
e.negate();
self.terms.append(&mut e.terms);
self.constant += e.constant;
self
}
}