26 #ifndef CASADI_BINARY_SX_HPP
27 #define CASADI_BINARY_SX_HPP
29 #include "sx_node.hpp"
30 #include "serializing_stream.hpp"
41 class BinarySX :
public SXNode {
47 BinarySX(
unsigned char op,
const SXElem& dep0,
const SXElem& dep1) :
48 op_(op), dep0_(dep0), dep1_(dep1) {}
55 inline static SXElem create(
unsigned char op,
const SXElem& dep0,
const SXElem& dep1) {
56 if (dep0.is_constant() && dep1.is_constant()) {
58 double dep0_val(dep0);
59 double dep1_val(dep1);
61 casadi_math<double>::fun(op, dep0_val, dep1_val, ret_val);
65 return SXElem::create(
new BinarySX(op, dep0, dep1));
75 ~BinarySX()
override {
76 safe_delete(dep0_.assignNoDelete(casadi_limits<SXElem>::nan));
77 safe_delete(dep1_.assignNoDelete(casadi_limits<SXElem>::nan));
81 std::string class_name()
const override {
return "BinarySX";}
83 bool is_smooth()
const override {
return operation_checker<SmoothChecker>(op_);}
85 bool is_op(casadi_int op)
const override {
return op_==op; }
90 bool is_equal(
const SXNode* node, casadi_int depth)
const override {
91 const BinarySX* n =
dynamic_cast<const BinarySX*
>(node);
92 if (n==
nullptr)
return false;
93 if (n->op_ != op_)
return false;
94 if (SXElem::is_equal(n->dep0_, dep0_, depth-1)
95 && SXElem::is_equal(n->dep1_, dep1_, depth-1))
return true;
96 if (operation_checker<CommChecker>(op_)
97 && SXElem::is_equal(n->dep1_, dep0_, depth-1)
98 && SXElem::is_equal(n->dep0_, dep1_, depth-1))
return true;
105 casadi_int n_dep()
const override {
return 2;}
110 const SXElem& dep(casadi_int i)
const override {
return i==0 ? dep0_ : dep1_;}
111 SXElem& dep(casadi_int i)
override {
return i==0 ? dep0_ : dep1_;}
116 casadi_int op()
const override {
return op_;}
121 std::string print(
const std::string& arg1,
const std::string& arg2)
const override {
122 return casadi_math<double>::print(op_, arg1, arg2);
135 void serialize_node(SerializingStream& s)
const override {
136 s.pack(
"UnarySX::dep0", dep0_);
137 s.pack(
"UnarySX::dep1", dep1_);
143 static SXNode* deserialize(DeserializingStream& s, casadi_int op) {
145 s.unpack(
"UnarySX::dep0", dep0);
146 s.unpack(
"UnarySX::dep1", dep1);
147 return new BinarySX(op, dep0, dep1);