List of all members | Classes | Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions
casadi::Interpolant Class Referenceabstract

More...

#include <interpolant_impl.hpp>

Detailed Description

Internal class


List of available options
IdTypeDescriptionUsed in
ad_weightOT_DOUBLEWeighting factor for derivative calculation.When there is an option of either using forward or reverse mode directional derivatives, the condition ad_weight*nf<=(1-ad_weight)*na is used where nf and na are estimates of the number of forward/reverse mode directional derivatives needed. By default, ad_weight is calculated automatically, but this can be overridden by setting this option. In particular, 0 means forcing forward mode and 1 forcing reverse mode. Leave unset for (class specific) heuristics.casadi::FunctionInternal
ad_weight_spOT_DOUBLEWeighting factor for sparsity pattern calculation calculation.Overrides default behavior. Set to 0 and 1 to force forward and reverse mode respectively. Cf. option "ad_weight". When set to -1, sparsity is completely ignored and dense matrices are used.casadi::FunctionInternal
always_inlineOT_BOOLForce inlining.casadi::FunctionInternal
batch_xOT_INTEvaluate a batch of different inputs at once (default 1).casadi::Interpolant
cacheOT_DICTPrepopulate the function cache. Default: emptycasadi::FunctionInternal
compilerOT_STRINGJust-in-time compiler plugin to be used.casadi::FunctionInternal
custom_jacobianOT_FUNCTIONOverride CasADi's AD. Use together with 'jac_penalty': 0. Note: Highly experimental. Syntax may break often.casadi::FunctionInternal
der_optionsOT_DICTDefault options to be used to populate forward_options, reverse_options, and jacobian_options before those options are merged in.casadi::FunctionInternal
derivative_ofOT_FUNCTIONThe function is a derivative of another function. The type of derivative (directional derivative, Jacobian) is inferred from the function name.casadi::FunctionInternal
dumpOT_BOOLDump function to file upon first evaluation. [false]casadi::FunctionInternal
dump_dirOT_STRINGDirectory to dump inputs/outputs to. Make sure the directory exists [.]casadi::FunctionInternal
dump_formatOT_STRINGChoose file format to dump matrices. See DM.from_file [mtx]casadi::FunctionInternal
dump_inOT_BOOLDump numerical values of inputs to file (readable with DM.from_file) [default: false] A counter is used to generate unique names. The counter may be reset using reset_dump_count.casadi::FunctionInternal
dump_outOT_BOOLDump numerical values of outputs to file (readable with DM.from_file) [default: false] A counter is used to generate unique names. The counter may be reset using reset_dump_count.casadi::FunctionInternal
enable_fdOT_BOOLEnable derivative calculation by finite differencing. [default: false]]casadi::FunctionInternal
enable_forwardOT_BOOLEnable derivative calculation using generated functions for Jacobian-times-vector products - typically using forward mode AD - if available. [default: true]casadi::FunctionInternal
enable_jacobianOT_BOOLEnable derivative calculation using generated functions for Jacobians of all differentiable outputs with respect to all differentiable inputs - if available. [default: true]casadi::FunctionInternal
enable_reverseOT_BOOLEnable derivative calculation using generated functions for transposed Jacobian-times-vector products - typically using reverse mode AD - if available. [default: true]casadi::FunctionInternal
error_on_failOT_BOOLThrow exceptions when function evaluation fails (default true).casadi::ProtoFunction
external_transformOT_VECTORVECTORList of external_transform instruction arguments. Default: emptycasadi::FunctionInternal
fd_methodOT_STRINGMethod for finite differencing [default 'central']casadi::FunctionInternal
fd_optionsOT_DICTOptions to be passed to the finite difference instancecasadi::FunctionInternal
forward_optionsOT_DICTOptions to be passed to a forward mode constructorcasadi::FunctionInternal
gather_statsOT_BOOLDeprecated option (ignored): Statistics are now always collected.casadi::FunctionInternal
inlineOT_BOOLImplement the lookup table in MX primitives. Useful when you need derivatives with respect to grid and/or coefficients. Such derivatives are fundamentally dense, so use with caution.casadi::Interpolant
input_schemeOT_STRINGVECTORDeprecated option (ignored)casadi::FunctionInternal
inputs_checkOT_BOOLThrow exceptions when the numerical values of the inputs don't make sensecasadi::FunctionInternal
is_diff_inOT_BOOLVECTORIndicate for each input if it should be differentiable.casadi::FunctionInternal
is_diff_outOT_BOOLVECTORIndicate for each output if it should be differentiable.casadi::FunctionInternal
jac_penaltyOT_DOUBLEWhen requested for a number of forward/reverse directions, it may be cheaper to compute first the full jacobian and then multiply with seeds, rather than obtain the requested directions in a straightforward manner. Casadi uses a heuristic to decide which is cheaper. A high value of 'jac_penalty' makes it less likely for the heurstic to chose the full Jacobian strategy. The special value -1 indicates never to use the full Jacobian strategycasadi::FunctionInternal
jacobian_optionsOT_DICTOptions to be passed to a Jacobian constructorcasadi::FunctionInternal
jitOT_BOOLUse just-in-time compiler to speed up the evaluationcasadi::FunctionInternal
jit_cleanupOT_BOOLCleanup up the temporary source file that jit creates. Default: truecasadi::FunctionInternal
jit_nameOT_STRINGThe file name used to write out code. The actual file names used depend on 'jit_temp_suffix' and include extensions. Default: 'jit_tmp'casadi::FunctionInternal
jit_optionsOT_DICTOptions to be passed to the jit compiler.casadi::FunctionInternal
jit_serializeOT_STRINGSpecify behaviour when serializing a jitted function: SOURCE|link|embed.casadi::FunctionInternal
jit_temp_suffixOT_BOOLUse a temporary (seemingly random) filename suffix for generated code and libraries. This is desired for thread-safety. This behaviour may defeat caching compiler wrappers. Default: truecasadi::FunctionInternal
lookup_modeOT_STRINGVECTORSpecifies, for each grid dimension, the lookup algorithm used to find the correct index. 'linear' uses a for-loop + break; (default when #knots<=100), 'exact' uses floored division (only for uniform grids), 'binary' uses a binary search. (default when #knots>100).casadi::Interpolant
max_ioOT_INTAcceptable number of inputs and outputs. Warn if exceeded.casadi::FunctionInternal
max_num_dirOT_INTSpecify the maximum number of directions for derivative functions. Overrules the builtin optimized_num_dir.casadi::FunctionInternal
never_inlineOT_BOOLForbid inlining.casadi::FunctionInternal
output_schemeOT_STRINGVECTORDeprecated option (ignored)casadi::FunctionInternal
post_expandOT_BOOLAfter construction, expand this Function. Default: Falsecasadi::FunctionInternal
post_expand_optionsOT_DICTOptions to be passed to post-construction expansion. Default: emptycasadi::FunctionInternal
print_canonicalOT_BOOLWhen printing numerical matrices, use a format that is exact and reproducible in generated C code.casadi::FunctionInternal
print_inOT_BOOLPrint numerical values of inputs [default: false]casadi::FunctionInternal
print_outOT_BOOLPrint numerical values of outputs [default: false]casadi::FunctionInternal
print_timeOT_BOOLprint information about execution time. Implies record_time.casadi::ProtoFunction
record_timeOT_BOOLrecord information about execution time, for retrieval with stats().casadi::ProtoFunction
regularity_checkOT_BOOLThrow exceptions when NaN or Inf appears during evaluationcasadi::ProtoFunction
reverse_optionsOT_DICTOptions to be passed to a reverse mode constructorcasadi::FunctionInternal
user_dataOT_VOIDPTRA user-defined field that can be used to identify the function or pass additional informationcasadi::FunctionInternal
verboseOT_BOOLVerbose evaluation – for debuggingcasadi::ProtoFunction

Definition at line 40 of file interpolant_impl.hpp.

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

Classes

struct  Exposed
 

Public Types

typedef Interpolant *(* Creator) (const std::string &name, const std::vector< double > &grid, const std::vector< casadi_int > &offset, const std::vector< double > &values, casadi_int m)
 
typedef Function(* DoInline) (const std::string &name, const std::vector< double > &grid, const std::vector< casadi_int > &offset, const std::vector< double > &values, casadi_int m, const Dict &opts)
 
using weak_ref_type = WeakRefInternal
 
typedef int(* RegFcn) (Plugin *plugin)
 

Public Member Functions

 Interpolant (const std::string &name, const std::vector< double > &grid, const std::vector< casadi_int > &offset, const std::vector< double > &values, casadi_int m)
 Constructor. More...
 
 ~Interpolant () override
 Destructor. More...
 
std::string class_name () const override
 Get type name. More...
 
bool get_diff_in (casadi_int i) override
 Which inputs are differentiable? More...
 
void init (const Dict &opts) override
 Initialize. More...
 
void serialize_body (SerializingStream &s) const override
 Serialize an object without type information. More...
 
void serialize_type (SerializingStream &s) const override
 Serialize type information. More...
 
std::string serialize_base_function () const override
 String used to identify the immediate FunctionInternal subclass. More...
 
bool has_parametric_values () const
 Is parametric? More...
 
bool has_parametric_grid () const
 Is parametric? More...
 
casadi_int arg_values () const
 
casadi_int arg_grid () const
 
casadi_int coeff_size () const
 Size of the flattened coefficients vector. 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 reset_dump_count ()
 Reset the counter used to name dump files. More...
 
void finalize () override
 Finalize the object creation. More...
 
void * alloc_mem () const override
 Create memory block. More...
 
void free_mem (void *mem) const override
 Free memory block. 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 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_work (void *mem, const double **&arg, double **&res, casadi_int *&iw, double *&w) const
 Set the (persistent) work vectors. 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...
 
virtual int init_mem (void *mem) const
 Initalize memory block. 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...
 
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...
 
virtual const char * plugin_name () const=0
 
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...
 
std::string get_name_in (casadi_int i) override
 Names of function input and outputs. More...
 
std::string get_name_out (casadi_int i) override
 Names of function input and outputs. 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...
 
virtual int eval (const double **arg, double **res, casadi_int *iw, double *w, void *mem) 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...
 
virtual bool has_jac_sparsity (casadi_int oind, casadi_int iind) const
 Get Jacobian sparsity. More...
 
virtual Sparsity get_jac_sparsity (casadi_int oind, casadi_int iind, bool symmetric) const
 Get Jacobian sparsity. More...
 
Function forward (casadi_int nfwd) const
 Return function that calculates forward derivatives. More...
 
virtual bool has_forward (casadi_int nfwd) const
 Return function that calculates forward derivatives. More...
 
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. More...
 
Function reverse (casadi_int nadj) const
 Return function that calculates adjoint derivatives. More...
 
virtual bool has_reverse (casadi_int nadj) const
 Return function that calculates adjoint derivatives. More...
 
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. 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 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 std::vector< casadi_int > interpret_lookup_mode (const std::vector< std::string > &modes, const std::vector< double > &grid, const std::vector< casadi_int > &offset, const std::vector< casadi_int > &margin_left=std::vector< casadi_int >(), const std::vector< casadi_int > &margin_right=std::vector< casadi_int >())
 Convert from (optional) lookup modes labels to enum. More...
 
static void stack_grid (const std::vector< std::vector< double > > &grid, std::vector< casadi_int > &offset, std::vector< double > &stacked)
 
static void check_grid (const std::vector< std::vector< double > > &grid)
 
static void check_grid (const std::vector< casadi_int > &grid)
 
static std::vector< double > meshgrid (const std::vector< std::vector< double > > &grid)
 
static Function construct (const std::string &solver, const std::string &name, const std::vector< double > &grid, const std::vector< casadi_int > &offset, const std::vector< double > &values, casadi_int m, const Dict &opts)
 Comstruct a new Interpolant. More...
 
static ProtoFunctiondeserialize (DeserializingStream &s)
 Deserialize with type disambiguation. More...
 
static casadi_int coeff_size (const std::vector< casadi_int > &offset, casadi_int m)
 
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 void print_canonical (std::ostream &stream, const Sparsity &sp, const double *nz)
 Print canonical representation of a numeric matrix. More...
 
static void print_canonical (std::ostream &stream, casadi_int sz, const double *nz)
 Print canonical representation of a numeric vector. More...
 
static void print_canonical (std::ostream &stream, double a)
 Print canonical representation of a number. 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 Interpolantinstantiate (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

casadi_int ndim_
 
casadi_int m_
 
casadi_int batch_x_
 
std::vector< double > grid_
 
std::vector< casadi_int > offset_
 
std::vector< double > values_
 
std::vector< std::string > lookup_modes_
 
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_
 
bool print_canonical_
 
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 std::map< std::string, Plugin > solvers_
 Collection of solvers. More...
 
static const std::string infix_ = "interpolant"
 Infix. More...
 
static std::map< std::string, ProtoFunction *(*)(DeserializingStream &)> deserialize_map
 

Protected Member Functions

bool arg_values (casadi_int i) const
 
bool arg_grid (casadi_int i) const
 
 Interpolant (DeserializingStream &s)
 Deserializing constructor. More...
 
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...
 
static const Options options_
 Options. More...
 
const Optionsget_options () const override
 Options. More...
 

Member Typedef Documentation

◆ Creator

typedef Interpolant*(* casadi::Interpolant::Creator) (const std::string &name, const std::vector< double > &grid, const std::vector< casadi_int > &offset, const std::vector< double > &values, casadi_int m)

Definition at line 113 of file interpolant_impl.hpp.

◆ DoInline

typedef Function(* casadi::Interpolant::DoInline) (const std::string &name, const std::vector< double > &grid, const std::vector< casadi_int > &offset, const std::vector< double > &values, casadi_int m, const Dict &opts)

Definition at line 129 of file interpolant_impl.hpp.

◆ RegFcn

typedef int(* casadi::PluginInterface< Interpolant >::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

◆ Interpolant() [1/2]

casadi::Interpolant::Interpolant ( const std::string &  name,
const std::vector< double > &  grid,
const std::vector< casadi_int > &  offset,
const std::vector< double > &  values,
casadi_int  m 
)

Definition at line 215 of file interpolant.cpp.

221  : FunctionInternal(name), m_(m), grid_(grid), offset_(offset), values_(values) {
222  // Number of grid points
223  ndim_ = offset_.size()-1;
224  }
FunctionInternal(const std::string &name)
Constructor.
std::vector< casadi_int > offset_
std::vector< double > grid_
std::vector< double > values_

References ndim_, and offset_.

◆ ~Interpolant()

casadi::Interpolant::~Interpolant ( )
override

Definition at line 226 of file interpolant.cpp.

226  {
227  }

◆ Interpolant() [2/2]

casadi::Interpolant::Interpolant ( DeserializingStream s)
explicitprotected

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

Definition at line 368 of file interpolant.cpp.

368  : FunctionInternal(s) {
369  int version = s.version("Interpolant", 1, 2);
370  s.unpack("Interpolant::ndim", ndim_);
371  s.unpack("Interpolant::m", m_);
372  s.unpack("Interpolant::grid", grid_);
373  s.unpack("Interpolant::offset", offset_);
374  s.unpack("Interpolant::values", values_);
375  s.unpack("Interpolant::lookup_modes", lookup_modes_);
376  if (version==1) {
377  batch_x_ = 1;
378  } else {
379  s.unpack("Interpolant::batch_x", batch_x_);
380  }
381  }
std::vector< std::string > lookup_modes_

References batch_x_, grid_, lookup_modes_, m_, ndim_, offset_, casadi::DeserializingStream::unpack(), values_, and casadi::DeserializingStream::version().

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 3274 of file function_internal.cpp.

3274  {
3275  // If reverse mode derivatives unavailable, use forward
3276  if (!enable_reverse_) return 0;
3277 
3278  // If forward mode derivatives unavailable, use reverse
3279  if (!enable_forward_ && !enable_fd_) return 1;
3280 
3281  // Use the (potentially user set) option
3282  return ad_weight_;
3283  }
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 3717 of file function_internal.cpp.

3718  {
3719  // Add, if not already in graph and not null
3720  if (!dep.is_null() && all_fun.find(dep.get()) == all_fun.end()) {
3721  // Add to map
3722  all_fun[dep.get()] = dep;
3723  // Also add its dependencies
3724  if (max_depth > 0) dep->find(all_fun, max_depth - 1);
3725  }
3726  }

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 3009 of file function_internal.cpp.

3009  {
3010  if (!enable_reverse_) return true;
3011  if (jac_penalty_==-1) return false;
3012 
3013  // Heuristic 1: Jac calculated via reverse mode likely cheaper
3014  if (jac_penalty_*static_cast<double>(nnz_out())<nadj) return true;
3015 
3016  // Heuristic 2: Jac calculated via forward mode likely cheaper
3017  double w = ad_weight();
3018  if ((enable_forward_ || enable_fd_) &&
3019  jac_penalty_*w*static_cast<double>(nnz_in())<(1-w)*static_cast<double>(nadj))
3020  return true; // NOLINT
3021 
3022  return false;
3023  }
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 3748 of file function_internal.cpp.

3748  {
3749  // Check inputs
3750  for (casadi_int i=0; i<n_in_; ++i) {
3751  if (!sparsity_in_[i].is_scalar()) return false;
3752  }
3753  // Check outputs
3754  for (casadi_int i=0; i<n_out_; ++i) {
3755  if (!sparsity_out_[i].is_scalar()) return false;
3756  }
3757  // All are scalar
3758  return true;
3759  }
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 2958 of file function_internal.cpp.

2958  {
2959  if (f.is_null()) return;
2960  size_t sz_arg, sz_res, sz_iw, sz_w;
2961  f.sz_work(sz_arg, sz_res, sz_iw, sz_w);
2962  alloc_arg(sz_arg*num_threads, persistent);
2963  alloc_res(sz_res*num_threads, persistent);
2964  alloc_iw(sz_iw*num_threads, persistent);
2965  alloc_w(sz_w*num_threads, persistent);
2966  }
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::FunctionInternal::alloc_mem ( ) const
inlineoverridevirtualinherited

◆ 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 2950 of file function_internal.cpp.

2950  {
2951  if (persistent) {
2952  sz_w_per_ += sz_w;
2953  } else {
2954  sz_w_tmp_ = std::max(sz_w_tmp_, sz_w);
2955  }
2956  }

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(), 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(), casadi::SlicotExpm::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().

◆ arg_grid() [1/2]

casadi_int casadi::Interpolant::arg_grid ( ) const

Definition at line 293 of file interpolant.cpp.

293  {
294  casadi_assert_dev(has_parametric_grid());
295  return 1;
296  }
bool has_parametric_grid() const
Is parametric?

References has_parametric_grid().

Referenced by arg_grid(), casadi::LinearInterpolant::codegen_body(), casadi::LinearInterpolant::eval(), get_name_in(), and get_sparsity_in().

◆ arg_grid() [2/2]

bool casadi::Interpolant::arg_grid ( casadi_int  i) const
protected

Definition at line 284 of file interpolant.cpp.

284  {
285  if (!has_parametric_grid()) return false;
286  return arg_grid()==i;
287  }
casadi_int arg_grid() const

References arg_grid(), and has_parametric_grid().

◆ arg_values() [1/2]

casadi_int casadi::Interpolant::arg_values ( ) const

Definition at line 289 of file interpolant.cpp.

289  {
290  casadi_assert_dev(has_parametric_values());
291  return 1+has_parametric_grid();
292  }
bool has_parametric_values() const
Is parametric?

References has_parametric_grid(), and has_parametric_values().

Referenced by arg_values(), casadi::LinearInterpolant::codegen_body(), casadi::LinearInterpolant::eval(), get_name_in(), and get_sparsity_in().

◆ arg_values() [2/2]

bool casadi::Interpolant::arg_values ( casadi_int  i) const
protected

Definition at line 280 of file interpolant.cpp.

280  {
281  if (!has_parametric_values()) return false;
282  return arg_values()==i;
283  }
casadi_int arg_values() const

References arg_values(), and has_parametric_values().

◆ cache()

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

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

Definition at line 1054 of file function_internal.cpp.

1054  {
1055  // Return value
1056  Dict ret;
1057 
1058  // Retrieve all Function instances that haven't been deleted
1059  std::vector<std::string> keys;
1060  std::vector<Function> entries;
1061  cache_.cache(keys, entries);
1062 
1063  for (size_t i=0; i<keys.size(); ++i) {
1064  // Get the name of the key
1065  std::string s = keys[i];
1066  casadi_assert_dev(s.size() > 0);
1067  // Replace ':' with '_'
1068  std::replace(s.begin(), s.end(), ':', '_');
1069  // Remove trailing underscore, if any
1070  if (s.back() == '_') s.resize(s.size() - 1);
1071  // Add entry to function return
1072  ret[s] = entries[i];
1073  }
1074 
1075  return ret;
1076  }
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 1559 of file function_internal.hpp.

1560  {
1561  // If all inputs are scalar ...
1562  if (all_scalar()) {
1563  // ... and some arguments are matrix-valued with matching dimensions ...
1564  bool matrix_call = false;
1565  std::pair<casadi_int, casadi_int> sz;
1566  for (auto&& a : arg) {
1567  if (!a.is_scalar() && !a.is_empty()) {
1568  if (!matrix_call) {
1569  // Matrix call
1570  matrix_call = true;
1571  sz = a.size();
1572  } else if (a.size()!=sz) {
1573  // Not same dimensions
1574  matrix_call = false;
1575  break;
1576  }
1577  }
1578  }
1579 
1580  // ... then, call multiple times
1581  if (matrix_call) {
1582  // Start with zeros
1583  res.resize(n_out_);
1584  M z = M::zeros(sz);
1585  for (auto&& a : res) a = z;
1586  // Call multiple times
1587  std::vector<M> arg1 = arg, res1;
1588  for (casadi_int c=0; c<sz.second; ++c) {
1589  for (casadi_int r=0; r<sz.first; ++r) {
1590  // Get scalar arguments
1591  for (casadi_int i=0; i<arg.size(); ++i) {
1592  if (arg[i].size()==sz) arg1[i] = arg[i](r, c);
1593  }
1594  // Call recursively with scalar arguments
1595  call(arg1, res1, always_inline, never_inline);
1596  // Get results
1597  casadi_assert_dev(res.size() == res1.size());
1598  for (casadi_int i=0; i<res.size(); ++i) res[i](r, c) = res1[i];
1599  }
1600  }
1601  // All elements assigned
1602  return;
1603  }
1604  }
1605 
1606  // Check if inputs need to be replaced
1607  casadi_int npar = 1;
1608  if (!matching_arg(arg, npar)) {
1609  return call(replace_arg(arg, npar), res, always_inline, never_inline);
1610  }
1611 
1612  // Call the type-specific method
1613  call_gen(arg, res, npar, always_inline, never_inline);
1614  }
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 3029 of file function_internal.cpp.

3033  {
3034  casadi_assert(!(always_inline && never_inline), "Inconsistent options");
3035  casadi_assert(!always_inline, "Class " + class_name() +
3036  " cannot be inlined in an MX expression");
3037 
3038  // Derivative information must be available
3039  casadi_assert(has_derivative(),
3040  "Derivatives cannot be calculated for " + name_);
3041 
3042  // Number of directional derivatives
3043  casadi_int nfwd = fseed.size();
3044  fsens.resize(nfwd);
3045 
3046  // Quick return if no seeds
3047  if (nfwd==0) return;
3048 
3049  // Check if seeds need to have dimensions corrected
3050  casadi_int npar = 1;
3051  for (auto&& r : fseed) {
3052  if (!matching_arg(r, npar)) {
3053  return FunctionInternal::call_forward(arg, res, replace_fseed(fseed, npar),
3054  fsens, always_inline, never_inline);
3055  }
3056  }
3057 
3058  // Calculating full Jacobian and then multiplying
3059  if (fwdViaJac(nfwd)) {
3060  // Multiply the Jacobian from the right
3061  std::vector<MX> darg = arg;
3062  darg.insert(darg.end(), res.begin(), res.end());
3063  std::vector<MX> J = jacobian()(darg);
3064  // Join forward seeds
3065  std::vector<MX> v(nfwd), all_fseed(n_in_);
3066  for (size_t i = 0; i < n_in_; ++i) {
3067  for (size_t d = 0; d < nfwd; ++d) v[d] = vec(fseed.at(d).at(i));
3068  all_fseed[i] = horzcat(v);
3069  }
3070  // Calculate forward sensitivities
3071  std::vector<MX> all_fsens(n_out_);
3072  std::vector<MX>::const_iterator J_it = J.begin();
3073  for (size_t oind = 0; oind < n_out_; ++oind) {
3074  for (size_t iind = 0; iind < n_in_; ++iind) {
3075  // Add contribution
3076  MX a = mtimes(*J_it++, all_fseed[iind]);
3077  all_fsens[oind] = all_fsens[oind].is_empty(true) ? a : all_fsens[oind] + a;
3078  }
3079  }
3080  // Split forward sensitivities
3081  for (size_t d = 0; d < nfwd; ++d) fsens[d].resize(n_out_);
3082  for (size_t i = 0; i < n_out_; ++i) {
3083  v = horzsplit(all_fsens[i]);
3084  casadi_assert_dev(v.size() == nfwd);
3085  for (size_t d = 0; d < nfwd; ++d) fsens[d][i] = reshape(v[d], size_out(i));
3086  }
3087  } else {
3088  // Evaluate in batches
3089  casadi_assert_dev(enable_forward_ || enable_fd_);
3090  casadi_int max_nfwd = max_num_dir_;
3091  if (!enable_fd_) {
3092  while (!has_forward(max_nfwd)) max_nfwd/=2;
3093  }
3094  casadi_int offset = 0;
3095  while (offset<nfwd) {
3096  // Number of derivatives, in this batch
3097  casadi_int nfwd_batch = std::min(nfwd-offset, max_nfwd);
3098 
3099  // All inputs and seeds
3100  std::vector<MX> darg;
3101  darg.reserve(n_in_ + n_out_ + n_in_);
3102  darg.insert(darg.end(), arg.begin(), arg.end());
3103  darg.insert(darg.end(), res.begin(), res.end());
3104  std::vector<MX> v(nfwd_batch);
3105  for (casadi_int i=0; i<n_in_; ++i) {
3106  for (casadi_int d=0; d<nfwd_batch; ++d) v[d] = fseed[offset+d][i];
3107  darg.push_back(horzcat(v));
3108  }
3109 
3110  // Create the evaluation node
3111  Function dfcn = self().forward(nfwd_batch);
3112  std::vector<MX> x = dfcn(darg);
3113 
3114  casadi_assert_dev(x.size()==n_out_);
3115 
3116  // Retrieve sensitivities
3117  for (casadi_int d=0; d<nfwd_batch; ++d) fsens[offset+d].resize(n_out_);
3118  for (casadi_int i=0; i<n_out_; ++i) {
3119  if (size2_out(i)>0) {
3120  v = horzsplit(x[i], size2_out(i));
3121  casadi_assert_dev(v.size()==nfwd_batch);
3122  } else {
3123  v = std::vector<MX>(nfwd_batch, MX(size_out(i)));
3124  }
3125  for (casadi_int d=0; d<nfwd_batch; ++d) fsens[offset+d][i] = v[d];
3126  }
3127 
3128  // Update offset
3129  offset += nfwd_batch;
3130  }
3131  }
3132  }
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 3248 of file function_internal.cpp.

3252  {
3253  casadi_assert(!(always_inline && never_inline), "Inconsistent options");
3254  if (fseed.empty()) { // Quick return if no seeds
3255  fsens.clear();
3256  return;
3257  }
3258  casadi_error("'forward' (SX) not defined for " + class_name());
3259  }

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 3922 of file function_internal.cpp.

3924  {
3925  if (npar==1) {
3926  eval_mx(arg, res, always_inline, never_inline);
3927  } else {
3928  // Split it up arguments
3929  std::vector<std::vector<MX>> v(npar, arg);
3930  std::vector<MX> t;
3931  for (int i=0; i<n_in_; ++i) {
3932  if (arg[i].size2()!=size2_in(i)) {
3933  t = horzsplit(arg[i], size2_in(i));
3934  casadi_assert_dev(t.size()==npar);
3935  for (int p=0; p<npar; ++p) v[p][i] = t[p];
3936  }
3937  }
3938  // Unroll the loop
3939  for (int p=0; p<npar; ++p) {
3940  eval_mx(v[p], t, always_inline, never_inline);
3941  v[p] = t;
3942  }
3943  // Concatenate results
3944  t.resize(npar);
3945  res.resize(n_out_);
3946  for (int i=0; i<n_out_; ++i) {
3947  for (int p=0; p<npar; ++p) t[p] = v[p][i];
3948  res[i] = horzcat(t);
3949  }
3950  }
3951  }
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 1663 of file function_internal.hpp.

1665  {
1666  std::vector< Matrix<D> > arg2 = project_arg(arg, npar);
1667 
1668  // Which arguments require mapped evaluation
1669  std::vector<bool> mapped(n_in_);
1670  for (casadi_int i=0; i<n_in_; ++i) {
1671  mapped[i] = arg[i].size2()!=size2_in(i);
1672  }
1673 
1674  // Allocate results
1675  res.resize(n_out_);
1676  for (casadi_int i=0; i<n_out_; ++i) {
1677  if (!res[i].sparsity().is_stacked(sparsity_out(i), npar)) {
1678  res[i] = Matrix<D>::zeros(repmat(sparsity_out(i), 1, npar));
1679  }
1680  }
1681 
1682  // Allocate temporary memory if needed
1683  std::vector<casadi_int> iw_tmp(sz_iw());
1684  std::vector<D> w_tmp(sz_w());
1685 
1686  // Get pointers to input arguments
1687  std::vector<const D*> argp(sz_arg());
1688  for (casadi_int i=0; i<n_in_; ++i) argp[i]=get_ptr(arg2[i]);
1689 
1690  // Get pointers to output arguments
1691  std::vector<D*> resp(sz_res());
1692  for (casadi_int i=0; i<n_out_; ++i) resp[i]=get_ptr(res[i]);
1693 
1694  // For all parallel calls
1695  for (casadi_int p=0; p<npar; ++p) {
1696  // Call memory-less
1697  if (eval_gen(get_ptr(argp), get_ptr(resp),
1698  get_ptr(iw_tmp), get_ptr(w_tmp), memory(0),
1699  always_inline, never_inline)) {
1700  if (error_on_fail_) casadi_error("Evaluation failed");
1701  }
1702  // Update offsets
1703  if (p==npar-1) break;
1704  for (casadi_int i=0; i<n_in_; ++i) if (mapped[i]) argp[i] += nnz_in(i);
1705  for (casadi_int i=0; i<n_out_; ++i) resp[i] += nnz_out(i);
1706  }
1707  }
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 3134 of file function_internal.cpp.

3138  {
3139  casadi_assert(!(always_inline && never_inline), "Inconsistent options");
3140  casadi_assert(!always_inline, "Class " + class_name() +
3141  " cannot be inlined in an MX expression");
3142 
3143  // Derivative information must be available
3144  casadi_assert(has_derivative(),
3145  "Derivatives cannot be calculated for " + name_);
3146 
3147  // Number of directional derivatives
3148  casadi_int nadj = aseed.size();
3149  asens.resize(nadj);
3150 
3151  // Quick return if no seeds
3152  if (nadj==0) return;
3153 
3154  // Check if seeds need to have dimensions corrected
3155  casadi_int npar = 1;
3156  for (auto&& r : aseed) {
3157  if (!matching_res(r, npar)) {
3158  return FunctionInternal::call_reverse(arg, res, replace_aseed(aseed, npar),
3159  asens, always_inline, never_inline);
3160  }
3161  }
3162 
3163  // Calculating full Jacobian and then multiplying likely cheaper
3164  if (adjViaJac(nadj)) {
3165  // Multiply the transposed Jacobian from the right
3166  std::vector<MX> darg = arg;
3167  darg.insert(darg.end(), res.begin(), res.end());
3168  std::vector<MX> J = jacobian()(darg);
3169  // Join adjoint seeds
3170  std::vector<MX> v(nadj), all_aseed(n_out_);
3171  for (size_t i = 0; i < n_out_; ++i) {
3172  for (size_t d = 0; d < nadj; ++d) v[d] = vec(aseed.at(d).at(i));
3173  all_aseed[i] = horzcat(v);
3174  }
3175  // Calculate adjoint sensitivities
3176  std::vector<MX> all_asens(n_in_);
3177  std::vector<MX>::const_iterator J_it = J.begin();
3178  for (size_t oind = 0; oind < n_out_; ++oind) {
3179  for (size_t iind = 0; iind < n_in_; ++iind) {
3180  // Add contribution
3181  MX a = mtimes((*J_it++).T(), all_aseed[oind]);
3182  all_asens[iind] = all_asens[iind].is_empty(true) ? a : all_asens[iind] + a;
3183  }
3184  }
3185  // Split adjoint sensitivities
3186  for (size_t d = 0; d < nadj; ++d) asens[d].resize(n_in_);
3187  for (size_t i = 0; i < n_in_; ++i) {
3188  v = horzsplit(all_asens[i]);
3189  casadi_assert_dev(v.size() == nadj);
3190  for (size_t d = 0; d < nadj; ++d) {
3191  if (asens[d][i].is_empty(true)) {
3192  asens[d][i] = reshape(v[d], size_in(i));
3193  } else {
3194  asens[d][i] += reshape(v[d], size_in(i));
3195  }
3196  }
3197  }
3198  } else {
3199  // Evaluate in batches
3200  casadi_assert_dev(enable_reverse_);
3201  casadi_int max_nadj = max_num_dir_;
3202 
3203  while (!has_reverse(max_nadj)) max_nadj/=2;
3204  casadi_int offset = 0;
3205  while (offset<nadj) {
3206  // Number of derivatives, in this batch
3207  casadi_int nadj_batch = std::min(nadj-offset, max_nadj);
3208 
3209  // All inputs and seeds
3210  std::vector<MX> darg;
3211  darg.reserve(n_in_ + n_out_ + n_out_);
3212  darg.insert(darg.end(), arg.begin(), arg.end());
3213  darg.insert(darg.end(), res.begin(), res.end());
3214  std::vector<MX> v(nadj_batch);
3215  for (casadi_int i=0; i<n_out_; ++i) {
3216  for (casadi_int d=0; d<nadj_batch; ++d) v[d] = aseed[offset+d][i];
3217  darg.push_back(horzcat(v));
3218  }
3219 
3220  // Create the evaluation node
3221  Function dfcn = self().reverse(nadj_batch);
3222  std::vector<MX> x = dfcn(darg);
3223  casadi_assert_dev(x.size()==n_in_);
3224 
3225  // Retrieve sensitivities
3226  for (casadi_int d=0; d<nadj_batch; ++d) asens[offset+d].resize(n_in_);
3227  for (casadi_int i=0; i<n_in_; ++i) {
3228  if (size2_in(i)>0) {
3229  v = horzsplit(x[i], size2_in(i));
3230  casadi_assert_dev(v.size()==nadj_batch);
3231  } else {
3232  v = std::vector<MX>(nadj_batch, MX(size_in(i)));
3233  }
3234  for (casadi_int d=0; d<nadj_batch; ++d) {
3235  if (asens[offset+d][i].is_empty(true)) {
3236  asens[offset+d][i] = v[d];
3237  } else {
3238  asens[offset+d][i] += v[d];
3239  }
3240  }
3241  }
3242  // Update offset
3243  offset += nadj_batch;
3244  }
3245  }
3246  }
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 3261 of file function_internal.cpp.

3265  {
3266  casadi_assert(!(always_inline && never_inline), "Inconsistent options");
3267  if (aseed.empty()) { // Quick return if no seeds
3268  asens.clear();
3269  return;
3270  }
3271  casadi_error("'reverse' (SX) not defined for " + class_name());
3272  }

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 433 of file function_internal.cpp.

434  {
435  if (option_name == "print_in") {
436  print_in_ = option_value;
437  } else if (option_name == "print_out") {
438  print_out_ = option_value;
439  } else if (option_name == "print_canonical") {
440  print_canonical_ = option_value;
441  } else if (option_name=="ad_weight") {
442  ad_weight_ = option_value;
443  } else if (option_name=="ad_weight_sp") {
444  ad_weight_sp_ = option_value;
445  } else if (option_name=="dump") {
446  dump_ = option_value;
447  } else if (option_name=="dump_in") {
448  dump_in_ = option_value;
449  } else if (option_name=="dump_out") {
450  dump_out_ = option_value;
451  } else if (option_name=="dump_dir") {
452  dump_dir_ = option_value.to_string();
453  } else if (option_name=="dump_format") {
454  dump_format_ = option_value.to_string();
455  } else {
456  // Option not found - continue to base classes
457  ProtoFunction::change_option(option_name, option_value);
458  }
459  }
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_canonical_, 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 1710 of file function_internal.hpp.

1710  {
1711  casadi_assert(arg.size()==n_in_, "Incorrect number of inputs: Expected "
1712  + str(n_in_) + ", got " + str(arg.size()));
1713  for (casadi_int i=0; i<n_in_; ++i) {
1714  if (!check_mat(arg[i].sparsity(), sparsity_in(i), npar)) {
1715  // Dimensions
1716  std::string d_arg = str(arg[i].size1()) + "-by-" + str(arg[i].size2());
1717  std::string d_in = str(size1_in(i)) + "-by-" + str(size2_in(i));
1718  std::string e = "Input " + str(i) + " (" + name_in_[i] + ") has mismatching shape. "
1719  "Got " + d_arg + ". Allowed dimensions, in general, are:\n"
1720  " - The input dimension N-by-M (here " + d_in + ")\n"
1721  " - A scalar, i.e. 1-by-1\n"
1722  " - M-by-N if N=1 or M=1 (i.e. a transposed vector)\n"
1723  " - N-by-M1 if K*M1=M for some K (argument repeated horizontally)\n";
1724  if (npar!=-1) {
1725  e += " - N-by-P*M, indicating evaluation with multiple arguments (P must be a "
1726  "multiple of " + str(npar) + " for consistency with previous inputs)";
1727  }
1728  casadi_error(e);
1729  }
1730  }
1731  }
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_grid() [1/2]

void casadi::Interpolant::check_grid ( const std::vector< casadi_int > &  grid)
static

Definition at line 73 of file interpolant.cpp.

73  {
74  // Dimension at least 1
75  casadi_assert(!grid_dims.empty(), "At least one dimension required");
76 
77  // Grid must be strictly increasing
78  for (casadi_int d : grid_dims) {
79  casadi_assert(d>=2, "Need at least two grid points for every input");
80  }
81  }

◆ check_grid() [2/2]

void casadi::Interpolant::check_grid ( const std::vector< std::vector< double > > &  grid)
static

Definition at line 61 of file interpolant.cpp.

61  {
62  // Dimension at least 1
63  casadi_assert(!grid.empty(), "At least one input required");
64 
65  // Grid must be strictly increasing
66  for (auto&& g : grid) {
67  casadi_assert(is_increasing(g), "Gridpoints must be strictly increasing");
68  casadi_assert(is_regular(g), "Gridpoints must be regular");
69  casadi_assert(g.size()>=2, "Need at least two grid points for every input");
70  }
71  }
bool is_increasing(const std::vector< T > &v)
Check if the vector is strictly increasing.
bool is_regular(const std::vector< T > &v)
Checks if array does not contain NaN or Inf.

References casadi::is_increasing(), and casadi::is_regular().

Referenced by casadi::interpolant().

◆ 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 3460 of file function_internal.cpp.

3460  {
3461  // Matching dimensions
3462  if (arg.size()==inp.size()) return true;
3463  // Calling with empty matrix - set all to zero
3464  if (arg.is_empty()) return true;
3465  // Calling with a scalar - set all
3466  if (arg.is_scalar()) return true;
3467  // Vectors that are transposes of each other
3468  if (arg.is_vector() && inp.size()==std::make_pair(arg.size2(), arg.size1())) return true;
3469  // Horizontal repmat
3470  if (arg.size1()==inp.size1() && arg.size2()>0 && inp.size2()>0
3471  && inp.size2()%arg.size2()==0) return true;
3472  if (npar==-1) return false;
3473  // Evaluate with multiple arguments
3474  if (arg.size1()==inp.size1() && arg.size2()>0 && inp.size2()>0
3475  && arg.size2()%(npar*inp.size2())==0) {
3476  npar *= arg.size2()/(npar*inp.size2());
3477  return true;
3478  }
3479  // No match
3480  return false;
3481  }

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 1734 of file function_internal.hpp.

1734  {
1735  casadi_assert(res.size()==n_out_, "Incorrect number of outputs: Expected "
1736  + str(n_out_) + ", got " + str(res.size()));
1737  for (casadi_int i=0; i<n_out_; ++i) {
1738  casadi_assert(check_mat(res[i].sparsity(), sparsity_out(i), npar),
1739  "Output " + str(i) + " (" + name_out_[i] + ") has mismatching shape. "
1740  "Expected " + str(size_out(i)) + ", got " + str(res[i].size()));
1741  }
1742  }
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 3669 of file function_internal.cpp.

3669  {
3670 #ifdef CASADI_WITH_THREAD
3671  std::lock_guard<std::mutex> lock(mtx_);
3672 #endif //CASADI_WITH_THREAD
3673  if (unused_.empty()) {
3674  check_mem_count(mem_.size()+1);
3675  // Allocate a new memory object
3676  void* m = alloc_mem();
3677  mem_.push_back(m);
3678  if (init_mem(m)) {
3679  casadi_error("Failed to create or initialize memory object");
3680  }
3681  return static_cast<int>(mem_.size()) - 1;
3682  } else {
3683  // Use an unused memory object
3684  int m = unused_.top();
3685  unused_.pop();
3686  return m;
3687  }
3688  }
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::Interpolant::class_name ( ) const
inlineoverridevirtual

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

Implements casadi::SharedObjectInternal.

Reimplemented in casadi::LinearInterpolant, and casadi::BSplineInterpolant.

Definition at line 56 of file interpolant_impl.hpp.

56 {return "Interpolant";}

◆ clear_mem()

void casadi::ProtoFunction::clear_mem ( )
inherited

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

Definition at line 3557 of file function_internal.cpp.

3557  {
3558  for (auto&& i : mem_) {
3559  if (i!=nullptr) free_mem(i);
3560  }
3561  mem_.clear();
3562  }
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(), casadi::SlicotExpm::~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 2390 of file function_internal.cpp.

2390  {
2391  // Define function
2392  g << "/* " << definition() << " */\n";
2393  g << "static " << signature(fname) << " {\n";
2394 
2395  // Reset local variables, flush buffer
2396  g.flush(g.body);
2397 
2398  g.scope_enter();
2399 
2400  // Generate function body (to buffer)
2401  codegen_body(g);
2402 
2403  g.scope_exit();
2404 
2405  // Finalize the function
2406  g << "return 0;\n";
2407  g << "}\n\n";
2408 
2409  // Flush to function body
2410  g.flush(g.body);
2411  }
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 2438 of file function_internal.cpp.

2438  {
2439  bool needs_mem = !codegen_mem_type().empty();
2440  if (needs_mem) {
2441  std::string name = codegen_name(g, false);
2442  std::string mem_counter = g.shorthand(name + "_mem_counter");
2443  g << "return " + mem_counter + "++;\n";
2444  }
2445  }
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 2447 of file function_internal.cpp.

2447  {
2448  std::string name = codegen_name(g, false);
2449  std::string stack_counter = g.shorthand(name + "_unused_stack_counter");
2450  std::string stack = g.shorthand(name + "_unused_stack");
2451  std::string mem_counter = g.shorthand(name + "_mem_counter");
2452  std::string mem_array = g.shorthand(name + "_mem");
2453  std::string alloc_mem = g.shorthand(name + "_alloc_mem");
2454  std::string init_mem = g.shorthand(name + "_init_mem");
2455 
2456  g.auxiliaries << "static int " << mem_counter << " = 0;\n";
2457  g.auxiliaries << "static int " << stack_counter << " = -1;\n";
2458  g.auxiliaries << "static int " << stack << "[CASADI_MAX_NUM_THREADS];\n";
2459  g.auxiliaries << "static " << codegen_mem_type() <<
2460  " " << mem_array << "[CASADI_MAX_NUM_THREADS];\n\n";
2461  g << "int mid;\n";
2462  g << "if (" << stack_counter << ">=0) {\n";
2463  g << "return " << stack << "[" << stack_counter << "--];\n";
2464  g << "} else {\n";
2465  g << "if (" << mem_counter << "==CASADI_MAX_NUM_THREADS) return -1;\n";
2466  g << "mid = " << alloc_mem << "();\n";
2467  g << "if (mid<0) return -1;\n";
2468  g << "if(" << init_mem << "(mid)) return -1;\n";
2469  g << "return mid;\n";
2470  g << "}\n";
2471  }
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 2484 of file function_internal.cpp.

2484  {
2485  bool needs_mem = !codegen_mem_type().empty();
2486 
2487  g << g.declare("int " + name_ + "_alloc_mem(void)") << " {\n";
2488  if (needs_mem) {
2489  g << "return " << codegen_name(g) << "_alloc_mem();\n";
2490  } else {
2491  g << "return 0;\n";
2492  }
2493  g << "}\n\n";
2494 
2495  g << g.declare("int " + name_ + "_init_mem(int mem)") << " {\n";
2496  if (needs_mem) {
2497  g << "return " << codegen_name(g) << "_init_mem(mem);\n";
2498  } else {
2499  g << "return 0;\n";
2500  }
2501  g << "}\n\n";
2502 
2503  g << g.declare("void " + name_ + "_free_mem(int mem)") << " {\n";
2504  if (needs_mem) {
2505  g << codegen_name(g) << "_free_mem(mem);\n";
2506  }
2507  g << "}\n\n";
2508 
2509  // Checkout/release routines
2510  g << g.declare("int " + name_ + "_checkout(void)") << " {\n";
2511  if (needs_mem) {
2512  g << "return " << codegen_name(g) << "_checkout();\n";
2513  } else {
2514  g << "return 0;\n";
2515  }
2516  g << "}\n\n";
2517 
2518  if (needs_mem) {
2519  g << g.declare("void " + name_ + "_release(int mem)") << " {\n";
2520  g << codegen_name(g) << "_release(mem);\n";
2521  } else {
2522  g << g.declare("void " + name_ + "_release(int mem)") << " {\n";
2523  }
2524  g << "}\n\n";
2525 
2526  // Reference counter routines
2527  g << g.declare("void " + name_ + "_incref(void)") << " {\n";
2528  codegen_incref(g);
2529  g << "}\n\n"
2530  << g.declare("void " + name_ + "_decref(void)") << " {\n";
2531  codegen_decref(g);
2532  g << "}\n\n";
2533 
2534  // Number of inputs and outptus
2535  g << g.declare("casadi_int " + name_ + "_n_in(void)")
2536  << " { return " << n_in_ << ";}\n\n"
2537  << g.declare("casadi_int " + name_ + "_n_out(void)")
2538  << " { return " << n_out_ << ";}\n\n";
2539 
2540  // Default inputs
2541  g << g.declare("casadi_real " + name_ + "_default_in(casadi_int i)") << " {\n"
2542  << "switch (i) {\n";
2543  for (casadi_int i=0; i<n_in_; ++i) {
2544  double def = get_default_in(i);
2545  if (def!=0) g << "case " << i << ": return " << g.constant(def) << ";\n";
2546  }
2547  g << "default: return 0;\n}\n"
2548  << "}\n\n";
2549 
2550  // Input names
2551  g << g.declare("const char* " + name_ + "_name_in(casadi_int i)") << " {\n"
2552  << "switch (i) {\n";
2553  for (casadi_int i=0; i<n_in_; ++i) {
2554  g << "case " << i << ": return \"" << name_in_[i] << "\";\n";
2555  }
2556  g << "default: return 0;\n}\n"
2557  << "}\n\n";
2558 
2559  // Output names
2560  g << g.declare("const char* " + name_ + "_name_out(casadi_int i)") << " {\n"
2561  << "switch (i) {\n";
2562  for (casadi_int i=0; i<n_out_; ++i) {
2563  g << "case " << i << ": return \"" << name_out_[i] << "\";\n";
2564  }
2565  g << "default: return 0;\n}\n"
2566  << "}\n\n";
2567 
2568  // Codegen sparsities
2569  codegen_sparsities(g);
2570 
2571  // Function that returns work vector lengths
2572  g << g.declare(
2573  "int " + name_ + "_work(casadi_int *sz_arg, casadi_int* sz_res, "
2574  "casadi_int *sz_iw, casadi_int *sz_w)")
2575  << " {\n"
2576  << "if (sz_arg) *sz_arg = " << codegen_sz_arg(g) << ";\n"
2577  << "if (sz_res) *sz_res = " << codegen_sz_res(g) << ";\n"
2578  << "if (sz_iw) *sz_iw = " << codegen_sz_iw(g) << ";\n"
2579  << "if (sz_w) *sz_w = " << codegen_sz_w(g) << ";\n"
2580  << "return 0;\n"
2581  << "}\n\n";
2582 
2583  // Function that returns work vector lengths in bytes
2584  g << g.declare(
2585  "int " + name_ + "_work_bytes(casadi_int *sz_arg, casadi_int* sz_res, "
2586  "casadi_int *sz_iw, casadi_int *sz_w)")
2587  << " {\n"
2588  << "if (sz_arg) *sz_arg = " << codegen_sz_arg(g) << "*sizeof(const casadi_real*);\n"
2589  << "if (sz_res) *sz_res = " << codegen_sz_res(g) << "*sizeof(casadi_real*);\n"
2590  << "if (sz_iw) *sz_iw = " << codegen_sz_iw(g) << "*sizeof(casadi_int);\n"
2591  << "if (sz_w) *sz_w = " << codegen_sz_w(g) << "*sizeof(casadi_real);\n"
2592  << "return 0;\n"
2593  << "}\n\n";
2594 
2595  // Also add to header file to allow getting
2596  if (g.with_header) {
2597  g.header
2598  << "#define " << name_ << "_SZ_ARG " << codegen_sz_arg(g) << "\n"
2599  << "#define " << name_ << "_SZ_RES " << codegen_sz_res(g) << "\n"
2600  << "#define " << name_ << "_SZ_IW " << codegen_sz_iw(g) << "\n"
2601  << "#define " << name_ << "_SZ_W " << codegen_sz_w(g) << "\n";
2602  }
2603 
2604  // Which inputs are differentiable
2605  if (!all(is_diff_in_)) {
2606  g << g.declare("int " + name_ + "_diff_in(casadi_int i)") << " {\n"
2607  << "switch (i) {\n";
2608  for (casadi_int i=0; i<n_in_; ++i) {
2609  g << "case " << i << ": return " << is_diff_in_[i] << ";\n";
2610  }
2611  g << "default: return -1;\n}\n"
2612  << "}\n\n";
2613  }
2614 
2615  // Which outputs are differentiable
2616  if (!all(is_diff_out_)) {
2617  g << g.declare("int " + name_ + "_diff_out(casadi_int i)") << " {\n"
2618  << "switch (i) {\n";
2619  for (casadi_int i=0; i<n_out_; ++i) {
2620  g << "case " << i << ": return " << is_diff_out_[i] << ";\n";
2621  }
2622  g << "default: return -1;\n}\n"
2623  << "}\n\n";
2624  }
2625 
2626  // Generate mex gateway for the function
2627  if (g.mex) {
2628  // Begin conditional compilation
2629  g << "#ifdef MATLAB_MEX_FILE\n";
2630 
2631  // Declare wrapper
2632  g << "void mex_" << name_
2633  << "(int resc, mxArray *resv[], int argc, const mxArray *argv[]) {\n"
2634  << "casadi_int i;\n";
2635  g << "int mem;\n";
2636  // Work vectors, including input and output buffers
2637  casadi_int i_nnz = nnz_in(), o_nnz = nnz_out();
2638  size_t sz_w = this->sz_w();
2639  for (casadi_int i=0; i<n_in_; ++i) {
2640  const Sparsity& s = sparsity_in_[i];
2641  sz_w = std::max(sz_w, static_cast<size_t>(s.size1())); // To be able to copy a column
2642  sz_w = std::max(sz_w, static_cast<size_t>(s.size2())); // To be able to copy a row
2643  }
2644  sz_w += i_nnz + o_nnz;
2645  g << CodeGenerator::array("casadi_real", "w", sz_w);
2646  g << CodeGenerator::array("casadi_int", "iw", sz_iw());
2647  std::string fw = "w+" + str(i_nnz + o_nnz);
2648 
2649  // Copy inputs to buffers
2650  casadi_int offset=0;
2651  g << CodeGenerator::array("const casadi_real*", "arg", sz_arg(), "{0}");
2652 
2653  // Allocate output buffers
2654  g << "casadi_real* res[" << sz_res() << "] = {0};\n";
2655 
2656  // Check arguments
2657  g << "if (argc>" << n_in_ << ") mexErrMsgIdAndTxt(\"Casadi:RuntimeError\","
2658  << "\"Evaluation of \\\"" << name_ << "\\\" failed. Too many input arguments "
2659  << "(%d, max " << n_in_ << ")\", argc);\n";
2660 
2661  g << "if (resc>" << n_out_ << ") mexErrMsgIdAndTxt(\"Casadi:RuntimeError\","
2662  << "\"Evaluation of \\\"" << name_ << "\\\" failed. "
2663  << "Too many output arguments (%d, max " << n_out_ << ")\", resc);\n";
2664 
2665  for (casadi_int i=0; i<n_in_; ++i) {
2666  std::string p = "argv[" + str(i) + "]";
2667  g << "if (--argc>=0) arg[" << i << "] = "
2668  << g.from_mex(p, "w", offset, sparsity_in_[i], fw) << "\n";
2669  offset += nnz_in(i);
2670  }
2671 
2672  for (casadi_int i=0; i<n_out_; ++i) {
2673  if (i==0) {
2674  // if i==0, always store output (possibly ans output)
2675  g << "--resc;\n";
2676  } else {
2677  // Store output, if it exists
2678  g << "if (--resc>=0) ";
2679  }
2680  // Create and get pointer
2681  g << g.res(i) << " = w+" << str(offset) << ";\n";
2682  offset += nnz_out(i);
2683  }
2684  g << name_ << "_incref();\n";
2685  g << "mem = " << name_ << "_checkout();\n";
2686 
2687  // Call the function
2688  g << "i = " << name_ << "(arg, res, iw, " << fw << ", mem);\n"
2689  << "if (i) mexErrMsgIdAndTxt(\"Casadi:RuntimeError\",\"Evaluation of \\\"" << name_
2690  << "\\\" failed.\");\n";
2691  g << name_ << "_release(mem);\n";
2692  g << name_ << "_decref();\n";
2693 
2694  // Save results
2695  for (casadi_int i=0; i<n_out_; ++i) {
2696  g << "if (" << g.res(i) << ") resv[" << i << "] = "
2697  << g.to_mex(sparsity_out_[i], g.res(i)) << "\n";
2698  }
2699 
2700  // End conditional compilation and function
2701  g << "}\n"
2702  << "#endif\n\n";
2703  }
2704 
2705  if (g.main) {
2706  // Declare wrapper
2707  g << "casadi_int main_" << name_ << "(casadi_int argc, char* argv[]) {\n";
2708 
2709  g << "casadi_int j;\n";
2710  g << "casadi_real* a;\n";
2711  g << "const casadi_real* r;\n";
2712  g << "casadi_int flag;\n";
2713  if (needs_mem) g << "int mem;\n";
2714 
2715 
2716 
2717  // Work vectors and input and output buffers
2718  size_t nr = sz_w() + nnz_in() + nnz_out();
2719  g << CodeGenerator::array("casadi_int", "iw", sz_iw())
2720  << CodeGenerator::array("casadi_real", "w", nr);
2721 
2722  // Input buffers
2723  g << "const casadi_real* arg[" << sz_arg() << "];\n";
2724 
2725  // Output buffers
2726  g << "casadi_real* res[" << sz_res() << "];\n";
2727 
2728  casadi_int off=0;
2729  for (casadi_int i=0; i<n_in_; ++i) {
2730  g << "arg[" << i << "] = w+" << off << ";\n";
2731  off += nnz_in(i);
2732  }
2733  for (casadi_int i=0; i<n_out_; ++i) {
2734  g << "res[" << i << "] = w+" << off << ";\n";
2735  off += nnz_out(i);
2736  }
2737 
2738  // TODO(@jaeandersson): Read inputs from file. For now; read from stdin
2739  g << "a = w;\n"
2740  << "for (j=0; j<" << nnz_in() << "; ++j) "
2741  << "if (scanf(\"%lg\", a++)<=0) return 2;\n";
2742 
2743  if (needs_mem) {
2744  g << "mem = " << name_ << "_checkout();\n";
2745  }
2746 
2747  // Call the function
2748  g << "flag = " << name_ << "(arg, res, iw, w+" << off << ", ";
2749  if (needs_mem) {
2750  g << "mem";
2751  } else {
2752  g << "0";
2753  }
2754  g << ");\n";
2755  if (needs_mem) {
2756  g << name_ << "_release(mem);\n";
2757  }
2758  g << "if (flag) return flag;\n";
2759 
2760  // TODO(@jaeandersson): Write outputs to file. For now: print to stdout
2761  g << "r = w+" << nnz_in() << ";\n"
2762  << "for (j=0; j<" << nnz_out() << "; ++j) "
2763  << g.printf("%g ", "*r++") << "\n";
2764 
2765  // End with newline
2766  g << g.printf("\\n") << "\n";
2767 
2768  // Finalize function
2769  g << "return 0;\n"
2770  << "}\n\n";
2771  }
2772 
2773  if (g.with_mem) {
2774  // Allocate memory
2775  g << g.declare("casadi_functions* " + name_ + "_functions(void)") << " {\n"
2776  << "static casadi_functions fun = {\n"
2777  << name_ << "_incref,\n"
2778  << name_ << "_decref,\n"
2779  << name_ << "_checkout,\n"
2780  << name_ << "_release,\n"
2781  << name_ << "_default_in,\n"
2782  //<< name_ << "_alloc_mem,\n"
2783  //<< name_ << "_init_mem,\n"
2784  //<< name_ << "_free_mem,\n"
2785  << name_ << "_n_in,\n"
2786  << name_ << "_n_out,\n"
2787  << name_ << "_name_in,\n"
2788  << name_ << "_name_out,\n"
2789  << name_ << "_sparsity_in,\n"
2790  << name_ << "_sparsity_out,\n"
2791  << name_ << "_work,\n"
2792  << name_ << "\n"
2793  << "};\n"
2794  << "return &fun;\n"
2795  << "}\n";
2796  }
2797  // Flush
2798  g.flush(g.body);
2799  }
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 2801 of file function_internal.cpp.

2801  {
2802  if (ns) {
2803  // Get the index of the function
2804  for (auto&& e : g.added_functions_) {
2805  if (e.f.get()==this) return e.codegen_name;
2806  }
2807  } else {
2808  for (casadi_int i=0;i<g.added_functions_.size();++i) {
2809  const auto & e = g.added_functions_[i];
2810  if (e.f.get()==this) return "f" + str(i);
2811  }
2812  }
2813  casadi_error("Function '" + name_ + "' not found");
2814  }

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 2473 of file function_internal.cpp.

2473  {
2474  std::string name = codegen_name(g, false);
2475  std::string stack_counter = g.shorthand(name + "_unused_stack_counter");
2476  std::string stack = g.shorthand(name + "_unused_stack");
2477  g << stack << "[++" << stack_counter << "] = mem;\n";
2478  }

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 2913 of file function_internal.cpp.

2913  {
2914  return sz_arg();
2915  }

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 2919 of file function_internal.cpp.

2919  {
2920  return sz_iw();
2921  }

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 2916 of file function_internal.cpp.

2916  {
2917  return sz_res();
2918  }

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 2922 of file function_internal.cpp.

2922  {
2923  return sz_w();
2924  }

References casadi::FunctionInternal::sz_w().

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

◆ coeff_size() [1/2]

casadi_int casadi::Interpolant::coeff_size ( ) const

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

Definition at line 113 of file interpolant.cpp.

113  {
114  return coeff_size(offset_, m_);
115  }
casadi_int coeff_size() const
Size of the flattened coefficients vector.

References m_, and offset_.

Referenced by casadi::LinearInterpolant::do_inline(), get_sparsity_in(), and casadi::BSplineInterpolant::init().

◆ coeff_size() [2/2]

casadi_int casadi::Interpolant::coeff_size ( const std::vector< casadi_int > &  offset,
casadi_int  m 
)
static

Definition at line 117 of file interpolant.cpp.

117  {
118  casadi_int ret = 1;
119  for (casadi_int k=0;k<offset.size()-1;++k) {
120  ret *= offset[k+1]-offset[k];
121  }
122  return m*ret;
123  }

◆ construct() [1/2]

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 138 of file function_internal.cpp.

138  {
139  // Sanitize dictionary is needed
140  if (!Options::is_sane(opts)) {
141  // Call recursively
142  return construct(Options::sanitize(opts));
143  }
144 
145  // Make sure all options exist
146  get_options().check(opts);
147 
148  // Initialize the class hierarchy
149  try {
150  init(opts);
151  } catch(std::exception& e) {
152  casadi_error("Error calling " + class_name() + "::init for '" + name_ + "':\n"
153  + std::string(e.what()));
154  }
155 
156  // Revisit class hierarchy in reverse order
157  try {
158  finalize();
159  } catch(std::exception& e) {
160  casadi_error("Error calling " + class_name() + "::finalize for '" + name_ + "':\n"
161  + std::string(e.what()));
162  }
163  }
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().

◆ construct() [2/2]

Function casadi::Interpolant::construct ( const std::string &  solver,
const std::string &  name,
const std::vector< double > &  grid,
const std::vector< casadi_int > &  offset,
const std::vector< double > &  values,
casadi_int  m,
const Dict opts 
)
static

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

Definition at line 149 of file interpolant.cpp.

155  {
156  bool do_inline = false;
157  Dict options = extract_from_dict(opts, "inline", do_inline);
158  if (do_inline && !Interpolant::getPlugin(solver).exposed.do_inline) {
159  options["inline"] = true;
160  do_inline = false;
161  }
162  if (do_inline && Interpolant::getPlugin(solver).exposed.do_inline) {
163  return Interpolant::getPlugin(solver).exposed.
164  do_inline(name, grid, offset, values, m, options);
165  } else {
167  .creator(name, grid, offset, values, m), options);
168  }
169  }
static Function create(FunctionInternal *node)
Create from node.
Definition: function.cpp:336
static Plugin & getPlugin(const std::string &pname)
Load and get the creator function.
Dict extract_from_dict(const Dict &d, const std::string &key, T &value)
MX do_inline(const MX &x, const std::vector< std::vector< double > > &knots, const MX &coeffs, casadi_int m, const std::vector< casadi_int > &degree, const std::vector< casadi_int > &lookup_mode)
Definition: bspline.cpp:211

References casadi::Function::create(), casadi::do_inline(), casadi::extract_from_dict(), and casadi::PluginInterface< Interpolant >::getPlugin().

Referenced by casadi::interpolant().

◆ 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 1834 of file function_internal.hpp.

1835  {
1836  // Get default inputs
1837  std::vector<M> arg_v(n_in_);
1838  for (casadi_int i=0; i<arg_v.size(); ++i) {
1839  arg_v[i] = get_default_in(i);
1840  }
1841 
1842  // Assign provided inputs
1843  for (auto&& e : arg) {
1844  arg_v.at(index_in(e.first)) = e.second;
1845  }
1846 
1847  return arg_v;
1848  }
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 1822 of file function_internal.hpp.

1823  {
1824  casadi_assert(arg.size()==n_in_, "Incorrect number of inputs: Expected "
1825  + str(n_in_) + ", got " + str(arg.size()));
1826  std::map<std::string, M> ret;
1827  for (casadi_int i=0;i<n_in_;++i) {
1828  ret[name_in_[i]] = arg[i];
1829  }
1830  return ret;
1831  }

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 1863 of file function_internal.hpp.

1864  {
1865  // Get default inputs
1866  std::vector<M> res_v(n_out_);
1867  for (casadi_int i=0; i<res_v.size(); ++i) {
1868  res_v[i] = std::numeric_limits<double>::quiet_NaN();
1869  }
1870 
1871  // Assign provided inputs
1872  for (auto&& e : res) {
1873  M a = e.second;
1874  res_v.at(index_out(e.first)) = a;
1875  }
1876  return res_v;
1877  }
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 1851 of file function_internal.hpp.

1852  {
1853  casadi_assert(res.size()==n_out_, "Incorrect number of outputs: Expected "
1854  + str(n_out_) + ", got " + str(res.size()));
1855  std::map<std::string, M> ret;
1856  for (casadi_int i=0;i<n_out_;++i) {
1857  ret[name_out_[i]] = res[i];
1858  }
1859  return ret;
1860  }

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

◆ 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 1025 of file function_internal.cpp.

1025  {
1026  std::stringstream s;
1027 
1028  // Print name
1029  s << name_ << ":(";
1030  // Print input arguments
1031  for (casadi_int i=0; i<n_in_; ++i) {
1032  if (!is_diff_in_.empty() && !is_diff_in_[i]) s << "#";
1033  s << name_in_[i] << sparsity_in_[i].postfix_dim() << (i==n_in_-1 ? "" : ",");
1034  }
1035  s << ")->(";
1036  // Print output arguments
1037  for (casadi_int i=0; i<n_out_; ++i) {
1038  if (!is_diff_out_.empty() && !is_diff_out_[i]) s << "#";
1039  s << name_out_[i] << sparsity_out_[i].postfix_dim() << (i==n_out_-1 ? "" : ",");
1040  }
1041  s << ")";
1042 
1043  return s.str();
1044  }

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()

ProtoFunction * casadi::Interpolant::deserialize ( DeserializingStream s)
static

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

Definition at line 364 of file interpolant.cpp.

364  {
366  }
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize with type disambiguation.

References casadi::PluginInterface< Derived >::deserialize().

◆ 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 2127 of file function_internal.cpp.

2127  {
2128  // Highest index found in current inputs and outputs
2129  casadi_int highest_index = 0;
2130  // Loop over both input names and output names
2131  for (const std::vector<std::string>& name_io : {name_in_, name_out_}) {
2132  for (const std::string& n : name_io) {
2133  // Find end of prefix, skip if no prefix
2134  size_t end = n.find('_');
2135  if (end >= n.size()) continue;
2136  // Skip if too short
2137  if (end < prefix.size()) continue;
2138  // Skip if wrong prefix
2139  if (n.compare(0, prefix.size(), prefix) != 0) continue;
2140  // Beginning of index
2141  size_t begin = prefix.size();
2142  // Check if any index
2143  casadi_int this_index;
2144  if (begin == end) {
2145  // No prefix, implicitly 1
2146  this_index = 1;
2147  } else {
2148  // Read index from string
2149  this_index = std::stoi(n.substr(begin, end - begin));
2150  }
2151  // Find the highest index
2152  if (this_index > highest_index) highest_index = this_index;
2153  }
2154  }
2155  // Return one higher index
2156  if (highest_index == 0) {
2157  return prefix + "_";
2158  } else {
2159  return prefix + std::to_string(highest_index + 1) + "_";
2160  }
2161  }

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 1046 of file function_internal.cpp.

1046  {
1047  stream << definition() << " " << class_name();
1048  if (more) {
1049  stream << std::endl;
1050  disp_more(stream);
1051  }
1052  }
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 3328 of file function_internal.cpp.

3328  {
3329  std::vector<DM> ret(n_in_);
3330  for (casadi_int i=0; i<ret.size(); ++i) {
3331  ret[i] = dm_in(i);
3332  }
3333  return ret;
3334  }
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 3336 of file function_internal.cpp.

3336  {
3337  std::vector<DM> ret(n_out_);
3338  for (casadi_int i=0; i<ret.size(); ++i) {
3339  ret[i] = dm_out(i);
3340  }
3341  return ret;
3342  }
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 1880 of file function_internal.hpp.

1880  {
1881  // Check dimensions
1882  if (v.size1() == sp.size1() && v.size2() == n * sp.size2()) {
1883  // Ensure that sparsity is a horizontal multiple of original input, or has no entries
1884  if (v.nnz() != 0 && !v.sparsity().is_stacked(sp, n)) {
1885  return project(v, repmat(sp, 1, n));
1886  }
1887  } else {
1888  // Correct empty sparsity
1889  casadi_assert_dev(v.is_empty());
1890  return MatType(sp.size1(), sp.size2() * n);
1891  }
1892  // No correction needed
1893  return v;
1894  }

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

◆ eval()

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

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

Reimplemented in casadi::LinearInterpolantJac, casadi::LinearInterpolant, casadi::BSplineInterpolant, casadi::SlicotExpm, casadi::SlicotDple, casadi::SXFunction, casadi::Switch, casadi::Rootfinder, casadi::MXFunction, casadi::MapSum, casadi::ThreadMap, casadi::OmpMap, casadi::Map, casadi::Integrator, casadi::FmuFunction, casadi::FiniteDiff, casadi::CallbackInternal, casadi::Nlpsol, and casadi::Conic.

Definition at line 3773 of file function_internal.cpp.

3774  {
3775  if (has_eval_dm()) {
3776  // Evaluate via eval_dm (less efficient)
3777  try {
3778  // Allocate input matrices
3779  std::vector<DM> argv(n_in_);
3780  for (casadi_int i=0; i<n_in_; ++i) {
3781  argv[i] = DM(sparsity_in_[i]);
3782  casadi_copy(arg[i], argv[i].nnz(), argv[i].ptr());
3783  }
3784 
3785  // Try to evaluate using eval_dm
3786  std::vector<DM> resv = eval_dm(argv);
3787 
3788  // Check number of outputs
3789  casadi_assert(resv.size()==n_out_,
3790  "Expected " + str(n_out_) + " outputs, got " + str(resv.size()) + ".");
3791 
3792  // Get outputs
3793  for (casadi_int i=0; i<n_out_; ++i) {
3794  if (resv[i].sparsity()!=sparsity_out_[i]) {
3795  if (resv[i].size()==size_out(i)) {
3796  resv[i] = project(resv[i], sparsity_out_[i]);
3797  } else {
3798  casadi_error("Shape mismatch for output " + str(i) + ": got " + resv[i].dim() + ", "
3799  "expected " + sparsity_out_[i].dim() + ".");
3800  }
3801  }
3802  if (res[i]) casadi_copy(resv[i].ptr(), resv[i].nnz(), res[i]);
3803  }
3804  } catch (KeyboardInterruptException&) {
3805  throw;
3806  } catch(std::exception& e) {
3807  casadi_error("Failed to evaluate 'eval_dm' for " + name_ + ":\n" + e.what());
3808  }
3809  // Successful return
3810  return 0;
3811  } else {
3812  casadi_error("'eval' not defined for " + class_name());
3813  }
3814  }
virtual bool has_eval_dm() const
Evaluate with DM matrices.
virtual std::vector< DM > eval_dm(const std::vector< DM > &arg) const
Evaluate with DM matrices.
void casadi_copy(const T1 *x, casadi_int n, T1 *y)
COPY: y <-x.
Matrix< double > DM
Definition: dm_fwd.hpp:33

References casadi::casadi_copy(), casadi::SharedObjectInternal::class_name(), casadi::FunctionInternal::eval_dm(), casadi::FunctionInternal::has_eval_dm(), casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::FunctionInternal::size_out(), casadi::FunctionInternal::sparsity_in_, casadi::FunctionInternal::sparsity_out_, and casadi::str().

Referenced by casadi::FunctionBuffer::_eval(), casadi::CallbackInternal::eval(), casadi::FunctionInternal::eval_gen(), and casadi::Blocksqp::feasibilityRestorationPhase().

◆ 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 2110 of file function_internal.cpp.

2110  {
2111  casadi_error("'eval_dm' not defined for " + class_name());
2112  }

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 435 of file function_internal.hpp.

436  {
437  return sp_forward(arg, res, iw, w, mem);
438  }
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 914 of file function_internal.cpp.

916  {
917  casadi_int dump_id = (dump_in_ || dump_out_ || dump_) ? get_dump_id() : 0;
918  if (dump_in_) dump_in(dump_id, arg);
919  if (dump_ && dump_id==0) dump();
920  if (print_in_) print_in(uout(), arg, false);
921  auto m = static_cast<ProtoFunctionMemory*>(mem);
922 
923  // Avoid memory corruption
924  for (casadi_int i=0;i<n_in_;++i) {
925  casadi_assert(arg[i]==0 || arg[i]+nnz_in(i)<=w || arg[i]>=w+sz_w(),
926  "Memory corruption detected for input " + name_in_[i] + ".\n"+
927  "arg[" + str(i) + "] " + str(arg[i]) + "-" + str(arg[i]+nnz_in(i)) +
928  " intersects with w " + str(w)+"-"+str(w+sz_w())+".");
929  }
930  for (casadi_int i=0;i<n_out_;++i) {
931  casadi_assert(res[i]==0 || res[i]+nnz_out(i)<=w || res[i]>=w+sz_w(),
932  "Memory corruption detected for output " + name_out_[i]);
933  }
934  // Reset statistics
935  for (auto&& s : m->fstats) s.second.reset();
936  if (m->t_total) m->t_total->tic();
937  int ret;
938  if (eval_) {
939  auto m = static_cast<FunctionMemory*>(mem);
940  m->stats_available = true;
941  int mem_ = 0;
942  if (checkout_) {
943 #ifdef CASADI_WITH_THREAD
944  std::lock_guard<std::mutex> lock(mtx_);
945 #endif //CASADI_WITH_THREAD
946  mem_ = checkout_();
947  }
948  ret = eval_(arg, res, iw, w, mem_);
949  if (release_) {
950 #ifdef CASADI_WITH_THREAD
951  std::lock_guard<std::mutex> lock(mtx_);
952 #endif //CASADI_WITH_THREAD
953  release_(mem_);
954  }
955  } else {
956  ret = eval(arg, res, iw, w, mem);
957  }
958  if (m->t_total) m->t_total->toc();
959  // Show statistics
960  print_time(m->fstats);
961 
962  if (dump_out_) dump_out(dump_id, res);
963  if (print_out_) print_out(uout(), res, false);
964  // Check all outputs for NaNs
965  if (regularity_check_) {
966  for (casadi_int i = 0; i < n_out_; ++i) {
967  // Skip of not calculated
968  if (!res[i]) continue;
969  // Loop over nonzeros
970  casadi_int nnz = this->nnz_out(i);
971  for (casadi_int nz = 0; nz < nnz; ++nz) {
972  if (isnan(res[i][nz]) || isinf(res[i][nz])) {
973  // Throw readable error message
974  casadi_error(str(res[i][nz]) + " detected for output " + name_out_[i] + " at "
975  + sparsity_out(i).repr_el(nz));
976  }
977  }
978  }
979  }
980  return ret;
981  }
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 431 of file function_internal.hpp.

432  {
433  return eval_sx(arg, res, iw, w, mem, always_inline, never_inline);
434  }
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 2325 of file function_internal.cpp.

2326  {
2327 
2328  always_inline = always_inline || always_inline_;
2329  never_inline = never_inline || never_inline_;
2330 
2331  // The code below creates a call node, to inline, wrap in an MXFunction
2332  if (always_inline) {
2333  casadi_assert(!never_inline, "Inconsistent options for " + str(name_));
2334  return wrap().call(arg, res, true);
2335  }
2336 
2337  // Create a call-node
2338  res = Call::create(self(), arg);
2339  }
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 2114 of file function_internal.cpp.

2116  {
2117 
2118  always_inline = always_inline || always_inline_;
2119  never_inline = never_inline || never_inline_;
2120 
2121  casadi_assert(!always_inline, "'eval_sx' not defined for " + class_name() +
2122  " in combination with always_inline true");
2123 
2124  return CallSX::eval_sx(self(), arg, res);
2125  }
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, casadi::External, and casadi::CallbackInternal.

Definition at line 3697 of file function_internal.cpp.

3702  {
3703  return wrap().factory(name, s_in, s_out, aux, opts);
3704  }
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:1820

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 704 of file function_internal.cpp.

704  {
705  if (jit_) {
707  if (jit_temp_suffix_) {
709  jit_name_ = std::string(jit_name_.begin(), jit_name_.begin()+jit_name_.size()-2);
710  }
711  if (has_codegen()) {
712  if (compiler_.is_null()) {
713  if (verbose_) casadi_message("Codegenerating function '" + name_ + "'.");
714  // JIT everything
715  Dict opts;
716  // Override the default to avoid random strings in the generated code
717  opts["prefix"] = "jit";
718  CodeGenerator gen(jit_name_, opts);
719  gen.add(self());
720  if (verbose_) casadi_message("Compiling function '" + name_ + "'..");
721  std::string jit_directory = get_from_dict(jit_options_, "directory", std::string(""));
722  compiler_ = Importer(gen.generate(jit_directory), compiler_plugin_, jit_options_);
723  if (verbose_) casadi_message("Compiling function '" + name_ + "' done.");
724  }
725  // Try to load
729  casadi_assert(eval_!=nullptr, "Cannot load JIT'ed function.");
730  } else {
731  // Just jit dependencies
733  }
734  }
735 
736  // Finalize base classes
738 
739  // Dump if requested
740  if (dump_) dump();
741  }
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 3856 of file function_internal.cpp.

3856  {
3857  // Always of width 8
3858  casadi_assert_dev(time>=0);
3859  double log_time = log10(time);
3860  int magn = static_cast<int>(floor(log_time));
3861  int iprefix = static_cast<int>(floor(log_time/3));
3862  if (iprefix<-4) {
3863  sprint(buffer, 10, " 0");
3864  return;
3865  }
3866  if (iprefix>=5) {
3867  sprint(buffer, 10, " inf");
3868  return;
3869  }
3870  char prefixes[] = "TGMk munp";
3871  char prefix = prefixes[4-iprefix];
3872 
3873  int rem = magn-3*iprefix;
3874  double time_normalized = time/pow(10, 3*iprefix);
3875 
3876  if (rem==0) {
3877  sprint(buffer, 10, " %1.2f%cs", time_normalized, prefix);
3878  } else if (rem==1) {
3879  sprint(buffer, 10, " %2.2f%cs", time_normalized, prefix);
3880  } else {
3881  sprint(buffer, 10, "%3.2f%cs", time_normalized, prefix);
3882  }
3883  }
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 2163 of file function_internal.cpp.

2163  {
2164  casadi_assert_dev(nfwd>=0);
2165  // Used wrapped function if forward not available
2166  if (!enable_forward_ && !enable_fd_) {
2167  // Derivative information must be available
2168  casadi_assert(has_derivative(), "Derivatives cannot be calculated for " + name_);
2169  return wrap().forward(nfwd);
2170  }
2171  // Retrieve/generate cached
2172  Function f;
2173  std::string fname = forward_name(name_, nfwd);
2174  if (!incache(fname, f)) {
2175  casadi_int i;
2176  // Prefix to be used for forward seeds, sensitivities
2177  std::string pref = diff_prefix("fwd");
2178  // Names of inputs
2179  std::vector<std::string> inames;
2180  for (i=0; i<n_in_; ++i) inames.push_back(name_in_[i]);
2181  for (i=0; i<n_out_; ++i) inames.push_back("out_" + name_out_[i]);
2182  for (i=0; i<n_in_; ++i) inames.push_back(pref + name_in_[i]);
2183  // Names of outputs
2184  std::vector<std::string> onames;
2185  for (i=0; i<n_out_; ++i) onames.push_back(pref + name_out_[i]);
2186  // Options
2188  opts = combine(opts, generate_options("forward"));
2189  if (!enable_forward_) opts = fd_options_;
2190  opts["derivative_of"] = self();
2191  // Generate derivative function
2192  casadi_assert_dev(enable_forward_ || enable_fd_);
2193  if (enable_forward_) {
2194  f = get_forward(nfwd, fname, inames, onames, opts);
2195  } else {
2196  // Get FD method
2197  if (fd_method_.empty() || fd_method_=="central") {
2198  f = Function::create(new CentralDiff(fname, nfwd), opts);
2199  } else if (fd_method_=="forward") {
2200  f = Function::create(new ForwardDiff(fname, nfwd), opts);
2201  } else if (fd_method_=="backward") {
2202  f = Function::create(new BackwardDiff(fname, nfwd), opts);
2203  } else if (fd_method_=="smoothing") {
2204  f = Function::create(new Smoothing(fname, nfwd), opts);
2205  } else {
2206  casadi_error("Unknown 'fd_method': " + fd_method_);
2207  }
2208  }
2209  // Consistency check for inputs
2210  casadi_assert_dev(f.n_in()==n_in_ + n_out_ + n_in_);
2211  casadi_int ind=0;
2212  for (i=0; i<n_in_; ++i) f.assert_size_in(ind++, size1_in(i), size2_in(i));
2213  for (i=0; i<n_out_; ++i) f.assert_size_in(ind++, size1_out(i), size2_out(i));
2214  for (i=0; i<n_in_; ++i) f.assert_size_in(ind++, size1_in(i), nfwd*size2_in(i));
2215  // Consistency check for outputs
2216  casadi_assert_dev(f.n_out()==n_out_);
2217  for (i=0; i<n_out_; ++i) f.assert_sparsity_out(i, sparsity_out(i), nfwd);
2218  // Save to cache
2219  tocache_if_missing(f);
2220  }
2221  return f;
2222  }
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
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::FunctionInternal::free_mem ( void *  mem) const
inlineoverridevirtualinherited

◆ free_mx()

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

Reimplemented in casadi::MXFunction.

Definition at line 3377 of file function_internal.cpp.

3377  {
3378  casadi_error("'free_mx' only defined for 'MXFunction'");
3379  }

◆ free_sx()

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

Reimplemented in casadi::SXFunction.

Definition at line 3381 of file function_internal.cpp.

3381  {
3382  casadi_error("'free_sx' only defined for 'SXFunction'");
3383  }

◆ from_compact()

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

Definition at line 1928 of file function_internal.cpp.

1929  {
1930  // Return value
1931  Sparsity r = sp;
1932  // Insert rows if sparse output
1933  if (numel_out(oind) != r.size1()) {
1934  casadi_assert_dev(r.size1() == nnz_out(oind));
1935  r.enlargeRows(numel_out(oind), sparsity_out(oind).find());
1936  }
1937  // Insert columns if sparse input
1938  if (numel_in(iind) != r.size2()) {
1939  casadi_assert_dev(r.size2() == nnz_in(iind));
1940  r.enlargeColumns(numel_in(iind), sparsity_in(iind).find());
1941  }
1942  // Return non-compact pattern
1943  return r;
1944  }
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 1519 of file function_internal.hpp.

1520  {
1521  std::vector<std::vector<MatType>> fseed(nfwd);
1522  for (casadi_int dir=0; dir<nfwd; ++dir) {
1523  fseed[dir].resize(n_in_);
1524  for (casadi_int iind=0; iind<n_in_; ++iind) {
1525  std::string n = "f" + str(dir) + "_" + name_in_[iind];
1526  Sparsity sp = is_diff_in_[iind] ? sparsity_in(iind) : Sparsity(size_in(iind));
1527  fseed[dir][iind] = MatType::sym(n, sp);
1528  }
1529  }
1530  return fseed;
1531  }

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 2993 of file function_internal.cpp.

2993  {
2994  if (!enable_forward_ && !enable_fd_) return true;
2995  if (jac_penalty_==-1) return false;
2996 
2997  // Heuristic 1: Jac calculated via forward mode likely cheaper
2998  if (jac_penalty_*static_cast<double>(nnz_in())<nfwd) return true;
2999 
3000  // Heuristic 2: Jac calculated via reverse mode likely cheaper
3001  double w = ad_weight();
3002  if (enable_reverse_ &&
3003  jac_penalty_*(1-w)*static_cast<double>(nnz_out())<w*static_cast<double>(nfwd))
3004  return true; // NOLINT
3005 
3006  return false;
3007  }

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 2833 of file function_internal.cpp.

2834  {
2835  casadi_error("'generate_dependencies' not defined for " + class_name());
2836  }

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 749 of file function_internal.cpp.

749  {
750  // Set up output stream
751  auto of_ptr = Filesystem::ofstream_ptr(fname);
752  std::ostream& of = *of_ptr;
753  normalized_setup(of);
754 
755  // Encode each input
756  for (casadi_int i=0; i<n_in_; ++i) {
757  const double* v = arg[i];
758  for (casadi_int k=0;k<nnz_in(i);++k) {
759  normalized_out(of, v ? v[k] : 0);
760  of << std::endl;
761  }
762  }
763  }
static std::unique_ptr< std::ostream > ofstream_ptr(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::ofstream_ptr().

◆ 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 3385 of file function_internal.cpp.

3386  {
3387  casadi_error("'generate_lifted' only defined for 'MXFunction'");
3388  }

◆ 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 391 of file function_internal.cpp.

391  {
392  Dict opts = ProtoFunction::generate_options(target);
393  opts["jac_penalty"] = jac_penalty_;
394  opts["user_data"] = user_data_;
395  opts["inputs_check"] = inputs_check_;
396  if (target!="tmp") opts["jit"] = jit_;
397  opts["jit_cleanup"] = jit_cleanup_;
398  opts["jit_serialize"] = jit_serialize_;
399  opts["compiler"] = compiler_plugin_;
400  opts["jit_options"] = jit_options_;
401  opts["jit_name"] = jit_base_name_;
402  opts["jit_temp_suffix"] = jit_temp_suffix_;
403  opts["ad_weight"] = ad_weight_;
404  opts["ad_weight_sp"] = ad_weight_sp_;
405  opts["always_inline"] = always_inline_;
406  opts["never_inline"] = never_inline_;
407  opts["max_num_dir"] = max_num_dir_;
408  if (target=="clone" || target=="tmp") {
409  opts["enable_forward"] = enable_forward_op_;
410  opts["enable_reverse"] = enable_reverse_op_;
411  opts["enable_jacobian"] = enable_jacobian_op_;
412  opts["enable_fd"] = enable_fd_op_;
413  opts["reverse_options"] = reverse_options_;
414  opts["forward_options"] = forward_options_;
415  opts["jacobian_options"] = jacobian_options_;
416  opts["der_options"] = der_options_;
417  opts["derivative_of"] = derivative_of_;
418  }
419  opts["fd_options"] = fd_options_;
420  opts["fd_method"] = fd_method_;
421  opts["print_in"] = print_in_;
422  opts["print_out"] = print_out_;
423  opts["print_canonical"] = print_canonical_;
424  opts["max_io"] = max_io_;
425  opts["dump_in"] = dump_in_;
426  opts["dump_out"] = dump_out_;
427  opts["dump_dir"] = dump_dir_;
428  opts["dump_format"] = dump_format_;
429  opts["dump"] = dump_;
430  return opts;
431  }
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_canonical_, 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 765 of file function_internal.cpp.

765  {
766  // Set up output stream
767  auto of_ptr = Filesystem::ofstream_ptr(fname);
768  std::ostream& of = *of_ptr;
769  normalized_setup(of);
770 
771  // Encode each input
772  for (casadi_int i=0; i<n_out_; ++i) {
773  const double* v = res[i];
774  for (casadi_int k=0;k<nnz_out(i);++k) {
775  normalized_out(of, v ? v[k] : std::numeric_limits<double>::quiet_NaN());
776  of << std::endl;
777  }
778  }
779  }

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

◆ 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 1099 of file function_internal.hpp.

1099  {
1100  return eps;
1101  }
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::Interpolant::get_diff_in ( casadi_int  i)
inlineoverridevirtual

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

Reimplemented from casadi::FunctionInternal.

Reimplemented in casadi::BSplineInterpolant.

Definition at line 69 of file interpolant_impl.hpp.

69 { return i==0; }

◆ get_diff_out()

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

◆ get_forward()

Function casadi::FunctionInternal::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
virtualinherited

◆ 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 1020 of file function_internal.cpp.

1020  {
1021  casadi_assert_dev(!has_free());
1022  return std::vector<std::string>();
1023  }
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 3706 of file function_internal.cpp.

3706  {
3707  // No functions
3708  return std::vector<std::string>();
3709  }

◆ 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 3711 of file function_internal.cpp.

3711  {
3712  casadi_error("'get_function' not defined for " + class_name());
3713  static Function singleton;
3714  return singleton;
3715  }

References casadi::SharedObjectInternal::class_name().

◆ get_jac_sparsity()

Sparsity casadi::FunctionInternal::get_jac_sparsity ( casadi_int  oind,
casadi_int  iind,
bool  symmetric 
) const
virtualinherited

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

Reimplemented in casadi::FmuFunction, casadi::GenericExternal, casadi::Expm, and casadi::CallbackInternal.

Definition at line 1871 of file function_internal.cpp.

1872  {
1873  if (symmetric) {
1874  casadi_assert(sparsity_out_[oind].is_dense(),
1875  "Symmetry exploitation in Jacobian assumes dense expression. "
1876  "A potential workaround is to apply densify().");
1877  }
1878  // Check if we are able to propagate dependencies through the function
1879  if (has_spfwd() || has_sprev()) {
1880  // Get weighting factor
1881  double w = sp_weight();
1882 
1883  // Skip generation, assume dense
1884  if (w == -1) return Sparsity();
1885 
1886  Sparsity sp;
1887  if (nnz_in(iind) > 3*bvec_size && nnz_out(oind) > 3*bvec_size &&
1889  if (symmetric) {
1890  sp = get_jac_sparsity_hierarchical_symm(oind, iind);
1891  } else {
1892  sp = get_jac_sparsity_hierarchical(oind, iind);
1893  }
1894  } else {
1895  // Number of nonzero inputs and outputs
1896  casadi_int nz_in = nnz_in(iind);
1897  casadi_int nz_out = nnz_out(oind);
1898 
1899  // Number of forward sweeps we must make
1900  casadi_int nsweep_fwd = nz_in/bvec_size;
1901  if (nz_in%bvec_size) nsweep_fwd++;
1902 
1903  // Number of adjoint sweeps we must make
1904  casadi_int nsweep_adj = nz_out/bvec_size;
1905  if (nz_out%bvec_size) nsweep_adj++;
1906 
1907  // Use forward mode?
1908  if (w*static_cast<double>(nsweep_fwd) <= (1-w)*static_cast<double>(nsweep_adj)) {
1909  sp = get_jac_sparsity_gen<true>(oind, iind);
1910  } else {
1911  sp = get_jac_sparsity_gen<false>(oind, iind);
1912  }
1913  }
1914  return sp;
1915  } else {
1916  // Not calculated
1917  return Sparsity();
1918  }
1919  }
virtual bool has_sprev() const
Is the class able to propagate seeds through the algorithm?
Sparsity get_jac_sparsity_hierarchical_symm(casadi_int oind, casadi_int iind) const
virtual double sp_weight() const
Weighting factor for chosing forward/reverse mode,.
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.
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.
virtual bool has_spfwd() const
Is the class able to propagate seeds through the algorithm?
static bool hierarchical_sparsity
const int bvec_size

References casadi::bvec_size, casadi::FunctionInternal::get_jac_sparsity_hierarchical(), casadi::FunctionInternal::get_jac_sparsity_hierarchical_symm(), casadi::FunctionInternal::has_spfwd(), casadi::FunctionInternal::has_sprev(), casadi::GlobalOptions::hierarchical_sparsity, casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::nnz_out(), casadi::FunctionInternal::nz_in(), casadi::FunctionInternal::nz_out(), casadi::FunctionInternal::sp_weight(), and casadi::FunctionInternal::sparsity_out_.

Referenced by casadi::Expm::get_jac_sparsity(), casadi::GenericExternal::get_jac_sparsity(), and casadi::FunctionInternal::jac_sparsity().

◆ 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 1216 of file function_internal.cpp.

1216  {
1217  // Number of nonzero inputs and outputs
1218  casadi_int nz_in = nnz_in(iind);
1219  casadi_int nz_out = nnz_out(oind);
1220 
1221  // Evaluation buffers
1222  std::vector<typename JacSparsityTraits<fwd>::arg_t> arg(sz_arg(), nullptr);
1223  std::vector<bvec_t*> res(sz_res(), nullptr);
1224  std::vector<casadi_int> iw(sz_iw());
1225  std::vector<bvec_t> w(sz_w(), 0);
1226 
1227  // Seeds and sensitivities
1228  std::vector<bvec_t> seed(nz_in, 0);
1229  arg[iind] = get_ptr(seed);
1230  std::vector<bvec_t> sens(nz_out, 0);
1231  res[oind] = get_ptr(sens);
1232  if (!fwd) std::swap(seed, sens);
1233 
1234  // Number of forward sweeps we must make
1235  casadi_int nsweep = seed.size() / bvec_size;
1236  if (seed.size() % bvec_size) nsweep++;
1237 
1238  // Print
1239  if (verbose_) {
1240  casadi_message(str(nsweep) + std::string(fwd ? " forward" : " reverse") + " sweeps "
1241  "needed for " + str(seed.size()) + " directions");
1242  }
1243 
1244  // Progress
1245  casadi_int progress = -10;
1246 
1247  // Temporary vectors
1248  std::vector<casadi_int> jcol, jrow;
1249 
1250  // Loop over the variables, bvec_size variables at a time
1251  for (casadi_int s=0; s<nsweep; ++s) {
1252 
1253  // Print progress
1254  if (verbose_) {
1255  casadi_int progress_new = (s*100)/nsweep;
1256  // Print when entering a new decade
1257  if (progress_new / 10 > progress / 10) {
1258  progress = progress_new;
1259  casadi_message(str(progress) + " %");
1260  }
1261  }
1262 
1263  // Nonzero offset
1264  casadi_int offset = s*bvec_size;
1265 
1266  // Number of local seed directions
1267  casadi_int ndir_local = seed.size()-offset;
1268  ndir_local = std::min(static_cast<casadi_int>(bvec_size), ndir_local);
1269 
1270  for (casadi_int i=0; i<ndir_local; ++i) {
1271  seed[offset+i] |= bvec_t(1)<<i;
1272  }
1273 
1274  // Propagate the dependencies
1275  JacSparsityTraits<fwd>::sp(this, get_ptr(arg), get_ptr(res),
1276  get_ptr(iw), get_ptr(w), memory(0));
1277 
1278  // Loop over the nonzeros of the output
1279  for (casadi_int el=0; el<sens.size(); ++el) {
1280 
1281  // Get the sparsity sensitivity
1282  bvec_t spsens = sens[el];
1283 
1284  if (!fwd) {
1285  // Clear the sensitivities for the next sweep
1286  sens[el] = 0;
1287  }
1288 
1289  // If there is a dependency in any of the directions
1290  if (spsens!=0) {
1291 
1292  // Loop over seed directions
1293  for (casadi_int i=0; i<ndir_local; ++i) {
1294 
1295  // If dependents on the variable
1296  if ((bvec_t(1) << i) & spsens) {
1297  // Add to pattern
1298  jcol.push_back(el);
1299  jrow.push_back(i+offset);
1300  }
1301  }
1302  }
1303  }
1304 
1305  // Remove the seeds
1306  for (casadi_int i=0; i<ndir_local; ++i) {
1307  seed[offset+i] = 0;
1308  }
1309  }
1310 
1311  // Construct sparsity pattern and return
1312  if (!fwd) swap(jrow, jcol);
1313  Sparsity ret = Sparsity::triplet(nz_out, nz_in, jcol, jrow);
1314  if (verbose_) {
1315  casadi_message("Formed Jacobian sparsity pattern (dimension " + str(ret.size()) + ", "
1316  + str(ret.nnz()) + " (" + str(ret.density()) + " %) nonzeros.");
1317  }
1318  return ret;
1319  }
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

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 1556 of file function_internal.cpp.

1556  {
1557  // Number of nonzero inputs
1558  casadi_int nz_in = nnz_in(iind);
1559 
1560  // Number of nonzero outputs
1561  casadi_int nz_out = nnz_out(oind);
1562 
1563  // Seeds and sensitivities
1564  std::vector<bvec_t> s_in(nz_in, 0);
1565  std::vector<bvec_t> s_out(nz_out, 0);
1566 
1567  // Evaluation buffers
1568  std::vector<const bvec_t*> arg_fwd(sz_arg(), nullptr);
1569  std::vector<bvec_t*> arg_adj(sz_arg(), nullptr);
1570  arg_fwd[iind] = arg_adj[iind] = get_ptr(s_in);
1571  std::vector<bvec_t*> res(sz_res(), nullptr);
1572  res[oind] = get_ptr(s_out);
1573  std::vector<casadi_int> iw(sz_iw());
1574  std::vector<bvec_t> w(sz_w());
1575 
1576  // Sparsity triplet accumulator
1577  std::vector<casadi_int> jcol, jrow;
1578 
1579  // Cols of the coarse blocks
1580  std::vector<casadi_int> coarse_col(2, 0); coarse_col[1] = nz_out;
1581  // Rows of the coarse blocks
1582  std::vector<casadi_int> coarse_row(2, 0); coarse_row[1] = nz_in;
1583 
1584  // Cols of the fine blocks
1585  std::vector<casadi_int> fine_col;
1586 
1587  // Rows of the fine blocks
1588  std::vector<casadi_int> fine_row;
1589 
1590  // In each iteration, subdivide each coarse block in this many fine blocks
1591  casadi_int subdivision = bvec_size;
1592 
1593  Sparsity r = Sparsity::dense(1, 1);
1594 
1595  // The size of a block
1596  casadi_int granularity_row = nz_in;
1597  casadi_int granularity_col = nz_out;
1598 
1599  bool use_fwd = true;
1600 
1601  casadi_int nsweeps = 0;
1602 
1603  bool hasrun = false;
1604 
1605  // Get weighting factor
1606  double sp_w = sp_weight();
1607 
1608  // Lookup table for bvec_t
1609  std::vector<bvec_t> bvec_lookup;
1610  bvec_lookup.reserve(bvec_size);
1611  for (casadi_int i=0;i<bvec_size;++i) {
1612  bvec_lookup.push_back(bvec_t(1) << i);
1613  }
1614 
1615  while (!hasrun || coarse_col.size()!=nz_out+1 || coarse_row.size()!=nz_in+1) {
1616  if (verbose_) {
1617  casadi_message("Block size: " + str(granularity_col) + " x " + str(granularity_row));
1618  }
1619 
1620  // Clear the sparsity triplet acccumulator
1621  jcol.clear();
1622  jrow.clear();
1623 
1624  // Clear the fine block structure
1625  fine_row.clear();
1626  fine_col.clear();
1627 
1628  // r transpose will be needed in the algorithm
1629  Sparsity rT = r.T();
1630 
1633  // Forward mode
1634  Sparsity D1 = rT.uni_coloring(r);
1635  // Adjoint mode
1636  Sparsity D2 = r.uni_coloring(rT);
1637  if (verbose_) {
1638  casadi_message("Coloring on " + str(r.dim()) + " (fwd seeps: " + str(D1.size2()) +
1639  " , adj sweeps: " + str(D2.size1()) + ")");
1640  }
1641 
1642  // Use whatever required less colors if we tried both (with preference to forward mode)
1643  double fwd_cost = static_cast<double>(use_fwd ? granularity_row : granularity_col) *
1644  sp_w*static_cast<double>(D1.size2());
1645  double adj_cost = static_cast<double>(use_fwd ? granularity_col : granularity_row) *
1646  (1-sp_w)*static_cast<double>(D2.size2());
1647  use_fwd = fwd_cost <= adj_cost;
1648  if (verbose_) {
1649  casadi_message(std::string(use_fwd ? "Forward" : "Reverse") + " mode chosen "
1650  "(fwd cost: " + str(fwd_cost) + ", adj cost: " + str(adj_cost) + ")");
1651  }
1652 
1653  // Get seeds and sensitivities
1654  bvec_t* seed_v = use_fwd ? get_ptr(s_in) : get_ptr(s_out);
1655  bvec_t* sens_v = use_fwd ? get_ptr(s_out) : get_ptr(s_in);
1656 
1657  // The number of zeros in the seed and sensitivity directions
1658  casadi_int nz_seed = use_fwd ? nz_in : nz_out;
1659  casadi_int nz_sens = use_fwd ? nz_out : nz_in;
1660 
1661  // Clear the seeds
1662  for (casadi_int i=0; i<nz_seed; ++i) seed_v[i]=0;
1663 
1664  // Choose the active jacobian coloring scheme
1665  Sparsity D = use_fwd ? D1 : D2;
1666 
1667  // Adjoint mode amounts to swapping
1668  if (!use_fwd) {
1669  std::swap(coarse_col, coarse_row);
1670  std::swap(granularity_col, granularity_row);
1671  std::swap(r, rT);
1672  }
1673 
1674  // Subdivide the coarse block cols
1675  for (casadi_int k=0;k<coarse_col.size()-1;++k) {
1676  casadi_int diff = coarse_col[k+1]-coarse_col[k];
1677  casadi_int new_diff = diff/subdivision;
1678  if (diff%subdivision>0) new_diff++;
1679  std::vector<casadi_int> temp = range(coarse_col[k], coarse_col[k+1], new_diff);
1680  fine_col.insert(fine_col.end(), temp.begin(), temp.end());
1681  }
1682  // Subdivide the coarse block rows
1683  for (casadi_int k=0;k<coarse_row.size()-1;++k) {
1684  casadi_int diff = coarse_row[k+1]-coarse_row[k];
1685  casadi_int new_diff = diff/subdivision;
1686  if (diff%subdivision>0) new_diff++;
1687  std::vector<casadi_int> temp = range(coarse_row[k], coarse_row[k+1], new_diff);
1688  fine_row.insert(fine_row.end(), temp.begin(), temp.end());
1689  }
1690  if (fine_row.back()!=coarse_row.back()) fine_row.push_back(coarse_row.back());
1691  if (fine_col.back()!=coarse_col.back()) fine_col.push_back(coarse_col.back());
1692 
1693  granularity_col = fine_col[1] - fine_col[0];
1694  granularity_row = fine_row[1] - fine_row[0];
1695 
1696  // The index into the bvec bit vector
1697  casadi_int bvec_i = 0;
1698 
1699  // Create lookup tables for the fine blocks
1700  std::vector<casadi_int> fine_col_lookup = lookupvector(fine_col, nz_sens+1);
1701  std::vector<casadi_int> fine_row_lookup = lookupvector(fine_row, nz_seed+1);
1702 
1703  // Triplet data used as a lookup table
1704  std::vector<casadi_int> lookup_col;
1705  std::vector<casadi_int> lookup_row;
1706  std::vector<casadi_int> lookup_value;
1707 
1708 
1709  // The maximum number of fine blocks contained in one coarse block
1710  casadi_int n_fine_blocks_max = 0;
1711  for (casadi_int i=0;i<coarse_row.size()-1;++i) {
1712  casadi_int del = fine_row_lookup[coarse_row[i+1]]-fine_row_lookup[coarse_row[i]];
1713  n_fine_blocks_max = std::max(n_fine_blocks_max, del);
1714  }
1715 
1716  // Loop over all coarse seed directions from the coloring
1717  for (casadi_int csd=0; csd<D.size2(); ++csd) {
1718 
1719  casadi_int fci_offset = 0;
1720  casadi_int fci_cap = bvec_size-bvec_i;
1721 
1722  // Flag to indicate if all fine blocks have been handled
1723  bool f_finished = false;
1724 
1725  // Loop while not finished
1726  while (!f_finished) {
1727 
1728  // Loop over all coarse rows that are found in the coloring for this coarse seed direction
1729  for (casadi_int k=D.colind(csd); k<D.colind(csd+1); ++k) {
1730  casadi_int cci = D.row(k);
1731 
1732  // The first and last rows of the fine block
1733  casadi_int fci_start = fine_row_lookup[coarse_row[cci]];
1734  casadi_int fci_end = fine_row_lookup[coarse_row[cci+1]];
1735 
1736  // Local counter that modifies index into bvec
1737  casadi_int bvec_i_mod = 0;
1738 
1739  casadi_int value = -bvec_i + fci_offset + fci_start;
1740 
1741  // Loop over the rows of the fine block
1742  for (casadi_int fci = fci_offset; fci < std::min(fci_end-fci_start, fci_cap); ++fci) {
1743 
1744  // Loop over the coarse block cols that appear in the coloring
1745  // for the current coarse seed direction
1746  for (casadi_int cri=rT.colind(cci);cri<rT.colind(cci+1);++cri) {
1747  lookup_col.push_back(rT.row(cri));
1748  lookup_row.push_back(bvec_i+bvec_i_mod);
1749  lookup_value.push_back(value);
1750  }
1751 
1752  // Toggle on seeds
1753  bvec_toggle(seed_v, fine_row[fci+fci_start], fine_row[fci+fci_start+1],
1754  bvec_i+bvec_i_mod);
1755  bvec_i_mod++;
1756  }
1757  }
1758 
1759  // Bump bvec_i for next major coarse direction
1760  bvec_i+= std::min(n_fine_blocks_max, fci_cap);
1761 
1762  // Check if bvec buffer is full
1763  if (bvec_i==bvec_size || csd==D.size2()-1) {
1764  // Calculate sparsity for bvec_size directions at once
1765 
1766  // Statistics
1767  nsweeps+=1;
1768 
1769  // Construct lookup table
1770  IM lookup = IM::triplet(lookup_row, lookup_col, lookup_value, bvec_size,
1771  coarse_col.size());
1772 
1773  // Propagate the dependencies
1774  if (use_fwd) {
1775  JacSparsityTraits<true>::sp(this, get_ptr(arg_fwd), get_ptr(res),
1776  get_ptr(iw), get_ptr(w), memory(0));
1777  } else {
1778  std::fill(w.begin(), w.end(), 0);
1779  JacSparsityTraits<false>::sp(this, get_ptr(arg_adj), get_ptr(res),
1780  get_ptr(iw), get_ptr(w), memory(0));
1781  }
1782 
1783  // Temporary bit work vector
1784  bvec_t spsens;
1785 
1786  // Loop over the cols of coarse blocks
1787  for (casadi_int cri=0;cri<coarse_col.size()-1;++cri) {
1788 
1789  // Loop over the cols of fine blocks within the current coarse block
1790  for (casadi_int fri=fine_col_lookup[coarse_col[cri]];
1791  fri<fine_col_lookup[coarse_col[cri+1]];++fri) {
1792  // Lump individual sensitivities together into fine block
1793  bvec_or(sens_v, spsens, fine_col[fri], fine_col[fri+1]);
1794 
1795  // Next iteration if no sparsity
1796  if (!spsens) continue;
1797 
1798  // Loop over all bvec_bits
1799  for (casadi_int bvec_i=0;bvec_i<bvec_size;++bvec_i) {
1800  if (spsens & bvec_lookup[bvec_i]) {
1801  // if dependency is found, add it to the new sparsity pattern
1802  casadi_int ind = lookup.sparsity().get_nz(bvec_i, cri);
1803  if (ind==-1) continue;
1804  jrow.push_back(bvec_i+lookup->at(ind));
1805  jcol.push_back(fri);
1806  }
1807  }
1808  }
1809  }
1810 
1811  // Clear the forward seeds/adjoint sensitivities, ready for next bvec sweep
1812  std::fill(s_in.begin(), s_in.end(), 0);
1813 
1814  // Clear the adjoint seeds/forward sensitivities, ready for next bvec sweep
1815  std::fill(s_out.begin(), s_out.end(), 0);
1816 
1817  // Clean lookup table
1818  lookup_col.clear();
1819  lookup_row.clear();
1820  lookup_value.clear();
1821  }
1822 
1823  if (n_fine_blocks_max>fci_cap) {
1824  fci_offset += std::min(n_fine_blocks_max, fci_cap);
1825  bvec_i = 0;
1826  fci_cap = bvec_size;
1827  } else {
1828  f_finished = true;
1829  }
1830 
1831  }
1832 
1833  }
1834 
1835  // Swap results if adjoint mode was used
1836  if (use_fwd) {
1837  // Construct fine sparsity pattern
1838  r = Sparsity::triplet(fine_row.size()-1, fine_col.size()-1, jrow, jcol);
1839  coarse_col = fine_col;
1840  coarse_row = fine_row;
1841  } else {
1842  // Construct fine sparsity pattern
1843  r = Sparsity::triplet(fine_col.size()-1, fine_row.size()-1, jcol, jrow);
1844  coarse_col = fine_row;
1845  coarse_row = fine_col;
1846  }
1847  hasrun = true;
1848  }
1849  if (verbose_) {
1850  casadi_message("Number of sweeps: " + str(nsweeps));
1851  casadi_message("Formed Jacobian sparsity pattern (dimension " + str(r.size()) + ", " +
1852  str(r.nnz()) + " (" + str(r.density()) + " %) nonzeros.");
1853  }
1854 
1855  return r.T();
1856  }
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 1321 of file function_internal.cpp.

1322  {
1323  casadi_assert_dev(has_spfwd());
1324 
1325  // Number of nonzero inputs
1326  casadi_int nz = nnz_in(iind);
1327  casadi_assert_dev(nz==nnz_out(oind));
1328 
1329  // Evaluation buffers
1330  std::vector<const bvec_t*> arg(sz_arg(), nullptr);
1331  std::vector<bvec_t*> res(sz_res(), nullptr);
1332  std::vector<casadi_int> iw(sz_iw());
1333  std::vector<bvec_t> w(sz_w());
1334 
1335  // Seeds
1336  std::vector<bvec_t> seed(nz, 0);
1337  arg[iind] = get_ptr(seed);
1338 
1339  // Sensitivities
1340  std::vector<bvec_t> sens(nz, 0);
1341  res[oind] = get_ptr(sens);
1342 
1343  // Sparsity triplet accumulator
1344  std::vector<casadi_int> jcol, jrow;
1345 
1346  // Cols/rows of the coarse blocks
1347  std::vector<casadi_int> coarse(2, 0); coarse[1] = nz;
1348 
1349  // Cols/rows of the fine blocks
1350  std::vector<casadi_int> fine;
1351 
1352  // In each iteration, subdivide each coarse block in this many fine blocks
1353  casadi_int subdivision = bvec_size;
1354 
1355  Sparsity r = Sparsity::dense(1, 1);
1356 
1357  // The size of a block
1358  casadi_int granularity = nz;
1359 
1360  casadi_int nsweeps = 0;
1361 
1362  bool hasrun = false;
1363 
1364  while (!hasrun || coarse.size()!=nz+1) {
1365  if (verbose_) casadi_message("Block size: " + str(granularity));
1366 
1367  // Clear the sparsity triplet acccumulator
1368  jcol.clear();
1369  jrow.clear();
1370 
1371  // Clear the fine block structure
1372  fine.clear();
1373 
1374  Sparsity D = r.star_coloring();
1375 
1376  if (verbose_) {
1377  casadi_message("Star coloring on " + str(r.dim()) + ": "
1378  + str(D.size2()) + " <-> " + str(D.size1()));
1379  }
1380 
1381  // Clear the seeds
1382  std::fill(seed.begin(), seed.end(), 0);
1383 
1384  // Subdivide the coarse block
1385  for (casadi_int k=0; k<coarse.size()-1; ++k) {
1386  casadi_int diff = coarse[k+1]-coarse[k];
1387  casadi_int new_diff = diff/subdivision;
1388  if (diff%subdivision>0) new_diff++;
1389  std::vector<casadi_int> temp = range(coarse[k], coarse[k+1], new_diff);
1390  fine.insert(fine.end(), temp.begin(), temp.end());
1391  }
1392  if (fine.back()!=coarse.back()) fine.push_back(coarse.back());
1393 
1394  granularity = fine[1] - fine[0];
1395 
1396  // The index into the bvec bit vector
1397  casadi_int bvec_i = 0;
1398 
1399  // Create lookup tables for the fine blocks
1400  std::vector<casadi_int> fine_lookup = lookupvector(fine, nz+1);
1401 
1402  // Triplet data used as a lookup table
1403  std::vector<casadi_int> lookup_col;
1404  std::vector<casadi_int> lookup_row;
1405  std::vector<casadi_int> lookup_value;
1406 
1407  // The maximum number of fine blocks contained in one coarse block
1408  casadi_int n_fine_blocks_max = 0;
1409  for (casadi_int i=0;i<coarse.size()-1;++i) {
1410  casadi_int del = fine_lookup[coarse[i+1]]-fine_lookup[coarse[i]];
1411  n_fine_blocks_max = std::max(n_fine_blocks_max, del);
1412  }
1413 
1414  // Loop over all coarse seed directions from the coloring
1415  for (casadi_int csd=0; csd<D.size2(); ++csd) {
1416 
1417 
1418  casadi_int fci_offset = 0;
1419  casadi_int fci_cap = bvec_size-bvec_i;
1420 
1421  // Flag to indicate if all fine blocks have been handled
1422  bool f_finished = false;
1423 
1424  // Loop while not finished
1425  while (!f_finished) {
1426 
1427  // Loop over all coarse rows that are found in the coloring for this coarse seed direction
1428  for (casadi_int k=D.colind(csd); k<D.colind(csd+1); ++k) {
1429  casadi_int cci = D.row(k);
1430 
1431  // The first and last rows of the fine block
1432  casadi_int fci_start = fine_lookup[coarse[cci]];
1433  casadi_int fci_end = fine_lookup[coarse[cci+1]];
1434 
1435  // Local counter that modifies index into bvec
1436  casadi_int bvec_i_mod = 0;
1437 
1438  casadi_int value = -bvec_i + fci_offset + fci_start;
1439 
1440  //casadi_assert_dev(value>=0);
1441 
1442  // Loop over the rows of the fine block
1443  for (casadi_int fci = fci_offset; fci<std::min(fci_end-fci_start, fci_cap); ++fci) {
1444 
1445  // Loop over the coarse block cols that appear in the
1446  // coloring for the current coarse seed direction
1447  for (casadi_int cri=r.colind(cci);cri<r.colind(cci+1);++cri) {
1448  lookup_col.push_back(r.row(cri));
1449  lookup_row.push_back(bvec_i+bvec_i_mod);
1450  lookup_value.push_back(value);
1451  }
1452 
1453  // Toggle on seeds
1454  bvec_toggle(get_ptr(seed), fine[fci+fci_start], fine[fci+fci_start+1],
1455  bvec_i+bvec_i_mod);
1456  bvec_i_mod++;
1457  }
1458  }
1459 
1460  // Bump bvec_i for next major coarse direction
1461  bvec_i += std::min(n_fine_blocks_max, fci_cap);
1462 
1463  // Check if bvec buffer is full
1464  if (bvec_i==bvec_size || csd==D.size2()-1) {
1465  // Calculate sparsity for bvec_size directions at once
1466 
1467  // Statistics
1468  nsweeps+=1;
1469 
1470  // Construct lookup table
1471  IM lookup = IM::triplet(lookup_row, lookup_col, lookup_value,
1472  bvec_size, coarse.size());
1473 
1474  std::reverse(lookup_col.begin(), lookup_col.end());
1475  std::reverse(lookup_row.begin(), lookup_row.end());
1476  std::reverse(lookup_value.begin(), lookup_value.end());
1477  IM duplicates =
1478  IM::triplet(lookup_row, lookup_col, lookup_value, bvec_size, coarse.size())
1479  - lookup;
1480  duplicates = sparsify(duplicates);
1481  lookup(duplicates.sparsity()) = -bvec_size;
1482 
1483  // Propagate the dependencies
1484  JacSparsityTraits<true>::sp(this, get_ptr(arg), get_ptr(res),
1485  get_ptr(iw), get_ptr(w), nullptr);
1486 
1487  // Temporary bit work vector
1488  bvec_t spsens;
1489 
1490  // Loop over the cols of coarse blocks
1491  for (casadi_int cri=0; cri<coarse.size()-1; ++cri) {
1492 
1493  // Loop over the cols of fine blocks within the current coarse block
1494  for (casadi_int fri=fine_lookup[coarse[cri]];fri<fine_lookup[coarse[cri+1]];++fri) {
1495  // Lump individual sensitivities together into fine block
1496  bvec_or(get_ptr(sens), spsens, fine[fri], fine[fri+1]);
1497 
1498  // Loop over all bvec_bits
1499  for (casadi_int bvec_i=0;bvec_i<bvec_size;++bvec_i) {
1500  if (spsens & (bvec_t(1) << bvec_i)) {
1501  // if dependency is found, add it to the new sparsity pattern
1502  casadi_int ind = lookup.sparsity().get_nz(bvec_i, cri);
1503  if (ind==-1) continue;
1504  casadi_int lk = lookup->at(ind);
1505  if (lk>-bvec_size) {
1506  jrow.push_back(bvec_i+lk);
1507  jcol.push_back(fri);
1508  jrow.push_back(fri);
1509  jcol.push_back(bvec_i+lk);
1510  }
1511  }
1512  }
1513  }
1514  }
1515 
1516  // Clear the forward seeds/adjoint sensitivities, ready for next bvec sweep
1517  std::fill(seed.begin(), seed.end(), 0);
1518 
1519  // Clean lookup table
1520  lookup_col.clear();
1521  lookup_row.clear();
1522  lookup_value.clear();
1523  }
1524 
1525  if (n_fine_blocks_max>fci_cap) {
1526  fci_offset += std::min(n_fine_blocks_max, fci_cap);
1527  bvec_i = 0;
1528  fci_cap = bvec_size;
1529  } else {
1530  f_finished = true;
1531  }
1532  }
1533  }
1534 
1535  // Construct fine sparsity pattern
1536  r = Sparsity::triplet(fine.size()-1, fine.size()-1, jrow, jcol);
1537 
1538  // There may be false positives here that are not present
1539  // in the reverse mode that precedes it.
1540  // This can lead to an assymetrical result
1541  // cf. #1522
1542  r=r*r.T();
1543 
1544  coarse = fine;
1545  hasrun = true;
1546  }
1547  if (verbose_) {
1548  casadi_message("Number of sweeps: " + str(nsweeps));
1549  casadi_message("Formed Jacobian sparsity pattern (dimension " + str(r.size()) +
1550  ", " + str(r.nnz()) + " (" + str(r.density()) + " %) nonzeros.");
1551  }
1552 
1553  return r.T();
1554  }

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 1070 of file function_internal.hpp.

1070  {
1071  return inf;
1072  }
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 1077 of file function_internal.hpp.

1077  {
1078  return -inf;
1079  }

References casadi::inf.

◆ get_n_in()

size_t casadi::Interpolant::get_n_in ( )
inlineoverridevirtual

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

Reimplemented from casadi::FunctionInternal.

Definition at line 62 of file interpolant_impl.hpp.

◆ get_n_out()

size_t casadi::Interpolant::get_n_out ( )
inlineoverridevirtual

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

Reimplemented from casadi::FunctionInternal.

Definition at line 63 of file interpolant_impl.hpp.

63 { return 1;}

◆ get_name_in()

std::string casadi::Interpolant::get_name_in ( casadi_int  i)
overridevirtual

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

Reimplemented from casadi::FunctionInternal.

Definition at line 241 of file interpolant.cpp.

241  {
242  if (i==0) return "x";
243  if (arg_values(i)) return "c";
244  if (arg_grid(i)) return "g";
245  casadi_assert_dev(false);
246  }

References arg_grid(), and arg_values().

◆ get_name_out()

std::string casadi::Interpolant::get_name_out ( casadi_int  i)
overridevirtual

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

Reimplemented from casadi::FunctionInternal.

Definition at line 248 of file interpolant.cpp.

248  {
249  casadi_assert_dev(i==0);
250  return "f";
251  }

◆ get_nominal_in()

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

Reimplemented in casadi::FmuFunction.

Definition at line 1081 of file function_internal.hpp.

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

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 1085 of file function_internal.hpp.

1085  {
1086  return std::vector<double>(nnz_out(ind), 1.);
1087  }

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

◆ get_options()

const Options& casadi::Interpolant::get_options ( ) const
inlineoverridevirtual

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

Reimplemented from casadi::FunctionInternal.

Reimplemented in casadi::LinearInterpolant, and casadi::BSplineInterpolant.

Definition at line 92 of file interpolant_impl.hpp.

92 { return options_;}
static const Options options_
Options.

◆ 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 2011 of file function_internal.cpp.

2013  {
2014  if (verbose_) casadi_message(name_ + "::get_partition");
2015  casadi_assert(allow_forward || allow_reverse, "Inconsistent options");
2016 
2017  // Sparsity pattern with transpose
2018  Sparsity &AT = jac_sparsity(oind, iind, compact, symmetric);
2019  Sparsity A = symmetric ? AT : AT.T();
2020 
2021  // Get seed matrices by graph coloring
2022  if (symmetric) {
2023  casadi_assert_dev(enable_forward_ || enable_fd_);
2024  casadi_assert_dev(allow_forward);
2025 
2026  // Star coloring if symmetric
2027  if (verbose_) casadi_message("FunctionInternal::getPartition star_coloring");
2028  D1 = A.star_coloring();
2029  if (verbose_) {
2030  casadi_message("Star coloring completed: " + str(D1.size2())
2031  + " directional derivatives needed ("
2032  + str(A.size1()) + " without coloring).");
2033  }
2034 
2035  } else {
2036  casadi_assert_dev(enable_forward_ || enable_fd_ || enable_reverse_);
2037  // Get weighting factor
2038  double w = ad_weight();
2039 
2040  // Which AD mode?
2041  if (w==1) allow_forward = false;
2042  if (w==0) allow_reverse = false;
2043  casadi_assert(allow_forward || allow_reverse, "Conflicting ad weights");
2044 
2045  // Best coloring encountered so far (relatively tight upper bound)
2046  double best_coloring = std::numeric_limits<double>::infinity();
2047 
2048  // Test forward mode first?
2049  bool test_fwd_first = allow_forward && w*static_cast<double>(A.size1()) <=
2050  (1-w)*static_cast<double>(A.size2());
2051  casadi_int mode_fwd = test_fwd_first ? 0 : 1;
2052 
2053  // Test both coloring modes
2054  for (casadi_int mode=0; mode<2; ++mode) {
2055  // Is this the forward mode?
2056  bool fwd = mode==mode_fwd;
2057 
2058  // Skip?
2059  if (!allow_forward && fwd) continue;
2060  if (!allow_reverse && !fwd) continue;
2061 
2062  // Perform the coloring
2063  if (fwd) {
2064  if (verbose_) casadi_message("Unidirectional coloring (forward mode)");
2065  bool d = best_coloring>=w*static_cast<double>(A.size1());
2066  casadi_int max_colorings_to_test =
2067  d ? A.size1() : static_cast<casadi_int>(floor(best_coloring/w));
2068  D1 = AT.uni_coloring(A, max_colorings_to_test);
2069  if (D1.is_null()) {
2070  if (verbose_) {
2071  casadi_message("Forward mode coloring interrupted (more than "
2072  + str(max_colorings_to_test) + " needed).");
2073  }
2074  } else {
2075  if (verbose_) {
2076  casadi_message("Forward mode coloring completed: "
2077  + str(D1.size2()) + " directional derivatives needed ("
2078  + str(A.size1()) + " without coloring).");
2079  }
2080  D2 = Sparsity();
2081  best_coloring = w*static_cast<double>(D1.size2());
2082  }
2083  } else {
2084  if (verbose_) casadi_message("Unidirectional coloring (adjoint mode)");
2085  bool d = best_coloring>=(1-w)*static_cast<double>(A.size2());
2086  casadi_int max_colorings_to_test =
2087  d ? A.size2() : static_cast<casadi_int>(floor(best_coloring/(1-w)));
2088 
2089  D2 = A.uni_coloring(AT, max_colorings_to_test);
2090  if (D2.is_null()) {
2091  if (verbose_) {
2092  casadi_message("Adjoint mode coloring interrupted (more than "
2093  + str(max_colorings_to_test) + " needed).");
2094  }
2095  } else {
2096  if (verbose_) {
2097  casadi_message("Adjoint mode coloring completed: "
2098  + str(D2.size2()) + " directional derivatives needed ("
2099  + str(A.size2()) + " without coloring).");
2100  }
2101  D1 = Sparsity();
2102  best_coloring = (1-w)*static_cast<double>(D2.size2());
2103  }
2104  }
2105  }
2106 
2107  }
2108  }
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 1092 of file function_internal.hpp.

1092  {
1093  return eps;
1094  }

References casadi::eps.

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

◆ get_reverse()

Function casadi::FunctionInternal::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
virtualinherited

◆ get_sparsity_in()

Sparsity casadi::Interpolant::get_sparsity_in ( casadi_int  i)
overridevirtual

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

Reimplemented from casadi::FunctionInternal.

Definition at line 229 of file interpolant.cpp.

229  {
230  if (i==0) return Sparsity::dense(ndim_, batch_x_);
231  if (arg_values(i)) return Sparsity::dense(coeff_size());
232  if (arg_grid(i)) return Sparsity::dense(offset_.back());
233  casadi_assert_dev(false);
234  }

References arg_grid(), arg_values(), batch_x_, coeff_size(), casadi::Sparsity::dense(), ndim_, and offset_.

◆ get_sparsity_out()

Sparsity casadi::Interpolant::get_sparsity_out ( casadi_int  i)
overridevirtual

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

Reimplemented from casadi::FunctionInternal.

Definition at line 236 of file interpolant.cpp.

236  {
237  casadi_assert_dev(i==0);
238  return Sparsity::dense(m_, batch_x_);
239  }

References batch_x_, casadi::Sparsity::dense(), and m_.

◆ 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 2980 of file function_internal.cpp.

2980  {
2981  Dict stats = ProtoFunction::get_stats(mem);
2982  auto m = static_cast<FunctionMemory*>(mem);
2983  casadi_assert(m->stats_available,
2984  "No stats available: Function '" + name_ + "' not set up. "
2985  "To get statistics, first evaluate it numerically.");
2986  return stats;
2987  }
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< Interpolant >::Plugin & casadi::PluginInterface< Interpolant >::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 424 of file function_internal.hpp.

424 { return false;}

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

◆ has_forward()

virtual bool casadi::FunctionInternal::has_forward ( casadi_int  nfwd) const
inlinevirtualinherited

◆ 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 743 of file function_internal.hpp.

743 { 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 369 of file function_internal.hpp.

369 {return false;}

◆ has_jac_sparsity()

virtual bool casadi::FunctionInternal::has_jac_sparsity ( casadi_int  oind,
casadi_int  iind 
) const
inlinevirtualinherited

◆ has_jacobian()

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

◆ has_memory()

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

Definition at line 3665 of file function_internal.cpp.

3665  {
3666  return ind<mem_.size();
3667  }

◆ 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 1004 of file function_internal.cpp.

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

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

◆ has_parametric_grid()

bool casadi::Interpolant::has_parametric_grid ( ) const
inline

◆ has_parametric_values()

bool casadi::Interpolant::has_parametric_values ( ) const
inline

◆ has_plugin()

bool casadi::PluginInterface< Interpolant >::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()

virtual bool casadi::FunctionInternal::has_reverse ( casadi_int  nadj) const
inlinevirtualinherited

◆ 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 1126 of file function_internal.hpp.

1126  {
1127  for (casadi_int i=0; i<name_in_.size(); ++i) {
1128  if (name_in_[i]==name) return i;
1129  }
1130  casadi_error("FunctionInternal::index_in: could not find entry \""
1131  + name + "\". Available names are: " + str(name_in_) + ".");
1132  return -1;
1133  }

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 1138 of file function_internal.hpp.

1138  {
1139  for (casadi_int i=0; i<name_out_.size(); ++i) {
1140  if (name_out_[i]==name) return i;
1141  }
1142  casadi_error("FunctionInternal::index_out: could not find entry \""
1143  + name + "\". Available names are: " + str(name_out_) + ".");
1144  return -1;
1145  }

References casadi::str().

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

◆ info()

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

◆ init()

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

Reimplemented from casadi::FunctionInternal.

Reimplemented in casadi::LinearInterpolant, and casadi::BSplineInterpolant.

Definition at line 298 of file interpolant.cpp.

298  {
299 
300  batch_x_ = 1;
301 
302  // Read options
303  for (auto&& op : opts) {
304  if (op.first=="lookup_mode") {
305  lookup_modes_ = op.second;
306  } else if (op.first=="batch_x") {
307  batch_x_ = op.second;
308  }
309  }
310 
311  // Call the base class initializer
313 
314  // Needed by casadi_interpn
315  alloc_w(ndim_, true);
316  alloc_iw(2*ndim_, true);
317  }
void init(const Dict &opts) override
Initialize.

References casadi::FunctionInternal::alloc_iw(), casadi::FunctionInternal::alloc_w(), batch_x_, casadi::FunctionInternal::init(), lookup_modes_, and ndim_.

Referenced by casadi::BSplineInterpolant::init(), and casadi::LinearInterpolant::init().

◆ init_mem()

int casadi::ProtoFunction::init_mem ( void *  mem) const
virtualinherited

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

Reimplemented in casadi::SymbolicQr, casadi::Sqpmethod, casadi::Scpgen, casadi::Qrqp, casadi::Newton, casadi::Lsqr, casadi::LinsolTridiag, casadi::LinsolQr, casadi::LinsolLdl, casadi::Ipqp, casadi::Feasiblesqpmethod, casadi::FastNewton, casadi::WorhpInterface, casadi::SuperscsInterface, casadi::SundialsInterface, casadi::KinsolInterface, casadi::IdasInterface, casadi::CvodesInterface, casadi::SnoptInterface, casadi::SlicotExpm, casadi::SlicotDple, casadi::SLEQPInterface, casadi::QpoasesInterface, casadi::ProxqpInterface, casadi::OsqpInterface, casadi::MumpsInterface, casadi::MadnlpInterface, casadi::LapackQr, casadi::LapackLu, casadi::KnitroInterface, casadi::IpoptInterface, casadi::Ma27Interface, casadi::HpmpcInterface, casadi::HpipmInterface, casadi::HighsInterface, casadi::GurobiInterface, casadi::FatropInterface, casadi::FatropConicInterface, casadi::DaqpInterface, casadi::CsparseInterface, casadi::CSparseCholeskyInterface, casadi::CplexInterface, casadi::ClpInterface, casadi::ClarabelInterface, casadi::CbcInterface, casadi::BonminInterface, casadi::Blocksqp, casadi::AmplInterface, casadi::AlpaqaInterface, casadi::Rootfinder, casadi::OracleFunction, casadi::Nlpsol, casadi::LinsolInternal, casadi::FixedStepIntegrator, casadi::Integrator, casadi::FmuFunction, and casadi::Conic.

Definition at line 813 of file function_internal.cpp.

813  {
814  auto m = static_cast<ProtoFunctionMemory*>(mem);
815  if (record_time_) {
816  m->add_stat("total");
817  m->t_total = &m->fstats.at("total");
818  } else {
819  m->t_total = nullptr;
820  }
821  return 0;
822  }

References casadi::ProtoFunctionMemory::add_stat(), and casadi::ProtoFunction::record_time_.

Referenced by casadi::ProtoFunction::checkout(), casadi::FunctionInternal::codegen_checkout(), casadi::Conic::init_mem(), casadi::FmuFunction::init_mem(), casadi::LinsolInternal::init_mem(), casadi::OracleFunction::init_mem(), casadi::SlicotDple::init_mem(), casadi::SlicotExpm::init_mem(), and casadi::OracleFunction::local_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()

Interpolant * casadi::PluginInterface< Interpolant >::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.

◆ 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 3402 of file function_internal.cpp.

3402  {
3403  casadi_error("'instruction_constant' not defined for " + class_name());
3404  }

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 3394 of file function_internal.cpp.

3394  {
3395  casadi_error("'instruction_id' not defined for " + class_name());
3396  }

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 3398 of file function_internal.cpp.

3398  {
3399  casadi_error("'instruction_input' not defined for " + class_name());
3400  }

References casadi::SharedObjectInternal::class_name().

◆ instruction_MX()

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

Reimplemented in casadi::MXFunction.

Definition at line 3410 of file function_internal.cpp.

3410  {
3411  casadi_error("'instruction_MX' not defined for " + class_name());
3412  }

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 3406 of file function_internal.cpp.

3406  {
3407  casadi_error("'instruction_output' not defined for " + class_name());
3408  }

References casadi::SharedObjectInternal::class_name().

◆ instructions_sx()

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

Reimplemented in casadi::SXFunction.

Definition at line 3414 of file function_internal.cpp.

3414  {
3415  casadi_error("'instructions_sx' not defined for " + class_name());
3416  }

References casadi::SharedObjectInternal::class_name().

◆ interpret_lookup_mode()

std::vector< casadi_int > casadi::Interpolant::interpret_lookup_mode ( const std::vector< std::string > &  modes,
const std::vector< double > &  grid,
const std::vector< casadi_int > &  offset,
const std::vector< casadi_int > &  margin_left = std::vector<casadi_int>(),
const std::vector< casadi_int > &  margin_right = std::vector<casadi_int>() 
)
static

Definition at line 319 of file interpolant.cpp.

322  {
323  casadi_assert_dev(modes.empty() || modes.size()==offset.size()-1);
324 
325  std::vector<casadi_int> ret;
326  for (casadi_int i=0;i<offset.size()-1;++i) {
327  casadi_int n = offset[i+1]-offset[i];
328  ret.push_back(Low::interpret_lookup_mode(modes.empty() ? "auto": modes[i], n));
329  }
330 
331  for (casadi_int i=0;i<offset.size()-1;++i) {
332  if (ret[i]==LOOKUP_EXACT) {
333  if (!knots.empty()) {
334  casadi_int m_left = margin_left.empty() ? 0 : margin_left[i];
335  casadi_int m_right = margin_right.empty() ? 0 : margin_right[i];
336 
337  std::vector<double> grid(
338  knots.begin()+offset[i]+m_left,
339  knots.begin()+offset[i+1]-m_right);
340  casadi_assert_dev(is_increasing(grid) && is_equally_spaced(grid));
341  }
342  }
343  }
344  return ret;
345  }
static casadi_int interpret_lookup_mode(const std::string &lookup_mode, casadi_int n)
Definition: casadi_low.cpp:61
bool is_equally_spaced(const std::vector< double > &v)
constexpr casadi_int LOOKUP_EXACT

References casadi::Low::interpret_lookup_mode(), casadi::is_equally_spaced(), casadi::is_increasing(), and casadi::LOOKUP_EXACT.

Referenced by casadi::BlazingSplineFunction::codegen_body(), casadi::BSplineParametric::create(), casadi::BSpline::create(), casadi::BSpline::dual(), and casadi::LinearInterpolant::init().

◆ 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 1858 of file function_internal.cpp.

1858  {
1859  // If derivative expression
1860  if (!derivative_of_.is_null()) {
1861  std::string n = derivative_of_.name();
1862  // Reverse move
1863  if (name_ == "adj1_" + n) {
1864  if (iind == oind) return true;
1865  }
1866  }
1867  // Not symmetric by default
1868  return false;
1869  }
const std::string & name() const
Name of the function.
Definition: function.cpp:1315

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 1946 of file function_internal.cpp.

1947  {
1948 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
1949  // Safe access to jac_sparsity_
1950  std::lock_guard<std::mutex> lock(jac_sparsity_mtx_);
1951 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
1952  // If first call, allocate cache
1953  for (bool c : {false, true}) {
1954  if (jac_sparsity_[c].empty()) jac_sparsity_[c].resize(n_in_ * n_out_);
1955  }
1956  // Flat index
1957  casadi_int ind = iind + oind * n_in_;
1958  // Reference to the block
1959  Sparsity& jsp = jac_sparsity_[compact].at(ind);
1960  // If null, generate
1961  if (jsp.is_null()) {
1962  // Use (non)-compact pattern, if given
1963  Sparsity& jsp_other = jac_sparsity_[!compact].at(ind);
1964  if (!jsp_other.is_null()) {
1965  jsp = compact ? to_compact(oind, iind, jsp_other) : from_compact(oind, iind, jsp_other);
1966  } else {
1967  // Generate pattern
1968  Sparsity sp;
1969  bool sp_is_compact;
1970  if (!is_diff_out_.at(oind) || !is_diff_in_.at(iind)) {
1971  // All-zero sparse
1972  sp = Sparsity(nnz_out(oind), nnz_in(iind));
1973  sp_is_compact = true;
1974  } else {
1975  // Use internal routine to determine sparsity
1976  if (has_spfwd() || has_sprev() || has_jac_sparsity(oind, iind)) {
1977  sp = get_jac_sparsity(oind, iind, symmetric);
1978  }
1979  // If null, dense
1980  if (sp.is_null()) sp = Sparsity::dense(nnz_out(oind), nnz_in(iind));
1981  // Is the return the compact pattern?
1982  sp_is_compact = sp.size1() == nnz_out(oind) && sp.size2() == nnz_in(iind);
1983  }
1984  // Save to cache and convert if needed
1985  if (sp_is_compact == compact) {
1986  jsp = sp;
1987  } else {
1988  jsp_other = sp;
1989  jsp = compact ? to_compact(oind, iind, sp) : from_compact(oind, iind, sp);
1990  }
1991  }
1992  }
1993 
1994  // Make sure the Jacobian is symmetric if requested, cf. #1522, #3074, #3134
1995  if (symmetric) {
1996  if (compact) {
1997  Sparsity sp = from_compact(oind, iind, jsp);
1998  if (!sp.is_symmetric()) {
1999  sp = sp * sp.T();
2000  jsp = to_compact(oind, iind, sp);
2001  }
2002  } else {
2003  if (!jsp.is_symmetric()) jsp = jsp * jsp.T();
2004  }
2005  }
2006 
2007  // Return a reference to the block
2008  return jsp;
2009  }
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.
virtual Sparsity get_jac_sparsity(casadi_int oind, casadi_int iind, bool symmetric) const
Get Jacobian sparsity.

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 2341 of file function_internal.cpp.

2341  {
2342  // Used wrapped function if jacobian not available
2343  if (!has_jacobian()) {
2344  // Derivative information must be available
2345  casadi_assert(has_derivative(),
2346  "Derivatives cannot be calculated for " + name_);
2347  return wrap().jacobian();
2348  }
2349  // Retrieve/generate cached
2350  Function f;
2351  std::string fname = "jac_" + name_;
2352  if (!incache(fname, f)) {
2353  // Names of inputs
2354  std::vector<std::string> inames;
2355  for (casadi_int i=0; i<n_in_; ++i) inames.push_back(name_in_[i]);
2356  for (casadi_int i=0; i<n_out_; ++i) inames.push_back("out_" + name_out_[i]);
2357  // Names of outputs
2358  std::vector<std::string> onames;
2359  onames.reserve(n_in_ * n_out_);
2360  for (size_t oind = 0; oind < n_out_; ++oind) {
2361  for (size_t iind = 0; iind < n_in_; ++iind) {
2362  onames.push_back("jac_" + name_out_[oind] + "_" + name_in_[iind]);
2363  }
2364  }
2365  // Options
2367  opts["derivative_of"] = self();
2368  // Generate derivative function
2369  casadi_assert_dev(enable_jacobian_);
2370  f = get_jacobian(fname, inames, onames, opts);
2371  // Consistency checks
2372  casadi_assert(f.n_in() == inames.size(),
2373  "Mismatching input signature, expected " + str(inames));
2374  casadi_assert(f.n_out() == onames.size(),
2375  "Mismatching output signature, expected " + str(onames));
2376  // Save to cache
2377  tocache_if_missing(f);
2378  }
2379  return f;
2380  }
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 919 of file function_internal.hpp.

919 {}

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

◆ load_library()

handle_t casadi::PluginInterface< Interpolant >::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:67

◆ load_plugin()

PluginInterface< Interpolant >::Plugin casadi::PluginInterface< Interpolant >::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 1091 of file function_internal.cpp.

1091  {
1092  Function f;
1093  if (parallelization=="serial") {
1094  // Serial maps are cached
1095  std::string fname = "map" + str(n) + "_" + name_;
1096  if (!incache(fname, f)) {
1097  // Create new serial map
1098  f = Map::create(parallelization, self(), n);
1099  casadi_assert_dev(f.name()==fname);
1100  // Save in cache
1101  tocache_if_missing(f);
1102  }
1103  } else {
1104  // Non-serial maps are not cached
1105  f = Map::create(parallelization, self(), n);
1106  }
1107  return f;
1108  }
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 3423 of file function_internal.cpp.

3424  {
3425  if (x.empty()) return x;
3426  // Check number of arguments
3427  casadi_assert(x.size()==n_in_, "mapsum_mx: Wrong number_i of arguments");
3428  // Number of parallel calls
3429  casadi_int npar = 1;
3430  // Check/replace arguments
3431  std::vector<MX> x_mod(x.size());
3432  for (casadi_int i=0; i<n_in_; ++i) {
3433  if (check_mat(x[i].sparsity(), sparsity_in_[i], npar)) {
3434  x_mod[i] = replace_mat(x[i], sparsity_in_[i], npar);
3435  } else {
3436  // Mismatching sparsity: The following will throw an error message
3437  npar = 0;
3438  check_arg(x, npar);
3439  }
3440  }
3441 
3442  casadi_int n = 1;
3443  for (casadi_int i=0; i<x_mod.size(); ++i) {
3444  n = std::max(x_mod[i].size2() / size2_in(i), n);
3445  }
3446 
3447  std::vector<casadi_int> reduce_in;
3448  for (casadi_int i=0; i<x_mod.size(); ++i) {
3449  if (x_mod[i].size2()/size2_in(i)!=n) {
3450  reduce_in.push_back(i);
3451  }
3452  }
3453 
3454  Function ms = self().map("mapsum", parallelization, n, reduce_in, range(n_out_));
3455 
3456  // Call the internal function
3457  return ms(x_mod);
3458  }
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 1745 of file function_internal.hpp.

1745  {
1746  check_arg(arg, npar);
1747  for (casadi_int i=0; i<n_in_; ++i) {
1748  if (arg.at(i).size1()!=size1_in(i)) return false;
1749  if (arg.at(i).size2()!=size2_in(i) && arg.at(i).size2()!=npar*size2_in(i)) return false;
1750  }
1751  return true;
1752  }

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 1755 of file function_internal.hpp.

1755  {
1756  check_res(res, npar);
1757  for (casadi_int i=0; i<n_out_; ++i) {
1758  if (res.at(i).size1()!=size1_out(i)) return false;
1759  if (res.at(i).size2()!=size2_out(i) && res.at(i).size2()!=npar*size2_out(i)) return false;
1760  }
1761  return true;
1762  }
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 3658 of file function_internal.cpp.

3658  {
3659 #ifdef CASADI_WITH_THREAD
3660  std::lock_guard<std::mutex> lock(mtx_);
3661 #endif //CASADI_WITH_THREAD
3662  return mem_.at(ind);
3663  }

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 3372 of file function_internal.cpp.

3373  {
3374  return;
3375  }

◆ meshgrid()

std::vector< double > casadi::Interpolant::meshgrid ( const std::vector< std::vector< double > > &  grid)
static

Definition at line 83 of file interpolant.cpp.

83  {
84  std::vector<casadi_int> cnts(grid.size()+1, 0);
85  std::vector<casadi_int> sizes(grid.size(), 0);
86  for (casadi_int k=0;k<grid.size();++k) sizes[k]= grid[k].size();
87 
88  casadi_int total_iter = 1;
89  for (casadi_int k=0;k<grid.size();++k) total_iter*= sizes[k];
90 
91  casadi_int n_dims = grid.size();
92 
93  std::vector<double> ret(total_iter*n_dims);
94  for (casadi_int i=0;i<total_iter;++i) {
95 
96  for (casadi_int j=0;j<grid.size();++j) {
97  ret[i*n_dims+j] = grid[j][cnts[j]];
98  }
99 
100  cnts[0]++;
101  casadi_int j = 0;
102  while (j<n_dims && cnts[j]==sizes[j]) {
103  cnts[j] = 0;
104  j++;
105  cnts[j]++;
106  }
107 
108  }
109 
110  return ret;
111  }

Referenced by casadi::BSplineInterpolant::construct_graph().

◆ 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 3352 of file function_internal.cpp.

3352  {
3353  std::vector<MX> ret(n_in_);
3354  for (casadi_int i=0; i<ret.size(); ++i) {
3355  ret[i] = mx_in(i);
3356  }
3357  return ret;
3358  }
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

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

Reimplemented in casadi::MXFunction.

Definition at line 3344 of file function_internal.cpp.

3344  {
3345  return MX::sym(name_in_.at(ind), sparsity_in(ind));
3346  }
static MX sym(const std::string &name, casadi_int nrow=1, casadi_int ncol=1)
Create an nrow-by-ncol symbolic primitive.

References casadi::FunctionInternal::name_in_, casadi::FunctionInternal::sparsity_in(), and casadi::GenericMatrix< MX >::sym().

◆ 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 3360 of file function_internal.cpp.

3360  {
3361  std::vector<MX> ret(n_out_);
3362  for (casadi_int i=0; i<ret.size(); ++i) {
3363  ret[i] = mx_out(i);
3364  }
3365  return ret;
3366  }
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 3390 of file function_internal.cpp.

3390  {
3391  casadi_error("'n_instructions' not defined for " + class_name());
3392  }

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 3418 of file function_internal.cpp.

3418  {
3419  casadi_error("'n_nodes' not defined for " + class_name());
3420  }

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 2301 of file function_internal.cpp.

2301  {
2302  casadi_int ret=0;
2303  for (casadi_int iind=0; iind<n_in_; ++iind) ret += nnz_in(iind);
2304  return ret;
2305  }

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 974 of file function_internal.hpp.

974 { 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 976 of file function_internal.hpp.

976 { 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 2313 of file function_internal.cpp.

2313  {
2314  casadi_int ret=0;
2315  for (casadi_int iind=0; iind<n_in_; ++iind) ret += numel_in(iind);
2316  return ret;
2317  }

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 984 of file function_internal.hpp.

984 { 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 2319 of file function_internal.cpp.

2319  {
2320  casadi_int ret=0;
2321  for (casadi_int oind=0; oind<n_out_; ++oind) ret += numel_out(oind);
2322  return ret;
2323  }

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 985 of file function_internal.hpp.

985 { 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 3513 of file function_internal.cpp.

3513  {
3514  // Disallow parallel inputs
3515  casadi_int npar = -1;
3516  if (!matching_arg(arg, npar)) {
3517  return nz_in(replace_arg(arg, npar));
3518  }
3519 
3520  std::vector<DM> arg2 = project_arg(arg, 1);
3521  std::vector<double> ret(nnz_in());
3522  casadi_int offset = 0;
3523  for (casadi_int i=0;i<n_in_;++i) {
3524  const double* e = arg2.at(i).ptr();
3525  std::copy(e, e+nnz_in(i), ret.begin()+offset);
3526  offset+= nnz_in(i);
3527  }
3528  return ret;
3529  }

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 3483 of file function_internal.cpp.

3483  {
3484  casadi_assert(nnz_in()==arg.size(),
3485  "Dimension mismatch. Expecting " + str(nnz_in()) +
3486  ", got " + str(arg.size()) + " instead.");
3487 
3488  std::vector<DM> ret = dm_in();
3489  casadi_int offset = 0;
3490  for (casadi_int i=0;i<n_in_;++i) {
3491  DM& r = ret.at(i);
3492  std::copy(arg.begin()+offset, arg.begin()+offset+nnz_in(i), r.ptr());
3493  offset+= nnz_in(i);
3494  }
3495  return ret;
3496  }

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 3531 of file function_internal.cpp.

3531  {
3532  // Disallow parallel inputs
3533  casadi_int npar = -1;
3534  if (!matching_res(res, npar)) {
3535  return nz_out(replace_res(res, npar));
3536  }
3537 
3538  std::vector<DM> res2 = project_res(res, 1);
3539  std::vector<double> ret(nnz_out());
3540  casadi_int offset = 0;
3541  for (casadi_int i=0;i<n_out_;++i) {
3542  const double* e = res2.at(i).ptr();
3543  std::copy(e, e+nnz_out(i), ret.begin()+offset);
3544  offset+= nnz_out(i);
3545  }
3546  return ret;
3547  }
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 3498 of file function_internal.cpp.

3498  {
3499  casadi_assert(nnz_out()==res.size(),
3500  "Dimension mismatch. Expecting " + str(nnz_out()) +
3501  ", got " + str(res.size()) + " instead.");
3502 
3503  std::vector<DM> ret = dm_out();
3504  casadi_int offset = 0;
3505  for (casadi_int i=0;i<n_out_;++i) {
3506  DM& r = ret.at(i);
3507  std::copy(res.begin()+offset, res.begin()+offset+nnz_out(i), r.ptr());
3508  offset+= nnz_out(i);
3509  }
3510  return ret;
3511  }

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 3736 of file function_internal.cpp.

3736  {
3737  casadi_error("'oracle' not defined for " + class_name());
3738  static Function singleton;
3739  return singleton;
3740  }

References casadi::SharedObjectInternal::class_name().

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

◆ plugin_deserialize()

Deserialize casadi::PluginInterface< Interpolant >::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  }
ProtoFunction *(* Deserialize)(DeserializingStream &)

◆ plugin_name()

virtual const char* casadi::PluginInterface< Interpolant >::plugin_name ( ) const
pure virtualinherited

◆ plugin_options()

const Options & casadi::PluginInterface< Interpolant >::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< Interpolant >::Plugin casadi::PluginInterface< Interpolant >::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 3897 of file function_internal.cpp.

3897  {
3898  // Variable number of arguments
3899  va_list args;
3900  va_start(args, fmt);
3901  // Static & dynamic buffers
3902  char buf[256];
3903  size_t buf_sz = sizeof(buf);
3904  char* buf_dyn = nullptr;
3905  // Try to print with a small buffer
3906  casadi_int n = vsnprintf(buf, buf_sz, fmt, args);
3907  // Need a larger buffer?
3908  if (n>static_cast<casadi_int>(buf_sz)) {
3909  buf_sz = static_cast<size_t>(n+1);
3910  buf_dyn = new char[buf_sz];
3911  n = vsnprintf(buf_dyn, buf_sz, fmt, args);
3912  }
3913  // Print buffer content
3914  if (n>=0) uout() << (buf_dyn ? buf_dyn : buf) << std::flush;
3915  // Cleanup
3916  delete[] buf_dyn;
3917  va_end(args);
3918  // Throw error if failure
3919  casadi_assert(n>=0, "Print failure while processing '" + std::string(fmt) + "'");
3920  }

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_canonical() [1/3]

void casadi::FunctionInternal::print_canonical ( std::ostream &  stream,
casadi_int  sz,
const double *  nz 
)
staticinherited

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

Definition at line 858 of file function_internal.cpp.

858  {
859  StreamStateGuard backup(stream);
860  normalized_setup(stream);
861  if (nz) {
862  stream << "[";
863  for (casadi_int i=0; i<sz; ++i) {
864  if (i>0) stream << ", ";
865  normalized_out(stream, nz[i]);
866  }
867  stream << "]";
868  } else {
869  stream << "NULL";
870  }
871  }

References casadi::normalized_out(), and casadi::normalized_setup().

◆ print_canonical() [2/3]

void casadi::FunctionInternal::print_canonical ( std::ostream &  stream,
const Sparsity sp,
const double *  nz 
)
staticinherited

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

Definition at line 873 of file function_internal.cpp.

874  {
875  StreamStateGuard backup(stream);
876  normalized_setup(stream);
877  if (nz) {
878  if (!sp.is_scalar(true)) {
879  stream << sp.dim(false) << ": ";
880  stream << "[";
881  }
882  for (casadi_int i=0; i<sp.nnz(); ++i) {
883  if (i>0) stream << ", ";
884  normalized_out(stream, nz[i]);
885  }
886  if (!sp.is_scalar(true)) {
887  stream << "]";
888  if (!sp.is_dense()) {
889  stream << ", colind: [";
890  for (casadi_int i=0; i<sp.size2(); ++i) {
891  if (i>0) stream << ", ";
892  stream << sp.colind()[i];
893  }
894  stream << "]";
895  stream << ", row: [";
896  for (casadi_int i=0; i<sp.nnz(); ++i) {
897  if (i>0) stream << ", ";
898  stream << sp.row()[i];
899  }
900  stream << "]";
901  }
902  }
903  } else {
904  stream << "NULL";
905  }
906  }

References casadi::Sparsity::colind(), casadi::Sparsity::dim(), casadi::Sparsity::is_dense(), casadi::Sparsity::is_scalar(), casadi::Sparsity::nnz(), casadi::normalized_out(), casadi::normalized_setup(), casadi::Sparsity::row(), and casadi::Sparsity::size2().

Referenced by casadi::Monitor::eval(), casadi::MXFunction::print_arg(), casadi::SXFunction::print_arg(), casadi::FunctionInternal::print_in(), casadi::FunctionInternal::print_out(), casadi::MXFunction::print_res(), and casadi::SXFunction::print_res().

◆ print_canonical() [3/3]

void casadi::FunctionInternal::print_canonical ( std::ostream &  stream,
double  a 
)
staticinherited

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

Definition at line 908 of file function_internal.cpp.

908  {
909  StreamStateGuard backup(stream);
910  normalized_setup(stream);
911  normalized_out(stream, a);
912  }

References casadi::normalized_out(), and casadi::normalized_setup().

◆ 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 983 of file function_internal.cpp.

983  {
984  stream << " Number of inputs: " << n_in_ << std::endl;
985  for (casadi_int i=0; i<n_in_; ++i) {
986  stream << " Input " << i << " (\"" << name_in_[i] << "\"): "
987  << sparsity_in_[i].dim() << std::endl;
988  }
989  stream << " Number of outputs: " << n_out_ << std::endl;
990  for (casadi_int i=0; i<n_out_; ++i) {
991  stream << " Output " << i << " (\"" << name_out_[i] << "\"): "
992  << sparsity_out_[i].dim() << std::endl;
993  }
994  }

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 824 of file function_internal.cpp.

824  {
825  stream << "Function " << name_ << " (" << this << ")" << std::endl;
826  for (casadi_int i=0; i<n_in_; ++i) {
827  stream << "Input " << i << " (" << name_in_[i] << "): ";
828  if (arg[i]) {
829  if (print_canonical_) {
830  print_canonical(stream, sparsity_in_[i], arg[i]);
831  } else {
832  DM::print_default(stream, sparsity_in_[i], arg[i], truncate);
833  }
834  stream << std::endl;
835  } else {
836  stream << "NULL" << std::endl;
837  }
838  }
839  }
static void print_canonical(std::ostream &stream, const Sparsity &sp, const double *nz)
Print canonical representation of a numeric matrix.
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::FunctionInternal::print_canonical(), casadi::FunctionInternal::print_canonical_, 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 1000 of file function_internal.cpp.

1000  {
1001  get_options().print_one(name, stream);
1002  }
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 996 of file function_internal.cpp.

996  {
997  get_options().print_all(stream);
998  }
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 841 of file function_internal.cpp.

841  {
842  stream << "Function " << name_ << " (" << this << ")" << std::endl;
843  for (casadi_int i=0; i<n_out_; ++i) {
844  stream << "Output " << i << " (" << name_out_[i] << "): ";
845  if (res[i]) {
846  if (print_canonical_) {
847  print_canonical(stream, sparsity_out_[i], res[i]);
848  } else {
849  DM::print_default(stream, sparsity_out_[i], res[i], truncate);
850  }
851  stream << std::endl;
852  } else {
853  stream << "NULL" << std::endl;
854  }
855  }
856  }

References casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::FunctionInternal::name_out_, casadi::FunctionInternal::print_canonical(), casadi::FunctionInternal::print_canonical_, 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 3817 of file function_internal.cpp.

3817  {
3818  if (!print_time_) return;
3819  // Length of the name being printed
3820  size_t name_len=0;
3821  for (auto &&s : fstats) {
3822  name_len = std::max(s.first.size(), name_len);
3823  }
3824  name_len = std::max(name_.size(), name_len);
3825 
3826  // Print name with a given length. Format: "%NNs "
3827  char namefmt[10];
3828  sprint(namefmt, sizeof(namefmt), "%%%ds ", static_cast<casadi_int>(name_len));
3829 
3830  // Print header
3831  print(namefmt, name_.c_str());
3832 
3833  print(" : %8s %10s %8s %10s %9s\n", "t_proc", "(avg)", "t_wall", "(avg)", "n_eval");
3834 
3835 
3836  char buffer_proc[10];
3837  char buffer_wall[10];
3838  char buffer_proc_avg[10];
3839  char buffer_wall_avg[10];
3840 
3841  // Print keys
3842  for (const auto &s : fstats) {
3843  if (s.second.n_call!=0) {
3844  print(namefmt, s.first.c_str());
3845  format_time(buffer_proc, s.second.t_proc);
3846  format_time(buffer_wall, s.second.t_wall);
3847  format_time(buffer_proc_avg, s.second.t_proc/s.second.n_call);
3848  format_time(buffer_wall_avg, s.second.t_wall/s.second.n_call);
3849  print(" | %s (%s) %s (%s) %9d\n",
3850  buffer_proc, buffer_proc_avg,
3851  buffer_wall, buffer_wall_avg, s.second.n_call);
3852  }
3853  }
3854  }
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 1617 of file function_internal.hpp.

1618  {
1619  casadi_assert_dev(arg.size()==n_in_);
1620 
1621  // Which arguments require mapped evaluation
1622  std::vector<bool> mapped(n_in_);
1623  for (casadi_int i=0; i<n_in_; ++i) {
1624  mapped[i] = arg[i].size2()!=size2_in(i);
1625  }
1626 
1627  // Check if matching input sparsity
1628  std::vector<bool> matching(n_in_);
1629  bool any_mismatch = false;
1630  for (casadi_int i=0; i<n_in_; ++i) {
1631  if (mapped[i]) {
1632  matching[i] = arg[i].sparsity().is_stacked(sparsity_in(i), npar);
1633  } else {
1634  matching[i] = arg[i].sparsity()==sparsity_in(i);
1635  }
1636  any_mismatch = any_mismatch || !matching[i];
1637  }
1638 
1639  // Correct input sparsity
1640  if (any_mismatch) {
1641  std::vector<M> arg2(arg);
1642  for (casadi_int i=0; i<n_in_; ++i) {
1643  if (!matching[i]) {
1644  if (mapped[i]) {
1645  arg2[i] = project(arg2[i], repmat(sparsity_in(i), 1, npar));
1646  } else {
1647  arg2[i] = project(arg2[i], sparsity_in(i));
1648  }
1649  }
1650  }
1651  return arg2;
1652  }
1653  return arg;
1654  }

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 1657 of file function_internal.hpp.

1658  {
1659  return arg;
1660  }

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 1510 of file function_internal.hpp.

1510  {
1511  for (auto i=v.begin(); i!=v.end(); ++i) {
1512  if (!i->is_zero()) return false;
1513  }
1514  return true;
1515  }

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

◆ registerPlugin() [1/2]

void casadi::PluginInterface< Interpolant >::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< Interpolant >::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 3690 of file function_internal.cpp.

3690  {
3691 #ifdef CASADI_WITH_THREAD
3692  std::lock_guard<std::mutex> lock(mtx_);
3693 #endif //CASADI_WITH_THREAD
3694  unused_.push(mem);
3695  }

◆ 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 1790 of file function_internal.hpp.

1791  {
1792  std::vector<M> r(arg.size());
1793  for (casadi_int i=0; i<r.size(); ++i) r[i] = replace_mat(arg[i], sparsity_in(i), npar);
1794  return r;
1795  }

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 1814 of file function_internal.hpp.

1815  {
1816  std::vector<std::vector<M> > r(aseed.size());
1817  for (casadi_int d=0; d<r.size(); ++d) r[d] = replace_res(aseed[d], npar);
1818  return r;
1819  }

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 1806 of file function_internal.hpp.

1807  {
1808  std::vector<std::vector<M> > r(fseed.size());
1809  for (casadi_int d=0; d<r.size(); ++d) r[d] = replace_arg(fseed[d], npar);
1810  return r;
1811  }

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 1798 of file function_internal.hpp.

1799  {
1800  std::vector<M> r(res.size());
1801  for (casadi_int i=0; i<r.size(); ++i) r[i] = replace_mat(res[i], sparsity_out(i), npar);
1802  return r;
1803  }

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

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

◆ reset_dump_count()

void casadi::FunctionInternal::reset_dump_count ( )
inherited

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

Definition at line 461 of file function_internal.cpp.

461  {
462  dump_count_ = 0;
463  }

References casadi::FunctionInternal::dump_count_.

◆ 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 2224 of file function_internal.cpp.

2224  {
2225  casadi_assert_dev(nadj>=0);
2226  // Used wrapped function if reverse not available
2227  if (!enable_reverse_) {
2228  // Derivative information must be available
2229  casadi_assert(has_derivative(), "Derivatives cannot be calculated for " + name_);
2230  return wrap().reverse(nadj);
2231  }
2232  // Retrieve/generate cached
2233  Function f;
2234  std::string fname = reverse_name(name_, nadj);
2235  if (!incache(fname, f)) {
2236  casadi_int i;
2237  // Prefix to be used for adjoint seeds, sensitivities
2238  std::string pref = diff_prefix("adj");
2239  // Names of inputs
2240  std::vector<std::string> inames;
2241  for (i=0; i<n_in_; ++i) inames.push_back(name_in_[i]);
2242  for (i=0; i<n_out_; ++i) inames.push_back("out_" + name_out_[i]);
2243  for (i=0; i<n_out_; ++i) inames.push_back(pref + name_out_[i]);
2244  // Names of outputs
2245  std::vector<std::string> onames;
2246  for (casadi_int i=0; i<n_in_; ++i) onames.push_back(pref + name_in_[i]);
2247  // Options
2249  opts = combine(opts, generate_options("reverse"));
2250  opts["derivative_of"] = self();
2251  // Generate derivative function
2252  casadi_assert_dev(enable_reverse_);
2253  f = get_reverse(nadj, fname, inames, onames, opts);
2254  // Consistency check for inputs
2255  casadi_assert_dev(f.n_in()==n_in_ + n_out_ + n_out_);
2256  casadi_int ind=0;
2257  for (i=0; i<n_in_; ++i) f.assert_size_in(ind++, size1_in(i), size2_in(i));
2258  for (i=0; i<n_out_; ++i) f.assert_size_in(ind++, size1_out(i), size2_out(i));
2259  for (i=0; i<n_out_; ++i) f.assert_size_in(ind++, size1_out(i), nadj*size2_out(i));
2260  // Consistency check for outputs
2261  casadi_assert_dev(f.n_out()==n_in_);
2262  for (i=0; i<n_in_; ++i) f.assert_sparsity_out(i, sparsity_in(i), nadj);
2263  // Save to cache
2264  tocache_if_missing(f);
2265  }
2266  return f;
2267  }
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 662 of file function_internal.hpp.

662  {
663  return "adj" + str(nadj) + "_" + fcn;
664  }

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 353 of file function_internal.hpp.

353 { 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 4181 of file function_internal.cpp.

4181  {
4182  serialize_type(s);
4183  serialize_body(s);
4184  }
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()

std::string casadi::Interpolant::serialize_base_function ( ) const
inlineoverridevirtual

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

Reimplemented from casadi::ProtoFunction.

Definition at line 182 of file interpolant_impl.hpp.

182 { return "Interpolant"; }

◆ serialize_body()

void casadi::Interpolant::serialize_body ( SerializingStream s) const
overridevirtual

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

Reimplemented from casadi::FunctionInternal.

Reimplemented in casadi::LinearInterpolant, and casadi::BSplineInterpolant.

Definition at line 347 of file interpolant.cpp.

347  {
349  s.version("Interpolant", 2);
350  s.pack("Interpolant::ndim", ndim_);
351  s.pack("Interpolant::m", m_);
352  s.pack("Interpolant::grid", grid_);
353  s.pack("Interpolant::offset", offset_);
354  s.pack("Interpolant::values", values_);
355  s.pack("Interpolant::lookup_modes", lookup_modes_);
356  s.pack("Interpolant::batch_x", batch_x_);
357  }
void serialize_body(SerializingStream &s) const override
Serialize an object without type information.

References batch_x_, grid_, lookup_modes_, m_, ndim_, offset_, casadi::SerializingStream::pack(), casadi::FunctionInternal::serialize_body(), values_, and casadi::SerializingStream::version().

Referenced by casadi::BSplineInterpolant::serialize_body(), and casadi::LinearInterpolant::serialize_body().

◆ serialize_type()

void casadi::Interpolant::serialize_type ( SerializingStream s) const
overridevirtual

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

Reimplemented from casadi::FunctionInternal.

Reimplemented in casadi::LinearInterpolant.

Definition at line 359 of file interpolant.cpp.

359  {
362  }
void serialize_type(SerializingStream &s) const override
Serialize type information.
void serialize_type(SerializingStream &s) const
Serialize type information.

References casadi::PluginInterface< Derived >::serialize_type(), and casadi::FunctionInternal::serialize_type().

Referenced by casadi::LinearInterpolant::serialize_type().

◆ 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 3761 of file function_internal.cpp.

3761  {
3762 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
3763  // Safe access to jac_sparsity_
3764  std::lock_guard<std::mutex> lock(jac_sparsity_mtx_);
3765 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
3766  casadi_int ind = iind + oind * n_in_;
3767  jac_sparsity_[false].resize(n_in_ * n_out_);
3768  jac_sparsity_[false].at(ind) = sp;
3769  jac_sparsity_[true].resize(n_in_ * n_out_);
3770  jac_sparsity_[true].at(ind) = to_compact(oind, iind, sp);
3771  }

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()

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

◆ setup()

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

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

Definition at line 3549 of file function_internal.cpp.

3550  {
3551  set_work(mem, arg, res, iw, w);
3552  set_temp(mem, arg, res, iw, w);
3553  auto m = static_cast<FunctionMemory*>(mem);
3554  m->stats_available = true;
3555  }
virtual void set_work(void *mem, const double **&arg, double **&res, casadi_int *&iw, double *&w) const
Set the (persistent) work vectors.
virtual void set_temp(void *mem, const double **arg, double **res, casadi_int *iw, double *w) const
Set the (temporary) work vectors.

References casadi::FunctionInternal::set_temp(), casadi::FunctionInternal::set_work(), and casadi::FunctionMemory::stats_available.

Referenced by casadi::Conic::eval(), casadi::Nlpsol::eval(), casadi::CallbackInternal::eval(), casadi::FiniteDiff::eval(), casadi::FmuFunction::eval(), casadi::Integrator::eval(), casadi::Map::eval(), casadi::OmpMap::eval(), casadi::ThreadMap::eval(), casadi::MapSum::eval(), casadi::MXFunction::eval(), casadi::Rootfinder::eval(), casadi::Switch::eval(), casadi::SXFunction::eval(), casadi::SlicotDple::eval(), casadi::SlicotExpm::eval(), casadi::BSplineInterpolant::eval(), and casadi::LinearInterpolant::eval().

◆ 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  }

◆ 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 2413 of file function_internal.cpp.

2413  {
2414  return "int " + fname + "(const casadi_real** arg, casadi_real** res, "
2415  "casadi_int* iw, casadi_real* w, int mem)";
2416  }

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 2418 of file function_internal.cpp.

2418  {
2419  std::vector<std::string> args;
2420  for (auto e : name_in_) {
2421  args.push_back("const casadi_real* " + str(e));
2422  }
2423  for (auto e : name_out_) {
2424  args.push_back("casadi_real* " + str(e));
2425  }
2426  args.push_back("const casadi_real** arg");
2427  args.push_back("casadi_real** res");
2428  args.push_back("casadi_int* iw");
2429  args.push_back("casadi_real* w");
2430  args.push_back("int mem");
2431  return "int " + fname + "_unrolled(" + join(args, ", ") + ")";
2432  }
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 3742 of file function_internal.cpp.

3744  {
3745  return wrap().slice(name, order_in, order_out, opts);
3746  }
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 2838 of file function_internal.cpp.

2839  {
2840  // Loop over outputs
2841  for (casadi_int oind=0; oind<n_out_; ++oind) {
2842  // Skip if nothing to assign
2843  if (res[oind]==nullptr || nnz_out(oind)==0) continue;
2844  // Clear result
2845  casadi_clear(res[oind], nnz_out(oind));
2846  // Loop over inputs
2847  for (casadi_int iind=0; iind<n_in_; ++iind) {
2848  // Skip if no seeds
2849  if (arg[iind]==nullptr || nnz_in(iind)==0) continue;
2850  // Propagate sparsity for the specific block
2851  if (sp_forward_block(arg, res, iw, w, mem, oind, iind)) return 1;
2852  }
2853  }
2854  return 0;
2855  }
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 2857 of file function_internal.cpp.

2858  {
2859  // Get the sparsity of the Jacobian block
2860  Sparsity sp = jac_sparsity(oind, iind, true, false);
2861  if (sp.is_null() || sp.nnz() == 0) return 0; // Skip if zero
2862  // Carry out the sparse matrix-vector multiplication
2863  casadi_int d1 = sp.size2();
2864  const casadi_int *colind = sp.colind(), *row = sp.row();
2865  for (casadi_int cc=0; cc<d1; ++cc) {
2866  for (casadi_int el = colind[cc]; el < colind[cc+1]; ++el) {
2867  res[oind][row[el]] |= arg[iind][cc];
2868  }
2869  }
2870  return 0;
2871  }

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 2873 of file function_internal.cpp.

2874  {
2875  // Loop over outputs
2876  for (casadi_int oind=0; oind<n_out_; ++oind) {
2877  // Skip if nothing to assign
2878  if (res[oind]==nullptr || nnz_out(oind)==0) continue;
2879 
2880  // Loop over inputs
2881  for (casadi_int iind=0; iind<n_in_; ++iind) {
2882  // Skip if no seeds
2883  if (arg[iind]==nullptr || nnz_in(iind)==0) continue;
2884 
2885  // Get the sparsity of the Jacobian block
2886  Sparsity sp = jac_sparsity(oind, iind, true, false);
2887  if (sp.is_null() || sp.nnz() == 0) continue; // Skip if zero
2888 
2889  // Carry out the sparse matrix-vector multiplication
2890  casadi_int d1 = sp.size2();
2891  const casadi_int *colind = sp.colind(), *row = sp.row();
2892  for (casadi_int cc=0; cc<d1; ++cc) {
2893  for (casadi_int el = colind[cc]; el < colind[cc+1]; ++el) {
2894  arg[iind][cc] |= res[oind][row[el]];
2895  }
2896  }
2897  }
2898 
2899  // Clear seeds
2900  casadi_clear(res[oind], nnz_out(oind));
2901  }
2902  return 0;
2903  }

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 3285 of file function_internal.cpp.

3285  {
3286  // If reverse mode propagation unavailable, use forward
3287  if (!has_sprev()) return 0;
3288 
3289  // If forward mode propagation unavailable, use reverse
3290  if (!has_spfwd()) return 1;
3291 
3292  // Use the (potentially user set) option
3293  return ad_weight_sp_;
3294  }

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 3885 of file function_internal.cpp.

3885  {
3886  // Variable number of arguments
3887  va_list args;
3888  va_start(args, fmt);
3889  // Print to buffer
3890  casadi_int n = vsnprintf(buf, buf_sz, fmt, args);
3891  // Cleanup
3892  va_end(args);
3893  // Throw error if failure
3894  casadi_assert(n>=0 && n<buf_sz, "Print failure while processing '" + std::string(fmt) + "'");
3895  }

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

◆ stack_grid()

void casadi::Interpolant::stack_grid ( const std::vector< std::vector< double > > &  grid,
std::vector< casadi_int > &  offset,
std::vector< double > &  stacked 
)
static

Definition at line 46 of file interpolant.cpp.

47  {
48 
49  // Get offset for each input dimension
50  offset.clear();
51  offset.reserve(grid.size()+1);
52  offset.push_back(0);
53  for (auto&& g : grid) offset.push_back(offset.back()+g.size());
54 
55  // Stack input grids
56  stacked.clear();
57  stacked.reserve(offset.back());
58  for (auto&& g : grid) stacked.insert(stacked.end(), g.begin(), g.end());
59  }

Referenced by casadi::BSplineParametric::create(), casadi::BSpline::create(), casadi::BSpline::dual(), casadi::BlazingSplineFunction::get_jacobian(), casadi::BlazingSplineFunction::init_derived_members(), and casadi::interpolant().

◆ string_from_UnifiedReturnStatus()

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

Definition at line 3953 of file function_internal.cpp.

3953  {
3954  switch (status) {
3955  case SOLVER_RET_LIMITED: return "SOLVER_RET_LIMITED";
3956  case SOLVER_RET_NAN: return "SOLVER_RET_NAN";
3957  case SOLVER_RET_SUCCESS: return "SOLVER_RET_SUCCESS";
3958  default: return "SOLVER_RET_UNKNOWN";
3959  }
3960  }
@ 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 3312 of file function_internal.cpp.

3312  {
3313  std::vector<SX> ret(n_in_);
3314  for (casadi_int i=0; i<ret.size(); ++i) {
3315  ret[i] = sx_in(i);
3316  }
3317  return ret;
3318  }
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 3320 of file function_internal.cpp.

3320  {
3321  std::vector<SX> ret(n_out_);
3322  for (casadi_int i=0; i<ret.size(); ++i) {
3323  ret[i] = sx_out(i);
3324  }
3325  return ret;
3326  }
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 1150 of file function_internal.cpp.

1150  {
1151  return self()(arg);
1152  }

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 1535 of file function_internal.hpp.

1536  {
1537  std::vector<std::vector<MatType> > aseed(nadj, v);
1538  for (casadi_int dir=0; dir<nadj; ++dir) {
1539  // Replace symbolic inputs
1540  casadi_int oind=0;
1541  for (typename std::vector<MatType>::iterator i=aseed[dir].begin();
1542  i!=aseed[dir].end();
1543  ++i, ++oind) {
1544  // Name of the adjoint seed
1545  std::stringstream ss;
1546  ss << "a";
1547  if (nadj>1) ss << dir << "_";
1548  ss << oind;
1549 
1550  // Save to matrix
1551  *i = MatType::sym(ss.str(), is_diff_out_[oind] ? i->sparsity() : Sparsity(i->size()));
1552 
1553  }
1554  }
1555  return aseed;
1556  }

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 2905 of file function_internal.cpp.

2906  {
2907  sz_arg = this->sz_arg();
2908  sz_res = this->sz_res();
2909  sz_iw = this->sz_iw();
2910  sz_w = this->sz_w();
2911  }

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 1921 of file function_internal.cpp.

1922  {
1923  // Strip rows and columns
1924  std::vector<casadi_int> mapping;
1925  return sp.sub(sparsity_out(oind).find(), sparsity_in(iind).find(), mapping);
1926  }

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 3728 of file function_internal.cpp.

3730  {
3731  Function f = shared_from_this<Function>();
3732  f = f.wrap();
3733  return f.which_depends(s_in, s_out, order, tr);
3734  }

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 1128 of file function_internal.cpp.

1128  {
1129  Function f;
1130  std::string fname = "wrap_" + name_;
1131  if (!incache(fname, f)) {
1132  // Options
1133  Dict opts;
1134  opts["derivative_of"] = derivative_of_;
1135  opts["ad_weight"] = ad_weight();
1136  opts["ad_weight_sp"] = sp_weight();
1137  opts["max_num_dir"] = max_num_dir_;
1138  opts["is_diff_in"] = is_diff_in_;
1139  opts["is_diff_out"] = is_diff_out_;
1140  // Wrap the function
1141  std::vector<MX> arg = mx_in();
1142  std::vector<MX> res = self()(arg);
1143  f = Function(fname, arg, res, name_in_, name_out_, opts);
1144  // Save in cache
1145  tocache_if_missing(f);
1146  }
1147  return f;
1148  }

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 1110 of file function_internal.cpp.

1110  {
1111  if (opts.empty()) return shared_from_this<Function>();
1112  std::string fname = "wrap_" + name_;
1113  // Options
1114  Dict my_opts = opts;
1115  my_opts["derivative_of"] = derivative_of_;
1116  if (my_opts.find("ad_weight")==my_opts.end())
1117  my_opts["ad_weight"] = ad_weight();
1118  if (my_opts.find("ad_weight_sp")==my_opts.end())
1119  my_opts["ad_weight_sp"] = sp_weight();
1120  if (my_opts.find("max_num_dir")==my_opts.end())
1121  my_opts["max_num_dir"] = max_num_dir_;
1122  // Wrap the function
1123  std::vector<MX> arg = mx_in();
1124  std::vector<MX> res = self()(arg);
1125  return Function(fname, arg, res, name_in_, name_out_, my_opts);
1126  }

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

◆ 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

◆ batch_x_

casadi_int casadi::Interpolant::batch_x_

◆ 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

◆ 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:728
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 1455 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

◆ 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

◆ grid_

std::vector<double> casadi::Interpolant::grid_

◆ has_refcount_

bool casadi::FunctionInternal::has_refcount_
inherited

◆ infix_

const std::string casadi::Interpolant::infix_ = "interpolant"
static

Definition at line 147 of file interpolant_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

◆ lookup_modes_

std::vector<std::string> casadi::Interpolant::lookup_modes_

◆ m_

casadi_int casadi::Interpolant::m_

◆ max_io_

casadi_int casadi::FunctionInternal::max_io_
inherited

◆ max_num_dir_

casadi_int casadi::FunctionInternal::max_num_dir_
inherited

◆ n_in_

size_t casadi::FunctionInternal::n_in_
inherited

Definition at line 1266 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::SXFunction::print_arg(), 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 1266 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::SXFunction::print_arg(), casadi::FunctionInternal::print_in(), casadi::FunctionInternal::print_out(), casadi::MXFunction::print_res(), casadi::SXFunction::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

◆ ndim_

casadi_int casadi::Interpolant::ndim_

◆ never_inline_

bool casadi::FunctionInternal::never_inline_
inherited

◆ offset_

std::vector<casadi_int> casadi::Interpolant::offset_

◆ options_

const Options casadi::Interpolant::options_
static
Initial value:
{{"lookup_mode",
"Specifies, for each grid dimension, the lookup algorithm used to find the correct index. "
"'linear' uses a for-loop + break; (default when #knots<=100), "
"'exact' uses floored division (only for uniform grids), "
"'binary' uses a binary search. (default when #knots>100)."}},
{"inline",
"Implement the lookup table in MX primitives. "
"Useful when you need derivatives with respect to grid and/or coefficients. "
"Such derivatives are fundamentally dense, so use with caution."}},
{"batch_x",
"Evaluate a batch of different inputs at once (default 1)."}}
}
}
static const Options options_
Options.
@ OT_STRINGVECTOR

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

Definition at line 91 of file interpolant_impl.hpp.

◆ print_canonical_

bool casadi::FunctionInternal::print_canonical_
inherited

◆ 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, Interpolant::Plugin > casadi::Interpolant::solvers_
static

Definition at line 140 of file interpolant_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

◆ values_

std::vector<double> casadi::Interpolant::values_

◆ 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: