26 #ifndef CASADI_SX_ELEMENT_HPP
27 #define CASADI_SX_ELEMENT_HPP
30 #include "printable.hpp"
31 #include "exception.hpp"
32 #include "casadi_limits.hpp"
33 #include "matrix_fwd.hpp"
34 #include "generic_expression.hpp"
35 #include "serializing_stream.hpp"
47 #ifdef CASADI_WITH_THREAD
49 #ifdef CASADI_WITH_THREAD_MINGW
50 #include <mingw.mutex.h>
74 class CASADI_EXPORT
SXElem :
public GenericExpression<SXElem>,
75 public Printable<SXElem> {
77 friend class BinarySXNode;
106 static SXElem sym(
const std::string& name);
110 SXElem(SXNode* node,
bool dummy);
123 static SXElem create(SXNode* node);
128 SXElem& operator=(
double scalar);
135 static std::string type_name() {
return "SXElem";}
138 void disp(std::ostream& stream,
bool more=
false)
const;
150 const SXNode* operator->()
const;
151 SXNode* operator->();
157 static SXElem binary(casadi_int op,
const SXElem& x,
const SXElem& y,
158 bool unique_x=
false,
bool unique_y=
false);
159 static SXElem unary(casadi_int op,
const SXElem& x,
bool unique=
false);
160 static std::vector<SXElem> call(
const Function& f,
const std::vector<SXElem>& deps);
167 bool __nonzero__()
const;
174 bool is_leaf()
const;
175 bool is_constant()
const;
176 bool is_integer()
const;
177 bool is_symbolic()
const;
181 bool is_commutative()
const;
183 bool is_almost_zero(
double tol)
const;
185 bool is_minus_one()
const;
186 bool is_half()
const;
187 bool is_value(
double val)
const;
190 bool is_minus_inf()
const;
191 const std::string& name()
const;
192 casadi_int op()
const;
193 bool is_op(casadi_int op)
const;
194 bool is_call()
const;
195 bool is_output()
const;
196 bool has_output()
const;
197 Function which_function()
const;
198 casadi_int which_output()
const;
206 bool is_nonnegative()
const;
211 bool is_boolean()
const;
212 SXElem dep(casadi_int ch=0)
const;
215 explicit operator double()
const;
218 explicit operator casadi_int()
const;
223 bool is_doubled()
const;
228 casadi_int n_dep()
const;
233 SXElem get_output(casadi_int oind)
const;
236 std::vector<SXElem> get_output(
const std::vector<casadi_int>& oind)
const;
243 casadi_int __hash__()
const;
248 SXElem operator-()
const;
258 static bool is_equal(
const SXElem& x,
const SXElem& y, casadi_int depth=0);
262 int get_temp()
const;
265 void set_temp(
int t)
const;
278 void assignIfDuplicate(
const SXElem& scalar, casadi_int depth=1);
285 SXNode* assignNoDelete(
const SXElem& scalar);
291 inline bool is_null() {
return false;}
296 friend inline SXElem if_else(
const SXElem& x,
const SXElem& y,
const SXElem& z) {
297 return if_else_zero(x, y) + if_else_zero(!x, z);
303 void serialize(SerializingStream& s)
const;
305 static SXElem deserialize(DeserializingStream& s);
307 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
308 static std::mutex mutex_temp;
317 class CASADI_EXPORT casadi_limits<SXElem>{
319 static bool is_zero(
const SXElem& val);
320 static bool is_equal(
const SXElem& x,
const SXElem& y, casadi_int depth);
321 static bool is_almost_zero(
const SXElem& val,
double tol);
322 static bool is_one(
const SXElem& val);
323 static bool is_minus_one(
const SXElem& val);
324 static bool is_half(
const SXElem& val);
325 static bool is_value(
const SXElem& val,
double v);
326 static bool is_nonnegative(
const SXElem& val);
327 static bool is_constant(
const SXElem& val);
328 static bool is_integer(
const SXElem& val);
329 static bool is_inf(
const SXElem& val);
330 static bool is_minus_inf(
const SXElem& val);
331 static bool is_nan(
const SXElem& val);
333 static const SXElem zero;
334 static const SXElem one;
335 static const SXElem two;
336 static const SXElem minus_one;
337 static const SXElem nan;
338 static const SXElem inf;
339 static const SXElem minus_inf;
351 class CASADI_EXPORT numeric_limits<
casadi::SXElem>{
353 static const bool is_specialized =
true;
355 static
casadi::SXElem max() throw();
356 static const
int digits = 0;
357 static const
int digits10 = 0;
358 static const
bool is_signed = false;
359 static const
bool is_integer = false;
360 static const
bool is_exact = false;
361 static const
int radix = 0;
362 static
casadi::SXElem epsilon() throw();
363 static
casadi::SXElem round_error() throw();
364 static const
int min_exponent = 0;
365 static const
int min_exponent10 = 0;
366 static const
int max_exponent = 0;
367 static const
int max_exponent10 = 0;
369 static const
bool has_infinity = true;
370 static const
bool has_quiet_NaN = true;
371 static const
bool has_signaling_NaN = false;
373 static const
bool has_denorm_loss = false;
374 static
casadi::SXElem infinity() throw();
375 static
casadi::SXElem quiet_NaN() throw();
378 static const
bool is_iec559 = false;
379 static const
bool is_bounded = false;
380 static const
bool is_modulo = false;
382 static const
bool traps = false;
383 static const
bool tinyness_before = false;
384 static const float_round_style round_style = round_toward_zero;
Sparse matrix class. SX and DM are specializations.
bool is_regular(const std::vector< T > &v)
Checks if array does not contain NaN or Inf.