Program Listing for File rewrite.cpp

Return to documentation for file (symengine/symengine/rewrite.cpp)

#include <symengine/visitor.h>
#include <symengine/basic.h>

namespace SymEngine
{

class RewriteAsExp : public BaseVisitor<RewriteAsExp, TransformVisitor>
{
public:
    using TransformVisitor::bvisit;

    RewriteAsExp() : BaseVisitor<RewriteAsExp, TransformVisitor>()
    {
    }

    void bvisit(const Sin &x)
    {
        auto farg = x.get_arg();
        auto newarg = apply(farg);
        auto expo = mul(I, newarg);
        auto a = exp(expo);
        auto b = exp(neg(expo));
        result_ = div(sub(a, b), mul(integer(2), I));
    }

    void bvisit(const Cos &x)
    {
        auto farg = x.get_arg();
        auto newarg = apply(farg);
        auto expo = mul(I, newarg);
        auto a = exp(expo);
        auto b = exp(neg(expo));
        result_ = div(add(a, b), integer(2));
    }

    void bvisit(const Tan &x)
    {
        auto farg = x.get_arg();
        auto newarg = apply(farg);
        auto expo = mul(I, newarg);
        auto a = exp(expo);
        auto b = exp(neg(expo));
        result_ = div(sub(a, b), mul(I, add(a, b)));
    }

    void bvisit(const Cot &x)
    {
        auto farg = x.get_arg();
        auto newarg = apply(farg);
        auto expo = mul(I, newarg);
        auto a = exp(expo);
        auto b = exp(neg(expo));
        result_ = div(mul(I, add(a, b)), sub(a, b));
    }

    void bvisit(const Csc &x)
    {
        auto farg = x.get_arg();
        auto newarg = apply(farg);
        auto expo = mul(I, newarg);
        auto a = exp(expo);
        auto b = exp(neg(expo));
        result_ = div(mul(I, integer(2)), sub(a, b));
    }

    void bvisit(const Sec &x)
    {
        auto farg = x.get_arg();
        auto newarg = apply(farg);
        auto expo = mul(I, newarg);
        auto a = exp(expo);
        auto b = exp(neg(expo));
        result_ = div(integer(2), add(a, b));
    }

    void bvisit(const Sinh &x)
    {
        auto farg = x.get_arg();
        auto newarg = apply(farg);
        result_ = div(sub(exp(newarg), exp(neg(newarg))), integer(2));
    }

    void bvisit(const Cosh &x)
    {
        auto farg = x.get_arg();
        auto newarg = apply(farg);
        result_ = div(add(exp(newarg), exp(neg(newarg))), integer(2));
    }

    void bvisit(const Tanh &x)
    {
        auto farg = x.get_arg();
        auto newarg = apply(farg);
        auto pos_exp = exp(newarg);
        auto neg_exp = exp(neg(newarg));
        result_ = div(sub(pos_exp, neg_exp), add(pos_exp, neg_exp));
    }

    void bvisit(const Csch &x)
    {
        auto farg = x.get_arg();
        auto newarg = apply(farg);
        auto pos_exp = exp(newarg);
        auto neg_exp = exp(neg(newarg));
        result_ = div(integer(2), sub(pos_exp, neg_exp));
    }

    void bvisit(const Sech &x)
    {
        auto farg = x.get_arg();
        auto newarg = apply(farg);
        auto pos_exp = exp(newarg);
        auto neg_exp = exp(neg(newarg));
        result_ = div(integer(2), add(pos_exp, neg_exp));
    }

    void bvisit(const Coth &x)
    {
        auto farg = x.get_arg();
        auto newarg = apply(farg);
        auto pos_exp = exp(newarg);
        auto neg_exp = exp(neg(newarg));
        result_ = div(add(pos_exp, neg_exp), sub(pos_exp, neg_exp));
    }
};

RCP<const Basic> rewrite_as_exp(const RCP<const Basic> &x)
{
    RewriteAsExp b;
    return b.apply(x);
}

} // SymEngine