26 constexpr
bool operator==(
const T&)
const {
return false; }
32 template<
class LHS,
typename Op,
class RHS>
36 BinaryOp(
const LHS& l,
const RHS& r): _l(l), _r(r) {}
39 template<
class LHS,
class RHS,
class Op,
class Var,
class Arg>
43 template<
class LHS,
class RHS,
44 typename =
typename std::enable_if<(std::is_arithmetic<LHS>::value && std::is_arithmetic<RHS>::value)>::type>
47 template<
class LHS, std::intmax_t num, std::intmax_t den,
48 typename =
typename std::enable_if<std::is_arithmetic<LHS>::value>::type>
52 typename =
typename std::enable_if<std::is_arithmetic<LHS>::value>::type>
56 typename =
typename std::enable_if<std::is_arithmetic<LHS>::value>::type>
60 typename =
typename std::enable_if<std::is_base_of<Eigen::EigenBase<LHS>, LHS>::value>::type>
74 template<
size_t Power>
77 static auto eval(Arg_t x)
82 struct PowerOpSub<1> {
83 template<
class Arg_t>
static Arg_t eval(Arg_t x) {
return x; }
87 struct PowerOpSub<0> {
88 template<
class Arg_t>
static Unity eval(Arg_t x) {
return Unity(); }
92 template<std::
intmax_t num1, std::
intmax_t den1, std::
intmax_t num2>
110 static constexpr
int leftBindingPower = 20;
112 static constexpr
bool commutative =
true;
113 static constexpr
bool associative =
true;
118 static inline std::string
repr() {
return "+"; }
120 template<
class L,
class R>
static auto apply(
const L& l,
const R& r) ->
STATOR_AUTORETURN(l + r);
124 static constexpr
int leftBindingPower = 20;
126 static constexpr
bool commutative =
false;
127 static constexpr
bool associative =
false;
132 static inline std::string
repr() {
return "-"; }
133 template<
class L,
class R>
static auto apply(
const L& l,
const R& r) ->
STATOR_AUTORETURN(l - r);
137 static constexpr
int leftBindingPower = 30;
139 static constexpr
bool commutative =
true;
140 static constexpr
bool associative =
true;
145 static inline std::string
repr() {
return "*"; }
146 template<
class L,
class R>
static auto apply(
const L& l,
const R& r) ->
STATOR_AUTORETURN(l * r);
150 static constexpr
int leftBindingPower = 30;
152 static constexpr
bool commutative =
false;
153 static constexpr
bool associative =
false;
158 static inline std::string
repr() {
return "/"; }
159 template<
class L,
class R>
static auto apply(
const L& l,
const R& r) ->
STATOR_AUTORETURN(l / r);
163 static constexpr
int leftBindingPower = 40;
165 static constexpr
bool commutative =
false;
166 static constexpr
bool associative =
false;
167 static inline std::string
repr() {
return "^"; }
174 template<
class L,
class R,
175 typename =
typename std::enable_if<!std::is_base_of<Eigen::EigenBase<R>, R>::value>::type>
186 template <
class Op,
class OverOp>
189 template <
class Op,
class OverOp>
192 template <
class Op,
class OverOp>
207 template<
class LHS,
class RHS>
214 typename =
typename std::enable_if<IsSymbolic<SymbolicOperator>::value>::type>
219 typename =
typename std::enable_if<IsSymbolic<SymbolicOperator>::value>::type>
223 template<
class LHS,
class RHS,
224 typename =
typename std::enable_if<ApplySymbolicOps<LHS, RHS>::value>::type>
225 auto operator+(
const LHS& l,
const RHS& r)
229 template<
class LHS,
class RHS,
230 typename =
typename std::enable_if<ApplySymbolicOps<LHS, RHS>::value>::type>
231 auto operator*(
const LHS& l,
const RHS& r)
235 template<
class LHS,
class RHS,
236 typename =
typename std::enable_if<ApplySymbolicOps<LHS, RHS>::value>::type>
237 auto operator-(
const LHS& l,
const RHS& r)
241 template<
class LHS,
class RHS,
242 typename =
typename std::enable_if<ApplySymbolicOps<LHS, RHS>::value>::type>
243 auto operator/(
const LHS& l,
const RHS& r)
247 template<
class LHS,
class RHS,
248 typename =
typename std::enable_if<ApplySymbolicOps<LHS, RHS>::value>::type>
249 auto pow(
const LHS& l,
const RHS& r)
254 template<
class Var,
class LHS,
class RHS>
260 template<
class Var,
class LHS,
class RHS>
266 template<
class Var,
class LHS,
class RHS>
274 template<
class Var,
class LHS,
class RHS>
280 template<
class Var,
class Arg, std::
intmax_t num, std::
intmax_t den>
286 template<
class Var,
class Arg,
class Power>
Simple combination rule to enable Symbolic operations, but avoid redundantly specifying where two Sym...
#define STATOR_AUTORETURN_BYVALUE(EXPR)
A convenience Macro for defining auto by-value return type functions.
auto pow(const C< num1, den1 > &l, const C< num2, 1 > &r) -> STATOR_AUTORETURN(PowerOpSub< num2 >::eval(sub(l, num2)))
Symbolic representation of a variable.
constexpr bool operator==(const T &) const
auto operator-(const Arg &l) -> STATOR_AUTORETURN(C<-1 >() *l) template< class LHS, class RHS, typename=typename std::enable_if< ApplySymbolicOps< LHS, RHS >::value >::type > auto operator+(const LHS &l, const RHS &r) -> STATOR_AUTORETURN((AddOp< decltype(store(l)), decltype(store(r))>(l, r))) template< class LHS, class RHS, typename=typename std::enable_if< ApplySymbolicOps< LHS, RHS >::value >::type > auto operator*(const LHS &l, const RHS &r) -> STATOR_AUTORETURN((MultiplyOp< decltype(store(l)), decltype(store(r))>(l, r))) template< class LHS, class RHS, typename=typename std::enable_if< ApplySymbolicOps< LHS, RHS >::value >::type > auto operator-(const LHS &l, const RHS &r) -> STATOR_AUTORETURN((SubtractOp< decltype(store(l)), decltype(store(r))>(l, r))) template< class LHS, class RHS, typename=typename std::enable_if< ApplySymbolicOps< LHS, RHS >::value >::type > auto operator/(const LHS &l, const RHS &r) -> STATOR_AUTORETURN((DivideOp< decltype(store(l)), decltype(store(r))>(l, r))) template< class LHS, class RHS, typename=typename std::enable_if< ApplySymbolicOps< LHS, RHS >::value >::type > auto pow(const LHS &l, const RHS &r) -> STATOR_AUTORETURN((PowerOp< decltype(store(l)), decltype(store(r))>(l, r)))
Symbolic unary negation operator.
static std::string repr()
A class representing a compile-time rational constant (i.e., std::ratio).
BinaryOp(const LHS &l, const RHS &r)
Symbolic representation of a binary symbolic operation.
constexpr auto operator/(C< n1, d1 >, C< n2, d2 >) -> STATOR_AUTORETURN((typename detail::C_wrap< std::ratio_divide< std::ratio< n1, d1 >, std::ratio< n2, d2 > > >::type()))
Arg operator+(const Arg &l)
Symbolic unary positive operator.
static std::string repr()
C< 1 > Unity
A symbolic representation of one.
constexpr auto operator*(C< n1, d1 >, C< n2, d2 >) -> STATOR_AUTORETURN((typename detail::C_wrap< std::ratio_multiply< std::ratio< n1, d1 >, std::ratio< n2, d2 > > >::type()))
static std::string repr()
Symbolic representation of a variable substitution.
#define STATOR_AUTORETURN(EXPR)
A convenience Macro for defining auto return type functions.
The stator symbolic math library.
static std::string repr()
auto sub(BinaryOp< LHS, Op, RHS > f, Relation< Var, Arg > x) -> STATOR_AUTORETURN_BYVALUE(Op::apply(sub(f._l, x), sub(f._r, x)))
auto derivative(const Expression &)
Performs a symbolic derivative on the expression.
auto pow(const LHS &l, const RHS &r) -> STATOR_AUTORETURN(std::pow(l, r))
A type trait to denote symbolic terms (i.e., one that is not yet immediately evaluable to a "normal" ...
static std::string repr()
auto store(const T &val) -> decltype(store_impl(val, select_overload