41#ifndef BERTINI_NODE_BASE_HPP
42#define BERTINI_NODE_BASE_HPP
51#include <boost/type_index.hpp>
57#include <boost/archive/text_oarchive.hpp>
58#include <boost/archive/text_iarchive.hpp>
59#include <boost/serialization/export.hpp>
60#include <boost/serialization/shared_ptr.hpp>
61#include <boost/serialization/vector.hpp>
62#include <boost/serialization/tracking.hpp>
63#include <boost/serialization/base_object.hpp>
64#include <boost/serialization/nvp.hpp>
76using VariableGroup = std::vector< std::shared_ptr<node::Variable> >;
80enum class VariableGroupType
92 struct FreshEvalSelector
96 struct FreshEvalSelector<dbl>
100 static dbl Run(N
const& n, std::shared_ptr<Variable>
const& diff_variable)
102 return n.FreshEval_d(diff_variable);
107 static void RunInPlace(dbl& evaluation_value, N
const& n, std::shared_ptr<Variable>
const& diff_variable)
109 n.FreshEval_d(evaluation_value, diff_variable);
115 struct FreshEvalSelector<mpfr_complex>
118 static mpfr_complex Run(N
const& n, std::shared_ptr<Variable>
const& diff_variable)
120 return n.FreshEval_mp(diff_variable);
125 static void RunInPlace(mpfr_complex& evaluation_value, N
const& n, std::shared_ptr<Variable>
const& diff_variable)
127 n.FreshEval_mp(evaluation_value, diff_variable);
141class Node :
public virtual VisitableBase<>,
public std::enable_shared_from_this<Node>
143 friend detail::FreshEvalSelector<dbl>;
144 friend detail::FreshEvalSelector<mpfr_complex>;
147 virtual ~Node() =
default;
173 T
Eval(std::shared_ptr<Variable>
const& diff_variable =
nullptr)
const
191 void EvalInPlace(T& eval_value, std::shared_ptr<Variable>
const& diff_variable =
nullptr)
const;
230 virtual void print(std::ostream& target)
const = 0;
240 virtual std::shared_ptr<Node>
Differentiate(std::shared_ptr<Variable>
const& v =
nullptr)
const = 0;
248 virtual int Degree(std::shared_ptr<Variable>
const& v =
nullptr)
const = 0;
257 virtual std::vector<int>
MultiDegree(VariableGroup
const& vars)
const = 0;
265 virtual int Degree(VariableGroup
const& vars)
const = 0;
273 virtual void Homogenize(VariableGroup
const& vars, std::shared_ptr<Variable>
const& homvar) = 0;
280 virtual bool IsHomogeneous(std::shared_ptr<Variable>
const& v =
nullptr)
const = 0;
325 mutable std::tuple< std::pair<dbl,bool>, std::pair<mpfr_complex,bool> > current_value_;
336 virtual dbl
FreshEval_d(std::shared_ptr<Variable>
const&)
const = 0;
343 virtual void FreshEval_d(dbl& evaluation_value, std::shared_ptr<Variable>
const&)
const = 0;
351 virtual mpfr_complex
FreshEval_mp(std::shared_ptr<Variable>
const&)
const = 0;
358 virtual void FreshEval_mp(mpfr_complex& evaluation_value, std::shared_ptr<Variable>
const&)
const = 0;
374 friend std::ostream&
operator<<(std::ostream & out,
const Node& N);
376 friend class boost::serialization::access;
378 template <
typename Archive>
379 void serialize(Archive& ar,
const unsigned version) {
380 register_derived_node_types(ar);
388 inline std::ostream&
operator<<(std::ostream & out,
const Node& N)
394 inline std::ostream&
operator<<(std::ostream & out,
const std::shared_ptr<Node>& N)
410 struct EnableSharedFromThisVirtual:
public virtual Node
415 std::shared_ptr<T> shared_from_this() {
416 return std::dynamic_pointer_cast<T>(Node::shared_from_this());
419 std::shared_ptr<const T> shared_from_this()
const{
420 return std::dynamic_pointer_cast<const T>(Node::shared_from_this());
425 template <
class ThisT>
426 std::shared_ptr<ThisT> downcast_shared_from_this(){
427 return std::dynamic_pointer_cast<ThisT>(Node::shared_from_this());
430 template <
class ThisT>
431 std::shared_ptr<const ThisT> downcast_shared_from_this()
const{
432 return std::dynamic_pointer_cast<const ThisT>(Node::shared_from_this());
The base class for visitable types.
Definition visitable.hpp:88
Abstract base class for the Bertini hybrid-precision (double-multiple) expression tree.
Definition node.hpp:142
bool IsPolynomial(VariableGroup const &v) const
virtual void FreshEval_mp(mpfr_complex &evaluation_value, std::shared_ptr< Variable > const &) const =0
virtual void Homogenize(VariableGroup const &vars, std::shared_ptr< Variable > const &homvar)=0
bool IsPolynomial(std::shared_ptr< Variable > const &v=nullptr) const
virtual mpfr_complex FreshEval_mp(std::shared_ptr< Variable > const &) const =0
virtual unsigned EliminateZeros()=0
A transform function, which eliminates nodes from the tree.
virtual int Degree(std::shared_ptr< Variable > const &v=nullptr) const =0
virtual unsigned EliminateOnes()=0
A transform function, which eliminates nodes from the tree.
virtual int Degree(VariableGroup const &vars) const =0
virtual bool IsHomogeneous(std::shared_ptr< Variable > const &v=nullptr) const =0
void ResetStoredValues() const
virtual bool IsHomogeneous(VariableGroup const &vars) const =0
T Eval(std::shared_ptr< Variable > const &diff_variable=nullptr) const
Definition node.hpp:173
virtual std::shared_ptr< Node > Differentiate(std::shared_ptr< Variable > const &v=nullptr) const =0
Compute the derivative with respect to a single variable.
friend std::ostream & operator<<(std::ostream &out, const Node &N)
Definition node.hpp:388
virtual void print(std::ostream &target) const =0
virtual unsigned ReduceDepth()
A mutating function which finds ways to reduce the depth of the tree.
void EvalInPlace(T &eval_value, std::shared_ptr< Variable > const &diff_variable=nullptr) const
virtual void FreshEval_d(dbl &evaluation_value, std::shared_ptr< Variable > const &) const =0
virtual std::vector< int > MultiDegree(VariableGroup const &vars) const =0
virtual void precision(unsigned int prec) const =0
virtual void Reset() const =0
virtual dbl FreshEval_d(std::shared_ptr< Variable > const &) const =0
Represents variable leaves in the function tree.
Definition variable.hpp:59
Forward declarations for types in the node:: namespace.
std::ostream & operator<<(std::ostream &out, const Node &N)
Definition node.hpp:388
Provides an Eigen-like NumTraits struct for querying traits of a number type.
Contains the visitable base types.