26 #ifndef CASADI_ROOTFINDER_IMPL_HPP
27 #define CASADI_ROOTFINDER_IMPL_HPP
29 #include "rootfinder.hpp"
30 #include "oracle_function.hpp"
31 #include "plugin_interface.hpp"
39 struct CASADI_EXPORT RootfinderMemory :
public OracleMemory {
55 Rootfinder :
public OracleFunction,
public PluginInterface<Rootfinder> {
62 Rootfinder(
const std::string& name,
const Function& oracle);
65 ~Rootfinder()
override = 0;
71 size_t get_n_in()
override {
return oracle_.n_in();}
72 size_t get_n_out()
override {
return oracle_.n_out();}
79 Sparsity get_sparsity_in(casadi_int i)
override {
return oracle_.sparsity_in(i);}
80 Sparsity get_sparsity_out(casadi_int i)
override {
return oracle_.sparsity_out(i);}
87 std::string get_name_in(casadi_int i)
override {
return oracle_.name_in(i);}
88 std::string get_name_out(casadi_int i)
override {
return oracle_.name_out(i);}
95 static const Options options_;
96 const Options& get_options()
const override {
return options_;}
100 void init(
const Dict& opts)
override;
105 int init_mem(
void* mem)
const override;
110 void set_work(
void* mem,
const double**& arg,
double**& res,
111 casadi_int*& iw,
double*& w)
const override;
114 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const override;
117 virtual int solve(
void* mem)
const = 0;
120 Dict get_stats(
void* mem)
const override;
125 int sp_forward(
const bvec_t** arg, bvec_t** res,
126 casadi_int* iw, bvec_t* w,
void* mem)
const override;
131 int sp_reverse(bvec_t** arg, bvec_t** res, casadi_int* iw, bvec_t* w,
void* mem)
const override;
135 bool has_spfwd()
const override {
return true;}
136 bool has_sprev()
const override {
return true;}
142 bool uses_output()
const override {
return true;}
148 bool has_forward(casadi_int nfwd)
const override {
return true;}
149 Function get_forward(casadi_int nfwd,
const std::string& name,
150 const std::vector<std::string>& inames,
151 const std::vector<std::string>& onames,
152 const Dict& opts)
const override;
159 bool has_reverse(casadi_int nadj)
const override {
return true;}
160 Function get_reverse(casadi_int nadj,
const std::string& name,
161 const std::vector<std::string>& inames,
162 const std::vector<std::string>& onames,
163 const Dict& opts)
const override;
169 virtual void ad_forward(
const std::vector<MX>& arg,
const std::vector<MX>& res,
170 const std::vector<std::vector<MX> >& fseed,
171 std::vector<std::vector<MX> >& fsens,
172 bool always_inline,
bool never_inline)
const;
177 virtual void ad_reverse(
const std::vector<MX>& arg,
const std::vector<MX>& res,
178 const std::vector<std::vector<MX> >& aseed,
179 std::vector<std::vector<MX> >& asens,
180 bool always_inline,
bool never_inline)
const;
190 std::vector<casadi_int> u_c_;
193 casadi_int iin_, iout_;
196 typedef Rootfinder* (*Creator)(
const std::string& name,
const Function& oracle);
202 static std::map<std::string, Plugin> solvers_;
205 static std::string shortname() {
return "rootfinder";}
208 static const std::string infix_;
211 template<
typename XType>
212 static Function create_oracle(
const std::map<std::string, XType>& d,
218 void serialize_body(SerializingStream &s)
const override;
222 void serialize_type(SerializingStream &s)
const override;
227 static ProtoFunction* deserialize(DeserializingStream& s);
232 std::string serialize_base_function()
const override {
return "Rootfinder"; }
238 explicit Rootfinder(DeserializingStream& s);
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.