123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680 |
- /*-----------------------------------------------------------------------------
- | Copyright (c) 2013-2017, Nucleic Development Team.
- |
- | Distributed under the terms of the Modified BSD License.
- |
- | The full license is in the file LICENSE, distributed with this software.
- |----------------------------------------------------------------------------*/
- #pragma once
- #include <vector>
- #include "constraint.h"
- #include "expression.h"
- #include "term.h"
- #include "variable.h"
- namespace kiwi
- {
- // Variable multiply, divide, and unary invert
- inline
- Term operator*( const Variable& variable, double coefficient )
- {
- return Term( variable, coefficient );
- }
- inline
- Term operator/( const Variable& variable, double denominator )
- {
- return variable * ( 1.0 / denominator );
- }
- inline
- Term operator-( const Variable& variable )
- {
- return variable * -1.0;
- }
- // Term multiply, divide, and unary invert
- inline
- Term operator*( const Term& term, double coefficient )
- {
- return Term( term.variable(), term.coefficient() * coefficient );
- }
- inline
- Term operator/( const Term& term, double denominator )
- {
- return term * ( 1.0 / denominator );
- }
- inline
- Term operator-( const Term& term )
- {
- return term * -1.0;
- }
- // Expression multiply, divide, and unary invert
- inline
- Expression operator*( const Expression& expression, double coefficient )
- {
- std::vector<Term> terms;
- terms.reserve( expression.terms().size() );
- for (const Term &term : expression.terms())
- terms.push_back(term * coefficient);
- return Expression( std::move(terms), expression.constant() * coefficient );
- }
- inline
- Expression operator/( const Expression& expression, double denominator )
- {
- return expression * ( 1.0 / denominator );
- }
- inline
- Expression operator-( const Expression& expression )
- {
- return expression * -1.0;
- }
- // Double multiply
- inline
- Expression operator*( double coefficient, const Expression& expression )
- {
- return expression * coefficient;
- }
- inline
- Term operator*( double coefficient, const Term& term )
- {
- return term * coefficient;
- }
- inline
- Term operator*( double coefficient, const Variable& variable )
- {
- return variable * coefficient;
- }
- // Expression add and subtract
- inline
- Expression operator+( const Expression& first, const Expression& second )
- {
- std::vector<Term> terms;
- terms.reserve( first.terms().size() + second.terms().size() );
- terms.insert( terms.begin(), first.terms().begin(), first.terms().end() );
- terms.insert( terms.end(), second.terms().begin(), second.terms().end() );
- return Expression( std::move(terms), first.constant() + second.constant() );
- }
- inline
- Expression operator+( const Expression& first, const Term& second )
- {
- std::vector<Term> terms;
- terms.reserve( first.terms().size() + 1 );
- terms.insert( terms.begin(), first.terms().begin(), first.terms().end() );
- terms.push_back( second );
- return Expression( std::move(terms), first.constant() );
- }
- inline
- Expression operator+( const Expression& expression, const Variable& variable )
- {
- return expression + Term( variable );
- }
- inline
- Expression operator+( const Expression& expression, double constant )
- {
- return Expression( expression.terms(), expression.constant() + constant );
- }
- inline
- Expression operator-( const Expression& first, const Expression& second )
- {
- return first + -second;
- }
- inline
- Expression operator-( const Expression& expression, const Term& term )
- {
- return expression + -term;
- }
- inline
- Expression operator-( const Expression& expression, const Variable& variable )
- {
- return expression + -variable;
- }
- inline
- Expression operator-( const Expression& expression, double constant )
- {
- return expression + -constant;
- }
- // Term add and subtract
- inline
- Expression operator+( const Term& term, const Expression& expression )
- {
- return expression + term;
- }
- inline
- Expression operator+( const Term& first, const Term& second )
- {
- return Expression( { first, second } );
- }
- inline
- Expression operator+( const Term& term, const Variable& variable )
- {
- return term + Term( variable );
- }
- inline
- Expression operator+( const Term& term, double constant )
- {
- return Expression( term, constant );
- }
- inline
- Expression operator-( const Term& term, const Expression& expression )
- {
- return -expression + term;
- }
- inline
- Expression operator-( const Term& first, const Term& second )
- {
- return first + -second;
- }
- inline
- Expression operator-( const Term& term, const Variable& variable )
- {
- return term + -variable;
- }
- inline
- Expression operator-( const Term& term, double constant )
- {
- return term + -constant;
- }
- // Variable add and subtract
- inline
- Expression operator+( const Variable& variable, const Expression& expression )
- {
- return expression + variable;
- }
- inline
- Expression operator+( const Variable& variable, const Term& term )
- {
- return term + variable;
- }
- inline
- Expression operator+( const Variable& first, const Variable& second )
- {
- return Term( first ) + second;
- }
- inline
- Expression operator+( const Variable& variable, double constant )
- {
- return Term( variable ) + constant;
- }
- inline
- Expression operator-( const Variable& variable, const Expression& expression )
- {
- return variable + -expression;
- }
- inline
- Expression operator-( const Variable& variable, const Term& term )
- {
- return variable + -term;
- }
- inline
- Expression operator-( const Variable& first, const Variable& second )
- {
- return first + -second;
- }
- inline
- Expression operator-( const Variable& variable, double constant )
- {
- return variable + -constant;
- }
- // Double add and subtract
- inline
- Expression operator+( double constant, const Expression& expression )
- {
- return expression + constant;
- }
- inline
- Expression operator+( double constant, const Term& term )
- {
- return term + constant;
- }
- inline
- Expression operator+( double constant, const Variable& variable )
- {
- return variable + constant;
- }
- inline
- Expression operator-( double constant, const Expression& expression )
- {
- return -expression + constant;
- }
- inline
- Expression operator-( double constant, const Term& term )
- {
- return -term + constant;
- }
- inline
- Expression operator-( double constant, const Variable& variable )
- {
- return -variable + constant;
- }
- // Expression relations
- inline
- Constraint operator==( const Expression& first, const Expression& second )
- {
- return Constraint( first - second, OP_EQ );
- }
- inline
- Constraint operator==( const Expression& expression, const Term& term )
- {
- return expression == Expression( term );
- }
- inline
- Constraint operator==( const Expression& expression, const Variable& variable )
- {
- return expression == Term( variable );
- }
- inline
- Constraint operator==( const Expression& expression, double constant )
- {
- return expression == Expression( constant );
- }
- inline
- Constraint operator<=( const Expression& first, const Expression& second )
- {
- return Constraint( first - second, OP_LE );
- }
- inline
- Constraint operator<=( const Expression& expression, const Term& term )
- {
- return expression <= Expression( term );
- }
- inline
- Constraint operator<=( const Expression& expression, const Variable& variable )
- {
- return expression <= Term( variable );
- }
- inline
- Constraint operator<=( const Expression& expression, double constant )
- {
- return expression <= Expression( constant );
- }
- inline
- Constraint operator>=( const Expression& first, const Expression& second )
- {
- return Constraint( first - second, OP_GE );
- }
- inline
- Constraint operator>=( const Expression& expression, const Term& term )
- {
- return expression >= Expression( term );
- }
- inline
- Constraint operator>=( const Expression& expression, const Variable& variable )
- {
- return expression >= Term( variable );
- }
- inline
- Constraint operator>=( const Expression& expression, double constant )
- {
- return expression >= Expression( constant );
- }
- // Term relations
- inline
- Constraint operator==( const Term& term, const Expression& expression )
- {
- return expression == term;
- }
- inline
- Constraint operator==( const Term& first, const Term& second )
- {
- return Expression( first ) == second;
- }
- inline
- Constraint operator==( const Term& term, const Variable& variable )
- {
- return Expression( term ) == variable;
- }
- inline
- Constraint operator==( const Term& term, double constant )
- {
- return Expression( term ) == constant;
- }
- inline
- Constraint operator<=( const Term& term, const Expression& expression )
- {
- return expression >= term;
- }
- inline
- Constraint operator<=( const Term& first, const Term& second )
- {
- return Expression( first ) <= second;
- }
- inline
- Constraint operator<=( const Term& term, const Variable& variable )
- {
- return Expression( term ) <= variable;
- }
- inline
- Constraint operator<=( const Term& term, double constant )
- {
- return Expression( term ) <= constant;
- }
- inline
- Constraint operator>=( const Term& term, const Expression& expression )
- {
- return expression <= term;
- }
- inline
- Constraint operator>=( const Term& first, const Term& second )
- {
- return Expression( first ) >= second;
- }
- inline
- Constraint operator>=( const Term& term, const Variable& variable )
- {
- return Expression( term ) >= variable;
- }
- inline
- Constraint operator>=( const Term& term, double constant )
- {
- return Expression( term ) >= constant;
- }
- // Variable relations
- inline
- Constraint operator==( const Variable& variable, const Expression& expression )
- {
- return expression == variable;
- }
- inline
- Constraint operator==( const Variable& variable, const Term& term )
- {
- return term == variable;
- }
- inline
- Constraint operator==( const Variable& first, const Variable& second )
- {
- return Term( first ) == second;
- }
- inline
- Constraint operator==( const Variable& variable, double constant )
- {
- return Term( variable ) == constant;
- }
- inline
- Constraint operator<=( const Variable& variable, const Expression& expression )
- {
- return expression >= variable;
- }
- inline
- Constraint operator<=( const Variable& variable, const Term& term )
- {
- return term >= variable;
- }
- inline
- Constraint operator<=( const Variable& first, const Variable& second )
- {
- return Term( first ) <= second;
- }
- inline
- Constraint operator<=( const Variable& variable, double constant )
- {
- return Term( variable ) <= constant;
- }
- inline
- Constraint operator>=( const Variable& variable, const Expression& expression )
- {
- return expression <= variable;
- }
- inline
- Constraint operator>=( const Variable& variable, const Term& term )
- {
- return term <= variable;
- }
- inline
- Constraint operator>=( const Variable& first, const Variable& second )
- {
- return Term( first ) >= second;
- }
- inline
- Constraint operator>=( const Variable& variable, double constant )
- {
- return Term( variable ) >= constant;
- }
- // Double relations
- inline
- Constraint operator==( double constant, const Expression& expression )
- {
- return expression == constant;
- }
- inline
- Constraint operator==( double constant, const Term& term )
- {
- return term == constant;
- }
- inline
- Constraint operator==( double constant, const Variable& variable )
- {
- return variable == constant;
- }
- inline
- Constraint operator<=( double constant, const Expression& expression )
- {
- return expression >= constant;
- }
- inline
- Constraint operator<=( double constant, const Term& term )
- {
- return term >= constant;
- }
- inline
- Constraint operator<=( double constant, const Variable& variable )
- {
- return variable >= constant;
- }
- inline
- Constraint operator>=( double constant, const Expression& expression )
- {
- return expression <= constant;
- }
- inline
- Constraint operator>=( double constant, const Term& term )
- {
- return term <= constant;
- }
- inline
- Constraint operator>=( double constant, const Variable& variable )
- {
- return variable <= constant;
- }
- // Constraint strength modifier
- inline
- Constraint operator|( const Constraint& constraint, double strength )
- {
- return Constraint( constraint, strength );
- }
- inline
- Constraint operator|( double strength, const Constraint& constraint )
- {
- return constraint | strength;
- }
- } // namespace kiwi
|