sx_node.hpp
1 /*
2  * This file is part of CasADi.
3  *
4  * CasADi -- A symbolic framework for dynamic optimization.
5  * Copyright (C) 2010-2023 Joel Andersson, Joris Gillis, Moritz Diehl,
6  * KU Leuven. All rights reserved.
7  * Copyright (C) 2011-2014 Greg Horn
8  *
9  * CasADi is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 3 of the License, or (at your option) any later version.
13  *
14  * CasADi is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with CasADi; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  *
23  */
24 
25 
26 #ifndef CASADI_SX_NODE_HPP
27 #define CASADI_SX_NODE_HPP
28 
29 #include <iostream>
30 #include <math.h>
31 #include <sstream>
32 #include <string>
33 
37 #include "sx_elem.hpp"
38 
39 
41 namespace casadi {
42 
49  class SXNode {
50  friend class SXElem;
51  friend class Matrix<SXElem>;
52  friend class UniversalNodeOwner;
53  public:
54 
58  SXNode();
59 
63  virtual ~SXNode();
64 
66 
69  virtual bool is_constant() const { return false; }
70  virtual bool is_integer() const { return false; }
71  virtual bool is_symbolic() const { return false; }
72  virtual bool is_zero() const { return false; }
73  virtual bool is_op(casadi_int op) const { return false; }
74  virtual bool is_almost_zero(double tol) const { return false; }
75  virtual bool is_one() const { return false; }
76  virtual bool is_minus_one() const { return false; }
77  virtual bool is_nan() const { return false; }
78  virtual bool is_inf() const { return false; }
79  virtual bool is_minus_inf() const { return false; }
80  virtual bool is_call() const { return false; }
81  virtual bool is_output() const { return false; }
82  virtual bool has_output() const { return false; }
84 
86 
89  virtual double to_double() const; // only works for constant nodes
90  virtual casadi_int to_int() const; // only works for integer nodes
92 
93  // get the name
94  virtual const std::string& name() const;
95 
99  virtual std::string class_name() const = 0;
100 
104  virtual casadi_int op() const=0;
105 
109  virtual Function which_function() const;
110 
114  virtual casadi_int which_output() const;
115 
119  virtual bool is_equal(const SXNode* node, casadi_int depth) const;
120 
124  virtual casadi_int n_dep() const { return 0;}
125 
129  virtual SXElem get_output(casadi_int oind) const;
130 
134  virtual const SXElem& dep(casadi_int i) const;
135 
139  virtual SXElem& dep(casadi_int i);
140 
144  virtual bool is_smooth() const { return true; }
145 
149  virtual void disp(std::ostream& stream, bool more) const;
150 
154  void can_inline(std::map<const SXNode*, casadi_int>& nodeind) const;
155 
159  std::string print_compact(std::map<const SXNode*, casadi_int>& nodeind,
160  std::vector<std::string>& intermed) const;
161 
165  virtual std::string print(const std::string& arg1, const std::string& arg2) const = 0;
166 
167  // Check if marked (i.e. temporary is negative)
168  bool marked() const;
169 
170  // Mark by flipping the sign of the temporary and decreasing by one
171  void mark() const;
172 
176  static void safe_delete(SXNode* n);
177 
178  // Depth when checking equalities
179  static casadi_int eq_depth_;
180 
183 
185  const SXElem shared_from_this() const;
186 
191  mutable int temp;
192 
193  // Reference counter -- counts the number of parents of the node
194 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
195  std::atomic<unsigned int> count;
196 #else
197  unsigned int count;
198 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
199 
203  void serialize(SerializingStream& s) const;
204 
205  virtual void serialize_node(SerializingStream& s) const;
206 
208 
209  static std::map<casadi_int, SXNode* (*)(DeserializingStream&)> deserialize_map;
210 
211 
212  };
213 
214 } // namespace casadi
216 #endif // CASADI_SX_NODE_HPP
Helper class for Serialization.
Function object.
Definition: function.hpp:60
Sparse matrix class. SX and DM are specializations.
Definition: matrix_decl.hpp:99
The basic scalar symbolic class of CasADi.
Definition: sx_elem.hpp:75
Internal node class for SX.
Definition: sx_node.hpp:49
void serialize(SerializingStream &s) const
Serialize an object.
Definition: sx_node.cpp:238
virtual SXElem get_output(casadi_int oind) const
Get an output.
Definition: sx_node.cpp:227
virtual const SXElem & dep(casadi_int i) const
get the reference of a child
Definition: sx_node.cpp:80
virtual Function which_function() const
Get called function.
Definition: sx_node.cpp:64
SXElem shared_from_this()
Get a shared object from the current internal object.
Definition: sx_node.cpp:261
static std::map< casadi_int, SXNode *(*)(DeserializingStream &)> deserialize_map
Definition: sx_node.hpp:209
virtual bool is_zero() const
check properties of a node
Definition: sx_node.hpp:72
virtual bool is_minus_one() const
check properties of a node
Definition: sx_node.hpp:76
static SXNode * deserialize(DeserializingStream &s)
Definition: sx_node.cpp:243
virtual bool is_almost_zero(double tol) const
check properties of a node
Definition: sx_node.hpp:74
virtual bool is_one() const
check properties of a node
Definition: sx_node.hpp:75
virtual casadi_int n_dep() const
Number of dependencies.
Definition: sx_node.hpp:124
static void safe_delete(SXNode *n)
Non-recursive delete.
Definition: sx_node.cpp:184
virtual bool is_nan() const
check properties of a node
Definition: sx_node.hpp:77
virtual casadi_int to_int() const
Get value of a constant node.
Definition: sx_node.cpp:60
virtual bool is_call() const
check properties of a node
Definition: sx_node.hpp:80
unsigned int count
Definition: sx_node.hpp:197
virtual bool is_equal(const SXNode *node, casadi_int depth) const
Check if two nodes are equivalent up to a given depth.
Definition: sx_node.cpp:72
virtual const std::string & name() const
Definition: sx_node.cpp:76
virtual std::string print(const std::string &arg1, const std::string &arg2) const =0
Print expression.
virtual ~SXNode()
destructor
Definition: sx_node.cpp:45
virtual bool is_integer() const
check properties of a node
Definition: sx_node.hpp:70
virtual double to_double() const
Get value of a constant node.
Definition: sx_node.cpp:56
virtual bool is_inf() const
check properties of a node
Definition: sx_node.hpp:78
virtual bool is_symbolic() const
check properties of a node
Definition: sx_node.hpp:71
virtual bool is_smooth() const
Check if smooth.
Definition: sx_node.hpp:144
virtual bool is_op(casadi_int op) const
check properties of a node
Definition: sx_node.hpp:73
virtual bool is_output() const
check properties of a node
Definition: sx_node.hpp:81
static casadi_int eq_depth_
Definition: sx_node.hpp:179
void mark() const
Definition: sx_node.cpp:109
bool marked() const
Definition: sx_node.cpp:105
virtual casadi_int op() const =0
get the operation
virtual bool has_output() const
check properties of a node
Definition: sx_node.hpp:82
virtual void serialize_node(SerializingStream &s) const
Definition: sx_node.cpp:234
std::string print_compact(std::map< const SXNode *, casadi_int > &nodeind, std::vector< std::string > &intermed) const
Print compact.
Definition: sx_node.cpp:130
virtual bool is_constant() const
check properties of a node
Definition: sx_node.hpp:69
void can_inline(std::map< const SXNode *, casadi_int > &nodeind) const
Find out which nodes can be inlined.
Definition: sx_node.cpp:113
virtual bool is_minus_inf() const
check properties of a node
Definition: sx_node.hpp:79
virtual void disp(std::ostream &stream, bool more) const
print
Definition: sx_node.cpp:88
virtual casadi_int which_output() const
Get function output.
Definition: sx_node.cpp:68
SXNode()
constructor
Definition: sx_node.cpp:40
virtual std::string class_name() const =0
Get type name.
Helper class for Serialization.
The casadi namespace.
Definition: archiver.cpp:28