List of all members | Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Protected Attributes
casadi::SlicotExpm Class Reference

'slicot' plugin for Expm More...

#include <slicot_expm.hpp>

Detailed Description

An efficient solver for Discrete Periodic Lyapunov Equations using SLICOT

Extra doc: https://github.com/casadi/casadi/wiki/L_22l

Author
Joris Gillis
Date
2014

Definition at line 72 of file slicot_expm.hpp.

Inheritance diagram for casadi::SlicotExpm:
Inheritance graph
[legend]
Collaboration diagram for casadi::SlicotExpm:
Collaboration graph
[legend]

Public Types

typedef Expm *(* Creator) (const std::string &name, const Sparsity &A)
 
using weak_ref_type = WeakRefInternal
 
typedef int(* RegFcn) (Plugin *plugin)
 

Public Member Functions

 SlicotExpm ()
 Constructor. More...
 
 SlicotExpm (const std::string &name, const Sparsity &A)
 Constructor. More...
 
 ~SlicotExpm () override
 Destructor. More...
 
const char * plugin_name () const override
 
std::string class_name () const override
 Readable name of the internal class. More...
 
void init (const Dict &opts) override
 Initialize. More...
 
void * alloc_mem () const override
 Create memory block. More...
 
int init_mem (void *mem) const override
 Initalize memory block. More...
 
void free_mem (void *mem) const override
 Free memory block. More...
 
void set_work (void *mem, const double **&arg, double **&res, casadi_int *&iw, double *&w) const override
 Set the (persistent) work vectors. More...
 
int eval (const double **arg, double **res, casadi_int *iw, double *w, void *mem) const override
 Evaluate numerically. More...
 
bool get_diff_in (casadi_int i) override
 Which inputs are differentiable. More...
 
Sparsity get_jac_sparsity (casadi_int oind, casadi_int iind, bool symmetric) const override
 Generate the sparsity of a Jacobian block. More...
 
bool has_jac_sparsity (casadi_int oind, casadi_int iind) const override
 Get Jacobian sparsity. More...
 
virtual std::string getAdaptorSolverName () const
 Obtain solver name from Adaptor. More...
 
Dict generate_options (const std::string &target) const override
 Reconstruct options dict. More...
 
void change_option (const std::string &option_name, const GenericType &option_value) override
 Change option after object creation for debugging. More...
 
void finalize () override
 Finalize the object creation. More...
 
Dict get_stats (void *mem) const override
 Get all statistics. More...
 
Function self () const
 Get a public class instance. More...
 
virtual Function factory (const std::string &name, const std::vector< std::string > &s_in, const std::vector< std::string > &s_out, const Function::AuxOut &aux, const Dict &opts) const
 
virtual std::vector< std::string > get_function () const
 
virtual const Functionget_function (const std::string &name) const
 
virtual bool has_function (const std::string &fname) const
 
void add_embedded (std::map< FunctionInternal *, Function > &all_fun, const Function &dep, casadi_int max_depth) const
 
virtual void find (std::map< FunctionInternal *, Function > &all_fun, casadi_int max_depth) const
 
virtual std::vector< bool > which_depends (const std::string &s_in, const std::vector< std::string > &s_out, casadi_int order, bool tr=false) const
 Which variables enter with some order. More...
 
virtual int eval_sx (const SXElem **arg, SXElem **res, casadi_int *iw, SXElem *w, void *mem, bool always_inline, bool never_inline) const
 Evaluate with symbolic scalars. More...
 
virtual void eval_mx (const MXVector &arg, MXVector &res, bool always_inline, bool never_inline) const
 Evaluate with symbolic matrices. More...
 
template<typename M >
void call (const std::vector< M > &arg, std::vector< M > &res, bool always_inline, bool never_inline) const
 Call a function, templated. More...
 
template<typename M >
bool matching_arg (const std::vector< M > &arg, casadi_int &npar) const
 Check if input arguments that needs to be replaced. More...
 
template<typename M >
bool matching_res (const std::vector< M > &arg, casadi_int &npar) const
 Check if output arguments that needs to be replaced. More...
 
template<typename M >
std::vector< M > replace_arg (const std::vector< M > &arg, casadi_int npar) const
 Replace 0-by-0 inputs. More...
 
template<typename M >
std::vector< M > project_arg (const std::vector< M > &arg, casadi_int npar) const
 Project sparsities. More...
 
template<typename M >
std::vector< M > project_res (const std::vector< M > &arg, casadi_int npar) const
 Project sparsities. More...
 
template<typename M >
std::vector< M > replace_res (const std::vector< M > &res, casadi_int npar) const
 Replace 0-by-0 outputs. More...
 
template<typename M >
std::vector< std::vector< M > > replace_fseed (const std::vector< std::vector< M >> &fseed, casadi_int npar) const
 Replace 0-by-0 forward seeds. More...
 
template<typename M >
std::vector< std::vector< M > > replace_fseed (const std::vector< std::vector< M > > &fseed, casadi_int npar) const
 
template<typename M >
std::vector< std::vector< M > > replace_aseed (const std::vector< std::vector< M >> &aseed, casadi_int npar) const
 Replace 0-by-0 reverse seeds. More...
 
template<typename M >
std::vector< std::vector< M > > replace_aseed (const std::vector< std::vector< M > > &aseed, casadi_int npar) const
 
std::vector< MXmapsum_mx (const std::vector< MX > &arg, const std::string &parallelization)
 Parallel evaluation. More...
 
virtual bool uses_output () const
 Do the derivative functions need nondifferentiated outputs? More...
 
std::string diff_prefix (const std::string &prefix) const
 Determine prefix for differentiated functions. More...
 
virtual Function slice (const std::string &name, const std::vector< casadi_int > &order_in, const std::vector< casadi_int > &order_out, const Dict &opts) const
 returns a new function with a selection of inputs/outputs of the original More...
 
virtual const Functionoracle () const
 Get oracle. More...
 
bool has_derivative () const
 Can derivatives be calculated in any way? More...
 
virtual double ad_weight () const
 Weighting factor for chosing forward/reverse mode. More...
 
virtual double sp_weight () const
 Weighting factor for chosing forward/reverse mode,. More...
 
virtual std::vector< MXfree_mx () const
 Get free variables (MX) More...
 
virtual std::vector< SXfree_sx () const
 Get free variables (SX) More...
 
virtual bool has_free () const
 Does the function have free variables. More...
 
virtual void generate_lifted (Function &vdef_fcn, Function &vinit_fcn) const
 Extract the functions needed for the Lifted Newton method. More...
 
virtual casadi_int n_instructions () const
 Get the number of atomic operations. More...
 
virtual casadi_int instruction_id (casadi_int k) const
 Get an atomic operation operator index. More...
 
virtual std::vector< casadi_int > instruction_input (casadi_int k) const
 Get the (integer) input arguments of an atomic operation. More...
 
virtual double instruction_constant (casadi_int k) const
 Get the floating point output argument of an atomic operation. More...
 
virtual std::vector< casadi_int > instruction_output (casadi_int k) const
 Get the (integer) output argument of an atomic operation. More...
 
virtual casadi_int n_nodes () const
 Number of nodes in the algorithm. More...
 
virtual MX instruction_MX (casadi_int k) const
 get MX expression associated with instruction More...
 
virtual SX instructions_sx () const
 get SX expression associated with instructions More...
 
Function wrap () const
 Wrap in an Function instance consisting of only one MX call. More...
 
Function wrap_as_needed (const Dict &opts) const
 Wrap in an Function instance consisting of only one MX call. More...
 
Dict cache () const
 Get all functions in the cache. More...
 
bool incache (const std::string &fname, Function &f, const std::string &suffix="") const
 Get function in cache. More...
 
void tocache (const Function &f, const std::string &suffix="") const
 Save function to cache. More...
 
void tocache_if_missing (Function &f, const std::string &suffix="") const
 Save function to cache, only if missing. More...
 
void codegen (CodeGenerator &g, const std::string &fname) const
 Generate code the function. More...
 
void codegen_meta (CodeGenerator &g) const
 Generate meta-information allowing a user to evaluate a generated function. More...
 
void codegen_sparsities (CodeGenerator &g) const
 Codegen sparsities. More...
 
virtual std::string codegen_name (const CodeGenerator &g, bool ns=true) const
 Get name in codegen. More...
 
std::string codegen_mem (CodeGenerator &g, const std::string &index="mem") const
 Get thread-local memory object. More...
 
virtual void codegen_incref (CodeGenerator &g) const
 Codegen incref for dependencies. More...
 
virtual void codegen_decref (CodeGenerator &g) const
 Codegen decref for dependencies. More...
 
virtual void codegen_alloc_mem (CodeGenerator &g) const
 Codegen decref for alloc_mem. More...
 
virtual void codegen_init_mem (CodeGenerator &g) const
 Codegen decref for init_mem. More...
 
virtual void codegen_free_mem (CodeGenerator &g) const
 Codegen for free_mem. More...
 
virtual void codegen_checkout (CodeGenerator &g) const
 Codegen for checkout. More...
 
virtual void codegen_release (CodeGenerator &g) const
 Codegen for release. More...
 
std::string signature (const std::string &fname) const
 Code generate the function. More...
 
std::string signature_unrolled (const std::string &fname) const
 Code generate the function. More...
 
virtual void codegen_declarations (CodeGenerator &g) const
 Generate code for the declarations of the C function. More...
 
virtual void codegen_body (CodeGenerator &g) const
 Generate code for the function body. More...
 
virtual std::string codegen_mem_type () const
 Thread-local memory object type. More...
 
virtual std::string generate_dependencies (const std::string &fname, const Dict &opts) const
 Export / Generate C code for the dependency function. More...
 
virtual bool has_codegen () const
 Is codegen supported? More...
 
virtual void jit_dependencies (const std::string &fname)
 Jit dependencies. More...
 
virtual void export_code (const std::string &lang, std::ostream &stream, const Dict &options) const
 Export function in a specific language. More...
 
void serialize_type (SerializingStream &s) const override
 Serialize type information. More...
 
void serialize_type (SerializingStream &s) const
 Serialize type information. More...
 
void serialize_body (SerializingStream &s) const override
 Serialize an object without type information. More...
 
void disp (std::ostream &stream, bool more) const override
 Display object. More...
 
virtual void disp_more (std::ostream &stream) const
 Print more. More...
 
std::string definition () const
 Get function signature: name:(inputs)->(outputs) More...
 
void print_dimensions (std::ostream &stream) const
 Print dimensions of inputs and outputs. More...
 
virtual std::vector< std::string > get_free () const
 Print free variables. More...
 
void get_partition (casadi_int iind, casadi_int oind, Sparsity &D1, Sparsity &D2, bool compact, bool symmetric, bool allow_forward, bool allow_reverse) const
 Get the unidirectional or bidirectional partition. More...
 
virtual double get_default_in (casadi_int ind) const
 Get default input value. More...
 
virtual double get_max_in (casadi_int ind) const
 Get largest input value. More...
 
virtual double get_min_in (casadi_int ind) const
 Get smallest input value. More...
 
virtual std::vector< double > get_nominal_in (casadi_int ind) const
 
virtual std::vector< double > get_nominal_out (casadi_int ind) const
 
virtual double get_reltol () const
 Get relative tolerance. More...
 
virtual double get_abstol () const
 Get absolute tolerance. More...
 
virtual bool get_diff_out (casadi_int i)
 Which outputs are differentiable. More...
 
casadi_int index_in (const std::string &name) const
 Get input scheme index by name. More...
 
casadi_int index_out (const std::string &name) const
 Get output scheme index by name. More...
 
virtual int sp_forward (const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const
 Propagate sparsity forward. More...
 
virtual int sp_forward_block (const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem, casadi_int oind, casadi_int iind) const
 Propagate sparsity forward, specific block. More...
 
virtual int sp_reverse (bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const
 Propagate sparsity backwards. More...
 
void sz_work (size_t &sz_arg, size_t &sz_res, size_t &sz_iw, size_t &sz_w) const
 Get number of temporary variables needed. More...
 
size_t sz_arg () const
 Get required length of arg field. More...
 
size_t sz_res () const
 Get required length of res field. More...
 
size_t sz_iw () const
 Get required length of iw field. More...
 
size_t sz_w () const
 Get required length of w field. More...
 
void alloc_arg (size_t sz_arg, bool persistent=false)
 Ensure required length of arg field. More...
 
void alloc_res (size_t sz_res, bool persistent=false)
 Ensure required length of res field. More...
 
void alloc_iw (size_t sz_iw, bool persistent=false)
 Ensure required length of iw field. More...
 
void alloc_w (size_t sz_w, bool persistent=false)
 Ensure required length of w field. More...
 
void alloc (const Function &f, bool persistent=false, int num_threads=1)
 Ensure work vectors long enough to evaluate function. More...
 
virtual void set_temp (void *mem, const double **arg, double **res, casadi_int *iw, double *w) const
 Set the (temporary) work vectors. More...
 
void setup (void *mem, const double **arg, double **res, casadi_int *iw, double *w) const
 Set the (persistent and temporary) work vectors. More...
 
virtual Dict info () const
 
Function map (casadi_int n, const std::string &parallelization) const
 Generate/retrieve cached serial map. More...
 
void generate_in (const std::string &fname, const double **arg) const
 Export an input file that can be passed to generate C code with a main. More...
 
void generate_out (const std::string &fname, double **res) const
 
virtual bool is_a (const std::string &type, bool recursive) const
 Check if the function is of a particular type. More...
 
virtual void merge (const std::vector< MX > &arg, std::vector< MX > &subs_from, std::vector< MX > &subs_to) const
 List merge opportunitities. More...
 
template<typename MatType >
std::vector< std::vector< MatType > > fwd_seed (casadi_int nfwd) const
 Symbolic expressions for the forward seeds. More...
 
template<typename MatType >
std::vector< std::vector< MatType > > symbolicAdjSeed (casadi_int nadj, const std::vector< MatType > &v) const
 Symbolic expressions for the adjoint seeds. More...
 
void print_in (std::ostream &stream, const double **arg, bool truncate) const
 Print inputs. More...
 
void print_out (std::ostream &stream, double **res, bool truncate) const
 Print outputs. More...
 
void construct (const Dict &opts)
 Construct. More...
 
void print_options (std::ostream &stream) const
 Print list of options. More...
 
void print_option (const std::string &name, std::ostream &stream) const
 Print all information there is to know about a certain option. More...
 
bool has_option (const std::string &option_name) const
 Does a particular option exist. More...
 
int checkout () const
 Checkout a memory object. More...
 
void release (int mem) const
 Release a memory object. More...
 
void * memory (int ind) const
 Memory objects. More...
 
bool has_memory (int ind) const
 Check for existance of memory object. More...
 
virtual void check_mem_count (casadi_int n) const
 Check for validatity of memory object count. More...
 
void clear_mem ()
 Clear all memory (called from destructor) More...
 
void print (const char *fmt,...) const
 C-style formatted printing during evaluation. More...
 
void sprint (char *buf, size_t buf_sz, const char *fmt,...) const
 C-style formatted printing to string. More...
 
void format_time (char *buffer, double time) const
 Format time in a fixed width 8 format. More...
 
void print_time (const std::map< std::string, FStats > &fstats) const
 Print timing statistics. More...
 
void serialize (SerializingStream &s) const
 Serialize an object. More...
 
virtual std::string serialize_base_function () const
 String used to identify the immediate FunctionInternal subclass. More...
 
casadi_int getCount () const
 Get the reference count. More...
 
std::string debug_repr (const SharedObjectInternal *) const
 
GenericWeakRef< SharedObject, SharedObjectInternal > * weak ()
 Get a weak reference to the object. More...
 
size_t get_n_in () override
 Number of function inputs and outputs. More...
 
size_t get_n_out () override
 Number of function inputs and outputs. More...
 
Sparsity get_sparsity_in (casadi_int i) override
 Sparsities of function inputs and outputs. More...
 
Sparsity get_sparsity_out (casadi_int i) override
 Sparsities of function inputs and outputs. More...
 
Function get_forward (casadi_int nfwd, const std::string &name, const std::vector< std::string > &inames, const std::vector< std::string > &onames, const Dict &opts) const override
 Generate a function that calculates nfwd forward derivatives. More...
 
bool has_forward (casadi_int nfwd) const override
 Generate a function that calculates nfwd forward derivatives. More...
 
Function get_reverse (casadi_int nadj, const std::string &name, const std::vector< std::string > &inames, const std::vector< std::string > &onames, const Dict &opts) const override
 Generate a function that calculates nadj adjoint derivatives. More...
 
bool has_reverse (casadi_int nadj) const override
 Generate a function that calculates nadj adjoint derivatives. More...
 
virtual bool has_spfwd () const
 Is the class able to propagate seeds through the algorithm? More...
 
virtual bool has_sprev () const
 Is the class able to propagate seeds through the algorithm? More...
 
int eval_gen (const double **arg, double **res, casadi_int *iw, double *w, void *mem, bool always_inline, bool never_inline) const
 Evaluate numerically. More...
 
int eval_gen (const SXElem **arg, SXElem **res, casadi_int *iw, SXElem *w, void *mem, bool always_inline, bool never_inline) const
 Evaluate a function, overloaded. More...
 
int eval_gen (const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem, bool always_inline, bool never_inline) const
 Evaluate a function, overloaded. More...
 
virtual std::vector< DMeval_dm (const std::vector< DM > &arg) const
 Evaluate with DM matrices. More...
 
virtual bool has_eval_dm () const
 Evaluate with DM matrices. More...
 
void call_gen (const MXVector &arg, MXVector &res, casadi_int npar, bool always_inline, bool never_inline) const
 Call a function, overloaded. More...
 
template<typename D >
void call_gen (const std::vector< Matrix< D > > &arg, std::vector< Matrix< D > > &res, casadi_int npar, bool always_inline, bool never_inline) const
 Call a function, overloaded. More...
 
template<typename M >
void check_arg (const std::vector< M > &arg, casadi_int &npar) const
 Check if input arguments have correct length and dimensions. More...
 
template<typename M >
void check_res (const std::vector< M > &res, casadi_int &npar) const
 Check if output arguments have correct length and dimensions. More...
 
template<typename M >
std::map< std::string, M > convert_arg (const std::vector< M > &arg) const
 Convert from/to input/output lists/map. More...
 
template<typename M >
std::vector< M > convert_arg (const std::map< std::string, M > &arg) const
 Convert from/to input/output lists/map. More...
 
template<typename M >
std::map< std::string, M > convert_res (const std::vector< M > &res) const
 Convert from/to input/output lists/map. More...
 
template<typename M >
std::vector< M > convert_res (const std::map< std::string, M > &res) const
 Convert from/to input/output lists/map. More...
 
std::vector< double > nz_in (const std::vector< DM > &arg) const
 Convert from/to flat vector of input/output nonzeros. More...
 
std::vector< DMnz_in (const std::vector< double > &arg) const
 Convert from/to flat vector of input/output nonzeros. More...
 
std::vector< double > nz_out (const std::vector< DM > &res) const
 Convert from/to flat vector of input/output nonzeros. More...
 
std::vector< DMnz_out (const std::vector< double > &res) const
 Convert from/to flat vector of input/output nonzeros. More...
 
virtual void call_forward (const std::vector< MX > &arg, const std::vector< MX > &res, const std::vector< std::vector< MX > > &fseed, std::vector< std::vector< MX > > &fsens, bool always_inline, bool never_inline) const
 Forward mode AD, virtual functions overloaded in derived classes. More...
 
virtual void call_forward (const std::vector< SX > &arg, const std::vector< SX > &res, const std::vector< std::vector< SX > > &fseed, std::vector< std::vector< SX > > &fsens, bool always_inline, bool never_inline) const
 Forward mode AD, virtual functions overloaded in derived classes. More...
 
virtual void call_reverse (const std::vector< MX > &arg, const std::vector< MX > &res, const std::vector< std::vector< MX > > &aseed, std::vector< std::vector< MX > > &asens, bool always_inline, bool never_inline) const
 Reverse mode, virtual functions overloaded in derived classes. More...
 
virtual void call_reverse (const std::vector< SX > &arg, const std::vector< SX > &res, const std::vector< std::vector< SX > > &aseed, std::vector< std::vector< SX > > &asens, bool always_inline, bool never_inline) const
 Reverse mode, virtual functions overloaded in derived classes. More...
 
Function jacobian () const
 Return Jacobian of all input elements with respect to all output elements. More...
 
virtual bool has_jacobian () const
 Return Jacobian of all input elements with respect to all output elements. More...
 
virtual Function get_jacobian (const std::string &name, const std::vector< std::string > &inames, const std::vector< std::string > &onames, const Dict &opts) const
 Return Jacobian of all input elements with respect to all output elements. More...
 
Sparsityjac_sparsity (casadi_int oind, casadi_int iind, bool compact, bool symmetric) const
 Get Jacobian sparsity. More...
 
Function forward (casadi_int nfwd) const
 Return function that calculates forward derivatives. More...
 
Function reverse (casadi_int nadj) const
 Return function that calculates adjoint derivatives. More...
 
virtual const SX sx_in (casadi_int ind) const
 Get function input(s) and output(s) More...
 
virtual const std::vector< SXsx_in () const
 Get function input(s) and output(s) More...
 
virtual const SX sx_out (casadi_int ind) const
 Get function input(s) and output(s) More...
 
virtual const std::vector< SXsx_out () const
 Get function input(s) and output(s) More...
 
virtual const MX mx_in (casadi_int ind) const
 Get function input(s) and output(s) More...
 
virtual const std::vector< MXmx_in () const
 Get function input(s) and output(s) More...
 
virtual const MX mx_out (casadi_int ind) const
 Get function input(s) and output(s) More...
 
virtual const std::vector< MXmx_out () const
 Get function input(s) and output(s) More...
 
const DM dm_in (casadi_int ind) const
 Get function input(s) and output(s) More...
 
const std::vector< DMdm_in () const
 Get function input(s) and output(s) More...
 
const DM dm_out (casadi_int ind) const
 Get function input(s) and output(s) More...
 
const std::vector< DMdm_out () const
 Get function input(s) and output(s) More...
 
casadi_int nnz_in () const
 Number of input/output nonzeros. More...
 
casadi_int nnz_in (casadi_int ind) const
 Number of input/output nonzeros. More...
 
casadi_int nnz_out () const
 Number of input/output nonzeros. More...
 
casadi_int nnz_out (casadi_int ind) const
 Number of input/output nonzeros. More...
 
casadi_int numel_in () const
 Number of input/output elements. More...
 
casadi_int numel_in (casadi_int ind) const
 Number of input/output elements. More...
 
casadi_int numel_out (casadi_int ind) const
 Number of input/output elements. More...
 
casadi_int numel_out () const
 Number of input/output elements. More...
 
casadi_int size1_in (casadi_int ind) const
 Input/output dimensions. More...
 
casadi_int size2_in (casadi_int ind) const
 Input/output dimensions. More...
 
casadi_int size1_out (casadi_int ind) const
 Input/output dimensions. More...
 
casadi_int size2_out (casadi_int ind) const
 Input/output dimensions. More...
 
std::pair< casadi_int, casadi_int > size_in (casadi_int ind) const
 Input/output dimensions. More...
 
std::pair< casadi_int, casadi_int > size_out (casadi_int ind) const
 Input/output dimensions. More...
 
const Sparsitysparsity_in (casadi_int ind) const
 Input/output sparsity. More...
 
const Sparsitysparsity_out (casadi_int ind) const
 Input/output sparsity. More...
 
bool all_scalar () const
 Are all inputs and outputs scalar. More...
 
virtual bool jac_is_symm (casadi_int oind, casadi_int iind) const
 Is a Jacobian block known to be symmetric a priori? More...
 
Sparsity to_compact (casadi_int oind, casadi_int iind, const Sparsity &sp) const
 Convert to compact Jacobian sparsity pattern. More...
 
Sparsity from_compact (casadi_int oind, casadi_int iind, const Sparsity &sp) const
 Convert from compact Jacobian sparsity pattern. More...
 
template<bool fwd>
Sparsity get_jac_sparsity_gen (casadi_int oind, casadi_int iind) const
 Get the sparsity pattern via sparsity seed propagation. More...
 
Sparsity get_jac_sparsity_hierarchical (casadi_int oind, casadi_int iind) const
 A flavor of get_jac_sparsity_gen that does hierarchical block structure recognition. More...
 
Sparsity get_jac_sparsity_hierarchical_symm (casadi_int oind, casadi_int iind) const
 
virtual std::vector< MXsymbolic_output (const std::vector< MX > &arg) const
 Get a vector of symbolic variables corresponding to the outputs. More...
 
virtual std::string get_name_in (casadi_int i)
 Names of function input and outputs. More...
 
virtual std::string get_name_out (casadi_int i)
 Names of function input and outputs. More...
 
virtual size_t codegen_sz_arg (const CodeGenerator &g) const
 Get required lengths, for codegen. More...
 
virtual size_t codegen_sz_res (const CodeGenerator &g) const
 Get required lengths, for codegen. More...
 
virtual size_t codegen_sz_iw (const CodeGenerator &g) const
 Get required lengths, for codegen. More...
 
virtual size_t codegen_sz_w (const CodeGenerator &g) const
 Get required lengths, for codegen. More...
 
virtual bool fwdViaJac (casadi_int nfwd) const
 Calculate derivatives by multiplying the full Jacobian and multiplying. More...
 
virtual bool adjViaJac (casadi_int nadj) const
 Calculate derivatives by multiplying the full Jacobian and multiplying. More...
 

Static Public Member Functions

static Expmcreator (const std::string &name, const Sparsity &A)
 Create a new QP Solver. More...
 
static std::string shortname ()
 Short name. More...
 
static std::string forward_name (const std::string &fcn, casadi_int nfwd)
 Helper function: Get name of forward derivative function. More...
 
static std::string reverse_name (const std::string &fcn, casadi_int nadj)
 Helper function: Get name of adjoint derivative function. More...
 
template<typename MatType >
static MatType ensure_stacked (const MatType &v, const Sparsity &sp, casadi_int n)
 Ensure that a matrix's sparsity is a horizontal multiple of another, or empty. More...
 
template<typename MatType >
static bool purgable (const std::vector< MatType > &seed)
 Can a derivative direction be skipped. More...
 
static std::string string_from_UnifiedReturnStatus (UnifiedReturnStatus status)
 
static Function deserialize (DeserializingStream &s)
 Deserialize with type disambiguation. More...
 
static ProtoFunctiondeserialize (DeserializingStream &s)
 Deserialize with type disambiguation. More...
 
static bool has_plugin (const std::string &pname, bool verbose=false)
 Check if a plugin is available or can be loaded. More...
 
static const Optionsplugin_options (const std::string &pname)
 Get the plugin options. More...
 
static Deserialize plugin_deserialize (const std::string &pname)
 Get the plugin deserialize_map. More...
 
static Plugin pluginFromRegFcn (RegFcn regfcn)
 Instantiate a Plugin struct from a factory function. More...
 
static Plugin load_plugin (const std::string &pname, bool register_plugin=true, bool needs_lock=true)
 Load a plugin dynamically. More...
 
static handle_t load_library (const std::string &libname, std::string &resultpath, bool global)
 Load a library dynamically. More...
 
static void registerPlugin (const Plugin &plugin, bool needs_lock=true)
 Register an integrator in the factory. More...
 
static void registerPlugin (RegFcn regfcn, bool needs_lock=true)
 Register an integrator in the factory. More...
 
static Plugin & getPlugin (const std::string &pname)
 Load and get the creator function. More...
 
static Expminstantiate (const std::string &fname, const std::string &pname, Problem problem)
 
static bool check_mat (const Sparsity &arg, const Sparsity &inp, casadi_int &npar)
 

Public Attributes

bool always_inline_
 
bool never_inline_
 
size_t n_in_
 Number of inputs and outputs. More...
 
size_t n_out_
 
std::vector< bool > is_diff_in_
 Are inputs and outputs differentiable? More...
 
std::vector< bool > is_diff_out_
 
std::vector< Sparsitysparsity_in_
 Input and output sparsity. More...
 
std::vector< Sparsitysparsity_out_
 
std::vector< std::string > name_in_
 Input and output scheme. More...
 
std::vector< std::string > name_out_
 
bool jit_
 Use just-in-time compiler. More...
 
bool jit_cleanup_
 Cleanup jit source file. More...
 
std::string jit_serialize_
 Serialize behaviour. More...
 
std::string jit_name_
 Name if jit source file. More...
 
std::string jit_base_name_
 
bool jit_temp_suffix_
 Use a temporary name. More...
 
eval_t eval_
 Numerical evaluation redirected to a C function. More...
 
casadi_checkout_t checkout_
 Checkout redirected to a C function. More...
 
casadi_release_t release_
 Release redirected to a C function. More...
 
Dict stats_
 Dict of statistics (resulting from evaluate) More...
 
bool has_refcount_
 Reference counting in codegen? More...
 
Dict cache_init_
 Values to prepopulate the function cache with. More...
 
WeakCache< std::string, Functioncache_
 Function cache. More...
 
std::vector< Sparsityjac_sparsity_ [2]
 Cache for sparsities of the Jacobian blocks. More...
 
Function derivative_of_
 If the function is the derivative of another function. More...
 
void * user_data_
 User-set field. More...
 
std::string compiler_plugin_
 Just-in-time compiler. More...
 
Importer compiler_
 
Dict jit_options_
 
double jac_penalty_
 Penalty factor for using a complete Jacobian to calculate directional derivatives. More...
 
bool enable_forward_
 
bool enable_reverse_
 
bool enable_jacobian_
 
bool enable_fd_
 
bool enable_forward_op_
 
bool enable_reverse_op_
 
bool enable_jacobian_op_
 
bool enable_fd_op_
 
double ad_weight_
 Weighting factor for derivative calculation and sparsity pattern calculation. More...
 
double ad_weight_sp_
 
casadi_int max_num_dir_
 Maximum number of sensitivity directions. More...
 
bool inputs_check_
 Errors are thrown if numerical values of inputs look bad. More...
 
Dict fd_options_
 
double fd_step_
 
std::string fd_method_
 
bool print_in_
 
bool print_out_
 
casadi_int max_io_
 
bool dump_in_
 
bool dump_out_
 
bool dump_
 
std::string dump_dir_
 
std::string dump_format_
 
Dict forward_options_
 
Dict reverse_options_
 
Dict jacobian_options_
 
Dict der_options_
 
Function custom_jacobian_
 
casadi_int dump_count_
 
std::string name_
 Name. More...
 
bool verbose_
 Verbose printout. More...
 
bool print_time_
 
bool record_time_
 
bool regularity_check_
 Errors are thrown when NaN is produced. More...
 
bool error_on_fail_
 Throw an exception on failure? More...
 

Static Public Attributes

static const std::string meta_doc
 A documentation string. More...
 
static std::map< std::string, Plugin > solvers_
 Collection of solvers. More...
 
static const std::string infix_ = "expm"
 Infix. More...
 
static std::map< std::string, ProtoFunction *(*)(DeserializingStream &)> deserialize_map
 

Protected Member Functions

void set_jac_sparsity (casadi_int oind, casadi_int iind, const Sparsity &sp)
 Populate jac_sparsity_ and jac_sparsity_compact_ during initialization. More...
 
void initSingleton ()
 
void destroySingleton ()
 
shared_from_this ()
 Get a shared object from the current internal object. More...
 
const B shared_from_this () const
 Get a shared object from the current internal object. More...
 

Protected Attributes

Sparsity A_
 
bool const_A_
 
static const Options options_
 Options. More...
 
const Optionsget_options () const override
 Options. More...
 

Member Typedef Documentation

◆ Creator

typedef Expm*(* casadi::Expm::Creator) (const std::string &name, const Sparsity &A)
inherited

Definition at line 102 of file expm_impl.hpp.

◆ RegFcn

typedef int(* casadi::PluginInterface< Expm >::RegFcn) (Plugin *plugin)
inherited

Definition at line 73 of file plugin_interface.hpp.

◆ weak_ref_type

Definition at line 152 of file shared_object.hpp.

Constructor & Destructor Documentation

◆ SlicotExpm() [1/2]

casadi::SlicotExpm::SlicotExpm ( )
explicit

◆ SlicotExpm() [2/2]

casadi::SlicotExpm::SlicotExpm ( const std::string &  name,
const Sparsity A 
)
Parameters
st

Problem structure.

Definition at line 56 of file slicot_expm.cpp.

56  : Expm(name, A) {
57 
58  }
Expm(const std::string &name, const Sparsity &A)
Definition: expm.cpp:58

◆ ~SlicotExpm()

casadi::SlicotExpm::~SlicotExpm ( )
override

Definition at line 60 of file slicot_expm.cpp.

60  {
61  clear_mem();
62  }
void clear_mem()
Clear all memory (called from destructor)

References casadi::ProtoFunction::clear_mem().

Member Function Documentation

◆ ad_weight()

double casadi::FunctionInternal::ad_weight ( ) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_l5

Definition at line 3190 of file function_internal.cpp.

3190  {
3191  // If reverse mode derivatives unavailable, use forward
3192  if (!enable_reverse_) return 0;
3193 
3194  // If forward mode derivatives unavailable, use reverse
3195  if (!enable_forward_ && !enable_fd_) return 1;
3196 
3197  // Use the (potentially user set) option
3198  return ad_weight_;
3199  }
double ad_weight_
Weighting factor for derivative calculation and sparsity pattern calculation.

References casadi::FunctionInternal::ad_weight_, casadi::FunctionInternal::enable_fd_, casadi::FunctionInternal::enable_forward_, and casadi::FunctionInternal::enable_reverse_.

Referenced by casadi::FunctionInternal::adjViaJac(), casadi::Function::expand(), casadi::FunctionInternal::fwdViaJac(), casadi::FunctionInternal::get_partition(), casadi::FunctionInternal::wrap(), and casadi::FunctionInternal::wrap_as_needed().

◆ add_embedded()

void casadi::FunctionInternal::add_embedded ( std::map< FunctionInternal *, Function > &  all_fun,
const Function dep,
casadi_int  max_depth 
) const
inherited

Definition at line 3633 of file function_internal.cpp.

3634  {
3635  // Add, if not already in graph and not null
3636  if (!dep.is_null() && all_fun.find(dep.get()) == all_fun.end()) {
3637  // Add to map
3638  all_fun[dep.get()] = dep;
3639  // Also add its dependencies
3640  if (max_depth > 0) dep->find(all_fun, max_depth - 1);
3641  }
3642  }

References casadi::FunctionInternal::find(), casadi::Function::get(), and casadi::GenericShared< Shared, Internal >::is_null().

Referenced by casadi::MXFunction::find(), casadi::Switch::find(), casadi::SXFunction::find(), and casadi::BSplineInterpolant::find().

◆ adjViaJac()

bool casadi::FunctionInternal::adjViaJac ( casadi_int  nadj) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_nc

Definition at line 2925 of file function_internal.cpp.

2925  {
2926  if (!enable_reverse_) return true;
2927  if (jac_penalty_==-1) return false;
2928 
2929  // Heuristic 1: Jac calculated via reverse mode likely cheaper
2930  if (jac_penalty_*static_cast<double>(nnz_out())<nadj) return true;
2931 
2932  // Heuristic 2: Jac calculated via forward mode likely cheaper
2933  double w = ad_weight();
2934  if ((enable_forward_ || enable_fd_) &&
2935  jac_penalty_*w*static_cast<double>(nnz_in())<(1-w)*static_cast<double>(nadj))
2936  return true; // NOLINT
2937 
2938  return false;
2939  }
double jac_penalty_
Penalty factor for using a complete Jacobian to calculate directional derivatives.
virtual double ad_weight() const
Weighting factor for chosing forward/reverse mode.
casadi_int nnz_in() const
Number of input/output nonzeros.
casadi_int nnz_out() const
Number of input/output nonzeros.

References casadi::FunctionInternal::ad_weight(), casadi::FunctionInternal::enable_fd_, casadi::FunctionInternal::enable_forward_, casadi::FunctionInternal::enable_reverse_, casadi::FunctionInternal::jac_penalty_, casadi::FunctionInternal::nnz_in(), and casadi::FunctionInternal::nnz_out().

Referenced by casadi::FunctionInternal::call_reverse().

◆ all_scalar()

bool casadi::FunctionInternal::all_scalar ( ) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mi

Definition at line 3664 of file function_internal.cpp.

3664  {
3665  // Check inputs
3666  for (casadi_int i=0; i<n_in_; ++i) {
3667  if (!sparsity_in_[i].is_scalar()) return false;
3668  }
3669  // Check outputs
3670  for (casadi_int i=0; i<n_out_; ++i) {
3671  if (!sparsity_out_[i].is_scalar()) return false;
3672  }
3673  // All are scalar
3674  return true;
3675  }
std::vector< Sparsity > sparsity_in_
Input and output sparsity.
size_t n_in_
Number of inputs and outputs.
std::vector< Sparsity > sparsity_out_

References casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::FunctionInternal::sparsity_in_, and casadi::FunctionInternal::sparsity_out_.

Referenced by casadi::FunctionInternal::call().

◆ alloc()

void casadi::FunctionInternal::alloc ( const Function f,
bool  persistent = false,
int  num_threads = 1 
)
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_n8

Definition at line 2874 of file function_internal.cpp.

2874  {
2875  if (f.is_null()) return;
2876  size_t sz_arg, sz_res, sz_iw, sz_w;
2877  f.sz_work(sz_arg, sz_res, sz_iw, sz_w);
2878  alloc_arg(sz_arg*num_threads, persistent);
2879  alloc_res(sz_res*num_threads, persistent);
2880  alloc_iw(sz_iw*num_threads, persistent);
2881  alloc_w(sz_w*num_threads, persistent);
2882  }
void alloc_iw(size_t sz_iw, bool persistent=false)
Ensure required length of iw field.
void alloc_res(size_t sz_res, bool persistent=false)
Ensure required length of res field.
void alloc_arg(size_t sz_arg, bool persistent=false)
Ensure required length of arg field.
size_t sz_res() const
Get required length of res field.
size_t sz_w() const
Get required length of w field.
void alloc_w(size_t sz_w, bool persistent=false)
Ensure required length of w field.
size_t sz_arg() const
Get required length of arg field.
size_t sz_iw() const
Get required length of iw field.

References casadi::FunctionInternal::alloc_arg(), casadi::FunctionInternal::alloc_iw(), casadi::FunctionInternal::alloc_res(), casadi::FunctionInternal::alloc_w(), casadi::GenericShared< Shared, Internal >::is_null(), casadi::FunctionInternal::sz_arg(), casadi::FunctionInternal::sz_iw(), casadi::FunctionInternal::sz_res(), casadi::FunctionInternal::sz_w(), and casadi::Function::sz_work().

Referenced by casadi::OracleFunction::finalize(), casadi::KinsolInterface::get_jtimes(), casadi::FiniteDiff::init(), casadi::Nlpsol::init(), casadi::Rootfinder::init(), casadi::Switch::init(), casadi::Feasiblesqpmethod::init(), casadi::ImplicitToNlp::init(), casadi::QpToNlp::init(), casadi::Qrsqp::init(), casadi::Scpgen::init(), and casadi::Sqpmethod::init().

◆ alloc_arg()

void casadi::FunctionInternal::alloc_arg ( size_t  sz_arg,
bool  persistent = false 
)
inherited

◆ alloc_iw()

void casadi::FunctionInternal::alloc_iw ( size_t  sz_iw,
bool  persistent = false 
)
inherited

◆ alloc_mem()

void* casadi::SlicotExpm::alloc_mem ( ) const
inlineoverridevirtual

Reimplemented from casadi::FunctionInternal.

Definition at line 101 of file slicot_expm.hpp.

101 { return new SlicotExpmMemory();}

◆ alloc_res()

void casadi::FunctionInternal::alloc_res ( size_t  sz_res,
bool  persistent = false 
)
inherited

◆ alloc_w()

void casadi::FunctionInternal::alloc_w ( size_t  sz_w,
bool  persistent = false 
)
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_n7

Definition at line 2866 of file function_internal.cpp.

2866  {
2867  if (persistent) {
2868  sz_w_per_ += sz_w;
2869  } else {
2870  sz_w_tmp_ = std::max(sz_w_tmp_, sz_w);
2871  }
2872  }

References casadi::FunctionInternal::sz_w().

Referenced by casadi::FunctionInternal::alloc(), casadi::BlazingSplineFunction::init(), casadi::External::init(), casadi::FiniteDiff::init(), casadi::FmuFunction::init(), casadi::Integrator::init(), casadi::FixedStepIntegrator::init(), casadi::Interpolant::init(), casadi::JitFunction::init(), casadi::Map::init(), casadi::OmpMap::init(), casadi::ThreadMap::init(), casadi::MapSum::init(), casadi::MXFunction::init(), casadi::Nlpsol::init(), casadi::Rootfinder::init(), casadi::Switch::init(), casadi::SXFunction::init(), casadi::Blocksqp::init(), casadi::BonminInterface::init(), casadi::CbcInterface::init(), casadi::ClarabelInterface::init(), casadi::ClpInterface::init(), casadi::CplexInterface::init(), casadi::DaqpInterface::init(), casadi::FatropConicInterface::init(), casadi::FatropInterface::init(), casadi::GurobiInterface::init(), casadi::HighsInterface::init(), casadi::HpipmInterface::init(), casadi::IpoptInterface::init(), casadi::KnitroInterface::init(), casadi::MadnlpInterface::init(), casadi::OoqpInterface::init(), casadi::OsqpInterface::init(), casadi::ProxqpInterface::init(), casadi::QpoasesInterface::init(), casadi::SLEQPInterface::init(), casadi::SlicotDple::init(), init(), casadi::SnoptInterface::init(), casadi::CvodesInterface::init(), casadi::IdasInterface::init(), casadi::KinsolInterface::init(), casadi::SundialsInterface::init(), casadi::SuperscsInterface::init(), casadi::WorhpInterface::init(), casadi::BSplineInterpolant::init(), casadi::FastNewton::init(), casadi::Feasiblesqpmethod::init(), casadi::ImplicitToNlp::init(), casadi::Ipqp::init(), casadi::LinearInterpolant::init(), casadi::LinearInterpolantJac::init(), casadi::Newton::init(), casadi::QpToNlp::init(), casadi::Qrqp::init(), casadi::Qrsqp::init(), casadi::Scpgen::init(), and casadi::Sqpmethod::init().

◆ cache()

Dict casadi::FunctionInternal::cache ( ) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_26g

Definition at line 970 of file function_internal.cpp.

970  {
971  // Return value
972  Dict ret;
973 
974  // Retrieve all Function instances that haven't been deleted
975  std::vector<std::string> keys;
976  std::vector<Function> entries;
977  cache_.cache(keys, entries);
978 
979  for (size_t i=0; i<keys.size(); ++i) {
980  // Get the name of the key
981  std::string s = keys[i];
982  casadi_assert_dev(s.size() > 0);
983  // Replace ':' with '_'
984  std::replace(s.begin(), s.end(), ':', '_');
985  // Remove trailing underscore, if any
986  if (s.back() == '_') s.resize(s.size() - 1);
987  // Add entry to function return
988  ret[s] = entries[i];
989  }
990 
991  return ret;
992  }
WeakCache< std::string, Function > cache_
Function cache.
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.

References casadi::FunctionInternal::cache_.

◆ call()

template<typename M >
void casadi::FunctionInternal::call ( const std::vector< M > &  arg,
std::vector< M > &  res,
bool  always_inline,
bool  never_inline 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kh

Definition at line 1536 of file function_internal.hpp.

1537  {
1538  // If all inputs are scalar ...
1539  if (all_scalar()) {
1540  // ... and some arguments are matrix-valued with matching dimensions ...
1541  bool matrix_call = false;
1542  std::pair<casadi_int, casadi_int> sz;
1543  for (auto&& a : arg) {
1544  if (!a.is_scalar() && !a.is_empty()) {
1545  if (!matrix_call) {
1546  // Matrix call
1547  matrix_call = true;
1548  sz = a.size();
1549  } else if (a.size()!=sz) {
1550  // Not same dimensions
1551  matrix_call = false;
1552  break;
1553  }
1554  }
1555  }
1556 
1557  // ... then, call multiple times
1558  if (matrix_call) {
1559  // Start with zeros
1560  res.resize(n_out_);
1561  M z = M::zeros(sz);
1562  for (auto&& a : res) a = z;
1563  // Call multiple times
1564  std::vector<M> arg1 = arg, res1;
1565  for (casadi_int c=0; c<sz.second; ++c) {
1566  for (casadi_int r=0; r<sz.first; ++r) {
1567  // Get scalar arguments
1568  for (casadi_int i=0; i<arg.size(); ++i) {
1569  if (arg[i].size()==sz) arg1[i] = arg[i](r, c);
1570  }
1571  // Call recursively with scalar arguments
1572  call(arg1, res1, always_inline, never_inline);
1573  // Get results
1574  casadi_assert_dev(res.size() == res1.size());
1575  for (casadi_int i=0; i<res.size(); ++i) res[i](r, c) = res1[i];
1576  }
1577  }
1578  // All elements assigned
1579  return;
1580  }
1581  }
1582 
1583  // Check if inputs need to be replaced
1584  casadi_int npar = 1;
1585  if (!matching_arg(arg, npar)) {
1586  return call(replace_arg(arg, npar), res, always_inline, never_inline);
1587  }
1588 
1589  // Call the type-specific method
1590  call_gen(arg, res, npar, always_inline, never_inline);
1591  }
void call_gen(const MXVector &arg, MXVector &res, casadi_int npar, bool always_inline, bool never_inline) const
Call a function, overloaded.
std::vector< M > replace_arg(const std::vector< M > &arg, casadi_int npar) const
Replace 0-by-0 inputs.
bool matching_arg(const std::vector< M > &arg, casadi_int &npar) const
Check if input arguments that needs to be replaced.
void call(const std::vector< M > &arg, std::vector< M > &res, bool always_inline, bool never_inline) const
Call a function, templated.
bool all_scalar() const
Are all inputs and outputs scalar.

References casadi::FunctionInternal::all_scalar(), casadi::FunctionInternal::call_gen(), casadi::FunctionInternal::matching_arg(), casadi::FunctionInternal::n_out_, and casadi::FunctionInternal::replace_arg().

◆ call_forward() [1/2]

void casadi::FunctionInternal::call_forward ( const std::vector< MX > &  arg,
const std::vector< MX > &  res,
const std::vector< std::vector< MX > > &  fseed,
std::vector< std::vector< MX > > &  fsens,
bool  always_inline,
bool  never_inline 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ku

Definition at line 2945 of file function_internal.cpp.

2949  {
2950  casadi_assert(!(always_inline && never_inline), "Inconsistent options");
2951  casadi_assert(!always_inline, "Class " + class_name() +
2952  " cannot be inlined in an MX expression");
2953 
2954  // Derivative information must be available
2955  casadi_assert(has_derivative(),
2956  "Derivatives cannot be calculated for " + name_);
2957 
2958  // Number of directional derivatives
2959  casadi_int nfwd = fseed.size();
2960  fsens.resize(nfwd);
2961 
2962  // Quick return if no seeds
2963  if (nfwd==0) return;
2964 
2965  // Check if seeds need to have dimensions corrected
2966  casadi_int npar = 1;
2967  for (auto&& r : fseed) {
2968  if (!matching_arg(r, npar)) {
2969  return FunctionInternal::call_forward(arg, res, replace_fseed(fseed, npar),
2970  fsens, always_inline, never_inline);
2971  }
2972  }
2973 
2974  // Calculating full Jacobian and then multiplying
2975  if (fwdViaJac(nfwd)) {
2976  // Multiply the Jacobian from the right
2977  std::vector<MX> darg = arg;
2978  darg.insert(darg.end(), res.begin(), res.end());
2979  std::vector<MX> J = jacobian()(darg);
2980  // Join forward seeds
2981  std::vector<MX> v(nfwd), all_fseed(n_in_);
2982  for (size_t i = 0; i < n_in_; ++i) {
2983  for (size_t d = 0; d < nfwd; ++d) v[d] = vec(fseed.at(d).at(i));
2984  all_fseed[i] = horzcat(v);
2985  }
2986  // Calculate forward sensitivities
2987  std::vector<MX> all_fsens(n_out_);
2988  std::vector<MX>::const_iterator J_it = J.begin();
2989  for (size_t oind = 0; oind < n_out_; ++oind) {
2990  for (size_t iind = 0; iind < n_in_; ++iind) {
2991  // Add contribution
2992  MX a = mtimes(*J_it++, all_fseed[iind]);
2993  all_fsens[oind] = all_fsens[oind].is_empty(true) ? a : all_fsens[oind] + a;
2994  }
2995  }
2996  // Split forward sensitivities
2997  for (size_t d = 0; d < nfwd; ++d) fsens[d].resize(n_out_);
2998  for (size_t i = 0; i < n_out_; ++i) {
2999  v = horzsplit(all_fsens[i]);
3000  casadi_assert_dev(v.size() == nfwd);
3001  for (size_t d = 0; d < nfwd; ++d) fsens[d][i] = reshape(v[d], size_out(i));
3002  }
3003  } else {
3004  // Evaluate in batches
3005  casadi_assert_dev(enable_forward_ || enable_fd_);
3006  casadi_int max_nfwd = max_num_dir_;
3007  if (!enable_fd_) {
3008  while (!has_forward(max_nfwd)) max_nfwd/=2;
3009  }
3010  casadi_int offset = 0;
3011  while (offset<nfwd) {
3012  // Number of derivatives, in this batch
3013  casadi_int nfwd_batch = std::min(nfwd-offset, max_nfwd);
3014 
3015  // All inputs and seeds
3016  std::vector<MX> darg;
3017  darg.reserve(n_in_ + n_out_ + n_in_);
3018  darg.insert(darg.end(), arg.begin(), arg.end());
3019  darg.insert(darg.end(), res.begin(), res.end());
3020  std::vector<MX> v(nfwd_batch);
3021  for (casadi_int i=0; i<n_in_; ++i) {
3022  for (casadi_int d=0; d<nfwd_batch; ++d) v[d] = fseed[offset+d][i];
3023  darg.push_back(horzcat(v));
3024  }
3025 
3026  // Create the evaluation node
3027  Function dfcn = self().forward(nfwd_batch);
3028  std::vector<MX> x = dfcn(darg);
3029 
3030  casadi_assert_dev(x.size()==n_out_);
3031 
3032  // Retrieve sensitivities
3033  for (casadi_int d=0; d<nfwd_batch; ++d) fsens[offset+d].resize(n_out_);
3034  for (casadi_int i=0; i<n_out_; ++i) {
3035  if (size2_out(i)>0) {
3036  v = horzsplit(x[i], size2_out(i));
3037  casadi_assert_dev(v.size()==nfwd_batch);
3038  } else {
3039  v = std::vector<MX>(nfwd_batch, MX(size_out(i)));
3040  }
3041  for (casadi_int d=0; d<nfwd_batch; ++d) fsens[offset+d][i] = v[d];
3042  }
3043 
3044  // Update offset
3045  offset += nfwd_batch;
3046  }
3047  }
3048  }
virtual void call_forward(const std::vector< MX > &arg, const std::vector< MX > &res, const std::vector< std::vector< MX > > &fseed, std::vector< std::vector< MX > > &fsens, bool always_inline, bool never_inline) const
Forward mode AD, virtual functions overloaded in derived classes.
Function forward(casadi_int nfwd) const
Return function that calculates forward derivatives.
virtual bool has_forward(casadi_int nfwd) const
Return function that calculates forward derivatives.
std::vector< std::vector< M > > replace_fseed(const std::vector< std::vector< M >> &fseed, casadi_int npar) const
Replace 0-by-0 forward seeds.
bool has_derivative() const
Can derivatives be calculated in any way?
casadi_int size2_out(casadi_int ind) const
Input/output dimensions.
std::pair< casadi_int, casadi_int > size_out(casadi_int ind) const
Input/output dimensions.
casadi_int max_num_dir_
Maximum number of sensitivity directions.
virtual bool fwdViaJac(casadi_int nfwd) const
Calculate derivatives by multiplying the full Jacobian and multiplying.
Function jacobian() const
Return Jacobian of all input elements with respect to all output elements.
virtual std::string class_name() const =0
Readable name of the internal class.

References casadi::SharedObjectInternal::class_name(), casadi::FunctionInternal::enable_fd_, casadi::FunctionInternal::enable_forward_, casadi::FunctionInternal::forward(), casadi::FunctionInternal::fwdViaJac(), casadi::FunctionInternal::has_derivative(), casadi::FunctionInternal::has_forward(), casadi::FunctionInternal::jacobian(), casadi::FunctionInternal::matching_arg(), casadi::FunctionInternal::max_num_dir_, casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::FunctionInternal::replace_fseed(), casadi::FunctionInternal::size2_out(), and casadi::FunctionInternal::size_out().

Referenced by casadi::Rootfinder::ad_forward(), casadi::Call::ad_forward(), casadi::MXFunction::ad_forward(), casadi::XFunction< DerivedType, MatType, NodeType >::call_forward(), casadi::MX::forward(), casadi::Integrator::get_forward_dae(), and casadi::Scpgen::init().

◆ call_forward() [2/2]

void casadi::FunctionInternal::call_forward ( const std::vector< SX > &  arg,
const std::vector< SX > &  res,
const std::vector< std::vector< SX > > &  fseed,
std::vector< std::vector< SX > > &  fsens,
bool  always_inline,
bool  never_inline 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ku

Definition at line 3164 of file function_internal.cpp.

3168  {
3169  casadi_assert(!(always_inline && never_inline), "Inconsistent options");
3170  if (fseed.empty()) { // Quick return if no seeds
3171  fsens.clear();
3172  return;
3173  }
3174  casadi_error("'forward' (SX) not defined for " + class_name());
3175  }

References casadi::SharedObjectInternal::class_name().

◆ call_gen() [1/2]

void casadi::FunctionInternal::call_gen ( const MXVector arg,
MXVector res,
casadi_int  npar,
bool  always_inline,
bool  never_inline 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kg

Definition at line 3838 of file function_internal.cpp.

3840  {
3841  if (npar==1) {
3842  eval_mx(arg, res, always_inline, never_inline);
3843  } else {
3844  // Split it up arguments
3845  std::vector<std::vector<MX>> v(npar, arg);
3846  std::vector<MX> t;
3847  for (int i=0; i<n_in_; ++i) {
3848  if (arg[i].size2()!=size2_in(i)) {
3849  t = horzsplit(arg[i], size2_in(i));
3850  casadi_assert_dev(t.size()==npar);
3851  for (int p=0; p<npar; ++p) v[p][i] = t[p];
3852  }
3853  }
3854  // Unroll the loop
3855  for (int p=0; p<npar; ++p) {
3856  eval_mx(v[p], t, always_inline, never_inline);
3857  v[p] = t;
3858  }
3859  // Concatenate results
3860  t.resize(npar);
3861  res.resize(n_out_);
3862  for (int i=0; i<n_out_; ++i) {
3863  for (int p=0; p<npar; ++p) t[p] = v[p][i];
3864  res[i] = horzcat(t);
3865  }
3866  }
3867  }
virtual void eval_mx(const MXVector &arg, MXVector &res, bool always_inline, bool never_inline) const
Evaluate with symbolic matrices.
casadi_int size2_in(casadi_int ind) const
Input/output dimensions.

References casadi::FunctionInternal::eval_mx(), casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, and casadi::FunctionInternal::size2_in().

Referenced by casadi::FunctionInternal::call().

◆ call_gen() [2/2]

template<typename D >
void casadi::FunctionInternal::call_gen ( const std::vector< Matrix< D > > &  arg,
std::vector< Matrix< D > > &  res,
casadi_int  npar,
bool  always_inline,
bool  never_inline 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kg

Definition at line 1640 of file function_internal.hpp.

1642  {
1643  std::vector< Matrix<D> > arg2 = project_arg(arg, npar);
1644 
1645  // Which arguments require mapped evaluation
1646  std::vector<bool> mapped(n_in_);
1647  for (casadi_int i=0; i<n_in_; ++i) {
1648  mapped[i] = arg[i].size2()!=size2_in(i);
1649  }
1650 
1651  // Allocate results
1652  res.resize(n_out_);
1653  for (casadi_int i=0; i<n_out_; ++i) {
1654  if (!res[i].sparsity().is_stacked(sparsity_out(i), npar)) {
1655  res[i] = Matrix<D>::zeros(repmat(sparsity_out(i), 1, npar));
1656  }
1657  }
1658 
1659  // Allocate temporary memory if needed
1660  std::vector<casadi_int> iw_tmp(sz_iw());
1661  std::vector<D> w_tmp(sz_w());
1662 
1663  // Get pointers to input arguments
1664  std::vector<const D*> argp(sz_arg());
1665  for (casadi_int i=0; i<n_in_; ++i) argp[i]=get_ptr(arg2[i]);
1666 
1667  // Get pointers to output arguments
1668  std::vector<D*> resp(sz_res());
1669  for (casadi_int i=0; i<n_out_; ++i) resp[i]=get_ptr(res[i]);
1670 
1671  // For all parallel calls
1672  for (casadi_int p=0; p<npar; ++p) {
1673  // Call memory-less
1674  if (eval_gen(get_ptr(argp), get_ptr(resp),
1675  get_ptr(iw_tmp), get_ptr(w_tmp), memory(0),
1676  always_inline, never_inline)) {
1677  if (error_on_fail_) casadi_error("Evaluation failed");
1678  }
1679  // Update offsets
1680  if (p==npar-1) break;
1681  for (casadi_int i=0; i<n_in_; ++i) if (mapped[i]) argp[i] += nnz_in(i);
1682  for (casadi_int i=0; i<n_out_; ++i) resp[i] += nnz_out(i);
1683  }
1684  }
std::vector< M > project_arg(const std::vector< M > &arg, casadi_int npar) const
Project sparsities.
const Sparsity & sparsity_out(casadi_int ind) const
Input/output sparsity.
int eval_gen(const double **arg, double **res, casadi_int *iw, double *w, void *mem, bool always_inline, bool never_inline) const
Evaluate numerically.
static Matrix< Scalar > zeros(casadi_int nrow=1, casadi_int ncol=1)
Create a dense matrix or a matrix with specified sparsity with all entries zero.
bool error_on_fail_
Throw an exception on failure?
void * memory(int ind) const
Memory objects.
T * get_ptr(std::vector< T > &v)
Get a pointer to the data contained in the vector.

References casadi::ProtoFunction::error_on_fail_, casadi::FunctionInternal::eval_gen(), casadi::get_ptr(), casadi::ProtoFunction::memory(), casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::nnz_out(), casadi::FunctionInternal::project_arg(), casadi::FunctionInternal::size2_in(), casadi::FunctionInternal::sparsity_out(), casadi::FunctionInternal::sz_arg(), casadi::FunctionInternal::sz_iw(), casadi::FunctionInternal::sz_res(), casadi::FunctionInternal::sz_w(), and casadi::GenericMatrix< Matrix< Scalar > >::zeros().

◆ call_reverse() [1/2]

void casadi::FunctionInternal::call_reverse ( const std::vector< MX > &  arg,
const std::vector< MX > &  res,
const std::vector< std::vector< MX > > &  aseed,
std::vector< std::vector< MX > > &  asens,
bool  always_inline,
bool  never_inline 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kv

Definition at line 3050 of file function_internal.cpp.

3054  {
3055  casadi_assert(!(always_inline && never_inline), "Inconsistent options");
3056  casadi_assert(!always_inline, "Class " + class_name() +
3057  " cannot be inlined in an MX expression");
3058 
3059  // Derivative information must be available
3060  casadi_assert(has_derivative(),
3061  "Derivatives cannot be calculated for " + name_);
3062 
3063  // Number of directional derivatives
3064  casadi_int nadj = aseed.size();
3065  asens.resize(nadj);
3066 
3067  // Quick return if no seeds
3068  if (nadj==0) return;
3069 
3070  // Check if seeds need to have dimensions corrected
3071  casadi_int npar = 1;
3072  for (auto&& r : aseed) {
3073  if (!matching_res(r, npar)) {
3074  return FunctionInternal::call_reverse(arg, res, replace_aseed(aseed, npar),
3075  asens, always_inline, never_inline);
3076  }
3077  }
3078 
3079  // Calculating full Jacobian and then multiplying likely cheaper
3080  if (adjViaJac(nadj)) {
3081  // Multiply the transposed Jacobian from the right
3082  std::vector<MX> darg = arg;
3083  darg.insert(darg.end(), res.begin(), res.end());
3084  std::vector<MX> J = jacobian()(darg);
3085  // Join adjoint seeds
3086  std::vector<MX> v(nadj), all_aseed(n_out_);
3087  for (size_t i = 0; i < n_out_; ++i) {
3088  for (size_t d = 0; d < nadj; ++d) v[d] = vec(aseed.at(d).at(i));
3089  all_aseed[i] = horzcat(v);
3090  }
3091  // Calculate adjoint sensitivities
3092  std::vector<MX> all_asens(n_in_);
3093  std::vector<MX>::const_iterator J_it = J.begin();
3094  for (size_t oind = 0; oind < n_out_; ++oind) {
3095  for (size_t iind = 0; iind < n_in_; ++iind) {
3096  // Add contribution
3097  MX a = mtimes((*J_it++).T(), all_aseed[oind]);
3098  all_asens[iind] = all_asens[iind].is_empty(true) ? a : all_asens[iind] + a;
3099  }
3100  }
3101  // Split adjoint sensitivities
3102  for (size_t d = 0; d < nadj; ++d) asens[d].resize(n_in_);
3103  for (size_t i = 0; i < n_in_; ++i) {
3104  v = horzsplit(all_asens[i]);
3105  casadi_assert_dev(v.size() == nadj);
3106  for (size_t d = 0; d < nadj; ++d) {
3107  if (asens[d][i].is_empty(true)) {
3108  asens[d][i] = reshape(v[d], size_in(i));
3109  } else {
3110  asens[d][i] += reshape(v[d], size_in(i));
3111  }
3112  }
3113  }
3114  } else {
3115  // Evaluate in batches
3116  casadi_assert_dev(enable_reverse_);
3117  casadi_int max_nadj = max_num_dir_;
3118 
3119  while (!has_reverse(max_nadj)) max_nadj/=2;
3120  casadi_int offset = 0;
3121  while (offset<nadj) {
3122  // Number of derivatives, in this batch
3123  casadi_int nadj_batch = std::min(nadj-offset, max_nadj);
3124 
3125  // All inputs and seeds
3126  std::vector<MX> darg;
3127  darg.reserve(n_in_ + n_out_ + n_out_);
3128  darg.insert(darg.end(), arg.begin(), arg.end());
3129  darg.insert(darg.end(), res.begin(), res.end());
3130  std::vector<MX> v(nadj_batch);
3131  for (casadi_int i=0; i<n_out_; ++i) {
3132  for (casadi_int d=0; d<nadj_batch; ++d) v[d] = aseed[offset+d][i];
3133  darg.push_back(horzcat(v));
3134  }
3135 
3136  // Create the evaluation node
3137  Function dfcn = self().reverse(nadj_batch);
3138  std::vector<MX> x = dfcn(darg);
3139  casadi_assert_dev(x.size()==n_in_);
3140 
3141  // Retrieve sensitivities
3142  for (casadi_int d=0; d<nadj_batch; ++d) asens[offset+d].resize(n_in_);
3143  for (casadi_int i=0; i<n_in_; ++i) {
3144  if (size2_in(i)>0) {
3145  v = horzsplit(x[i], size2_in(i));
3146  casadi_assert_dev(v.size()==nadj_batch);
3147  } else {
3148  v = std::vector<MX>(nadj_batch, MX(size_in(i)));
3149  }
3150  for (casadi_int d=0; d<nadj_batch; ++d) {
3151  if (asens[offset+d][i].is_empty(true)) {
3152  asens[offset+d][i] = v[d];
3153  } else {
3154  asens[offset+d][i] += v[d];
3155  }
3156  }
3157  }
3158  // Update offset
3159  offset += nadj_batch;
3160  }
3161  }
3162  }
virtual bool adjViaJac(casadi_int nadj) const
Calculate derivatives by multiplying the full Jacobian and multiplying.
std::pair< casadi_int, casadi_int > size_in(casadi_int ind) const
Input/output dimensions.
virtual void call_reverse(const std::vector< MX > &arg, const std::vector< MX > &res, const std::vector< std::vector< MX > > &aseed, std::vector< std::vector< MX > > &asens, bool always_inline, bool never_inline) const
Reverse mode, virtual functions overloaded in derived classes.
Function reverse(casadi_int nadj) const
Return function that calculates adjoint derivatives.
bool matching_res(const std::vector< M > &arg, casadi_int &npar) const
Check if output arguments that needs to be replaced.
virtual bool has_reverse(casadi_int nadj) const
Return function that calculates adjoint derivatives.
std::vector< std::vector< M > > replace_aseed(const std::vector< std::vector< M >> &aseed, casadi_int npar) const
Replace 0-by-0 reverse seeds.

References casadi::FunctionInternal::adjViaJac(), casadi::SharedObjectInternal::class_name(), casadi::FunctionInternal::enable_reverse_, casadi::FunctionInternal::has_derivative(), casadi::FunctionInternal::has_reverse(), casadi::FunctionInternal::jacobian(), casadi::FunctionInternal::matching_res(), casadi::FunctionInternal::max_num_dir_, casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::FunctionInternal::replace_aseed(), casadi::FunctionInternal::reverse(), casadi::FunctionInternal::size2_in(), casadi::FunctionInternal::size_in(), and casadi::T.

Referenced by casadi::Rootfinder::ad_reverse(), casadi::MXFunction::ad_reverse(), casadi::Call::ad_reverse(), casadi::XFunction< DerivedType, MatType, NodeType >::call_reverse(), casadi::Scpgen::init(), and casadi::MX::reverse().

◆ call_reverse() [2/2]

void casadi::FunctionInternal::call_reverse ( const std::vector< SX > &  arg,
const std::vector< SX > &  res,
const std::vector< std::vector< SX > > &  aseed,
std::vector< std::vector< SX > > &  asens,
bool  always_inline,
bool  never_inline 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kv

Definition at line 3177 of file function_internal.cpp.

3181  {
3182  casadi_assert(!(always_inline && never_inline), "Inconsistent options");
3183  if (aseed.empty()) { // Quick return if no seeds
3184  asens.clear();
3185  return;
3186  }
3187  casadi_error("'reverse' (SX) not defined for " + class_name());
3188  }

References casadi::SharedObjectInternal::class_name().

◆ change_option()

void casadi::FunctionInternal::change_option ( const std::string &  option_name,
const GenericType option_value 
)
overridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_k5

Reimplemented from casadi::ProtoFunction.

Reimplemented in casadi::MXFunction.

Definition at line 423 of file function_internal.cpp.

424  {
425  if (option_name == "print_in") {
426  print_in_ = option_value;
427  } else if (option_name == "print_out") {
428  print_out_ = option_value;
429  } else if (option_name=="ad_weight") {
430  ad_weight_ = option_value;
431  } else if (option_name=="ad_weight_sp") {
432  ad_weight_sp_ = option_value;
433  } else if (option_name=="dump") {
434  dump_ = option_value;
435  } else if (option_name=="dump_in") {
436  dump_in_ = option_value;
437  } else if (option_name=="dump_out") {
438  dump_out_ = option_value;
439  } else if (option_name=="dump_dir") {
440  dump_dir_ = option_value.to_string();
441  } else if (option_name=="dump_format") {
442  dump_format_ = option_value.to_string();
443  } else {
444  // Option not found - continue to base classes
445  ProtoFunction::change_option(option_name, option_value);
446  }
447  }
virtual void change_option(const std::string &option_name, const GenericType &option_value)
Change option after object creation for debugging.

References casadi::FunctionInternal::ad_weight_, casadi::FunctionInternal::ad_weight_sp_, casadi::ProtoFunction::change_option(), casadi::FunctionInternal::dump_, casadi::FunctionInternal::dump_dir_, casadi::FunctionInternal::dump_format_, casadi::FunctionInternal::dump_in_, casadi::FunctionInternal::dump_out_, casadi::FunctionInternal::print_in_, casadi::FunctionInternal::print_out_, and casadi::GenericType::to_string().

Referenced by casadi::FmuFunction::change_option(), and casadi::MXFunction::change_option().

◆ check_arg()

template<typename M >
void casadi::FunctionInternal::check_arg ( const std::vector< M > &  arg,
casadi_int &  npar 
) const
inherited

Raises errors.

Parameters
npar[in]normal usage: 1, disallow pararallel calls: -1
[out]nparmax number of horizontal repetitions across all arguments (or -1)

Extra doc: https://github.com/casadi/casadi/wiki/L_ki

Definition at line 1687 of file function_internal.hpp.

1687  {
1688  casadi_assert(arg.size()==n_in_, "Incorrect number of inputs: Expected "
1689  + str(n_in_) + ", got " + str(arg.size()));
1690  for (casadi_int i=0; i<n_in_; ++i) {
1691  if (!check_mat(arg[i].sparsity(), sparsity_in(i), npar)) {
1692  // Dimensions
1693  std::string d_arg = str(arg[i].size1()) + "-by-" + str(arg[i].size2());
1694  std::string d_in = str(size1_in(i)) + "-by-" + str(size2_in(i));
1695  std::string e = "Input " + str(i) + " (" + name_in_[i] + ") has mismatching shape. "
1696  "Got " + d_arg + ". Allowed dimensions, in general, are:\n"
1697  " - The input dimension N-by-M (here " + d_in + ")\n"
1698  " - A scalar, i.e. 1-by-1\n"
1699  " - M-by-N if N=1 or M=1 (i.e. a transposed vector)\n"
1700  " - N-by-M1 if K*M1=M for some K (argument repeated horizontally)\n";
1701  if (npar!=-1) {
1702  e += " - N-by-P*M, indicating evaluation with multiple arguments (P must be a "
1703  "multiple of " + str(npar) + " for consistency with previous inputs)";
1704  }
1705  casadi_error(e);
1706  }
1707  }
1708  }
casadi_int size1_in(casadi_int ind) const
Input/output dimensions.
const Sparsity & sparsity_in(casadi_int ind) const
Input/output sparsity.
static bool check_mat(const Sparsity &arg, const Sparsity &inp, casadi_int &npar)
std::vector< std::string > name_in_
Input and output scheme.
std::string str(const T &v)
String representation, any type.

References casadi::FunctionInternal::check_mat(), casadi::FunctionInternal::n_in_, casadi::FunctionInternal::name_in_, casadi::FunctionInternal::size1_in(), casadi::FunctionInternal::size2_in(), casadi::FunctionInternal::sparsity_in(), and casadi::str().

Referenced by casadi::FunctionInternal::mapsum_mx(), and casadi::FunctionInternal::matching_arg().

◆ check_mat()

bool casadi::FunctionInternal::check_mat ( const Sparsity arg,
const Sparsity inp,
casadi_int &  npar 
)
staticinherited

Helper function

Parameters
npar[in]normal usage: 1, disallow pararallel calls: -1
npar[out]required number of parallel calls (or -1)

Definition at line 3376 of file function_internal.cpp.

3376  {
3377  // Matching dimensions
3378  if (arg.size()==inp.size()) return true;
3379  // Calling with empty matrix - set all to zero
3380  if (arg.is_empty()) return true;
3381  // Calling with a scalar - set all
3382  if (arg.is_scalar()) return true;
3383  // Vectors that are transposes of each other
3384  if (arg.is_vector() && inp.size()==std::make_pair(arg.size2(), arg.size1())) return true;
3385  // Horizontal repmat
3386  if (arg.size1()==inp.size1() && arg.size2()>0 && inp.size2()>0
3387  && inp.size2()%arg.size2()==0) return true;
3388  if (npar==-1) return false;
3389  // Evaluate with multiple arguments
3390  if (arg.size1()==inp.size1() && arg.size2()>0 && inp.size2()>0
3391  && arg.size2()%(npar*inp.size2())==0) {
3392  npar *= arg.size2()/(npar*inp.size2());
3393  return true;
3394  }
3395  // No match
3396  return false;
3397  }

References casadi::Sparsity::is_empty(), casadi::Sparsity::is_scalar(), casadi::Sparsity::is_vector(), casadi::Sparsity::size(), casadi::Sparsity::size1(), and casadi::Sparsity::size2().

Referenced by casadi::FunctionInternal::check_arg(), casadi::FunctionInternal::check_res(), and casadi::FunctionInternal::mapsum_mx().

◆ check_mem_count()

virtual void casadi::ProtoFunction::check_mem_count ( casadi_int  n) const
inlinevirtualinherited

Purpose if to allow more helpful error messages

Extra doc: https://github.com/casadi/casadi/wiki/L_2b7

Reimplemented in casadi::FmuFunction.

Definition at line 179 of file function_internal.hpp.

179 { }

Referenced by casadi::ProtoFunction::checkout().

◆ check_res()

template<typename M >
void casadi::FunctionInternal::check_res ( const std::vector< M > &  res,
casadi_int &  npar 
) const
inherited

Raises errors.

Parameters
npar[in]normal usage: 1, disallow pararallel calls: -1
[out]nparmax number of horizontal repetitions across all arguments (or -1)

Extra doc: https://github.com/casadi/casadi/wiki/L_kj

Definition at line 1711 of file function_internal.hpp.

1711  {
1712  casadi_assert(res.size()==n_out_, "Incorrect number of outputs: Expected "
1713  + str(n_out_) + ", got " + str(res.size()));
1714  for (casadi_int i=0; i<n_out_; ++i) {
1715  casadi_assert(check_mat(res[i].sparsity(), sparsity_out(i), npar),
1716  "Output " + str(i) + " (" + name_out_[i] + ") has mismatching shape. "
1717  "Expected " + str(size_out(i)) + ", got " + str(res[i].size()));
1718  }
1719  }
std::vector< std::string > name_out_

References casadi::FunctionInternal::check_mat(), casadi::FunctionInternal::n_out_, casadi::FunctionInternal::name_out_, casadi::FunctionInternal::size_out(), casadi::FunctionInternal::sparsity_out(), and casadi::str().

Referenced by casadi::FunctionInternal::matching_res().

◆ checkout()

int casadi::ProtoFunction::checkout ( ) const
inherited

Definition at line 3585 of file function_internal.cpp.

3585  {
3586 #ifdef CASADI_WITH_THREAD
3587  std::lock_guard<std::mutex> lock(mtx_);
3588 #endif //CASADI_WITH_THREAD
3589  if (unused_.empty()) {
3590  check_mem_count(mem_.size()+1);
3591  // Allocate a new memory object
3592  void* m = alloc_mem();
3593  mem_.push_back(m);
3594  if (init_mem(m)) {
3595  casadi_error("Failed to create or initialize memory object");
3596  }
3597  return static_cast<int>(mem_.size()) - 1;
3598  } else {
3599  // Use an unused memory object
3600  int m = unused_.top();
3601  unused_.pop();
3602  return m;
3603  }
3604  }
virtual int init_mem(void *mem) const
Initalize memory block.
virtual void * alloc_mem() const
Create memory block.
virtual void check_mem_count(casadi_int n) const
Check for validatity of memory object count.

References casadi::ProtoFunction::alloc_mem(), casadi::ProtoFunction::check_mem_count(), and casadi::ProtoFunction::init_mem().

Referenced by casadi::ProtoFunction::finalize(), casadi::FunctionBuffer::FunctionBuffer(), and casadi::Sqpmethod::init_mem().

◆ class_name()

std::string casadi::SlicotExpm::class_name ( ) const
inlineoverridevirtual

Implements casadi::SharedObjectInternal.

Definition at line 95 of file slicot_expm.hpp.

95 { return "SlicotExpm";}

◆ clear_mem()

void casadi::ProtoFunction::clear_mem ( )
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_jq

Definition at line 3473 of file function_internal.cpp.

3473  {
3474  for (auto&& i : mem_) {
3475  if (i!=nullptr) free_mem(i);
3476  }
3477  mem_.clear();
3478  }
virtual void free_mem(void *mem) const
Free memory block.

References casadi::ProtoFunction::free_mem().

Referenced by casadi::AlpaqaInterface::~AlpaqaInterface(), casadi::AmplInterface::~AmplInterface(), casadi::BlazingSplineFunction::~BlazingSplineFunction(), casadi::Blocksqp::~Blocksqp(), casadi::BonminInterface::~BonminInterface(), casadi::BSplineInterpolant::~BSplineInterpolant(), casadi::CallbackInternal::~CallbackInternal(), casadi::CbcInterface::~CbcInterface(), casadi::ClarabelInterface::~ClarabelInterface(), casadi::ClpInterface::~ClpInterface(), casadi::CplexInterface::~CplexInterface(), casadi::CsparseInterface::~CsparseInterface(), casadi::CvodesInterface::~CvodesInterface(), casadi::DaqpInterface::~DaqpInterface(), casadi::External::~External(), casadi::FastNewton::~FastNewton(), casadi::FatropConicInterface::~FatropConicInterface(), casadi::FatropInterface::~FatropInterface(), casadi::Feasiblesqpmethod::~Feasiblesqpmethod(), casadi::FiniteDiff::~FiniteDiff(), casadi::FixedStepIntegrator::~FixedStepIntegrator(), casadi::FmuFunction::~FmuFunction(), casadi::GurobiInterface::~GurobiInterface(), casadi::HighsInterface::~HighsInterface(), casadi::HpipmInterface::~HpipmInterface(), casadi::HpmpcInterface::~HpmpcInterface(), casadi::IdasInterface::~IdasInterface(), casadi::ImplicitToNlp::~ImplicitToNlp(), casadi::IpoptInterface::~IpoptInterface(), casadi::Ipqp::~Ipqp(), casadi::JitFunction::~JitFunction(), casadi::KinsolInterface::~KinsolInterface(), casadi::KnitroInterface::~KnitroInterface(), casadi::LapackLu::~LapackLu(), casadi::LapackQr::~LapackQr(), casadi::LinearInterpolant::~LinearInterpolant(), casadi::LinearInterpolantJac::~LinearInterpolantJac(), casadi::LinsolLdl::~LinsolLdl(), casadi::LinsolQr::~LinsolQr(), casadi::LinsolTridiag::~LinsolTridiag(), casadi::Lsqr::~Lsqr(), casadi::Ma27Interface::~Ma27Interface(), casadi::MadnlpInterface::~MadnlpInterface(), casadi::Map::~Map(), casadi::MapSum::~MapSum(), casadi::MumpsInterface::~MumpsInterface(), casadi::MXFunction::~MXFunction(), casadi::Newton::~Newton(), casadi::Nlpsol::~Nlpsol(), casadi::OmpMap::~OmpMap(), casadi::OoqpInterface::~OoqpInterface(), casadi::OsqpInterface::~OsqpInterface(), casadi::ProxqpInterface::~ProxqpInterface(), casadi::QpoasesInterface::~QpoasesInterface(), casadi::QpToNlp::~QpToNlp(), casadi::Qrqp::~Qrqp(), casadi::Qrsqp::~Qrsqp(), casadi::Scpgen::~Scpgen(), casadi::SLEQPInterface::~SLEQPInterface(), casadi::SlicotDple::~SlicotDple(), ~SlicotExpm(), casadi::SnoptInterface::~SnoptInterface(), casadi::Sqpmethod::~Sqpmethod(), casadi::SuperscsInterface::~SuperscsInterface(), casadi::Switch::~Switch(), casadi::SXFunction::~SXFunction(), casadi::SymbolicQr::~SymbolicQr(), casadi::ThreadMap::~ThreadMap(), and casadi::WorhpInterface::~WorhpInterface().

◆ codegen()

void casadi::FunctionInternal::codegen ( CodeGenerator g,
const std::string &  fname 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_lm

Definition at line 2306 of file function_internal.cpp.

2306  {
2307  // Define function
2308  g << "/* " << definition() << " */\n";
2309  g << "static " << signature(fname) << " {\n";
2310 
2311  // Reset local variables, flush buffer
2312  g.flush(g.body);
2313 
2314  g.scope_enter();
2315 
2316  // Generate function body (to buffer)
2317  codegen_body(g);
2318 
2319  g.scope_exit();
2320 
2321  // Finalize the function
2322  g << "return 0;\n";
2323  g << "}\n\n";
2324 
2325  // Flush to function body
2326  g.flush(g.body);
2327  }
std::string definition() const
Get function signature: name:(inputs)->(outputs)
virtual void codegen_body(CodeGenerator &g) const
Generate code for the function body.
std::string signature(const std::string &fname) const
Code generate the function.

References casadi::CodeGenerator::body, casadi::FunctionInternal::codegen_body(), casadi::FunctionInternal::definition(), casadi::CodeGenerator::flush(), casadi::CodeGenerator::scope_enter(), casadi::CodeGenerator::scope_exit(), and casadi::FunctionInternal::signature().

Referenced by casadi::CodeGenerator::add_dependency().

◆ codegen_alloc_mem()

void casadi::FunctionInternal::codegen_alloc_mem ( CodeGenerator g) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_lt

Reimplemented in casadi::External.

Definition at line 2354 of file function_internal.cpp.

2354  {
2355  bool needs_mem = !codegen_mem_type().empty();
2356  if (needs_mem) {
2357  std::string name = codegen_name(g, false);
2358  std::string mem_counter = g.shorthand(name + "_mem_counter");
2359  g << "return " + mem_counter + "++;\n";
2360  }
2361  }
virtual std::string codegen_mem_type() const
Thread-local memory object type.
virtual std::string codegen_name(const CodeGenerator &g, bool ns=true) const
Get name in codegen.

References casadi::FunctionInternal::codegen_mem_type(), casadi::FunctionInternal::codegen_name(), and casadi::CodeGenerator::shorthand().

Referenced by casadi::CodeGenerator::add_dependency().

◆ codegen_body()

void casadi::FunctionInternal::codegen_body ( CodeGenerator g) const
virtualinherited

◆ codegen_checkout()

void casadi::FunctionInternal::codegen_checkout ( CodeGenerator g) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_lw

Reimplemented in casadi::External.

Definition at line 2363 of file function_internal.cpp.

2363  {
2364  std::string name = codegen_name(g, false);
2365  std::string stack_counter = g.shorthand(name + "_unused_stack_counter");
2366  std::string stack = g.shorthand(name + "_unused_stack");
2367  std::string mem_counter = g.shorthand(name + "_mem_counter");
2368  std::string mem_array = g.shorthand(name + "_mem");
2369  std::string alloc_mem = g.shorthand(name + "_alloc_mem");
2370  std::string init_mem = g.shorthand(name + "_init_mem");
2371 
2372  g.auxiliaries << "static int " << mem_counter << " = 0;\n";
2373  g.auxiliaries << "static int " << stack_counter << " = -1;\n";
2374  g.auxiliaries << "static int " << stack << "[CASADI_MAX_NUM_THREADS];\n";
2375  g.auxiliaries << "static " << codegen_mem_type() <<
2376  " " << mem_array << "[CASADI_MAX_NUM_THREADS];\n\n";
2377  g << "int mid;\n";
2378  g << "if (" << stack_counter << ">=0) {\n";
2379  g << "return " << stack << "[" << stack_counter << "--];\n";
2380  g << "} else {\n";
2381  g << "if (" << mem_counter << "==CASADI_MAX_NUM_THREADS) return -1;\n";
2382  g << "mid = " << alloc_mem << "();\n";
2383  g << "if (mid<0) return -1;\n";
2384  g << "if(" << init_mem << "(mid)) return -1;\n";
2385  g << "return mid;\n";
2386  g << "}\n";
2387  }
void * alloc_mem() const override
Create memory block.

References casadi::FunctionInternal::alloc_mem(), casadi::CodeGenerator::auxiliaries, casadi::FunctionInternal::codegen_mem_type(), casadi::FunctionInternal::codegen_name(), casadi::ProtoFunction::init_mem(), and casadi::CodeGenerator::shorthand().

Referenced by casadi::CodeGenerator::add_dependency().

◆ codegen_declarations()

void casadi::FunctionInternal::codegen_declarations ( CodeGenerator g) const
virtualinherited

◆ codegen_decref()

virtual void casadi::FunctionInternal::codegen_decref ( CodeGenerator g) const
inlinevirtualinherited

◆ codegen_free_mem()

virtual void casadi::FunctionInternal::codegen_free_mem ( CodeGenerator g) const
inlinevirtualinherited

◆ codegen_incref()

virtual void casadi::FunctionInternal::codegen_incref ( CodeGenerator g) const
inlinevirtualinherited

◆ codegen_init_mem()

void casadi::FunctionInternal::codegen_init_mem ( CodeGenerator g) const
virtualinherited

◆ codegen_mem()

std::string casadi::FunctionInternal::codegen_mem ( CodeGenerator g,
const std::string &  index = "mem" 
) const
inherited

◆ codegen_mem_type()

virtual std::string casadi::FunctionInternal::codegen_mem_type ( ) const
inlinevirtualinherited

◆ codegen_meta()

void casadi::FunctionInternal::codegen_meta ( CodeGenerator g) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ln

Definition at line 2400 of file function_internal.cpp.

2400  {
2401  bool needs_mem = !codegen_mem_type().empty();
2402 
2403  g << g.declare("int " + name_ + "_alloc_mem(void)") << " {\n";
2404  if (needs_mem) {
2405  g << "return " << codegen_name(g) << "_alloc_mem();\n";
2406  } else {
2407  g << "return 0;\n";
2408  }
2409  g << "}\n\n";
2410 
2411  g << g.declare("int " + name_ + "_init_mem(int mem)") << " {\n";
2412  if (needs_mem) {
2413  g << "return " << codegen_name(g) << "_init_mem(mem);\n";
2414  } else {
2415  g << "return 0;\n";
2416  }
2417  g << "}\n\n";
2418 
2419  g << g.declare("void " + name_ + "_free_mem(int mem)") << " {\n";
2420  if (needs_mem) {
2421  g << codegen_name(g) << "_free_mem(mem);\n";
2422  }
2423  g << "}\n\n";
2424 
2425  // Checkout/release routines
2426  g << g.declare("int " + name_ + "_checkout(void)") << " {\n";
2427  if (needs_mem) {
2428  g << "return " << codegen_name(g) << "_checkout();\n";
2429  } else {
2430  g << "return 0;\n";
2431  }
2432  g << "}\n\n";
2433 
2434  if (needs_mem) {
2435  g << g.declare("void " + name_ + "_release(int mem)") << " {\n";
2436  g << codegen_name(g) << "_release(mem);\n";
2437  } else {
2438  g << g.declare("void " + name_ + "_release(int mem)") << " {\n";
2439  }
2440  g << "}\n\n";
2441 
2442  // Reference counter routines
2443  g << g.declare("void " + name_ + "_incref(void)") << " {\n";
2444  codegen_incref(g);
2445  g << "}\n\n"
2446  << g.declare("void " + name_ + "_decref(void)") << " {\n";
2447  codegen_decref(g);
2448  g << "}\n\n";
2449 
2450  // Number of inputs and outptus
2451  g << g.declare("casadi_int " + name_ + "_n_in(void)")
2452  << " { return " << n_in_ << ";}\n\n"
2453  << g.declare("casadi_int " + name_ + "_n_out(void)")
2454  << " { return " << n_out_ << ";}\n\n";
2455 
2456  // Default inputs
2457  g << g.declare("casadi_real " + name_ + "_default_in(casadi_int i)") << " {\n"
2458  << "switch (i) {\n";
2459  for (casadi_int i=0; i<n_in_; ++i) {
2460  double def = get_default_in(i);
2461  if (def!=0) g << "case " << i << ": return " << g.constant(def) << ";\n";
2462  }
2463  g << "default: return 0;\n}\n"
2464  << "}\n\n";
2465 
2466  // Input names
2467  g << g.declare("const char* " + name_ + "_name_in(casadi_int i)") << " {\n"
2468  << "switch (i) {\n";
2469  for (casadi_int i=0; i<n_in_; ++i) {
2470  g << "case " << i << ": return \"" << name_in_[i] << "\";\n";
2471  }
2472  g << "default: return 0;\n}\n"
2473  << "}\n\n";
2474 
2475  // Output names
2476  g << g.declare("const char* " + name_ + "_name_out(casadi_int i)") << " {\n"
2477  << "switch (i) {\n";
2478  for (casadi_int i=0; i<n_out_; ++i) {
2479  g << "case " << i << ": return \"" << name_out_[i] << "\";\n";
2480  }
2481  g << "default: return 0;\n}\n"
2482  << "}\n\n";
2483 
2484  // Codegen sparsities
2485  codegen_sparsities(g);
2486 
2487  // Function that returns work vector lengths
2488  g << g.declare(
2489  "int " + name_ + "_work(casadi_int *sz_arg, casadi_int* sz_res, "
2490  "casadi_int *sz_iw, casadi_int *sz_w)")
2491  << " {\n"
2492  << "if (sz_arg) *sz_arg = " << codegen_sz_arg(g) << ";\n"
2493  << "if (sz_res) *sz_res = " << codegen_sz_res(g) << ";\n"
2494  << "if (sz_iw) *sz_iw = " << codegen_sz_iw(g) << ";\n"
2495  << "if (sz_w) *sz_w = " << codegen_sz_w(g) << ";\n"
2496  << "return 0;\n"
2497  << "}\n\n";
2498 
2499  // Function that returns work vector lengths in bytes
2500  g << g.declare(
2501  "int " + name_ + "_work_bytes(casadi_int *sz_arg, casadi_int* sz_res, "
2502  "casadi_int *sz_iw, casadi_int *sz_w)")
2503  << " {\n"
2504  << "if (sz_arg) *sz_arg = " << codegen_sz_arg(g) << "*sizeof(const casadi_real*);\n"
2505  << "if (sz_res) *sz_res = " << codegen_sz_res(g) << "*sizeof(casadi_real*);\n"
2506  << "if (sz_iw) *sz_iw = " << codegen_sz_iw(g) << "*sizeof(casadi_int);\n"
2507  << "if (sz_w) *sz_w = " << codegen_sz_w(g) << "*sizeof(casadi_real);\n"
2508  << "return 0;\n"
2509  << "}\n\n";
2510 
2511  // Also add to header file to allow getting
2512  if (g.with_header) {
2513  g.header
2514  << "#define " << name_ << "_SZ_ARG " << codegen_sz_arg(g) << "\n"
2515  << "#define " << name_ << "_SZ_RES " << codegen_sz_res(g) << "\n"
2516  << "#define " << name_ << "_SZ_IW " << codegen_sz_iw(g) << "\n"
2517  << "#define " << name_ << "_SZ_W " << codegen_sz_w(g) << "\n";
2518  }
2519 
2520  // Which inputs are differentiable
2521  if (!all(is_diff_in_)) {
2522  g << g.declare("int " + name_ + "_diff_in(casadi_int i)") << " {\n"
2523  << "switch (i) {\n";
2524  for (casadi_int i=0; i<n_in_; ++i) {
2525  g << "case " << i << ": return " << is_diff_in_[i] << ";\n";
2526  }
2527  g << "default: return -1;\n}\n"
2528  << "}\n\n";
2529  }
2530 
2531  // Which outputs are differentiable
2532  if (!all(is_diff_out_)) {
2533  g << g.declare("int " + name_ + "_diff_out(casadi_int i)") << " {\n"
2534  << "switch (i) {\n";
2535  for (casadi_int i=0; i<n_out_; ++i) {
2536  g << "case " << i << ": return " << is_diff_out_[i] << ";\n";
2537  }
2538  g << "default: return -1;\n}\n"
2539  << "}\n\n";
2540  }
2541 
2542  // Generate mex gateway for the function
2543  if (g.mex) {
2544  // Begin conditional compilation
2545  g << "#ifdef MATLAB_MEX_FILE\n";
2546 
2547  // Declare wrapper
2548  g << "void mex_" << name_
2549  << "(int resc, mxArray *resv[], int argc, const mxArray *argv[]) {\n"
2550  << "casadi_int i;\n";
2551  g << "int mem;\n";
2552  // Work vectors, including input and output buffers
2553  casadi_int i_nnz = nnz_in(), o_nnz = nnz_out();
2554  size_t sz_w = this->sz_w();
2555  for (casadi_int i=0; i<n_in_; ++i) {
2556  const Sparsity& s = sparsity_in_[i];
2557  sz_w = std::max(sz_w, static_cast<size_t>(s.size1())); // To be able to copy a column
2558  sz_w = std::max(sz_w, static_cast<size_t>(s.size2())); // To be able to copy a row
2559  }
2560  sz_w += i_nnz + o_nnz;
2561  g << CodeGenerator::array("casadi_real", "w", sz_w);
2562  g << CodeGenerator::array("casadi_int", "iw", sz_iw());
2563  std::string fw = "w+" + str(i_nnz + o_nnz);
2564 
2565  // Copy inputs to buffers
2566  casadi_int offset=0;
2567  g << CodeGenerator::array("const casadi_real*", "arg", sz_arg(), "{0}");
2568 
2569  // Allocate output buffers
2570  g << "casadi_real* res[" << sz_res() << "] = {0};\n";
2571 
2572  // Check arguments
2573  g << "if (argc>" << n_in_ << ") mexErrMsgIdAndTxt(\"Casadi:RuntimeError\","
2574  << "\"Evaluation of \\\"" << name_ << "\\\" failed. Too many input arguments "
2575  << "(%d, max " << n_in_ << ")\", argc);\n";
2576 
2577  g << "if (resc>" << n_out_ << ") mexErrMsgIdAndTxt(\"Casadi:RuntimeError\","
2578  << "\"Evaluation of \\\"" << name_ << "\\\" failed. "
2579  << "Too many output arguments (%d, max " << n_out_ << ")\", resc);\n";
2580 
2581  for (casadi_int i=0; i<n_in_; ++i) {
2582  std::string p = "argv[" + str(i) + "]";
2583  g << "if (--argc>=0) arg[" << i << "] = "
2584  << g.from_mex(p, "w", offset, sparsity_in_[i], fw) << "\n";
2585  offset += nnz_in(i);
2586  }
2587 
2588  for (casadi_int i=0; i<n_out_; ++i) {
2589  if (i==0) {
2590  // if i==0, always store output (possibly ans output)
2591  g << "--resc;\n";
2592  } else {
2593  // Store output, if it exists
2594  g << "if (--resc>=0) ";
2595  }
2596  // Create and get pointer
2597  g << g.res(i) << " = w+" << str(offset) << ";\n";
2598  offset += nnz_out(i);
2599  }
2600  g << name_ << "_incref();\n";
2601  g << "mem = " << name_ << "_checkout();\n";
2602 
2603  // Call the function
2604  g << "i = " << name_ << "(arg, res, iw, " << fw << ", mem);\n"
2605  << "if (i) mexErrMsgIdAndTxt(\"Casadi:RuntimeError\",\"Evaluation of \\\"" << name_
2606  << "\\\" failed.\");\n";
2607  g << name_ << "_release(mem);\n";
2608  g << name_ << "_decref();\n";
2609 
2610  // Save results
2611  for (casadi_int i=0; i<n_out_; ++i) {
2612  g << "if (" << g.res(i) << ") resv[" << i << "] = "
2613  << g.to_mex(sparsity_out_[i], g.res(i)) << "\n";
2614  }
2615 
2616  // End conditional compilation and function
2617  g << "}\n"
2618  << "#endif\n\n";
2619  }
2620 
2621  if (g.main) {
2622  // Declare wrapper
2623  g << "casadi_int main_" << name_ << "(casadi_int argc, char* argv[]) {\n";
2624 
2625  g << "casadi_int j;\n";
2626  g << "casadi_real* a;\n";
2627  g << "const casadi_real* r;\n";
2628  g << "casadi_int flag;\n";
2629  if (needs_mem) g << "int mem;\n";
2630 
2631 
2632 
2633  // Work vectors and input and output buffers
2634  size_t nr = sz_w() + nnz_in() + nnz_out();
2635  g << CodeGenerator::array("casadi_int", "iw", sz_iw())
2636  << CodeGenerator::array("casadi_real", "w", nr);
2637 
2638  // Input buffers
2639  g << "const casadi_real* arg[" << sz_arg() << "];\n";
2640 
2641  // Output buffers
2642  g << "casadi_real* res[" << sz_res() << "];\n";
2643 
2644  casadi_int off=0;
2645  for (casadi_int i=0; i<n_in_; ++i) {
2646  g << "arg[" << i << "] = w+" << off << ";\n";
2647  off += nnz_in(i);
2648  }
2649  for (casadi_int i=0; i<n_out_; ++i) {
2650  g << "res[" << i << "] = w+" << off << ";\n";
2651  off += nnz_out(i);
2652  }
2653 
2654  // TODO(@jaeandersson): Read inputs from file. For now; read from stdin
2655  g << "a = w;\n"
2656  << "for (j=0; j<" << nnz_in() << "; ++j) "
2657  << "if (scanf(\"%lg\", a++)<=0) return 2;\n";
2658 
2659  if (needs_mem) {
2660  g << "mem = " << name_ << "_checkout();\n";
2661  }
2662 
2663  // Call the function
2664  g << "flag = " << name_ << "(arg, res, iw, w+" << off << ", ";
2665  if (needs_mem) {
2666  g << "mem";
2667  } else {
2668  g << "0";
2669  }
2670  g << ");\n";
2671  if (needs_mem) {
2672  g << name_ << "_release(mem);\n";
2673  }
2674  g << "if (flag) return flag;\n";
2675 
2676  // TODO(@jaeandersson): Write outputs to file. For now: print to stdout
2677  g << "r = w+" << nnz_in() << ";\n"
2678  << "for (j=0; j<" << nnz_out() << "; ++j) "
2679  << g.printf("%g ", "*r++") << "\n";
2680 
2681  // End with newline
2682  g << g.printf("\\n") << "\n";
2683 
2684  // Finalize function
2685  g << "return 0;\n"
2686  << "}\n\n";
2687  }
2688 
2689  if (g.with_mem) {
2690  // Allocate memory
2691  g << g.declare("casadi_functions* " + name_ + "_functions(void)") << " {\n"
2692  << "static casadi_functions fun = {\n"
2693  << name_ << "_incref,\n"
2694  << name_ << "_decref,\n"
2695  << name_ << "_checkout,\n"
2696  << name_ << "_release,\n"
2697  << name_ << "_default_in,\n"
2698  //<< name_ << "_alloc_mem,\n"
2699  //<< name_ << "_init_mem,\n"
2700  //<< name_ << "_free_mem,\n"
2701  << name_ << "_n_in,\n"
2702  << name_ << "_n_out,\n"
2703  << name_ << "_name_in,\n"
2704  << name_ << "_name_out,\n"
2705  << name_ << "_sparsity_in,\n"
2706  << name_ << "_sparsity_out,\n"
2707  << name_ << "_work,\n"
2708  << name_ << "\n"
2709  << "};\n"
2710  << "return &fun;\n"
2711  << "}\n";
2712  }
2713  // Flush
2714  g.flush(g.body);
2715  }
static std::string array(const std::string &type, const std::string &name, casadi_int len, const std::string &def=std::string())
virtual size_t codegen_sz_res(const CodeGenerator &g) const
Get required lengths, for codegen.
virtual size_t codegen_sz_arg(const CodeGenerator &g) const
Get required lengths, for codegen.
std::vector< bool > is_diff_out_
virtual size_t codegen_sz_iw(const CodeGenerator &g) const
Get required lengths, for codegen.
virtual void codegen_incref(CodeGenerator &g) const
Codegen incref for dependencies.
virtual size_t codegen_sz_w(const CodeGenerator &g) const
Get required lengths, for codegen.
std::vector< bool > is_diff_in_
Are inputs and outputs differentiable?
virtual void codegen_decref(CodeGenerator &g) const
Codegen decref for dependencies.
void codegen_sparsities(CodeGenerator &g) const
Codegen sparsities.
virtual double get_default_in(casadi_int ind) const
Get default input value.
bool all(const std::vector< bool > &v)
Check if all arguments are true.
Definition: casadi_misc.cpp:77

References casadi::all(), casadi::CodeGenerator::array(), casadi::CodeGenerator::body, casadi::FunctionInternal::codegen_decref(), casadi::FunctionInternal::codegen_incref(), casadi::FunctionInternal::codegen_mem_type(), casadi::FunctionInternal::codegen_name(), casadi::FunctionInternal::codegen_sparsities(), casadi::FunctionInternal::codegen_sz_arg(), casadi::FunctionInternal::codegen_sz_iw(), casadi::FunctionInternal::codegen_sz_res(), casadi::FunctionInternal::codegen_sz_w(), casadi::CodeGenerator::constant(), casadi::CodeGenerator::declare(), casadi::CodeGenerator::flush(), casadi::CodeGenerator::from_mex(), casadi::FunctionInternal::get_default_in(), casadi::CodeGenerator::header, casadi::FunctionInternal::is_diff_in_, casadi::FunctionInternal::is_diff_out_, casadi::CodeGenerator::main, casadi::CodeGenerator::mex, casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::FunctionInternal::name_in_, casadi::FunctionInternal::name_out_, casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::nnz_out(), casadi::CodeGenerator::printf(), casadi::CodeGenerator::res(), casadi::Sparsity::size1(), casadi::Sparsity::size2(), casadi::FunctionInternal::sparsity_in_, casadi::FunctionInternal::sparsity_out_, casadi::str(), casadi::FunctionInternal::sz_arg(), casadi::FunctionInternal::sz_iw(), casadi::FunctionInternal::sz_res(), casadi::FunctionInternal::sz_w(), casadi::CodeGenerator::to_mex(), casadi::CodeGenerator::with_header, and casadi::CodeGenerator::with_mem.

Referenced by casadi::CodeGenerator::add().

◆ codegen_name()

std::string casadi::FunctionInternal::codegen_name ( const CodeGenerator g,
bool  ns = true 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_lp

Definition at line 2717 of file function_internal.cpp.

2717  {
2718  if (ns) {
2719  // Get the index of the function
2720  for (auto&& e : g.added_functions_) {
2721  if (e.f.get()==this) return e.codegen_name;
2722  }
2723  } else {
2724  for (casadi_int i=0;i<g.added_functions_.size();++i) {
2725  const auto & e = g.added_functions_[i];
2726  if (e.f.get()==this) return "f" + str(i);
2727  }
2728  }
2729  casadi_error("Function '" + name_ + "' not found");
2730  }

References casadi::CodeGenerator::added_functions_, casadi::ProtoFunction::name_, and casadi::str().

Referenced by casadi::FunctionInternal::codegen_alloc_mem(), casadi::FunctionInternal::codegen_checkout(), casadi::Call::codegen_decref(), casadi::Call::codegen_incref(), casadi::FunctionInternal::codegen_mem(), casadi::FunctionInternal::codegen_meta(), casadi::FunctionInternal::codegen_release(), and casadi::CodeGenerator::mem().

◆ codegen_release()

void casadi::FunctionInternal::codegen_release ( CodeGenerator g) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_lx

Reimplemented in casadi::External.

Definition at line 2389 of file function_internal.cpp.

2389  {
2390  std::string name = codegen_name(g, false);
2391  std::string stack_counter = g.shorthand(name + "_unused_stack_counter");
2392  std::string stack = g.shorthand(name + "_unused_stack");
2393  g << stack << "[++" << stack_counter << "] = mem;\n";
2394  }

References casadi::FunctionInternal::codegen_name(), and casadi::CodeGenerator::shorthand().

Referenced by casadi::CodeGenerator::add_dependency().

◆ codegen_sparsities()

void casadi::FunctionInternal::codegen_sparsities ( CodeGenerator g) const
inherited

◆ codegen_sz_arg()

size_t casadi::FunctionInternal::codegen_sz_arg ( const CodeGenerator g) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_29g

Definition at line 2829 of file function_internal.cpp.

2829  {
2830  return sz_arg();
2831  }

References casadi::FunctionInternal::sz_arg().

Referenced by casadi::FunctionInternal::codegen_meta().

◆ codegen_sz_iw()

size_t casadi::FunctionInternal::codegen_sz_iw ( const CodeGenerator g) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_29g

Definition at line 2835 of file function_internal.cpp.

2835  {
2836  return sz_iw();
2837  }

References casadi::FunctionInternal::sz_iw().

Referenced by casadi::FunctionInternal::codegen_meta().

◆ codegen_sz_res()

size_t casadi::FunctionInternal::codegen_sz_res ( const CodeGenerator g) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_29g

Definition at line 2832 of file function_internal.cpp.

2832  {
2833  return sz_res();
2834  }

References casadi::FunctionInternal::sz_res().

Referenced by casadi::FunctionInternal::codegen_meta().

◆ codegen_sz_w()

size_t casadi::FunctionInternal::codegen_sz_w ( const CodeGenerator g) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_29g

Reimplemented in casadi::SXFunction.

Definition at line 2838 of file function_internal.cpp.

2838  {
2839  return sz_w();
2840  }

References casadi::FunctionInternal::sz_w().

Referenced by casadi::FunctionInternal::codegen_meta().

◆ construct()

void casadi::ProtoFunction::construct ( const Dict opts)
inherited

Prepares the function for evaluation

Extra doc: https://github.com/casadi/casadi/wiki/L_jf

Definition at line 137 of file function_internal.cpp.

137  {
138  // Sanitize dictionary is needed
139  if (!Options::is_sane(opts)) {
140  // Call recursively
141  return construct(Options::sanitize(opts));
142  }
143 
144  // Make sure all options exist
145  get_options().check(opts);
146 
147  // Initialize the class hierarchy
148  try {
149  init(opts);
150  } catch(std::exception& e) {
151  casadi_error("Error calling " + class_name() + "::init for '" + name_ + "':\n"
152  + std::string(e.what()));
153  }
154 
155  // Revisit class hierarchy in reverse order
156  try {
157  finalize();
158  } catch(std::exception& e) {
159  casadi_error("Error calling " + class_name() + "::finalize for '" + name_ + "':\n"
160  + std::string(e.what()));
161  }
162  }
void construct(const Dict &opts)
Construct.
virtual const Options & get_options() const
Options.
virtual void init(const Dict &opts)
Initialize.
virtual void finalize()
Finalize the object creation.
static bool is_sane(const Dict &opts)
Is the dictionary sane.
Definition: options.cpp:169
static Dict sanitize(const Dict &opts, bool top_level=true)
Sanitize a options dictionary.
Definition: options.cpp:173
void check(const Dict &opts) const
Check if options exist.
Definition: options.cpp:240

References casadi::Options::check(), casadi::SharedObjectInternal::class_name(), casadi::ProtoFunction::finalize(), casadi::ProtoFunction::get_options(), casadi::ProtoFunction::init(), casadi::Options::is_sane(), casadi::ProtoFunction::name_, and casadi::Options::sanitize().

Referenced by casadi::Function::create(), casadi::FmuFunction::factory(), casadi::FmuFunction::get_forward(), casadi::FmuFunction::get_jacobian(), casadi::LinearInterpolant::get_jacobian(), and casadi::FmuFunction::get_reverse().

◆ convert_arg() [1/2]

template<typename M >
std::vector< M > casadi::FunctionInternal::convert_arg ( const std::map< std::string, M > &  arg) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ks

Definition at line 1811 of file function_internal.hpp.

1812  {
1813  // Get default inputs
1814  std::vector<M> arg_v(n_in_);
1815  for (casadi_int i=0; i<arg_v.size(); ++i) {
1816  arg_v[i] = get_default_in(i);
1817  }
1818 
1819  // Assign provided inputs
1820  for (auto&& e : arg) {
1821  arg_v.at(index_in(e.first)) = e.second;
1822  }
1823 
1824  return arg_v;
1825  }
casadi_int index_in(const std::string &name) const
Get input scheme index by name.

References casadi::FunctionInternal::get_default_in(), casadi::FunctionInternal::index_in(), and casadi::FunctionInternal::n_in_.

◆ convert_arg() [2/2]

template<typename M >
std::map< std::string, M > casadi::FunctionInternal::convert_arg ( const std::vector< M > &  arg) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ks

Definition at line 1799 of file function_internal.hpp.

1800  {
1801  casadi_assert(arg.size()==n_in_, "Incorrect number of inputs: Expected "
1802  + str(n_in_) + ", got " + str(arg.size()));
1803  std::map<std::string, M> ret;
1804  for (casadi_int i=0;i<n_in_;++i) {
1805  ret[name_in_[i]] = arg[i];
1806  }
1807  return ret;
1808  }

References casadi::FunctionInternal::n_in_, casadi::FunctionInternal::name_in_, and casadi::str().

◆ convert_res() [1/2]

template<typename M >
std::vector< M > casadi::FunctionInternal::convert_res ( const std::map< std::string, M > &  res) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ks

Definition at line 1840 of file function_internal.hpp.

1841  {
1842  // Get default inputs
1843  std::vector<M> res_v(n_out_);
1844  for (casadi_int i=0; i<res_v.size(); ++i) {
1845  res_v[i] = std::numeric_limits<double>::quiet_NaN();
1846  }
1847 
1848  // Assign provided inputs
1849  for (auto&& e : res) {
1850  M a = e.second;
1851  res_v.at(index_out(e.first)) = a;
1852  }
1853  return res_v;
1854  }
casadi_int index_out(const std::string &name) const
Get output scheme index by name.

References casadi::FunctionInternal::index_out(), and casadi::FunctionInternal::n_out_.

◆ convert_res() [2/2]

template<typename M >
std::map< std::string, M > casadi::FunctionInternal::convert_res ( const std::vector< M > &  res) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ks

Definition at line 1828 of file function_internal.hpp.

1829  {
1830  casadi_assert(res.size()==n_out_, "Incorrect number of outputs: Expected "
1831  + str(n_out_) + ", got " + str(res.size()));
1832  std::map<std::string, M> ret;
1833  for (casadi_int i=0;i<n_out_;++i) {
1834  ret[name_out_[i]] = res[i];
1835  }
1836  return ret;
1837  }

References casadi::FunctionInternal::n_out_, casadi::FunctionInternal::name_out_, and casadi::str().

◆ creator()

static Expm* casadi::SlicotExpm::creator ( const std::string &  name,
const Sparsity A 
)
inlinestatic

Definition at line 83 of file slicot_expm.hpp.

84  {
85  return new SlicotExpm(name, A);
86  }
SlicotExpm()
Constructor.

Referenced by casadi::casadi_register_expm_slicot().

◆ debug_repr()

std::string casadi::GenericSharedInternal< SharedObject , SharedObjectInternal >::debug_repr ( const Internal *  i) const
inherited

Definition at line 62 of file generic_shared_internal.hpp.

162  {
163  // Note: i != this because of something something multiple inheritance
164  return str( (casadi_int)(i)) + "/" + static_cast<const Internal*>(this)->class_name();
165  }

◆ definition()

std::string casadi::FunctionInternal::definition ( ) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ma

Definition at line 941 of file function_internal.cpp.

941  {
942  std::stringstream s;
943 
944  // Print name
945  s << name_ << ":(";
946  // Print input arguments
947  for (casadi_int i=0; i<n_in_; ++i) {
948  if (!is_diff_in_.empty() && !is_diff_in_[i]) s << "#";
949  s << name_in_[i] << sparsity_in_[i].postfix_dim() << (i==n_in_-1 ? "" : ",");
950  }
951  s << ")->(";
952  // Print output arguments
953  for (casadi_int i=0; i<n_out_; ++i) {
954  if (!is_diff_out_.empty() && !is_diff_out_[i]) s << "#";
955  s << name_out_[i] << sparsity_out_[i].postfix_dim() << (i==n_out_-1 ? "" : ",");
956  }
957  s << ")";
958 
959  return s.str();
960  }

References casadi::FunctionInternal::is_diff_in_, casadi::FunctionInternal::is_diff_out_, casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::FunctionInternal::name_in_, casadi::FunctionInternal::name_out_, casadi::FunctionInternal::sparsity_in_, and casadi::FunctionInternal::sparsity_out_.

Referenced by casadi::FunctionInternal::codegen(), casadi::FunctionInternal::disp(), casadi::MXFunction::should_inline(), and casadi::SXFunction::should_inline().

◆ deserialize() [1/2]

Function casadi::FunctionInternal::deserialize ( DeserializingStream s)
staticinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_nu

Definition at line 4095 of file function_internal.cpp.

4095  {
4096  std::string base_function;
4097  s.unpack("FunctionInternal::base_function", base_function);
4098  auto it = FunctionInternal::deserialize_map.find(base_function);
4099  casadi_assert(it!=FunctionInternal::deserialize_map.end(),
4100  "FunctionInternal::deserialize: not found '" + base_function + "'");
4101 
4102  Function ret;
4103  ret.own(it->second(s));
4104  ret->finalize();
4105  return ret;
4106  }
static std::map< std::string, ProtoFunction *(*)(DeserializingStream &)> deserialize_map

References casadi::FunctionInternal::deserialize_map, casadi::FunctionInternal::finalize(), casadi::GenericShared< Shared, Internal >::own(), and casadi::DeserializingStream::unpack().

Referenced by casadi::Function::deserialize().

◆ deserialize() [2/2]

static ProtoFunction* casadi::PluginInterface< Expm >::deserialize ( DeserializingStream s)
inlinestaticinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_rr

Definition at line 121 of file plugin_interface.hpp.

121  {
122  std::string class_name, plugin_name;
123  s.unpack("PluginInterface::plugin_name", plugin_name);
125  return deserialize(s);
126  }
static Deserialize plugin_deserialize(const std::string &pname)
Get the plugin deserialize_map.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
virtual const char * plugin_name() const=0
ProtoFunction *(* Deserialize)(DeserializingStream &)

◆ destroySingleton()

void casadi::GenericSharedInternal< SharedObject , SharedObjectInternal >::destroySingleton ( )
inlineprotectedinherited

Called in the destructor of singletons

Definition at line 77 of file generic_shared_internal.hpp.

77  {
78  static_cast<Internal*>(this)->count--;
79  }

◆ diff_prefix()

std::string casadi::FunctionInternal::diff_prefix ( const std::string &  prefix) const
inherited

Definition at line 2043 of file function_internal.cpp.

2043  {
2044  // Highest index found in current inputs and outputs
2045  casadi_int highest_index = 0;
2046  // Loop over both input names and output names
2047  for (const std::vector<std::string>& name_io : {name_in_, name_out_}) {
2048  for (const std::string& n : name_io) {
2049  // Find end of prefix, skip if no prefix
2050  size_t end = n.find('_');
2051  if (end >= n.size()) continue;
2052  // Skip if too short
2053  if (end < prefix.size()) continue;
2054  // Skip if wrong prefix
2055  if (n.compare(0, prefix.size(), prefix) != 0) continue;
2056  // Beginning of index
2057  size_t begin = prefix.size();
2058  // Check if any index
2059  casadi_int this_index;
2060  if (begin == end) {
2061  // No prefix, implicitly 1
2062  this_index = 1;
2063  } else {
2064  // Read index from string
2065  this_index = std::stoi(n.substr(begin, end - begin));
2066  }
2067  // Find the highest index
2068  if (this_index > highest_index) highest_index = this_index;
2069  }
2070  }
2071  // Return one higher index
2072  if (highest_index == 0) {
2073  return prefix + "_";
2074  } else {
2075  return prefix + std::to_string(highest_index + 1) + "_";
2076  }
2077  }

References casadi::FunctionInternal::name_in_, and casadi::FunctionInternal::name_out_.

Referenced by casadi::FunctionInternal::forward(), and casadi::FunctionInternal::reverse().

◆ disp()

void casadi::FunctionInternal::disp ( std::ostream &  stream,
bool  more 
) const
overridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_m8

Implements casadi::SharedObjectInternal.

Definition at line 962 of file function_internal.cpp.

962  {
963  stream << definition() << " " << class_name();
964  if (more) {
965  stream << std::endl;
966  disp_more(stream);
967  }
968  }
virtual void disp_more(std::ostream &stream) const
Print more.

References casadi::SharedObjectInternal::class_name(), casadi::FunctionInternal::definition(), and casadi::FunctionInternal::disp_more().

Referenced by casadi::MXFunction::eval(), and casadi::SXFunction::eval().

◆ disp_more()

virtual void casadi::FunctionInternal::disp_more ( std::ostream &  stream) const
inlinevirtualinherited

◆ dm_in() [1/2]

const std::vector< DM > casadi::FunctionInternal::dm_in ( ) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_l7

Definition at line 3244 of file function_internal.cpp.

3244  {
3245  std::vector<DM> ret(n_in_);
3246  for (casadi_int i=0; i<ret.size(); ++i) {
3247  ret[i] = dm_in(i);
3248  }
3249  return ret;
3250  }
const std::vector< DM > dm_in() const
Get function input(s) and output(s)

References casadi::FunctionInternal::n_in_.

Referenced by casadi::FunctionInternal::nz_in().

◆ dm_in() [2/2]

const DM casadi::FunctionInternal::dm_in ( casadi_int  ind) const
inherited

◆ dm_out() [1/2]

const std::vector< DM > casadi::FunctionInternal::dm_out ( ) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_l7

Definition at line 3252 of file function_internal.cpp.

3252  {
3253  std::vector<DM> ret(n_out_);
3254  for (casadi_int i=0; i<ret.size(); ++i) {
3255  ret[i] = dm_out(i);
3256  }
3257  return ret;
3258  }
const std::vector< DM > dm_out() const
Get function input(s) and output(s)

References casadi::FunctionInternal::n_out_.

Referenced by casadi::FunctionInternal::nz_out().

◆ dm_out() [2/2]

const DM casadi::FunctionInternal::dm_out ( casadi_int  ind) const
inherited

◆ ensure_stacked()

template<typename MatType >
MatType casadi::FunctionInternal::ensure_stacked ( const MatType &  v,
const Sparsity sp,
casadi_int  n 
)
staticinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_26j

Definition at line 1857 of file function_internal.hpp.

1857  {
1858  // Check dimensions
1859  if (v.size1() == sp.size1() && v.size2() == n * sp.size2()) {
1860  // Ensure that sparsity is a horizontal multiple of original input, or has no entries
1861  if (v.nnz() != 0 && !v.sparsity().is_stacked(sp, n)) {
1862  return project(v, repmat(sp, 1, n));
1863  }
1864  } else {
1865  // Correct empty sparsity
1866  casadi_assert_dev(v.is_empty());
1867  return MatType(sp.size1(), sp.size2() * n);
1868  }
1869  // No correction needed
1870  return v;
1871  }

References casadi::Sparsity::size1(), and casadi::Sparsity::size2().

◆ eval()

int casadi::SlicotExpm::eval ( const double **  arg,
double **  res,
casadi_int *  iw,
double *  w,
void *  mem 
) const
overridevirtual

Reimplemented from casadi::FunctionInternal.

Definition at line 103 of file slicot_expm.cpp.

104  {
105  auto m = static_cast<SlicotExpmMemory*>(mem);
106 
107  setup(mem, arg, res, iw, w);
108 
109  double tol = 1e-8;
110  int ret = slicot_mb05nd(n_, arg[1][0], arg[0], n_, m->A, n_, m->H, n_,
111  tol, m->iwork, m->dwork, 2*n_*n_);
112  casadi_assert(ret==0, "Slicot mb05nd failed with status " + str(ret) + ".");
113  if (res[0]) std::copy(m->A, m->A+n_*n_, res[0]);
114  return 0;
115  }
void setup(void *mem, const double **arg, double **res, casadi_int *iw, double *w) const
Set the (persistent and temporary) work vectors.
int slicot_mb05nd(int n, double delta, const double *a, int lda, double *ex, int ldex, double *exint, int ldexin, double tol, int *iwork, double *dwork, int ldwork)

References casadi::FunctionInternal::setup(), casadi::slicot_mb05nd(), and casadi::str().

◆ eval_dm()

std::vector< DM > casadi::FunctionInternal::eval_dm ( const std::vector< DM > &  arg) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ke

Reimplemented in casadi::CallbackInternal.

Definition at line 2026 of file function_internal.cpp.

2026  {
2027  casadi_error("'eval_dm' not defined for " + class_name());
2028  }

References casadi::SharedObjectInternal::class_name().

Referenced by casadi::FunctionInternal::eval().

◆ eval_gen() [1/3]

int casadi::FunctionInternal::eval_gen ( const bvec_t **  arg,
bvec_t **  res,
casadi_int *  iw,
bvec_t w,
void *  mem,
bool  always_inline,
bool  never_inline 
) const
inlineinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kf

Definition at line 430 of file function_internal.hpp.

431  {
432  return sp_forward(arg, res, iw, w, mem);
433  }
virtual int sp_forward(const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const
Propagate sparsity forward.

◆ eval_gen() [2/3]

int casadi::FunctionInternal::eval_gen ( const double **  arg,
double **  res,
casadi_int *  iw,
double *  w,
void *  mem,
bool  always_inline,
bool  never_inline 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kb

Definition at line 830 of file function_internal.cpp.

832  {
833  casadi_int dump_id = (dump_in_ || dump_out_ || dump_) ? get_dump_id() : 0;
834  if (dump_in_) dump_in(dump_id, arg);
835  if (dump_ && dump_id==0) dump();
836  if (print_in_) print_in(uout(), arg, false);
837  auto m = static_cast<ProtoFunctionMemory*>(mem);
838 
839  // Avoid memory corruption
840  for (casadi_int i=0;i<n_in_;++i) {
841  casadi_assert(arg[i]==0 || arg[i]+nnz_in(i)<=w || arg[i]>=w+sz_w(),
842  "Memory corruption detected for input " + name_in_[i] + ".\n"+
843  "arg[" + str(i) + "] " + str(arg[i]) + "-" + str(arg[i]+nnz_in(i)) +
844  " intersects with w " + str(w)+"-"+str(w+sz_w())+".");
845  }
846  for (casadi_int i=0;i<n_out_;++i) {
847  casadi_assert(res[i]==0 || res[i]+nnz_out(i)<=w || res[i]>=w+sz_w(),
848  "Memory corruption detected for output " + name_out_[i]);
849  }
850  // Reset statistics
851  for (auto&& s : m->fstats) s.second.reset();
852  if (m->t_total) m->t_total->tic();
853  int ret;
854  if (eval_) {
855  auto m = static_cast<FunctionMemory*>(mem);
856  m->stats_available = true;
857  int mem_ = 0;
858  if (checkout_) {
859 #ifdef CASADI_WITH_THREAD
860  std::lock_guard<std::mutex> lock(mtx_);
861 #endif //CASADI_WITH_THREAD
862  mem_ = checkout_();
863  }
864  ret = eval_(arg, res, iw, w, mem_);
865  if (release_) {
866 #ifdef CASADI_WITH_THREAD
867  std::lock_guard<std::mutex> lock(mtx_);
868 #endif //CASADI_WITH_THREAD
869  release_(mem_);
870  }
871  } else {
872  ret = eval(arg, res, iw, w, mem);
873  }
874  if (m->t_total) m->t_total->toc();
875  // Show statistics
876  print_time(m->fstats);
877 
878  if (dump_out_) dump_out(dump_id, res);
879  if (print_out_) print_out(uout(), res, false);
880  // Check all outputs for NaNs
881  if (regularity_check_) {
882  for (casadi_int i = 0; i < n_out_; ++i) {
883  // Skip of not calculated
884  if (!res[i]) continue;
885  // Loop over nonzeros
886  casadi_int nnz = this->nnz_out(i);
887  for (casadi_int nz = 0; nz < nnz; ++nz) {
888  if (isnan(res[i][nz]) || isinf(res[i][nz])) {
889  // Throw readable error message
890  casadi_error(str(res[i][nz]) + " detected for output " + name_out_[i] + " at "
891  + sparsity_out(i).repr_el(nz));
892  }
893  }
894  }
895  }
896  return ret;
897  }
void print_in(std::ostream &stream, const double **arg, bool truncate) const
Print inputs.
casadi_release_t release_
Release redirected to a C function.
virtual int eval(const double **arg, double **res, casadi_int *iw, double *w, void *mem) const
Evaluate numerically.
eval_t eval_
Numerical evaluation redirected to a C function.
casadi_checkout_t checkout_
Checkout redirected to a C function.
void print_out(std::ostream &stream, double **res, bool truncate) const
Print outputs.
bool regularity_check_
Errors are thrown when NaN is produced.
void print_time(const std::map< std::string, FStats > &fstats) const
Print timing statistics.
std::ostream & uout()

References casadi::FunctionInternal::checkout_, casadi::FunctionInternal::dump_, casadi::FunctionInternal::dump_in_, casadi::FunctionInternal::dump_out_, casadi::FunctionInternal::eval(), casadi::FunctionInternal::eval_, casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::FunctionInternal::name_in_, casadi::FunctionInternal::name_out_, casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::nnz_out(), casadi::FunctionInternal::print_in(), casadi::FunctionInternal::print_in_, casadi::FunctionInternal::print_out(), casadi::FunctionInternal::print_out_, casadi::ProtoFunction::print_time(), casadi::ProtoFunction::regularity_check_, casadi::FunctionInternal::release_, casadi::FunctionInternal::sparsity_out(), casadi::FunctionMemory::stats_available, casadi::str(), casadi::FunctionInternal::sz_w(), and casadi::uout().

Referenced by casadi::FunctionInternal::call_gen().

◆ eval_gen() [3/3]

int casadi::FunctionInternal::eval_gen ( const SXElem **  arg,
SXElem **  res,
casadi_int *  iw,
SXElem w,
void *  mem,
bool  always_inline,
bool  never_inline 
) const
inlineinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kf

Definition at line 426 of file function_internal.hpp.

427  {
428  return eval_sx(arg, res, iw, w, mem, always_inline, never_inline);
429  }
virtual int eval_sx(const SXElem **arg, SXElem **res, casadi_int *iw, SXElem *w, void *mem, bool always_inline, bool never_inline) const
Evaluate with symbolic scalars.

◆ eval_mx()

void casadi::FunctionInternal::eval_mx ( const MXVector arg,
MXVector res,
bool  always_inline,
bool  never_inline 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kd

Reimplemented in casadi::SXFunction, and casadi::MXFunction.

Definition at line 2241 of file function_internal.cpp.

2242  {
2243 
2244  always_inline = always_inline || always_inline_;
2245  never_inline = never_inline || never_inline_;
2246 
2247  // The code below creates a call node, to inline, wrap in an MXFunction
2248  if (always_inline) {
2249  casadi_assert(!never_inline, "Inconsistent options for " + str(name_));
2250  return wrap().call(arg, res, true);
2251  }
2252 
2253  // Create a call-node
2254  res = Call::create(self(), arg);
2255  }
static std::vector< MX > create(const Function &fcn, const std::vector< MX > &arg)
Create function call node.
Function wrap() const
Wrap in an Function instance consisting of only one MX call.
void call(const std::vector< DM > &arg, std::vector< DM > &res, bool always_inline=false, bool never_inline=false) const
Evaluate the function symbolically or numerically.
Definition: function.cpp:357

References casadi::FunctionInternal::always_inline_, casadi::Function::call(), casadi::Call::create(), casadi::ProtoFunction::name_, casadi::FunctionInternal::never_inline_, casadi::str(), and casadi::FunctionInternal::wrap().

Referenced by casadi::FunctionInternal::call_gen(), casadi::MXFunction::eval_mx(), and casadi::SXFunction::eval_mx().

◆ eval_sx()

int casadi::FunctionInternal::eval_sx ( const SXElem **  arg,
SXElem **  res,
casadi_int *  iw,
SXElem w,
void *  mem,
bool  always_inline,
bool  never_inline 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kc

Reimplemented in casadi::SXFunction, casadi::Switch, casadi::MXFunction, casadi::MapSum, and casadi::Map.

Definition at line 2030 of file function_internal.cpp.

2032  {
2033 
2034  always_inline = always_inline || always_inline_;
2035  never_inline = never_inline || never_inline_;
2036 
2037  casadi_assert(!always_inline, "'eval_sx' not defined for " + class_name() +
2038  " in combination with always_inline true");
2039 
2040  return CallSX::eval_sx(self(), arg, res);
2041  }
static int eval_sx(const Function &f, const SXElem **arg, SXElem **res)
Definition: call_sx.hpp:63

References casadi::FunctionInternal::always_inline_, casadi::SharedObjectInternal::class_name(), casadi::CallSX::eval_sx(), and casadi::FunctionInternal::never_inline_.

Referenced by casadi::MXFunction::eval_sx(), and casadi::SXFunction::eval_sx().

◆ export_code()

void casadi::FunctionInternal::export_code ( const std::string &  lang,
std::ostream &  stream,
const Dict options 
) const
virtualinherited

◆ factory()

Function casadi::FunctionInternal::factory ( const std::string &  name,
const std::vector< std::string > &  s_in,
const std::vector< std::string > &  s_out,
const Function::AuxOut aux,
const Dict opts 
) const
virtualinherited

Reimplemented in casadi::XFunction< DerivedType, MatType, NodeType >, casadi::XFunction< MXFunction, MX, MXNode >, casadi::XFunction< SXFunction, Matrix< SXElem >, SXNode >, casadi::FmuFunction, and casadi::External.

Definition at line 3613 of file function_internal.cpp.

3618  {
3619  return wrap().factory(name, s_in, s_out, aux, opts);
3620  }
Function factory(const std::string &name, const std::vector< std::string > &s_in, const std::vector< std::string > &s_out, const AuxOut &aux=AuxOut(), const Dict &opts=Dict()) const
Definition: function.cpp:1812

References casadi::Function::factory(), and casadi::FunctionInternal::wrap().

Referenced by casadi::Function::factory(), casadi::External::factory(), and casadi::FmuFunction::factory().

◆ finalize()

void casadi::FunctionInternal::finalize ( )
overridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_k7

Reimplemented from casadi::ProtoFunction.

Reimplemented in casadi::OracleFunction.

Definition at line 686 of file function_internal.cpp.

686  {
687  if (jit_) {
689  if (jit_temp_suffix_) {
691  jit_name_ = std::string(jit_name_.begin(), jit_name_.begin()+jit_name_.size()-2);
692  }
693  if (has_codegen()) {
694  if (compiler_.is_null()) {
695  if (verbose_) casadi_message("Codegenerating function '" + name_ + "'.");
696  // JIT everything
697  Dict opts;
698  // Override the default to avoid random strings in the generated code
699  opts["prefix"] = "jit";
700  CodeGenerator gen(jit_name_, opts);
701  gen.add(self());
702  if (verbose_) casadi_message("Compiling function '" + name_ + "'..");
703  std::string jit_directory = get_from_dict(jit_options_, "directory", std::string(""));
704  compiler_ = Importer(gen.generate(jit_directory), compiler_plugin_, jit_options_);
705  if (verbose_) casadi_message("Compiling function '" + name_ + "' done.");
706  }
707  // Try to load
711  casadi_assert(eval_!=nullptr, "Cannot load JIT'ed function.");
712  } else {
713  // Just jit dependencies
715  }
716  }
717 
718  // Finalize base classes
720 
721  // Dump if requested
722  if (dump_) dump();
723  }
virtual void jit_dependencies(const std::string &fname)
Jit dependencies.
std::string jit_name_
Name if jit source file.
std::string compiler_plugin_
Just-in-time compiler.
bool jit_
Use just-in-time compiler.
bool jit_temp_suffix_
Use a temporary name.
virtual bool has_codegen() const
Is codegen supported?
bool is_null() const
Is a null pointer?
signal_t get_function(const std::string &symname)
Get a function pointer for numerical evaluation.
Definition: importer.cpp:79
bool verbose_
Verbose printout.
T get_from_dict(const std::map< std::string, T > &d, const std::string &key, const T &default_value)
int(* casadi_checkout_t)(void)
Function pointer types for the C API.
std::string temporary_file(const std::string &prefix, const std::string &suffix)
int(* eval_t)(const double **arg, double **res, casadi_int *iw, double *w, int)
Function pointer types for the C API.
void(* casadi_release_t)(int)
Function pointer types for the C API.

References casadi::CodeGenerator::add(), casadi::FunctionInternal::checkout_, casadi::FunctionInternal::compiler_, casadi::FunctionInternal::compiler_plugin_, casadi::FunctionInternal::dump_, casadi::FunctionInternal::eval_, casadi::ProtoFunction::finalize(), casadi::CodeGenerator::generate(), casadi::get_from_dict(), casadi::Importer::get_function(), casadi::FunctionInternal::has_codegen(), casadi::GenericShared< Shared, Internal >::is_null(), casadi::FunctionInternal::jit_, casadi::FunctionInternal::jit_base_name_, casadi::FunctionInternal::jit_dependencies(), casadi::FunctionInternal::jit_name_, casadi::FunctionInternal::jit_options_, casadi::FunctionInternal::jit_temp_suffix_, casadi::ProtoFunction::name_, casadi::FunctionInternal::release_, casadi::temporary_file(), and casadi::ProtoFunction::verbose_.

Referenced by casadi::FunctionInternal::deserialize(), casadi::CallbackInternal::finalize(), and casadi::OracleFunction::finalize().

◆ find()

virtual void casadi::FunctionInternal::find ( std::map< FunctionInternal *, Function > &  all_fun,
casadi_int  max_depth 
) const
inlinevirtualinherited

◆ format_time()

void casadi::ProtoFunction::format_time ( char *  buffer,
double  time 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_jt

Definition at line 3772 of file function_internal.cpp.

3772  {
3773  // Always of width 8
3774  casadi_assert_dev(time>=0);
3775  double log_time = log10(time);
3776  int magn = static_cast<int>(floor(log_time));
3777  int iprefix = static_cast<int>(floor(log_time/3));
3778  if (iprefix<-4) {
3779  sprint(buffer, 10, " 0");
3780  return;
3781  }
3782  if (iprefix>=5) {
3783  sprint(buffer, 10, " inf");
3784  return;
3785  }
3786  char prefixes[] = "TGMk munp";
3787  char prefix = prefixes[4-iprefix];
3788 
3789  int rem = magn-3*iprefix;
3790  double time_normalized = time/pow(10, 3*iprefix);
3791 
3792  if (rem==0) {
3793  sprint(buffer, 10, " %1.2f%cs", time_normalized, prefix);
3794  } else if (rem==1) {
3795  sprint(buffer, 10, " %2.2f%cs", time_normalized, prefix);
3796  } else {
3797  sprint(buffer, 10, "%3.2f%cs", time_normalized, prefix);
3798  }
3799  }
void sprint(char *buf, size_t buf_sz, const char *fmt,...) const
C-style formatted printing to string.

References casadi::ProtoFunction::sprint().

Referenced by casadi::ProtoFunction::print_time().

◆ forward()

Function casadi::FunctionInternal::forward ( casadi_int  nfwd) const
inherited

forward(nfwd) returns a cached instance if available, and calls Function get_forward(casadi_int nfwd) if no cached version is available.

Extra doc: https://github.com/casadi/casadi/wiki/L_l0

Definition at line 2079 of file function_internal.cpp.

2079  {
2080  casadi_assert_dev(nfwd>=0);
2081  // Used wrapped function if forward not available
2082  if (!enable_forward_ && !enable_fd_) {
2083  // Derivative information must be available
2084  casadi_assert(has_derivative(), "Derivatives cannot be calculated for " + name_);
2085  return wrap().forward(nfwd);
2086  }
2087  // Retrieve/generate cached
2088  Function f;
2089  std::string fname = forward_name(name_, nfwd);
2090  if (!incache(fname, f)) {
2091  casadi_int i;
2092  // Prefix to be used for forward seeds, sensitivities
2093  std::string pref = diff_prefix("fwd");
2094  // Names of inputs
2095  std::vector<std::string> inames;
2096  for (i=0; i<n_in_; ++i) inames.push_back(name_in_[i]);
2097  for (i=0; i<n_out_; ++i) inames.push_back("out_" + name_out_[i]);
2098  for (i=0; i<n_in_; ++i) inames.push_back(pref + name_in_[i]);
2099  // Names of outputs
2100  std::vector<std::string> onames;
2101  for (i=0; i<n_out_; ++i) onames.push_back(pref + name_out_[i]);
2102  // Options
2104  opts = combine(opts, generate_options("forward"));
2105  if (!enable_forward_) opts = fd_options_;
2106  opts["derivative_of"] = self();
2107  // Generate derivative function
2108  casadi_assert_dev(enable_forward_ || enable_fd_);
2109  if (enable_forward_) {
2110  f = get_forward(nfwd, fname, inames, onames, opts);
2111  } else {
2112  // Get FD method
2113  if (fd_method_.empty() || fd_method_=="central") {
2114  f = Function::create(new CentralDiff(fname, nfwd), opts);
2115  } else if (fd_method_=="forward") {
2116  f = Function::create(new ForwardDiff(fname, nfwd), opts);
2117  } else if (fd_method_=="backward") {
2118  f = Function::create(new BackwardDiff(fname, nfwd), opts);
2119  } else if (fd_method_=="smoothing") {
2120  f = Function::create(new Smoothing(fname, nfwd), opts);
2121  } else {
2122  casadi_error("Unknown 'fd_method': " + fd_method_);
2123  }
2124  }
2125  // Consistency check for inputs
2126  casadi_assert_dev(f.n_in()==n_in_ + n_out_ + n_in_);
2127  casadi_int ind=0;
2128  for (i=0; i<n_in_; ++i) f.assert_size_in(ind++, size1_in(i), size2_in(i));
2129  for (i=0; i<n_out_; ++i) f.assert_size_in(ind++, size1_out(i), size2_out(i));
2130  for (i=0; i<n_in_; ++i) f.assert_size_in(ind++, size1_in(i), nfwd*size2_in(i));
2131  // Consistency check for outputs
2132  casadi_assert_dev(f.n_out()==n_out_);
2133  for (i=0; i<n_out_; ++i) f.assert_sparsity_out(i, sparsity_out(i), nfwd);
2134  // Save to cache
2135  tocache_if_missing(f);
2136  }
2137  return f;
2138  }
std::string diff_prefix(const std::string &prefix) const
Determine prefix for differentiated functions.
void tocache_if_missing(Function &f, const std::string &suffix="") const
Save function to cache, only if missing.
static std::string forward_name(const std::string &fcn, casadi_int nfwd)
Helper function: Get name of forward derivative function.
bool incache(const std::string &fname, Function &f, const std::string &suffix="") const
Get function in cache.
casadi_int size1_out(casadi_int ind) const
Input/output dimensions.
Dict generate_options(const std::string &target) const override
Reconstruct options dict.
virtual Function get_forward(casadi_int nfwd, const std::string &name, const std::vector< std::string > &inames, const std::vector< std::string > &onames, const Dict &opts) const
Return function that calculates forward derivatives.
Function forward(casadi_int nfwd) const
Get a function that calculates nfwd forward derivatives.
Definition: function.cpp:1135
static Function create(FunctionInternal *node)
Create from node.
Definition: function.cpp:336
Dict combine(const Dict &first, const Dict &second, bool recurse)
Combine two dicts. First has priority.

References casadi::Function::assert_size_in(), casadi::Function::assert_sparsity_out(), casadi::combine(), casadi::Function::create(), casadi::FunctionInternal::der_options_, casadi::FunctionInternal::diff_prefix(), casadi::FunctionInternal::enable_fd_, casadi::FunctionInternal::enable_forward_, casadi::FunctionInternal::fd_method_, casadi::FunctionInternal::fd_options_, casadi::Function::forward(), casadi::FunctionInternal::forward_name(), casadi::FunctionInternal::forward_options_, casadi::FunctionInternal::generate_options(), casadi::FunctionInternal::get_forward(), casadi::FunctionInternal::has_derivative(), casadi::FunctionInternal::incache(), casadi::Function::n_in(), casadi::FunctionInternal::n_in_, casadi::Function::n_out(), casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::FunctionInternal::name_in_, casadi::FunctionInternal::name_out_, casadi::FunctionInternal::size1_in(), casadi::FunctionInternal::size1_out(), casadi::FunctionInternal::size2_in(), casadi::FunctionInternal::size2_out(), casadi::FunctionInternal::sparsity_out(), casadi::FunctionInternal::tocache_if_missing(), and casadi::FunctionInternal::wrap().

Referenced by casadi::FunctionInternal::call_forward(), and casadi::Function::forward().

◆ forward_name()

static std::string casadi::FunctionInternal::forward_name ( const std::string &  fcn,
casadi_int  nfwd 
)
inlinestaticinherited

◆ free_mem()

void casadi::SlicotExpm::free_mem ( void *  mem) const
inlineoverridevirtual

Reimplemented from casadi::FunctionInternal.

Definition at line 107 of file slicot_expm.hpp.

107 { delete static_cast<SlicotExpmMemory*>(mem);}

◆ free_mx()

std::vector< MX > casadi::FunctionInternal::free_mx ( ) const
virtualinherited

Reimplemented in casadi::MXFunction.

Definition at line 3293 of file function_internal.cpp.

3293  {
3294  casadi_error("'free_mx' only defined for 'MXFunction'");
3295  }

◆ free_sx()

std::vector< SX > casadi::FunctionInternal::free_sx ( ) const
virtualinherited

Reimplemented in casadi::SXFunction.

Definition at line 3297 of file function_internal.cpp.

3297  {
3298  casadi_error("'free_sx' only defined for 'SXFunction'");
3299  }

◆ from_compact()

Sparsity casadi::FunctionInternal::from_compact ( casadi_int  oind,
casadi_int  iind,
const Sparsity sp 
) const
inherited

Definition at line 1844 of file function_internal.cpp.

1845  {
1846  // Return value
1847  Sparsity r = sp;
1848  // Insert rows if sparse output
1849  if (numel_out(oind) != r.size1()) {
1850  casadi_assert_dev(r.size1() == nnz_out(oind));
1851  r.enlargeRows(numel_out(oind), sparsity_out(oind).find());
1852  }
1853  // Insert columns if sparse input
1854  if (numel_in(iind) != r.size2()) {
1855  casadi_assert_dev(r.size2() == nnz_in(iind));
1856  r.enlargeColumns(numel_in(iind), sparsity_in(iind).find());
1857  }
1858  // Return non-compact pattern
1859  return r;
1860  }
casadi_int numel_out() const
Number of input/output elements.
virtual void find(std::map< FunctionInternal *, Function > &all_fun, casadi_int max_depth) const
casadi_int numel_in() const
Number of input/output elements.

References casadi::Sparsity::enlargeColumns(), casadi::Sparsity::enlargeRows(), casadi::FunctionInternal::find(), casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::nnz_out(), casadi::FunctionInternal::numel_in(), casadi::FunctionInternal::numel_out(), casadi::Sparsity::size1(), casadi::Sparsity::size2(), casadi::FunctionInternal::sparsity_in(), and casadi::FunctionInternal::sparsity_out().

Referenced by casadi::FunctionInternal::jac_sparsity().

◆ fwd_seed()

template<typename MatType >
std::vector< std::vector< MatType > > casadi::FunctionInternal::fwd_seed ( casadi_int  nfwd) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_nr

Definition at line 1496 of file function_internal.hpp.

1497  {
1498  std::vector<std::vector<MatType>> fseed(nfwd);
1499  for (casadi_int dir=0; dir<nfwd; ++dir) {
1500  fseed[dir].resize(n_in_);
1501  for (casadi_int iind=0; iind<n_in_; ++iind) {
1502  std::string n = "f" + str(dir) + "_" + name_in_[iind];
1503  Sparsity sp = is_diff_in_[iind] ? sparsity_in(iind) : Sparsity(size_in(iind));
1504  fseed[dir][iind] = MatType::sym(n, sp);
1505  }
1506  }
1507  return fseed;
1508  }

References casadi::FunctionInternal::is_diff_in_, casadi::FunctionInternal::n_in_, casadi::FunctionInternal::name_in_, casadi::FunctionInternal::size_in(), casadi::FunctionInternal::sparsity_in(), and casadi::str().

◆ fwdViaJac()

bool casadi::FunctionInternal::fwdViaJac ( casadi_int  nfwd) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_nc

Definition at line 2909 of file function_internal.cpp.

2909  {
2910  if (!enable_forward_ && !enable_fd_) return true;
2911  if (jac_penalty_==-1) return false;
2912 
2913  // Heuristic 1: Jac calculated via forward mode likely cheaper
2914  if (jac_penalty_*static_cast<double>(nnz_in())<nfwd) return true;
2915 
2916  // Heuristic 2: Jac calculated via reverse mode likely cheaper
2917  double w = ad_weight();
2918  if (enable_reverse_ &&
2919  jac_penalty_*(1-w)*static_cast<double>(nnz_out())<w*static_cast<double>(nfwd))
2920  return true; // NOLINT
2921 
2922  return false;
2923  }

References casadi::FunctionInternal::ad_weight(), casadi::FunctionInternal::enable_fd_, casadi::FunctionInternal::enable_forward_, casadi::FunctionInternal::enable_reverse_, casadi::FunctionInternal::jac_penalty_, casadi::FunctionInternal::nnz_in(), and casadi::FunctionInternal::nnz_out().

Referenced by casadi::FunctionInternal::call_forward().

◆ generate_dependencies()

std::string casadi::FunctionInternal::generate_dependencies ( const std::string &  fname,
const Dict opts 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_m2

Reimplemented in casadi::OracleFunction.

Definition at line 2749 of file function_internal.cpp.

2750  {
2751  casadi_error("'generate_dependencies' not defined for " + class_name());
2752  }

References casadi::SharedObjectInternal::class_name().

◆ generate_in()

void casadi::FunctionInternal::generate_in ( const std::string &  fname,
const double **  arg 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ne

Definition at line 731 of file function_internal.cpp.

731  {
732  // Set up output stream
733  std::ofstream of;
734  Filesystem::open(of, fname);
735  normalized_setup(of);
736 
737  // Encode each input
738  for (casadi_int i=0; i<n_in_; ++i) {
739  const double* v = arg[i];
740  for (casadi_int k=0;k<nnz_in(i);++k) {
741  normalized_out(of, v ? v[k] : 0);
742  of << std::endl;
743  }
744  }
745  }
static void open(std::ofstream &, const std::string &path, std::ios_base::openmode mode=std::ios_base::out)
Definition: filesystem.cpp:115
void normalized_setup(std::istream &stream)
void normalized_out(std::ostream &stream, double val)

References casadi::FunctionInternal::n_in_, casadi::FunctionInternal::nnz_in(), casadi::normalized_out(), casadi::normalized_setup(), and casadi::Filesystem::open().

◆ generate_lifted()

void casadi::FunctionInternal::generate_lifted ( Function vdef_fcn,
Function vinit_fcn 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_l9

Reimplemented in casadi::MXFunction.

Definition at line 3301 of file function_internal.cpp.

3302  {
3303  casadi_error("'generate_lifted' only defined for 'MXFunction'");
3304  }

◆ generate_options()

Dict casadi::FunctionInternal::generate_options ( const std::string &  target) const
overridevirtualinherited

Reimplemented from casadi::ProtoFunction.

Reimplemented in casadi::SXFunction, and casadi::MXFunction.

Definition at line 382 of file function_internal.cpp.

382  {
383  Dict opts = ProtoFunction::generate_options(target);
384  opts["jac_penalty"] = jac_penalty_;
385  opts["user_data"] = user_data_;
386  opts["inputs_check"] = inputs_check_;
387  if (target!="tmp") opts["jit"] = jit_;
388  opts["jit_cleanup"] = jit_cleanup_;
389  opts["jit_serialize"] = jit_serialize_;
390  opts["compiler"] = compiler_plugin_;
391  opts["jit_options"] = jit_options_;
392  opts["jit_name"] = jit_base_name_;
393  opts["jit_temp_suffix"] = jit_temp_suffix_;
394  opts["ad_weight"] = ad_weight_;
395  opts["ad_weight_sp"] = ad_weight_sp_;
396  opts["always_inline"] = always_inline_;
397  opts["never_inline"] = never_inline_;
398  opts["max_num_dir"] = max_num_dir_;
399  if (target=="clone" || target=="tmp") {
400  opts["enable_forward"] = enable_forward_op_;
401  opts["enable_reverse"] = enable_reverse_op_;
402  opts["enable_jacobian"] = enable_jacobian_op_;
403  opts["enable_fd"] = enable_fd_op_;
404  opts["reverse_options"] = reverse_options_;
405  opts["forward_options"] = forward_options_;
406  opts["jacobian_options"] = jacobian_options_;
407  opts["der_options"] = der_options_;
408  opts["derivative_of"] = derivative_of_;
409  }
410  opts["fd_options"] = fd_options_;
411  opts["fd_method"] = fd_method_;
412  opts["print_in"] = print_in_;
413  opts["print_out"] = print_out_;
414  opts["max_io"] = max_io_;
415  opts["dump_in"] = dump_in_;
416  opts["dump_out"] = dump_out_;
417  opts["dump_dir"] = dump_dir_;
418  opts["dump_format"] = dump_format_;
419  opts["dump"] = dump_;
420  return opts;
421  }
std::string jit_serialize_
Serialize behaviour.
void * user_data_
User-set field.
bool inputs_check_
Errors are thrown if numerical values of inputs look bad.
bool jit_cleanup_
Cleanup jit source file.
Function derivative_of_
If the function is the derivative of another function.
virtual Dict generate_options(const std::string &target) const
Reconstruct options dict.

References casadi::FunctionInternal::ad_weight_, casadi::FunctionInternal::ad_weight_sp_, casadi::FunctionInternal::always_inline_, casadi::FunctionInternal::compiler_plugin_, casadi::FunctionInternal::der_options_, casadi::FunctionInternal::derivative_of_, casadi::FunctionInternal::dump_, casadi::FunctionInternal::dump_dir_, casadi::FunctionInternal::dump_format_, casadi::FunctionInternal::dump_in_, casadi::FunctionInternal::dump_out_, casadi::FunctionInternal::enable_fd_op_, casadi::FunctionInternal::enable_forward_op_, casadi::FunctionInternal::enable_jacobian_op_, casadi::FunctionInternal::enable_reverse_op_, casadi::FunctionInternal::fd_method_, casadi::FunctionInternal::fd_options_, casadi::FunctionInternal::forward_options_, casadi::ProtoFunction::generate_options(), casadi::FunctionInternal::inputs_check_, casadi::FunctionInternal::jac_penalty_, casadi::FunctionInternal::jacobian_options_, casadi::FunctionInternal::jit_, casadi::FunctionInternal::jit_base_name_, casadi::FunctionInternal::jit_cleanup_, casadi::FunctionInternal::jit_options_, casadi::FunctionInternal::jit_serialize_, casadi::FunctionInternal::jit_temp_suffix_, casadi::FunctionInternal::max_io_, casadi::FunctionInternal::max_num_dir_, casadi::FunctionInternal::never_inline_, casadi::FunctionInternal::print_in_, casadi::FunctionInternal::print_out_, casadi::FunctionInternal::reverse_options_, and casadi::FunctionInternal::user_data_.

Referenced by casadi::FunctionInternal::forward(), casadi::MXFunction::generate_options(), casadi::SXFunction::generate_options(), casadi::BlazingSplineFunction::get_jacobian(), and casadi::FunctionInternal::reverse().

◆ generate_out()

void casadi::FunctionInternal::generate_out ( const std::string &  fname,
double **  res 
) const
inherited

Definition at line 747 of file function_internal.cpp.

747  {
748  // Set up output stream
749  std::ofstream of;
750  Filesystem::open(of, fname);
751  normalized_setup(of);
752 
753  // Encode each input
754  for (casadi_int i=0; i<n_out_; ++i) {
755  const double* v = res[i];
756  for (casadi_int k=0;k<nnz_out(i);++k) {
757  normalized_out(of, v ? v[k] : std::numeric_limits<double>::quiet_NaN());
758  of << std::endl;
759  }
760  }
761  }

References casadi::FunctionInternal::n_out_, casadi::FunctionInternal::nnz_out(), casadi::normalized_out(), casadi::normalized_setup(), and casadi::Filesystem::open().

◆ get_abstol()

virtual double casadi::FunctionInternal::get_abstol ( ) const
inlinevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mp

Reimplemented in casadi::SundialsInterface, casadi::Smoothing, casadi::CentralDiff, and casadi::ForwardDiff.

Definition at line 1094 of file function_internal.hpp.

1094  {
1095  return eps;
1096  }
const double eps
Machine epsilon.
Definition: calculus.hpp:56

References casadi::eps.

Referenced by casadi::FiniteDiff::init().

◆ get_default_in()

virtual double casadi::FunctionInternal::get_default_in ( casadi_int  ind) const
inlinevirtualinherited

◆ get_diff_in()

bool casadi::Expm::get_diff_in ( casadi_int  i)
inlineoverridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_128

Reimplemented from casadi::FunctionInternal.

Definition at line 95 of file expm_impl.hpp.

95 { return i != 0 || !const_A_;}

◆ get_diff_out()

virtual bool casadi::FunctionInternal::get_diff_out ( casadi_int  i)
inlinevirtualinherited

◆ get_forward()

Function casadi::Expm::get_forward ( casadi_int  nfwd,
const std::string &  name,
const std::vector< std::string > &  inames,
const std::vector< std::string > &  onames,
const Dict opts 
) const
overridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_126

Reimplemented from casadi::FunctionInternal.

Definition at line 108 of file expm.cpp.

111  {
112  MX A = MX::sym("A", A_);
113  MX t = MX::sym("t");
114  MX Y = MX::sym("Y", A_);
115  MX Adot = MX::sym("Adot", A_);
116  MX tdot = MX::sym("tdot");
117 
118  MX Ydot = mtimes(A, Y)*tdot;
119 
120  if (!const_A_) {
121  DM N = DM::zeros(A_.size());
122 
123  MX extended = MX::blockcat({{A, Adot}, {N, A}});
124  MX R = expm(extended*t);
125 
126  Ydot += R(Slice(0, A_.size1()), Slice(A_.size1(), 2*A_.size1()));
127  }
128 
129  Function ret = Function(name, {A, t, Y, Adot, tdot}, {Ydot});
130 
131  return ret.map(name, "serial", nfwd,
132  std::vector<casadi_int>{0, 1, 2}, std::vector<casadi_int>{});
133 
134  }
Sparsity A_
Definition: expm_impl.hpp:121
static MX sym(const std::string &name, casadi_int nrow=1, casadi_int ncol=1)
Create an nrow-by-ncol symbolic primitive.
static MX blockcat(const std::vector< std::vector< MX > > &v)
Definition: mx.cpp:1197
casadi_int size1() const
Get the number of rows.
Definition: sparsity.cpp:124
std::pair< casadi_int, casadi_int > size() const
Get the shape.
Definition: sparsity.cpp:152
Matrix< double > DM
Definition: dm_fwd.hpp:33

References casadi::Expm::A_, casadi::MX::blockcat(), casadi::Expm::const_A_, casadi::FunctionInternal::Function, casadi::Function::map(), casadi::Sparsity::size(), casadi::Sparsity::size1(), casadi::GenericMatrix< MX >::sym(), casadi::Y, and casadi::GenericMatrix< MatType >::zeros().

◆ get_free()

std::vector< std::string > casadi::FunctionInternal::get_free ( ) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mc

Reimplemented in casadi::SXFunction, and casadi::MXFunction.

Definition at line 936 of file function_internal.cpp.

936  {
937  casadi_assert_dev(!has_free());
938  return std::vector<std::string>();
939  }
virtual bool has_free() const
Does the function have free variables.

References casadi::FunctionInternal::has_free().

◆ get_function() [1/2]

std::vector< std::string > casadi::FunctionInternal::get_function ( ) const
virtualinherited

Reimplemented in casadi::OracleFunction, casadi::MapSum, and casadi::Map.

Definition at line 3622 of file function_internal.cpp.

3622  {
3623  // No functions
3624  return std::vector<std::string>();
3625  }

◆ get_function() [2/2]

const Function & casadi::FunctionInternal::get_function ( const std::string &  name) const
virtualinherited

Reimplemented in casadi::OracleFunction, casadi::MapSum, and casadi::Map.

Definition at line 3627 of file function_internal.cpp.

3627  {
3628  casadi_error("'get_function' not defined for " + class_name());
3629  static Function singleton;
3630  return singleton;
3631  }

References casadi::SharedObjectInternal::class_name().

◆ get_jac_sparsity()

Sparsity casadi::Expm::get_jac_sparsity ( casadi_int  oind,
casadi_int  iind,
bool  symmetric 
) const
overridevirtualinherited

Reimplemented from casadi::FunctionInternal.

Definition at line 165 of file expm.cpp.

165  {
166  if (const_A_ && iind == 0) {
167  return Sparsity(nnz_out(oind), nnz_in(iind));
168  }
169  // Fallback to base class
170  return FunctionInternal::get_jac_sparsity(oind, iind, symmetric);
171  }
virtual Sparsity get_jac_sparsity(casadi_int oind, casadi_int iind, bool symmetric) const
Get Jacobian sparsity.

References casadi::Expm::const_A_, casadi::FunctionInternal::get_jac_sparsity(), casadi::FunctionInternal::nnz_in(), and casadi::FunctionInternal::nnz_out().

◆ get_jac_sparsity_gen()

template<bool fwd>
Sparsity casadi::FunctionInternal::get_jac_sparsity_gen ( casadi_int  oind,
casadi_int  iind 
) const
inherited

Definition at line 1132 of file function_internal.cpp.

1132  {
1133  // Number of nonzero inputs and outputs
1134  casadi_int nz_in = nnz_in(iind);
1135  casadi_int nz_out = nnz_out(oind);
1136 
1137  // Evaluation buffers
1138  std::vector<typename JacSparsityTraits<fwd>::arg_t> arg(sz_arg(), nullptr);
1139  std::vector<bvec_t*> res(sz_res(), nullptr);
1140  std::vector<casadi_int> iw(sz_iw());
1141  std::vector<bvec_t> w(sz_w(), 0);
1142 
1143  // Seeds and sensitivities
1144  std::vector<bvec_t> seed(nz_in, 0);
1145  arg[iind] = get_ptr(seed);
1146  std::vector<bvec_t> sens(nz_out, 0);
1147  res[oind] = get_ptr(sens);
1148  if (!fwd) std::swap(seed, sens);
1149 
1150  // Number of forward sweeps we must make
1151  casadi_int nsweep = seed.size() / bvec_size;
1152  if (seed.size() % bvec_size) nsweep++;
1153 
1154  // Print
1155  if (verbose_) {
1156  casadi_message(str(nsweep) + std::string(fwd ? " forward" : " reverse") + " sweeps "
1157  "needed for " + str(seed.size()) + " directions");
1158  }
1159 
1160  // Progress
1161  casadi_int progress = -10;
1162 
1163  // Temporary vectors
1164  std::vector<casadi_int> jcol, jrow;
1165 
1166  // Loop over the variables, bvec_size variables at a time
1167  for (casadi_int s=0; s<nsweep; ++s) {
1168 
1169  // Print progress
1170  if (verbose_) {
1171  casadi_int progress_new = (s*100)/nsweep;
1172  // Print when entering a new decade
1173  if (progress_new / 10 > progress / 10) {
1174  progress = progress_new;
1175  casadi_message(str(progress) + " %");
1176  }
1177  }
1178 
1179  // Nonzero offset
1180  casadi_int offset = s*bvec_size;
1181 
1182  // Number of local seed directions
1183  casadi_int ndir_local = seed.size()-offset;
1184  ndir_local = std::min(static_cast<casadi_int>(bvec_size), ndir_local);
1185 
1186  for (casadi_int i=0; i<ndir_local; ++i) {
1187  seed[offset+i] |= bvec_t(1)<<i;
1188  }
1189 
1190  // Propagate the dependencies
1191  JacSparsityTraits<fwd>::sp(this, get_ptr(arg), get_ptr(res),
1192  get_ptr(iw), get_ptr(w), memory(0));
1193 
1194  // Loop over the nonzeros of the output
1195  for (casadi_int el=0; el<sens.size(); ++el) {
1196 
1197  // Get the sparsity sensitivity
1198  bvec_t spsens = sens[el];
1199 
1200  if (!fwd) {
1201  // Clear the sensitivities for the next sweep
1202  sens[el] = 0;
1203  }
1204 
1205  // If there is a dependency in any of the directions
1206  if (spsens!=0) {
1207 
1208  // Loop over seed directions
1209  for (casadi_int i=0; i<ndir_local; ++i) {
1210 
1211  // If dependents on the variable
1212  if ((bvec_t(1) << i) & spsens) {
1213  // Add to pattern
1214  jcol.push_back(el);
1215  jrow.push_back(i+offset);
1216  }
1217  }
1218  }
1219  }
1220 
1221  // Remove the seeds
1222  for (casadi_int i=0; i<ndir_local; ++i) {
1223  seed[offset+i] = 0;
1224  }
1225  }
1226 
1227  // Construct sparsity pattern and return
1228  if (!fwd) swap(jrow, jcol);
1229  Sparsity ret = Sparsity::triplet(nz_out, nz_in, jcol, jrow);
1230  if (verbose_) {
1231  casadi_message("Formed Jacobian sparsity pattern (dimension " + str(ret.size()) + ", "
1232  + str(ret.nnz()) + " (" + str(ret.density()) + " %) nonzeros.");
1233  }
1234  return ret;
1235  }
std::vector< double > nz_in(const std::vector< DM > &arg) const
Convert from/to flat vector of input/output nonzeros.
std::vector< double > nz_out(const std::vector< DM > &res) const
Convert from/to flat vector of input/output nonzeros.
static Sparsity triplet(casadi_int nrow, casadi_int ncol, const std::vector< casadi_int > &row, const std::vector< casadi_int > &col, std::vector< casadi_int > &mapping, bool invert_mapping)
Create a sparsity pattern given the nonzeros in sparse triplet form *.
Definition: sparsity.cpp:1127
unsigned long long bvec_t
const int bvec_size

References casadi::bvec_size, casadi::Sparsity::density(), casadi::get_ptr(), casadi::ProtoFunction::memory(), casadi::Sparsity::nnz(), casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::nnz_out(), casadi::FunctionInternal::nz_in(), casadi::FunctionInternal::nz_out(), casadi::Sparsity::size(), casadi::str(), casadi::FunctionInternal::sz_arg(), casadi::FunctionInternal::sz_iw(), casadi::FunctionInternal::sz_res(), casadi::FunctionInternal::sz_w(), casadi::Sparsity::triplet(), and casadi::ProtoFunction::verbose_.

◆ get_jac_sparsity_hierarchical()

Sparsity casadi::FunctionInternal::get_jac_sparsity_hierarchical ( casadi_int  oind,
casadi_int  iind 
) const
inherited

Decide which ad_mode to take

Definition at line 1472 of file function_internal.cpp.

1472  {
1473  // Number of nonzero inputs
1474  casadi_int nz_in = nnz_in(iind);
1475 
1476  // Number of nonzero outputs
1477  casadi_int nz_out = nnz_out(oind);
1478 
1479  // Seeds and sensitivities
1480  std::vector<bvec_t> s_in(nz_in, 0);
1481  std::vector<bvec_t> s_out(nz_out, 0);
1482 
1483  // Evaluation buffers
1484  std::vector<const bvec_t*> arg_fwd(sz_arg(), nullptr);
1485  std::vector<bvec_t*> arg_adj(sz_arg(), nullptr);
1486  arg_fwd[iind] = arg_adj[iind] = get_ptr(s_in);
1487  std::vector<bvec_t*> res(sz_res(), nullptr);
1488  res[oind] = get_ptr(s_out);
1489  std::vector<casadi_int> iw(sz_iw());
1490  std::vector<bvec_t> w(sz_w());
1491 
1492  // Sparsity triplet accumulator
1493  std::vector<casadi_int> jcol, jrow;
1494 
1495  // Cols of the coarse blocks
1496  std::vector<casadi_int> coarse_col(2, 0); coarse_col[1] = nz_out;
1497  // Rows of the coarse blocks
1498  std::vector<casadi_int> coarse_row(2, 0); coarse_row[1] = nz_in;
1499 
1500  // Cols of the fine blocks
1501  std::vector<casadi_int> fine_col;
1502 
1503  // Rows of the fine blocks
1504  std::vector<casadi_int> fine_row;
1505 
1506  // In each iteration, subdivide each coarse block in this many fine blocks
1507  casadi_int subdivision = bvec_size;
1508 
1509  Sparsity r = Sparsity::dense(1, 1);
1510 
1511  // The size of a block
1512  casadi_int granularity_row = nz_in;
1513  casadi_int granularity_col = nz_out;
1514 
1515  bool use_fwd = true;
1516 
1517  casadi_int nsweeps = 0;
1518 
1519  bool hasrun = false;
1520 
1521  // Get weighting factor
1522  double sp_w = sp_weight();
1523 
1524  // Lookup table for bvec_t
1525  std::vector<bvec_t> bvec_lookup;
1526  bvec_lookup.reserve(bvec_size);
1527  for (casadi_int i=0;i<bvec_size;++i) {
1528  bvec_lookup.push_back(bvec_t(1) << i);
1529  }
1530 
1531  while (!hasrun || coarse_col.size()!=nz_out+1 || coarse_row.size()!=nz_in+1) {
1532  if (verbose_) {
1533  casadi_message("Block size: " + str(granularity_col) + " x " + str(granularity_row));
1534  }
1535 
1536  // Clear the sparsity triplet acccumulator
1537  jcol.clear();
1538  jrow.clear();
1539 
1540  // Clear the fine block structure
1541  fine_row.clear();
1542  fine_col.clear();
1543 
1544  // r transpose will be needed in the algorithm
1545  Sparsity rT = r.T();
1546 
1549  // Forward mode
1550  Sparsity D1 = rT.uni_coloring(r);
1551  // Adjoint mode
1552  Sparsity D2 = r.uni_coloring(rT);
1553  if (verbose_) {
1554  casadi_message("Coloring on " + str(r.dim()) + " (fwd seeps: " + str(D1.size2()) +
1555  " , adj sweeps: " + str(D2.size1()) + ")");
1556  }
1557 
1558  // Use whatever required less colors if we tried both (with preference to forward mode)
1559  double fwd_cost = static_cast<double>(use_fwd ? granularity_row : granularity_col) *
1560  sp_w*static_cast<double>(D1.size2());
1561  double adj_cost = static_cast<double>(use_fwd ? granularity_col : granularity_row) *
1562  (1-sp_w)*static_cast<double>(D2.size2());
1563  use_fwd = fwd_cost <= adj_cost;
1564  if (verbose_) {
1565  casadi_message(std::string(use_fwd ? "Forward" : "Reverse") + " mode chosen "
1566  "(fwd cost: " + str(fwd_cost) + ", adj cost: " + str(adj_cost) + ")");
1567  }
1568 
1569  // Get seeds and sensitivities
1570  bvec_t* seed_v = use_fwd ? get_ptr(s_in) : get_ptr(s_out);
1571  bvec_t* sens_v = use_fwd ? get_ptr(s_out) : get_ptr(s_in);
1572 
1573  // The number of zeros in the seed and sensitivity directions
1574  casadi_int nz_seed = use_fwd ? nz_in : nz_out;
1575  casadi_int nz_sens = use_fwd ? nz_out : nz_in;
1576 
1577  // Clear the seeds
1578  for (casadi_int i=0; i<nz_seed; ++i) seed_v[i]=0;
1579 
1580  // Choose the active jacobian coloring scheme
1581  Sparsity D = use_fwd ? D1 : D2;
1582 
1583  // Adjoint mode amounts to swapping
1584  if (!use_fwd) {
1585  std::swap(coarse_col, coarse_row);
1586  std::swap(granularity_col, granularity_row);
1587  std::swap(r, rT);
1588  }
1589 
1590  // Subdivide the coarse block cols
1591  for (casadi_int k=0;k<coarse_col.size()-1;++k) {
1592  casadi_int diff = coarse_col[k+1]-coarse_col[k];
1593  casadi_int new_diff = diff/subdivision;
1594  if (diff%subdivision>0) new_diff++;
1595  std::vector<casadi_int> temp = range(coarse_col[k], coarse_col[k+1], new_diff);
1596  fine_col.insert(fine_col.end(), temp.begin(), temp.end());
1597  }
1598  // Subdivide the coarse block rows
1599  for (casadi_int k=0;k<coarse_row.size()-1;++k) {
1600  casadi_int diff = coarse_row[k+1]-coarse_row[k];
1601  casadi_int new_diff = diff/subdivision;
1602  if (diff%subdivision>0) new_diff++;
1603  std::vector<casadi_int> temp = range(coarse_row[k], coarse_row[k+1], new_diff);
1604  fine_row.insert(fine_row.end(), temp.begin(), temp.end());
1605  }
1606  if (fine_row.back()!=coarse_row.back()) fine_row.push_back(coarse_row.back());
1607  if (fine_col.back()!=coarse_col.back()) fine_col.push_back(coarse_col.back());
1608 
1609  granularity_col = fine_col[1] - fine_col[0];
1610  granularity_row = fine_row[1] - fine_row[0];
1611 
1612  // The index into the bvec bit vector
1613  casadi_int bvec_i = 0;
1614 
1615  // Create lookup tables for the fine blocks
1616  std::vector<casadi_int> fine_col_lookup = lookupvector(fine_col, nz_sens+1);
1617  std::vector<casadi_int> fine_row_lookup = lookupvector(fine_row, nz_seed+1);
1618 
1619  // Triplet data used as a lookup table
1620  std::vector<casadi_int> lookup_col;
1621  std::vector<casadi_int> lookup_row;
1622  std::vector<casadi_int> lookup_value;
1623 
1624 
1625  // The maximum number of fine blocks contained in one coarse block
1626  casadi_int n_fine_blocks_max = 0;
1627  for (casadi_int i=0;i<coarse_row.size()-1;++i) {
1628  casadi_int del = fine_row_lookup[coarse_row[i+1]]-fine_row_lookup[coarse_row[i]];
1629  n_fine_blocks_max = std::max(n_fine_blocks_max, del);
1630  }
1631 
1632  // Loop over all coarse seed directions from the coloring
1633  for (casadi_int csd=0; csd<D.size2(); ++csd) {
1634 
1635  casadi_int fci_offset = 0;
1636  casadi_int fci_cap = bvec_size-bvec_i;
1637 
1638  // Flag to indicate if all fine blocks have been handled
1639  bool f_finished = false;
1640 
1641  // Loop while not finished
1642  while (!f_finished) {
1643 
1644  // Loop over all coarse rows that are found in the coloring for this coarse seed direction
1645  for (casadi_int k=D.colind(csd); k<D.colind(csd+1); ++k) {
1646  casadi_int cci = D.row(k);
1647 
1648  // The first and last rows of the fine block
1649  casadi_int fci_start = fine_row_lookup[coarse_row[cci]];
1650  casadi_int fci_end = fine_row_lookup[coarse_row[cci+1]];
1651 
1652  // Local counter that modifies index into bvec
1653  casadi_int bvec_i_mod = 0;
1654 
1655  casadi_int value = -bvec_i + fci_offset + fci_start;
1656 
1657  // Loop over the rows of the fine block
1658  for (casadi_int fci = fci_offset; fci < std::min(fci_end-fci_start, fci_cap); ++fci) {
1659 
1660  // Loop over the coarse block cols that appear in the coloring
1661  // for the current coarse seed direction
1662  for (casadi_int cri=rT.colind(cci);cri<rT.colind(cci+1);++cri) {
1663  lookup_col.push_back(rT.row(cri));
1664  lookup_row.push_back(bvec_i+bvec_i_mod);
1665  lookup_value.push_back(value);
1666  }
1667 
1668  // Toggle on seeds
1669  bvec_toggle(seed_v, fine_row[fci+fci_start], fine_row[fci+fci_start+1],
1670  bvec_i+bvec_i_mod);
1671  bvec_i_mod++;
1672  }
1673  }
1674 
1675  // Bump bvec_i for next major coarse direction
1676  bvec_i+= std::min(n_fine_blocks_max, fci_cap);
1677 
1678  // Check if bvec buffer is full
1679  if (bvec_i==bvec_size || csd==D.size2()-1) {
1680  // Calculate sparsity for bvec_size directions at once
1681 
1682  // Statistics
1683  nsweeps+=1;
1684 
1685  // Construct lookup table
1686  IM lookup = IM::triplet(lookup_row, lookup_col, lookup_value, bvec_size,
1687  coarse_col.size());
1688 
1689  // Propagate the dependencies
1690  if (use_fwd) {
1691  JacSparsityTraits<true>::sp(this, get_ptr(arg_fwd), get_ptr(res),
1692  get_ptr(iw), get_ptr(w), memory(0));
1693  } else {
1694  std::fill(w.begin(), w.end(), 0);
1695  JacSparsityTraits<false>::sp(this, get_ptr(arg_adj), get_ptr(res),
1696  get_ptr(iw), get_ptr(w), memory(0));
1697  }
1698 
1699  // Temporary bit work vector
1700  bvec_t spsens;
1701 
1702  // Loop over the cols of coarse blocks
1703  for (casadi_int cri=0;cri<coarse_col.size()-1;++cri) {
1704 
1705  // Loop over the cols of fine blocks within the current coarse block
1706  for (casadi_int fri=fine_col_lookup[coarse_col[cri]];
1707  fri<fine_col_lookup[coarse_col[cri+1]];++fri) {
1708  // Lump individual sensitivities together into fine block
1709  bvec_or(sens_v, spsens, fine_col[fri], fine_col[fri+1]);
1710 
1711  // Next iteration if no sparsity
1712  if (!spsens) continue;
1713 
1714  // Loop over all bvec_bits
1715  for (casadi_int bvec_i=0;bvec_i<bvec_size;++bvec_i) {
1716  if (spsens & bvec_lookup[bvec_i]) {
1717  // if dependency is found, add it to the new sparsity pattern
1718  casadi_int ind = lookup.sparsity().get_nz(bvec_i, cri);
1719  if (ind==-1) continue;
1720  jrow.push_back(bvec_i+lookup->at(ind));
1721  jcol.push_back(fri);
1722  }
1723  }
1724  }
1725  }
1726 
1727  // Clear the forward seeds/adjoint sensitivities, ready for next bvec sweep
1728  std::fill(s_in.begin(), s_in.end(), 0);
1729 
1730  // Clear the adjoint seeds/forward sensitivities, ready for next bvec sweep
1731  std::fill(s_out.begin(), s_out.end(), 0);
1732 
1733  // Clean lookup table
1734  lookup_col.clear();
1735  lookup_row.clear();
1736  lookup_value.clear();
1737  }
1738 
1739  if (n_fine_blocks_max>fci_cap) {
1740  fci_offset += std::min(n_fine_blocks_max, fci_cap);
1741  bvec_i = 0;
1742  fci_cap = bvec_size;
1743  } else {
1744  f_finished = true;
1745  }
1746 
1747  }
1748 
1749  }
1750 
1751  // Swap results if adjoint mode was used
1752  if (use_fwd) {
1753  // Construct fine sparsity pattern
1754  r = Sparsity::triplet(fine_row.size()-1, fine_col.size()-1, jrow, jcol);
1755  coarse_col = fine_col;
1756  coarse_row = fine_row;
1757  } else {
1758  // Construct fine sparsity pattern
1759  r = Sparsity::triplet(fine_col.size()-1, fine_row.size()-1, jcol, jrow);
1760  coarse_col = fine_row;
1761  coarse_row = fine_col;
1762  }
1763  hasrun = true;
1764  }
1765  if (verbose_) {
1766  casadi_message("Number of sweeps: " + str(nsweeps));
1767  casadi_message("Formed Jacobian sparsity pattern (dimension " + str(r.size()) + ", " +
1768  str(r.nnz()) + " (" + str(r.density()) + " %) nonzeros.");
1769  }
1770 
1771  return r.T();
1772  }
virtual double sp_weight() const
Weighting factor for chosing forward/reverse mode,.
static Matrix< casadi_int > triplet(const std::vector< casadi_int > &row, const std::vector< casadi_int > &col, const Matrix< casadi_int > &d)
Construct a sparse matrix from triplet form.
static Sparsity dense(casadi_int nrow, casadi_int ncol=1)
Create a dense rectangular sparsity pattern *.
Definition: sparsity.cpp:1012
std::vector< casadi_int > range(casadi_int start, casadi_int stop, casadi_int step, casadi_int len)
Range function.
std::vector< casadi_int > lookupvector(const std::vector< casadi_int > &v, casadi_int size)
Returns a vector for quickly looking up entries of supplied list.
Matrix< casadi_int > IM
Definition: im_fwd.hpp:31
std::vector< T > diff(const std::vector< T > &values)
diff
bvec_t bvec_or(const bvec_t *arg, casadi_int n)
Bit-wise or operation on bvec_t array.
void bvec_toggle(bvec_t *s, casadi_int begin, casadi_int end, casadi_int j)

References casadi::bvec_or(), casadi::bvec_size, casadi::bvec_toggle(), casadi::Sparsity::colind(), casadi::D, casadi::Sparsity::dense(), casadi::Sparsity::density(), casadi::diff(), casadi::Sparsity::dim(), casadi::Sparsity::get_nz(), casadi::get_ptr(), casadi::lookupvector(), casadi::ProtoFunction::memory(), casadi::Sparsity::nnz(), casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::nnz_out(), casadi::FunctionInternal::nz_in(), casadi::FunctionInternal::nz_out(), casadi::range(), casadi::Sparsity::row(), casadi::Sparsity::size(), casadi::Sparsity::size1(), casadi::Sparsity::size2(), casadi::FunctionInternal::sp_weight(), casadi::Matrix< Scalar >::sparsity(), casadi::str(), casadi::FunctionInternal::sz_arg(), casadi::FunctionInternal::sz_iw(), casadi::FunctionInternal::sz_res(), casadi::FunctionInternal::sz_w(), casadi::Sparsity::T(), casadi::Sparsity::triplet(), casadi::Matrix< casadi_int >::triplet(), casadi::Sparsity::uni_coloring(), and casadi::ProtoFunction::verbose_.

Referenced by casadi::FunctionInternal::get_jac_sparsity().

◆ get_jac_sparsity_hierarchical_symm()

Sparsity casadi::FunctionInternal::get_jac_sparsity_hierarchical_symm ( casadi_int  oind,
casadi_int  iind 
) const
inherited

A flavor of get_jac_sparsity_gen that does hierarchical block structure recognition for symmetric Jacobians

Definition at line 1237 of file function_internal.cpp.

1238  {
1239  casadi_assert_dev(has_spfwd());
1240 
1241  // Number of nonzero inputs
1242  casadi_int nz = nnz_in(iind);
1243  casadi_assert_dev(nz==nnz_out(oind));
1244 
1245  // Evaluation buffers
1246  std::vector<const bvec_t*> arg(sz_arg(), nullptr);
1247  std::vector<bvec_t*> res(sz_res(), nullptr);
1248  std::vector<casadi_int> iw(sz_iw());
1249  std::vector<bvec_t> w(sz_w());
1250 
1251  // Seeds
1252  std::vector<bvec_t> seed(nz, 0);
1253  arg[iind] = get_ptr(seed);
1254 
1255  // Sensitivities
1256  std::vector<bvec_t> sens(nz, 0);
1257  res[oind] = get_ptr(sens);
1258 
1259  // Sparsity triplet accumulator
1260  std::vector<casadi_int> jcol, jrow;
1261 
1262  // Cols/rows of the coarse blocks
1263  std::vector<casadi_int> coarse(2, 0); coarse[1] = nz;
1264 
1265  // Cols/rows of the fine blocks
1266  std::vector<casadi_int> fine;
1267 
1268  // In each iteration, subdivide each coarse block in this many fine blocks
1269  casadi_int subdivision = bvec_size;
1270 
1271  Sparsity r = Sparsity::dense(1, 1);
1272 
1273  // The size of a block
1274  casadi_int granularity = nz;
1275 
1276  casadi_int nsweeps = 0;
1277 
1278  bool hasrun = false;
1279 
1280  while (!hasrun || coarse.size()!=nz+1) {
1281  if (verbose_) casadi_message("Block size: " + str(granularity));
1282 
1283  // Clear the sparsity triplet acccumulator
1284  jcol.clear();
1285  jrow.clear();
1286 
1287  // Clear the fine block structure
1288  fine.clear();
1289 
1290  Sparsity D = r.star_coloring();
1291 
1292  if (verbose_) {
1293  casadi_message("Star coloring on " + str(r.dim()) + ": "
1294  + str(D.size2()) + " <-> " + str(D.size1()));
1295  }
1296 
1297  // Clear the seeds
1298  std::fill(seed.begin(), seed.end(), 0);
1299 
1300  // Subdivide the coarse block
1301  for (casadi_int k=0; k<coarse.size()-1; ++k) {
1302  casadi_int diff = coarse[k+1]-coarse[k];
1303  casadi_int new_diff = diff/subdivision;
1304  if (diff%subdivision>0) new_diff++;
1305  std::vector<casadi_int> temp = range(coarse[k], coarse[k+1], new_diff);
1306  fine.insert(fine.end(), temp.begin(), temp.end());
1307  }
1308  if (fine.back()!=coarse.back()) fine.push_back(coarse.back());
1309 
1310  granularity = fine[1] - fine[0];
1311 
1312  // The index into the bvec bit vector
1313  casadi_int bvec_i = 0;
1314 
1315  // Create lookup tables for the fine blocks
1316  std::vector<casadi_int> fine_lookup = lookupvector(fine, nz+1);
1317 
1318  // Triplet data used as a lookup table
1319  std::vector<casadi_int> lookup_col;
1320  std::vector<casadi_int> lookup_row;
1321  std::vector<casadi_int> lookup_value;
1322 
1323  // The maximum number of fine blocks contained in one coarse block
1324  casadi_int n_fine_blocks_max = 0;
1325  for (casadi_int i=0;i<coarse.size()-1;++i) {
1326  casadi_int del = fine_lookup[coarse[i+1]]-fine_lookup[coarse[i]];
1327  n_fine_blocks_max = std::max(n_fine_blocks_max, del);
1328  }
1329 
1330  // Loop over all coarse seed directions from the coloring
1331  for (casadi_int csd=0; csd<D.size2(); ++csd) {
1332 
1333 
1334  casadi_int fci_offset = 0;
1335  casadi_int fci_cap = bvec_size-bvec_i;
1336 
1337  // Flag to indicate if all fine blocks have been handled
1338  bool f_finished = false;
1339 
1340  // Loop while not finished
1341  while (!f_finished) {
1342 
1343  // Loop over all coarse rows that are found in the coloring for this coarse seed direction
1344  for (casadi_int k=D.colind(csd); k<D.colind(csd+1); ++k) {
1345  casadi_int cci = D.row(k);
1346 
1347  // The first and last rows of the fine block
1348  casadi_int fci_start = fine_lookup[coarse[cci]];
1349  casadi_int fci_end = fine_lookup[coarse[cci+1]];
1350 
1351  // Local counter that modifies index into bvec
1352  casadi_int bvec_i_mod = 0;
1353 
1354  casadi_int value = -bvec_i + fci_offset + fci_start;
1355 
1356  //casadi_assert_dev(value>=0);
1357 
1358  // Loop over the rows of the fine block
1359  for (casadi_int fci = fci_offset; fci<std::min(fci_end-fci_start, fci_cap); ++fci) {
1360 
1361  // Loop over the coarse block cols that appear in the
1362  // coloring for the current coarse seed direction
1363  for (casadi_int cri=r.colind(cci);cri<r.colind(cci+1);++cri) {
1364  lookup_col.push_back(r.row(cri));
1365  lookup_row.push_back(bvec_i+bvec_i_mod);
1366  lookup_value.push_back(value);
1367  }
1368 
1369  // Toggle on seeds
1370  bvec_toggle(get_ptr(seed), fine[fci+fci_start], fine[fci+fci_start+1],
1371  bvec_i+bvec_i_mod);
1372  bvec_i_mod++;
1373  }
1374  }
1375 
1376  // Bump bvec_i for next major coarse direction
1377  bvec_i += std::min(n_fine_blocks_max, fci_cap);
1378 
1379  // Check if bvec buffer is full
1380  if (bvec_i==bvec_size || csd==D.size2()-1) {
1381  // Calculate sparsity for bvec_size directions at once
1382 
1383  // Statistics
1384  nsweeps+=1;
1385 
1386  // Construct lookup table
1387  IM lookup = IM::triplet(lookup_row, lookup_col, lookup_value,
1388  bvec_size, coarse.size());
1389 
1390  std::reverse(lookup_col.begin(), lookup_col.end());
1391  std::reverse(lookup_row.begin(), lookup_row.end());
1392  std::reverse(lookup_value.begin(), lookup_value.end());
1393  IM duplicates =
1394  IM::triplet(lookup_row, lookup_col, lookup_value, bvec_size, coarse.size())
1395  - lookup;
1396  duplicates = sparsify(duplicates);
1397  lookup(duplicates.sparsity()) = -bvec_size;
1398 
1399  // Propagate the dependencies
1400  JacSparsityTraits<true>::sp(this, get_ptr(arg), get_ptr(res),
1401  get_ptr(iw), get_ptr(w), nullptr);
1402 
1403  // Temporary bit work vector
1404  bvec_t spsens;
1405 
1406  // Loop over the cols of coarse blocks
1407  for (casadi_int cri=0; cri<coarse.size()-1; ++cri) {
1408 
1409  // Loop over the cols of fine blocks within the current coarse block
1410  for (casadi_int fri=fine_lookup[coarse[cri]];fri<fine_lookup[coarse[cri+1]];++fri) {
1411  // Lump individual sensitivities together into fine block
1412  bvec_or(get_ptr(sens), spsens, fine[fri], fine[fri+1]);
1413 
1414  // Loop over all bvec_bits
1415  for (casadi_int bvec_i=0;bvec_i<bvec_size;++bvec_i) {
1416  if (spsens & (bvec_t(1) << bvec_i)) {
1417  // if dependency is found, add it to the new sparsity pattern
1418  casadi_int ind = lookup.sparsity().get_nz(bvec_i, cri);
1419  if (ind==-1) continue;
1420  casadi_int lk = lookup->at(ind);
1421  if (lk>-bvec_size) {
1422  jrow.push_back(bvec_i+lk);
1423  jcol.push_back(fri);
1424  jrow.push_back(fri);
1425  jcol.push_back(bvec_i+lk);
1426  }
1427  }
1428  }
1429  }
1430  }
1431 
1432  // Clear the forward seeds/adjoint sensitivities, ready for next bvec sweep
1433  std::fill(seed.begin(), seed.end(), 0);
1434 
1435  // Clean lookup table
1436  lookup_col.clear();
1437  lookup_row.clear();
1438  lookup_value.clear();
1439  }
1440 
1441  if (n_fine_blocks_max>fci_cap) {
1442  fci_offset += std::min(n_fine_blocks_max, fci_cap);
1443  bvec_i = 0;
1444  fci_cap = bvec_size;
1445  } else {
1446  f_finished = true;
1447  }
1448  }
1449  }
1450 
1451  // Construct fine sparsity pattern
1452  r = Sparsity::triplet(fine.size()-1, fine.size()-1, jrow, jcol);
1453 
1454  // There may be false positives here that are not present
1455  // in the reverse mode that precedes it.
1456  // This can lead to an assymetrical result
1457  // cf. #1522
1458  r=r*r.T();
1459 
1460  coarse = fine;
1461  hasrun = true;
1462  }
1463  if (verbose_) {
1464  casadi_message("Number of sweeps: " + str(nsweeps));
1465  casadi_message("Formed Jacobian sparsity pattern (dimension " + str(r.size()) +
1466  ", " + str(r.nnz()) + " (" + str(r.density()) + " %) nonzeros.");
1467  }
1468 
1469  return r.T();
1470  }
virtual bool has_spfwd() const
Is the class able to propagate seeds through the algorithm?

References casadi::bvec_or(), casadi::bvec_size, casadi::bvec_toggle(), casadi::Sparsity::colind(), casadi::D, casadi::Sparsity::dense(), casadi::Sparsity::density(), casadi::diff(), casadi::Sparsity::dim(), casadi::Sparsity::get_nz(), casadi::get_ptr(), casadi::FunctionInternal::has_spfwd(), casadi::lookupvector(), casadi::Sparsity::nnz(), casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::nnz_out(), casadi::range(), casadi::Sparsity::row(), casadi::Sparsity::size(), casadi::Matrix< Scalar >::sparsity(), casadi::Sparsity::star_coloring(), casadi::str(), casadi::FunctionInternal::sz_arg(), casadi::FunctionInternal::sz_iw(), casadi::FunctionInternal::sz_res(), casadi::FunctionInternal::sz_w(), casadi::Sparsity::T(), casadi::Sparsity::triplet(), casadi::Matrix< casadi_int >::triplet(), and casadi::ProtoFunction::verbose_.

Referenced by casadi::FunctionInternal::get_jac_sparsity().

◆ get_jacobian()

Function casadi::FunctionInternal::get_jacobian ( const std::string &  name,
const std::vector< std::string > &  inames,
const std::vector< std::string > &  onames,
const Dict opts 
) const
virtualinherited

◆ get_max_in()

virtual double casadi::FunctionInternal::get_max_in ( casadi_int  ind) const
inlinevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mm

Definition at line 1065 of file function_internal.hpp.

1065  {
1066  return inf;
1067  }
const double inf
infinity
Definition: calculus.hpp:50

References casadi::inf.

◆ get_min_in()

virtual double casadi::FunctionInternal::get_min_in ( casadi_int  ind) const
inlinevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mn

Definition at line 1072 of file function_internal.hpp.

1072  {
1073  return -inf;
1074  }

References casadi::inf.

◆ get_n_in()

size_t casadi::Expm::get_n_in ( )
inlineoverridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_123

Reimplemented from casadi::FunctionInternal.

Definition at line 47 of file expm_impl.hpp.

47 { return 2;}

◆ get_n_out()

size_t casadi::Expm::get_n_out ( )
inlineoverridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_123

Reimplemented from casadi::FunctionInternal.

Definition at line 48 of file expm_impl.hpp.

48 { return 1;}

◆ get_name_in()

std::string casadi::FunctionInternal::get_name_in ( casadi_int  i)
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mk

Reimplemented in casadi::Rootfinder, casadi::Nlpsol, casadi::MapSum, casadi::Map, casadi::Interpolant, casadi::Integrator, casadi::FiniteDiff, casadi::External, casadi::Dple, casadi::Conic, casadi::CallbackInternal, and casadi::BlazingSplineFunction.

Definition at line 649 of file function_internal.cpp.

649  {
650  if (!derivative_of_.is_null()) {
651  std::string n = derivative_of_.name();
652  if (name_ == "jac_" + n || name_ == "adj1_" + n) {
653  if (i < derivative_of_.n_in()) {
654  // Same as nondifferentiated function
655  return derivative_of_.name_in(i);
656  } else if (i < derivative_of_.n_in() + derivative_of_.n_out()) {
657  // Nondifferentiated output
658  return "out_" + derivative_of_.name_out(i - derivative_of_.n_in());
659  } else {
660  // Adjoint seed
661  return "adj_" + derivative_of_.name_out(i - derivative_of_.n_in()
662  - derivative_of_.n_out());
663  }
664  }
665  }
666  // Default name
667  return "i" + str(i);
668  }
const std::vector< std::string > & name_in() const
Get input scheme.
Definition: function.cpp:961
const std::string & name() const
Name of the function.
Definition: function.cpp:1307
casadi_int n_out() const
Get the number of function outputs.
Definition: function.cpp:823
casadi_int n_in() const
Get the number of function inputs.
Definition: function.cpp:819
const std::vector< std::string > & name_out() const
Get output scheme.
Definition: function.cpp:965

References casadi::FunctionInternal::derivative_of_, casadi::GenericShared< Shared, Internal >::is_null(), casadi::Function::n_in(), casadi::Function::n_out(), casadi::Function::name(), casadi::ProtoFunction::name_, casadi::Function::name_in(), casadi::Function::name_out(), and casadi::str().

Referenced by casadi::External::get_name_in(), and casadi::FunctionInternal::init().

◆ get_name_out()

std::string casadi::FunctionInternal::get_name_out ( casadi_int  i)
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mk

Reimplemented in casadi::Rootfinder, casadi::Nlpsol, casadi::MapSum, casadi::Map, casadi::Interpolant, casadi::Integrator, casadi::FiniteDiff, casadi::External, casadi::Dple, casadi::Conic, casadi::CallbackInternal, and casadi::BlazingSplineFunction.

Definition at line 670 of file function_internal.cpp.

670  {
671  if (!derivative_of_.is_null()) {
672  std::string n = derivative_of_.name();
673  if (name_ == "jac_" + n) {
674  // Jacobian block
675  casadi_int oind = i / derivative_of_.n_in(), iind = i % derivative_of_.n_in();
676  return "jac_" + derivative_of_.name_out(oind) + "_" + derivative_of_.name_in(iind);
677  } else if (name_ == "adj1_" + n) {
678  // Adjoint sensitivity
679  return "adj_" + derivative_of_.name_in(i);
680  }
681  }
682  // Default name
683  return "o" + str(i);
684  }

References casadi::FunctionInternal::derivative_of_, casadi::GenericShared< Shared, Internal >::is_null(), casadi::Function::n_in(), casadi::Function::name(), casadi::ProtoFunction::name_, casadi::Function::name_in(), casadi::Function::name_out(), and casadi::str().

Referenced by casadi::External::get_name_out(), and casadi::FunctionInternal::init().

◆ get_nominal_in()

virtual std::vector<double> casadi::FunctionInternal::get_nominal_in ( casadi_int  ind) const
inlinevirtualinherited

Reimplemented in casadi::FmuFunction.

Definition at line 1076 of file function_internal.hpp.

1076  {
1077  return std::vector<double>(nnz_in(ind), 1.);
1078  }

Referenced by casadi::FmuFunction::get_nominal_in().

◆ get_nominal_out()

virtual std::vector<double> casadi::FunctionInternal::get_nominal_out ( casadi_int  ind) const
inlinevirtualinherited

Reimplemented in casadi::FmuFunction.

Definition at line 1080 of file function_internal.hpp.

1080  {
1081  return std::vector<double>(nnz_out(ind), 1.);
1082  }

Referenced by casadi::FmuFunction::get_nominal_out().

◆ get_options()

const Options& casadi::Expm::get_options ( ) const
inlineoverridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_125

Reimplemented from casadi::ProtoFunction.

Definition at line 64 of file expm_impl.hpp.

64 { return options_;}
static const Options options_
Options.
Definition: expm_impl.hpp:63

◆ get_partition()

void casadi::FunctionInternal::get_partition ( casadi_int  iind,
casadi_int  oind,
Sparsity D1,
Sparsity D2,
bool  compact,
bool  symmetric,
bool  allow_forward,
bool  allow_reverse 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_md

Definition at line 1927 of file function_internal.cpp.

1929  {
1930  if (verbose_) casadi_message(name_ + "::get_partition");
1931  casadi_assert(allow_forward || allow_reverse, "Inconsistent options");
1932 
1933  // Sparsity pattern with transpose
1934  Sparsity &AT = jac_sparsity(oind, iind, compact, symmetric);
1935  Sparsity A = symmetric ? AT : AT.T();
1936 
1937  // Get seed matrices by graph coloring
1938  if (symmetric) {
1939  casadi_assert_dev(enable_forward_ || enable_fd_);
1940  casadi_assert_dev(allow_forward);
1941 
1942  // Star coloring if symmetric
1943  if (verbose_) casadi_message("FunctionInternal::getPartition star_coloring");
1944  D1 = A.star_coloring();
1945  if (verbose_) {
1946  casadi_message("Star coloring completed: " + str(D1.size2())
1947  + " directional derivatives needed ("
1948  + str(A.size1()) + " without coloring).");
1949  }
1950 
1951  } else {
1952  casadi_assert_dev(enable_forward_ || enable_fd_ || enable_reverse_);
1953  // Get weighting factor
1954  double w = ad_weight();
1955 
1956  // Which AD mode?
1957  if (w==1) allow_forward = false;
1958  if (w==0) allow_reverse = false;
1959  casadi_assert(allow_forward || allow_reverse, "Conflicting ad weights");
1960 
1961  // Best coloring encountered so far (relatively tight upper bound)
1962  double best_coloring = std::numeric_limits<double>::infinity();
1963 
1964  // Test forward mode first?
1965  bool test_fwd_first = allow_forward && w*static_cast<double>(A.size1()) <=
1966  (1-w)*static_cast<double>(A.size2());
1967  casadi_int mode_fwd = test_fwd_first ? 0 : 1;
1968 
1969  // Test both coloring modes
1970  for (casadi_int mode=0; mode<2; ++mode) {
1971  // Is this the forward mode?
1972  bool fwd = mode==mode_fwd;
1973 
1974  // Skip?
1975  if (!allow_forward && fwd) continue;
1976  if (!allow_reverse && !fwd) continue;
1977 
1978  // Perform the coloring
1979  if (fwd) {
1980  if (verbose_) casadi_message("Unidirectional coloring (forward mode)");
1981  bool d = best_coloring>=w*static_cast<double>(A.size1());
1982  casadi_int max_colorings_to_test =
1983  d ? A.size1() : static_cast<casadi_int>(floor(best_coloring/w));
1984  D1 = AT.uni_coloring(A, max_colorings_to_test);
1985  if (D1.is_null()) {
1986  if (verbose_) {
1987  casadi_message("Forward mode coloring interrupted (more than "
1988  + str(max_colorings_to_test) + " needed).");
1989  }
1990  } else {
1991  if (verbose_) {
1992  casadi_message("Forward mode coloring completed: "
1993  + str(D1.size2()) + " directional derivatives needed ("
1994  + str(A.size1()) + " without coloring).");
1995  }
1996  D2 = Sparsity();
1997  best_coloring = w*static_cast<double>(D1.size2());
1998  }
1999  } else {
2000  if (verbose_) casadi_message("Unidirectional coloring (adjoint mode)");
2001  bool d = best_coloring>=(1-w)*static_cast<double>(A.size2());
2002  casadi_int max_colorings_to_test =
2003  d ? A.size2() : static_cast<casadi_int>(floor(best_coloring/(1-w)));
2004 
2005  D2 = A.uni_coloring(AT, max_colorings_to_test);
2006  if (D2.is_null()) {
2007  if (verbose_) {
2008  casadi_message("Adjoint mode coloring interrupted (more than "
2009  + str(max_colorings_to_test) + " needed).");
2010  }
2011  } else {
2012  if (verbose_) {
2013  casadi_message("Adjoint mode coloring completed: "
2014  + str(D2.size2()) + " directional derivatives needed ("
2015  + str(A.size2()) + " without coloring).");
2016  }
2017  D1 = Sparsity();
2018  best_coloring = (1-w)*static_cast<double>(D2.size2());
2019  }
2020  }
2021  }
2022 
2023  }
2024  }
Sparsity & jac_sparsity(casadi_int oind, casadi_int iind, bool compact, bool symmetric) const
Get Jacobian sparsity.

References casadi::FunctionInternal::ad_weight(), casadi::FunctionInternal::enable_fd_, casadi::FunctionInternal::enable_forward_, casadi::FunctionInternal::enable_reverse_, casadi::GenericShared< Shared, Internal >::is_null(), casadi::FunctionInternal::jac_sparsity(), casadi::ProtoFunction::name_, casadi::Sparsity::size1(), casadi::Sparsity::size2(), casadi::Sparsity::star_coloring(), casadi::str(), casadi::Sparsity::T(), casadi::Sparsity::uni_coloring(), and casadi::ProtoFunction::verbose_.

◆ get_reltol()

virtual double casadi::FunctionInternal::get_reltol ( ) const
inlinevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mo

Reimplemented in casadi::SundialsInterface.

Definition at line 1087 of file function_internal.hpp.

1087  {
1088  return eps;
1089  }

References casadi::eps.

Referenced by casadi::FiniteDiff::init().

◆ get_reverse()

Function casadi::Expm::get_reverse ( casadi_int  nadj,
const std::string &  name,
const std::vector< std::string > &  inames,
const std::vector< std::string > &  onames,
const Dict opts 
) const
overridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_127

Reimplemented from casadi::FunctionInternal.

Definition at line 136 of file expm.cpp.

139  {
140  MX A = MX::sym("A", A_);
141  MX t = MX::sym("t");
142  MX Y = MX::sym("Y", A_);
143  MX Ybar = MX::sym("Ybar", A_);
144 
145  MX tbar = sum2(sum1(Ybar*mtimes(A, Y)));
146  MX Abar;
147  if (const_A_) {
148  Abar = MX(Sparsity(A_.size()));
149  } else {
150  DM N = DM::zeros(A_.size());
151 
152  MX At = A.T();
153  MX extended = MX::blockcat({{At, Ybar}, {N, At}});
154  MX R = expm(extended*t);
155 
156  Abar = R(Slice(0, A_.size1()), // NOLINT(cppcoreguidelines-slicing)
157  Slice(A_.size1(), 2*A_.size1()));
158  }
159  Function ret = Function(name, {A, t, Y, Ybar}, {Abar, tbar});
160 
161  return ret.map(name, "serial", nadj,
162  std::vector<casadi_int>{0, 1, 2}, std::vector<casadi_int>{});
163  }

References casadi::Expm::A_, casadi::MX::blockcat(), casadi::Expm::const_A_, casadi::FunctionInternal::Function, casadi::Function::map(), casadi::Sparsity::size(), casadi::Sparsity::size1(), casadi::GenericMatrix< MX >::sym(), casadi::MX::T(), casadi::Y, and casadi::GenericMatrix< MatType >::zeros().

◆ get_sparsity_in()

Sparsity casadi::Expm::get_sparsity_in ( casadi_int  i)
overridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_124

Reimplemented from casadi::FunctionInternal.

Definition at line 65 of file expm.cpp.

65  {
66  switch (i) {
67  case 0:
68  return A_;
69  case 1:
70  return Sparsity::dense(1, 1);
71  default: break;
72  }
73  return Sparsity();
74  }

References casadi::Expm::A_, and casadi::Sparsity::dense().

◆ get_sparsity_out()

Sparsity casadi::Expm::get_sparsity_out ( casadi_int  i)
overridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_124

Reimplemented from casadi::FunctionInternal.

Definition at line 76 of file expm.cpp.

76  {
77  switch (i) {
78  case 0:
79  return A_;
80  default: break;
81  }
82  return Sparsity();
83  }

References casadi::Expm::A_.

◆ get_stats()

Dict casadi::FunctionInternal::get_stats ( void *  mem) const
overridevirtualinherited

Reimplemented from casadi::ProtoFunction.

Reimplemented in casadi::Sqpmethod, casadi::Scpgen, casadi::Qrsqp, casadi::Qrqp, casadi::QpToNlp, casadi::Newton, casadi::Ipqp, casadi::ImplicitToNlp, casadi::Feasiblesqpmethod, casadi::FastNewton, casadi::WorhpInterface, casadi::SuperscsInterface, casadi::SundialsInterface, casadi::SnoptInterface, casadi::SLEQPInterface, casadi::QpoasesInterface, casadi::ProxqpInterface, casadi::OsqpInterface, casadi::OoqpInterface, casadi::MadnlpInterface, casadi::KnitroInterface, casadi::IpoptInterface, casadi::HpmpcInterface, casadi::HpipmInterface, casadi::HighsInterface, casadi::GurobiInterface, casadi::FatropInterface, casadi::FatropConicInterface, casadi::DaqpInterface, casadi::CplexInterface, casadi::ClpInterface, casadi::ClarabelInterface, casadi::CbcInterface, casadi::BonminInterface, casadi::AlpaqaInterface, casadi::Rootfinder, casadi::OracleFunction, casadi::Nlpsol, and casadi::MXFunction.

Definition at line 2896 of file function_internal.cpp.

2896  {
2897  Dict stats = ProtoFunction::get_stats(mem);
2898  auto m = static_cast<FunctionMemory*>(mem);
2899  casadi_assert(m->stats_available,
2900  "No stats available: Function '" + name_ + "' not set up. "
2901  "To get statistics, first evaluate it numerically.");
2902  return stats;
2903  }
virtual Dict get_stats(void *mem) const
Get all statistics.

References casadi::ProtoFunction::get_stats(), and casadi::ProtoFunction::name_.

Referenced by casadi::Conic::get_stats(), casadi::FmuFunction::get_stats(), casadi::MXFunction::get_stats(), casadi::OracleFunction::get_stats(), and casadi::QpToNlp::get_stats().

◆ getAdaptorSolverName()

virtual std::string casadi::FunctionInternal::getAdaptorSolverName ( ) const
inlinevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_k3

Definition at line 304 of file function_internal.hpp.

304 { return ""; }

◆ getCount()

Definition at line 60 of file generic_shared_internal.hpp.

186  {
187  return static_cast<const Internal*>(this)->count;
188  }

◆ getPlugin()

PluginInterface< Expm >::Plugin & casadi::PluginInterface< Expm >::getPlugin ( const std::string &  pname)
staticinherited

Definition at line 102 of file plugin_interface.hpp.

291  {
292 
293 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
294  std::lock_guard<std::mutex> lock(Derived::mutex_solvers_);
295 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
296 
297  // Check if the solver has been loaded
298  auto it=Derived::solvers_.find(pname);
299 
300  // Load the solver if needed
301  if (it==Derived::solvers_.end()) {
302  load_plugin(pname, true, false);
303  it=Derived::solvers_.find(pname);
304  }
305  casadi_assert_dev(it!=Derived::solvers_.end());
306  return it->second;
307  }
static Plugin load_plugin(const std::string &pname, bool register_plugin=true, bool needs_lock=true)
Load a plugin dynamically.

◆ has_codegen()

virtual bool casadi::FunctionInternal::has_codegen ( ) const
inlinevirtualinherited

◆ has_derivative()

bool casadi::FunctionInternal::has_derivative ( ) const
inherited

◆ has_eval_dm()

virtual bool casadi::FunctionInternal::has_eval_dm ( ) const
inlinevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ke

Reimplemented in casadi::CallbackInternal.

Definition at line 419 of file function_internal.hpp.

419 { return false;}

Referenced by casadi::FunctionInternal::eval().

◆ has_forward()

bool casadi::Expm::has_forward ( casadi_int  nfwd) const
inlineoverridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_126

Reimplemented from casadi::FunctionInternal.

Definition at line 78 of file expm_impl.hpp.

78 { return true;}

◆ has_free()

virtual bool casadi::FunctionInternal::has_free ( ) const
inlinevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_l8

Reimplemented in casadi::SXFunction, and casadi::MXFunction.

Definition at line 738 of file function_internal.hpp.

738 { return false;}

Referenced by casadi::FunctionInternal::get_free().

◆ has_function()

virtual bool casadi::FunctionInternal::has_function ( const std::string &  fname) const
inlinevirtualinherited

Reimplemented in casadi::OracleFunction, casadi::MapSum, and casadi::Map.

Definition at line 364 of file function_internal.hpp.

364 {return false;}

◆ has_jac_sparsity()

bool casadi::Expm::has_jac_sparsity ( casadi_int  oind,
casadi_int  iind 
) const
inlineoverridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kz Get, if necessary generate, the sparsity of a Jacobian block

Reimplemented from casadi::FunctionInternal.

Definition at line 99 of file expm_impl.hpp.

99 { return true;}

◆ has_jacobian()

virtual bool casadi::FunctionInternal::has_jacobian ( ) const
inlinevirtualinherited

◆ has_memory()

bool casadi::ProtoFunction::has_memory ( int  ind) const
inherited

Definition at line 3581 of file function_internal.cpp.

3581  {
3582  return ind<mem_.size();
3583  }

◆ has_option()

bool casadi::ProtoFunction::has_option ( const std::string &  option_name) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_jj

Definition at line 920 of file function_internal.cpp.

920  {
921  return get_options().find(option_name) != 0;
922  }
const Options::Entry * find(const std::string &name) const
Definition: options.cpp:32

References casadi::Options::find(), and casadi::ProtoFunction::get_options().

◆ has_plugin()

bool casadi::PluginInterface< Expm >::has_plugin ( const std::string &  pname,
bool  verbose = false 
)
staticinherited

Definition at line 76 of file plugin_interface.hpp.

131  {
132 
133 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
134  std::lock_guard<std::mutex> lock(Derived::mutex_solvers_);
135 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
136 
137  // Quick return if available
138  if (Derived::solvers_.find(pname) != Derived::solvers_.end()) {
139  return true;
140  }
141 
142  // Try loading the plugin
143  try {
144  (void)load_plugin(pname, false, false);
145  return true;
146  } catch (CasadiException& ex) {
147  if (verbose) {
148  casadi_warning(ex.what());
149  }
150  return false;
151  }
152  }
std::vector< casadi_int > find(const std::vector< T > &v)
find nonzeros

◆ has_reverse()

bool casadi::Expm::has_reverse ( casadi_int  nadj) const
inlineoverridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_127

Reimplemented from casadi::FunctionInternal.

Definition at line 89 of file expm_impl.hpp.

89 { return true;}

◆ has_spfwd()

virtual bool casadi::FunctionInternal::has_spfwd ( ) const
inlinevirtualinherited

◆ has_sprev()

virtual bool casadi::FunctionInternal::has_sprev ( ) const
inlinevirtualinherited

◆ incache()

bool casadi::FunctionInternal::incache ( const std::string &  fname,
Function f,
const std::string &  suffix = "" 
) const
inherited

◆ index_in()

casadi_int casadi::FunctionInternal::index_in ( const std::string &  name) const
inlineinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mu

Definition at line 1121 of file function_internal.hpp.

1121  {
1122  for (casadi_int i=0; i<name_in_.size(); ++i) {
1123  if (name_in_[i]==name) return i;
1124  }
1125  casadi_error("FunctionInternal::index_in: could not find entry \""
1126  + name + "\". Available names are: " + str(name_in_) + ".");
1127  return -1;
1128  }

References casadi::str().

Referenced by casadi::FunctionInternal::convert_arg().

◆ index_out()

casadi_int casadi::FunctionInternal::index_out ( const std::string &  name) const
inlineinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mv

Definition at line 1133 of file function_internal.hpp.

1133  {
1134  for (casadi_int i=0; i<name_out_.size(); ++i) {
1135  if (name_out_[i]==name) return i;
1136  }
1137  casadi_error("FunctionInternal::index_out: could not find entry \""
1138  + name + "\". Available names are: " + str(name_out_) + ".");
1139  return -1;
1140  }

References casadi::str().

Referenced by casadi::FunctionInternal::convert_res().

◆ info()

Dict casadi::FunctionInternal::info ( ) const
virtualinherited

◆ init()

void casadi::SlicotExpm::init ( const Dict opts)
overridevirtual

Reimplemented from casadi::Expm.

Definition at line 66 of file slicot_expm.cpp.

66  {
67 
68  if (!has_loaded_) {
69  has_loaded_ = true;
70  casadi_warning("Loaded plugin with GPL license.");
71  }
72 
73  Expm::init(opts);
74 
75  n_ = A_.size1();
76 
77  alloc_w(n_*n_, true); // A
78  alloc_w(n_*n_, true); // H
79  alloc_w(2*n_*n_, false); // dwork
80  alloc_iw(2*n_, false); // iwork
81  }
void init(const Dict &opts) override
Initialize.
Definition: expm.cpp:93

References casadi::Expm::A_, casadi::FunctionInternal::alloc_iw(), casadi::FunctionInternal::alloc_w(), casadi::Expm::init(), and casadi::Sparsity::size1().

◆ init_mem()

int casadi::SlicotExpm::init_mem ( void *  mem) const
overridevirtual

Reimplemented from casadi::ProtoFunction.

Definition at line 99 of file slicot_expm.cpp.

99  {
100  return Expm::init_mem(mem);
101  }

References casadi::ProtoFunction::init_mem().

◆ initSingleton()

void casadi::GenericSharedInternal< SharedObject , SharedObjectInternal >::initSingleton ( )
inlineprotectedinherited

Called in the constructor of singletons to avoid that the counter reaches zero

Definition at line 71 of file generic_shared_internal.hpp.

71  {
72  casadi_assert_dev(static_cast<Internal*>(this)->count==0);
73  static_cast<Internal*>(this)->count++;
74  }

◆ instantiate()

Expm * casadi::PluginInterface< Expm >::instantiate ( const std::string &  fname,
const std::string &  pname,
Problem  problem 
)
staticinherited

Definition at line 106 of file plugin_interface.hpp.

313  {
314 
315  // Assert the plugin exists (needed for adaptors)
316  if (!has_plugin(pname, true)) {
317  casadi_error("Plugin '" + pname + "' is not found.");
318  }
319  return getPlugin(pname).creator(fname, problem);
320  }
static bool has_plugin(const std::string &pname, bool verbose=false)
Check if a plugin is available or can be loaded.
static Plugin & getPlugin(const std::string &pname)
Load and get the creator function.

◆ instruction_constant()

double casadi::FunctionInternal::instruction_constant ( casadi_int  k) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ld

Reimplemented in casadi::SXFunction.

Definition at line 3318 of file function_internal.cpp.

3318  {
3319  casadi_error("'instruction_constant' not defined for " + class_name());
3320  }

References casadi::SharedObjectInternal::class_name().

◆ instruction_id()

casadi_int casadi::FunctionInternal::instruction_id ( casadi_int  k) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_lb

Reimplemented in casadi::SXFunction, and casadi::MXFunction.

Definition at line 3310 of file function_internal.cpp.

3310  {
3311  casadi_error("'instruction_id' not defined for " + class_name());
3312  }

References casadi::SharedObjectInternal::class_name().

◆ instruction_input()

std::vector< casadi_int > casadi::FunctionInternal::instruction_input ( casadi_int  k) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_lc

Reimplemented in casadi::SXFunction, and casadi::MXFunction.

Definition at line 3314 of file function_internal.cpp.

3314  {
3315  casadi_error("'instruction_input' not defined for " + class_name());
3316  }

References casadi::SharedObjectInternal::class_name().

◆ instruction_MX()

MX casadi::FunctionInternal::instruction_MX ( casadi_int  k) const
virtualinherited

Reimplemented in casadi::MXFunction.

Definition at line 3326 of file function_internal.cpp.

3326  {
3327  casadi_error("'instruction_MX' not defined for " + class_name());
3328  }

References casadi::SharedObjectInternal::class_name().

◆ instruction_output()

std::vector< casadi_int > casadi::FunctionInternal::instruction_output ( casadi_int  k) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_le

Reimplemented in casadi::SXFunction, and casadi::MXFunction.

Definition at line 3322 of file function_internal.cpp.

3322  {
3323  casadi_error("'instruction_output' not defined for " + class_name());
3324  }

References casadi::SharedObjectInternal::class_name().

◆ instructions_sx()

SX casadi::FunctionInternal::instructions_sx ( ) const
virtualinherited

Reimplemented in casadi::SXFunction.

Definition at line 3330 of file function_internal.cpp.

3330  {
3331  casadi_error("'instructions_sx' not defined for " + class_name());
3332  }

References casadi::SharedObjectInternal::class_name().

◆ is_a()

bool casadi::FunctionInternal::is_a ( const std::string &  type,
bool  recursive 
) const
virtualinherited

◆ jac_is_symm()

bool casadi::FunctionInternal::jac_is_symm ( casadi_int  oind,
casadi_int  iind 
) const
virtualinherited

Definition at line 1774 of file function_internal.cpp.

1774  {
1775  // If derivative expression
1776  if (!derivative_of_.is_null()) {
1777  std::string n = derivative_of_.name();
1778  // Reverse move
1779  if (name_ == "adj1_" + n) {
1780  if (iind == oind) return true;
1781  }
1782  }
1783  // Not symmetric by default
1784  return false;
1785  }

References casadi::FunctionInternal::derivative_of_, casadi::GenericShared< Shared, Internal >::is_null(), casadi::Function::name(), and casadi::ProtoFunction::name_.

◆ jac_sparsity()

Sparsity & casadi::FunctionInternal::jac_sparsity ( casadi_int  oind,
casadi_int  iind,
bool  compact,
bool  symmetric 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kz Get, if necessary generate, the sparsity of a Jacobian block

Definition at line 1862 of file function_internal.cpp.

1863  {
1864 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
1865  // Safe access to jac_sparsity_
1866  std::lock_guard<std::mutex> lock(jac_sparsity_mtx_);
1867 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
1868  // If first call, allocate cache
1869  for (bool c : {false, true}) {
1870  if (jac_sparsity_[c].empty()) jac_sparsity_[c].resize(n_in_ * n_out_);
1871  }
1872  // Flat index
1873  casadi_int ind = iind + oind * n_in_;
1874  // Reference to the block
1875  Sparsity& jsp = jac_sparsity_[compact].at(ind);
1876  // If null, generate
1877  if (jsp.is_null()) {
1878  // Use (non)-compact pattern, if given
1879  Sparsity& jsp_other = jac_sparsity_[!compact].at(ind);
1880  if (!jsp_other.is_null()) {
1881  jsp = compact ? to_compact(oind, iind, jsp_other) : from_compact(oind, iind, jsp_other);
1882  } else {
1883  // Generate pattern
1884  Sparsity sp;
1885  bool sp_is_compact;
1886  if (!is_diff_out_.at(oind) || !is_diff_in_.at(iind)) {
1887  // All-zero sparse
1888  sp = Sparsity(nnz_out(oind), nnz_in(iind));
1889  sp_is_compact = true;
1890  } else {
1891  // Use internal routine to determine sparsity
1892  if (has_spfwd() || has_sprev() || has_jac_sparsity(oind, iind)) {
1893  sp = get_jac_sparsity(oind, iind, symmetric);
1894  }
1895  // If null, dense
1896  if (sp.is_null()) sp = Sparsity::dense(nnz_out(oind), nnz_in(iind));
1897  // Is the return the compact pattern?
1898  sp_is_compact = sp.size1() == nnz_out(oind) && sp.size2() == nnz_in(iind);
1899  }
1900  // Save to cache and convert if needed
1901  if (sp_is_compact == compact) {
1902  jsp = sp;
1903  } else {
1904  jsp_other = sp;
1905  jsp = compact ? to_compact(oind, iind, sp) : from_compact(oind, iind, sp);
1906  }
1907  }
1908  }
1909 
1910  // Make sure the Jacobian is symmetric if requested, cf. #1522, #3074, #3134
1911  if (symmetric) {
1912  if (compact) {
1913  Sparsity sp = from_compact(oind, iind, jsp);
1914  if (!sp.is_symmetric()) {
1915  sp = sp * sp.T();
1916  jsp = to_compact(oind, iind, sp);
1917  }
1918  } else {
1919  if (!jsp.is_symmetric()) jsp = jsp * jsp.T();
1920  }
1921  }
1922 
1923  // Return a reference to the block
1924  return jsp;
1925  }
virtual bool has_sprev() const
Is the class able to propagate seeds through the algorithm?
std::vector< Sparsity > jac_sparsity_[2]
Cache for sparsities of the Jacobian blocks.
Sparsity to_compact(casadi_int oind, casadi_int iind, const Sparsity &sp) const
Convert to compact Jacobian sparsity pattern.
virtual bool has_jac_sparsity(casadi_int oind, casadi_int iind) const
Get Jacobian sparsity.
Sparsity from_compact(casadi_int oind, casadi_int iind, const Sparsity &sp) const
Convert from compact Jacobian sparsity pattern.

References casadi::Sparsity::dense(), casadi::FunctionInternal::from_compact(), casadi::FunctionInternal::get_jac_sparsity(), casadi::FunctionInternal::has_jac_sparsity(), casadi::FunctionInternal::has_spfwd(), casadi::FunctionInternal::has_sprev(), casadi::FunctionInternal::is_diff_in_, casadi::FunctionInternal::is_diff_out_, casadi::GenericShared< Shared, Internal >::is_null(), casadi::Sparsity::is_symmetric(), casadi::FunctionInternal::jac_sparsity_, casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::nnz_out(), casadi::Sparsity::size1(), casadi::Sparsity::size2(), casadi::Sparsity::T(), and casadi::FunctionInternal::to_compact().

Referenced by casadi::FunctionInternal::get_partition(), casadi::FunctionInternal::sp_forward_block(), and casadi::FunctionInternal::sp_reverse().

◆ jacobian()

Function casadi::FunctionInternal::jacobian ( ) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ky

Definition at line 2257 of file function_internal.cpp.

2257  {
2258  // Used wrapped function if jacobian not available
2259  if (!has_jacobian()) {
2260  // Derivative information must be available
2261  casadi_assert(has_derivative(),
2262  "Derivatives cannot be calculated for " + name_);
2263  return wrap().jacobian();
2264  }
2265  // Retrieve/generate cached
2266  Function f;
2267  std::string fname = "jac_" + name_;
2268  if (!incache(fname, f)) {
2269  // Names of inputs
2270  std::vector<std::string> inames;
2271  for (casadi_int i=0; i<n_in_; ++i) inames.push_back(name_in_[i]);
2272  for (casadi_int i=0; i<n_out_; ++i) inames.push_back("out_" + name_out_[i]);
2273  // Names of outputs
2274  std::vector<std::string> onames;
2275  onames.reserve(n_in_ * n_out_);
2276  for (size_t oind = 0; oind < n_out_; ++oind) {
2277  for (size_t iind = 0; iind < n_in_; ++iind) {
2278  onames.push_back("jac_" + name_out_[oind] + "_" + name_in_[iind]);
2279  }
2280  }
2281  // Options
2283  opts["derivative_of"] = self();
2284  // Generate derivative function
2285  casadi_assert_dev(enable_jacobian_);
2286  f = get_jacobian(fname, inames, onames, opts);
2287  // Consistency checks
2288  casadi_assert(f.n_in() == inames.size(),
2289  "Mismatching input signature, expected " + str(inames));
2290  casadi_assert(f.n_out() == onames.size(),
2291  "Mismatching output signature, expected " + str(onames));
2292  // Save to cache
2293  tocache_if_missing(f);
2294  }
2295  return f;
2296  }
virtual bool has_jacobian() const
Return Jacobian of all input elements with respect to all output elements.
virtual Function get_jacobian(const std::string &name, const std::vector< std::string > &inames, const std::vector< std::string > &onames, const Dict &opts) const
Return Jacobian of all input elements with respect to all output elements.
Function jacobian() const
Calculate all Jacobian blocks.
Definition: function.cpp:916

References casadi::combine(), casadi::FunctionInternal::der_options_, casadi::FunctionInternal::enable_jacobian_, casadi::FunctionInternal::get_jacobian(), casadi::FunctionInternal::has_derivative(), casadi::FunctionInternal::has_jacobian(), casadi::FunctionInternal::incache(), casadi::Function::jacobian(), casadi::FunctionInternal::jacobian_options_, casadi::Function::n_in(), casadi::FunctionInternal::n_in_, casadi::Function::n_out(), casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::FunctionInternal::name_in_, casadi::FunctionInternal::name_out_, casadi::str(), casadi::FunctionInternal::tocache_if_missing(), and casadi::FunctionInternal::wrap().

Referenced by casadi::FunctionInternal::call_forward(), casadi::FunctionInternal::call_reverse(), and casadi::Function::jacobian().

◆ jit_dependencies()

virtual void casadi::FunctionInternal::jit_dependencies ( const std::string &  fname)
inlinevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_m4

Reimplemented in casadi::OracleFunction.

Definition at line 914 of file function_internal.hpp.

914 {}

Referenced by casadi::FunctionInternal::finalize().

◆ load_library()

handle_t casadi::PluginInterface< Expm >::load_library ( const std::string &  libname,
std::string &  resultpath,
bool  global 
)
staticinherited

Definition at line 92 of file plugin_interface.hpp.

184  {
185 
186 #ifndef WITH_DL
187  casadi_error("WITH_DL option needed for dynamic loading");
188 #else // WITH_DL
189 
190  // Get the name of the shared library
191  std::string lib = SHARED_LIBRARY_PREFIX + libname + SHARED_LIBRARY_SUFFIX;
192 
193  // Build up search paths;
194  std::vector<std::string> search_paths = get_search_paths();
195  return open_shared_library(lib, search_paths, resultpath,
196  "PluginInterface::load_plugin", global);
197 
198 #endif // WITH_DL
199  }
std::vector< std::string > get_search_paths()
Definition: casadi_os.cpp:49

◆ load_plugin()

PluginInterface< Expm >::Plugin casadi::PluginInterface< Expm >::load_plugin ( const std::string &  pname,
bool  register_plugin = true,
bool  needs_lock = true 
)
staticinherited

Definition at line 88 of file plugin_interface.hpp.

204  {
205 
206 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
207  casadi::conditional_lock_guard<std::mutex> lock(Derived::mutex_solvers_, needs_lock);
208 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
209 
210  // Issue warning and quick return if already loaded
211  if (Derived::solvers_.find(pname) != Derived::solvers_.end()) {
212  casadi_warning("PluginInterface: Solver " + pname + " is already in use. Ignored.");
213  return Plugin();
214  }
215 
216  // Logger singletons are lazily instantiated on first uout()/uerr() calls
217  // This instantation may lead to a data race with potential instatiations in plugin
218  // To be safe, trigger instantatin before any plugin loading
219  uout();
220  uerr();
221 
222 #ifndef WITH_DL
223  casadi_error("WITH_DL option needed for dynamic loading");
224 #else // WITH_DL
225  // Retrieve the registration function
226  RegFcn reg;
227 
228  // Load the dll
229  std::string regName = "casadi_register_" + Derived::infix_ + "_" + pname;
230 
231  std::string searchpath;
232  handle_t handle = load_library("casadi_" + Derived::infix_ + "_" + pname, searchpath,
233  false);
234 
235 #ifdef _WIN32
236 
237 #if __GNUC__
238 #pragma GCC diagnostic push
239 #pragma GCC diagnostic ignored "-Wcast-function-type"
240 #endif
241  reg = reinterpret_cast<RegFcn>(GetProcAddress(handle, TEXT(regName.c_str())));
242 #if __GNUC__
243 #pragma GCC diagnostic pop
244 #endif
245 
246 #else // _WIN32
247  // Reset error
248  dlerror();
249 
250  // Load creator
251  reg = reinterpret_cast<RegFcn>(dlsym(handle, regName.c_str()));
252 #endif // _WIN32
253  casadi_assert(reg!=nullptr,
254  "PluginInterface::load_plugin: no \"" + regName + "\" found in " + searchpath + ".");
255 
256  // Create a temporary struct
257  Plugin plugin = pluginFromRegFcn(reg);
258  // Register the plugin
259  if (register_plugin) {
260  registerPlugin(plugin, false);
261  }
262 
263  return plugin;
264 
265 #endif // WITH_DL
266  }
static handle_t load_library(const std::string &libname, std::string &resultpath, bool global)
Load a library dynamically.
static Plugin pluginFromRegFcn(RegFcn regfcn)
Instantiate a Plugin struct from a factory function.
static void registerPlugin(const Plugin &plugin, bool needs_lock=true)
Register an integrator in the factory.
std::ostream & uerr()

◆ map()

Function casadi::FunctionInternal::map ( casadi_int  n,
const std::string &  parallelization 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_nd

Definition at line 1007 of file function_internal.cpp.

1007  {
1008  Function f;
1009  if (parallelization=="serial") {
1010  // Serial maps are cached
1011  std::string fname = "map" + str(n) + "_" + name_;
1012  if (!incache(fname, f)) {
1013  // Create new serial map
1014  f = Map::create(parallelization, self(), n);
1015  casadi_assert_dev(f.name()==fname);
1016  // Save in cache
1017  tocache_if_missing(f);
1018  }
1019  } else {
1020  // Non-serial maps are not cached
1021  f = Map::create(parallelization, self(), n);
1022  }
1023  return f;
1024  }
static Function create(const std::string &parallelization, const Function &f, casadi_int n)
Definition: map.cpp:39

References casadi::Map::create(), casadi::FunctionInternal::incache(), casadi::Function::name(), casadi::ProtoFunction::name_, casadi::str(), and casadi::FunctionInternal::tocache_if_missing().

Referenced by casadi::Dple::get_forward(), casadi::Dple::get_reverse(), and casadi::FunctionInternal::mapsum_mx().

◆ mapsum_mx()

std::vector< MX > casadi::FunctionInternal::mapsum_mx ( const std::vector< MX > &  arg,
const std::string &  parallelization 
)
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kw

Definition at line 3339 of file function_internal.cpp.

3340  {
3341  if (x.empty()) return x;
3342  // Check number of arguments
3343  casadi_assert(x.size()==n_in_, "mapsum_mx: Wrong number_i of arguments");
3344  // Number of parallel calls
3345  casadi_int npar = 1;
3346  // Check/replace arguments
3347  std::vector<MX> x_mod(x.size());
3348  for (casadi_int i=0; i<n_in_; ++i) {
3349  if (check_mat(x[i].sparsity(), sparsity_in_[i], npar)) {
3350  x_mod[i] = replace_mat(x[i], sparsity_in_[i], npar);
3351  } else {
3352  // Mismatching sparsity: The following will throw an error message
3353  npar = 0;
3354  check_arg(x, npar);
3355  }
3356  }
3357 
3358  casadi_int n = 1;
3359  for (casadi_int i=0; i<x_mod.size(); ++i) {
3360  n = std::max(x_mod[i].size2() / size2_in(i), n);
3361  }
3362 
3363  std::vector<casadi_int> reduce_in;
3364  for (casadi_int i=0; i<x_mod.size(); ++i) {
3365  if (x_mod[i].size2()/size2_in(i)!=n) {
3366  reduce_in.push_back(i);
3367  }
3368  }
3369 
3370  Function ms = self().map("mapsum", parallelization, n, reduce_in, range(n_out_));
3371 
3372  // Call the internal function
3373  return ms(x_mod);
3374  }
Function map(casadi_int n, const std::string &parallelization) const
Generate/retrieve cached serial map.
void check_arg(const std::vector< M > &arg, casadi_int &npar) const
Check if input arguments have correct length and dimensions.
M replace_mat(const M &arg, const Sparsity &inp, casadi_int npar)

References casadi::FunctionInternal::check_arg(), casadi::FunctionInternal::check_mat(), casadi::FunctionInternal::map(), casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::range(), casadi::replace_mat(), casadi::FunctionInternal::size2_in(), and casadi::FunctionInternal::sparsity_in_.

◆ matching_arg()

template<typename M >
bool casadi::FunctionInternal::matching_arg ( const std::vector< M > &  arg,
casadi_int &  npar 
) const
inherited

Raises errors

Parameters
npar[in]normal usage: 1, disallow pararallel calls: -1
[out]nparmax number of horizontal repetitions across all arguments (or -1)

Extra doc: https://github.com/casadi/casadi/wiki/L_kk

Definition at line 1722 of file function_internal.hpp.

1722  {
1723  check_arg(arg, npar);
1724  for (casadi_int i=0; i<n_in_; ++i) {
1725  if (arg.at(i).size1()!=size1_in(i)) return false;
1726  if (arg.at(i).size2()!=size2_in(i) && arg.at(i).size2()!=npar*size2_in(i)) return false;
1727  }
1728  return true;
1729  }

References casadi::FunctionInternal::check_arg(), casadi::FunctionInternal::n_in_, casadi::FunctionInternal::size1_in(), and casadi::FunctionInternal::size2_in().

Referenced by casadi::MXFunction::ad_forward(), casadi::SXFunction::ad_forward(), casadi::FunctionInternal::call(), casadi::FunctionInternal::call_forward(), and casadi::FunctionInternal::nz_in().

◆ matching_res()

template<typename M >
bool casadi::FunctionInternal::matching_res ( const std::vector< M > &  arg,
casadi_int &  npar 
) const
inherited

Raises errors

Parameters
npar[in]normal usage: 1, disallow pararallel calls: -1
[out]nparmax number of horizontal repetitions across all arguments (or -1)

Extra doc: https://github.com/casadi/casadi/wiki/L_kl

Definition at line 1732 of file function_internal.hpp.

1732  {
1733  check_res(res, npar);
1734  for (casadi_int i=0; i<n_out_; ++i) {
1735  if (res.at(i).size1()!=size1_out(i)) return false;
1736  if (res.at(i).size2()!=size2_out(i) && res.at(i).size2()!=npar*size2_out(i)) return false;
1737  }
1738  return true;
1739  }
void check_res(const std::vector< M > &res, casadi_int &npar) const
Check if output arguments have correct length and dimensions.

References casadi::FunctionInternal::check_res(), casadi::FunctionInternal::n_out_, casadi::FunctionInternal::size1_out(), and casadi::FunctionInternal::size2_out().

Referenced by casadi::MXFunction::ad_reverse(), casadi::SXFunction::ad_reverse(), casadi::FunctionInternal::call_reverse(), and casadi::FunctionInternal::nz_out().

◆ memory()

void * casadi::ProtoFunction::memory ( int  ind) const
inherited

Definition at line 3574 of file function_internal.cpp.

3574  {
3575 #ifdef CASADI_WITH_THREAD
3576  std::lock_guard<std::mutex> lock(mtx_);
3577 #endif //CASADI_WITH_THREAD
3578  return mem_.at(ind);
3579  }

Referenced by casadi::FunctionInternal::call_gen(), casadi::FunctionInternal::get_jac_sparsity_gen(), casadi::FunctionInternal::get_jac_sparsity_hierarchical(), casadi::Sqpmethod::solve_ela_QP(), and casadi::Sqpmethod::solve_QP().

◆ merge()

void casadi::FunctionInternal::merge ( const std::vector< MX > &  arg,
std::vector< MX > &  subs_from,
std::vector< MX > &  subs_to 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_2b8

Reimplemented in casadi::BlazingSplineFunction.

Definition at line 3288 of file function_internal.cpp.

3289  {
3290  return;
3291  }

◆ mx_in() [1/2]

const std::vector< MX > casadi::FunctionInternal::mx_in ( ) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_l7

Reimplemented in casadi::MXFunction.

Definition at line 3268 of file function_internal.cpp.

3268  {
3269  std::vector<MX> ret(n_in_);
3270  for (casadi_int i=0; i<ret.size(); ++i) {
3271  ret[i] = mx_in(i);
3272  }
3273  return ret;
3274  }
virtual const std::vector< MX > mx_in() const
Get function input(s) and output(s)

References casadi::FunctionInternal::n_in_.

Referenced by casadi::Nlpsol::get_forward(), casadi::LinearInterpolantJac::get_jacobian(), casadi::Nlpsol::get_reverse(), casadi::FunctionInternal::wrap(), and casadi::FunctionInternal::wrap_as_needed().

◆ mx_in() [2/2]

const MX casadi::FunctionInternal::mx_in ( casadi_int  ind) const
virtualinherited

◆ mx_out() [1/2]

const std::vector< MX > casadi::FunctionInternal::mx_out ( ) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_l7

Definition at line 3276 of file function_internal.cpp.

3276  {
3277  std::vector<MX> ret(n_out_);
3278  for (casadi_int i=0; i<ret.size(); ++i) {
3279  ret[i] = mx_out(i);
3280  }
3281  return ret;
3282  }
virtual const std::vector< MX > mx_out() const
Get function input(s) and output(s)

References casadi::FunctionInternal::n_out_.

Referenced by casadi::Nlpsol::get_forward(), and casadi::Nlpsol::get_reverse().

◆ mx_out() [2/2]

const MX casadi::FunctionInternal::mx_out ( casadi_int  ind) const
virtualinherited

◆ n_instructions()

casadi_int casadi::FunctionInternal::n_instructions ( ) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_la

Reimplemented in casadi::SXFunction, and casadi::MXFunction.

Definition at line 3306 of file function_internal.cpp.

3306  {
3307  casadi_error("'n_instructions' not defined for " + class_name());
3308  }

References casadi::SharedObjectInternal::class_name().

◆ n_nodes()

casadi_int casadi::FunctionInternal::n_nodes ( ) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_lf

Reimplemented in casadi::SXFunction, and casadi::MXFunction.

Definition at line 3334 of file function_internal.cpp.

3334  {
3335  casadi_error("'n_nodes' not defined for " + class_name());
3336  }

References casadi::SharedObjectInternal::class_name().

◆ nnz_in() [1/2]

casadi_int casadi::FunctionInternal::nnz_in ( ) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_me

Definition at line 2217 of file function_internal.cpp.

2217  {
2218  casadi_int ret=0;
2219  for (casadi_int iind=0; iind<n_in_; ++iind) ret += nnz_in(iind);
2220  return ret;
2221  }

References casadi::FunctionInternal::n_in_.

Referenced by casadi::FunctionInternal::adjViaJac(), casadi::FunctionInternal::call_gen(), casadi::JitFunction::codegen_body(), casadi::FunctionInternal::codegen_meta(), casadi::FunctionInternal::eval_gen(), casadi::CallbackInternal::finalize(), casadi::FunctionInternal::from_compact(), casadi::FunctionInternal::fwdViaJac(), casadi::FunctionInternal::generate_in(), casadi::FunctionInternal::get_jac_sparsity(), casadi::Expm::get_jac_sparsity(), casadi::FmuFunction::get_jac_sparsity(), casadi::FunctionInternal::get_jac_sparsity_gen(), casadi::FunctionInternal::get_jac_sparsity_hierarchical(), casadi::FunctionInternal::get_jac_sparsity_hierarchical_symm(), casadi::JitFunction::init(), casadi::Nlpsol::init(), casadi::CbcInterface::init(), casadi::ClpInterface::init(), casadi::CplexInterface::init(), casadi::OoqpInterface::init(), casadi::ProxqpInterface::init(), casadi::QpoasesInterface::init(), casadi::ImplicitToNlp::init(), casadi::FunctionInternal::jac_sparsity(), casadi::FunctionInternal::nz_in(), casadi::ImplicitToNlp::set_work(), casadi::CbcInterface::solve(), casadi::ClpInterface::solve(), casadi::CplexInterface::solve(), casadi::OoqpInterface::solve(), casadi::ProxqpInterface::solve(), casadi::QpToNlp::solve(), casadi::KinsolInterface::solve(), casadi::FunctionInternal::sp_forward(), and casadi::FunctionInternal::sp_reverse().

◆ nnz_in() [2/2]

casadi_int casadi::FunctionInternal::nnz_in ( casadi_int  ind) const
inlineinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_me

Definition at line 969 of file function_internal.hpp.

969 { return sparsity_in(ind).nnz(); }
casadi_int nnz() const
Get the number of (structural) non-zeros.
Definition: sparsity.cpp:148

◆ nnz_out() [1/2]

casadi_int casadi::FunctionInternal::nnz_out ( ) const
inherited

◆ nnz_out() [2/2]

casadi_int casadi::FunctionInternal::nnz_out ( casadi_int  ind) const
inlineinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_me

Definition at line 971 of file function_internal.hpp.

971 { return sparsity_out(ind).nnz(); }

◆ numel_in() [1/2]

casadi_int casadi::FunctionInternal::numel_in ( ) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mf

Definition at line 2229 of file function_internal.cpp.

2229  {
2230  casadi_int ret=0;
2231  for (casadi_int iind=0; iind<n_in_; ++iind) ret += numel_in(iind);
2232  return ret;
2233  }

References casadi::FunctionInternal::n_in_.

Referenced by casadi::FunctionInternal::from_compact(), and casadi::Integrator::get_reverse().

◆ numel_in() [2/2]

casadi_int casadi::FunctionInternal::numel_in ( casadi_int  ind) const
inlineinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mf

Definition at line 979 of file function_internal.hpp.

979 { return sparsity_in(ind).numel(); }
casadi_int numel() const
The total number of elements, including structural zeros, i.e. size2()*size1()
Definition: sparsity.cpp:132

◆ numel_out() [1/2]

casadi_int casadi::FunctionInternal::numel_out ( ) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mf

Definition at line 2235 of file function_internal.cpp.

2235  {
2236  casadi_int ret=0;
2237  for (casadi_int oind=0; oind<n_out_; ++oind) ret += numel_out(oind);
2238  return ret;
2239  }

References casadi::FunctionInternal::n_out_.

Referenced by casadi::FunctionInternal::from_compact(), and casadi::Integrator::get_reverse().

◆ numel_out() [2/2]

casadi_int casadi::FunctionInternal::numel_out ( casadi_int  ind) const
inlineinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mf

Definition at line 980 of file function_internal.hpp.

980 { return sparsity_out(ind).numel(); }

◆ nz_in() [1/2]

std::vector< double > casadi::FunctionInternal::nz_in ( const std::vector< DM > &  arg) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kt

Definition at line 3429 of file function_internal.cpp.

3429  {
3430  // Disallow parallel inputs
3431  casadi_int npar = -1;
3432  if (!matching_arg(arg, npar)) {
3433  return nz_in(replace_arg(arg, npar));
3434  }
3435 
3436  std::vector<DM> arg2 = project_arg(arg, 1);
3437  std::vector<double> ret(nnz_in());
3438  casadi_int offset = 0;
3439  for (casadi_int i=0;i<n_in_;++i) {
3440  const double* e = arg2.at(i).ptr();
3441  std::copy(e, e+nnz_in(i), ret.begin()+offset);
3442  offset+= nnz_in(i);
3443  }
3444  return ret;
3445  }

References casadi::FunctionInternal::matching_arg(), casadi::FunctionInternal::n_in_, casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::project_arg(), and casadi::FunctionInternal::replace_arg().

Referenced by casadi::SXFunction::call_fwd(), casadi::SXFunction::call_rev(), casadi::SXFunction::call_setup(), casadi::FunctionInternal::get_jac_sparsity(), casadi::FunctionInternal::get_jac_sparsity_gen(), and casadi::FunctionInternal::get_jac_sparsity_hierarchical().

◆ nz_in() [2/2]

std::vector< DM > casadi::FunctionInternal::nz_in ( const std::vector< double > &  arg) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kt

Definition at line 3399 of file function_internal.cpp.

3399  {
3400  casadi_assert(nnz_in()==arg.size(),
3401  "Dimension mismatch. Expecting " + str(nnz_in()) +
3402  ", got " + str(arg.size()) + " instead.");
3403 
3404  std::vector<DM> ret = dm_in();
3405  casadi_int offset = 0;
3406  for (casadi_int i=0;i<n_in_;++i) {
3407  DM& r = ret.at(i);
3408  std::copy(arg.begin()+offset, arg.begin()+offset+nnz_in(i), r.ptr());
3409  offset+= nnz_in(i);
3410  }
3411  return ret;
3412  }

References casadi::FunctionInternal::dm_in(), casadi::FunctionInternal::n_in_, casadi::FunctionInternal::nnz_in(), casadi::Matrix< Scalar >::ptr(), and casadi::str().

◆ nz_out() [1/2]

std::vector< double > casadi::FunctionInternal::nz_out ( const std::vector< DM > &  res) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kt

Definition at line 3447 of file function_internal.cpp.

3447  {
3448  // Disallow parallel inputs
3449  casadi_int npar = -1;
3450  if (!matching_res(res, npar)) {
3451  return nz_out(replace_res(res, npar));
3452  }
3453 
3454  std::vector<DM> res2 = project_res(res, 1);
3455  std::vector<double> ret(nnz_out());
3456  casadi_int offset = 0;
3457  for (casadi_int i=0;i<n_out_;++i) {
3458  const double* e = res2.at(i).ptr();
3459  std::copy(e, e+nnz_out(i), ret.begin()+offset);
3460  offset+= nnz_out(i);
3461  }
3462  return ret;
3463  }
std::vector< M > project_res(const std::vector< M > &arg, casadi_int npar) const
Project sparsities.
std::vector< M > replace_res(const std::vector< M > &res, casadi_int npar) const
Replace 0-by-0 outputs.

References casadi::FunctionInternal::matching_res(), casadi::FunctionInternal::n_out_, casadi::FunctionInternal::nnz_out(), casadi::FunctionInternal::project_res(), and casadi::FunctionInternal::replace_res().

Referenced by casadi::SXFunction::call_fwd(), casadi::SXFunction::call_rev(), casadi::SXFunction::call_setup(), casadi::FunctionInternal::get_jac_sparsity(), casadi::FunctionInternal::get_jac_sparsity_gen(), and casadi::FunctionInternal::get_jac_sparsity_hierarchical().

◆ nz_out() [2/2]

std::vector< DM > casadi::FunctionInternal::nz_out ( const std::vector< double > &  res) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kt

Definition at line 3414 of file function_internal.cpp.

3414  {
3415  casadi_assert(nnz_out()==res.size(),
3416  "Dimension mismatch. Expecting " + str(nnz_out()) +
3417  ", got " + str(res.size()) + " instead.");
3418 
3419  std::vector<DM> ret = dm_out();
3420  casadi_int offset = 0;
3421  for (casadi_int i=0;i<n_out_;++i) {
3422  DM& r = ret.at(i);
3423  std::copy(res.begin()+offset, res.begin()+offset+nnz_out(i), r.ptr());
3424  offset+= nnz_out(i);
3425  }
3426  return ret;
3427  }

References casadi::FunctionInternal::dm_out(), casadi::FunctionInternal::n_out_, casadi::FunctionInternal::nnz_out(), casadi::Matrix< Scalar >::ptr(), and casadi::str().

◆ oracle()

const Function & casadi::FunctionInternal::oracle ( ) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_l3

Reimplemented in casadi::OracleFunction.

Definition at line 3652 of file function_internal.cpp.

3652  {
3653  casadi_error("'oracle' not defined for " + class_name());
3654  static Function singleton;
3655  return singleton;
3656  }

References casadi::SharedObjectInternal::class_name().

Referenced by casadi::Function::oracle(), and casadi::DaeBuilder::oracle().

◆ plugin_deserialize()

Deserialize casadi::PluginInterface< Expm >::plugin_deserialize ( const std::string &  pname)
staticinherited

Definition at line 82 of file plugin_interface.hpp.

162  {
163  Deserialize m = getPlugin(pname).deserialize;
164  casadi_assert(m, "Plugin \"" + pname + "\" does not support deserialize");
165  return m;
166  }

◆ plugin_name()

const char* casadi::SlicotExpm::plugin_name ( ) const
inlineoverridevirtual

Implements casadi::PluginInterface< Expm >.

Definition at line 92 of file slicot_expm.hpp.

92 { return "slicot";}

◆ plugin_options()

const Options & casadi::PluginInterface< Expm >::plugin_options ( const std::string &  pname)
staticinherited

Definition at line 79 of file plugin_interface.hpp.

155  {
156  const Options *op = getPlugin(pname).options;
157  casadi_assert(op!=nullptr, "Plugin \"" + pname + "\" does not support options");
158  return *op;
159  }

◆ pluginFromRegFcn()

PluginInterface< Expm >::Plugin casadi::PluginInterface< Expm >::pluginFromRegFcn ( RegFcn  regfcn)
staticinherited

Definition at line 85 of file plugin_interface.hpp.

170  {
171  // Create a temporary struct
172  Plugin plugin;
173 
174  // Set the fields
175  int flag = regfcn(&plugin);
176  casadi_assert(flag==0, "Registration of plugin failed.");
177 
178  return plugin;
179  }

◆ print()

void casadi::ProtoFunction::print ( const char *  fmt,
  ... 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_jr

Definition at line 3813 of file function_internal.cpp.

3813  {
3814  // Variable number of arguments
3815  va_list args;
3816  va_start(args, fmt);
3817  // Static & dynamic buffers
3818  char buf[256];
3819  size_t buf_sz = sizeof(buf);
3820  char* buf_dyn = nullptr;
3821  // Try to print with a small buffer
3822  casadi_int n = vsnprintf(buf, buf_sz, fmt, args);
3823  // Need a larger buffer?
3824  if (n>static_cast<casadi_int>(buf_sz)) {
3825  buf_sz = static_cast<size_t>(n+1);
3826  buf_dyn = new char[buf_sz];
3827  n = vsnprintf(buf_dyn, buf_sz, fmt, args);
3828  }
3829  // Print buffer content
3830  if (n>=0) uout() << (buf_dyn ? buf_dyn : buf) << std::flush;
3831  // Cleanup
3832  delete[] buf_dyn;
3833  va_end(args);
3834  // Throw error if failure
3835  casadi_assert(n>=0, "Print failure while processing '" + std::string(fmt) + "'");
3836  }

References casadi::uout().

Referenced by casadi::Feasiblesqpmethod::anderson_acc_step_update(), casadi::Nlpsol::callback(), casadi::Blocksqp::convertHessian(), casadi::FmuFunction::eval_task(), casadi::Feasiblesqpmethod::feasibility_iterations(), casadi::Blocksqp::feasibilityRestorationPhase(), casadi::Blocksqp::fullstep(), casadi::Blocksqp::init(), casadi::Feasiblesqpmethod::init(), casadi::Ipqp::init(), casadi::Qrqp::init(), casadi::Qrsqp::init(), casadi::Sqpmethod::init(), casadi::LinsolQr::nfact(), casadi::Feasiblesqpmethod::print_iteration(), casadi::Qrsqp::print_iteration(), casadi::Sqpmethod::print_iteration(), casadi::SundialsInterface::print_stats(), casadi::ProtoFunction::print_time(), casadi::Blocksqp::printInfo(), casadi::Blocksqp::printProgress(), casadi::Blocksqp::run(), casadi::Blocksqp::solve(), casadi::Feasiblesqpmethod::solve(), casadi::Qrsqp::solve(), casadi::Sqpmethod::solve(), casadi::Sqpmethod::solve_ela_QP(), casadi::Feasiblesqpmethod::solve_LP(), casadi::Feasiblesqpmethod::solve_QP(), casadi::Qrsqp::solve_QP(), casadi::Sqpmethod::solve_QP(), and casadi::Blocksqp::solveQP().

◆ print_dimensions()

void casadi::FunctionInternal::print_dimensions ( std::ostream &  stream) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mb

Definition at line 899 of file function_internal.cpp.

899  {
900  stream << " Number of inputs: " << n_in_ << std::endl;
901  for (casadi_int i=0; i<n_in_; ++i) {
902  stream << " Input " << i << " (\"" << name_in_[i] << "\"): "
903  << sparsity_in_[i].dim() << std::endl;
904  }
905  stream << " Number of outputs: " << n_out_ << std::endl;
906  for (casadi_int i=0; i<n_out_; ++i) {
907  stream << " Output " << i << " (\"" << name_out_[i] << "\"): "
908  << sparsity_out_[i].dim() << std::endl;
909  }
910  }

References casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::FunctionInternal::name_in_, casadi::FunctionInternal::name_out_, casadi::FunctionInternal::sparsity_in_, and casadi::FunctionInternal::sparsity_out_.

◆ print_in()

void casadi::FunctionInternal::print_in ( std::ostream &  stream,
const double **  arg,
bool  truncate 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_nv

Definition at line 804 of file function_internal.cpp.

804  {
805  stream << "Function " << name_ << " (" << this << ")" << std::endl;
806  for (casadi_int i=0; i<n_in_; ++i) {
807  stream << "Input " << i << " (" << name_in_[i] << "): ";
808  if (arg[i]) {
809  DM::print_default(stream, sparsity_in_[i], arg[i], truncate);
810  stream << std::endl;
811  } else {
812  stream << "NULL" << std::endl;
813  }
814  }
815  }
static void print_default(std::ostream &stream, const Sparsity &sp, const double *nonzeros, bool truncate=true)
Print default style.

References casadi::FunctionInternal::n_in_, casadi::ProtoFunction::name_, casadi::FunctionInternal::name_in_, casadi::Matrix< double >::print_default(), and casadi::FunctionInternal::sparsity_in_.

Referenced by casadi::FunctionInternal::eval_gen().

◆ print_option()

void casadi::ProtoFunction::print_option ( const std::string &  name,
std::ostream &  stream 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ji

Definition at line 916 of file function_internal.cpp.

916  {
917  get_options().print_one(name, stream);
918  }
void print_one(const std::string &name, std::ostream &stream) const
Print all information there is to know about a certain option.
Definition: options.cpp:274

References casadi::ProtoFunction::get_options(), and casadi::Options::print_one().

◆ print_options()

void casadi::ProtoFunction::print_options ( std::ostream &  stream) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_jh

Definition at line 912 of file function_internal.cpp.

912  {
913  get_options().print_all(stream);
914  }
void print_all(std::ostream &stream) const
Print list of options.
Definition: options.cpp:268

References casadi::ProtoFunction::get_options(), and casadi::Options::print_all().

◆ print_out()

void casadi::FunctionInternal::print_out ( std::ostream &  stream,
double **  res,
bool  truncate 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_nw

Definition at line 817 of file function_internal.cpp.

817  {
818  stream << "Function " << name_ << " (" << this << ")" << std::endl;
819  for (casadi_int i=0; i<n_out_; ++i) {
820  stream << "Output " << i << " (" << name_out_[i] << "): ";
821  if (res[i]) {
822  DM::print_default(stream, sparsity_out_[i], res[i], truncate);
823  stream << std::endl;
824  } else {
825  stream << "NULL" << std::endl;
826  }
827  }
828  }

References casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::FunctionInternal::name_out_, casadi::Matrix< double >::print_default(), and casadi::FunctionInternal::sparsity_out_.

Referenced by casadi::FunctionInternal::eval_gen().

◆ print_time()

void casadi::ProtoFunction::print_time ( const std::map< std::string, FStats > &  fstats) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ju

Definition at line 3733 of file function_internal.cpp.

3733  {
3734  if (!print_time_) return;
3735  // Length of the name being printed
3736  size_t name_len=0;
3737  for (auto &&s : fstats) {
3738  name_len = std::max(s.first.size(), name_len);
3739  }
3740  name_len = std::max(name_.size(), name_len);
3741 
3742  // Print name with a given length. Format: "%NNs "
3743  char namefmt[10];
3744  sprint(namefmt, sizeof(namefmt), "%%%ds ", static_cast<casadi_int>(name_len));
3745 
3746  // Print header
3747  print(namefmt, name_.c_str());
3748 
3749  print(" : %8s %10s %8s %10s %9s\n", "t_proc", "(avg)", "t_wall", "(avg)", "n_eval");
3750 
3751 
3752  char buffer_proc[10];
3753  char buffer_wall[10];
3754  char buffer_proc_avg[10];
3755  char buffer_wall_avg[10];
3756 
3757  // Print keys
3758  for (const auto &s : fstats) {
3759  if (s.second.n_call!=0) {
3760  print(namefmt, s.first.c_str());
3761  format_time(buffer_proc, s.second.t_proc);
3762  format_time(buffer_wall, s.second.t_wall);
3763  format_time(buffer_proc_avg, s.second.t_proc/s.second.n_call);
3764  format_time(buffer_wall_avg, s.second.t_wall/s.second.n_call);
3765  print(" | %s (%s) %s (%s) %9d\n",
3766  buffer_proc, buffer_proc_avg,
3767  buffer_wall, buffer_wall_avg, s.second.n_call);
3768  }
3769  }
3770  }
void print(const char *fmt,...) const
C-style formatted printing during evaluation.
void format_time(char *buffer, double time) const
Format time in a fixed width 8 format.

References casadi::ProtoFunction::format_time(), casadi::ProtoFunction::name_, casadi::ProtoFunction::print(), casadi::ProtoFunction::print_time_, and casadi::ProtoFunction::sprint().

Referenced by casadi::FunctionInternal::eval_gen().

◆ project_arg()

template<typename M >
std::vector< M > casadi::FunctionInternal::project_arg ( const std::vector< M > &  arg,
casadi_int  npar 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kn

Definition at line 1594 of file function_internal.hpp.

1595  {
1596  casadi_assert_dev(arg.size()==n_in_);
1597 
1598  // Which arguments require mapped evaluation
1599  std::vector<bool> mapped(n_in_);
1600  for (casadi_int i=0; i<n_in_; ++i) {
1601  mapped[i] = arg[i].size2()!=size2_in(i);
1602  }
1603 
1604  // Check if matching input sparsity
1605  std::vector<bool> matching(n_in_);
1606  bool any_mismatch = false;
1607  for (casadi_int i=0; i<n_in_; ++i) {
1608  if (mapped[i]) {
1609  matching[i] = arg[i].sparsity().is_stacked(sparsity_in(i), npar);
1610  } else {
1611  matching[i] = arg[i].sparsity()==sparsity_in(i);
1612  }
1613  any_mismatch = any_mismatch || !matching[i];
1614  }
1615 
1616  // Correct input sparsity
1617  if (any_mismatch) {
1618  std::vector<M> arg2(arg);
1619  for (casadi_int i=0; i<n_in_; ++i) {
1620  if (!matching[i]) {
1621  if (mapped[i]) {
1622  arg2[i] = project(arg2[i], repmat(sparsity_in(i), 1, npar));
1623  } else {
1624  arg2[i] = project(arg2[i], sparsity_in(i));
1625  }
1626  }
1627  }
1628  return arg2;
1629  }
1630  return arg;
1631  }

References casadi::FunctionInternal::n_in_, casadi::FunctionInternal::size2_in(), and casadi::FunctionInternal::sparsity_in().

Referenced by casadi::FunctionInternal::call_gen(), and casadi::FunctionInternal::nz_in().

◆ project_res()

template<typename M >
std::vector< M > casadi::FunctionInternal::project_res ( const std::vector< M > &  arg,
casadi_int  npar 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ko

Definition at line 1634 of file function_internal.hpp.

1635  {
1636  return arg;
1637  }

Referenced by casadi::FunctionInternal::nz_out().

◆ purgable()

template<typename MatType >
bool casadi::FunctionInternal::purgable ( const std::vector< MatType > &  seed)
staticinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_nq

Definition at line 1487 of file function_internal.hpp.

1487  {
1488  for (auto i=v.begin(); i!=v.end(); ++i) {
1489  if (!i->is_zero()) return false;
1490  }
1491  return true;
1492  }

Referenced by casadi::MXFunction::ad_forward(), and casadi::MXFunction::ad_reverse().

◆ registerPlugin() [1/2]

void casadi::PluginInterface< Expm >::registerPlugin ( const Plugin &  plugin,
bool  needs_lock = true 
)
staticinherited

Definition at line 96 of file plugin_interface.hpp.

274  {
275 
276 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
277  casadi::conditional_lock_guard<std::mutex> lock(Derived::mutex_solvers_, needs_lock);
278 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
279 
280  // Check if the solver name is in use
281  typename std::map<std::string, Plugin>::iterator it=Derived::solvers_.find(plugin.name);
282  casadi_assert(it==Derived::solvers_.end(),
283  "Solver " + str(plugin.name) + " is already in use");
284 
285  // Add to list of solvers
286  Derived::solvers_[plugin.name] = plugin;
287  }

◆ registerPlugin() [2/2]

void casadi::PluginInterface< Expm >::registerPlugin ( RegFcn  regfcn,
bool  needs_lock = true 
)
staticinherited

Definition at line 99 of file plugin_interface.hpp.

269  {
270  registerPlugin(pluginFromRegFcn(regfcn), needs_lock);
271  }

◆ release()

void casadi::ProtoFunction::release ( int  mem) const
inherited

Definition at line 3606 of file function_internal.cpp.

3606  {
3607 #ifdef CASADI_WITH_THREAD
3608  std::lock_guard<std::mutex> lock(mtx_);
3609 #endif //CASADI_WITH_THREAD
3610  unused_.push(mem);
3611  }

◆ replace_arg()

template<typename M >
std::vector< M > casadi::FunctionInternal::replace_arg ( const std::vector< M > &  arg,
casadi_int  npar 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_km

Definition at line 1767 of file function_internal.hpp.

1768  {
1769  std::vector<M> r(arg.size());
1770  for (casadi_int i=0; i<r.size(); ++i) r[i] = replace_mat(arg[i], sparsity_in(i), npar);
1771  return r;
1772  }

References casadi::replace_mat(), and casadi::FunctionInternal::sparsity_in().

Referenced by casadi::FunctionInternal::call(), casadi::FunctionInternal::nz_in(), and casadi::FunctionInternal::replace_fseed().

◆ replace_aseed() [1/2]

template<typename M >
std::vector<std::vector<M> > casadi::FunctionInternal::replace_aseed ( const std::vector< std::vector< M > > &  aseed,
casadi_int  npar 
) const
inherited

Definition at line 1791 of file function_internal.hpp.

1792  {
1793  std::vector<std::vector<M> > r(aseed.size());
1794  for (casadi_int d=0; d<r.size(); ++d) r[d] = replace_res(aseed[d], npar);
1795  return r;
1796  }

References casadi::FunctionInternal::replace_res().

◆ replace_aseed() [2/2]

template<typename M >
std::vector<std::vector<M> > casadi::FunctionInternal::replace_aseed ( const std::vector< std::vector< M >> &  aseed,
casadi_int  npar 
) const
inherited

◆ replace_fseed() [1/2]

template<typename M >
std::vector<std::vector<M> > casadi::FunctionInternal::replace_fseed ( const std::vector< std::vector< M > > &  fseed,
casadi_int  npar 
) const
inherited

Definition at line 1783 of file function_internal.hpp.

1784  {
1785  std::vector<std::vector<M> > r(fseed.size());
1786  for (casadi_int d=0; d<r.size(); ++d) r[d] = replace_arg(fseed[d], npar);
1787  return r;
1788  }

References casadi::FunctionInternal::replace_arg().

◆ replace_fseed() [2/2]

template<typename M >
std::vector<std::vector<M> > casadi::FunctionInternal::replace_fseed ( const std::vector< std::vector< M >> &  fseed,
casadi_int  npar 
) const
inherited

◆ replace_res()

template<typename M >
std::vector< M > casadi::FunctionInternal::replace_res ( const std::vector< M > &  res,
casadi_int  npar 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_kp

Definition at line 1775 of file function_internal.hpp.

1776  {
1777  std::vector<M> r(res.size());
1778  for (casadi_int i=0; i<r.size(); ++i) r[i] = replace_mat(res[i], sparsity_out(i), npar);
1779  return r;
1780  }

References casadi::replace_mat(), and casadi::FunctionInternal::sparsity_out().

Referenced by casadi::FunctionInternal::nz_out(), and casadi::FunctionInternal::replace_aseed().

◆ reverse()

Function casadi::FunctionInternal::reverse ( casadi_int  nadj) const
inherited

reverse(nadj) returns a cached instance if available, and calls Function get_reverse(casadi_int nadj) if no cached version is available.

Extra doc: https://github.com/casadi/casadi/wiki/L_l1

Definition at line 2140 of file function_internal.cpp.

2140  {
2141  casadi_assert_dev(nadj>=0);
2142  // Used wrapped function if reverse not available
2143  if (!enable_reverse_) {
2144  // Derivative information must be available
2145  casadi_assert(has_derivative(), "Derivatives cannot be calculated for " + name_);
2146  return wrap().reverse(nadj);
2147  }
2148  // Retrieve/generate cached
2149  Function f;
2150  std::string fname = reverse_name(name_, nadj);
2151  if (!incache(fname, f)) {
2152  casadi_int i;
2153  // Prefix to be used for adjoint seeds, sensitivities
2154  std::string pref = diff_prefix("adj");
2155  // Names of inputs
2156  std::vector<std::string> inames;
2157  for (i=0; i<n_in_; ++i) inames.push_back(name_in_[i]);
2158  for (i=0; i<n_out_; ++i) inames.push_back("out_" + name_out_[i]);
2159  for (i=0; i<n_out_; ++i) inames.push_back(pref + name_out_[i]);
2160  // Names of outputs
2161  std::vector<std::string> onames;
2162  for (casadi_int i=0; i<n_in_; ++i) onames.push_back(pref + name_in_[i]);
2163  // Options
2165  opts = combine(opts, generate_options("reverse"));
2166  opts["derivative_of"] = self();
2167  // Generate derivative function
2168  casadi_assert_dev(enable_reverse_);
2169  f = get_reverse(nadj, fname, inames, onames, opts);
2170  // Consistency check for inputs
2171  casadi_assert_dev(f.n_in()==n_in_ + n_out_ + n_out_);
2172  casadi_int ind=0;
2173  for (i=0; i<n_in_; ++i) f.assert_size_in(ind++, size1_in(i), size2_in(i));
2174  for (i=0; i<n_out_; ++i) f.assert_size_in(ind++, size1_out(i), size2_out(i));
2175  for (i=0; i<n_out_; ++i) f.assert_size_in(ind++, size1_out(i), nadj*size2_out(i));
2176  // Consistency check for outputs
2177  casadi_assert_dev(f.n_out()==n_in_);
2178  for (i=0; i<n_in_; ++i) f.assert_sparsity_out(i, sparsity_in(i), nadj);
2179  // Save to cache
2180  tocache_if_missing(f);
2181  }
2182  return f;
2183  }
virtual Function get_reverse(casadi_int nadj, const std::string &name, const std::vector< std::string > &inames, const std::vector< std::string > &onames, const Dict &opts) const
Return function that calculates adjoint derivatives.
static std::string reverse_name(const std::string &fcn, casadi_int nadj)
Helper function: Get name of adjoint derivative function.
Function reverse(casadi_int nadj) const
Get a function that calculates nadj adjoint derivatives.
Definition: function.cpp:1143

References casadi::Function::assert_size_in(), casadi::Function::assert_sparsity_out(), casadi::combine(), casadi::FunctionInternal::der_options_, casadi::FunctionInternal::diff_prefix(), casadi::FunctionInternal::enable_reverse_, casadi::FunctionInternal::generate_options(), casadi::FunctionInternal::get_reverse(), casadi::FunctionInternal::has_derivative(), casadi::FunctionInternal::incache(), casadi::Function::n_in(), casadi::FunctionInternal::n_in_, casadi::Function::n_out(), casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::FunctionInternal::name_in_, casadi::FunctionInternal::name_out_, casadi::Function::reverse(), casadi::FunctionInternal::reverse_name(), casadi::FunctionInternal::reverse_options_, casadi::FunctionInternal::size1_in(), casadi::FunctionInternal::size1_out(), casadi::FunctionInternal::size2_in(), casadi::FunctionInternal::size2_out(), casadi::FunctionInternal::sparsity_in(), casadi::FunctionInternal::tocache_if_missing(), and casadi::FunctionInternal::wrap().

Referenced by casadi::FunctionInternal::call_reverse(), and casadi::Function::reverse().

◆ reverse_name()

static std::string casadi::FunctionInternal::reverse_name ( const std::string &  fcn,
casadi_int  nadj 
)
inlinestaticinherited

Definition at line 657 of file function_internal.hpp.

657  {
658  return "adj" + str(nadj) + "_" + fcn;
659  }

References casadi::str().

Referenced by casadi::FunctionInternal::reverse(), and casadi::FixedStepIntegrator::stepB().

◆ self()

Function casadi::FunctionInternal::self ( ) const
inlineinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_k8

Definition at line 348 of file function_internal.hpp.

348 { return shared_from_this<Function>();}

◆ serialize()

void casadi::ProtoFunction::serialize ( SerializingStream s) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_jv

Definition at line 4090 of file function_internal.cpp.

4090  {
4091  serialize_type(s);
4092  serialize_body(s);
4093  }
virtual void serialize_type(SerializingStream &s) const
Serialize type information.
virtual void serialize_body(SerializingStream &s) const
Serialize an object without type information.

References casadi::ProtoFunction::serialize_body(), and casadi::ProtoFunction::serialize_type().

◆ serialize_base_function()

virtual std::string casadi::ProtoFunction::serialize_base_function ( ) const
inlinevirtualinherited

◆ serialize_body()

void casadi::FunctionInternal::serialize_body ( SerializingStream s) const
overridevirtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_m7

Reimplemented from casadi::ProtoFunction.

Reimplemented in casadi::Sqpmethod, casadi::RungeKutta, casadi::Qrqp, casadi::QpToNlp, casadi::Newton, casadi::LinearInterpolant, casadi::Ipqp, casadi::Feasiblesqpmethod, casadi::FastNewton, casadi::Collocation, casadi::BSplineInterpolant, casadi::WorhpInterface, casadi::SuperscsInterface, casadi::SundialsInterface, casadi::IdasInterface, casadi::CvodesInterface, casadi::SnoptInterface, casadi::SLEQPInterface, casadi::QpoasesInterface, casadi::ProxqpInterface, casadi::OsqpInterface, casadi::OoqpInterface, casadi::MadnlpInterface, casadi::KnitroInterface, casadi::IpoptInterface, casadi::HpipmInterface, casadi::HighsInterface, casadi::GurobiInterface, casadi::FatropInterface, casadi::FatropConicInterface, casadi::DaqpInterface, casadi::CplexInterface, casadi::ClpInterface, casadi::ClarabelInterface, casadi::CbcInterface, casadi::BonminInterface, casadi::Blocksqp, casadi::AlpaqaInterface, casadi::XFunction< DerivedType, MatType, NodeType >, casadi::XFunction< MXFunction, MX, MXNode >, casadi::XFunction< SXFunction, Matrix< SXElem >, SXNode >, casadi::SXFunction, casadi::Switch, casadi::Rootfinder, casadi::OracleFunction, casadi::Nlpsol, casadi::MXFunction, casadi::MapSum, casadi::Map, casadi::Interpolant, casadi::ImplicitFixedStepIntegrator, casadi::FixedStepIntegrator, and casadi::Integrator.

Definition at line 3902 of file function_internal.cpp.

3902  {
3904  s.version("FunctionInternal", 6);
3905  s.pack("FunctionInternal::is_diff_in", is_diff_in_);
3906  s.pack("FunctionInternal::is_diff_out", is_diff_out_);
3907  s.pack("FunctionInternal::sp_in", sparsity_in_);
3908  s.pack("FunctionInternal::sp_out", sparsity_out_);
3909  s.pack("FunctionInternal::name_in", name_in_);
3910  s.pack("FunctionInternal::name_out", name_out_);
3911 
3912  s.pack("FunctionInternal::jit", jit_);
3913  s.pack("FunctionInternal::jit_cleanup", jit_cleanup_);
3914  s.pack("FunctionInternal::jit_serialize", jit_serialize_);
3915  if (jit_serialize_=="link" || jit_serialize_=="embed") {
3916  s.pack("FunctionInternal::jit_library", compiler_.library());
3917  if (jit_serialize_=="embed") {
3918  std::ifstream binary(compiler_.library(), std::ios_base::binary);
3919  casadi_assert(binary.good(), "Could not open library '" + compiler_.library() + "'.");
3920  s.pack("FunctionInternal::jit_binary", binary);
3921  }
3922  }
3923  s.pack("FunctionInternal::jit_temp_suffix", jit_temp_suffix_);
3924  s.pack("FunctionInternal::jit_base_name", jit_base_name_);
3925  s.pack("FunctionInternal::jit_options", jit_options_);
3926  s.pack("FunctionInternal::compiler_plugin", compiler_plugin_);
3927  s.pack("FunctionInternal::has_refcount", has_refcount_);
3928 
3929  s.pack("FunctionInternal::cache_init", cache_init_);
3930 
3931  s.pack("FunctionInternal::derivative_of", derivative_of_);
3932 
3933  s.pack("FunctionInternal::jac_penalty", jac_penalty_);
3934 
3935  s.pack("FunctionInternal::enable_forward", enable_forward_);
3936  s.pack("FunctionInternal::enable_reverse", enable_reverse_);
3937  s.pack("FunctionInternal::enable_jacobian", enable_jacobian_);
3938  s.pack("FunctionInternal::enable_fd", enable_fd_);
3939  s.pack("FunctionInternal::enable_forward_op", enable_forward_op_);
3940  s.pack("FunctionInternal::enable_reverse_op", enable_reverse_op_);
3941  s.pack("FunctionInternal::enable_jacobian_op", enable_jacobian_op_);
3942  s.pack("FunctionInternal::enable_fd_op", enable_fd_op_);
3943 
3944  s.pack("FunctionInternal::ad_weight", ad_weight_);
3945  s.pack("FunctionInternal::ad_weight_sp", ad_weight_sp_);
3946  s.pack("FunctionInternal::always_inline", always_inline_);
3947  s.pack("FunctionInternal::never_inline", never_inline_);
3948 
3949  s.pack("FunctionInternal::max_num_dir", max_num_dir_);
3950 
3951  s.pack("FunctionInternal::inputs_check", inputs_check_);
3952 
3953  s.pack("FunctionInternal::fd_step", fd_step_);
3954 
3955  s.pack("FunctionInternal::fd_method", fd_method_);
3956  s.pack("FunctionInternal::print_in", print_in_);
3957  s.pack("FunctionInternal::print_out", print_out_);
3958  s.pack("FunctionInternal::max_io", max_io_);
3959  s.pack("FunctionInternal::dump_in", dump_in_);
3960  s.pack("FunctionInternal::dump_out", dump_out_);
3961  s.pack("FunctionInternal::dump_dir", dump_dir_);
3962  s.pack("FunctionInternal::dump_format", dump_format_);
3963  s.pack("FunctionInternal::forward_options", forward_options_);
3964  s.pack("FunctionInternal::reverse_options", reverse_options_);
3965  s.pack("FunctionInternal::jacobian_options", jacobian_options_);
3966  s.pack("FunctionInternal::der_options", der_options_);
3967  s.pack("FunctionInternal::custom_jacobian", custom_jacobian_);
3968 
3969  s.pack("FunctionInternal::sz_arg_per", sz_arg_per_);
3970  s.pack("FunctionInternal::sz_res_per", sz_res_per_);
3971  s.pack("FunctionInternal::sz_iw_per", sz_iw_per_);
3972  s.pack("FunctionInternal::sz_w_per", sz_w_per_);
3973  s.pack("FunctionInternal::sz_arg_tmp", sz_arg_tmp_);
3974  s.pack("FunctionInternal::sz_res_tmp", sz_res_tmp_);
3975  s.pack("FunctionInternal::sz_iw_tmp", sz_iw_tmp_);
3976  s.pack("FunctionInternal::sz_w_tmp", sz_w_tmp_);
3977  }
bool has_refcount_
Reference counting in codegen?
Dict cache_init_
Values to prepopulate the function cache with.
std::string library() const
Get library name.
Definition: importer.cpp:99

References casadi::FunctionInternal::ad_weight_, casadi::FunctionInternal::ad_weight_sp_, casadi::FunctionInternal::always_inline_, casadi::FunctionInternal::cache_init_, casadi::FunctionInternal::compiler_, casadi::FunctionInternal::compiler_plugin_, casadi::FunctionInternal::custom_jacobian_, casadi::FunctionInternal::der_options_, casadi::FunctionInternal::derivative_of_, casadi::FunctionInternal::dump_dir_, casadi::FunctionInternal::dump_format_, casadi::FunctionInternal::dump_in_, casadi::FunctionInternal::dump_out_, casadi::FunctionInternal::enable_fd_, casadi::FunctionInternal::enable_fd_op_, casadi::FunctionInternal::enable_forward_, casadi::FunctionInternal::enable_forward_op_, casadi::FunctionInternal::enable_jacobian_, casadi::FunctionInternal::enable_jacobian_op_, casadi::FunctionInternal::enable_reverse_, casadi::FunctionInternal::enable_reverse_op_, casadi::FunctionInternal::fd_method_, casadi::FunctionInternal::fd_step_, casadi::FunctionInternal::forward_options_, casadi::FunctionInternal::has_refcount_, casadi::FunctionInternal::inputs_check_, casadi::FunctionInternal::is_diff_in_, casadi::FunctionInternal::is_diff_out_, casadi::FunctionInternal::jac_penalty_, casadi::FunctionInternal::jacobian_options_, casadi::FunctionInternal::jit_, casadi::FunctionInternal::jit_base_name_, casadi::FunctionInternal::jit_cleanup_, casadi::FunctionInternal::jit_options_, casadi::FunctionInternal::jit_serialize_, casadi::FunctionInternal::jit_temp_suffix_, casadi::Importer::library(), casadi::FunctionInternal::max_io_, casadi::FunctionInternal::max_num_dir_, casadi::FunctionInternal::name_in_, casadi::FunctionInternal::name_out_, casadi::FunctionInternal::never_inline_, casadi::SerializingStream::pack(), casadi::FunctionInternal::print_in_, casadi::FunctionInternal::print_out_, casadi::FunctionInternal::reverse_options_, casadi::ProtoFunction::serialize_body(), casadi::FunctionInternal::sparsity_in_, casadi::FunctionInternal::sparsity_out_, and casadi::SerializingStream::version().

Referenced by casadi::BlazingSplineFunction::serialize_body(), casadi::Conic::serialize_body(), casadi::External::serialize_body(), casadi::FmuFunction::serialize_body(), casadi::Interpolant::serialize_body(), casadi::Map::serialize_body(), casadi::MapSum::serialize_body(), casadi::OracleFunction::serialize_body(), casadi::Switch::serialize_body(), and casadi::XFunction< DerivedType, MatType, NodeType >::serialize_body().

◆ serialize_type() [1/2]

void casadi::PluginInterface< Expm >::serialize_type ( SerializingStream s) const
inlineinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_rq

Definition at line 114 of file plugin_interface.hpp.

114  {
115  s.pack("PluginInterface::plugin_name", std::string(plugin_name()));
116  }

◆ serialize_type() [2/2]

void casadi::FunctionInternal::serialize_type ( SerializingStream s) const
overridevirtualinherited

◆ set_jac_sparsity()

void casadi::FunctionInternal::set_jac_sparsity ( casadi_int  oind,
casadi_int  iind,
const Sparsity sp 
)
protectedinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_nx

Definition at line 3677 of file function_internal.cpp.

3677  {
3678 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
3679  // Safe access to jac_sparsity_
3680  std::lock_guard<std::mutex> lock(jac_sparsity_mtx_);
3681 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
3682  casadi_int ind = iind + oind * n_in_;
3683  jac_sparsity_[false].resize(n_in_ * n_out_);
3684  jac_sparsity_[false].at(ind) = sp;
3685  jac_sparsity_[true].resize(n_in_ * n_out_);
3686  jac_sparsity_[true].at(ind) = to_compact(oind, iind, sp);
3687  }

References casadi::FunctionInternal::jac_sparsity_, casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, and casadi::FunctionInternal::to_compact().

◆ set_temp()

virtual void casadi::FunctionInternal::set_temp ( void *  mem,
const double **  arg,
double **  res,
casadi_int *  iw,
double *  w 
) const
inlinevirtualinherited

◆ set_work()

void casadi::SlicotExpm::set_work ( void *  mem,
const double **&  arg,
double **&  res,
casadi_int *&  iw,
double *&  w 
) const
overridevirtual

Reimplemented from casadi::FunctionInternal.

Definition at line 84 of file slicot_expm.cpp.

85  {
86  auto m = static_cast<SlicotExpmMemory*>(mem);
87 
88  // Set work in base classes
89  Expm::set_work(mem, arg, res, iw, w);
90 
91  m->A = w; w += n_*n_;
92  m->H = w; w += n_*n_;
93  m->dwork = w;
94  m->iwork = reinterpret_cast<int*>(iw);
95  }
virtual void set_work(void *mem, const double **&arg, double **&res, casadi_int *&iw, double *&w) const
Set the (persistent) work vectors.

References casadi::FunctionInternal::set_work().

◆ setup()

void casadi::FunctionInternal::setup ( void *  mem,
const double **  arg,
double **  res,
casadi_int *  iw,
double *  w 
) const
inherited

◆ shared_from_this() [1/2]

B casadi::GenericSharedInternal< SharedObject , SharedObjectInternal >::shared_from_this ( )
inlineprotectedinherited

Definition at line 83 of file generic_shared_internal.hpp.

83  {
84  casadi_assert_dev(B::test_cast(static_cast<Internal*>(this)));
85  B ret;
86  ret.own(static_cast<Internal*>(this));
87  return ret;
88  }

◆ shared_from_this() [2/2]

const B casadi::GenericSharedInternal< SharedObject , SharedObjectInternal >::shared_from_this ( ) const
inlineprotectedinherited

Definition at line 92 of file generic_shared_internal.hpp.

92  {
93  casadi_assert_dev(B::test_cast(static_cast<const Internal*>(this)));
94  B ret;
95  ret.own(const_cast<Internal*>(static_cast<const Internal*>(this)));
96  return ret;
97  }

◆ shortname()

static std::string casadi::Expm::shortname ( )
inlinestaticinherited

Definition at line 118 of file expm_impl.hpp.

118 { return "expm";}

◆ signature()

std::string casadi::FunctionInternal::signature ( const std::string &  fname) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ly

Definition at line 2329 of file function_internal.cpp.

2329  {
2330  return "int " + fname + "(const casadi_real** arg, casadi_real** res, "
2331  "casadi_int* iw, casadi_real* w, int mem)";
2332  }

Referenced by casadi::CodeGenerator::add(), casadi::FunctionInternal::codegen(), and casadi::External::codegen_declarations().

◆ signature_unrolled()

std::string casadi::FunctionInternal::signature_unrolled ( const std::string &  fname) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_27o

Definition at line 2334 of file function_internal.cpp.

2334  {
2335  std::vector<std::string> args;
2336  for (auto e : name_in_) {
2337  args.push_back("const casadi_real* " + str(e));
2338  }
2339  for (auto e : name_out_) {
2340  args.push_back("casadi_real* " + str(e));
2341  }
2342  args.push_back("const casadi_real** arg");
2343  args.push_back("casadi_real** res");
2344  args.push_back("casadi_int* iw");
2345  args.push_back("casadi_real* w");
2346  args.push_back("int mem");
2347  return "int " + fname + "_unrolled(" + join(args, ", ") + ")";
2348  }
std::string join(const std::vector< std::string > &l, const std::string &delim)

References casadi::join(), casadi::FunctionInternal::name_in_, casadi::FunctionInternal::name_out_, and casadi::str().

Referenced by casadi::CodeGenerator::add().

◆ size1_in()

casadi_int casadi::FunctionInternal::size1_in ( casadi_int  ind) const
inlineinherited

◆ size1_out()

casadi_int casadi::FunctionInternal::size1_out ( casadi_int  ind) const
inlineinherited

◆ size2_in()

casadi_int casadi::FunctionInternal::size2_in ( casadi_int  ind) const
inlineinherited

◆ size2_out()

casadi_int casadi::FunctionInternal::size2_out ( casadi_int  ind) const
inlineinherited

◆ size_in()

std::pair<casadi_int, casadi_int> casadi::FunctionInternal::size_in ( casadi_int  ind) const
inlineinherited

◆ size_out()

std::pair<casadi_int, casadi_int> casadi::FunctionInternal::size_out ( casadi_int  ind) const
inlineinherited

◆ slice()

Function casadi::FunctionInternal::slice ( const std::string &  name,
const std::vector< casadi_int > &  order_in,
const std::vector< casadi_int > &  order_out,
const Dict opts 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_l2

Reimplemented in casadi::XFunction< DerivedType, MatType, NodeType >, casadi::XFunction< MXFunction, MX, MXNode >, and casadi::XFunction< SXFunction, Matrix< SXElem >, SXNode >.

Definition at line 3658 of file function_internal.cpp.

3660  {
3661  return wrap().slice(name, order_in, order_out, opts);
3662  }
Function slice(const std::string &name, const std::vector< casadi_int > &order_in, const std::vector< casadi_int > &order_out, const Dict &opts=Dict()) const
returns a new function with a selection of inputs/outputs of the original
Definition: function.cpp:747

References casadi::Function::slice(), and casadi::FunctionInternal::wrap().

Referenced by casadi::Function::slice().

◆ sp_forward()

int casadi::FunctionInternal::sp_forward ( const bvec_t **  arg,
bvec_t **  res,
casadi_int *  iw,
bvec_t w,
void *  mem 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mw

Reimplemented in casadi::BSplineInterpolant, casadi::SXFunction, casadi::Rootfinder, casadi::MXFunction, casadi::MapSum, casadi::Map, and casadi::Integrator.

Definition at line 2754 of file function_internal.cpp.

2755  {
2756  // Loop over outputs
2757  for (casadi_int oind=0; oind<n_out_; ++oind) {
2758  // Skip if nothing to assign
2759  if (res[oind]==nullptr || nnz_out(oind)==0) continue;
2760  // Clear result
2761  casadi_clear(res[oind], nnz_out(oind));
2762  // Loop over inputs
2763  for (casadi_int iind=0; iind<n_in_; ++iind) {
2764  // Skip if no seeds
2765  if (arg[iind]==nullptr || nnz_in(iind)==0) continue;
2766  // Propagate sparsity for the specific block
2767  if (sp_forward_block(arg, res, iw, w, mem, oind, iind)) return 1;
2768  }
2769  }
2770  return 0;
2771  }
virtual int sp_forward_block(const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem, casadi_int oind, casadi_int iind) const
Propagate sparsity forward, specific block.
void casadi_clear(T1 *x, casadi_int n)
CLEAR: x <- 0.

References casadi::casadi_clear(), casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::nnz_out(), and casadi::FunctionInternal::sp_forward_block().

Referenced by casadi::MXFunction::sp_forward(), casadi::SXFunction::sp_forward(), and casadi::BSplineInterpolant::sp_forward().

◆ sp_forward_block()

int casadi::FunctionInternal::sp_forward_block ( const bvec_t **  arg,
bvec_t **  res,
casadi_int *  iw,
bvec_t w,
void *  mem,
casadi_int  oind,
casadi_int  iind 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mx

Definition at line 2773 of file function_internal.cpp.

2774  {
2775  // Get the sparsity of the Jacobian block
2776  Sparsity sp = jac_sparsity(oind, iind, true, false);
2777  if (sp.is_null() || sp.nnz() == 0) return 0; // Skip if zero
2778  // Carry out the sparse matrix-vector multiplication
2779  casadi_int d1 = sp.size2();
2780  const casadi_int *colind = sp.colind(), *row = sp.row();
2781  for (casadi_int cc=0; cc<d1; ++cc) {
2782  for (casadi_int el = colind[cc]; el < colind[cc+1]; ++el) {
2783  res[oind][row[el]] |= arg[iind][cc];
2784  }
2785  }
2786  return 0;
2787  }

References casadi::Sparsity::colind(), casadi::GenericShared< Shared, Internal >::is_null(), casadi::FunctionInternal::jac_sparsity(), casadi::Sparsity::nnz(), casadi::Sparsity::row(), and casadi::Sparsity::size2().

Referenced by casadi::FunctionInternal::sp_forward().

◆ sp_reverse()

int casadi::FunctionInternal::sp_reverse ( bvec_t **  arg,
bvec_t **  res,
casadi_int *  iw,
bvec_t w,
void *  mem 
) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_my

Reimplemented in casadi::BSplineInterpolant, casadi::SXFunction, casadi::Rootfinder, casadi::MXFunction, casadi::MapSum, casadi::Map, and casadi::Integrator.

Definition at line 2789 of file function_internal.cpp.

2790  {
2791  // Loop over outputs
2792  for (casadi_int oind=0; oind<n_out_; ++oind) {
2793  // Skip if nothing to assign
2794  if (res[oind]==nullptr || nnz_out(oind)==0) continue;
2795 
2796  // Loop over inputs
2797  for (casadi_int iind=0; iind<n_in_; ++iind) {
2798  // Skip if no seeds
2799  if (arg[iind]==nullptr || nnz_in(iind)==0) continue;
2800 
2801  // Get the sparsity of the Jacobian block
2802  Sparsity sp = jac_sparsity(oind, iind, true, false);
2803  if (sp.is_null() || sp.nnz() == 0) continue; // Skip if zero
2804 
2805  // Carry out the sparse matrix-vector multiplication
2806  casadi_int d1 = sp.size2();
2807  const casadi_int *colind = sp.colind(), *row = sp.row();
2808  for (casadi_int cc=0; cc<d1; ++cc) {
2809  for (casadi_int el = colind[cc]; el < colind[cc+1]; ++el) {
2810  arg[iind][cc] |= res[oind][row[el]];
2811  }
2812  }
2813  }
2814 
2815  // Clear seeds
2816  casadi_clear(res[oind], nnz_out(oind));
2817  }
2818  return 0;
2819  }

References casadi::casadi_clear(), casadi::Sparsity::colind(), casadi::GenericShared< Shared, Internal >::is_null(), casadi::FunctionInternal::jac_sparsity(), casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::Sparsity::nnz(), casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::nnz_out(), casadi::Sparsity::row(), and casadi::Sparsity::size2().

Referenced by casadi::MXFunction::sp_reverse(), casadi::SXFunction::sp_reverse(), and casadi::BSplineInterpolant::sp_reverse().

◆ sp_weight()

double casadi::FunctionInternal::sp_weight ( ) const
virtualinherited

sparsity propagation

Extra doc: https://github.com/casadi/casadi/wiki/L_l6

Definition at line 3201 of file function_internal.cpp.

3201  {
3202  // If reverse mode propagation unavailable, use forward
3203  if (!has_sprev()) return 0;
3204 
3205  // If forward mode propagation unavailable, use reverse
3206  if (!has_spfwd()) return 1;
3207 
3208  // Use the (potentially user set) option
3209  return ad_weight_sp_;
3210  }

References casadi::FunctionInternal::ad_weight_sp_, casadi::FunctionInternal::has_spfwd(), and casadi::FunctionInternal::has_sprev().

Referenced by casadi::FunctionInternal::get_jac_sparsity(), casadi::FunctionInternal::get_jac_sparsity_hierarchical(), casadi::MXFunction::sp_forward(), casadi::SXFunction::sp_forward(), casadi::MXFunction::sp_reverse(), casadi::SXFunction::sp_reverse(), casadi::FunctionInternal::wrap(), and casadi::FunctionInternal::wrap_as_needed().

◆ sparsity_in()

const Sparsity& casadi::FunctionInternal::sparsity_in ( casadi_int  ind) const
inlineinherited

◆ sparsity_out()

const Sparsity& casadi::FunctionInternal::sparsity_out ( casadi_int  ind) const
inlineinherited

◆ sprint()

void casadi::ProtoFunction::sprint ( char *  buf,
size_t  buf_sz,
const char *  fmt,
  ... 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_js

Definition at line 3801 of file function_internal.cpp.

3801  {
3802  // Variable number of arguments
3803  va_list args;
3804  va_start(args, fmt);
3805  // Print to buffer
3806  casadi_int n = vsnprintf(buf, buf_sz, fmt, args);
3807  // Cleanup
3808  va_end(args);
3809  // Throw error if failure
3810  casadi_assert(n>=0 && n<buf_sz, "Print failure while processing '" + std::string(fmt) + "'");
3811  }

Referenced by casadi::ProtoFunction::format_time(), and casadi::ProtoFunction::print_time().

◆ string_from_UnifiedReturnStatus()

std::string casadi::FunctionInternal::string_from_UnifiedReturnStatus ( UnifiedReturnStatus  status)
staticinherited

Definition at line 3869 of file function_internal.cpp.

3869  {
3870  switch (status) {
3871  case SOLVER_RET_LIMITED: return "SOLVER_RET_LIMITED";
3872  case SOLVER_RET_NAN: return "SOLVER_RET_NAN";
3873  case SOLVER_RET_SUCCESS: return "SOLVER_RET_SUCCESS";
3874  default: return "SOLVER_RET_UNKNOWN";
3875  }
3876  }
@ SOLVER_RET_NAN
@ SOLVER_RET_LIMITED
@ SOLVER_RET_SUCCESS

References casadi::SOLVER_RET_LIMITED, casadi::SOLVER_RET_NAN, and casadi::SOLVER_RET_SUCCESS.

Referenced by casadi::Conic::get_stats(), casadi::Nlpsol::get_stats(), and casadi::Rootfinder::get_stats().

◆ sx_in() [1/2]

const std::vector< SX > casadi::FunctionInternal::sx_in ( ) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_l7

Reimplemented in casadi::SXFunction.

Definition at line 3228 of file function_internal.cpp.

3228  {
3229  std::vector<SX> ret(n_in_);
3230  for (casadi_int i=0; i<ret.size(); ++i) {
3231  ret[i] = sx_in(i);
3232  }
3233  return ret;
3234  }
virtual const std::vector< SX > sx_in() const
Get function input(s) and output(s)

References casadi::FunctionInternal::n_in_.

◆ sx_in() [2/2]

const SX casadi::FunctionInternal::sx_in ( casadi_int  ind) const
virtualinherited

◆ sx_out() [1/2]

const std::vector< SX > casadi::FunctionInternal::sx_out ( ) const
virtualinherited

Extra doc: https://github.com/casadi/casadi/wiki/L_l7

Definition at line 3236 of file function_internal.cpp.

3236  {
3237  std::vector<SX> ret(n_out_);
3238  for (casadi_int i=0; i<ret.size(); ++i) {
3239  ret[i] = sx_out(i);
3240  }
3241  return ret;
3242  }
virtual const std::vector< SX > sx_out() const
Get function input(s) and output(s)

References casadi::FunctionInternal::n_out_.

◆ sx_out() [2/2]

const SX casadi::FunctionInternal::sx_out ( casadi_int  ind) const
virtualinherited

◆ symbolic_output()

std::vector< MX > casadi::FunctionInternal::symbolic_output ( const std::vector< MX > &  arg) const
virtualinherited

Reimplemented in casadi::MXFunction.

Definition at line 1066 of file function_internal.cpp.

1066  {
1067  return self()(arg);
1068  }

Referenced by casadi::MXFunction::symbolic_output().

◆ symbolicAdjSeed()

template<typename MatType >
std::vector< std::vector< MatType > > casadi::FunctionInternal::symbolicAdjSeed ( casadi_int  nadj,
const std::vector< MatType > &  v 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_ns

Definition at line 1512 of file function_internal.hpp.

1513  {
1514  std::vector<std::vector<MatType> > aseed(nadj, v);
1515  for (casadi_int dir=0; dir<nadj; ++dir) {
1516  // Replace symbolic inputs
1517  casadi_int oind=0;
1518  for (typename std::vector<MatType>::iterator i=aseed[dir].begin();
1519  i!=aseed[dir].end();
1520  ++i, ++oind) {
1521  // Name of the adjoint seed
1522  std::stringstream ss;
1523  ss << "a";
1524  if (nadj>1) ss << dir << "_";
1525  ss << oind;
1526 
1527  // Save to matrix
1528  *i = MatType::sym(ss.str(), is_diff_out_[oind] ? i->sparsity() : Sparsity(i->size()));
1529 
1530  }
1531  }
1532  return aseed;
1533  }

References casadi::FunctionInternal::is_diff_out_.

◆ sz_arg()

size_t casadi::FunctionInternal::sz_arg ( ) const
inlineinherited

◆ sz_iw()

size_t casadi::FunctionInternal::sz_iw ( ) const
inlineinherited

◆ sz_res()

size_t casadi::FunctionInternal::sz_res ( ) const
inlineinherited

◆ sz_w()

size_t casadi::FunctionInternal::sz_w ( ) const
inlineinherited

◆ sz_work()

void casadi::FunctionInternal::sz_work ( size_t &  sz_arg,
size_t &  sz_res,
size_t &  sz_iw,
size_t &  sz_w 
) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_mz

Definition at line 2821 of file function_internal.cpp.

2822  {
2823  sz_arg = this->sz_arg();
2824  sz_res = this->sz_res();
2825  sz_iw = this->sz_iw();
2826  sz_w = this->sz_w();
2827  }

References casadi::FunctionInternal::sz_arg(), casadi::FunctionInternal::sz_iw(), casadi::FunctionInternal::sz_res(), and casadi::FunctionInternal::sz_w().

◆ to_compact()

Sparsity casadi::FunctionInternal::to_compact ( casadi_int  oind,
casadi_int  iind,
const Sparsity sp 
) const
inherited

Definition at line 1837 of file function_internal.cpp.

1838  {
1839  // Strip rows and columns
1840  std::vector<casadi_int> mapping;
1841  return sp.sub(sparsity_out(oind).find(), sparsity_in(iind).find(), mapping);
1842  }

References casadi::FunctionInternal::find(), casadi::FunctionInternal::sparsity_in(), casadi::FunctionInternal::sparsity_out(), and casadi::Sparsity::sub().

Referenced by casadi::FunctionInternal::jac_sparsity(), and casadi::FunctionInternal::set_jac_sparsity().

◆ tocache()

void casadi::FunctionInternal::tocache ( const Function f,
const std::string &  suffix = "" 
) const
inherited

◆ tocache_if_missing()

void casadi::FunctionInternal::tocache_if_missing ( Function f,
const std::string &  suffix = "" 
) const
inherited

◆ uses_output()

virtual bool casadi::FunctionInternal::uses_output ( ) const
inlinevirtualinherited

◆ weak()

Extra doc: https://github.com/casadi/casadi/wiki/L_1ai

Definition at line 67 of file generic_shared_internal.hpp.

191  {
192  if (weak_ref_==nullptr) {
193  weak_ref_ = new GenericWeakRef<Shared, Internal>(static_cast<Internal*>(this));
194  }
195  return weak_ref_;
196  }

◆ which_depends()

std::vector< bool > casadi::FunctionInternal::which_depends ( const std::string &  s_in,
const std::vector< std::string > &  s_out,
casadi_int  order,
bool  tr = false 
) const
virtualinherited
Parameters
[in]s_inInput name
[in]s_outOutput name(s)
[in]orderOnly 1 (linear) and 2 (nonlinear) allowed
[in]trFlip the relationship. Return which expressions contain the variables

Extra doc: https://github.com/casadi/casadi/wiki/L_k9

Reimplemented in casadi::XFunction< DerivedType, MatType, NodeType >, casadi::XFunction< MXFunction, MX, MXNode >, and casadi::XFunction< SXFunction, Matrix< SXElem >, SXNode >.

Definition at line 3644 of file function_internal.cpp.

3646  {
3647  Function f = shared_from_this<Function>();
3648  f = f.wrap();
3649  return f.which_depends(s_in, s_out, order, tr);
3650  }

References casadi::Function::which_depends(), and casadi::Function::wrap().

◆ wrap()

Function casadi::FunctionInternal::wrap ( ) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_li

Definition at line 1044 of file function_internal.cpp.

1044  {
1045  Function f;
1046  std::string fname = "wrap_" + name_;
1047  if (!incache(fname, f)) {
1048  // Options
1049  Dict opts;
1050  opts["derivative_of"] = derivative_of_;
1051  opts["ad_weight"] = ad_weight();
1052  opts["ad_weight_sp"] = sp_weight();
1053  opts["max_num_dir"] = max_num_dir_;
1054  opts["is_diff_in"] = is_diff_in_;
1055  opts["is_diff_out"] = is_diff_out_;
1056  // Wrap the function
1057  std::vector<MX> arg = mx_in();
1058  std::vector<MX> res = self()(arg);
1059  f = Function(fname, arg, res, name_in_, name_out_, opts);
1060  // Save in cache
1061  tocache_if_missing(f);
1062  }
1063  return f;
1064  }

References casadi::FunctionInternal::ad_weight(), casadi::FunctionInternal::derivative_of_, casadi::FunctionInternal::Function, casadi::FunctionInternal::incache(), casadi::FunctionInternal::is_diff_in_, casadi::FunctionInternal::is_diff_out_, casadi::FunctionInternal::max_num_dir_, casadi::FunctionInternal::mx_in(), casadi::ProtoFunction::name_, casadi::FunctionInternal::name_in_, casadi::FunctionInternal::name_out_, casadi::FunctionInternal::sp_weight(), and casadi::FunctionInternal::tocache_if_missing().

Referenced by casadi::FunctionInternal::eval_mx(), casadi::FunctionInternal::factory(), casadi::FunctionInternal::forward(), casadi::FunctionInternal::jacobian(), casadi::FunctionInternal::reverse(), casadi::FunctionInternal::slice(), and casadi::Function::wrap().

◆ wrap_as_needed()

Function casadi::FunctionInternal::wrap_as_needed ( const Dict opts) const
inherited

Extra doc: https://github.com/casadi/casadi/wiki/L_lj

Definition at line 1026 of file function_internal.cpp.

1026  {
1027  if (opts.empty()) return shared_from_this<Function>();
1028  std::string fname = "wrap_" + name_;
1029  // Options
1030  Dict my_opts = opts;
1031  my_opts["derivative_of"] = derivative_of_;
1032  if (my_opts.find("ad_weight")==my_opts.end())
1033  my_opts["ad_weight"] = ad_weight();
1034  if (my_opts.find("ad_weight_sp")==my_opts.end())
1035  my_opts["ad_weight_sp"] = sp_weight();
1036  if (my_opts.find("max_num_dir")==my_opts.end())
1037  my_opts["max_num_dir"] = max_num_dir_;
1038  // Wrap the function
1039  std::vector<MX> arg = mx_in();
1040  std::vector<MX> res = self()(arg);
1041  return Function(fname, arg, res, name_in_, name_out_, my_opts);
1042  }

References casadi::FunctionInternal::ad_weight(), casadi::FunctionInternal::derivative_of_, casadi::FunctionInternal::Function, casadi::FunctionInternal::max_num_dir_, casadi::FunctionInternal::mx_in(), casadi::ProtoFunction::name_, casadi::FunctionInternal::name_in_, casadi::FunctionInternal::name_out_, and casadi::FunctionInternal::sp_weight().

Referenced by casadi::Function::wrap_as_needed().

Member Data Documentation

◆ A_

Sparsity casadi::Expm::A_
protectedinherited

◆ ad_weight_

double casadi::FunctionInternal::ad_weight_
inherited

◆ ad_weight_sp_

double casadi::FunctionInternal::ad_weight_sp_
inherited

◆ always_inline_

bool casadi::FunctionInternal::always_inline_
inherited

◆ cache_

WeakCache<std::string, Function> casadi::FunctionInternal::cache_
mutableinherited

◆ cache_init_

Dict casadi::FunctionInternal::cache_init_
inherited

◆ checkout_

casadi_checkout_t casadi::FunctionInternal::checkout_
inherited

◆ compiler_

Importer casadi::FunctionInternal::compiler_
inherited

◆ compiler_plugin_

std::string casadi::FunctionInternal::compiler_plugin_
inherited

◆ const_A_

bool casadi::Expm::const_A_
protectedinherited

◆ custom_jacobian_

Function casadi::FunctionInternal::custom_jacobian_
inherited

◆ der_options_

Dict casadi::FunctionInternal::der_options_
inherited

◆ derivative_of_

Function casadi::FunctionInternal::derivative_of_
inherited

◆ deserialize_map

std::map< std::string, ProtoFunction *(*)(DeserializingStream &)> casadi::FunctionInternal::deserialize_map
staticinherited
Initial value:
= {
{"MXFunction", MXFunction::deserialize},
{"SXFunction", SXFunction::deserialize},
{"Interpolant", Interpolant::deserialize},
{"Switch", Switch::deserialize},
{"Map", Map::deserialize},
{"MapSum", MapSum::deserialize},
{"Nlpsol", Nlpsol::deserialize},
{"Rootfinder", Rootfinder::deserialize},
{"Integrator", Integrator::deserialize},
{"External", External::deserialize},
{"Conic", Conic::deserialize},
{"FmuFunction", FmuFunction::deserialize},
{"BlazingSplineFunction", BlazingSplineFunction::deserialize}
}
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
void deserialize(DeserializingStream &s, SDPToSOCPMem &m)
Definition: conic.cpp:729
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
Definition: external.cpp:512
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize without type information.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
Definition: mapsum.cpp:85
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
Definition: map.cpp:103
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
Definition: nlpsol.cpp:1341
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
Definition: rootfinder.cpp:592
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize without type information.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize without type information.
Definition: switch.hpp:150

Definition at line 1447 of file function_internal.hpp.

Referenced by casadi::FunctionInternal::deserialize().

◆ dump_

bool casadi::FunctionInternal::dump_
inherited

◆ dump_count_

casadi_int casadi::FunctionInternal::dump_count_
mutableinherited

Definition at line 1402 of file function_internal.hpp.

Referenced by casadi::FunctionInternal::FunctionInternal().

◆ dump_dir_

std::string casadi::FunctionInternal::dump_dir_
inherited

◆ dump_format_

std::string casadi::FunctionInternal::dump_format_
inherited

◆ dump_in_

bool casadi::FunctionInternal::dump_in_
inherited

◆ dump_out_

bool casadi::FunctionInternal::dump_out_
inherited

◆ enable_fd_

bool casadi::FunctionInternal::enable_fd_
inherited

◆ enable_fd_op_

bool casadi::FunctionInternal::enable_fd_op_
inherited

◆ enable_forward_

bool casadi::FunctionInternal::enable_forward_
inherited

◆ enable_forward_op_

bool casadi::FunctionInternal::enable_forward_op_
inherited

◆ enable_jacobian_

bool casadi::FunctionInternal::enable_jacobian_
inherited

◆ enable_jacobian_op_

bool casadi::FunctionInternal::enable_jacobian_op_
inherited

◆ enable_reverse_

bool casadi::FunctionInternal::enable_reverse_
inherited

◆ enable_reverse_op_

bool casadi::FunctionInternal::enable_reverse_op_
inherited

◆ error_on_fail_

bool casadi::ProtoFunction::error_on_fail_
inherited

◆ eval_

eval_t casadi::FunctionInternal::eval_
inherited

◆ fd_method_

std::string casadi::FunctionInternal::fd_method_
inherited

◆ fd_options_

Dict casadi::FunctionInternal::fd_options_
inherited

◆ fd_step_

double casadi::FunctionInternal::fd_step_
inherited

◆ forward_options_

Dict casadi::FunctionInternal::forward_options_
inherited

◆ has_refcount_

bool casadi::FunctionInternal::has_refcount_
inherited

◆ infix_

const std::string casadi::Expm::infix_ = "expm"
staticinherited

Definition at line 115 of file expm_impl.hpp.

◆ inputs_check_

bool casadi::FunctionInternal::inputs_check_
inherited

◆ is_diff_in_

std::vector<bool> casadi::FunctionInternal::is_diff_in_
inherited

◆ is_diff_out_

std::vector<bool> casadi::FunctionInternal::is_diff_out_
inherited

◆ jac_penalty_

double casadi::FunctionInternal::jac_penalty_
inherited

◆ jac_sparsity_

std::vector<Sparsity> casadi::FunctionInternal::jac_sparsity_[2]
mutableinherited

◆ jacobian_options_

Dict casadi::FunctionInternal::jacobian_options_
inherited

◆ jit_

bool casadi::FunctionInternal::jit_
inherited

◆ jit_base_name_

std::string casadi::FunctionInternal::jit_base_name_
inherited

◆ jit_cleanup_

bool casadi::FunctionInternal::jit_cleanup_
inherited

◆ jit_name_

std::string casadi::FunctionInternal::jit_name_
inherited

◆ jit_options_

Dict casadi::FunctionInternal::jit_options_
inherited

◆ jit_serialize_

std::string casadi::FunctionInternal::jit_serialize_
inherited

◆ jit_temp_suffix_

bool casadi::FunctionInternal::jit_temp_suffix_
inherited

◆ max_io_

casadi_int casadi::FunctionInternal::max_io_
inherited

◆ max_num_dir_

casadi_int casadi::FunctionInternal::max_num_dir_
inherited

◆ meta_doc

const std::string casadi::SlicotExpm::meta_doc
static
Initial value:
=
"\n"
"\n"
"\n"
"Extra doc: https://github.com/casadi/casadi/wiki/L_22l \n"
"\n"
"\n"

Definition at line 117 of file slicot_expm.hpp.

Referenced by casadi::casadi_register_expm_slicot().

◆ n_in_

size_t casadi::FunctionInternal::n_in_
inherited

Definition at line 1261 of file function_internal.hpp.

Referenced by casadi::SXFunction::ad_forward(), casadi::Rootfinder::ad_reverse(), casadi::MXFunction::ad_reverse(), casadi::SXFunction::ad_reverse(), casadi::FunctionInternal::all_scalar(), casadi::KinsolInterface::bjac(), casadi::FunctionInternal::call_forward(), casadi::FunctionInternal::call_gen(), casadi::FunctionInternal::call_reverse(), casadi::SXFunction::call_setup(), casadi::FunctionInternal::check_arg(), casadi::JitFunction::codegen_body(), casadi::Map::codegen_body(), casadi::OmpMap::codegen_body(), casadi::MapSum::codegen_body(), casadi::MXFunction::codegen_body(), casadi::Switch::codegen_body(), casadi::SXFunction::codegen_body(), casadi::FastNewton::codegen_body(), casadi::FunctionInternal::codegen_meta(), casadi::FunctionInternal::convert_arg(), casadi::FunctionInternal::definition(), casadi::KinsolInterface::djac(), casadi::FunctionInternal::dm_in(), casadi::FunctionInternal::eval(), casadi::OmpMap::eval(), casadi::MXFunction::eval(), casadi::Switch::eval(), casadi::FunctionInternal::eval_gen(), casadi::Map::eval_gen(), casadi::MapSum::eval_gen(), casadi::MXFunction::eval_mx(), casadi::SXFunction::eval_mx(), casadi::Switch::eval_sx(), casadi::SXFunction::export_code_body(), casadi::CallbackInternal::finalize(), casadi::FmuFunction::FmuFunction(), casadi::FunctionInternal::forward(), casadi::KinsolInterface::func(), casadi::FunctionInternal::FunctionInternal(), casadi::FunctionInternal::fwd_seed(), casadi::FunctionInternal::generate_in(), casadi::GenericExternal::get_jac_sparsity(), casadi::GenericExternal::has_jac_sparsity(), casadi::FunctionInternal::init(), casadi::MXFunction::init(), casadi::Switch::init(), casadi::SXFunction::init(), casadi::ImplicitToNlp::init(), casadi::FunctionInternal::jac_sparsity(), casadi::FunctionInternal::jacobian(), casadi::KinsolInterface::jtimes(), casadi::FunctionInternal::mapsum_mx(), casadi::FunctionInternal::matching_arg(), casadi::FunctionInternal::mx_in(), casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::numel_in(), casadi::FunctionInternal::nz_in(), casadi::FunctionInternal::print_dimensions(), casadi::FunctionInternal::print_in(), casadi::FunctionInternal::project_arg(), casadi::KinsolInterface::psetup(), casadi::FunctionInternal::reverse(), casadi::FmuFunction::serialize_body(), casadi::FunctionInternal::set_jac_sparsity(), casadi::Rootfinder::set_work(), casadi::QpToNlp::solve(), casadi::KinsolInterface::solve(), casadi::FastNewton::solve(), casadi::ImplicitToNlp::solve(), casadi::Newton::solve(), casadi::FunctionInternal::sp_forward(), casadi::Integrator::sp_forward(), casadi::MXFunction::sp_forward(), casadi::Rootfinder::sp_forward(), casadi::FunctionInternal::sp_reverse(), casadi::Integrator::sp_reverse(), casadi::Map::sp_reverse(), casadi::MapSum::sp_reverse(), casadi::MXFunction::sp_reverse(), casadi::Rootfinder::sp_reverse(), and casadi::FunctionInternal::sx_in().

◆ n_out_

size_t casadi::FunctionInternal::n_out_
inherited

Definition at line 1261 of file function_internal.hpp.

Referenced by casadi::Rootfinder::ad_forward(), casadi::MXFunction::ad_forward(), casadi::SXFunction::ad_forward(), casadi::Rootfinder::ad_reverse(), casadi::SXFunction::ad_reverse(), casadi::FunctionInternal::all_scalar(), casadi::KinsolInterface::bjac(), casadi::FunctionInternal::call(), casadi::FunctionInternal::call_forward(), casadi::FunctionInternal::call_gen(), casadi::FunctionInternal::call_reverse(), casadi::SXFunction::call_setup(), casadi::FunctionInternal::check_res(), casadi::JitFunction::codegen_body(), casadi::Map::codegen_body(), casadi::OmpMap::codegen_body(), casadi::MapSum::codegen_body(), casadi::MXFunction::codegen_body(), casadi::Switch::codegen_body(), casadi::SXFunction::codegen_body(), casadi::FastNewton::codegen_body(), casadi::FunctionInternal::codegen_meta(), casadi::FunctionInternal::convert_res(), casadi::FunctionInternal::definition(), casadi::KinsolInterface::djac(), casadi::FunctionInternal::dm_out(), casadi::FunctionInternal::eval(), casadi::OmpMap::eval(), casadi::MXFunction::eval(), casadi::Switch::eval(), casadi::FunctionInternal::eval_gen(), casadi::Map::eval_gen(), casadi::MapSum::eval_gen(), casadi::Switch::eval_sx(), casadi::CallbackInternal::finalize(), casadi::FmuFunction::FmuFunction(), casadi::FunctionInternal::forward(), casadi::KinsolInterface::func(), casadi::FunctionInternal::FunctionInternal(), casadi::FunctionInternal::generate_out(), casadi::LinearInterpolantJac::get_jacobian(), casadi::FunctionInternal::init(), casadi::MapSum::init(), casadi::Nlpsol::init(), casadi::Switch::init(), casadi::FunctionInternal::jac_sparsity(), casadi::FunctionInternal::jacobian(), casadi::FunctionInternal::mapsum_mx(), casadi::FunctionInternal::matching_res(), casadi::FunctionInternal::mx_out(), casadi::FunctionInternal::nnz_out(), casadi::FunctionInternal::numel_out(), casadi::FunctionInternal::nz_out(), casadi::FunctionInternal::print_dimensions(), casadi::FunctionInternal::print_out(), casadi::KinsolInterface::psetup(), casadi::FunctionInternal::reverse(), casadi::FmuFunction::serialize_body(), casadi::FunctionInternal::set_jac_sparsity(), casadi::Rootfinder::set_work(), casadi::QpToNlp::solve(), casadi::KinsolInterface::solve(), casadi::FastNewton::solve(), casadi::ImplicitToNlp::solve(), casadi::Newton::solve(), casadi::FunctionInternal::sp_forward(), casadi::Integrator::sp_forward(), casadi::MXFunction::sp_forward(), casadi::Rootfinder::sp_forward(), casadi::FunctionInternal::sp_reverse(), casadi::Integrator::sp_reverse(), casadi::Map::sp_reverse(), casadi::MapSum::sp_reverse(), casadi::MXFunction::sp_reverse(), casadi::Rootfinder::sp_reverse(), and casadi::FunctionInternal::sx_out().

◆ name_

std::string casadi::ProtoFunction::name_
inherited

Definition at line 246 of file function_internal.hpp.

Referenced by casadi::MXFunction::ad_forward(), casadi::SXFunction::ad_forward(), casadi::MXFunction::ad_reverse(), casadi::SXFunction::ad_reverse(), casadi::Integrator::augmented_dae(), casadi::OracleFunction::calc_function(), casadi::FunctionInternal::call_forward(), casadi::FunctionInternal::call_reverse(), casadi::FunctionInternal::codegen_body(), casadi::External::codegen_body(), casadi::External::codegen_checkout(), casadi::External::codegen_declarations(), casadi::MXFunction::codegen_declarations(), casadi::SXFunction::codegen_declarations(), casadi::External::codegen_decref(), casadi::External::codegen_incref(), casadi::FunctionInternal::codegen_meta(), casadi::FunctionInternal::codegen_name(), casadi::External::codegen_release(), casadi::FunctionInternal::codegen_sparsities(), casadi::ProtoFunction::construct(), casadi::OracleFunction::create_function(), casadi::FunctionInternal::definition(), casadi::FunctionInternal::eval(), casadi::MXFunction::eval(), casadi::SXFunction::eval(), casadi::FunctionInternal::eval_mx(), casadi::MXFunction::eval_mx(), casadi::SXFunction::eval_mx(), casadi::SXFunction::eval_sx(), casadi::FmuFunction::factory(), casadi::FunctionInternal::finalize(), casadi::FunctionInternal::forward(), casadi::FunctionInternal::FunctionInternal(), casadi::Integrator::get_forward(), casadi::Integrator::get_forward_dae(), casadi::Map::get_function(), casadi::MapSum::get_function(), casadi::OracleFunction::get_function(), casadi::GenericExternal::get_jac_sparsity(), casadi::BlazingSplineFunction::get_jacobian(), casadi::FunctionInternal::get_n_in(), casadi::External::get_n_in(), casadi::FunctionInternal::get_n_out(), casadi::External::get_n_out(), casadi::FunctionInternal::get_name_in(), casadi::External::get_name_in(), casadi::FunctionInternal::get_name_out(), casadi::External::get_name_out(), casadi::FunctionInternal::get_partition(), casadi::Integrator::get_reverse(), casadi::FunctionInternal::get_sparsity_in(), casadi::GenericExternal::get_sparsity_in(), casadi::FunctionInternal::get_sparsity_out(), casadi::GenericExternal::get_sparsity_out(), casadi::FunctionInternal::get_stats(), casadi::External::has_forward(), casadi::GenericExternal::has_jac_sparsity(), casadi::External::has_jacobian(), casadi::External::has_reverse(), casadi::External::init(), casadi::FunctionInternal::init(), casadi::MXFunction::init(), casadi::SXFunction::init(), casadi::CvodesInterface::init(), casadi::IdasInterface::init(), casadi::External::init_external(), casadi::GenericExternal::init_external(), casadi::FunctionInternal::jac_is_symm(), casadi::FunctionInternal::jacobian(), casadi::FunctionInternal::map(), casadi::OracleFunction::monitored(), casadi::MXFunction::print_arg(), casadi::FunctionInternal::print_in(), casadi::FunctionInternal::print_out(), casadi::MXFunction::print_res(), casadi::ProtoFunction::print_time(), casadi::ProtoFunction::ProtoFunction(), casadi::CvodesInterface::reset(), casadi::IdasInterface::reset(), casadi::IdasInterface::resetB(), casadi::FunctionInternal::reverse(), casadi::ProtoFunction::serialize_body(), casadi::GurobiInterface::solve(), casadi::SnoptInterface::solve(), casadi::Integrator::sp_forward(), casadi::Integrator::sp_reverse(), casadi::FunctionInternal::wrap(), and casadi::FunctionInternal::wrap_as_needed().

◆ name_in_

std::vector<std::string> casadi::FunctionInternal::name_in_
inherited

◆ name_out_

std::vector<std::string> casadi::FunctionInternal::name_out_
inherited

◆ never_inline_

bool casadi::FunctionInternal::never_inline_
inherited

◆ options_

const Options casadi::Expm::options_
staticinherited
Initial value:
{{"const_A",
"Assume A is constant. Default: false."}}
}
}
static const Options options_
Options.

Extra doc: https://github.com/casadi/casadi/wiki/L_125

Definition at line 63 of file expm_impl.hpp.

Referenced by casadi::casadi_register_expm_slicot().

◆ print_in_

bool casadi::FunctionInternal::print_in_
inherited

◆ print_out_

bool casadi::FunctionInternal::print_out_
inherited

◆ print_time_

bool casadi::ProtoFunction::print_time_
inherited

◆ record_time_

bool casadi::ProtoFunction::record_time_
inherited

◆ regularity_check_

bool casadi::ProtoFunction::regularity_check_
inherited

◆ release_

casadi_release_t casadi::FunctionInternal::release_
inherited

◆ reverse_options_

Dict casadi::FunctionInternal::reverse_options_
inherited

◆ solvers_

std::map< std::string, Expm::Plugin > casadi::Expm::solvers_
staticinherited

Definition at line 108 of file expm_impl.hpp.

◆ sparsity_in_

std::vector<Sparsity> casadi::FunctionInternal::sparsity_in_
inherited

◆ sparsity_out_

std::vector<Sparsity> casadi::FunctionInternal::sparsity_out_
inherited

◆ stats_

Dict casadi::FunctionInternal::stats_
inherited

◆ user_data_

void* casadi::FunctionInternal::user_data_
inherited

◆ verbose_

bool casadi::ProtoFunction::verbose_
inherited

Definition at line 249 of file function_internal.hpp.

Referenced by casadi::MXFunction::ad_forward(), casadi::SXFunction::ad_forward(), casadi::MXFunction::ad_reverse(), casadi::SXFunction::ad_reverse(), casadi::Integrator::advance(), casadi::ProtoFunction::change_option(), casadi::BSplineInterpolant::construct_graph(), casadi::OracleFunction::create_function(), casadi::FmuFunction::eval(), casadi::Integrator::eval(), casadi::MXFunction::eval(), casadi::SXFunction::eval(), casadi::MXFunction::eval_mx(), casadi::SXFunction::eval_mx(), casadi::SXFunction::eval_sx(), casadi::FmuFunction::factory(), casadi::FunctionInternal::finalize(), casadi::KinsolInterface::func(), casadi::ProtoFunction::generate_options(), casadi::FmuFunction::get_forward(), casadi::Integrator::get_forward(), casadi::Integrator::get_forward_dae(), casadi::FunctionInternal::get_jac_sparsity_gen(), casadi::FunctionInternal::get_jac_sparsity_hierarchical(), casadi::FunctionInternal::get_jac_sparsity_hierarchical_symm(), casadi::FmuFunction::get_jacobian(), casadi::FunctionInternal::get_partition(), casadi::FmuFunction::get_reverse(), casadi::Integrator::get_reverse(), casadi::ProtoFunction::init(), casadi::FiniteDiff::init(), casadi::FmuFunction::init(), casadi::FunctionInternal::init(), casadi::MXFunction::init(), casadi::SXFunction::init(), casadi::Blocksqp::init(), casadi::FatropConicInterface::init(), casadi::FatropInterface::init(), casadi::HpipmInterface::init(), casadi::HpmpcInterface::init(), casadi::IpoptInterface::init(), casadi::MadnlpInterface::init(), casadi::CvodesInterface::init(), casadi::IdasInterface::init(), casadi::Feasiblesqpmethod::init(), casadi::Scpgen::init(), casadi::Sqpmethod::init(), casadi::IpoptInterface::init_mem(), casadi::IdasInterface::init_mem(), casadi::SXFunction::instructions_sx(), casadi::BonminInterface::intermediate_callback(), casadi::OracleFunction::jit_dependencies(), casadi::CsparseInterface::nfact(), casadi::LapackLu::nfact(), casadi::LapackQr::nfact(), casadi::LinsolQr::nfact(), casadi::Integrator::predict_events(), casadi::ProtoFunction::ProtoFunction(), casadi::CvodesInterface::reset(), casadi::IdasInterface::reset(), casadi::IdasInterface::resetB(), casadi::ProtoFunction::serialize_body(), casadi::CbcInterface::solve(), casadi::ClpInterface::solve(), casadi::CplexInterface::solve(), casadi::GurobiInterface::solve(), casadi::HpipmInterface::solve(), casadi::QpoasesInterface::solve(), casadi::Ipqp::solve(), casadi::Qrqp::solve(), casadi::AlpaqaInterface::solve(), casadi::AmplInterface::solve(), casadi::SnoptInterface::solve(), casadi::KinsolInterface::solve(), casadi::WorhpInterface::solve(), casadi::Newton::solve(), casadi::Qrsqp::solve(), casadi::Scpgen::solve(), casadi::Sqpmethod::solve(), casadi::Sqpmethod::solve_ela_QP(), casadi::Feasiblesqpmethod::solve_LP(), casadi::Feasiblesqpmethod::solve_QP(), casadi::Qrsqp::solve_QP(), casadi::Sqpmethod::solve_QP(), casadi::Integrator::sp_forward(), casadi::Integrator::sp_reverse(), and casadi::Integrator::trigger_event().


The documentation for this class was generated from the following files: