26 #ifndef CASADI_NLPSOL_IMPL_HPP
27 #define CASADI_NLPSOL_IMPL_HPP
30 #include "oracle_function.hpp"
31 #include "plugin_interface.hpp"
40 struct CASADI_EXPORT NlpsolMemory :
public OracleMemory {
59 Nlpsol :
public OracleFunction,
public PluginInterface<Nlpsol> {
78 casadi_int callback_step_;
81 std::string sens_linsol_;
82 Dict sens_linsol_options_;
84 std::vector<char> detect_simple_bounds_is_simple_;
85 Function detect_simple_bounds_parts_;
86 std::vector<casadi_int> detect_simple_bounds_target_x_;
87 std::vector<casadi_int> detect_simple_bounds_target_g_;
93 bool eval_errors_fatal_;
94 bool warn_initial_bounds_;
95 bool iteration_callback_ignore_errors_;
96 bool calc_multipliers_;
97 bool calc_lam_x_, calc_lam_p_, calc_f_, calc_g_;
98 bool bound_consistency_;
100 bool sens_force_equality_;
102 std::vector<bool> discrete_;
103 std::vector<bool> equality_;
110 mutable WeakRef kkt_;
112 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
114 mutable std::mutex kkt_mtx_;
120 void serialize_body(SerializingStream &s)
const override;
124 void serialize_type(SerializingStream &s)
const override;
129 static ProtoFunction* deserialize(DeserializingStream& s);
134 std::string serialize_base_function()
const override {
return "Nlpsol"; }
137 Nlpsol(
const std::string& name,
const Function& oracle);
140 ~Nlpsol()
override = 0;
146 size_t get_n_in()
override {
return NLPSOL_NUM_IN;}
147 size_t get_n_out()
override {
return NLPSOL_NUM_OUT;}
154 Sparsity get_sparsity_in(casadi_int i)
override;
155 Sparsity get_sparsity_out(casadi_int i)
override;
162 std::string get_name_in(casadi_int i)
override {
return nlpsol_in(i);}
163 std::string get_name_out(casadi_int i)
override {
return nlpsol_out(i);}
170 static const Options options_;
171 const Options& get_options()
const override {
return options_;}
177 void disp_more(std::ostream& stream)
const override;
180 void init(
const Dict& opts)
override;
185 void* alloc_mem()
const override {
return new NlpsolMemory();}
190 int init_mem(
void* mem)
const override;
195 void free_mem(
void *mem)
const override {
delete static_cast<NlpsolMemory*
>(mem);}
200 virtual void check_inputs(
void* mem)
const;
205 double get_default_in(casadi_int ind)
const override {
return nlpsol_default_in(ind);}
208 virtual bool integer_support()
const {
return false;}
213 void set_work(
void* mem,
const double**& arg,
double**& res,
214 casadi_int*& iw,
double*& w)
const override;
217 int eval(
const double** arg,
double** res, casadi_int* iw,
double* w,
void* mem)
const final;
220 virtual int solve(
void* mem)
const = 0;
225 void codegen_declarations(CodeGenerator& g)
const override;
230 void codegen_body_enter(CodeGenerator& g)
const override;
235 void codegen_body_exit(CodeGenerator& g)
const override;
250 void codegen_setup_constants(CodeGenerator& g,
251 const std::string& d_nlp,
const std::string& p_nlp,
252 const std::string& d_oracle)
const;
253 void codegen_setup_per_call(CodeGenerator& g,
const std::string& d_nlp)
const;
254 void codegen_post_solve(CodeGenerator& g,
const std::string& d_nlp)
const;
259 bool uses_output()
const override {
return true;}
262 Dict get_stats(
void* mem)
const override;
268 bool has_forward(casadi_int nfwd)
const override {
return true;}
269 Function get_forward(casadi_int nfwd,
const std::string& name,
270 const std::vector<std::string>& inames,
271 const std::vector<std::string>& onames,
272 const Dict& opts)
const override;
279 bool has_reverse(casadi_int nadj)
const override {
return true;}
280 Function get_reverse(casadi_int nadj,
const std::string& name,
281 const std::vector<std::string>& inames,
282 const std::vector<std::string>& onames,
283 const Dict& opts)
const override;
287 int callback(NlpsolMemory* m)
const;
290 Function kkt()
const;
293 static void bound_consistency(casadi_int n,
double* z,
double* lam,
294 const double* lbz,
const double* ubz);
297 typedef Nlpsol* (*Creator)(
const std::string& name,
const Function& oracle);
303 static std::map<std::string, Plugin> solvers_;
305 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
306 static std::mutex mutex_solvers_;
310 static const std::string infix_;
313 static std::string shortname() {
return "nlpsol";}
318 std::string class_name()
const override {
return "Nlpsol";}
323 bool is_a(
const std::string& type,
bool recursive)
const override;
326 virtual DM getReducedHessian();
329 virtual void setOptionsFromFile(
const std::string & file);
332 template<
typename Type>
static void append_to_vec(GenericType& t,
Type el) {
333 std::vector<Type> v = t;
339 template<
typename XType>
340 static Function create_oracle(
const std::map<std::string, XType>& d,
347 explicit Nlpsol(DeserializingStream& s);
349 void set_nlpsol_prob();
CASADI_EXPORT std::vector< std::string > nlpsol_in()
Get the input scheme of NLP solvers.
CASADI_EXPORT std::vector< std::string > nlpsol_out()
Get the output scheme of NLP solvers.
CASADI_EXPORT double nlpsol_default_in(casadi_int ind)
Default value of an NLP solver input.
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
Type
Variable type (FMI 3)