#ifndef NODE_H #define NODE_H #include #include #include "graph.h" #include "mor.h" #include "dor.h" #include "por.h" class Node { private: double value; long int uid; double gradient_recursive(Graph* graph, const long int& current_uid, const long int& stop_uid) const; public: Node(const double& value=0); Node(const Node& node); static Node monadic_operation(const Node& n, MonadicOperationResult (*)(const double&)); static Node dyadic_operation(const Node& l, const Node& r, DyadicOperationResult (*)(const double&, const double&)); static Node polyadic_operation(const std::vector& nodes, PolyadicOperationResult (*)(const std::vector&)); double gradient(const Node& node) const; std::vector gradient(const std::vector& nodes) const; std::vector > gradient(const std::vector >& nodes) const; friend Node operator+(const Node& l, const Node& r); friend Node operator-(const Node& l, const Node& r); friend Node operator*(const Node& l, const Node& r); friend Node operator/(const Node& l, const Node& r); Node& operator+=(const Node& r); Node& operator-=(const Node& r); Node& operator*=(const Node& r); Node& operator/=(const Node& r); friend bool operator==(const Node& l, const Node& r); friend bool operator<(const Node& l, const Node& r); friend bool operator>(const Node& l, const Node& r); friend bool operator<=(const Node& l, const Node& r); friend bool operator>=(const Node& l, const Node& r); friend Node sin(const Node& x); friend Node cos(const Node& x); friend Node tan(const Node& x); friend Node sinh(const Node& x); friend Node cosh(const Node& x); friend Node tanh(const Node& x); friend Node asin(const Node& x); friend Node acos(const Node& x); friend Node atan(const Node& x); friend Node log(const Node& x, const Node& base); friend Node log10(const Node& x); friend Node ln(const Node& x); friend Node pow(const Node& x, const Node& p); friend Node exp(const Node& x); friend Node sqrt(const Node& x); friend Node abs(const Node& x); friend Node min(const Node& l, const Node& r); friend Node max(const Node& l, const Node& r); friend std::ostream& operator<<(std::ostream& os, const Node& node); }; #endif /* end of include guard: NODE_H */