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

'rosenbrock' plugin for Integrator More...

#include <rosenbrock.hpp>

Detailed Description

Rosenbrock-Wanner integrator for stiff ODEs and semi-explicit index-1 DAEs, with adaptive or fixed steps.

An 8-stage, stiffly accurate, L-stable method of order 5 with an embedded method of order 4. Each step needs one Jacobian and one sparse QR factorization; the method is linearly implicit, without Newton iterations. Steps cross the output times within a control group, which are interpolated by a dense output of order 4. Step sizes are chosen from the nominal solution only, so forward sensitivities are the exact derivatives of the discrete solution (internal numerical differentiation) and adjoint sensitivities are the exact discrete adjoint of the taped steps. With step_size, each run of steps over a control group is divided into equal steps instead, and the tape has a known bound.

Zero-crossing events (DAE output zero, option transition) are located on the dense output of the step in which a function becomes negative; integration restarts from the state after the transition. Sensitivities, forward, adjoint and forward-over-adjoint, include those of the event times.

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


List of available options
IdTypeDescription
abstolOT_DOUBLEAbsolute tolerance [1e-8]
control_group_sizeOT_INTVECTORNumber of output intervals in each control group, over which the controls, one column each, are constant: a run of steps [default: 1 for each output interval]
init_max_iterOT_INTMaximum number of Newton iterations for consistent algebraic states [20]
init_tolOT_DOUBLETolerance on the scaled Newton step when making the algebraic states consistent [1e-3]
max_num_stepsOT_INTAdaptive steps: maximum number of steps per output interval [10000]
max_step_sizeOT_DOUBLEAdaptive steps: maximum step size [default: unbounded]
max_tape_stepsOT_INTAdaptive steps: capacity, in steps, of a tape in the work vector, for adjoint sensitivities; needed for code generation [0: tape of unbounded size]. With fixed steps, the tape is sized exactly.
min_step_sizeOT_DOUBLEAdaptive steps: minimum step size [1e-14]
quad_err_conOT_BOOLAdaptive steps: include the quadratures in the error control [true]
reltolOT_DOUBLERelative tolerance [1e-6]
step0OT_DOUBLEAdaptive steps: initial step size [default: estimated]
step_sizeOT_DOUBLEFixed steps: each run of steps, over a control group or up to the end without controls, is divided into equal steps of at most step_size [0: adaptive steps]


List of available options
IdTypeDescriptionUsed in
abstolOT_DOUBLEAbsolute tolerance [1e-8]casadi::RuntimeIntegrator
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
augmented_optionsOT_DICTOptions to be passed down to the augmented integrator, if one is constructedcasadi::Integrator
cacheOT_DICTPrepopulate the function cache. Default: emptycasadi::FunctionInternal
codegen_optionsOT_DICTOptions to be passed to the code generator of jit, e.g. {"stats": true} to record statistics inside the compiled code. Default: nonecasadi::FunctionInternal
common_optionsOT_DICTOptions for auto-generated functionscasadi::OracleFunction
compilerOT_STRINGJust-in-time compiler plugin to be used.casadi::FunctionInternal
control_group_sizeOT_INTVECTORNumber of output intervals in each control group, over which the controls, one column each, are constant: a run of steps [default: 1 for each output interval]casadi::RuntimeIntegrator
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 and traces 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
event_tolOT_DOUBLETermination tolerance for the event iterationcasadi::Integrator
expandOT_BOOLReplace MX with SX expressions in problem formulation [false] This happens before creating derivatives unless indicated by postpone_expandcasadi::OracleFunction
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
gridOT_DOUBLEVECTOR[DEPRECATED] Time gridcasadi::Integrator
init_max_iterOT_INTMaximum number of Newton iterations for consistent algebraic states [20]casadi::Rosenbrock
init_tolOT_DOUBLETolerance on the scaled Newton step when making the algebraic states consistent [1e-3]casadi::Rosenbrock
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
max_event_iterOT_INTMaximum number of iterations to zero in on a single eventcasadi::Integrator
max_eventsOT_INTMaximum total number of eventscasadi::Integrator
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
max_num_stepsOT_INTAdaptive steps: maximum number of steps per output interval [10000]casadi::RuntimeIntegrator
max_step_sizeOT_DOUBLEAdaptive steps: maximum step size [default: unbounded]casadi::RuntimeIntegrator
max_tape_stepsOT_INTAdaptive steps: capacity, in steps, of a tape in the work vector, for adjoint sensitivities; needed for code generation [0: tape of unbounded size]. With fixed steps, the tape is sized exactly.casadi::RuntimeIntegrator
min_step_sizeOT_DOUBLEAdaptive steps: minimum step size [1e-14]casadi::RuntimeIntegrator
monitorOT_STRINGVECTORSet of user problem functions to be monitoredcasadi::OracleFunction
nadjOT_INTNumber of adjoint sensitivities to be calculated [0]casadi::Integrator
never_inlineOT_BOOLForbid inlining.casadi::FunctionInternal
nfwdOT_INTNumber of forward sensitivities to be calculated [0]casadi::Integrator
number_of_finite_elementsOT_INTTarget number of finite elements. The actual number may be higher to accommodate all output timescasadi::Integrator
output_t0OT_BOOL[DEPRECATED] Output the state at the initial timecasadi::Integrator
post_expandOT_BOOLAfter construction, expand this Function. Default: Falsecasadi::FunctionInternal
post_expand_optionsOT_DICTOptions to be passed to post-construction expansion. Default: emptycasadi::FunctionInternal
postpone_expandOT_BOOLWhen expand is active, postpone it until after creation of derivatives. Default: Falsecasadi::OracleFunction
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_statsOT_BOOLPrint out statistics after integrationcasadi::Integrator
print_timeOT_BOOLprint information about execution time. Implies record_time.casadi::ProtoFunction
quad_err_conOT_BOOLAdaptive steps: include the quadratures in the error control [true]casadi::RuntimeIntegrator
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
reltolOT_DOUBLERelative tolerance [1e-6]casadi::RuntimeIntegrator
reverse_optionsOT_DICTOptions to be passed to a reverse mode constructorcasadi::FunctionInternal
rootfinderOT_STRINGAn implicit function solvercasadi::Integrator
rootfinder_optionsOT_DICTOptions to be passed to the NLP Solvercasadi::Integrator
show_eval_warningsOT_BOOLShow warnings generated from function evaluations [true]casadi::OracleFunction
simplifyOT_BOOLImplement as MX Function (codegeneratable/serializable) default: falsecasadi::Integrator
simplify_optionsOT_DICTAny options to pass to simplified form Function constructorcasadi::Integrator
specific_optionsOT_DICTOptions for specific auto-generated functions, overwriting the defaults from common_options. Nested dictionary.casadi::OracleFunction
step0OT_DOUBLEAdaptive steps: initial step size [default: estimated]casadi::RuntimeIntegrator
step_sizeOT_DOUBLEFixed steps: each run of steps, over a control group or up to the end without controls, is divided into equal steps of at most step_size [0: adaptive steps]casadi::RuntimeIntegrator
t0OT_DOUBLE[DEPRECATED] Beginning of the time horizoncasadi::Integrator
tfOT_DOUBLE[DEPRECATED] End of the time horizoncasadi::Integrator
transitionOT_FUNCTIONFunction to be called a zero-crossing eventscasadi::Integrator
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 69 of file rosenbrock.hpp.

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

Public Types

typedef Integrator *(* Creator) (const std::string &name, const Function &oracle, double t0, const std::vector< double > &tout)
 
using weak_ref_type = WeakRefInternal
 
typedef int(* RegFcn) (Plugin *plugin)
 

Public Member Functions

 Rosenbrock (const std::string &name, const Function &dae, double t0, const std::vector< double > &tout)
 Constructor. More...
 
 ~Rosenbrock () override
 Destructor. More...
 
const char * plugin_name () const override
 
std::string class_name () const override
 Readable name of the internal class. More...
 
void init (const Dict &opts) override
 Initialize. More...
 
void set_work (void *mem, const double **&arg, double **&res, casadi_int *&iw, double *&w) const override
 Set the (persistent) work vectors. More...
 
void * alloc_mem () const override
 Create memory block. More...
 
void free_mem (void *mem) const override
 Free memory block. More...
 
void serialize_body (SerializingStream &s) const override
 Serialize an object without type information. More...
 
int init_mem (void *mem) const override
 Initalize memory block. More...
 
void reset (IntegratorMemory *mem, bool first_call) const override
 Reset the forward problem at the start or after a change in the controls. More...
 
int advance_noevent (IntegratorMemory *mem) const override
 Advance solution in time. More...
 
bool has_reverse (casadi_int nadj) const override
 Adjoint sensitivities, also with events. More...
 
void resetB (IntegratorMemory *mem) const override
 Reset the backward problem. More...
 
void impulseB (IntegratorMemory *mem, const double *adj_x, const double *adj_z, const double *adj_q) const override
 Introduce an impulse into the backwards integration at the current time. More...
 
int eval (const double **arg, double **res, casadi_int *iw, double *w, void *mem) const override
 Evaluate numerically: a run of steps per control group, events in the kernel. More...
 
void retreat (IntegratorMemory *mem, const double *u, double *adj_x, double *adj_p, double *adj_u) const override
 Retreat solution in time. More...
 
Dict get_stats (void *mem) const override
 Get all statistics. More...
 
void print_stats (IntegratorMemory *mem) const override
 Print solver statistics. More...
 
virtual Function create_advanced (const Dict &opts)
 
virtual MX algebraic_state_init (const MX &x0, const MX &z0) const
 
virtual MX algebraic_state_output (const MX &Z) const
 
void set_q (IntegratorMemory *m, const double *q) const
 
void set_x (IntegratorMemory *m, const double *x) const
 
void set_z (IntegratorMemory *m, const double *z) const
 
void set_p (IntegratorMemory *m, const double *p) const
 
void set_u (IntegratorMemory *m, const double *u) const
 
void get_q (IntegratorMemory *m, double *q) const
 
void get_x (IntegratorMemory *m, double *x) const
 
void get_z (IntegratorMemory *m, double *z) const
 
casadi_int next_stop (casadi_int k, const double *u) const
 Find next stop time. More...
 
int calc_edot (IntegratorMemory *m) const
 Linearize the zero crossing function. More...
 
int predict_events (IntegratorMemory *m) const
 Predict next event time. More...
 
int trigger_event (IntegratorMemory *m, casadi_int *ind) const
 Trigger an event. More...
 
int advance (IntegratorMemory *m) const
 Advance solution in time, with events handling. More...
 
casadi_int next_stopB (casadi_int k, const double *u) const
 Find next stop time. More...
 
int fdae_sp_forward (SpForwardMem *m, const bvec_t *x, const bvec_t *p, const bvec_t *u, bvec_t *ode, bvec_t *alg) const
 Forward sparsity pattern propagation through DAE, forward problem. More...
 
int fquad_sp_forward (SpForwardMem *m, const bvec_t *x, const bvec_t *z, const bvec_t *p, const bvec_t *u, bvec_t *quad) const
 Forward sparsity pattern propagation through quadratures, forward problem. More...
 
int bdae_sp_forward (SpForwardMem *m, const bvec_t *x, const bvec_t *z, const bvec_t *p, const bvec_t *u, const bvec_t *adj_ode, const bvec_t *adj_quad, bvec_t *adj_x, bvec_t *adj_z) const
 Forward sparsity pattern propagation through DAE, backward problem. More...
 
int bquad_sp_forward (SpForwardMem *m, const bvec_t *x, const bvec_t *z, const bvec_t *p, const bvec_t *u, const bvec_t *adj_ode, const bvec_t *adj_alg, const bvec_t *adj_quad, bvec_t *adj_p, bvec_t *adj_u) const
 Forward sparsity pattern propagation through quadratures, backward problem. More...
 
int fdae_sp_reverse (SpReverseMem *m, bvec_t *x, bvec_t *p, bvec_t *u, bvec_t *ode, bvec_t *alg) const
 Reverse sparsity pattern propagation through DAE, forward problem. More...
 
int fquad_sp_reverse (SpReverseMem *m, bvec_t *x, bvec_t *z, bvec_t *p, bvec_t *u, bvec_t *quad) const
 Reverse sparsity pattern propagation through quadratures, forward problem. More...
 
int bdae_sp_reverse (SpReverseMem *m, bvec_t *x, bvec_t *z, bvec_t *p, bvec_t *u, bvec_t *adj_ode, bvec_t *adj_quad, bvec_t *adj_x, bvec_t *adj_z) const
 Reverse sparsity pattern propagation through DAE, backward problem. More...
 
int bquad_sp_reverse (SpReverseMem *m, bvec_t *x, bvec_t *z, bvec_t *p, bvec_t *u, bvec_t *adj_ode, bvec_t *adj_alg, bvec_t *adj_quad, bvec_t *adj_p, bvec_t *adj_u) const
 Reverse sparsity pattern propagation through quadratures, backward problem. More...
 
virtual Dict getDerivativeOptions (bool fwd) const
 Set solver specific options to generated augmented integrators. More...
 
Sparsity sp_jac_aug (const Sparsity &J, const Sparsity &J1) const
 Helper function, get augmented system Jacobian. More...
 
Sparsity sp_jac_dae ()
 Create sparsity pattern of the extended Jacobian (forward problem) More...
 
Sparsity sp_jac_rdae ()
 Create sparsity pattern of the extended Jacobian (backward problem) More...
 
casadi_int nt () const
 Number of output times. 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...
 
casadi_int n_grid_in (casadi_int i) const
 Number of grid points for which an input is repeated: output times or columns of u. More...
 
casadi_int n_grid_out (casadi_int i) const
 Number of grid points for which an output is repeated. More...
 
void finalize () override
 Finalize initialization. More...
 
void join_results (OracleMemory *m) const
 Combine results from different threads. More...
 
const Function & oracle () const override
 Get oracle. More...
 
void expand ()
 
Function create_function (const Function &oracle, const std::string &fname, const std::vector< std::string > &s_in, const std::vector< std::string > &s_out, const Function::AuxOut &aux=Function::AuxOut(), const Dict &opts=Dict())
 
Function create_function (const std::string &fname, const std::vector< std::string > &s_in, const std::vector< std::string > &s_out, const Function::AuxOut &aux=Function::AuxOut(), const Dict &opts=Dict())
 
Function create_function (const std::string &fname, const std::vector< MX > &e_in, const std::vector< MX > &e_out, const std::vector< std::string > &s_in, const std::vector< std::string > &s_out, const Dict &opts=Dict())
 
Function create_forward (const std::string &fname, casadi_int nfwd)
 
void set_function (const Function &fcn, const std::string &fname, bool jit=false)
 
void set_function (const Function &fcn)
 
int calc_function (OracleMemory *m, const std::string &fcn, const double *const *arg=nullptr, int thread_id=0) const
 
int calc_sp_forward (const std::string &fcn, const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w) const
 
int calc_sp_reverse (const std::string &fcn, bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w) const
 
std::vector< std::string > get_function () const override
 Get list of dependency functions. More...
 
const Function & get_function (const std::string &name) const override
 
void find (std::map< FunctionInternal *, std::pair< Function, size_t > > &all_fun, casadi_int max_depth) const override
 
virtual bool monitored (const std::string &name) const
 
bool has_function (const std::string &fname) const override
 
std::string generate_dependencies (const std::string &fname, const Dict &opts) const override
 Export / Generate C code for the generated functions. More...
 
void jit_dependencies (const std::string &fname) override
 JIT for dependencies. More...
 
int local_init_mem (void *mem) const
 Initalize memory block. More...
 
void set_temp (void *mem, const double **arg, double **res, casadi_int *iw, double *w) const override
 Set the work vectors. More...
 
virtual void codegen_body_enter (CodeGenerator &g) const
 Generate code for the function body. More...
 
virtual void codegen_body_exit (CodeGenerator &g) const
 Generate code for the function body. 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...
 
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
 
void add_embedded (std::map< FunctionInternal *, std::pair< Function, size_t > > &all_fun, const Function &dep, 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 Function simplify_passes (const std::vector< std::pair< std::string, casadi_int > > &tasks) const
 Apply an ordered list of simplify passes (used by transform) 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< MX > mapsum_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...
 
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< MX > free_mx () const
 Get free variables (MX) More...
 
virtual std::vector< SX > free_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...
 
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 std::string codegen_mem_type () const
 Thread-local memory object type. More...
 
virtual bool codegen_needs_mem () const
 Is thread-local memory object needed? More...
 
virtual bool codegen_mem_is_opaque () const
 Is thread-local memory object managed by checkout/release. 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_in (casadi_int i)
 Which inputs are differentiable. 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 eval_activity (const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const
 Propagate signal activity 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...
 
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...
 
void setup (void *mem, const double **arg, double **res, casadi_int *iw, double *w) const
 Set the (persistent and temporary) work vectors. More...
 
virtual Dict info () const
 
Function map (casadi_int n, const std::string &parallelization) const
 Generate/retrieve cached serial map. More...
 
void generate_in (const std::string &fname, const double **arg) const
 Export an input file that can be passed to generate C code with a main. More...
 
void generate_out (const std::string &fname, double **res) const
 
virtual bool is_a (const std::string &type, bool recursive) const
 Check if the function is of a particular type. More...
 
virtual void merge (const std::vector< MX > &arg, std::vector< MX > &subs_from, std::vector< MX > &subs_to) const
 List merge opportunitities. More...
 
template<typename MatType >
std::vector< std::vector< MatType > > fwd_seed (casadi_int nfwd) const
 Symbolic expressions for the forward seeds. More...
 
template<typename MatType >
std::vector< std::vector< MatType > > symbolicAdjSeed (casadi_int nadj, const std::vector< MatType > &v) const
 Symbolic expressions for the adjoint seeds. More...
 
void print_in (std::ostream &stream, const double **arg, bool truncate) const
 Print inputs. More...
 
void print_out (std::ostream &stream, double **res, bool truncate) const
 Print outputs. More...
 
void construct (const Dict &opts)
 Construct. More...
 
void print_options (std::ostream &stream) const
 Print list of options. More...
 
void print_option (const std::string &name, std::ostream &stream) const
 Print all information there is to know about a certain option. More...
 
bool has_option (const std::string &option_name) const
 Does a particular option exist. More...
 
int checkout () const
 Checkout a memory object. More...
 
void release (int mem) const
 Release a memory object. More...
 
void * memory (int ind) const
 Memory objects. More...
 
bool has_memory (int ind) const
 Check for existance of memory object. More...
 
virtual void check_mem_count (casadi_int n) const
 Check for validatity of memory object count. More...
 
void clear_mem ()
 Clear all memory (called from destructor) More...
 
void print (const char *fmt,...) const
 C-style formatted printing during evaluation. More...
 
void sprint (char *buf, size_t buf_sz, const char *fmt,...) const
 C-style formatted printing to string. More...
 
void format_time (char *buffer, double time) const
 Format time in a fixed width 8 format. More...
 
void print_time (const std::map< std::string, FStats > &fstats) const
 Print timing statistics. More...
 
void serialize (SerializingStream &s) const
 Serialize an object. More...
 
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 void deps_version_check (const std::string &stage) const
 
Sparsity get_sparsity_in (casadi_int i) override
 
Sparsity get_sparsity_out (casadi_int i) override
 
int sp_forward (const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const override
 
int sp_reverse (bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const override
 
bool has_codegen () const override
 Code generation. More...
 
void codegen_declarations (CodeGenerator &g) const override
 Code generation. More...
 
void codegen_body (CodeGenerator &g) const override
 Code generation. More...
 
size_t get_n_in () override
 Number of function inputs and outputs. More...
 
size_t get_n_out () override
 Number of function inputs and outputs. More...
 
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...
 
bool has_spfwd () const override
 
bool has_sprev () const override
 
Function get_forward (casadi_int nfwd, const std::string &name, const std::vector< std::string > &inames, const std::vector< std::string > &onames, const Dict &opts) const override
 Generate a function that calculates nfwd forward derivatives. More...
 
bool has_forward (casadi_int nfwd) const override
 Generate a function that calculates nfwd forward derivatives. More...
 
Function get_reverse (casadi_int nadj, const std::string &name, const std::vector< std::string > &inames, const std::vector< std::string > &onames, const Dict &opts) const override
 Generate a function that calculates nadj adjoint derivatives. More...
 
template<typename MatType >
Function get_forward_dae (const std::string &name) const
 Generate the augmented DAE system. More...
 
Function augmented_dae () const
 Generate the augmented DAE system. More...
 
int eval_gen (const double **arg, double **res, casadi_int *iw, double *w, void *mem, bool always_inline, bool never_inline) const
 Evaluate numerically. More...
 
int eval_gen (const SXElem **arg, SXElem **res, casadi_int *iw, SXElem *w, void *mem, bool always_inline, bool never_inline) const
 Evaluate a function, overloaded. More...
 
int eval_gen (const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem, bool always_inline, bool never_inline) const
 Evaluate a function, overloaded. More...
 
virtual std::vector< DM > eval_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< DM > nz_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< DM > nz_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...
 
Sparsity & jac_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...
 
Function reverse (casadi_int nadj) const
 Return function that calculates adjoint derivatives. More...
 
virtual const SX sx_in (casadi_int ind) const
 Get function input(s) and output(s) More...
 
virtual const std::vector< SX > sx_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< SX > sx_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< MX > mx_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< MX > mx_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< DM > dm_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< DM > dm_out () const
 Get function input(s) and output(s) More...
 
Function wrap (const std::string &name) const
 Wrap in an Function instance consisting of only one MX call. More...
 
Function wrap () const
 Wrap in an Function instance consisting of only one MX call. More...
 
Function wrap_as_needed (const std::string &name, const Dict &opts) 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...
 
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 Sparsity & sparsity_in (casadi_int ind) const
 Input/output sparsity. More...
 
const Sparsity & sparsity_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< MX > symbolic_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 Integrator * creator (const std::string &name, const Function &dae, double t0, const std::vector< double > &tout)
 Create a new integrator. More...
 
static ProtoFunction * deserialize (DeserializingStream &s)
 Deserialize into MX. More...
 
static bool all_zero (const double *v, casadi_int n)
 Helper function: Vector has only zeros? More...
 
template<typename XType >
static Function map2oracle (const std::string &name, const std::map< std::string, XType > &d)
 Convert dictionary to Problem. More...
 
static casadi_int adjmap_out (casadi_int i)
 Which output is used to calculate a given input in adjoint sensitivity analysis. More...
 
static std::string forward_name (const std::string &fcn, casadi_int nfwd)
 Helper function: Get name of forward derivative function. More...
 
static std::string reverse_name (const std::string &fcn, casadi_int nadj)
 Helper function: Get name of adjoint derivative function. More...
 
template<typename MatType >
static MatType ensure_stacked (const MatType &v, const Sparsity &sp, casadi_int n)
 Ensure that a matrix's sparsity is a horizontal multiple of another, or empty. More...
 
static std::string get_jit_directory (const Dict &jit_options)
 Get JIT directory from options. 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 Options & plugin_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 Integrator * instantiate (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

Sparsity sp_jac_dae_
 Sparsity pattern of the extended Jacobians. More...
 
Sparsity sp_jac_rdae_
 
double t0_
 Initial time. More...
 
std::vector< double > tout_
 Output time grid. More...
 
casadi_int nfwd_
 Number of sensitivities. More...
 
casadi_int nadj_
 
Function rdae_
 Backwards DAE function. More...
 
casadi_int nx_
 Number of states for the forward integration. More...
 
casadi_int nz_
 
casadi_int nq_
 
casadi_int nx1_
 
casadi_int nz1_
 
casadi_int nq1_
 
casadi_int nrx_
 Number of states for the backward integration. More...
 
casadi_int nrz_
 
casadi_int nrq_
 
casadi_int nuq_
 
casadi_int nrx1_
 
casadi_int nrz1_
 
casadi_int nrq1_
 
casadi_int nuq1_
 
casadi_int np_
 Number of forward and backward parameters. More...
 
casadi_int nrp_
 
casadi_int np1_
 
casadi_int nrp1_
 
casadi_int nu_
 Number of controls. More...
 
casadi_int nu1_
 
casadi_int ne_
 Number of of zero-crossing functions. More...
 
casadi_int ntmp_
 Length of the tmp1, tmp2 vectors. More...
 
std::vector< double > nom_x_
 
std::vector< double > nom_z_
 
Dict augmented_options_
 Augmented user option. More...
 
Dict opts_
 Copy of the options. More...
 
bool print_stats_
 Options. More...
 
Function transition_
 Function to be called at state events. More...
 
casadi_int max_event_iter_
 Maximum number of event iterations for a single event. More...
 
casadi_int max_events_
 Maximum total number of events during the simulation. More...
 
double event_tol_
 Termination tolerance for the event iteration. More...
 
double event_acceptable_tol_
 Acceptable tolerance for the event iteration. More...
 
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< Sparsity > sparsity_in_
 Input and output sparsity. More...
 
std::vector< Sparsity > sparsity_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_directory_
 
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...
 
signal_t incref_
 Incref/decref redirected to C functions. More...
 
signal_t decref_
 
Dict stats_
 Dict of statistics (resulting from evaluate) More...
 
bool has_refcount_
 Reference counting in codegen? More...
 
bool has_refcount_in_deps_
 Reference counting in dependent functions. More...
 
Dict cache_init_
 Values to prepopulate the function cache with. More...
 
WeakCache< std::string, Function > cache_
 Function cache. More...
 
std::vector< Sparsity > jac_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_
 
Dict codegen_options_
 Options of the code generator of jit. More...
 
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_
 
std::vector< Function > registered_functions_
 
casadi_int dump_count_
 
std::string name_
 Name. More...
 
bool verbose_
 Verbose printout. More...
 
bool print_time_
 
bool record_time_
 
bool regularity_check_
 Errors are thrown when NaN is produced. More...
 
bool error_on_fail_
 Throw an exception on failure? More...
 

Static Public Attributes

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

Protected Member Functions

 Rosenbrock (DeserializingStream &s)
 Deserializing constructor. More...
 
bool needs_jacobian () const override
 Does the method linearize (tasks EVAL_JAC, EVAL_JAC_ADJ)? More...
 
int kernel (RuntimeIntegratorMemory *m) const override
 Call the kernel of the method: returns 1 while a task is requested. More...
 
void codegen_method (CodeGenerator &g) const override
 Generate code for the problem and data of the method, variables pe and e. More...
 
const RuntimeIntegrator * root () const
 Integrator at the start of the chain of derivatives. More...
 
void set_ivp_prob ()
 Shared problem structure, from the method coefficients. More...
 
Function jump_function () const
 State after an event as a function of the state before it, see casadi_ivp_event.hpp. More...
 
void set_nominal_prob ()
 Problem of the nominal integration whose steps are replayed, if any. More...
 
casadi_int ngroup () const
 Number of control groups, columns of the controls. More...
 
void alloc_ivp_work ()
 Work vectors of the shared kernel data. More...
 
void run (RuntimeIntegratorMemory *m) const
 Carry out the tasks requested by the kernel. More...
 
casadi_int tape_capacity () const
 Capacity of the tape in the work vector (0: unbounded, in the virtual machine only) More...
 
void set_jac_sparsity (casadi_int oind, casadi_int iind, const Sparsity &sp)
 Populate jac_sparsity_ and jac_sparsity_compact_ during initialization. More...
 
std::unique_ptr< std::ostream > open_trace (const double **arg, casadi_int dump_id) const
 
void finish_trace (std::ostream &trace, double **res, int ret) const
 
void initSingleton ()
 
void destroySingleton ()
 
B 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 Protected Member Functions

static void trace_values (std::ostream &trace, const double *values, casadi_int nnz)
 

Protected Attributes

std::vector< double > a_
 
std::vector< double > alpha_
 
std::vector< double > m_
 
std::vector< double > m_dense_
 
std::vector< double > m_err_
 
casadi_int n_dense_
 
casadi_int order_err_
 
std::vector< casadi_int > group_start_
 
casadi_int nx_err_
 
casadi_int nz_err_
 
casadi_int nq_err_
 
double step_size_
 
double abstol_
 
double reltol_
 
double step0_
 
double max_step_size_
 
double min_step_size_
 
casadi_int max_num_steps_
 
casadi_int max_tape_steps_
 
bool quad_err_con_
 
std::vector< Sparsity > sp_jac_
 
casadi_ivp_prob< double > p_
 
bool replay_
 
casadi_ivp_prob< double > p_nom_
 
Function oracle_
 Oracle: Used to generate other functions. More...
 
Dict common_options_
 Options for creating functions. More...
 
Dict specific_options_
 
bool show_eval_warnings_
 Show evaluation warnings. More...
 
int max_num_threads_
 
std::map< std::string, RegFun > all_functions_
 
std::vector< std::string > monitor_
 
size_t stride_arg_
 
size_t stride_res_
 
size_t stride_iw_
 
size_t stride_w_
 
bool post_expand_
 
static const Options options_
 Options. More...
 
const Options & get_options () const override
 Options. More...
 
static std::vector< std::string > dae_out ()
 IO conventions for continuous time dynamics. More...
 
static std::vector< std::string > quad_out ()
 IO conventions for continuous time dynamics. More...
 
static std::string bdyn_in (casadi_int i)
 IO conventions for continuous time dynamics. More...
 
static std::vector< std::string > bdyn_in ()
 IO conventions for continuous time dynamics. More...
 
static std::string bdyn_out (casadi_int i)
 IO conventions for continuous time dynamics. More...
 
static std::vector< std::string > bdyn_out ()
 IO conventions for continuous time dynamics. More...
 
static std::vector< std::string > bdae_out ()
 IO conventions for continuous time dynamics. More...
 
static std::vector< std::string > bquad_out ()
 IO conventions for continuous time dynamics. More...
 
enum  DaeOut { DAE_ODE , DAE_ALG , DAE_NUM_OUT }
 IO conventions for continuous time dynamics. More...
 
enum  QuadOut { QUAD_QUAD , QUAD_NUM_OUT }
 IO conventions for continuous time dynamics. More...
 
enum  BDynIn {
  BDYN_T , BDYN_X , BDYN_Z , BDYN_P ,
  BDYN_U , BDYN_OUT_ODE , BDYN_OUT_ALG , BDYN_OUT_QUAD ,
  BDYN_OUT_ZERO , BDYN_ADJ_ODE , BDYN_ADJ_ALG , BDYN_ADJ_QUAD ,
  BDYN_ADJ_ZERO , BDYN_NUM_IN
}
 IO conventions for continuous time dynamics. More...
 
enum  BDynOut {
  BDYN_ADJ_T , BDYN_ADJ_X , BDYN_ADJ_Z , BDYN_ADJ_P ,
  BDYN_ADJ_U , BDYN_NUM_OUT
}
 IO conventions for continuous time dynamics. More...
 
enum  DAEBOut { BDAE_ADJ_X , BDAE_ADJ_Z , BDAE_NUM_OUT }
 IO conventions for continuous time dynamics. More...
 
enum  QuadBOut { BQUAD_ADJ_P , BQUAD_ADJ_U , BQUAD_NUM_OUT }
 IO conventions for continuous time dynamics. More...
 

Member Typedef Documentation

◆ Creator

typedef Integrator*(* casadi::Integrator::Creator) (const std::string &name, const Function &oracle, double t0, const std::vector< double > &tout)
inherited

Definition at line 442 of file integrator_impl.hpp.

◆ RegFcn

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

Member Enumeration Documentation

◆ BDynIn

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

Enumerator
BDYN_T 
BDYN_X 
BDYN_Z 
BDYN_P 
BDYN_U 
BDYN_OUT_ODE 
BDYN_OUT_ALG 
BDYN_OUT_QUAD 
BDYN_OUT_ZERO 
BDYN_ADJ_ODE 
BDYN_ADJ_ALG 
BDYN_ADJ_QUAD 
BDYN_ADJ_ZERO 
BDYN_NUM_IN 

Definition at line 370 of file integrator_impl.hpp.

◆ BDynOut

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

Enumerator
BDYN_ADJ_T 
BDYN_ADJ_X 
BDYN_ADJ_Z 
BDYN_ADJ_P 
BDYN_ADJ_U 
BDYN_NUM_OUT 

Definition at line 375 of file integrator_impl.hpp.

◆ DAEBOut

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

Enumerator
BDAE_ADJ_X 
BDAE_ADJ_Z 
BDAE_NUM_OUT 

Definition at line 378 of file integrator_impl.hpp.

◆ DaeOut

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

Enumerator
DAE_ODE 
DAE_ALG 
DAE_NUM_OUT 

Definition at line 366 of file integrator_impl.hpp.

◆ QuadBOut

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

Enumerator
BQUAD_ADJ_P 
BQUAD_ADJ_U 
BQUAD_NUM_OUT 

Definition at line 380 of file integrator_impl.hpp.

◆ QuadOut

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

Enumerator
QUAD_QUAD 
QUAD_NUM_OUT 

Definition at line 368 of file integrator_impl.hpp.

Constructor & Destructor Documentation

◆ Rosenbrock() [1/2]

casadi::Rosenbrock::Rosenbrock ( const std::string &  name,
const Function &  dae,
double  t0,
const std::vector< double > &  tout 
)

Definition at line 48 of file rosenbrock.cpp.

49  : RuntimeIntegrator(name, dae, t0, tout) {
50  }
RuntimeIntegrator(const std::string &name, const Function &dae, double t0, const std::vector< double > &tout)
Constructor.

◆ ~Rosenbrock()

casadi::Rosenbrock::~Rosenbrock ( )
override

Definition at line 52 of file rosenbrock.cpp.

52  {
53  clear_mem();
54  }
void clear_mem()
Clear all memory (called from destructor)

References casadi::ProtoFunction::clear_mem().

◆ Rosenbrock() [2/2]

casadi::Rosenbrock::Rosenbrock ( DeserializingStream &  s)
explicitprotected

Definition at line 258 of file rosenbrock.cpp.

258  : RuntimeIntegrator(s) {
259  s.version("Rosenbrock", 1);
260  s.unpack("Rosenbrock::init_tol", init_tol_);
261  s.unpack("Rosenbrock::init_max_iter", init_max_iter_);
262  set_iteration_matrix();
263  set_coefficients();
264  set_ivp_prob();
266  set_rosenbrock_prob();
267  }
void set_ivp_prob()
Shared problem structure, from the method coefficients.
void set_nominal_prob()
Problem of the nominal integration whose steps are replayed, if any.

References casadi::RuntimeIntegrator::set_ivp_prob(), casadi::RuntimeIntegrator::set_nominal_prob(), casadi::DeserializingStream::unpack(), 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 3529 of file function_internal.cpp.

3529  {
3530  // If reverse mode derivatives unavailable, use forward
3531  if (!enable_reverse_) return 0;
3532 
3533  // If forward mode derivatives unavailable, use reverse
3534  if (!enable_forward_ && !enable_fd_) return 1;
3535 
3536  // Use the (potentially user set) option
3537  return ad_weight_;
3538  }
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::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 *, std::pair< Function, size_t > > &  all_fun,
const Function &  dep,
casadi_int  max_depth 
) const
inherited

Definition at line 3976 of file function_internal.cpp.

3978  {
3979  // Add, if not already in graph and not null
3980  if (!dep.is_null() && all_fun.find(dep.get()) == all_fun.end()) {
3981  size_t index = all_fun.size();
3982  all_fun[dep.get()] = std::make_pair(dep, index);
3983  // Also add its dependencies
3984  if (max_depth > 0) dep->find(all_fun, max_depth - 1);
3985  }
3986  }

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

Referenced by casadi::FunctionInternal::find(), casadi::Map::find(), casadi::MapSum::find(), casadi::MXFunction::find(), casadi::OracleFunction::find(), casadi::Switch::find(), casadi::SXFunction::find(), and casadi::BSplineInterpolant::find().

◆ adjmap_out()

casadi_int casadi::Integrator::adjmap_out ( casadi_int  i)
staticinherited

Definition at line 339 of file integrator.cpp.

339  {
340  switch (static_cast<IntegratorInput>(i)) {
341  case INTEGRATOR_X0: return INTEGRATOR_ADJ_X0;
342  case INTEGRATOR_Z0: return INTEGRATOR_ADJ_Z0;
343  case INTEGRATOR_P: return INTEGRATOR_ADJ_P;
344  case INTEGRATOR_U: return INTEGRATOR_ADJ_U;
345  case INTEGRATOR_ADJ_XF: return INTEGRATOR_XF;
346  case INTEGRATOR_ADJ_ZF: return INTEGRATOR_ZF;
347  case INTEGRATOR_ADJ_QF: return INTEGRATOR_QF;
348  default: break;
349  }
350  return -1;
351 }
@ INTEGRATOR_ADJ_U
Adjoint sensitivities corresponding to the control vector.
Definition: integrator.hpp:978
@ INTEGRATOR_ADJ_Z0
Adjoint sensitivities corresponding to the algebraic variable guess.
Definition: integrator.hpp:974
@ INTEGRATOR_QF
Quadrature state at all output times.
Definition: integrator.hpp:970
@ INTEGRATOR_ADJ_P
Adjoint sensitivities corresponding to the parameter vector.
Definition: integrator.hpp:976
@ INTEGRATOR_ZF
Algebraic variable at all output times.
Definition: integrator.hpp:968
@ INTEGRATOR_XF
Differential state at all output times.
Definition: integrator.hpp:966
@ INTEGRATOR_ADJ_X0
Adjoint sensitivities corresponding to the initial state.
Definition: integrator.hpp:972
IntegratorInput
Input arguments of an integrator.
Definition: integrator.hpp:944
@ INTEGRATOR_U
Piecewise constant control, a new control interval starts at each output time.
Definition: integrator.hpp:952
@ INTEGRATOR_ADJ_QF
Adjoint seeds corresponding to the quadratures at the output times.
Definition: integrator.hpp:958
@ INTEGRATOR_ADJ_ZF
Adjoint seeds corresponding to the algebraic variables at the output times.
Definition: integrator.hpp:956
@ INTEGRATOR_P
Parameters.
Definition: integrator.hpp:950
@ INTEGRATOR_ADJ_XF
Adjoint seeds corresponding to the states at the output times.
Definition: integrator.hpp:954
@ INTEGRATOR_Z0
Initial guess for the algebraic variable at the initial time.
Definition: integrator.hpp:948
@ INTEGRATOR_X0
Differential state at the initial time.
Definition: integrator.hpp:946

References casadi::INTEGRATOR_ADJ_P, casadi::INTEGRATOR_ADJ_QF, casadi::INTEGRATOR_ADJ_U, casadi::INTEGRATOR_ADJ_X0, casadi::INTEGRATOR_ADJ_XF, casadi::INTEGRATOR_ADJ_Z0, casadi::INTEGRATOR_ADJ_ZF, casadi::INTEGRATOR_P, casadi::INTEGRATOR_QF, casadi::INTEGRATOR_U, casadi::INTEGRATOR_X0, casadi::INTEGRATOR_XF, casadi::INTEGRATOR_Z0, and casadi::INTEGRATOR_ZF.

Referenced by casadi::Integrator::get_reverse().

◆ adjViaJac()

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

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

Definition at line 3262 of file function_internal.cpp.

3262  {
3263  if (!enable_reverse_) return true;
3264  if (jac_penalty_==-1) return false;
3265 
3266  // Heuristic 1: Jac calculated via reverse mode likely cheaper
3267  if (jac_penalty_*static_cast<double>(nnz_out())<nadj) return true;
3268 
3269  // Heuristic 2: Jac calculated via forward mode likely cheaper
3270  double w = ad_weight();
3271  if ((enable_forward_ || enable_fd_) &&
3272  jac_penalty_*w*static_cast<double>(nnz_in())<(1-w)*static_cast<double>(nadj))
3273  return true; // NOLINT
3274 
3275  return false;
3276  }
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().

◆ advance()

int casadi::Integrator::advance ( IntegratorMemory *  m) const
inherited

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

Definition at line 535 of file integrator.cpp.

535  {
536  // Predict next event
537  if (ne_ > 0 && m->t_next_out != m->t_start) {
538  if (predict_events(m)) return 1;
539  }
540  // Event iterations
541  m->event_iter = 0;
542  while (true) {
543  // Start a new event iteration
544  m->event_iter++;
545  // No event triggered
546  m->event_index = -1;
547  // Advance solution in time
548  if (advance_noevent(m)) return 1;
549  // Update current time
550  m->t = m->t_next;
551  m->t_next = m->t_next_out;
552  // If no events or no interval, done
553  if (ne_ == 0 || m->t_next_out == m->t_start) break;
554  // Recalculate m->e and m->edot
555  if (calc_edot(m)) return 1;
556  // By default, let integrator continue to the next input step change
557  m->t_stop = m->t_step;
558  // Detect events
559  for (casadi_int i = 0; i < ne_; ++i) {
560  // Make sure that event was not already triggered
561  if (m->event_triggered[i] || m->old_e[i] <= 0) continue;
562  // Check if event was triggered or is projected to be triggered before next output time
563  if (m->e[i] < 0 || (m->edot[i] < 0 && m->e[i] + (m->t_next_out - m->t) * m->edot[i] < 0)) {
564  // Projected zero-crossing time
565  double t_zero = m->t - m->e[i] / m->edot[i];
566  // If t_zero is too small or m->edot[i] has the wrong sign, fall back to bisection
567  if (t_zero <= m->t_start || (m->e[i] < 0 && m->edot[i] >= 0)) {
568  t_zero = 0.5 * (m->t_start + m->t);
569  }
570  // Update t_next if earliest event so far
571  if (t_zero < m->t_next) {
572  m->event_index = i;
573  m->t_next = t_zero;
574  m->t_stop = std::max(m->t, m->t_next);
575  }
576  }
577  }
578  // If no events, done
579  if (m->event_index < 0) break;
580  // Distance to new time step
581  double t_diff = std::fabs(m->t_next - m->t);
582  // Check if converged
583  if (t_diff < event_tol_) {
584  if (verbose_) casadi_message("Event iteration converged, |dt| == " + str(t_diff));
585  break;
586  }
587  // Maximum number of iterations reached?
588  if (m->event_iter == max_event_iter_) {
589  // Throw error?
590  if (t_diff >= event_acceptable_tol_) {
591  casadi_error("Maximum number of event iterations reached without convergence");
592  }
593  if (verbose_) casadi_message("Max event iterations, |dt| == " + str(t_diff));
594  break;
595  }
596  // More iterations needed
597  if (verbose_) casadi_message("Event iteration " + str(m->event_iter) + ", |dt| == "
598  + str(t_diff));
599  }
600  // Successful return
601  return 0;
602 }
int predict_events(IntegratorMemory *m) const
Predict next event time.
double event_tol_
Termination tolerance for the event iteration.
double event_acceptable_tol_
Acceptable tolerance for the event iteration.
virtual int advance_noevent(IntegratorMemory *mem) const =0
Advance solution in time, without events handling.
casadi_int max_event_iter_
Maximum number of event iterations for a single event.
int calc_edot(IntegratorMemory *m) const
Linearize the zero crossing function.
casadi_int ne_
Number of of zero-crossing functions.
bool verbose_
Verbose printout.
std::string str(const T &v)
String representation, any type.

References casadi::Integrator::advance_noevent(), casadi::Integrator::calc_edot(), casadi::IntegratorMemory::e, casadi::IntegratorMemory::edot, casadi::Integrator::event_acceptable_tol_, casadi::IntegratorMemory::event_index, casadi::IntegratorMemory::event_iter, casadi::Integrator::event_tol_, casadi::IntegratorMemory::event_triggered, casadi::Integrator::max_event_iter_, casadi::Integrator::ne_, casadi::IntegratorMemory::old_e, casadi::Integrator::predict_events(), casadi::str(), casadi::IntegratorMemory::t, casadi::IntegratorMemory::t_next, casadi::IntegratorMemory::t_next_out, casadi::IntegratorMemory::t_start, casadi::IntegratorMemory::t_step, casadi::IntegratorMemory::t_stop, and casadi::ProtoFunction::verbose_.

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

◆ advance_noevent()

int casadi::RuntimeIntegrator::advance_noevent ( IntegratorMemory *  mem) const
overridevirtualinherited

Implements casadi::Integrator.

Definition at line 405 of file runtime_integrator.cpp.

405  {
406  auto m = static_cast<RuntimeIntegratorMemory*>(mem);
407  casadi_ivp_data<double>* d = &m->d;
408  casadi_ivp_advance(d, m->t_next, m->t_stop, nrx_ > 0);
409  run(m);
410  casadi_assert(d->status != IVP_TAPE_FAILED, name_ + ": the tape of " + str(max_tape_steps_)
411  + " steps is full at t = " + str(d->t) + ", increase max_tape_steps");
412  casadi_assert(d->status != IVP_TOO_MANY_EVENTS, name_ + ": more than max_events = "
413  + str(max_events_) + " events, the last at t = " + str(d->t_ev));
414  casadi_assert(d->status != IVP_EVENT_FAILED, name_ + ": event near t = " + str(d->t_ev)
415  + " not located within event_acceptable_tol");
416  if (d->status != IVP_SUCCESS) {
417  if (verbose_) {
418  casadi_warning(name_ + ": integration failed at t = " + str(d->t) + ", status "
419  + str(static_cast<casadi_int>(d->status)));
420  }
421  return 1;
422  }
423  casadi_copy(d->y_out, nx_, m->x);
424  casadi_copy(d->y_out + nx_, nz_, m->z);
425  casadi_copy(d->y_out + nx_ + nz_, nq_, m->q);
426  return 0;
427 }
casadi_int nrx_
Number of states for the backward integration.
casadi_int max_events_
Maximum total number of events during the simulation.
casadi_int nx_
Number of states for the forward integration.
void run(RuntimeIntegratorMemory *m) const
Carry out the tasks requested by the kernel.
void casadi_copy(const T1 *x, casadi_int n, T1 *y)
COPY: y <-x.
casadi_ivp_flag_t status
Definition: casadi_ivp.hpp:201

References casadi::casadi_copy(), casadi::Integrator::max_events_, casadi::RuntimeIntegrator::max_tape_steps_, casadi::ProtoFunction::name_, casadi::Integrator::nq_, casadi::Integrator::nrx_, casadi::Integrator::nx_, casadi::Integrator::nz_, casadi::RuntimeIntegrator::run(), casadi_ivp_data< T1 >::status, casadi::str(), casadi_ivp_data< T1 >::t, casadi_ivp_data< T1 >::t_ev, casadi_ivp_data< T1 >::t_stop, casadi::ProtoFunction::verbose_, and casadi_ivp_data< T1 >::y_out.

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

◆ algebraic_state_init()

virtual MX casadi::Integrator::algebraic_state_init ( const MX &  x0,
const MX &  z0 
) const
inlinevirtualinherited

Reimplemented in casadi::Collocation.

Definition at line 162 of file integrator_impl.hpp.

162 { return z0; }

Referenced by casadi::FixedStepIntegrator::create_advanced().

◆ algebraic_state_output()

virtual MX casadi::Integrator::algebraic_state_output ( const MX &  Z) const
inlinevirtualinherited

Reimplemented in casadi::Collocation.

Definition at line 163 of file integrator_impl.hpp.

163 { return Z; }

References casadi::Z.

Referenced by casadi::FixedStepIntegrator::create_advanced().

◆ all_scalar()

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

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

Definition at line 4021 of file function_internal.cpp.

4021  {
4022  // Check inputs
4023  for (casadi_int i=0; i<n_in_; ++i) {
4024  if (!sparsity_in_[i].is_scalar()) return false;
4025  }
4026  // Check outputs
4027  for (casadi_int i=0; i<n_out_; ++i) {
4028  if (!sparsity_out_[i].is_scalar()) return false;
4029  }
4030  // All are scalar
4031  return true;
4032  }
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().

◆ all_zero()

bool casadi::Integrator::all_zero ( const double *  v,
casadi_int  n 
)
staticinherited

Definition at line 2823 of file integrator.cpp.

2823  {
2824  // Quick return if trivially zero
2825  if (v == nullptr || n == 0) return true;
2826  // Loop over entries
2827  for (casadi_int i = 0; i < n; ++i) {
2828  if (v[i] != 0.) return false;
2829  }
2830  // All zero if reached here
2831  return true;
2832 }

Referenced by casadi::Integrator::eval(), and casadi::IdasInterface::z_impulseB().

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

3210  {
3211  if (f.is_null()) return;
3212  size_t sz_arg, sz_res, sz_iw, sz_w;
3213  f.sz_work(sz_arg, sz_res, sz_iw, sz_w);
3214  alloc_arg(sz_arg*num_threads, persistent);
3215  alloc_res(sz_res*num_threads, persistent);
3216  alloc_iw(sz_iw*num_threads, persistent);
3217  alloc_w(sz_w*num_threads, persistent);
3218  registered_functions_.push_back(f);
3219  }
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.
std::vector< Function > registered_functions_
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::registered_functions_, 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_ivp_work()

void casadi::RuntimeIntegrator::alloc_ivp_work ( )
protectedinherited

Definition at line 333 of file runtime_integrator.cpp.

333  {
334  // Shared kernel data, and of the nominal integration
335  casadi_int sz_arg = 0, sz_res = 0, sz_iw = 0, sz_w = 0;
336  casadi_ivp_work(&p_, &sz_arg, &sz_res, &sz_iw, &sz_w);
337  if (replay_) casadi_ivp_work(&p_nom_, &sz_arg, &sz_res, &sz_iw, &sz_w);
338  alloc_w(sz_w, true);
339  // Parameters and controls in generated code
340  alloc_w(np_ + nu_, true);
341 }
casadi_int np_
Number of forward and backward parameters.
casadi_int nu_
Number of controls.
casadi_ivp_prob< double > p_nom_
casadi_ivp_prob< double > p_

References casadi::FunctionInternal::alloc_w(), casadi::Integrator::np_, casadi::Integrator::nu_, casadi::RuntimeIntegrator::p_, casadi::RuntimeIntegrator::p_nom_, casadi::RuntimeIntegrator::replay_, casadi::FunctionInternal::sz_arg(), casadi::FunctionInternal::sz_iw(), casadi::FunctionInternal::sz_res(), and casadi::FunctionInternal::sz_w().

Referenced by casadi::Erk::init(), and init().

◆ alloc_iw()

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

◆ alloc_mem()

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

Reimplemented from casadi::OracleFunction.

Definition at line 105 of file rosenbrock.hpp.

105 { return new RosenbrockMemory();}

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

3202  {
3203  if (persistent) {
3204  sz_w_per_ += sz_w;
3205  } else {
3206  sz_w_tmp_ = std::max(sz_w_tmp_, sz_w);
3207  }
3208  }

References casadi::FunctionInternal::sz_w().

Referenced by casadi::FunctionInternal::alloc(), casadi::RuntimeIntegrator::alloc_ivp_work(), casadi::BlazingSplineFunction::init(), casadi::External::init(), casadi::FiniteDiff::init(), casadi::FmuFunction::init(), casadi::Integrator::init(), casadi::FixedStepIntegrator::init(), casadi::Interpolant::init(), casadi::JitFunction::init(), casadi::Map::init(), casadi::OmpMap::init(), casadi::ThreadMap::init(), casadi::MapSum::init(), casadi::MXFunction::init(), casadi::Nlpsol::init(), casadi::Rootfinder::init(), casadi::RuntimeIntegrator::init(), casadi::Switch::init(), casadi::SXFunction::init(), casadi::Blocksqp::init(), casadi::BonminInterface::init(), casadi::CbcInterface::init(), casadi::MadmpecInterface::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::MosekInterface::init(), casadi::OoqpInterface::init(), casadi::OsqpInterface::init(), casadi::PiqpInterface::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::XpressInterface::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(), init(), casadi::Scpgen::init(), and casadi::Sqpmethod::init().

◆ augmented_dae()

Function casadi::Integrator::augmented_dae ( ) const
inherited

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

Definition at line 923 of file integrator.cpp.

923  {
924  // If no sensitivities, augmented oracle is the oracle itself
925  if (nfwd_ == 0) return oracle_;
926  // Name of augmented DAE
927  std::string aug_name = "fsens" + str(nfwd_) + "_" + oracle_.name();
928  // Use function in cache, if available
929  Function ret;
930  // if (incache(aug_name, ret)) return ret; // caching disabled while implementing #3047
931  // Create new augmented oracle
932  try {
933  if (oracle_.is_a("SXFunction")) {
934  ret = get_forward_dae<SX>(aug_name);
935  } else {
936  ret = get_forward_dae<MX>(aug_name);
937  }
938  } catch (std::exception& e) {
939  casadi_error("Failed to generate augmented DAE for " + name_ + ":\n" + e.what());
940  }
941  // Save to Function cache and return
942  // tocache(ret); // caching disabled while implementing #3047
943  return ret;
944 }
const std::string & name() const
Get the name given at construction ("null" for a null object)
Definition: function.cpp:1504
bool is_a(const std::string &type, bool recursive=true) const
Check whether the function is of a given class.
Definition: function.cpp:1861
casadi_int nfwd_
Number of sensitivities.
Function oracle_
Oracle: Used to generate other functions.

References casadi::Function::is_a(), casadi::Function::name(), casadi::ProtoFunction::name_, casadi::Integrator::nfwd_, casadi::OracleFunction::oracle_, and casadi::str().

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

◆ bdae_out()

static std::vector<std::string> casadi::Integrator::bdae_out ( )
inlinestaticinherited

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

Definition at line 379 of file integrator_impl.hpp.

379 { return {"adj_x", "adj_z"}; }

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

◆ bdae_sp_forward()

int casadi::Integrator::bdae_sp_forward ( SpForwardMem *  m,
const bvec_t *  x,
const bvec_t *  z,
const bvec_t *  p,
const bvec_t *  u,
const bvec_t *  adj_ode,
const bvec_t *  adj_quad,
bvec_t *  adj_x,
bvec_t *  adj_z 
) const
inherited

Definition at line 1057 of file integrator.cpp.

1059  {
1060  // Evaluate nondifferentiated
1061  m->arg[BDYN_T] = nullptr; // t
1062  m->arg[BDYN_X] = x; // x
1063  m->arg[BDYN_Z] = z; // z
1064  m->arg[BDYN_P] = p; // p
1065  m->arg[BDYN_U] = u; // u
1066  m->arg[BDYN_OUT_ODE] = nullptr; // out_ode
1067  m->arg[BDYN_OUT_ALG] = nullptr; // out_alg
1068  m->arg[BDYN_OUT_QUAD] = nullptr; // out_quad
1069  m->arg[BDYN_OUT_ZERO] = nullptr; // out_zero
1070  m->arg[BDYN_ADJ_ODE] = adj_ode; // adj_ode
1071  m->arg[BDYN_ADJ_ALG] = nullptr; // adj_alg
1072  m->arg[BDYN_ADJ_QUAD] = adj_quad; // adj_quad
1073  m->arg[BDYN_ADJ_ZERO] = nullptr; // adj_zero
1074  m->res[BDAE_ADJ_X] = adj_x; // adj_x
1075  m->res[BDAE_ADJ_Z] = adj_z; // adj_z
1076  if (calc_sp_forward("daeB", m->arg, m->res, m->iw, m->w)) return 1;
1077  // Evaluate sensitivities
1078  for (casadi_int i = 0; i < nfwd_; ++i) {
1079  m->arg[BDYN_NUM_IN + BDAE_ADJ_X] = adj_x; // out:adj_x
1080  m->arg[BDYN_NUM_IN + BDAE_ADJ_Z] = adj_z; // out:adj_z
1081  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_T] = nullptr; // fwd:t
1082  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_X] = x + (i + 1) * nx1_; // fwd:x
1083  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_Z] = z + (i + 1) * nz1_; // fwd:z
1084  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_P] = p ? p + (i + 1) * np1_ : nullptr; // fwd:p
1085  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_U] = u ? u + (i + 1) * nu1_ : nullptr; // fwd:u
1086  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_ODE] = nullptr; // fwd:out_ode
1087  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_ALG] = nullptr; // fwd:out_alg
1088  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_QUAD] = nullptr; // fwd:out_quad
1089  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_ZERO] = nullptr; // fwd:out_zero
1091  = adj_ode + (i + 1) * nrx1_ * nadj_; // fwd:adj_ode
1092  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_ADJ_ALG] = nullptr; // fwd:adj_alg
1094  = adj_quad + (i + 1) * nrz1_ * nadj_; // fwd:adj_quad
1095  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_ADJ_ZERO] = nullptr; // fwd:adj_zero
1096  m->res[BDAE_ADJ_X] = adj_x + (i + 1) * nrx1_ * nadj_; // fwd:adj_x
1097  m->res[BDAE_ADJ_Z] = adj_z + (i + 1) * nrz1_ * nadj_; // fwd:adj_z
1098  if (calc_sp_forward(forward_name("daeB", 1), m->arg, m->res, m->iw, m->w)) return 1;
1099  }
1100  return 0;
1101 }
static std::string forward_name(const std::string &fcn, casadi_int nfwd)
Helper function: Get name of forward derivative function.
int calc_sp_forward(const std::string &fcn, const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w) const

References casadi::SpForwardMem::arg, casadi::Integrator::BDAE_ADJ_X, casadi::Integrator::BDAE_ADJ_Z, casadi::Integrator::BDAE_NUM_OUT, casadi::Integrator::BDYN_ADJ_ALG, casadi::Integrator::BDYN_ADJ_ODE, casadi::Integrator::BDYN_ADJ_QUAD, casadi::Integrator::BDYN_ADJ_ZERO, casadi::Integrator::BDYN_NUM_IN, casadi::Integrator::BDYN_OUT_ALG, casadi::Integrator::BDYN_OUT_ODE, casadi::Integrator::BDYN_OUT_QUAD, casadi::Integrator::BDYN_OUT_ZERO, casadi::Integrator::BDYN_P, casadi::Integrator::BDYN_T, casadi::Integrator::BDYN_U, casadi::Integrator::BDYN_X, casadi::Integrator::BDYN_Z, casadi::OracleFunction::calc_sp_forward(), casadi::FunctionInternal::forward_name(), casadi::SpForwardMem::iw, casadi::Integrator::nadj_, casadi::Integrator::nfwd_, casadi::Integrator::np1_, casadi::Integrator::nrx1_, casadi::Integrator::nrz1_, casadi::Integrator::nu1_, casadi::Integrator::nx1_, casadi::Integrator::nz1_, casadi::SpForwardMem::res, and casadi::SpForwardMem::w.

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

◆ bdae_sp_reverse()

int casadi::Integrator::bdae_sp_reverse ( SpReverseMem *  m,
bvec_t *  x,
bvec_t *  z,
bvec_t *  p,
bvec_t *  u,
bvec_t *  adj_ode,
bvec_t *  adj_quad,
bvec_t *  adj_x,
bvec_t *  adj_z 
) const
inherited

Definition at line 1334 of file integrator.cpp.

1336  {
1337  // Nondifferentiated inputs
1338  m->arg[BDYN_T] = nullptr; // t
1339  m->arg[BDYN_X] = x; // x
1340  m->arg[BDYN_Z] = z; // z
1341  m->arg[BDYN_P] = p; // p
1342  m->arg[BDYN_U] = u; // u
1343  m->arg[BDYN_OUT_ODE] = nullptr; // out_ode
1344  m->arg[BDYN_OUT_ALG] = nullptr; // out_alg
1345  m->arg[BDYN_OUT_QUAD] = nullptr; // out_quad
1346  m->arg[BDYN_OUT_ZERO] = nullptr; // out_zero
1347  m->arg[BDYN_ADJ_ODE] = adj_ode; // adj_ode
1348  m->arg[BDYN_ADJ_ALG] = nullptr; // adj_alg
1349  m->arg[BDYN_ADJ_QUAD] = adj_quad; // adj_quad
1350  m->arg[BDYN_ADJ_ZERO] = nullptr; // adj_zero
1351  // Propagate through sensitivities
1352  for (casadi_int i = 0; i < nfwd_; ++i) {
1353  m->res[BDAE_ADJ_X] = adj_x + (i + 1) * nrx1_ * nadj_; // fwd:adj_x
1354  m->res[BDAE_ADJ_Z] = adj_z + (i + 1) * nrz1_ * nadj_; // fwd:adj_z
1355  m->arg[BDYN_NUM_IN + BDAE_ADJ_X] = adj_x; // out:adj_x
1356  m->arg[BDYN_NUM_IN + BDAE_ADJ_Z] = adj_z; // out:adj_z
1357  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_T] = nullptr; // fwd:t
1358  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_X] = x + (i + 1) * nx1_; // fwd:x
1359  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_Z] = z + (i + 1) * nz1_; // fwd:z
1360  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_P] = p ? p + (i + 1) * np1_ : nullptr; // fwd:p
1361  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_U] = u ? u + (i + 1) * nu1_ : nullptr; // fwd:u
1362  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_ODE] = nullptr; // fwd:out_ode
1363  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_ALG] = nullptr; // fwd:out_alg
1364  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_QUAD] = nullptr; // fwd:out_quad
1365  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_ZERO] = nullptr; // fwd:out_zero
1366  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_ADJ_ODE] =
1367  adj_ode + (i + 1) * nrx1_ * nadj_; // fwd:adj_ode
1368  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_ADJ_ALG] = nullptr; // fwd:adj_alg
1369  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_ADJ_QUAD] =
1370  adj_quad + (i + 1) * nrz1_ * nadj_; // fwd:adj_quad
1371  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_ADJ_ZERO] = nullptr; // fwd:adj_zero
1372  if (calc_sp_reverse(forward_name("daeB", 1), m->arg, m->res, m->iw, m->w)) return 1;
1373  }
1374  // Propagate through nondifferentiated
1375  m->res[BDAE_ADJ_X] = adj_x; // adj_x
1376  m->res[BDAE_ADJ_Z] = adj_z; // adj_z
1377  if (calc_sp_reverse("daeB", m->arg, m->res, m->iw, m->w)) return 1;
1378  return 0;
1379 }
int calc_sp_reverse(const std::string &fcn, bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w) const

References casadi::SpReverseMem::arg, casadi::Integrator::BDAE_ADJ_X, casadi::Integrator::BDAE_ADJ_Z, casadi::Integrator::BDAE_NUM_OUT, casadi::Integrator::BDYN_ADJ_ALG, casadi::Integrator::BDYN_ADJ_ODE, casadi::Integrator::BDYN_ADJ_QUAD, casadi::Integrator::BDYN_ADJ_ZERO, casadi::Integrator::BDYN_NUM_IN, casadi::Integrator::BDYN_OUT_ALG, casadi::Integrator::BDYN_OUT_ODE, casadi::Integrator::BDYN_OUT_QUAD, casadi::Integrator::BDYN_OUT_ZERO, casadi::Integrator::BDYN_P, casadi::Integrator::BDYN_T, casadi::Integrator::BDYN_U, casadi::Integrator::BDYN_X, casadi::Integrator::BDYN_Z, casadi::OracleFunction::calc_sp_reverse(), casadi::FunctionInternal::forward_name(), casadi::SpReverseMem::iw, casadi::Integrator::nadj_, casadi::Integrator::nfwd_, casadi::Integrator::np1_, casadi::Integrator::nrx1_, casadi::Integrator::nrz1_, casadi::Integrator::nu1_, casadi::Integrator::nx1_, casadi::Integrator::nz1_, casadi::SpReverseMem::res, and casadi::SpReverseMem::w.

Referenced by casadi::Integrator::sp_reverse().

◆ bdyn_in() [1/2]

std::vector< std::string > casadi::Integrator::bdyn_in ( )
staticinherited

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

Definition at line 96 of file integrator.cpp.

96  {
97  std::vector<std::string> ret(BDYN_NUM_IN);
98  for (casadi_int i = 0; i < BDYN_NUM_IN; ++i)
99  ret[i] = bdyn_in(i);
100  return ret;
101 }
static std::vector< std::string > bdyn_in()
IO conventions for continuous time dynamics.
Definition: integrator.cpp:96

References casadi::Integrator::BDYN_NUM_IN.

Referenced by casadi::Integrator::init(), and casadi::RuntimeIntegrator::init().

◆ bdyn_in() [2/2]

std::string casadi::Integrator::bdyn_in ( casadi_int  i)
staticinherited

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

Definition at line 76 of file integrator.cpp.

76  {
77  switch (i) {
78  case BDYN_T: return "t";
79  case BDYN_X: return "x";
80  case BDYN_Z: return "z";
81  case BDYN_P: return "p";
82  case BDYN_U: return "u";
83  case BDYN_OUT_ODE: return "out_ode";
84  case BDYN_OUT_ALG: return "out_alg";
85  case BDYN_OUT_QUAD: return "out_quad";
86  case BDYN_OUT_ZERO: return "out_zero";
87  case BDYN_ADJ_ODE: return "adj_ode";
88  case BDYN_ADJ_ALG: return "adj_alg";
89  case BDYN_ADJ_QUAD: return "adj_quad";
90  case BDYN_ADJ_ZERO: return "adj_zero";
91  default: break;
92  }
93  return "";
94 }

References casadi::Integrator::BDYN_ADJ_ALG, casadi::Integrator::BDYN_ADJ_ODE, casadi::Integrator::BDYN_ADJ_QUAD, casadi::Integrator::BDYN_ADJ_ZERO, casadi::Integrator::BDYN_OUT_ALG, casadi::Integrator::BDYN_OUT_ODE, casadi::Integrator::BDYN_OUT_QUAD, casadi::Integrator::BDYN_OUT_ZERO, casadi::Integrator::BDYN_P, casadi::Integrator::BDYN_T, casadi::Integrator::BDYN_U, casadi::Integrator::BDYN_X, and casadi::Integrator::BDYN_Z.

◆ bdyn_out() [1/2]

std::vector< std::string > casadi::Integrator::bdyn_out ( )
staticinherited

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

Definition at line 115 of file integrator.cpp.

115  {
116  std::vector<std::string> ret(BDYN_NUM_OUT);
117  for (casadi_int i = 0; i < BDYN_NUM_OUT; ++i)
118  ret[i] = bdyn_out(i);
119  return ret;
120 }
static std::vector< std::string > bdyn_out()
IO conventions for continuous time dynamics.
Definition: integrator.cpp:115

References casadi::Integrator::BDYN_NUM_OUT.

◆ bdyn_out() [2/2]

std::string casadi::Integrator::bdyn_out ( casadi_int  i)
staticinherited

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

Definition at line 103 of file integrator.cpp.

103  {
104  switch (i) {
105  case BDYN_ADJ_T: return "adj_t";
106  case BDYN_ADJ_X: return "adj_x";
107  case BDYN_ADJ_Z: return "adj_z";
108  case BDYN_ADJ_P: return "adj_p";
109  case BDYN_ADJ_U: return "adj_u";
110  default: break;
111  }
112  return "";
113 }

References casadi::Integrator::BDYN_ADJ_P, casadi::Integrator::BDYN_ADJ_T, casadi::Integrator::BDYN_ADJ_U, casadi::Integrator::BDYN_ADJ_X, and casadi::Integrator::BDYN_ADJ_Z.

◆ bquad_out()

static std::vector<std::string> casadi::Integrator::bquad_out ( )
inlinestaticinherited

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

Definition at line 381 of file integrator_impl.hpp.

381 { return {"adj_p", "adj_u"}; }

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

◆ bquad_sp_forward()

int casadi::Integrator::bquad_sp_forward ( SpForwardMem *  m,
const bvec_t *  x,
const bvec_t *  z,
const bvec_t *  p,
const bvec_t *  u,
const bvec_t *  adj_ode,
const bvec_t *  adj_alg,
const bvec_t *  adj_quad,
bvec_t *  adj_p,
bvec_t *  adj_u 
) const
inherited

Definition at line 1103 of file integrator.cpp.

1106  {
1107  // Evaluate nondifferentiated
1108  m->arg[BDYN_T] = nullptr; // t
1109  m->arg[BDYN_X] = x; // x
1110  m->arg[BDYN_Z] = z; // z
1111  m->arg[BDYN_P] = p; // p
1112  m->arg[BDYN_U] = u; // u
1113  m->arg[BDYN_OUT_ODE] = nullptr; // out_ode
1114  m->arg[BDYN_OUT_ALG] = nullptr; // out_alg
1115  m->arg[BDYN_OUT_QUAD] = nullptr; // out_quad
1116  m->arg[BDYN_OUT_ZERO] = nullptr; // out_zero
1117  m->arg[BDYN_ADJ_ODE] = adj_ode; // adj_ode
1118  m->arg[BDYN_ADJ_ALG] = adj_alg; // adj_alg
1119  m->arg[BDYN_ADJ_QUAD] = adj_quad; // adj_quad
1120  m->arg[BDYN_ADJ_ZERO] = nullptr; // adj_zero
1121  m->res[BQUAD_ADJ_P] = adj_p; // adj_p
1122  m->res[BQUAD_ADJ_U] = adj_u; // adj_u
1123  if (calc_sp_forward("quadB", m->arg, m->res, m->iw, m->w)) return 1;
1124  // Evaluate sensitivities
1125  for (casadi_int i = 0; i < nfwd_; ++i) {
1126  m->arg[BDYN_NUM_IN + BQUAD_ADJ_P] = adj_p; // out:adj_p
1127  m->arg[BDYN_NUM_IN + BQUAD_ADJ_U] = adj_u; // out:adj_u
1128  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_T] = nullptr; // fwd:t
1129  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_X] = x + (i + 1) * nx1_; // fwd:x
1130  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_Z] = z + (i + 1) * nz1_; // fwd:z
1131  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_P] = p ? p + (i + 1) * np1_ : nullptr; // fwd:p
1132  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_U] = u ? u + (i + 1) * nu1_ : nullptr; // fwd:u
1133  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_OUT_ODE] = nullptr; // fwd:out_ode
1134  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_OUT_ALG] = nullptr; // fwd:out_alg
1135  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_OUT_QUAD] = nullptr; // fwd:out_quad
1136  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_OUT_ZERO] = nullptr; // fwd:out_zero
1137  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_ADJ_ODE] =
1138  adj_ode + (i + 1) * nrx1_ * nadj_; // fwd:adj_ode
1139  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_ADJ_ALG] =
1140  adj_alg + (i + 1) * nrz1_ * nadj_; // fwd:adj_alg
1142  adj_quad + (i + 1) * nrp1_ * nadj_; // fwd:adj_quad
1143  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_ADJ_ZERO] = nullptr; // fwd:adj_zero
1144  m->res[BQUAD_ADJ_P] = adj_p ? adj_p + (i + 1) * nrq1_ * nadj_ : nullptr; // fwd:adj_p
1145  m->res[BQUAD_ADJ_U] = adj_u ? adj_u + (i + 1) * nuq1_ * nadj_: nullptr; // fwd:adj_u
1146  if (calc_sp_forward(forward_name("quadB", 1), m->arg, m->res, m->iw, m->w)) return 1;
1147  }
1148  return 0;
1149 }

References casadi::SpForwardMem::arg, casadi::Integrator::BDYN_ADJ_ALG, casadi::Integrator::BDYN_ADJ_ODE, casadi::Integrator::BDYN_ADJ_QUAD, casadi::Integrator::BDYN_ADJ_ZERO, casadi::Integrator::BDYN_NUM_IN, casadi::Integrator::BDYN_OUT_ALG, casadi::Integrator::BDYN_OUT_ODE, casadi::Integrator::BDYN_OUT_QUAD, casadi::Integrator::BDYN_OUT_ZERO, casadi::Integrator::BDYN_P, casadi::Integrator::BDYN_T, casadi::Integrator::BDYN_U, casadi::Integrator::BDYN_X, casadi::Integrator::BDYN_Z, casadi::Integrator::BQUAD_ADJ_P, casadi::Integrator::BQUAD_ADJ_U, casadi::Integrator::BQUAD_NUM_OUT, casadi::OracleFunction::calc_sp_forward(), casadi::FunctionInternal::forward_name(), casadi::SpForwardMem::iw, casadi::Integrator::nadj_, casadi::Integrator::nfwd_, casadi::Integrator::np1_, casadi::Integrator::nrp1_, casadi::Integrator::nrq1_, casadi::Integrator::nrx1_, casadi::Integrator::nrz1_, casadi::Integrator::nu1_, casadi::Integrator::nuq1_, casadi::Integrator::nx1_, casadi::Integrator::nz1_, casadi::SpForwardMem::res, and casadi::SpForwardMem::w.

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

◆ bquad_sp_reverse()

int casadi::Integrator::bquad_sp_reverse ( SpReverseMem *  m,
bvec_t *  x,
bvec_t *  z,
bvec_t *  p,
bvec_t *  u,
bvec_t *  adj_ode,
bvec_t *  adj_alg,
bvec_t *  adj_quad,
bvec_t *  adj_p,
bvec_t *  adj_u 
) const
inherited

Definition at line 1381 of file integrator.cpp.

1383  {
1384  // Nondifferentiated inputs
1385  m->arg[BDYN_T] = nullptr; // t
1386  m->arg[BDYN_X] = x; // x
1387  m->arg[BDYN_Z] = z; // z
1388  m->arg[BDYN_P] = p; // p
1389  m->arg[BDYN_U] = u; // u
1390  m->arg[BDYN_OUT_ODE] = adj_ode; // out_ode
1391  m->arg[BDYN_OUT_ALG] = adj_alg; // out_alg
1392  m->arg[BDYN_OUT_QUAD] = adj_quad; // out_quad
1393  m->arg[BDYN_OUT_ZERO] = nullptr; // out_zero
1394  m->arg[BDYN_ADJ_ODE] = adj_ode; // adj_ode
1395  m->arg[BDYN_ADJ_ALG] = adj_alg; // adj_alg
1396  m->arg[BDYN_ADJ_QUAD] = adj_quad; // adj_quad
1397  m->arg[BDYN_ADJ_ZERO] = nullptr; // adj_zero
1398  // Propagate through sensitivities
1399  for (casadi_int i = 0; i < nfwd_; ++i) {
1400  m->res[BQUAD_ADJ_P] = adj_p ? adj_p + (i + 1) * nrq1_ * nadj_ : nullptr; // fwd:adj_p
1401  m->res[BQUAD_ADJ_U] = adj_u ? adj_u + (i + 1) * nuq1_ * nadj_ : nullptr; // fwd:adj_u
1402  m->arg[BDYN_NUM_IN + BQUAD_ADJ_P] = adj_p; // out:adj_p
1403  m->arg[BDYN_NUM_IN + BQUAD_ADJ_U] = adj_u; // out:adj_u
1404  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_T] = nullptr; // fwd:t
1405  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_X] = x + (i + 1) * nx1_; // fwd:x
1406  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_Z] = z + (i + 1) * nz1_; // fwd:z
1407  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_P] = p ? p + (i + 1) * np1_ : nullptr; // fwd:p
1408  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_U] = u ? u + (i + 1) * nu1_ : nullptr; // fwd:u
1409  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_OUT_ODE] = nullptr; // fwd:out_ode
1410  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_OUT_ALG] = nullptr; // fwd:out_alg
1411  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_OUT_QUAD] = nullptr; // fwd:out_quad
1412  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_OUT_ZERO] = nullptr; // fwd:out_zero
1413  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_ADJ_ODE] =
1414  adj_ode + (i + 1) * nrx1_ * nadj_; // fwd:adj_ode
1415  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_ADJ_ALG] =
1416  adj_alg + (i + 1) * nrz1_ * nadj_; // fwd:adj_alg
1418  adj_quad + (i + 1) * nrp1_ * nadj_; // fwd:adj_quad
1419  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_ADJ_ZERO] = nullptr; // fwd:adj_zero
1420  if (calc_sp_reverse(forward_name("quadB", 1), m->arg, m->res, m->iw, m->w)) return 1;
1421  }
1422  // Propagate through nondifferentiated
1423  m->res[BQUAD_ADJ_P] = adj_p; // adj_p
1424  m->res[BQUAD_ADJ_U] = adj_u; // adj_u
1425  if (calc_sp_reverse("quadB", m->arg, m->res, m->iw, m->w)) return 1;
1426  return 0;
1427 }

References casadi::SpReverseMem::arg, casadi::Integrator::BDYN_ADJ_ALG, casadi::Integrator::BDYN_ADJ_ODE, casadi::Integrator::BDYN_ADJ_QUAD, casadi::Integrator::BDYN_ADJ_ZERO, casadi::Integrator::BDYN_NUM_IN, casadi::Integrator::BDYN_OUT_ALG, casadi::Integrator::BDYN_OUT_ODE, casadi::Integrator::BDYN_OUT_QUAD, casadi::Integrator::BDYN_OUT_ZERO, casadi::Integrator::BDYN_P, casadi::Integrator::BDYN_T, casadi::Integrator::BDYN_U, casadi::Integrator::BDYN_X, casadi::Integrator::BDYN_Z, casadi::Integrator::BQUAD_ADJ_P, casadi::Integrator::BQUAD_ADJ_U, casadi::Integrator::BQUAD_NUM_OUT, casadi::OracleFunction::calc_sp_reverse(), casadi::FunctionInternal::forward_name(), casadi::SpReverseMem::iw, casadi::Integrator::nadj_, casadi::Integrator::nfwd_, casadi::Integrator::np1_, casadi::Integrator::nrp1_, casadi::Integrator::nrq1_, casadi::Integrator::nrx1_, casadi::Integrator::nrz1_, casadi::Integrator::nu1_, casadi::Integrator::nuq1_, casadi::Integrator::nx1_, casadi::Integrator::nz1_, casadi::SpReverseMem::res, and casadi::SpReverseMem::w.

Referenced by casadi::Integrator::sp_reverse().

◆ cache()

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

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

Definition at line 1170 of file function_internal.cpp.

1170  {
1171  // Return value
1172  Dict ret;
1173 
1174  // Retrieve all Function instances that haven't been deleted
1175  std::vector<std::string> keys;
1176  std::vector<Function> entries;
1177  cache_.cache(keys, entries);
1178 
1179  for (size_t i=0; i<keys.size(); ++i) {
1180  // Get the name of the key
1181  std::string s = keys[i];
1182  casadi_assert_dev(s.size() > 0);
1183  // Replace ':' with '_'
1184  std::replace(s.begin(), s.end(), ':', '_');
1185  // Remove trailing underscore, if any
1186  if (s.back() == '_') s.resize(s.size() - 1);
1187  // Add entry to function return
1188  ret[s] = entries[i];
1189  }
1190 
1191  return ret;
1192  }
WeakCache< std::string, Function > cache_
Function cache.
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.

References casadi::FunctionInternal::cache_.

◆ calc_edot()

int casadi::Integrator::calc_edot ( IntegratorMemory *  m) const
inherited

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

Definition at line 2651 of file integrator.cpp.

2651  {
2652  // Evaluate the DAE and zero crossing function
2653  m->arg[DYN_T] = &m->t; // t
2654  m->arg[DYN_X] = m->x; // x
2655  m->arg[DYN_Z] = m->z; // z
2656  m->arg[DYN_P] = m->p; // p
2657  m->arg[DYN_U] = m->u; // u
2658  m->res[DYN_ODE] = m->xdot; // ode
2659  m->res[DYN_ALG] = m->tmp1 + nx_; // alg
2660  m->res[DYN_QUAD] = nullptr; // quad
2661  m->res[DYN_ZERO] = m->e; // zero
2662  if (calc_function(m, "dae")) return 1;
2663  // Calculate de_dt using by forward mode AD applied to zero crossing function
2664  // Note: Currently ignoring dependency propagation via algebraic equations
2665  double dt_dt = 1;
2666  m->arg[DYN_NUM_IN + DYN_ODE] = m->xdot; // out:ode
2667  m->arg[DYN_NUM_IN + DYN_ALG] = m->tmp1 + nx_; // out:alg
2668  m->arg[DYN_NUM_IN + DYN_QUAD] = nullptr; // out:quad
2669  m->arg[DYN_NUM_IN + DYN_ZERO] = m->e; // out:zero
2670  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_T] = &dt_dt; // fwd:t
2671  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_X] = m->xdot; // fwd:x
2672  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_Z] = nullptr; // fwd:z
2673  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_P] = nullptr; // fwd:p
2674  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_U] = nullptr; // fwd:u
2675  m->res[DYN_ODE] = nullptr; // fwd:ode
2676  m->res[DYN_ALG] = nullptr; // fwd:alg
2677  m->res[DYN_QUAD] = nullptr; // fwd:quad
2678  m->res[DYN_ZERO] = m->edot; // fwd:zero
2679  if (calc_function(m, forward_name("dae", 1))) return 1;
2680  // Success
2681  return 0;
2682 }
int calc_function(OracleMemory *m, const std::string &fcn, const double *const *arg=nullptr, int thread_id=0) const
@ DYN_NUM_IN
Definition: integrator.hpp:917
@ DYN_NUM_OUT
Definition: integrator.hpp:925

References casadi::OracleMemory::arg, casadi::OracleFunction::calc_function(), casadi::DYN_ALG, casadi::DYN_NUM_IN, casadi::DYN_NUM_OUT, casadi::DYN_ODE, casadi::DYN_P, casadi::DYN_QUAD, casadi::DYN_T, casadi::DYN_U, casadi::DYN_X, casadi::DYN_Z, casadi::DYN_ZERO, casadi::IntegratorMemory::e, casadi::IntegratorMemory::edot, casadi::FunctionInternal::forward_name(), casadi::Integrator::nx_, casadi::IntegratorMemory::p, casadi::OracleMemory::res, casadi::IntegratorMemory::t, casadi::IntegratorMemory::tmp1, casadi::IntegratorMemory::u, casadi::IntegratorMemory::x, casadi::IntegratorMemory::xdot, and casadi::IntegratorMemory::z.

Referenced by casadi::Integrator::advance(), casadi::Integrator::predict_events(), and casadi::Integrator::trigger_event().

◆ calc_function()

int casadi::OracleFunction::calc_function ( OracleMemory *  m,
const std::string &  fcn,
const double *const *  arg = nullptr,
int  thread_id = 0 
) const
inherited

Definition at line 303 of file oracle_function.cpp.

305  {
306  auto *ml = m->thread_local_mem.at(thread_id);
307  // Is the function monitored?
308  bool monitored = this->monitored(fcn);
309 
310  // Print progress
311  if (monitored) casadi_message("Calling \"" + fcn + "\"");
312 
313  // Respond to a possible Crl+C signals
314  // Python interrupt checker needs the GIL.
315  // We may not have access to it in a multi-threaded context
316  // See issue #2955
318 
319  // Get function
320  const Function& f = get_function(fcn);
321 
322  // Get statistics structure
323  FStats& fstats = ml->fstats.at(fcn);
324 
325  // Number of inputs and outputs
326  casadi_int n_in = f.n_in(), n_out = f.n_out();
327 
328  // Prepare stats, start timer
329  ScopedTiming tic(fstats);
330 
331  // Input buffers
332  if (arg) {
333  std::fill_n(ml->arg, n_in, nullptr);
334  for (casadi_int i=0; i<n_in; ++i) ml->arg[i] = *arg++;
335  }
336 
337  // Print inputs nonzeros
338  if (monitored) {
339  std::stringstream s;
340  s << fcn << " input nonzeros:\n";
341  for (casadi_int i=0; i<n_in; ++i) {
342  s << " " << i << " (" << f.name_in(i) << "): ";
343  if (ml->arg[i]) {
344  // Print nonzeros
345  s << "[";
346  for (casadi_int k=0; k<f.nnz_in(i); ++k) {
347  if (k!=0) s << ", ";
348  DM::print_scalar(s, ml->arg[i][k]);
349  }
350  s << "]\n";
351  } else {
352  // All zero input
353  s << "0\n";
354  }
355  }
356  casadi_message(s.str());
357  }
358 
359  // Evaluate memory-less
360  try {
361  if (f(ml->arg, ml->res, ml->iw, ml->w)) {
362  // Recoverable error
363  if (monitored) casadi_message(name_ + ":" + fcn + " failed");
364  return 1;
365  }
366  } catch(KeyboardInterruptException&) {
367  throw;
368  } catch(std::exception& ex) {
369  // Fatal error: Generate stack trace
370  casadi_error("Error in " + name_ + ":" + fcn + ":" + std::string(ex.what()));
371  }
372 
373  // Print output nonzeros
374  if (monitored) {
375  std::stringstream s;
376  s << fcn << " output nonzeros:\n";
377  for (casadi_int i=0; i<n_out; ++i) {
378  s << " " << i << " (" << f.name_out(i) << "): ";
379  if (ml->res[i]) {
380  // Print nonzeros
381  s << "[";
382  for (casadi_int k=0; k<f.nnz_out(i); ++k) {
383  if (k!=0) s << ", ";
384  DM::print_scalar(s, ml->res[i][k]);
385  }
386  s << "]\n";
387  } else {
388  // Ignored output
389  s << " N/A\n";
390  }
391  }
392  casadi_message(s.str());
393  }
394 
395  // Make sure not NaN or Inf
396  for (casadi_int i=0; i<n_out; ++i) {
397  if (!ml->res[i]) continue;
398  if (!std::all_of(ml->res[i], ml->res[i]+f.nnz_out(i), [](double v) { return isfinite(v);})) {
399  std::stringstream ss;
400 
401  auto *it = std::find_if(ml->res[i], ml->res[i] + f.nnz_out(i),
402  [](double v) { return !isfinite(v);});
403  casadi_int k = std::distance(ml->res[i], it);
404  bool is_nan = isnan(ml->res[i][k]);
405  ss << name_ << ":" << fcn << " failed: " << (is_nan? "NaN" : "Inf") <<
406  " detected for output " << f.name_out(i) << ", at " << f.sparsity_out(i).repr_el(k) << ".";
407 
408  if (regularity_check_) {
409  casadi_error(ss.str());
410  } else {
411  if (show_eval_warnings_) casadi_warning(ss.str());
412  }
413  return -1;
414  }
415  }
416 
417  // Success
418  return 0;
419 }
static void check()
Raises an error if an interrupt was captured.
void print_scalar(std::ostream &stream) const
Print a 1-by-1 matrix as a bare number or expression.
std::vector< std::string > get_function() const override
Get list of dependency functions.
virtual bool monitored(const std::string &name) const
bool show_eval_warnings_
Show evaluation warnings.
bool regularity_check_
Errors are thrown when NaN is produced.

References casadi::InterruptHandler::check(), casadi::OracleFunction::get_function(), casadi::OracleFunction::max_num_threads_, casadi::OracleFunction::monitored(), casadi::Function::n_in(), casadi::Function::n_out(), casadi::ProtoFunction::name_, casadi::Function::name_in(), casadi::Function::name_out(), casadi::Function::nnz_in(), casadi::Function::nnz_out(), casadi::Matrix< double >::print_scalar(), casadi::ProtoFunction::regularity_check_, casadi::Sparsity::repr_el(), casadi::OracleFunction::show_eval_warnings_, casadi::Function::sparsity_out(), and casadi::OracleMemory::thread_local_mem.

Referenced by casadi::KinsolInterface::bjac(), casadi::SundialsInterface::calc_daeB(), casadi::SundialsInterface::calc_daeF(), casadi::Integrator::calc_edot(), casadi::calc_function(), casadi::SundialsInterface::calc_jacF(), casadi::SundialsInterface::calc_jtimesF(), casadi::SundialsInterface::calc_quadB(), casadi::SundialsInterface::calc_quadF(), casadi::casadi_func_cons_jac(), casadi::casadi_func_cons_val(), casadi::casadi_func_hess_prod(), casadi::casadi_func_obj_grad(), casadi::casadi_func_obj_val(), casadi::ConoptInterface::cb_2dlagrval(), casadi::KinsolInterface::djac(), casadi::Nlpsol::eval(), casadi::AlpaqaProblem::eval_f(), casadi::BonminUserClass::eval_f(), casadi::IpoptUserClass::eval_f(), casadi::AlpaqaProblem::eval_f_grad_f(), casadi::AlpaqaProblem::eval_g(), casadi::BonminUserClass::eval_g(), casadi::IpoptUserClass::eval_g(), casadi::BonminUserClass::eval_grad_f(), casadi::IpoptUserClass::eval_grad_f(), casadi::AlpaqaProblem::eval_grad_L(), casadi::BonminUserClass::eval_h(), casadi::IpoptUserClass::eval_h(), casadi::AlpaqaProblem::eval_hess_L(), casadi::AlpaqaProblem::eval_hess_L_prod(), casadi::AlpaqaProblem::eval_hess_ψ(), casadi::AlpaqaProblem::eval_hess_ψ_prod(), casadi::AlpaqaProblem::eval_jac_g(), casadi::BonminUserClass::eval_jac_g(), casadi::IpoptUserClass::eval_jac_g(), casadi::AlpaqaProblem::eval_ψ(), casadi::AlpaqaProblem::eval_ψ_grad_ψ(), casadi::Blocksqp::evaluate(), casadi::Feasiblesqpmethod::feasibility_iterations(), casadi::KinsolInterface::psetup(), casadi::ConoptInterface::solve(), casadi::KnitroInterface::solve(), casadi::SnoptInterface::solve(), casadi::WorhpInterface::solve(), casadi::Feasiblesqpmethod::solve(), casadi::Newton::solve(), casadi::Qrsqp::solve(), casadi::Sqpmethod::solve(), casadi::FixedStepIntegrator::stepB(), casadi::FixedStepIntegrator::stepF(), casadi::Integrator::trigger_event(), and casadi::SnoptInterface::userfun().

◆ calc_sp_forward()

int casadi::OracleFunction::calc_sp_forward ( const std::string &  fcn,
const bvec_t **  arg,
bvec_t **  res,
casadi_int *  iw,
bvec_t *  w 
) const
inherited

◆ calc_sp_reverse()

int casadi::OracleFunction::calc_sp_reverse ( const std::string &  fcn,
bvec_t **  arg,
bvec_t **  res,
casadi_int *  iw,
bvec_t *  w 
) const
inherited

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

1626  {
1627  // If all inputs are scalar ...
1628  if (all_scalar()) {
1629  // ... and some arguments are matrix-valued with matching dimensions ...
1630  bool matrix_call = false;
1631  std::pair<casadi_int, casadi_int> sz;
1632  for (auto&& a : arg) {
1633  if (!a.is_scalar() && !a.is_empty()) {
1634  if (!matrix_call) {
1635  // Matrix call
1636  matrix_call = true;
1637  sz = a.size();
1638  } else if (a.size()!=sz) {
1639  // Not same dimensions
1640  matrix_call = false;
1641  break;
1642  }
1643  }
1644  }
1645 
1646  // ... then, call multiple times
1647  if (matrix_call) {
1648  // Start with zeros
1649  res.resize(n_out_);
1650  M z = M::zeros(sz);
1651  for (auto&& a : res) a = z;
1652  // Call multiple times
1653  std::vector<M> arg1 = arg, res1;
1654  for (casadi_int c=0; c<sz.second; ++c) {
1655  for (casadi_int r=0; r<sz.first; ++r) {
1656  // Get scalar arguments
1657  for (casadi_int i=0; i<arg.size(); ++i) {
1658  if (arg[i].size()==sz) arg1[i] = arg[i](r, c);
1659  }
1660  // Call recursively with scalar arguments
1661  call(arg1, res1, always_inline, never_inline);
1662  // Get results
1663  casadi_assert_dev(res.size() == res1.size());
1664  for (casadi_int i=0; i<res.size(); ++i) res[i](r, c) = res1[i];
1665  }
1666  }
1667  // All elements assigned
1668  return;
1669  }
1670  }
1671 
1672  // Check if inputs need to be replaced
1673  casadi_int npar = 1;
1674  if (!matching_arg(arg, npar)) {
1675  return call(replace_arg(arg, npar), res, always_inline, never_inline);
1676  }
1677 
1678  // Call the type-specific method
1679  call_gen(arg, res, npar, always_inline, never_inline);
1680  }
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().

Referenced by casadi::SXFunction::trace_instruction().

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

3286  {
3287  casadi_assert(!(always_inline && never_inline), "Inconsistent options");
3288  casadi_assert(!always_inline, "Class " + class_name() +
3289  " cannot be inlined in an MX expression");
3290 
3291  // Derivative information must be available
3292  casadi_assert(has_derivative(),
3293  "Derivatives cannot be calculated for " + name_);
3294 
3295  // Number of directional derivatives
3296  casadi_int nfwd = fseed.size();
3297  fsens.resize(nfwd);
3298 
3299  // Quick return if no seeds
3300  if (nfwd==0) return;
3301 
3302  // Check if seeds need to have dimensions corrected
3303  casadi_int npar = 1;
3304  for (auto&& r : fseed) {
3305  if (!matching_arg(r, npar)) {
3306  FunctionInternal::call_forward(arg, res, replace_fseed(fseed, npar),
3307  fsens, always_inline, never_inline);
3308  return;
3309  }
3310  }
3311 
3312  // Calculating full Jacobian and then multiplying
3313  if (fwdViaJac(nfwd)) {
3314  // Multiply the Jacobian from the right
3315  std::vector<MX> darg = arg;
3316  darg.insert(darg.end(), res.begin(), res.end());
3317  std::vector<MX> J = jacobian()(darg);
3318  // Join forward seeds
3319  std::vector<MX> v(nfwd), all_fseed(n_in_);
3320  for (size_t i = 0; i < n_in_; ++i) {
3321  for (size_t d = 0; d < nfwd; ++d) v[d] = vec(fseed.at(d).at(i));
3322  all_fseed[i] = horzcat(v);
3323  }
3324  // Calculate forward sensitivities
3325  std::vector<MX> all_fsens(n_out_);
3326  std::vector<MX>::const_iterator J_it = J.begin();
3327  for (size_t oind = 0; oind < n_out_; ++oind) {
3328  for (size_t iind = 0; iind < n_in_; ++iind) {
3329  // Add contribution
3330  MX a = mtimes(*J_it++, all_fseed[iind]);
3331  all_fsens[oind] = all_fsens[oind].is_empty(true) ? a : all_fsens[oind] + a;
3332  }
3333  }
3334  // Split forward sensitivities
3335  for (size_t d = 0; d < nfwd; ++d) fsens[d].resize(n_out_);
3336  for (size_t i = 0; i < n_out_; ++i) {
3337  v = horzsplit(all_fsens[i]);
3338  casadi_assert_dev(v.size() == nfwd);
3339  for (size_t d = 0; d < nfwd; ++d) fsens[d][i] = reshape(v[d], size_out(i));
3340  }
3341  } else {
3342  // Evaluate in batches
3343  casadi_assert_dev(enable_forward_ || enable_fd_);
3344  casadi_int max_nfwd = max_num_dir_;
3345  if (!enable_fd_) {
3346  while (!has_forward(max_nfwd)) max_nfwd/=2;
3347  }
3348  casadi_int offset = 0;
3349  while (offset<nfwd) {
3350  // Number of derivatives, in this batch
3351  casadi_int nfwd_batch = std::min(nfwd-offset, max_nfwd);
3352 
3353  // All inputs and seeds
3354  std::vector<MX> darg;
3355  darg.reserve(n_in_ + n_out_ + n_in_);
3356  darg.insert(darg.end(), arg.begin(), arg.end());
3357  darg.insert(darg.end(), res.begin(), res.end());
3358  std::vector<MX> v(nfwd_batch);
3359  for (casadi_int i=0; i<n_in_; ++i) {
3360  for (casadi_int d=0; d<nfwd_batch; ++d) v[d] = fseed[offset+d][i];
3361  darg.push_back(horzcat(v));
3362  }
3363 
3364  // Create the evaluation node
3365  Function dfcn = self().forward(nfwd_batch);
3366  std::vector<MX> x = dfcn(darg);
3367 
3368  casadi_assert_dev(x.size()==n_out_);
3369 
3370  // Retrieve sensitivities
3371  for (casadi_int d=0; d<nfwd_batch; ++d) fsens[offset+d].resize(n_out_);
3372  for (casadi_int i=0; i<n_out_; ++i) {
3373  if (size2_out(i)>0) {
3374  v = horzsplit(x[i], size2_out(i));
3375  casadi_assert_dev(v.size()==nfwd_batch);
3376  } else {
3377  v = std::vector<MX>(nfwd_batch, MX(size_out(i)));
3378  }
3379  for (casadi_int d=0; d<nfwd_batch; ++d) fsens[offset+d][i] = v[d];
3380  }
3381 
3382  // Update offset
3383  offset += nfwd_batch;
3384  }
3385  }
3386  }
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 3503 of file function_internal.cpp.

3507  {
3508  casadi_assert(!(always_inline && never_inline), "Inconsistent options");
3509  if (fseed.empty()) { // Quick return if no seeds
3510  fsens.clear();
3511  return;
3512  }
3513  casadi_error("'forward' (SX) not defined for " + class_name());
3514  }

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

4197  {
4198  if (npar==1) {
4199  eval_mx(arg, res, always_inline, never_inline);
4200  } else {
4201  // Split it up arguments
4202  std::vector<std::vector<MX>> v(npar, arg);
4203  std::vector<MX> t;
4204  for (int i=0; i<n_in_; ++i) {
4205  if (arg[i].size2()!=size2_in(i)) {
4206  t = horzsplit(arg[i], size2_in(i));
4207  casadi_assert_dev(t.size()==npar);
4208  for (int p=0; p<npar; ++p) v[p][i] = t[p];
4209  }
4210  }
4211  // Unroll the loop
4212  for (int p=0; p<npar; ++p) {
4213  eval_mx(v[p], t, always_inline, never_inline);
4214  v[p] = t;
4215  }
4216  // Concatenate results
4217  t.resize(npar);
4218  res.resize(n_out_);
4219  for (int i=0; i<n_out_; ++i) {
4220  for (int p=0; p<npar; ++p) t[p] = v[p][i];
4221  res[i] = horzcat(t);
4222  }
4223  }
4224  }
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 1729 of file function_internal.hpp.

1731  {
1732  std::vector< Matrix<D> > arg2 = project_arg(arg, npar);
1733 
1734  // Which arguments require mapped evaluation
1735  std::vector<bool> mapped(n_in_);
1736  for (casadi_int i=0; i<n_in_; ++i) {
1737  mapped[i] = arg[i].size2()!=size2_in(i);
1738  }
1739 
1740  // Allocate results
1741  res.resize(n_out_);
1742  for (casadi_int i=0; i<n_out_; ++i) {
1743  if (!res[i].sparsity().is_stacked(sparsity_out(i), npar)) {
1744  res[i] = Matrix<D>::zeros(repmat(sparsity_out(i), 1, npar));
1745  }
1746  }
1747 
1748  // Allocate temporary memory if needed
1749  std::vector<casadi_int> iw_tmp(sz_iw());
1750  std::vector<D> w_tmp(sz_w());
1751 
1752  // Get pointers to input arguments
1753  std::vector<const D*> argp(sz_arg());
1754  for (casadi_int i=0; i<n_in_; ++i) argp[i]=get_ptr(arg2[i]);
1755 
1756  // Get pointers to output arguments
1757  std::vector<D*> resp(sz_res());
1758  for (casadi_int i=0; i<n_out_; ++i) resp[i]=get_ptr(res[i]);
1759 
1760  // For all parallel calls
1761  for (casadi_int p=0; p<npar; ++p) {
1762  // Call memory-less
1763  if (eval_gen(get_ptr(argp), get_ptr(resp),
1764  get_ptr(iw_tmp), get_ptr(w_tmp), memory(0),
1765  always_inline, never_inline)) {
1766  if (error_on_fail_) casadi_error("Evaluation failed");
1767  }
1768  // Update offsets
1769  if (p==npar-1) break;
1770  for (casadi_int i=0; i<n_in_; ++i) if (mapped[i]) argp[i] += nnz_in(i);
1771  for (casadi_int i=0; i<n_out_; ++i) resp[i] += nnz_out(i);
1772  }
1773  }
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 3388 of file function_internal.cpp.

3392  {
3393  casadi_assert(!(always_inline && never_inline), "Inconsistent options");
3394  casadi_assert(!always_inline, "Class " + class_name() +
3395  " cannot be inlined in an MX expression");
3396 
3397  // Derivative information must be available
3398  casadi_assert(has_derivative(),
3399  "Derivatives cannot be calculated for " + name_);
3400 
3401  // Number of directional derivatives
3402  casadi_int nadj = aseed.size();
3403  asens.resize(nadj);
3404 
3405  // Quick return if no seeds
3406  if (nadj==0) return;
3407 
3408  // Check if seeds need to have dimensions corrected
3409  casadi_int npar = 1;
3410  for (auto&& r : aseed) {
3411  if (!matching_res(r, npar)) {
3412  FunctionInternal::call_reverse(arg, res, replace_aseed(aseed, npar),
3413  asens, always_inline, never_inline);
3414  return;
3415  }
3416  }
3417 
3418  // Calculating full Jacobian and then multiplying likely cheaper
3419  if (adjViaJac(nadj)) {
3420  // Multiply the transposed Jacobian from the right
3421  std::vector<MX> darg = arg;
3422  darg.insert(darg.end(), res.begin(), res.end());
3423  std::vector<MX> J = jacobian()(darg);
3424  // Join adjoint seeds
3425  std::vector<MX> v(nadj), all_aseed(n_out_);
3426  for (size_t i = 0; i < n_out_; ++i) {
3427  for (size_t d = 0; d < nadj; ++d) v[d] = vec(aseed.at(d).at(i));
3428  all_aseed[i] = horzcat(v);
3429  }
3430  // Calculate adjoint sensitivities
3431  std::vector<MX> all_asens(n_in_);
3432  std::vector<MX>::const_iterator J_it = J.begin();
3433  for (size_t oind = 0; oind < n_out_; ++oind) {
3434  for (size_t iind = 0; iind < n_in_; ++iind) {
3435  // Add contribution
3436  MX a = mtimes((*J_it++).T(), all_aseed[oind]);
3437  all_asens[iind] = all_asens[iind].is_empty(true) ? a : all_asens[iind] + a;
3438  }
3439  }
3440  // Split adjoint sensitivities
3441  for (size_t d = 0; d < nadj; ++d) asens[d].resize(n_in_);
3442  for (size_t i = 0; i < n_in_; ++i) {
3443  v = horzsplit(all_asens[i]);
3444  casadi_assert_dev(v.size() == nadj);
3445  for (size_t d = 0; d < nadj; ++d) {
3446  if (asens[d][i].is_empty(true)) {
3447  asens[d][i] = reshape(v[d], size_in(i));
3448  } else {
3449  asens[d][i] += reshape(v[d], size_in(i));
3450  }
3451  }
3452  }
3453  } else {
3454  // Evaluate in batches
3455  casadi_assert_dev(enable_reverse_);
3456  casadi_int max_nadj = max_num_dir_;
3457 
3458  while (!has_reverse(max_nadj)) max_nadj/=2;
3459  casadi_int offset = 0;
3460  while (offset<nadj) {
3461  // Number of derivatives, in this batch
3462  casadi_int nadj_batch = std::min(nadj-offset, max_nadj);
3463 
3464  // All inputs and seeds
3465  std::vector<MX> darg;
3466  darg.reserve(n_in_ + n_out_ + n_out_);
3467  darg.insert(darg.end(), arg.begin(), arg.end());
3468  darg.insert(darg.end(), res.begin(), res.end());
3469  std::vector<MX> v(nadj_batch);
3470  for (casadi_int i=0; i<n_out_; ++i) {
3471  for (casadi_int d=0; d<nadj_batch; ++d) v[d] = aseed[offset+d][i];
3472  darg.push_back(horzcat(v));
3473  }
3474 
3475  // Create the evaluation node
3476  Function dfcn = self().reverse(nadj_batch);
3477  std::vector<MX> x = dfcn(darg);
3478  casadi_assert_dev(x.size()==n_in_);
3479 
3480  // Retrieve sensitivities
3481  for (casadi_int d=0; d<nadj_batch; ++d) asens[offset+d].resize(n_in_);
3482  for (casadi_int i=0; i<n_in_; ++i) {
3483  if (size2_in(i)>0) {
3484  v = horzsplit(x[i], size2_in(i));
3485  casadi_assert_dev(v.size()==nadj_batch);
3486  } else {
3487  v = std::vector<MX>(nadj_batch, MX(size_in(i)));
3488  }
3489  for (casadi_int d=0; d<nadj_batch; ++d) {
3490  if (asens[offset+d][i].is_empty(true)) {
3491  asens[offset+d][i] = v[d];
3492  } else {
3493  asens[offset+d][i] += v[d];
3494  }
3495  }
3496  }
3497  // Update offset
3498  offset += nadj_batch;
3499  }
3500  }
3501  }
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 3516 of file function_internal.cpp.

3520  {
3521  casadi_assert(!(always_inline && never_inline), "Inconsistent options");
3522  if (aseed.empty()) { // Quick return if no seeds
3523  asens.clear();
3524  return;
3525  }
3526  casadi_error("'reverse' (SX) not defined for " + class_name());
3527  }

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::SXFunction, and casadi::MXFunction.

Definition at line 448 of file function_internal.cpp.

449  {
450  if (option_name == "print_in") {
451  print_in_ = option_value;
452  } else if (option_name == "print_out") {
453  print_out_ = option_value;
454  } else if (option_name == "print_canonical") {
455  print_canonical_ = option_value;
456  } else if (option_name=="ad_weight") {
457  ad_weight_ = option_value;
458  } else if (option_name=="ad_weight_sp") {
459  ad_weight_sp_ = option_value;
460  } else if (option_name=="dump") {
461  dump_ = option_value;
462  } else if (option_name=="dump_in") {
463  dump_in_ = option_value;
464  } else if (option_name=="dump_out") {
465  dump_out_ = option_value;
466  } else if (option_name=="dump_dir") {
467  dump_dir_ = option_value.to_string();
468  } else if (option_name=="dump_format") {
469  dump_format_ = option_value.to_string();
470  } else {
471  // Option not found - continue to base classes
472  ProtoFunction::change_option(option_name, option_value);
473  }
474  }
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(), casadi::MXFunction::change_option(), and casadi::SXFunction::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 1776 of file function_internal.hpp.

1776  {
1777  casadi_assert(arg.size()==n_in_, "Incorrect number of inputs: Expected "
1778  + str(n_in_) + ", got " + str(arg.size()));
1779  for (casadi_int i=0; i<n_in_; ++i) {
1780  if (!check_mat(arg[i].sparsity(), sparsity_in(i), npar)) {
1781  // Dimensions
1782  std::string d_arg = str(arg[i].size1()) + "-by-" + str(arg[i].size2());
1783  std::string d_in = str(size1_in(i)) + "-by-" + str(size2_in(i));
1784  std::string e = "Input " + str(i) + " (" + name_in_[i] + ") has mismatching shape. "
1785  "Got " + d_arg + ". Allowed dimensions, in general, are:\n"
1786  " - The input dimension N-by-M (here " + d_in + ")\n"
1787  " - A scalar, i.e. 1-by-1\n"
1788  " - M-by-N if N=1 or M=1 (i.e. a transposed vector)\n"
1789  " - N-by-M1 if K*M1=M for some K (argument repeated horizontally)\n";
1790  if (npar!=-1) {
1791  e += " - N-by-P*M, indicating evaluation with multiple arguments (P must be a "
1792  "multiple of " + str(npar) + " for consistency with previous inputs)";
1793  }
1794  casadi_error(e);
1795  }
1796  }
1797  }
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.

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

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

◆ check_mat()

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

Helper function

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

Definition at line 3714 of file function_internal.cpp.

3714  {
3715  // Matching dimensions
3716  if (arg.size()==inp.size()) return true;
3717  // Calling with a scalar - set all
3718  if (arg.is_scalar()) return true;
3719  // Vectors that are transposes of each other
3720  if (arg.is_vector() && inp.size()==std::make_pair(arg.size2(), arg.size1())) return true;
3721  // Horizontal repmat
3722  if (arg.size1()==inp.size1() && arg.size2()>0 && inp.size2()>0
3723  && inp.size2()%arg.size2()==0) return true;
3724  // Evaluate with multiple arguments
3725  if (npar!=-1 && arg.size1()==inp.size1() && arg.size2()>0 && inp.size2()>0
3726  && arg.size2()%(npar*inp.size2())==0) {
3727  npar *= arg.size2()/(npar*inp.size2());
3728  return true;
3729  }
3730  // Calling with empty matrix - set all to zero (after the structured branches above,
3731  // so that a 0-by-N argument can still be recognised as a parallel/repmat call)
3732  if (arg.is_empty()) return true;
3733  // No match
3734  return false;
3735  }

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

181 { }

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

1800  {
1801  casadi_assert(res.size()==n_out_, "Incorrect number of outputs: Expected "
1802  + str(n_out_) + ", got " + str(res.size()));
1803  for (casadi_int i=0; i<n_out_; ++i) {
1804  casadi_assert(check_mat(res[i].sparsity(), sparsity_out(i), npar),
1805  "Output " + str(i) + " (" + name_out_[i] + ") has mismatching shape. "
1806  "Expected " + str(size_out(i)) + ", got " + str(res[i].size()));
1807  }
1808  }
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 3923 of file function_internal.cpp.

3923  {
3924 #ifdef CASADI_WITH_THREAD
3925  std::lock_guard<std::mutex> lock(mtx_);
3926 #endif //CASADI_WITH_THREAD
3927  if (unused_.empty()) {
3928  check_mem_count(mem_.size()+1);
3929  // Allocate a new memory object
3930  void* m = alloc_mem();
3931  mem_.push_back(m);
3932  if (init_mem(m)) {
3933  casadi_error("Failed to create or initialize memory object");
3934  }
3935  return static_cast<int>(mem_.size()) - 1;
3936  } else {
3937  // Use an unused memory object
3938  int m = unused_.top();
3939  unused_.pop();
3940  return m;
3941  }
3942  }
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::FunctionInternal::codegen_meta(), casadi::ProtoFunction::finalize(), and casadi::Sqpmethod::init_mem().

◆ class_name()

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

Implements casadi::SharedObjectInternal.

Definition at line 89 of file rosenbrock.hpp.

89 { return "Rosenbrock";}

◆ clear_mem()

void casadi::ProtoFunction::clear_mem ( )
inherited

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

Definition at line 3811 of file function_internal.cpp.

3811  {
3812  for (auto&& i : mem_) {
3813  if (i!=nullptr) free_mem(i);
3814  }
3815  mem_.clear();
3816  }
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::ConoptInterface::~ConoptInterface(), casadi::CplexInterface::~CplexInterface(), casadi::CsparseInterface::~CsparseInterface(), casadi::CvodesInterface::~CvodesInterface(), casadi::DaqpInterface::~DaqpInterface(), casadi::Erk::~Erk(), 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::MadmpecInterface::~MadmpecInterface(), casadi::MadnlpInterface::~MadnlpInterface(), casadi::Map::~Map(), casadi::MapSum::~MapSum(), casadi::MosekInterface::~MosekInterface(), casadi::MumpsInterface::~MumpsInterface(), casadi::MXFunction::~MXFunction(), casadi::Newton::~Newton(), casadi::Nlpsol::~Nlpsol(), casadi::OmpMap::~OmpMap(), casadi::OnnxFunction::~OnnxFunction(), casadi::OnnxRuntimeInterface::~OnnxRuntimeInterface(), casadi::OoqpInterface::~OoqpInterface(), casadi::OsqpInterface::~OsqpInterface(), casadi::PiqpInterface::~PiqpInterface(), casadi::ProxqpInterface::~ProxqpInterface(), casadi::QpoasesInterface::~QpoasesInterface(), casadi::QpToNlp::~QpToNlp(), casadi::Qrqp::~Qrqp(), casadi::Qrsqp::~Qrsqp(), ~Rosenbrock(), 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(), casadi::UnoInterface::~UnoInterface(), casadi::WorhpInterface::~WorhpInterface(), and casadi::XpressInterface::~XpressInterface().

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

2517  {
2518  // Define function
2519  g << "/* " << definition() << " */\n";
2520  g << "static " << signature(fname) << " {\n";
2521 
2522  // Reset local variables, flush buffer
2523  g.flush(g.body);
2524 
2525  g.scope_enter();
2526 
2527  if (dump_in_ || dump_out_) {
2528  Function F = shared_from_this<Function>();
2529  std::string cg_name = codegen_name(g, false);
2530  std::string dump_counter = g.shorthand(cg_name + "_dump_counter");
2531  g.auxiliaries << "static int " << dump_counter << " = 0;\n";
2532  if (g.thread_safe()) {
2533  g.define_local_mutex(F, cg_name + "_dump_mutex");
2534  std::string dump_mutex = g.local_mutex(F, cg_name + "_dump_mutex");
2535  g << "CASADI_MUTEX_LOCK(&" << dump_mutex << ");\n";
2536  g << "int dump_id_local = " << dump_counter << "++;\n";
2537  g << "CASADI_MUTEX_UNLOCK(&" << dump_mutex << ");\n";
2538  } else {
2539  g << "int dump_id_local = " << dump_counter << "++;\n";
2540  }
2541  }
2542 
2543  if (dump_in_) g.generate_dump(shared_from_this<Function>(), "arg", true);
2544  if (print_in_) g.generate_print(shared_from_this<Function>(), "arg", true);
2545 
2546  // Generate function body (to buffer)
2547  codegen_body(g);
2548 
2549  if (dump_out_) g.generate_dump(shared_from_this<Function>(), "res", false);
2550  if (print_out_) g.generate_print(shared_from_this<Function>(), "res", false);
2551 
2552  g.scope_exit();
2553 
2554  // Finalize the function
2555  g << "return 0;\n";
2556  g << "}\n\n";
2557 
2558  // Flush to function body
2559  g.flush(g.body);
2560  }
std::string definition() const
Get function signature: name:(inputs)->(outputs)
virtual std::string codegen_name(const CodeGenerator &g, bool ns=true) const
Get name in codegen.
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::auxiliaries, casadi::CodeGenerator::body, casadi::FunctionInternal::codegen_body(), casadi::FunctionInternal::codegen_name(), casadi::CodeGenerator::define_local_mutex(), casadi::FunctionInternal::definition(), casadi::FunctionInternal::dump_in_, casadi::FunctionInternal::dump_out_, casadi::CodeGenerator::flush(), casadi::CodeGenerator::generate_dump(), casadi::CodeGenerator::generate_print(), casadi::CodeGenerator::local_mutex(), casadi::FunctionInternal::print_in_, casadi::FunctionInternal::print_out_, casadi::CodeGenerator::scope_enter(), casadi::CodeGenerator::scope_exit(), casadi::CodeGenerator::shorthand(), casadi::FunctionInternal::signature(), and casadi::CodeGenerator::thread_safe().

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

2661  {
2662  bool needs_mem = codegen_needs_mem();
2663  if (needs_mem) {
2664  std::string name = codegen_name(g, false);
2665  std::string mem_counter = g.shorthand(name + "_mem_counter");
2666  g << "return " + mem_counter + "++;\n";
2667  }
2668  }
virtual bool codegen_needs_mem() const
Is thread-local memory object needed?

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

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

◆ codegen_body()

void casadi::RuntimeIntegrator::codegen_body ( CodeGenerator &  g) const
overridevirtualinherited

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

Reimplemented from casadi::FunctionInternal.

Definition at line 858 of file runtime_integrator.cpp.

858  {
859  casadi_assert(has_codegen(), name_ + ": adjoint sensitivities with adaptive steps need "
860  "max_tape_steps for code generation");
861  g.add_auxiliary(CodeGenerator::AUX_IVP);
862  if (step_size_ == 0) g.add_auxiliary(CodeGenerator::AUX_IVP_ADAPT);
863  if (ne_ > 0) g.add_auxiliary(CodeGenerator::AUX_IVP_EVENT);
864  const std::string nl = ";\n", method = plugin_name();
865  g.local("p", "struct casadi_ivp_prob");
866  g.local("d", "struct casadi_ivp_data");
867  g.local("pe", "struct casadi_" + method + "_prob");
868  g.local("e", "struct casadi_" + method + "_data");
869  if (replay_) {
870  g.local("pn", "struct casadi_ivp_prob");
871  g.local("dn", "struct casadi_ivp_data");
872  g.local("pen", "struct casadi_" + method + "_prob");
873  g.local("en", "struct casadi_" + method + "_data");
874  }
875  g.local("sarg", "const casadi_real", "**");
876  g.local("sres", "casadi_real", "**");
877  g.local("pv", "casadi_real", "*");
878  if (nu_ > 0) g.local("uv", "casadi_real", "*");
879  g.local("j", "casadi_int");
880  g.local("k", "casadi_int");
881 
882  g.comment("Problem structure");
883  codegen_ivp_prob(g, "p", p_.tape_size);
884  if (replay_) {
885  g.comment("Nominal integration, whose steps are replayed");
886  root()->codegen_ivp_prob(g, "pn", 0);
887  }
888 
889  g.comment("Work vectors");
890  g << "sarg = arg + " << INTEGRATOR_NUM_IN << "; sres = res + " << INTEGRATOR_NUM_OUT << nl;
891  g << "pv = w; w += " << np_ << nl;
892  if (nu_ > 0) g << "uv = w; w += " << nu_ << nl;
893  g << "d.prob = &p" << nl;
894  g << "casadi_ivp_set_work(&d, &arg, &res, &iw, &w)" << nl;
895  if (replay_) {
896  g << "dn.prob = &pn" << nl;
897  g << "casadi_ivp_set_work(&dn, &arg, &res, &iw, &w)" << nl;
898  g << "d.nom = &dn" << nl;
899  }
900  g.comment("Method");
901  codegen_method(g);
902 
903  g.comment("Initial state, parameters");
904  g << g.copy("arg[" + str(INTEGRATOR_X0) + "]", nx_, "d.y") << "\n";
905  g << g.copy("arg[" + str(INTEGRATOR_Z0) + "]", nz_, "d.y+" + str(nx_)) << "\n";
906  g << g.clear("d.y+" + str(nx_ + nz_), nq_) << "\n";
907  g << g.copy("arg[" + str(INTEGRATOR_P) + "]", np_, "pv") << "\n";
908 
909  g.comment("Forward integration: a run of steps per control group, as RuntimeIntegrator::eval");
910  std::string tout = g.constant(tout_), gs = g.constant(group_start_), t0 = g.constant(t0_);
911  g << "for (j = 0; j < " << ngroup() << "; ++j) {\n";
912  if (nu_ > 0) {
913  g << g.copy("arg[" + str(INTEGRATOR_U) + "] ? arg[" + str(INTEGRATOR_U) + "] + j*"
914  + str(nu_) + " : 0", nu_, "uv") << "\n";
915  }
916  g << "casadi_ivp_reset(&d, j ? " << tout << "[" << gs << "[j]-1] : " << t0 << ", "
917  << (nu_ > 0 ? "uv" : "0") << ", j == 0)" << nl;
918  g << "for (k = " << gs << "[j]; k < " << gs << "[j+1]; ++k) {\n";
919  g << "casadi_ivp_advance(&d, " << tout << "[k], " << tout << "[" << gs << "[j+1]-1], "
920  << (nrx_ > 0 ? 1 : 0) << ")" << nl;
921  codegen_loop(g);
922  g << "if (d.status != IVP_SUCCESS) return 1" << nl;
923  g << "if (res[" << INTEGRATOR_XF << "]) " << g.copy("d.y_out", nx_, "res["
924  + str(INTEGRATOR_XF) + "] + k*" + str(nx_)) << "\n";
925  g << "if (res[" << INTEGRATOR_ZF << "]) " << g.copy("d.y_out+" + str(nx_), nz_, "res["
926  + str(INTEGRATOR_ZF) + "] + k*" + str(nz_)) << "\n";
927  g << "if (res[" << INTEGRATOR_QF << "]) " << g.copy("d.y_out+" + str(nx_ + nz_), nq_,
928  "res[" + str(INTEGRATOR_QF) + "] + k*" + str(nq_)) << "\n";
929  g << "}\n}\n";
930 
931  if (nrx_ > 0) {
932  g.comment("Discrete adjoint, output interval by output interval");
933  g << "casadi_ivp_reset_backward(&d)" << nl;
934  g << "for (j = " << ngroup() - 1 << "; j >= 0; --j) {\n";
935  g.comment("Control adjoints of this group only");
936  g << g.clear("d.adj_u", nuq_) << "\n";
937  g << "for (k = " << gs << "[j+1]-1; k >= " << gs << "[j]; --k) {\n";
938  g.comment("Impulse from the adjoint seeds at output time k");
939  const casadi_int adj_in[3] = {INTEGRATOR_ADJ_XF, INTEGRATOR_ADJ_ZF, INTEGRATOR_ADJ_QF};
940  const casadi_int adj_n[3] = {nrx_, nrz_, nrp_};
941  const casadi_int adj_off[3] = {0, nrx_, nrx_ + nrz_};
942  for (casadi_int i = 0; i < 3; ++i) {
943  if (adj_n[i] == 0) continue;
944  g << g.copy("arg[" + str(adj_in[i]) + "] ? arg[" + str(adj_in[i]) + "] + k*"
945  + str(adj_n[i]) + " : 0", adj_n[i], "d.seed+" + str(adj_off[i])) << "\n";
946  }
947  g << "casadi_ivp_impulse(&d, " << tout << "[k])" << nl;
948  codegen_loop(g);
949  g << "if (d.status != IVP_SUCCESS) return 1" << nl;
950  g << "casadi_ivp_retreat(&d, " << tout << "[k], k > 0 ? " << tout << "[k-1] : " << t0
951  << ")" << nl;
952  codegen_loop(g);
953  g << "if (d.status != IVP_SUCCESS) return 1" << nl;
954  g << "}\n";
955  g << "if (res[" << INTEGRATOR_ADJ_U << "]) " << g.copy("d.adj_u", nuq_, "res["
956  + str(INTEGRATOR_ADJ_U) + "] + j*" + str(nuq_)) << "\n";
957  g << "}\n";
958  g << "if (res[" << INTEGRATOR_ADJ_X0 << "]) " << g.copy("d.ry", nrx_, "res["
959  + str(INTEGRATOR_ADJ_X0) + "]") << "\n";
960  g << "if (res[" << INTEGRATOR_ADJ_P << "]) " << g.copy("d.adj_p", nrq_, "res["
961  + str(INTEGRATOR_ADJ_P) + "]") << "\n";
962  }
963 }
std::vector< double > tout_
Output time grid.
double t0_
Initial time.
virtual const char * plugin_name() const=0
bool has_codegen() const override
Code generation.
std::vector< casadi_int > group_start_
virtual void codegen_method(CodeGenerator &g) const =0
Generate code for the problem and data of the method, variables pe and e.
const RuntimeIntegrator * root() const
Integrator at the start of the chain of derivatives.
casadi_int ngroup() const
Number of control groups, columns of the controls.
@ INTEGRATOR_NUM_OUT
Number of output arguments of an integrator.
Definition: integrator.hpp:980
@ INTEGRATOR_NUM_IN
Number of input arguments of an integrator.
Definition: integrator.hpp:960
casadi_int tape_size
Definition: casadi_ivp.hpp:125

References casadi::CodeGenerator::add_auxiliary(), casadi::CodeGenerator::clear(), casadi::CodeGenerator::comment(), casadi::CodeGenerator::constant(), casadi::CodeGenerator::copy(), casadi::INTEGRATOR_ADJ_P, casadi::INTEGRATOR_ADJ_QF, casadi::INTEGRATOR_ADJ_U, casadi::INTEGRATOR_ADJ_X0, casadi::INTEGRATOR_ADJ_XF, casadi::INTEGRATOR_ADJ_ZF, casadi::INTEGRATOR_NUM_IN, casadi::INTEGRATOR_NUM_OUT, casadi::INTEGRATOR_P, casadi::INTEGRATOR_QF, casadi::INTEGRATOR_U, casadi::INTEGRATOR_X0, casadi::INTEGRATOR_XF, casadi::INTEGRATOR_Z0, casadi::INTEGRATOR_ZF, casadi::CodeGenerator::local(), and casadi::str().

◆ codegen_body_enter()

void casadi::OracleFunction::codegen_body_enter ( CodeGenerator &  g) const
virtualinherited

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

Reimplemented in casadi::Nlpsol.

Definition at line 296 of file oracle_function.cpp.

296  {
297  g.local("d_oracle", "struct casadi_oracle_data");
298  }

References casadi::CodeGenerator::local().

Referenced by casadi::Nlpsol::codegen_body_enter().

◆ codegen_body_exit()

void casadi::OracleFunction::codegen_body_exit ( CodeGenerator &  g) const
virtualinherited

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

Reimplemented in casadi::Nlpsol.

Definition at line 300 of file oracle_function.cpp.

300  {
301  }

Referenced by casadi::Nlpsol::codegen_body_exit().

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

2670  {
2671  std::string name = codegen_name(g, false);
2672  std::string stack_counter = g.shorthand(name + "_unused_stack_counter");
2673  std::string stack = g.shorthand(name + "_unused_stack");
2674  std::string mem_counter = g.shorthand(name + "_mem_counter");
2675  std::string mem_array = g.shorthand(name + "_mem");
2676  std::string alloc_mem = g.shorthand(name + "_alloc_mem");
2677  std::string init_mem = g.shorthand(name + "_init_mem");
2678 
2679 
2680  g.auxiliaries << "static int " << mem_counter << " = 0;\n";
2681  g.auxiliaries << "static int " << stack_counter << " = -1;\n";
2682  g.auxiliaries << "static int " << stack << "[CASADI_MAX_NUM_THREADS];\n";
2683  g.auxiliaries << "static " << codegen_mem_type() <<
2684  " " << mem_array << "[CASADI_MAX_NUM_THREADS];\n\n";
2685 
2686  if (g.thread_safe()) {
2687  Function F = shared_from_this<Function>();
2688  g.define_local_mutex(F, name + "_mem_mutex");
2689  std::string mem_mutex = g.local_mutex(F, name + "_mem_mutex");
2690  g << "CASADI_MUTEX_LOCK(&" << mem_mutex << ");\n";
2691  g.scope_add_cleanup("CASADI_MUTEX_UNLOCK(&" + mem_mutex + ");\n");
2692  }
2693 
2694  g.local("mid", "int");
2695 
2696  g << "if (" << stack_counter << ">=0) {\n";
2697  g.scope_return(stack + "[" + stack_counter + "--]");
2698  g << "} else {\n";
2699  g << "if (" << mem_counter << "==CASADI_MAX_NUM_THREADS) {\n";
2700  g.scope_return("-1");
2701  g << "}\n";
2702  g << "mid = " << alloc_mem << "();\n";
2703  g << "if (mid<0) {\n";
2704  g.scope_return("-1");
2705  g << "}\n";
2706  g << "if (" << init_mem << "(mid)) {\n";
2707  g.scope_return("-1");
2708  g << "}\n";
2709  g.scope_return("mid");
2710  g << "}\n";
2711  }
virtual std::string codegen_mem_type() const
Thread-local memory object type.
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::CodeGenerator::define_local_mutex(), casadi::ProtoFunction::init_mem(), casadi::CodeGenerator::local(), casadi::CodeGenerator::local_mutex(), casadi::CodeGenerator::scope_add_cleanup(), casadi::CodeGenerator::scope_return(), casadi::CodeGenerator::shorthand(), and casadi::CodeGenerator::thread_safe().

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

◆ codegen_declarations()

void casadi::RuntimeIntegrator::codegen_declarations ( CodeGenerator &  g) const
overridevirtualinherited

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

Reimplemented from casadi::FunctionInternal.

Definition at line 849 of file runtime_integrator.cpp.

849  {
850  // The functions of the task tables
851  for (auto* calls : {&calls_, &calls_nom_}) {
852  for (auto&& task : *calls) {
853  for (auto&& c : task) g.add_dependency(get_function(c.fname));
854  }
855  }
856 }

References casadi::CodeGenerator::add_dependency().

◆ codegen_decref()

void casadi::FunctionInternal::codegen_decref ( CodeGenerator &  g) const
virtualinherited

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

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

Definition at line 2616 of file function_internal.cpp.

2616  {
2617 
2618  // Treat dependent functions
2619  std::set<void*> added;
2620  Function F = shared_from_this<Function>();
2621  for (const Function& f : F.find_functions(0)) {
2622  if (f->has_refcount_in_deps_) {
2623  std::string cg_name = f->codegen_name(g, false);
2624  auto i = added.insert(f.get());
2625  if (i.second) { // prevent duplicate calls
2626  std::string decref = g.shorthand(cg_name + "_decref");
2627  g << decref << "();\n";
2628  }
2629  }
2630  }
2631 
2632  if (has_refcount_) {
2633  std::string name = codegen_name(g, false);
2634  std::string ref_counter = g.shorthand(name + "_ref_counter");
2635  std::string mem_counter = g.shorthand(name + "_mem_counter");
2636  std::string free_mem = g.shorthand(name + "_free_mem");
2637  g << ref_counter << "--;\n";
2638  g << "if (" << ref_counter << "==0) {\n";
2639  if (codegen_needs_mem()) {
2640  g << "while (" << mem_counter << ">0) {\n";
2641  g << free_mem << "(--" << mem_counter << ");\n";
2642  g << "}\n";
2643  }
2644  if (g.thread_safe()) {
2645  Function F = shared_from_this<Function>();
2646  for (const auto& m : g.local_mutexes(F)) {
2647  std::string mtx = g.local_mutex(F, m);
2648  g << "#if CASADI_MUTEX_USE_STATIC_INIT == 0\n";
2649  g << "CASADI_MUTEX_DESTROY(&" << mtx << ");\n";
2650  g << "#endif\n";
2651  }
2652  }
2653  g << "}\n";
2654  }
2655  }
bool has_refcount_
Reference counting in codegen?
void free_mem(void *mem) const override
Free memory block.

References casadi::FunctionInternal::codegen_name(), casadi::FunctionInternal::codegen_needs_mem(), casadi::Function::find_functions(), casadi::FunctionInternal::free_mem(), casadi::FunctionInternal::has_refcount_, casadi::CodeGenerator::local_mutex(), casadi::CodeGenerator::local_mutexes(), casadi::CodeGenerator::shorthand(), and casadi::CodeGenerator::thread_safe().

Referenced by casadi::CodeGenerator::add_dependency(), and casadi::MXFunction::codegen_decref().

◆ codegen_free_mem()

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

◆ codegen_incref()

void casadi::FunctionInternal::codegen_incref ( CodeGenerator &  g) const
virtualinherited

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

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

Definition at line 2583 of file function_internal.cpp.

2583  {
2584  if (has_refcount_) {
2585  std::string name = codegen_name(g, false);
2586  std::string ref_counter = g.shorthand(name + "_ref_counter");
2587  g.auxiliaries << "static int " << ref_counter << " = 0;\n";
2588 
2589  Function F = shared_from_this<Function>();
2590  if (g.thread_safe()) {
2591  for (const auto& m : g.local_mutexes(F)) {
2592  std::string mtx = g.local_mutex(F, m);
2593  g << "#if CASADI_MUTEX_USE_STATIC_INIT == 0\n";
2594  g << "if (" << ref_counter << "==0) CASADI_MUTEX_INIT(&" << mtx << ");\n";
2595  g << "#endif\n";
2596  }
2597  }
2598  g << ref_counter << "++;\n";
2599  }
2600 
2601  // Treat dependent functions
2602  std::set<void*> added;
2603  Function F = shared_from_this<Function>();
2604  for (const Function& f : F.find_functions(0)) {
2605  if (f->has_refcount_in_deps_) {
2606  std::string cg_name = f->codegen_name(g, false);
2607  auto i = added.insert(f.get());
2608  if (i.second) { // prevent duplicate calls
2609  std::string incref = g.shorthand(cg_name + "_incref");
2610  g << incref << "();\n";
2611  }
2612  }
2613  }
2614  }

References casadi::CodeGenerator::auxiliaries, casadi::FunctionInternal::codegen_name(), casadi::Function::find_functions(), casadi::FunctionInternal::has_refcount_, casadi::CodeGenerator::local_mutex(), casadi::CodeGenerator::local_mutexes(), casadi::CodeGenerator::shorthand(), and casadi::CodeGenerator::thread_safe().

Referenced by casadi::CodeGenerator::add_dependency(), and casadi::MXFunction::codegen_incref().

◆ 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

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

Definition at line 3058 of file function_internal.cpp.

3058  {
3059  std::string name = codegen_name(g, false);
3060  std::string mem_array = g.shorthand(name + "_mem");
3061  return mem_array+"[" + index + "]";
3062  }

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

Referenced by casadi::MadmpecInterface::codegen_body(), casadi::ClarabelInterface::codegen_body(), casadi::DaqpInterface::codegen_body(), casadi::FatropInterface::codegen_body(), casadi::HighsInterface::codegen_body(), casadi::IpoptInterface::codegen_body(), casadi::MadnlpInterface::codegen_body(), casadi::MosekInterface::codegen_body(), casadi::OsqpInterface::codegen_body(), casadi::UnoInterface::codegen_body(), casadi::XpressInterface::codegen_body(), casadi::Sqpmethod::codegen_body(), casadi::MadmpecInterface::codegen_free_mem(), casadi::ClarabelInterface::codegen_free_mem(), casadi::DaqpInterface::codegen_free_mem(), casadi::FatropInterface::codegen_free_mem(), casadi::HighsInterface::codegen_free_mem(), casadi::IpoptInterface::codegen_free_mem(), casadi::MadnlpInterface::codegen_free_mem(), casadi::MosekInterface::codegen_free_mem(), casadi::OsqpInterface::codegen_free_mem(), casadi::UnoInterface::codegen_free_mem(), casadi::XpressInterface::codegen_free_mem(), casadi::MadmpecInterface::codegen_init_mem(), casadi::ClarabelInterface::codegen_init_mem(), casadi::DaqpInterface::codegen_init_mem(), casadi::FatropInterface::codegen_init_mem(), casadi::HighsInterface::codegen_init_mem(), casadi::IpoptInterface::codegen_init_mem(), casadi::MadnlpInterface::codegen_init_mem(), casadi::MosekInterface::codegen_init_mem(), casadi::OsqpInterface::codegen_init_mem(), casadi::UnoInterface::codegen_init_mem(), casadi::XpressInterface::codegen_init_mem(), and casadi::MadmpecInterface::codegen_options().

◆ codegen_mem_is_opaque()

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

without a need for alloc_mem, init_mem, free_mem?

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

Reimplemented in casadi::External.

Definition at line 935 of file function_internal.hpp.

935 { return false; }

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

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

2733  {
2734  bool needs_mem = codegen_needs_mem();
2735  std::string name = codegen_name(g, false);
2736 
2737  // Checkout/release routines
2738  g << g.declare("int " + name_ + "_checkout(void)") << " {\n";
2739  if (needs_mem) {
2740  std::string checkout = g.shorthand(name + "_checkout");
2741  g << "return " << checkout << "();\n";
2742  } else {
2743  g << "return 0;\n";
2744  }
2745  g << "}\n\n";
2746 
2747  if (needs_mem) {
2748  g << g.declare("void " + name_ + "_release(int mem)") << " {\n";
2749  std::string release = g.shorthand(name + "_release");
2750  g << release << "(mem);\n";
2751  } else {
2752  g << g.declare("void " + name_ + "_release(int mem)") << " {\n";
2753  }
2754  g << "}\n\n";
2755 
2756  // Reference counter routines
2757  g << g.declare("void " + name_ + "_incref(void)") << " {\n";
2758  if (has_refcount_in_deps_) {
2759  std::string incref = g.shorthand(name + "_incref");
2760  g << incref << "();\n";
2761  }
2762  g << "}\n\n"
2763  << g.declare("void " + name_ + "_decref(void)") << " {\n";
2764  if (has_refcount_in_deps_) {
2765  std::string decref = g.shorthand(name + "_decref");
2766  g << decref << "();\n";
2767  }
2768  g << "}\n\n";
2769 
2770  // Number of inputs and outptus
2771  g << g.declare("casadi_int " + name_ + "_n_in(void)")
2772  << " { return " << n_in_ << ";}\n\n"
2773  << g.declare("casadi_int " + name_ + "_n_out(void)")
2774  << " { return " << n_out_ << ";}\n\n";
2775 
2776  // Default inputs
2777  g << g.declare("casadi_real " + name_ + "_default_in(casadi_int i)") << " {\n"
2778  << "switch (i) {\n";
2779  for (casadi_int i=0; i<n_in_; ++i) {
2780  double def = get_default_in(i);
2781  if (def!=0) g << "case " << i << ": return " << g.constant(def) << ";\n";
2782  }
2783  g << "default: return 0;\n}\n"
2784  << "}\n\n";
2785 
2786  // Input names
2787  g << g.declare("const char* " + name_ + "_name_in(casadi_int i)") << " {\n"
2788  << "switch (i) {\n";
2789  for (casadi_int i=0; i<n_in_; ++i) {
2790  g << "case " << i << ": return \"" << name_in_[i] << "\";\n";
2791  }
2792  g << "default: return 0;\n}\n"
2793  << "}\n\n";
2794 
2795  // Output names
2796  g << g.declare("const char* " + name_ + "_name_out(casadi_int i)") << " {\n"
2797  << "switch (i) {\n";
2798  for (casadi_int i=0; i<n_out_; ++i) {
2799  g << "case " << i << ": return \"" << name_out_[i] << "\";\n";
2800  }
2801  g << "default: return 0;\n}\n"
2802  << "}\n\n";
2803 
2804  // Codegen sparsities
2805  codegen_sparsities(g);
2806 
2807  // Function that returns work vector lengths
2808  g << g.declare(
2809  "int " + name_ + "_work(casadi_int *sz_arg, casadi_int* sz_res, "
2810  "casadi_int *sz_iw, casadi_int *sz_w)")
2811  << " {\n"
2812  << "if (sz_arg) *sz_arg = " << codegen_sz_arg(g) << ";\n"
2813  << "if (sz_res) *sz_res = " << codegen_sz_res(g) << ";\n"
2814  << "if (sz_iw) *sz_iw = " << codegen_sz_iw(g) << ";\n"
2815  << "if (sz_w) *sz_w = " << codegen_sz_w(g) << ";\n"
2816  << "return 0;\n"
2817  << "}\n\n";
2818 
2819  // Function that returns work vector lengths in bytes
2820  g << g.declare(
2821  "int " + name_ + "_work_bytes(casadi_int *sz_arg, casadi_int* sz_res, "
2822  "casadi_int *sz_iw, casadi_int *sz_w)")
2823  << " {\n"
2824  << "if (sz_arg) *sz_arg = " << codegen_sz_arg(g) << "*sizeof(const casadi_real*);\n"
2825  << "if (sz_res) *sz_res = " << codegen_sz_res(g) << "*sizeof(casadi_real*);\n"
2826  << "if (sz_iw) *sz_iw = " << codegen_sz_iw(g) << "*sizeof(casadi_int);\n"
2827  << "if (sz_w) *sz_w = " << codegen_sz_w(g) << "*sizeof(casadi_real);\n"
2828  << "return 0;\n"
2829  << "}\n\n";
2830 
2831  // Also add to header file to allow getting
2832  if (g.with_header) {
2833  g.header
2834  << "#define " << name_ << "_SZ_ARG " << codegen_sz_arg(g) << "\n"
2835  << "#define " << name_ << "_SZ_RES " << codegen_sz_res(g) << "\n"
2836  << "#define " << name_ << "_SZ_IW " << codegen_sz_iw(g) << "\n"
2837  << "#define " << name_ << "_SZ_W " << codegen_sz_w(g) << "\n";
2838  }
2839 
2840  // Which inputs are differentiable
2841  if (!all(is_diff_in_)) {
2842  g << g.declare("int " + name_ + "_diff_in(casadi_int i)") << " {\n"
2843  << "switch (i) {\n";
2844  for (casadi_int i=0; i<n_in_; ++i) {
2845  g << "case " << i << ": return " << is_diff_in_[i] << ";\n";
2846  }
2847  g << "default: return -1;\n}\n"
2848  << "}\n\n";
2849  }
2850 
2851  // Which outputs are differentiable
2852  if (!all(is_diff_out_)) {
2853  g << g.declare("int " + name_ + "_diff_out(casadi_int i)") << " {\n"
2854  << "switch (i) {\n";
2855  for (casadi_int i=0; i<n_out_; ++i) {
2856  g << "case " << i << ": return " << is_diff_out_[i] << ";\n";
2857  }
2858  g << "default: return -1;\n}\n"
2859  << "}\n\n";
2860  }
2861 
2862  // Generate mex gateway for the function
2863  if (g.mex) {
2864  // Begin conditional compilation
2865  g << "#ifdef MATLAB_MEX_FILE\n";
2866 
2867  // Declare wrapper
2868  g << "void mex_" << name_
2869  << "(int resc, mxArray *resv[], int argc, const mxArray *argv[]) {\n"
2870  << "casadi_int i;\n";
2871  g << "int mem;\n";
2872  // Work vectors, including input and output buffers
2873  casadi_int i_nnz = nnz_in(), o_nnz = nnz_out();
2874  size_t sz_w = this->sz_w();
2875  for (casadi_int i=0; i<n_in_; ++i) {
2876  const Sparsity& s = sparsity_in_[i];
2877  sz_w = std::max(sz_w, static_cast<size_t>(s.size1())); // To be able to copy a column
2878  sz_w = std::max(sz_w, static_cast<size_t>(s.size2())); // To be able to copy a row
2879  }
2880  sz_w += i_nnz + o_nnz;
2881  g << CodeGenerator::array("casadi_real", "w", sz_w);
2882  g << CodeGenerator::array("casadi_int", "iw", sz_iw());
2883  std::string fw = "w+" + str(i_nnz + o_nnz);
2884 
2885  // Copy inputs to buffers
2886  casadi_int offset=0;
2887  g << CodeGenerator::array("const casadi_real*", "arg", sz_arg(), "{0}");
2888 
2889  // Allocate output buffers
2890  g << "casadi_real* res[" << sz_res() << "] = {0};\n";
2891 
2892  // Check arguments
2893  g << "if (argc>" << n_in_ << ") mexErrMsgIdAndTxt(\"Casadi:RuntimeError\","
2894  << "\"Evaluation of \\\"" << name_ << "\\\" failed. Too many input arguments "
2895  << "(%d, max " << n_in_ << ")\", argc);\n";
2896 
2897  g << "if (resc>" << n_out_ << ") mexErrMsgIdAndTxt(\"Casadi:RuntimeError\","
2898  << "\"Evaluation of \\\"" << name_ << "\\\" failed. "
2899  << "Too many output arguments (%d, max " << n_out_ << ")\", resc);\n";
2900 
2901  for (casadi_int i=0; i<n_in_; ++i) {
2902  std::string p = "argv[" + str(i) + "]";
2903  g << "if (--argc>=0) arg[" << i << "] = "
2904  << g.from_mex(p, "w", offset, sparsity_in_[i], fw) << "\n";
2905  offset += nnz_in(i);
2906  }
2907 
2908  for (casadi_int i=0; i<n_out_; ++i) {
2909  if (i==0) {
2910  // if i==0, always store output (possibly ans output)
2911  g << "--resc;\n";
2912  } else {
2913  // Store output, if it exists
2914  g << "if (--resc>=0) ";
2915  }
2916  // Create and get pointer
2917  g << g.res(i) << " = w+" << str(offset) << ";\n";
2918  offset += nnz_out(i);
2919  }
2920  g << name_ << "_incref();\n";
2921  g << "mem = " << name_ << "_checkout();\n";
2922 
2923  // Call the function
2924  g << "i = " << name_ << "(arg, res, iw, " << fw << ", mem);\n"
2925  << "if (i) mexErrMsgIdAndTxt(\"Casadi:RuntimeError\",\"Evaluation of \\\"" << name_
2926  << "\\\" failed.\");\n";
2927  g << name_ << "_release(mem);\n";
2928  g << name_ << "_decref();\n";
2929 
2930  // Save results
2931  for (casadi_int i=0; i<n_out_; ++i) {
2932  g << "if (" << g.res(i) << ") resv[" << i << "] = "
2933  << g.to_mex(sparsity_out_[i], g.res(i)) << "\n";
2934  }
2935 
2936  // End conditional compilation and function
2937  g << "}\n"
2938  << "#endif\n\n";
2939  }
2940 
2941  if (g.main) {
2942  // Declare wrapper
2943  g << "casadi_int main_" << name_ << "(casadi_int argc, char* argv[]) {\n";
2944 
2945  g << "casadi_int j;\n";
2946  g << "casadi_real* a;\n";
2947  g << "const casadi_real* r;\n";
2948  g << "casadi_int flag;\n";
2949  if (needs_mem) g << "int mem;\n";
2950 
2951 
2952 
2953  // Work vectors and input and output buffers
2954  size_t nr = sz_w() + nnz_in() + nnz_out();
2955  g << CodeGenerator::array("casadi_int", "iw", sz_iw())
2956  << CodeGenerator::array("casadi_real", "w", nr);
2957 
2958  // Input buffers
2959  g << "const casadi_real* arg[" << sz_arg() << "];\n";
2960 
2961  // Output buffers
2962  g << "casadi_real* res[" << sz_res() << "];\n";
2963 
2964  casadi_int off=0;
2965  for (casadi_int i=0; i<n_in_; ++i) {
2966  g << "arg[" << i << "] = w+" << off << ";\n";
2967  off += nnz_in(i);
2968  }
2969  for (casadi_int i=0; i<n_out_; ++i) {
2970  g << "res[" << i << "] = w+" << off << ";\n";
2971  off += nnz_out(i);
2972  }
2973 
2974  // TODO(@jaeandersson): Read inputs from file. For now; read from stdin
2975  g << "a = w;\n"
2976  << "for (j=0; j<" << nnz_in() << "; ++j) "
2977  << "if (scanf(\"%lg\", a++)<=0) return 2;\n";
2978 
2979  if (has_refcount_in_deps_) {
2980  g << name_ << "_incref();\n";
2981  }
2982 
2983  if (needs_mem) {
2984  g << "mem = " << name_ << "_checkout();\n";
2985  }
2986 
2987  // Call the function
2988  g << "flag = " << name_ << "(arg, res, iw, w+" << off << ", ";
2989  if (needs_mem) {
2990  g << "mem";
2991  } else {
2992  g << "0";
2993  }
2994  g << ");\n";
2995  if (needs_mem) {
2996  g << name_ << "_release(mem);\n";
2997  }
2998 
2999  if (has_refcount_in_deps_) {
3000  g << name_ << "_decref();\n";
3001  }
3002 
3003  g << "if (flag) return flag;\n";
3004 
3005  // TODO(@jaeandersson): Write outputs to file. For now: print to stdout
3006  g << "r = w+" << nnz_in() << ";\n"
3007  << "for (j=0; j<" << nnz_out() << "; ++j) "
3008  << g.printf("%.16e ", "*r++") << "\n";
3009 
3010  // End with newline
3011  g << g.printf("\\n") << "\n";
3012 
3013  // Finalize function
3014  g << "return 0;\n"
3015  << "}\n\n";
3016  }
3017 
3018  if (g.with_mem) {
3019  // Allocate memory
3020  g << g.declare("casadi_functions* " + name_ + "_functions(void)") << " {\n"
3021  << "static casadi_functions fun = {\n"
3022  << name_ << "_incref,\n"
3023  << name_ << "_decref,\n"
3024  << name_ << "_checkout,\n"
3025  << name_ << "_release,\n"
3026  << name_ << "_default_in,\n"
3027  << name_ << "_n_in,\n"
3028  << name_ << "_n_out,\n"
3029  << name_ << "_name_in,\n"
3030  << name_ << "_name_out,\n"
3031  << name_ << "_sparsity_in,\n"
3032  << name_ << "_sparsity_out,\n"
3033  << name_ << "_work,\n"
3034  << name_ << "\n"
3035  << "};\n"
3036  << "return &fun;\n"
3037  << "}\n";
3038  }
3039  // Flush
3040  g.flush(g.body);
3041  }
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 size_t codegen_sz_w(const CodeGenerator &g) const
Get required lengths, for codegen.
bool has_refcount_in_deps_
Reference counting in dependent functions.
std::vector< bool > is_diff_in_
Are inputs and outputs differentiable?
void codegen_sparsities(CodeGenerator &g) const
Codegen sparsities.
virtual double get_default_in(casadi_int ind) const
Get default input value.
int checkout() const
Checkout a memory object.
void release(int mem) const
Release a memory object.
bool all(const std::vector< bool > &v)
Check if all arguments are true.
Definition: casadi_misc.cpp:81

References casadi::all(), casadi::CodeGenerator::array(), casadi::CodeGenerator::body, casadi::ProtoFunction::checkout(), casadi::FunctionInternal::codegen_name(), casadi::FunctionInternal::codegen_needs_mem(), 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::FunctionInternal::has_refcount_in_deps_, 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::ProtoFunction::release(), casadi::CodeGenerator::res(), casadi::CodeGenerator::shorthand(), 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_method()

void casadi::Rosenbrock::codegen_method ( CodeGenerator &  g) const
overrideprotectedvirtual

Implements casadi::RuntimeIntegrator.

Definition at line 220 of file rosenbrock.cpp.

220  {
221  g.add_auxiliary(CodeGenerator::AUX_ROSENBROCK);
222  codegen_rosenbrock_prob(g, "pe", "p");
223  g << "e.prob = &pe;\n";
224  g << "casadi_rosenbrock_set_work(&e, &arg, &res, &iw, &w);\n";
225  if (replay_) {
226  static_cast<const Rosenbrock*>(root())->codegen_rosenbrock_prob(g, "pen", "pn");
227  g << "en.prob = &pen;\n";
228  g << "casadi_rosenbrock_set_work(&en, &arg, &res, &iw, &w);\n";
229  g << "e.nom = &en;\n";
230  }
231  }
Rosenbrock(const std::string &name, const Function &dae, double t0, const std::vector< double > &tout)
Constructor.
Definition: rosenbrock.cpp:48

References casadi::CodeGenerator::add_auxiliary(), casadi::CodeGenerator::AUX_ROSENBROCK, casadi::RuntimeIntegrator::replay_, and casadi::RuntimeIntegrator::root().

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

3043  {
3044  if (ns) {
3045  // Get the index of the function
3046  for (auto&& e : g.added_functions_) {
3047  if (e.f.get()==this) return e.codegen_name;
3048  }
3049  } else {
3050  for (casadi_int i=0;i<g.added_functions_.size();++i) {
3051  const auto & e = g.added_functions_[i];
3052  if (e.f.get()==this) return "f" + str(i);
3053  }
3054  }
3055  casadi_error("Function '" + name_ + "' not found");
3056  }

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

Referenced by casadi::FunctionInternal::codegen(), casadi::FunctionInternal::codegen_alloc_mem(), casadi::FatropInterface::codegen_body(), casadi::FunctionInternal::codegen_checkout(), casadi::FunctionInternal::codegen_decref(), casadi::FunctionInternal::codegen_incref(), casadi::FunctionInternal::codegen_mem(), casadi::FunctionInternal::codegen_meta(), casadi::FunctionInternal::codegen_release(), casadi::CodeGenerator::mem(), and casadi::CodeGenerator::operator()().

◆ codegen_needs_mem()

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

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

2713  {
2714  std::string name = codegen_name(g, false);
2715  std::string stack_counter = g.shorthand(name + "_unused_stack_counter");
2716  std::string stack = g.shorthand(name + "_unused_stack");
2717 
2718  if (g.thread_safe()) {
2719  Function F = shared_from_this<Function>();
2720  std::string mem_mutex = g.local_mutex(F, name + "_mem_mutex");
2721  g << "CASADI_MUTEX_LOCK(&" << mem_mutex << ");\n";
2722  g.scope_add_cleanup("CASADI_MUTEX_UNLOCK(&" + mem_mutex + ");\n");
2723  }
2724 
2725  g << stack << "[++" << stack_counter << "] = mem;\n";
2726  g.scope_return();
2727  }

References casadi::FunctionInternal::codegen_name(), casadi::CodeGenerator::local_mutex(), casadi::CodeGenerator::scope_add_cleanup(), casadi::CodeGenerator::scope_return(), casadi::CodeGenerator::shorthand(), and casadi::CodeGenerator::thread_safe().

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

3165  {
3166  return sz_arg();
3167  }

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

3171  {
3172  return sz_iw();
3173  }

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

3168  {
3169  return sz_res();
3170  }

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, and casadi::MXFunction.

Definition at line 3174 of file function_internal.cpp.

3174  {
3175  return sz_w();
3176  }

References casadi::FunctionInternal::sz_w().

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

◆ construct()

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

Prepares the function for evaluation

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

Definition at line 141 of file function_internal.cpp.

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

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

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

◆ convert_arg() [1/2]

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

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

Definition at line 1902 of file function_internal.hpp.

1903  {
1904  // Get default inputs
1905  std::vector<M> arg_v(n_in_);
1906  for (casadi_int i=0; i<arg_v.size(); ++i) {
1907  arg_v[i] = get_default_in(i);
1908  }
1909 
1910  // Assign provided inputs
1911  for (auto&& e : arg) {
1912  arg_v.at(index_in(e.first)) = e.second;
1913  }
1914 
1915  return arg_v;
1916  }
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 1890 of file function_internal.hpp.

1891  {
1892  casadi_assert(arg.size()==n_in_, "Incorrect number of inputs: Expected "
1893  + str(n_in_) + ", got " + str(arg.size()));
1894  std::map<std::string, M> ret;
1895  for (casadi_int i=0;i<n_in_;++i) {
1896  ret[name_in_[i]] = arg[i];
1897  }
1898  return ret;
1899  }

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

1932  {
1933  // Get default inputs
1934  std::vector<M> res_v(n_out_);
1935  for (casadi_int i=0; i<res_v.size(); ++i) {
1936  res_v[i] = std::numeric_limits<double>::quiet_NaN();
1937  }
1938 
1939  // Assign provided inputs
1940  for (auto&& e : res) {
1941  M a = e.second;
1942  res_v.at(index_out(e.first)) = a;
1943  }
1944  return res_v;
1945  }
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 1919 of file function_internal.hpp.

1920  {
1921  casadi_assert(res.size()==n_out_, "Incorrect number of outputs: Expected "
1922  + str(n_out_) + ", got " + str(res.size()));
1923  std::map<std::string, M> ret;
1924  for (casadi_int i=0;i<n_out_;++i) {
1925  ret[name_out_[i]] = res[i];
1926  }
1927  return ret;
1928  }

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

◆ create_advanced()

Function casadi::Integrator::create_advanced ( const Dict &  opts)
virtualinherited

Helper for a more powerful 'integrator' factory

Reimplemented in casadi::FixedStepIntegrator.

Definition at line 353 of file integrator.cpp.

353  {
354  return Function::create(this, opts);
355 }
static Function create(FunctionInternal *node)
Create from node.
Definition: function.cpp:488

References casadi::Function::create().

Referenced by casadi::integrator().

◆ create_forward()

Function casadi::OracleFunction::create_forward ( const std::string &  fname,
casadi_int  nfwd 
)
inherited

Create an oracle function as a forward derivative of a different function

Definition at line 278 of file oracle_function.cpp.

278  {
279  // Create derivative
280  Function ret = get_function(fname).forward(nfwd);
281  std::string fwd_name = forward_name(fname, nfwd); // may be different from ret.name()
282  if (!has_function(fwd_name)) set_function(ret, fwd_name, true);
283  return ret;
284 }
void set_function(const Function &fcn, const std::string &fname, bool jit=false)
bool has_function(const std::string &fname) const override

References casadi::FunctionInternal::forward_name(), casadi::OracleFunction::get_function(), casadi::OracleFunction::has_function(), and casadi::OracleFunction::set_function().

Referenced by casadi::Integrator::init(), casadi::ImplicitFixedStepIntegrator::init(), casadi::RuntimeIntegrator::init(), casadi::SLEQPInterface::init(), casadi::SundialsInterface::init(), casadi::UnoInterface::init(), and casadi::RungeKutta::setup_step().

◆ create_function() [1/3]

Function casadi::OracleFunction::create_function ( const Function &  oracle,
const std::string &  fname,
const std::vector< std::string > &  s_in,
const std::vector< std::string > &  s_out,
const Function::AuxOut &  aux = Function::AuxOut(),
const Dict &  opts = Dict() 
)
inherited

Create an oracle function, using a different oracle function Temporary addition to allow transition from one oracle formulation to another.

Definition at line 235 of file oracle_function.cpp.

239  {
240  // Print progress
241  if (verbose_) {
242  casadi_message(name_ + "::create_function " + fname + ":" + str(s_in) + "->" + str(s_out));
243  }
244 
245  // Check if function is already in cache
246  Function ret;
247  if (incache(fname, ret)) {
248  // Consistency checks
249  casadi_assert(ret.n_in() == s_in.size(), fname + " has wrong number of inputs");
250  casadi_assert(ret.n_out() == s_out.size(), fname + " has wrong number of outputs");
251  } else {
252  // Retrieve specific set of options if available
253  Dict specific_options;
254  auto it = specific_options_.find(fname);
255  if (it!=specific_options_.end()) specific_options = it->second;
256 
257  // Combine specific and common options
258  Dict opt = combine(specific_options, common_options_);
259  opt = combine(opts, opt);
260 
261  // Generate the function
262  ret = oracle.factory(fname, s_in, s_out, aux, opt);
263 
264  // Make sure that it's sound
265  if (ret.has_free()) {
266  casadi_error("Cannot create '" + fname + "' since " + str(ret.get_free()) + " are free.");
267  }
268 
269  // Add to cache
270  tocache_if_missing(ret);
271  }
272 
273  // Save and return
274  set_function(ret, fname, true);
275  return ret;
276 }
void tocache_if_missing(Function &f, const std::string &suffix="") const
Save function to cache, only if missing.
bool incache(const std::string &fname, Function &f, const std::string &suffix="") const
Get function in cache.
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
Build a function computing derivatives by naming inputs and outputs.
Definition: function.cpp:2009
Dict common_options_
Options for creating functions.
const Function & oracle() const override
Get oracle.
Dict combine(const Dict &first, const Dict &second, bool recurse)
Combine two dicts. First has priority.

References casadi::combine(), casadi::OracleFunction::common_options_, casadi::Function::factory(), casadi::Function::get_free(), casadi::Function::has_free(), casadi::FunctionInternal::incache(), casadi::Function::n_in(), casadi::Function::n_out(), casadi::ProtoFunction::name_, casadi::OracleFunction::oracle(), casadi::OracleFunction::set_function(), casadi::OracleFunction::specific_options_, casadi::str(), casadi::FunctionInternal::tocache_if_missing(), and casadi::ProtoFunction::verbose_.

Referenced by casadi::OracleFunction::create_function(), casadi::Integrator::init(), casadi::Nlpsol::init(), casadi::RuntimeIntegrator::init(), casadi::AlpaqaInterface::init(), casadi::Blocksqp::init(), casadi::BonminInterface::init(), casadi::MadmpecInterface::init(), casadi::ConoptInterface::init(), casadi::FatropInterface::init(), casadi::IpoptInterface::init(), casadi::KnitroInterface::init(), casadi::MadnlpInterface::init(), casadi::SLEQPInterface::init(), casadi::SnoptInterface::init(), casadi::SundialsInterface::init(), casadi::UnoInterface::init(), casadi::WorhpInterface::init(), casadi::Feasiblesqpmethod::init(), casadi::Qrsqp::init(), and casadi::Sqpmethod::init().

◆ create_function() [2/3]

Function casadi::OracleFunction::create_function ( const std::string &  fname,
const std::vector< MX > &  e_in,
const std::vector< MX > &  e_out,
const std::vector< std::string > &  s_in,
const std::vector< std::string > &  s_out,
const Dict &  opts = Dict() 
)
inherited

Create an oracle function from MX

Definition at line 187 of file oracle_function.cpp.

192  {
193 
194  // Print progress
195  if (verbose_) {
196  casadi_message(name_ + "::create_function " + fname + ":" + str(s_in) + "->" + str(s_out));
197  }
198 
199  // Check if function is already in cache
200  Function ret;
201  if (incache(fname, ret)) {
202  // Consistency checks
203  casadi_assert(ret.n_in() == s_in.size(), fname + " has wrong number of inputs");
204  casadi_assert(ret.n_out() == s_out.size(), fname + " has wrong number of outputs");
205  } else {
206  // Retrieve specific set of options if available
207  Dict specific_options;
208  auto it = specific_options_.find(fname);
209  if (it!=specific_options_.end()) specific_options = it->second;
210 
211  // Combine specific and common options
212  Dict opt = combine(specific_options, common_options_);
213  opt = combine(opts, opt);
214 
215  // Generate the function
216  ret = Function(fname, e_in, e_out, s_in, s_out, opt);
217 
218  // Make sure that it's sound
219  if (ret.has_free()) {
220  casadi_error("Cannot create '" + fname + "' since " + str(ret.get_free()) + " are free.");
221  }
222 
223  // TODO(jgillis) Conditionally convert to SX
224 
225  // Add to cache
226  tocache_if_missing(ret);
227  }
228 
229  // Save and return
230  set_function(ret, fname, true);
231  return ret;
232 
233 }

References casadi::combine(), casadi::OracleFunction::common_options_, casadi::FunctionInternal::Function, casadi::Function::get_free(), casadi::Function::has_free(), casadi::FunctionInternal::incache(), casadi::Function::n_in(), casadi::Function::n_out(), casadi::ProtoFunction::name_, casadi::OracleFunction::set_function(), casadi::OracleFunction::specific_options_, casadi::str(), casadi::FunctionInternal::tocache_if_missing(), and casadi::ProtoFunction::verbose_.

◆ create_function() [3/3]

Function casadi::OracleFunction::create_function ( const std::string &  fname,
const std::vector< std::string > &  s_in,
const std::vector< std::string > &  s_out,
const Function::AuxOut &  aux = Function::AuxOut(),
const Dict &  opts = Dict() 
)
inherited

Create an oracle function

Definition at line 179 of file oracle_function.cpp.

183  {
184  return create_function(oracle_, fname, s_in, s_out, aux, opts);
185 }
Function create_function(const Function &oracle, const std::string &fname, const std::vector< std::string > &s_in, const std::vector< std::string > &s_out, const Function::AuxOut &aux=Function::AuxOut(), const Dict &opts=Dict())

References casadi::OracleFunction::create_function(), and casadi::OracleFunction::oracle_.

◆ creator()

static Integrator* casadi::Rosenbrock::creator ( const std::string &  name,
const Function &  dae,
double  t0,
const std::vector< double > &  tout 
)
inlinestatic

Definition at line 77 of file rosenbrock.hpp.

78  {
79  return new Rosenbrock(name, dae, t0, tout);
80  }

Referenced by casadi::casadi_register_integrator_rosenbrock().

◆ dae_out()

static std::vector<std::string> casadi::Integrator::dae_out ( )
inlinestaticinherited

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

Definition at line 367 of file integrator_impl.hpp.

367 { return {"ode", "alg"}; }

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

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

180  {
181  // Note: i != this because of something something multiple inheritance
182  return str( (casadi_int)(i)) + "/" + static_cast<const Internal*>(this)->class_name();
183  }

◆ definition()

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

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

Definition at line 1141 of file function_internal.cpp.

1141  {
1142  std::stringstream s;
1143 
1144  // Print name
1145  s << name_ << ":(";
1146  // Print input arguments
1147  for (casadi_int i=0; i<n_in_; ++i) {
1148  if (!is_diff_in_.empty() && !is_diff_in_[i]) s << "#";
1149  s << name_in_[i] << sparsity_in_[i].postfix_dim() << (i==n_in_-1 ? "" : ",");
1150  }
1151  s << ")->(";
1152  // Print output arguments
1153  for (casadi_int i=0; i<n_out_; ++i) {
1154  if (!is_diff_out_.empty() && !is_diff_out_[i]) s << "#";
1155  s << name_out_[i] << sparsity_out_[i].postfix_dim() << (i==n_out_-1 ? "" : ",");
1156  }
1157  s << ")";
1158 
1159  return s.str();
1160  }

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

◆ deps_version_check()

virtual void casadi::PluginInterface< Integrator >::deps_version_check ( const std::string &  stage) const
inlinevirtualinherited

Definition at line 112 of file plugin_interface.hpp.

112 {}

◆ deserialize()

static ProtoFunction* casadi::Rosenbrock::deserialize ( DeserializingStream &  s)
inlinestatic

Definition at line 117 of file rosenbrock.hpp.

117 { return new Rosenbrock(s); }

Referenced by casadi::casadi_register_integrator_rosenbrock().

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

2249  {
2250  // Highest index found in current inputs and outputs
2251  casadi_int highest_index = 0;
2252  // Loop over both input names and output names
2253  for (const std::vector<std::string>& name_io : {name_in_, name_out_}) {
2254  for (const std::string& n : name_io) {
2255  // Find end of prefix, skip if no prefix
2256  size_t end = n.find('_');
2257  if (end >= n.size()) continue;
2258  // Skip if too short
2259  if (end < prefix.size()) continue;
2260  // Skip if wrong prefix
2261  if (n.compare(0, prefix.size(), prefix) != 0) continue;
2262  // Beginning of index
2263  size_t begin = prefix.size();
2264  // Check if any index
2265  casadi_int this_index;
2266  if (begin == end) {
2267  // No prefix, implicitly 1
2268  this_index = 1;
2269  } else {
2270  // Read index from string
2271  this_index = std::stoi(n.substr(begin, end - begin));
2272  }
2273  // Find the highest index
2274  if (this_index > highest_index) highest_index = this_index;
2275  }
2276  }
2277  // Return one higher index
2278  if (highest_index == 0) {
2279  return prefix + "_";
2280  } else {
2281  return prefix + std::to_string(highest_index + 1) + "_";
2282  }
2283  }

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

Referenced by casadi::FunctionInternal::forward(), casadi::OnnxFunction::get_forward(), casadi::OnnxFunction::get_reverse(), casadi::OnnxFunction::has_derivative(), 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 1162 of file function_internal.cpp.

1162  {
1163  stream << definition() << " " << class_name();
1164  if (more) {
1165  stream << std::endl;
1166  disp_more(stream);
1167  }
1168  }
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 3583 of file function_internal.cpp.

3583  {
3584  std::vector<DM> ret(n_in_);
3585  for (casadi_int i=0; i<ret.size(); ++i) {
3586  ret[i] = dm_in(i);
3587  }
3588  return ret;
3589  }
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 3591 of file function_internal.cpp.

3591  {
3592  std::vector<DM> ret(n_out_);
3593  for (casadi_int i=0; i<ret.size(); ++i) {
3594  ret[i] = dm_out(i);
3595  }
3596  return ret;
3597  }
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 1948 of file function_internal.hpp.

1948  {
1949  // Check dimensions
1950  if (v.size1() == sp.size1() && v.size2() == n * sp.size2()) {
1951  // Ensure that sparsity is a horizontal multiple of original input, or has no entries
1952  if (v.nnz() != 0 && !v.sparsity().is_stacked(sp, n)) {
1953  return project(v, repmat(sp, 1, n));
1954  }
1955  } else {
1956  // Correct empty sparsity
1957  casadi_assert_dev(v.is_empty());
1958  return MatType(sp.size1(), sp.size2() * n);
1959  }
1960  // No correction needed
1961  return v;
1962  }

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

◆ eval()

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

Reimplemented from casadi::Integrator.

Definition at line 457 of file runtime_integrator.cpp.

458  {
459  auto m = static_cast<RuntimeIntegratorMemory*>(mem);
460  const double* u = arg[INTEGRATOR_U];
461  const double* adj_xf = arg[INTEGRATOR_ADJ_XF];
462  const double* adj_zf = arg[INTEGRATOR_ADJ_ZF];
463  const double* adj_qf = arg[INTEGRATOR_ADJ_QF];
464  double* xf = res[INTEGRATOR_XF];
465  double* zf = res[INTEGRATOR_ZF];
466  double* qf = res[INTEGRATOR_QF];
467  double* adj_u = res[INTEGRATOR_ADJ_U];
468  setup(m, arg + INTEGRATOR_NUM_IN, res + INTEGRATOR_NUM_OUT, iw, w);
469  set_q(m, nullptr);
470  set_x(m, arg[INTEGRATOR_X0]);
471  set_z(m, arg[INTEGRATOR_Z0]);
472  set_p(m, arg[INTEGRATOR_P]);
473  m->num_events = 0;
474  m->t = t0_;
475  // Forward integration: a run of steps per control group
476  for (casadi_int j = 0; j < ngroup(); ++j) {
477  set_u(m, u ? u + j * nu_ : nullptr);
478  m->t_stop = tout_[group_start_[j + 1] - 1];
479  reset(m, j == 0);
480  for (m->k = group_start_[j]; m->k < group_start_[j + 1]; ++m->k) {
481  m->t_next = tout_[m->k];
482  if (advance_noevent(m)) return 1;
483  m->t = m->t_next;
484  get_x(m, xf ? xf + m->k * nx_ : nullptr);
485  get_z(m, zf ? zf + m->k * nz_ : nullptr);
486  get_q(m, qf ? qf + m->k * nq_ : nullptr);
487  }
488  }
489  // Discrete adjoint, output interval by output interval
490  if (nrx_ > 0) {
491  resetB(m);
492  for (casadi_int j = ngroup(); j-- > 0; ) {
493  // Control adjoints of this group only
494  casadi_clear(m->d.adj_u, nuq_);
495  for (m->k = group_start_[j + 1]; m->k-- > group_start_[j]; ) {
496  m->t = tout_[m->k];
497  impulseB(m, adj_xf ? adj_xf + m->k * nrx_ : nullptr,
498  adj_zf ? adj_zf + m->k * nrz_ : nullptr, adj_qf ? adj_qf + m->k * nrp_ : nullptr);
499  m->t_next = m->k > 0 ? tout_[m->k - 1] : t0_;
500  retreat(m, nullptr, m->k == 0 ? res[INTEGRATOR_ADJ_X0] : nullptr,
501  m->k == 0 ? res[INTEGRATOR_ADJ_P] : nullptr,
502  adj_u && m->k == group_start_[j] ? adj_u + j * nuq_ : nullptr);
503  }
504  }
505  }
506  join_results(m);
507  if (print_stats_) print_stats(m);
508  return 0;
509 }
void setup(void *mem, const double **arg, double **res, casadi_int *iw, double *w) const
Set the (persistent and temporary) work vectors.
void set_z(IntegratorMemory *m, const double *z) const
void get_z(IntegratorMemory *m, double *z) const
void set_x(IntegratorMemory *m, const double *x) const
void get_q(IntegratorMemory *m, double *q) const
void set_u(IntegratorMemory *m, const double *u) const
bool print_stats_
Options.
void get_x(IntegratorMemory *m, double *x) const
void set_q(IntegratorMemory *m, const double *q) const
void set_p(IntegratorMemory *m, const double *p) const
void join_results(OracleMemory *m) const
Combine results from different threads.
void retreat(IntegratorMemory *mem, const double *u, double *adj_x, double *adj_p, double *adj_u) const override
Retreat solution in time.
void impulseB(IntegratorMemory *mem, const double *adj_x, const double *adj_z, const double *adj_q) const override
Introduce an impulse into the backwards integration at the current time.
void resetB(IntegratorMemory *mem) const override
Reset the backward problem.
void print_stats(IntegratorMemory *mem) const override
Print solver statistics.
void reset(IntegratorMemory *mem, bool first_call) const override
Reset the forward problem at the start or after a change in the controls.
int advance_noevent(IntegratorMemory *mem) const override
Advance solution in time.
void casadi_clear(T1 *x, casadi_int n)
CLEAR: x <- 0.

References casadi::RuntimeIntegrator::advance_noevent(), casadi::casadi_clear(), casadi::Integrator::get_q(), casadi::Integrator::get_x(), casadi::Integrator::get_z(), casadi::RuntimeIntegrator::group_start_, casadi::RuntimeIntegrator::impulseB(), casadi::INTEGRATOR_ADJ_P, casadi::INTEGRATOR_ADJ_QF, casadi::INTEGRATOR_ADJ_U, casadi::INTEGRATOR_ADJ_X0, casadi::INTEGRATOR_ADJ_XF, casadi::INTEGRATOR_ADJ_ZF, casadi::INTEGRATOR_NUM_IN, casadi::INTEGRATOR_NUM_OUT, casadi::INTEGRATOR_P, casadi::INTEGRATOR_QF, casadi::INTEGRATOR_U, casadi::INTEGRATOR_X0, casadi::INTEGRATOR_XF, casadi::INTEGRATOR_Z0, casadi::INTEGRATOR_ZF, casadi::OracleFunction::join_results(), casadi::RuntimeIntegrator::ngroup(), casadi::Integrator::nq_, casadi::Integrator::nrp_, casadi::Integrator::nrx_, casadi::Integrator::nrz_, casadi::Integrator::nu_, casadi::Integrator::nuq_, casadi::Integrator::nx_, casadi::Integrator::nz_, casadi::RuntimeIntegrator::print_stats(), casadi::Integrator::print_stats_, casadi::RuntimeIntegrator::reset(), casadi::RuntimeIntegrator::resetB(), casadi::RuntimeIntegrator::retreat(), casadi::Integrator::set_p(), casadi::Integrator::set_q(), casadi::Integrator::set_u(), casadi::Integrator::set_x(), casadi::Integrator::set_z(), casadi::FunctionInternal::setup(), casadi::Integrator::t0_, and casadi::Integrator::tout_.

◆ eval_activity()

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

bvec bit set = active (possibly nonzero), clear = inactive (definitely zero). Unlike sp_forward (a dependency analysis), this respects multiplicative annihilation and nonzero constants. Default is the sound fallback: all active.

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

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

Definition at line 3080 of file function_internal.cpp.

3081  {
3082  // Sound fallback: we cannot prove any output zero, so mark everything active
3083  for (casadi_int oind=0; oind<n_out_; ++oind) {
3084  if (res[oind]==nullptr) continue;
3085  std::fill_n(res[oind], nnz_out(oind), ~static_cast<bvec_t>(0));
3086  }
3087  return 0;
3088  }
unsigned long long bvec_t

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

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

2232  {
2233  casadi_error("'eval_dm' not defined for " + class_name());
2234  }

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

449  {
450  return sp_forward(arg, res, iw, w, mem);
451  }
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 1029 of file function_internal.cpp.

1031  {
1032  casadi_int dump_id = (dump_in_ || dump_out_ || dump_) ? get_dump_id() : -1;
1033  if (dump_in_) dump_in(dump_id, arg);
1034  if (dump_ && dump_id==0) dump();
1035  if (print_in_) print_in(uout(), arg, false);
1036  auto *m = static_cast<FunctionMemory*>(mem);
1037 
1038  // Avoid memory corruption
1039  for (casadi_int i=0;i<n_in_;++i) {
1040  casadi_assert(arg[i]==nullptr || arg[i]+nnz_in(i)<=w || arg[i]>=w+sz_w(),
1041  "Memory corruption detected for input " + name_in_[i] + ".\n"+
1042  "arg[" + str(i) + "] " + str(arg[i]) + "-" + str(arg[i]+nnz_in(i)) +
1043  " intersects with w " + str(w)+"-"+str(w+sz_w())+".");
1044  }
1045  for (casadi_int i=0;i<n_out_;++i) {
1046  casadi_assert(res[i]==nullptr || res[i]+nnz_out(i)<=w || res[i]>=w+sz_w(),
1047  "Memory corruption detected for output " + name_out_[i]);
1048  }
1049  // Reset statistics
1050  for (auto&& s : m->fstats) s.second.reset();
1051  if (m->t_total) m->t_total->tic();
1052  m->dump_id = dump_id;
1053  int ret;
1054  if (eval_) {
1055  auto *m = static_cast<FunctionMemory*>(mem);
1056  m->stats_available = true;
1057  int mem_ = 0;
1058  if (checkout_) {
1059 #ifdef CASADI_WITH_THREAD
1060  std::lock_guard<std::mutex> lock(mtx_);
1061 #endif //CASADI_WITH_THREAD
1062  mem_ = checkout_();
1063  }
1064  ret = eval_(arg, res, iw, w, mem_);
1065  if (release_) {
1066 #ifdef CASADI_WITH_THREAD
1067  std::lock_guard<std::mutex> lock(mtx_);
1068 #endif //CASADI_WITH_THREAD
1069  release_(mem_);
1070  }
1071  } else {
1072  ret = eval(arg, res, iw, w, mem);
1073  }
1074  if (m->t_total) m->t_total->toc();
1075  // Show statistics
1076  print_time(m->fstats);
1077 
1078  if (dump_out_) dump_out(dump_id, res);
1079  if (print_out_) print_out(uout(), res, false);
1080  // Check all outputs for NaNs
1081  if (regularity_check_) {
1082  for (casadi_int i = 0; i < n_out_; ++i) {
1083  // Skip of not calculated
1084  if (!res[i]) continue;
1085  // Loop over nonzeros
1086  casadi_int nnz = this->nnz_out(i);
1087  for (casadi_int nz = 0; nz < nnz; ++nz) {
1088  if (isnan(res[i][nz]) || isinf(res[i][nz])) {
1089  // Throw readable error message
1090  casadi_error(str(res[i][nz]) + " detected for output " + name_out_[i] + " at "
1091  + sparsity_out(i).repr_el(nz));
1092  }
1093  }
1094  }
1095  }
1096  return ret;
1097  }
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.
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 444 of file function_internal.hpp.

445  {
446  return eval_sx(arg, res, iw, w, mem, always_inline, never_inline);
447  }
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 2451 of file function_internal.cpp.

2452  {
2453 
2454  always_inline = always_inline || always_inline_;
2455  never_inline = never_inline || never_inline_;
2456 
2457  // The code below creates a call node, to inline, wrap in an MXFunction
2458  if (always_inline) {
2459  casadi_assert(!never_inline, "Inconsistent options for " + str(name_));
2460  wrap().call(arg, res, true);
2461  return;
2462  }
2463 
2464  // Create a call-node
2465  res = Call::create(self(), arg);
2466  }
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 with a list or a dict of arguments; the result has the same form.
Definition: function.cpp:509

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

2238  {
2239 
2240  always_inline = always_inline || always_inline_;
2241  never_inline = never_inline || never_inline_;
2242 
2243  casadi_assert(!always_inline, "'eval_sx' not defined for " + class_name() +
2244  " in combination with always_inline true");
2245 
2246  return CallSX::eval_sx(self(), arg, res);
2247  }
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().

◆ expand()

void casadi::OracleFunction::expand ( )
inherited

Definition at line 459 of file oracle_function.cpp.

459  {
460  oracle_ = oracle_.expand();
461 }
Function expand() const
Convert an MXFunction into an equivalent SXFunction.
Definition: function.cpp:312

References casadi::Function::expand(), and casadi::OracleFunction::oracle_.

Referenced by casadi::Nlpsol::init(), and casadi::OracleFunction::init().

◆ 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

◆ fdae_sp_forward()

int casadi::Integrator::fdae_sp_forward ( SpForwardMem *  m,
const bvec_t *  x,
const bvec_t *  p,
const bvec_t *  u,
bvec_t *  ode,
bvec_t *  alg 
) const
inherited

Definition at line 1006 of file integrator.cpp.

1007  {
1008  // Evaluate nondifferentiated
1009  m->arg[DYN_T] = nullptr; // t
1010  m->arg[DYN_X] = x; // x
1011  m->arg[DYN_Z] = nullptr; // z
1012  m->arg[DYN_P] = p; // p
1013  m->arg[DYN_U] = u; // u
1014  m->res[DAE_ODE] = ode; // ode
1015  m->res[DAE_ALG] = alg; // alg
1016  if (calc_sp_forward("daeF", m->arg, m->res, m->iw, m->w)) return 1;
1017  // Evaluate sensitivities
1018  for (casadi_int i = 0; i < nfwd_; ++i) {
1019  m->arg[DYN_NUM_IN + DAE_ODE] = ode; // out:ode
1020  m->arg[DYN_NUM_IN + DAE_ALG] = alg; // out:alg
1021  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_T] = nullptr; // fwd:t
1022  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_X] = x + (i + 1) * nx1_; // fwd:x
1023  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_Z] = nullptr; // fwd:z
1024  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_P] = p ? p + (i + 1) * np1_ : nullptr; // fwd:p
1025  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_U] = u ? u + (i + 1) * nu1_ : nullptr; // fwd:u
1026  m->res[DAE_ODE] = ode + (i + 1) * nx1_; // fwd:ode
1027  m->res[DAE_ALG] = alg + (i + 1) * nz1_; // fwd:alg
1028  if (calc_sp_forward(forward_name("daeF", 1), m->arg, m->res, m->iw, m->w)) return 1;
1029  }
1030  return 0;
1031 }

References casadi::SpForwardMem::arg, casadi::OracleFunction::calc_sp_forward(), casadi::Integrator::DAE_ALG, casadi::Integrator::DAE_NUM_OUT, casadi::Integrator::DAE_ODE, casadi::DYN_NUM_IN, casadi::DYN_P, casadi::DYN_T, casadi::DYN_U, casadi::DYN_X, casadi::DYN_Z, casadi::FunctionInternal::forward_name(), casadi::SpForwardMem::iw, casadi::Integrator::nfwd_, casadi::Integrator::np1_, casadi::Integrator::nu1_, casadi::Integrator::nx1_, casadi::Integrator::nz1_, casadi::SpForwardMem::res, and casadi::SpForwardMem::w.

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

◆ fdae_sp_reverse()

int casadi::Integrator::fdae_sp_reverse ( SpReverseMem *  m,
bvec_t *  x,
bvec_t *  p,
bvec_t *  u,
bvec_t *  ode,
bvec_t *  alg 
) const
inherited

Definition at line 1281 of file integrator.cpp.

1282  {
1283  // Nondifferentiated inputs
1284  m->arg[DYN_T] = nullptr; // t
1285  m->arg[DYN_X] = x; // x
1286  m->arg[DYN_Z] = nullptr; // z
1287  m->arg[DYN_P] = p; // p
1288  m->arg[DYN_U] = u; // u
1289  // Propagate through sensitivities
1290  for (casadi_int i = 0; i < nfwd_; ++i) {
1291  m->res[DAE_ODE] = ode + (i + 1) * nx1_; // fwd:ode
1292  m->res[DAE_ALG] = alg + (i + 1) * nz1_; // fwd:alg
1293  m->arg[DYN_NUM_IN + DAE_ODE] = ode; // out:ode
1294  m->arg[DYN_NUM_IN + DAE_ALG] = alg; // out:alg
1295  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_T] = nullptr; // fwd:t
1296  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_X] = x + (i + 1) * nx1_; // fwd:x
1297  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_Z] = nullptr; // fwd:z
1298  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_P] = p ? p + (i + 1) * np1_ : nullptr; // fwd:p
1299  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_U] = u ? u + (i + 1) * nu1_ : nullptr; // fwd:u
1300  if (calc_sp_reverse(forward_name("daeF", 1), m->arg, m->res, m->iw, m->w)) return 1;
1301  }
1302  // Propagate through nondifferentiated
1303  m->res[DAE_ODE] = ode; // ode
1304  m->res[DAE_ALG] = alg; // alg
1305  if (calc_sp_reverse("daeF", m->arg, m->res, m->iw, m->w)) return 1;
1306  return 0;
1307 }

References casadi::SpReverseMem::arg, casadi::OracleFunction::calc_sp_reverse(), casadi::Integrator::DAE_ALG, casadi::Integrator::DAE_NUM_OUT, casadi::Integrator::DAE_ODE, casadi::DYN_NUM_IN, casadi::DYN_P, casadi::DYN_T, casadi::DYN_U, casadi::DYN_X, casadi::DYN_Z, casadi::FunctionInternal::forward_name(), casadi::SpReverseMem::iw, casadi::Integrator::nfwd_, casadi::Integrator::np1_, casadi::Integrator::nu1_, casadi::Integrator::nx1_, casadi::Integrator::nz1_, casadi::SpReverseMem::res, and casadi::SpReverseMem::w.

Referenced by casadi::Integrator::sp_reverse().

◆ finalize()

void casadi::OracleFunction::finalize ( )
overridevirtualinherited

Reimplemented from casadi::FunctionInternal.

Definition at line 122 of file oracle_function.cpp.

122  {
123  if (post_expand_) {
124  for (auto&& e : all_functions_) {
125  Function& fcn = e.second.f;
126  fcn = fcn.expand();
127  }
128  }
129 
130  // Allocate space for (parallel) evaluations
131  // Lifted from set_function as max_num_threads_ is not known yet in that method
132  for (auto&& e : all_functions_) {
133  Function& fcn = e.second.f;
134  // Compute strides for multi threading
135  size_t sz_arg, sz_res, sz_iw, sz_w;
136  fcn.sz_work(sz_arg, sz_res, sz_iw, sz_w);
137  stride_arg_ = std::max(stride_arg_, sz_arg);
138  stride_res_ = std::max(stride_res_, sz_res);
139  stride_iw_ = std::max(stride_iw_, sz_iw);
140  stride_w_ = std::max(stride_w_, sz_w);
141  bool persistent = false;
142  alloc(fcn, persistent, max_num_threads_);
143  }
144 
145  // Set corresponding monitors
146  for (const std::string& fname : monitor_) {
147  auto it = all_functions_.find(fname);
148  if (it==all_functions_.end()) {
149  casadi_warning("Ignoring monitor '" + fname + "'."
150  " Available functions: " + join(get_function()) + ".");
151  } else {
152  if (it->second.monitored) casadi_warning("Duplicate monitor " + fname);
153  it->second.monitored = true;
154  }
155  }
156 
157  // Check specific options
158  for (auto&& i : specific_options_) {
159  if (all_functions_.find(i.first)==all_functions_.end())
160  casadi_warning("Ignoring specific_options entry '" + i.first+"'."
161  " Available functions: " + join(get_function()) + ".");
162  }
163 
164  // Recursive call
166 }
void finalize() override
Finalize the object creation.
void alloc(const Function &f, bool persistent=false, int num_threads=1)
Ensure work vectors long enough to evaluate function.
std::map< std::string, RegFun > all_functions_
std::vector< std::string > monitor_
std::string join(const std::vector< std::string > &l, const std::string &delim)

References casadi::OracleFunction::all_functions_, casadi::FunctionInternal::alloc(), casadi::Function::expand(), casadi::FunctionInternal::finalize(), casadi::OracleFunction::get_function(), casadi::join(), casadi::OracleFunction::max_num_threads_, casadi::OracleFunction::monitor_, casadi::OracleFunction::post_expand_, casadi::OracleFunction::specific_options_, casadi::OracleFunction::stride_arg_, casadi::OracleFunction::stride_iw_, casadi::OracleFunction::stride_res_, casadi::OracleFunction::stride_w_, casadi::FunctionInternal::sz_arg(), casadi::FunctionInternal::sz_iw(), casadi::FunctionInternal::sz_res(), casadi::FunctionInternal::sz_w(), and casadi::Function::sz_work().

◆ find()

void casadi::OracleFunction::find ( std::map< FunctionInternal *, std::pair< Function, size_t > > &  all_fun,
casadi_int  max_depth 
) const
overridevirtualinherited

Reimplemented from casadi::FunctionInternal.

Definition at line 552 of file oracle_function.cpp.

553  {
554  // Call to base class
555  FunctionInternal::find(all_fun, max_depth);
556  for (auto&& e : all_functions_) {
557  add_embedded(all_fun, e.second.f, max_depth);
558  }
559 }
void add_embedded(std::map< FunctionInternal *, std::pair< Function, size_t > > &all_fun, const Function &dep, casadi_int max_depth) const
virtual void find(std::map< FunctionInternal *, std::pair< Function, size_t > > &all_fun, casadi_int max_depth) const

References casadi::FunctionInternal::add_embedded(), casadi::OracleFunction::all_functions_, and casadi::FunctionInternal::find().

◆ finish_trace()

void casadi::FunctionInternal::finish_trace ( std::ostream &  trace,
double **  res,
int  ret 
) const
protectedinherited

Definition at line 875 of file function_internal.cpp.

876  {
877  if (ret == 0) {
878  trace << "{\"event\":\"outputs\",\"values\":[";
879  for (casadi_int i = 0; i < n_out_; ++i) {
880  if (i) trace << ",";
881  trace_values(trace, res[i], nnz_out(i));
882  }
883  trace << "]}\n";
884  }
885  trace << "{\"event\":\"end\",\"status\":" << ret << "}\n";
886  trace.flush();
887  casadi_assert(trace.good(), "Failed to write dump_trace for '" + name_ + "'");
888  }
static void trace_values(std::ostream &trace, const double *values, casadi_int nnz)

References casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::FunctionInternal::nnz_out(), and casadi::FunctionInternal::trace_values().

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

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

4129  {
4130  // Always of width 8
4131  casadi_assert_dev(time>=0);
4132  double log_time = log10(time);
4133  int magn = static_cast<int>(floor(log_time));
4134  int iprefix = static_cast<int>(floor(log_time/3));
4135  if (iprefix<-4) {
4136  sprint(buffer, 10, " 0");
4137  return;
4138  }
4139  if (iprefix>=5) {
4140  sprint(buffer, 10, " inf");
4141  return;
4142  }
4143  char prefixes[] = "TGMk munp";
4144  char prefix = prefixes[4-iprefix];
4145 
4146  int rem = magn-3*iprefix;
4147  double time_normalized = time/pow(10, 3*iprefix);
4148 
4149  if (rem==0) {
4150  sprint(buffer, 10, " %1.2f%cs", time_normalized, prefix);
4151  } else if (rem==1) {
4152  sprint(buffer, 10, " %2.2f%cs", time_normalized, prefix);
4153  } else {
4154  sprint(buffer, 10, "%3.2f%cs", time_normalized, prefix);
4155  }
4156  }
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 2285 of file function_internal.cpp.

2285  {
2286  casadi_assert_dev(nfwd>=0);
2287  // Used wrapped function if forward not available
2288  if (!enable_forward_ && !enable_fd_) {
2289  // Derivative information must be available
2290  casadi_assert(has_derivative(), "Derivatives cannot be calculated for " + name_);
2291  return wrap().forward(nfwd);
2292  }
2293  // Retrieve/generate cached
2294  Function f;
2295  std::string fname = forward_name(name_, nfwd);
2296  if (!incache(fname, f)) {
2297  casadi_int i;
2298  // Prefix to be used for forward seeds, sensitivities
2299  std::string pref = diff_prefix("fwd");
2300  // Names of inputs
2301  std::vector<std::string> inames;
2302  for (i=0; i<n_in_; ++i) inames.push_back(name_in_[i]);
2303  for (i=0; i<n_out_; ++i) inames.push_back("out_" + name_out_[i]);
2304  for (i=0; i<n_in_; ++i) inames.push_back(pref + name_in_[i]);
2305  // Names of outputs
2306  std::vector<std::string> onames;
2307  for (i=0; i<n_out_; ++i) onames.push_back(pref + name_out_[i]);
2308  // Options
2310  if (enable_forward_) {
2311  opts = combine(opts, generate_options("forward"));
2312  } else {
2313  opts = combine(opts, FunctionInternal::generate_options("forward"));
2314  }
2315  opts["derivative_of"] = self();
2316  // Generate derivative function
2317  casadi_assert_dev(enable_forward_ || enable_fd_);
2318  if (enable_forward_) {
2319  f = get_forward(nfwd, fname, inames, onames, opts);
2320  } else {
2321  opts = combine(opts, fd_options_);
2322  // Get FD method
2323  if (fd_method_.empty() || fd_method_=="central") {
2324  f = Function::create(new CentralDiff(fname, nfwd), opts);
2325  } else if (fd_method_=="forward") {
2326  f = Function::create(new ForwardDiff(fname, nfwd), opts);
2327  } else if (fd_method_=="backward") {
2328  f = Function::create(new BackwardDiff(fname, nfwd), opts);
2329  } else if (fd_method_=="smoothing") {
2330  f = Function::create(new Smoothing(fname, nfwd), opts);
2331  } else {
2332  casadi_error("Unknown 'fd_method': " + fd_method_);
2333  }
2334  }
2335  // Consistency check for inputs
2336  casadi_assert_dev(f.n_in()==n_in_ + n_out_ + n_in_);
2337  casadi_int ind=0;
2338  for (i=0; i<n_in_; ++i) f.assert_size_in(ind++, size1_in(i), size2_in(i));
2339  for (i=0; i<n_out_; ++i) f.assert_size_in(ind++, size1_out(i), size2_out(i));
2340  for (i=0; i<n_in_; ++i) f.assert_size_in(ind++, size1_in(i), nfwd*size2_in(i));
2341  // Consistency check for outputs
2342  casadi_assert_dev(f.n_out()==n_out_);
2343  for (i=0; i<n_out_; ++i) f.assert_sparsity_out(i, sparsity_out(i), nfwd);
2344  // Save to cache
2345  tocache_if_missing(f);
2346  }
2347  return f;
2348  }
std::string diff_prefix(const std::string &prefix) const
Determine prefix for differentiated functions.
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 computing nfwd forward directional derivatives.
Definition: function.cpp:1324

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

◆ fquad_sp_forward()

int casadi::Integrator::fquad_sp_forward ( SpForwardMem *  m,
const bvec_t *  x,
const bvec_t *  z,
const bvec_t *  p,
const bvec_t *  u,
bvec_t *  quad 
) const
inherited

Definition at line 1033 of file integrator.cpp.

1034  {
1035  // Evaluate nondifferentiated
1036  m->arg[DYN_T] = nullptr; // t
1037  m->arg[DYN_X] = x; // x
1038  m->arg[DYN_Z] = z; // z
1039  m->arg[DYN_P] = p; // p
1040  m->arg[DYN_U] = u; // u
1041  m->res[QUAD_QUAD] = quad; // quad
1042  if (calc_sp_forward("quadF", m->arg, m->res, m->iw, m->w)) return 1;
1043  // Evaluate sensitivities
1044  for (casadi_int i = 0; i < nfwd_; ++i) {
1045  m->arg[DYN_NUM_IN + QUAD_QUAD] = quad; // out:quad
1046  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_T] = nullptr; // fwd:t
1047  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_X] = x + (i + 1) * nx1_; // fwd:x
1048  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_Z] = z + (i + 1) * nz1_; // fwd:z
1049  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_P] = p ? p + (i + 1) * np1_ : nullptr; // fwd:p
1050  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_U] = u ? u + (i + 1) * nu1_ : nullptr; // fwd:u
1051  m->res[QUAD_QUAD] = quad + (i + 1) * nq1_; // fwd:quad
1052  if (calc_sp_forward(forward_name("quadF", 1), m->arg, m->res, m->iw, m->w)) return 1;
1053  }
1054  return 0;
1055 }

References casadi::SpForwardMem::arg, casadi::OracleFunction::calc_sp_forward(), casadi::DYN_NUM_IN, casadi::DYN_P, casadi::DYN_T, casadi::DYN_U, casadi::DYN_X, casadi::DYN_Z, casadi::FunctionInternal::forward_name(), casadi::SpForwardMem::iw, casadi::Integrator::nfwd_, casadi::Integrator::np1_, casadi::Integrator::nq1_, casadi::Integrator::nu1_, casadi::Integrator::nx1_, casadi::Integrator::nz1_, casadi::Integrator::QUAD_NUM_OUT, casadi::Integrator::QUAD_QUAD, casadi::SpForwardMem::res, and casadi::SpForwardMem::w.

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

◆ fquad_sp_reverse()

int casadi::Integrator::fquad_sp_reverse ( SpReverseMem *  m,
bvec_t *  x,
bvec_t *  z,
bvec_t *  p,
bvec_t *  u,
bvec_t *  quad 
) const
inherited

Definition at line 1309 of file integrator.cpp.

1310  {
1311  // Nondifferentiated inputs
1312  m->arg[DYN_T] = nullptr; // t
1313  m->arg[DYN_X] = x; // x
1314  m->arg[DYN_Z] = z; // z
1315  m->arg[DYN_P] = p; // p
1316  m->arg[DYN_U] = u; // u
1317  // Propagate through sensitivities
1318  for (casadi_int i = 0; i < nfwd_; ++i) {
1319  m->res[QUAD_QUAD] = quad + (i + 1) * nq1_; // fwd:quad
1320  m->arg[DYN_NUM_IN + QUAD_QUAD] = quad; // out:quad
1321  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_T] = nullptr; // fwd:t
1322  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_X] = x + (i + 1) * nx1_; // fwd:x
1323  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_Z] = z + (i + 1) * nz1_; // fwd:z
1324  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_P] = p ? p + (i + 1) * np1_ : nullptr; // fwd:p
1325  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_U] = u ? u + (i + 1) * nu1_ : nullptr; // fwd:u
1326  if (calc_sp_reverse(forward_name("quadF", 1), m->arg, m->res, m->iw, m->w)) return 1;
1327  }
1328  // Propagate through nondifferentiated
1329  m->res[QUAD_QUAD] = quad; // quad
1330  if (calc_sp_reverse("quadF", m->arg, m->res, m->iw, m->w)) return 1;
1331  return 0;
1332 }

References casadi::SpReverseMem::arg, casadi::OracleFunction::calc_sp_reverse(), casadi::DYN_NUM_IN, casadi::DYN_P, casadi::DYN_T, casadi::DYN_U, casadi::DYN_X, casadi::DYN_Z, casadi::FunctionInternal::forward_name(), casadi::SpReverseMem::iw, casadi::Integrator::nfwd_, casadi::Integrator::np1_, casadi::Integrator::nq1_, casadi::Integrator::nu1_, casadi::Integrator::nx1_, casadi::Integrator::nz1_, casadi::Integrator::QUAD_NUM_OUT, casadi::Integrator::QUAD_QUAD, casadi::SpReverseMem::res, and casadi::SpReverseMem::w.

Referenced by casadi::Integrator::sp_reverse().

◆ free_mem()

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

Reimplemented from casadi::OracleFunction.

Definition at line 108 of file rosenbrock.hpp.

108 { delete static_cast<RosenbrockMemory*>(mem);}

◆ free_mx()

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

Reimplemented in casadi::MXFunction.

Definition at line 3631 of file function_internal.cpp.

3631  {
3632  casadi_error("'free_mx' only defined for 'MXFunction'");
3633  }

◆ free_sx()

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

Reimplemented in casadi::SXFunction.

Definition at line 3635 of file function_internal.cpp.

3635  {
3636  casadi_error("'free_sx' only defined for 'SXFunction'");
3637  }

◆ from_compact()

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

Definition at line 2050 of file function_internal.cpp.

2051  {
2052  // Return value
2053  Sparsity r = sp;
2054  // Insert rows if sparse output
2055  if (numel_out(oind) != r.size1()) {
2056  casadi_assert_dev(r.size1() == nnz_out(oind));
2057  r.enlargeRows(numel_out(oind), sparsity_out(oind).find());
2058  }
2059  // Insert columns if sparse input
2060  if (numel_in(iind) != r.size2()) {
2061  casadi_assert_dev(r.size2() == nnz_in(iind));
2062  r.enlargeColumns(numel_in(iind), sparsity_in(iind).find());
2063  }
2064  // Return non-compact pattern
2065  return r;
2066  }
casadi_int numel_out() const
Number of input/output elements.
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 1585 of file function_internal.hpp.

1586  {
1587  std::vector<std::vector<MatType>> fseed(nfwd);
1588  for (casadi_int dir=0; dir<nfwd; ++dir) {
1589  fseed[dir].resize(n_in_);
1590  for (casadi_int iind=0; iind<n_in_; ++iind) {
1591  std::string n = "f" + str(dir) + "_" + name_in_[iind];
1592  Sparsity sp = is_diff_in_[iind] ? sparsity_in(iind) : Sparsity(size_in(iind));
1593  fseed[dir][iind] = MatType::sym(n, sp);
1594  }
1595  }
1596  return fseed;
1597  }

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

3246  {
3247  if (!enable_forward_ && !enable_fd_) return true;
3248  if (jac_penalty_==-1) return false;
3249 
3250  // Heuristic 1: Jac calculated via forward mode likely cheaper
3251  if (jac_penalty_*static_cast<double>(nnz_in())<nfwd) return true;
3252 
3253  // Heuristic 2: Jac calculated via reverse mode likely cheaper
3254  double w = ad_weight();
3255  if (enable_reverse_ &&
3256  jac_penalty_*(1-w)*static_cast<double>(nnz_out())<w*static_cast<double>(nfwd))
3257  return true; // NOLINT
3258 
3259  return false;
3260  }

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::OracleFunction::generate_dependencies ( const std::string &  fname,
const Dict &  opts 
) const
overridevirtualinherited

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

Reimplemented from casadi::FunctionInternal.

Definition at line 431 of file oracle_function.cpp.

432  {
433  CodeGenerator gen(fname, opts);
434  gen.add(oracle_);
435  for (auto&& e : all_functions_) {
436  // After jit_dependencies, f is the loaded External: generate from the original
437  if (e.second.jit) gen.add(e.second.f_original.is_null() ? e.second.f : e.second.f_original);
438  }
439  return gen.generate();
440 }

References casadi::CodeGenerator::add(), casadi::OracleFunction::all_functions_, casadi::CodeGenerator::generate(), and casadi::OracleFunction::oracle_.

Referenced by casadi::OracleFunction::jit_dependencies().

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

801  {
802  // Set up output stream
803  auto of_ptr = Filesystem::ofstream_ptr(fname);
804  std::ostream& of = *of_ptr;
805  normalized_setup(of);
806 
807  // Encode each input
808  for (casadi_int i=0; i<n_in_; ++i) {
809  const double* v = arg[i];
810  for (casadi_int k=0;k<nnz_in(i);++k) {
811  normalized_out(of, v ? v[k] : 0);
812  of << std::endl;
813  }
814  }
815  }
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 3639 of file function_internal.cpp.

3640  {
3641  casadi_error("'generate_lifted' only defined for 'MXFunction'");
3642  }

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

393  {
394  Dict opts = ProtoFunction::generate_options(target);
395  opts["jac_penalty"] = jac_penalty_;
396  opts["user_data"] = user_data_;
397  opts["inputs_check"] = inputs_check_;
398  if (target!="tmp") opts["jit"] = jit_;
399  opts["jit_cleanup"] = jit_cleanup_;
400  opts["jit_serialize"] = jit_serialize_;
401  opts["compiler"] = compiler_plugin_;
402  opts["jit_options"] = jit_options_;
403  opts["codegen_options"] = codegen_options_;
404  opts["jit_name"] = jit_base_name_;
405  opts["jit_temp_suffix"] = jit_temp_suffix_;
406  opts["ad_weight"] = ad_weight_;
407  opts["ad_weight_sp"] = ad_weight_sp_;
408  opts["always_inline"] = always_inline_;
409  opts["never_inline"] = never_inline_;
410  opts["max_num_dir"] = max_num_dir_;
411  if (target=="clone" || target=="tmp") {
412  opts["enable_forward"] = enable_forward_op_;
413  opts["enable_reverse"] = enable_reverse_op_;
414  opts["enable_jacobian"] = enable_jacobian_op_;
415  opts["enable_fd"] = enable_fd_op_;
416  opts["reverse_options"] = reverse_options_;
417  opts["forward_options"] = forward_options_;
418  opts["jacobian_options"] = jacobian_options_;
419  opts["der_options"] = der_options_;
420  opts["derivative_of"] = derivative_of_;
421  }
422  opts["fd_options"] = fd_options_;
423  opts["fd_method"] = fd_method_;
424  opts["print_in"] = print_in_;
425  opts["print_out"] = print_out_;
426  opts["print_canonical"] = print_canonical_;
427  opts["max_io"] = max_io_;
428  opts["dump_in"] = dump_in_;
429  opts["dump_out"] = dump_out_;
430  opts["dump_dir"] = dump_dir_;
431  opts["dump_format"] = dump_format_;
432  opts["dump"] = dump_;
433  if (target=="clone") {
434  opts["is_diff_in"] = is_diff_in_;
435  opts["is_diff_out"] = is_diff_out_;
436  }
437  if (target=="forward") {
438  opts["is_diff_in"] = join(is_diff_in_, is_diff_out_, is_diff_in_);
439  opts["is_diff_out"] = is_diff_out_;
440  }
441  if (target=="reverse") {
442  opts["is_diff_in"] = join(is_diff_in_, is_diff_out_, is_diff_out_);
443  opts["is_diff_out"] = is_diff_in_;
444  }
445  return opts;
446  }
std::string jit_serialize_
Serialize behaviour.
std::string compiler_plugin_
Just-in-time compiler.
void * user_data_
User-set field.
Dict codegen_options_
Options of the code generator of jit.
bool inputs_check_
Errors are thrown if numerical values of inputs look bad.
bool jit_
Use just-in-time compiler.
bool jit_temp_suffix_
Use a temporary name.
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::codegen_options_, 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::is_diff_in_, casadi::FunctionInternal::is_diff_out_, casadi::FunctionInternal::jac_penalty_, casadi::FunctionInternal::jacobian_options_, casadi::FunctionInternal::jit_, casadi::FunctionInternal::jit_base_name_, casadi::FunctionInternal::jit_cleanup_, casadi::FunctionInternal::jit_options_, casadi::FunctionInternal::jit_serialize_, casadi::FunctionInternal::jit_temp_suffix_, casadi::join(), 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::Function::expand(), 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 817 of file function_internal.cpp.

817  {
818  // Set up output stream
819  auto of_ptr = Filesystem::ofstream_ptr(fname);
820  std::ostream& of = *of_ptr;
821  normalized_setup(of);
822 
823  // Encode each input
824  for (casadi_int i=0; i<n_out_; ++i) {
825  const double* v = res[i];
826  for (casadi_int k=0;k<nnz_out(i);++k) {
827  normalized_out(of, v ? v[k] : std::numeric_limits<double>::quiet_NaN());
828  of << std::endl;
829  }
830  }
831  }

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

1135  {
1136  return eps;
1137  }
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()

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

◆ get_diff_out()

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

◆ get_forward()

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

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

Reimplemented from casadi::FunctionInternal.

Definition at line 1584 of file integrator.cpp.

1587  {
1588  if (verbose_) casadi_message(name_ + "::get_forward");
1589 
1590  // Integrator options
1591  Dict aug_opts = getDerivativeOptions(true);
1592  for (auto&& i : augmented_options_) {
1593  aug_opts[i.first] = i.second;
1594  }
1595 
1596  // Get current DAE, with any existing sensitivity equations augmented
1597  Function this_dae = augmented_dae();
1598 
1599  // Create integrator for augmented DAE
1600  std::string aug_prefix = "fsens" + str(nfwd) + "_";
1601  aug_opts["derivative_of"] = self();
1602  aug_opts["nfwd"] = nfwd;
1603  aug_opts["nadj"] = nadj_;
1604  Function aug_int = integrator(aug_prefix + name_, plugin_name(),
1605  this_dae, t0_, tout_, aug_opts);
1606 
1607  // All inputs of the return function
1608  std::vector<MX> ret_in;
1610 
1611  // Add nondifferentiated inputs to ret_in
1612  for (casadi_int i = 0; i < INTEGRATOR_NUM_IN; ++i) {
1613  ret_in.push_back(MX::sym(integrator_in(i), sparsity_in(i)));
1614  }
1615 
1616  // Add nondifferentiated outputs (unused) to ret_in
1617  for (casadi_int i = 0; i < INTEGRATOR_NUM_OUT; ++i) {
1618  ret_in.push_back(MX::sym("out_" + integrator_out(i), Sparsity(size_out(i))));
1619  }
1620 
1621  // Create symbolic expressions for augmented problem, add forward seeds to ret_in
1622  std::vector<std::vector<MX>> aug_in(INTEGRATOR_NUM_IN);
1623  std::vector<MX> v(nfwd);
1624  for (casadi_int i = 0; i < INTEGRATOR_NUM_IN; ++i) {
1625  for (casadi_int d = 0; d < nfwd; ++d) {
1626  v[d] = MX::sym("fwd" + str(d) + "_" + integrator_in(i), sparsity_in(i));
1627  aug_in[i].push_back(v[d]);
1628  }
1629  ret_in.push_back(horzcat(v));
1630  }
1631 
1632  // Call the augmented integrator
1633  std::vector<MX> integrator_in(INTEGRATOR_NUM_IN);
1634  for (casadi_int i = 0; i < INTEGRATOR_NUM_IN; ++i) {
1635  casadi_int n_grid = n_grid_in(i);
1636  if (size1_in(i) > 0 && n_grid > 1) {
1637  // Split nondifferentiated input by grid point
1638  std::vector<MX> ret_in_split = horzsplit_n(ret_in[i], n_grid);
1639  // Split augmented input by grid point
1640  std::vector<std::vector<MX>> aug_in_split(nfwd);
1641  for (casadi_int d = 0; d < nfwd; ++d) {
1642  aug_in_split[d] = horzsplit_n(aug_in[i][d], n_grid);
1643  }
1644  // Reorder columns
1645  v.clear();
1646  for (casadi_int k = 0; k < n_grid; ++k) {
1647  v.push_back(ret_in_split.at(k));
1648  for (casadi_int d = 0; d < nfwd; ++d) {
1649  v.push_back(aug_in_split[d].at(k));
1650  }
1651  }
1652  } else {
1653  // No reordering necessary
1654  v = aug_in[i];
1655  v.insert(v.begin(), ret_in[i]);
1656  }
1657  // Flatten all elements; blocks of adjoint seeds have one column per adjoint direction
1658  for (MX& e : v) e = vec(e);
1659  integrator_in[i] = reshape(vertcat(v), aug_int.size_in(i));
1660  }
1661  std::vector<MX> integrator_out = aug_int(integrator_in);
1662 
1663  // Collect forward sensitivites
1664  std::vector<MX> ret_out;
1665  ret_out.reserve(INTEGRATOR_NUM_OUT);
1666  for (casadi_int i = 0; i < INTEGRATOR_NUM_OUT; ++i) {
1667  // Split return by grid points and sensitivities
1668  casadi_int n_grid = n_grid_out(i);
1669  std::vector<casadi_int> offset = {0};
1670  for (casadi_int k = 0; k < n_grid; ++k) {
1671  for (casadi_int d = 0; d <= nfwd; ++d) {
1672  offset.push_back(offset.back() + size2_out(i) / n_grid);
1673  }
1674  }
1675  std::vector<MX> integrator_out_split = horzsplit(
1676  reshape(integrator_out[i], size1_out(i), offset.back()), offset);
1677  // Collect sensitivity blocks in the right order
1678  std::vector<MX> ret_out_split;
1679  ret_out_split.reserve(n_grid * nfwd);
1680  for (casadi_int d = 0; d < nfwd; ++d) {
1681  for (casadi_int k = 0; k < n_grid; ++k) {
1682  ret_out_split.push_back(integrator_out_split.at((nfwd + 1) * k + d + 1));
1683  }
1684  }
1685  ret_out.push_back(horzcat(ret_out_split));
1686  }
1687 
1688  Dict options = opts;
1689  options["allow_duplicate_io_names"] = true;
1690  // The wrapper calls a non-codegenable integrator, which jits its own dependencies
1691  options["jit"] = false;
1692 
1693  // Create derivative function and return
1694  return Function(name, ret_in, ret_out, inames, onames, options);
1695 }
static MX sym(const std::string &name, casadi_int nrow=1, casadi_int ncol=1)
Create an nrow-by-ncol symbolic primitive.
casadi_int n_grid_out(casadi_int i) const
Number of grid points for which an output is repeated.
Definition: integrator.cpp:326
Dict augmented_options_
Augmented user option.
Function augmented_dae() const
Generate the augmented DAE system.
Definition: integrator.cpp:923
virtual Dict getDerivativeOptions(bool fwd) const
Set solver specific options to generated augmented integrators.
casadi_int n_grid_in(casadi_int i) const
Number of grid points for which an input is repeated: output times or columns of u.
Definition: integrator.cpp:312
std::vector< std::string > integrator_out()
Get the output scheme of integrators.
Definition: integrator.cpp:190
std::vector< std::string > integrator_in()
Get the input scheme of integrators.
Definition: integrator.cpp:184
Function integrator(const std::string &name, const std::string &solver, const SXDict &dae, const Dict &opts)
Definition: integrator.cpp:134

References casadi::Integrator::augmented_dae(), casadi::Integrator::augmented_options_, casadi::FunctionInternal::Function, casadi::Integrator::getDerivativeOptions(), casadi::integrator(), casadi::integrator_in(), casadi::INTEGRATOR_NUM_IN, casadi::INTEGRATOR_NUM_OUT, casadi::integrator_out(), casadi::Integrator::n_grid_in(), casadi::Integrator::n_grid_out(), casadi::Integrator::nadj_, casadi::ProtoFunction::name_, casadi::PluginInterface< Integrator >::plugin_name(), casadi::FunctionInternal::size1_in(), casadi::FunctionInternal::size1_out(), casadi::FunctionInternal::size2_out(), casadi::Function::size_in(), casadi::FunctionInternal::size_out(), casadi::FunctionInternal::sparsity_in(), casadi::str(), casadi::GenericMatrix< MX >::sym(), casadi::Integrator::t0_, casadi::Integrator::tout_, and casadi::ProtoFunction::verbose_.

◆ get_forward_dae()

template<typename MatType >
Function casadi::Integrator::get_forward_dae ( const std::string &  name) const
inherited

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

Definition at line 947 of file integrator.cpp.

947  {
948  if (verbose_) casadi_message(name_ + "::get_forward_dae");
949 
950  // Events not implemented
951  casadi_assert(ne_ == 0, "Event support not implemented for Integrator::augmented_dae");
952 
953  // Get input and output expressions
954  std::vector<MatType> arg = MatType::get_input(oracle_);
955  std::vector<MatType> res = oracle_(arg);
956 
957  // Symbolic expression for augmented DAE
958  std::vector<std::vector<MatType>> aug_in(DYN_NUM_IN);
959  for (casadi_int i = 0; i < DYN_NUM_IN; ++i) aug_in[i].push_back(arg.at(i));
960  std::vector<std::vector<MatType>> aug_out(DYN_NUM_OUT);
961  for (casadi_int i = 0; i < DYN_NUM_OUT; ++i) aug_out[i].push_back(res.at(i));
962 
963  // Zero of time dimension
964  MatType zero_t = MatType::zeros(oracle_.sparsity_in(DYN_T));
965 
966  // Augment aug_in with forward sensitivity seeds
967  std::vector<std::vector<MatType>> seed(nfwd_, std::vector<MatType>(DYN_NUM_IN));
968  for (casadi_int d = 0; d < nfwd_; ++d) {
969  // Create expressions for augmented states
970  std::string pref = "aug" + str(d) + "_";
971  for (casadi_int i = 0; i < DYN_NUM_IN; ++i) {
972  if (i == DYN_T) {
973  seed[d][i] = zero_t;
974  } else {
975  seed[d][i] = MatType::sym(pref + dyn_in(i), oracle_.sparsity_in(i));
976  }
977  }
978  // Save to augmented function inputs
979  for (casadi_int i = 0; i < DYN_NUM_IN; ++i) {
980  if (i != DYN_T) aug_in[i].push_back(seed[d][i]);
981  }
982  }
983 
984  // Calculate directional derivatives
985  std::vector<std::vector<MatType>> sens;
986  bool always_inline = oracle_.is_a("SXFunction") || oracle_.is_a("MXFunction");
987  oracle_->call_forward(arg, res, seed, sens, always_inline, false);
988 
989  // Augment aug_out with forward sensitivity equations
990  casadi_assert_dev(sens.size() == nfwd_);
991  for (casadi_int d = 0; d < nfwd_; ++d) {
992  casadi_assert_dev(sens[d].size() == DYN_NUM_OUT);
993  for (casadi_int i = 0; i < DYN_NUM_OUT; ++i) {
994  aug_out[i].push_back(project(sens[d][i], oracle_.sparsity_out(i)));
995  }
996  }
997 
998  // Concatenate arrays
999  for (casadi_int i = 0; i < DYN_NUM_IN; ++i) arg.at(i) = vertcat(aug_in[i]);
1000  for (casadi_int i = 0; i < DYN_NUM_OUT; ++i) res.at(i) = vertcat(aug_out[i]);
1001 
1002  // Convert to oracle function and return
1003  return Function(name, arg, res, dyn_in(), dyn_out());
1004 }
const Sparsity & sparsity_out(casadi_int ind) const
Get the sparsity pattern of an output, by index or name.
Definition: function.cpp:1183
const Sparsity & sparsity_in(casadi_int ind) const
Get the sparsity pattern of an input, by index or name.
Definition: function.cpp:1167
std::vector< std::string > dyn_out()
Get the output scheme of a DAE function.
Definition: integrator.cpp:236
std::vector< std::string > dyn_in()
Get the input scheme of a DAE function.
Definition: integrator.cpp:232

References casadi::FunctionInternal::call_forward(), casadi::dyn_in(), casadi::DYN_NUM_IN, casadi::DYN_NUM_OUT, casadi::dyn_out(), casadi::DYN_T, casadi::FunctionInternal::Function, casadi::Function::is_a(), casadi::ProtoFunction::name_, casadi::Integrator::ne_, casadi::Integrator::nfwd_, casadi::OracleFunction::oracle_, casadi::Function::sparsity_in(), casadi::Function::sparsity_out(), casadi::str(), and casadi::ProtoFunction::verbose_.

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

1136  {
1137  casadi_assert_dev(!has_free());
1138  return std::vector<std::string>();
1139  }
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::OracleFunction::get_function ( ) const
overridevirtualinherited

-1 Indicates irregularity

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

Reimplemented from casadi::FunctionInternal.

Definition at line 535 of file oracle_function.cpp.

535  {
536  std::vector<std::string> ret;
537  ret.reserve(all_functions_.size());
538  for (auto&& e : all_functions_) {
539  ret.push_back(e.first);
540  }
541  return ret;
542 }

References casadi::OracleFunction::all_functions_.

Referenced by casadi::Rootfinder::ad_forward(), casadi::Rootfinder::ad_reverse(), casadi::SundialsInterface::calc_daeB(), casadi::OracleFunction::calc_function(), casadi::SundialsInterface::calc_quadB(), casadi::OracleFunction::calc_sp_forward(), casadi::OracleFunction::calc_sp_reverse(), casadi::FastNewton::codegen_body(), casadi::Feasiblesqpmethod::codegen_body(), casadi::Sqpmethod::codegen_body(), casadi::Nlpsol::codegen_declarations(), casadi::MadmpecInterface::codegen_declarations(), casadi::FatropInterface::codegen_declarations(), casadi::IpoptInterface::codegen_declarations(), casadi::MadnlpInterface::codegen_declarations(), casadi::UnoInterface::codegen_declarations(), casadi::FastNewton::codegen_declarations(), casadi::Feasiblesqpmethod::codegen_declarations(), casadi::Sqpmethod::codegen_declarations(), casadi::Feasiblesqpmethod::codegen_feasibility_iterations(), casadi::Nlpsol::codegen_post_solve(), casadi::ConoptInterface::ConoptInterface(), casadi::FixedStepIntegrator::create_advanced(), casadi::OracleFunction::create_forward(), casadi::AlpaqaProblem::eval_hess_L(), casadi::AlpaqaProblem::eval_hess_ψ(), casadi::OracleFunction::finalize(), casadi::Nlpsol::get_forward(), casadi::OracleFunction::get_function(), casadi::AlpaqaProblem::get_hess_L_num_nonzeros(), casadi::AlpaqaProblem::get_hess_ψ_num_nonzeros(), casadi::Nlpsol::get_reverse(), casadi::FixedStepIntegrator::init(), casadi::ImplicitFixedStepIntegrator::init(), casadi::Blocksqp::init(), casadi::BonminInterface::init(), casadi::MadmpecInterface::init(), casadi::FatropInterface::init(), casadi::IpoptInterface::init(), casadi::MadnlpInterface::init(), casadi::SLEQPInterface::init(), casadi::SundialsInterface::init(), casadi::FastNewton::init(), casadi::Feasiblesqpmethod::init(), casadi::Sqpmethod::init(), casadi::RuntimeIntegrator::jump_function(), casadi::OracleFunction::monitored(), casadi::MadmpecInterface::set_ccopt_prob(), casadi::FatropInterface::set_fatrop_prob(), casadi::IpoptInterface::set_ipopt_prob(), casadi::MadnlpInterface::set_madnlp_prob(), casadi::RuntimeIntegrator::set_nominal_prob(), casadi::SundialsInterface::set_work(), casadi::Collocation::setup_step(), casadi::RungeKutta::setup_step(), casadi::Integrator::sp_jac_dae(), casadi::Integrator::sp_jac_rdae(), and casadi::FixedStepIntegrator::stepB().

◆ get_function() [2/2]

const Function & casadi::OracleFunction::get_function ( const std::string &  name) const
overridevirtualinherited

Reimplemented from casadi::FunctionInternal.

Definition at line 544 of file oracle_function.cpp.

544  {
545  auto it = all_functions_.find(name);
546  casadi_assert(it!=all_functions_.end(),
547  "No function \"" + name + "\" in " + name_ + ". " +
548  "Available functions: " + join(get_function()) + ".");
549  return it->second.f;
550 }

References casadi::OracleFunction::all_functions_, casadi::OracleFunction::get_function(), casadi::join(), and casadi::ProtoFunction::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 1993 of file function_internal.cpp.

1994  {
1995  if (symmetric) {
1996  casadi_assert(sparsity_out_[oind].is_dense(),
1997  "Symmetry exploitation in Jacobian assumes dense expression. "
1998  "A potential workaround is to apply densify().");
1999  }
2000  // Check if we are able to propagate dependencies through the function
2001  if (has_spfwd() || has_sprev()) {
2002  // Get weighting factor
2003  double w = sp_weight();
2004 
2005  // Skip generation, assume dense
2006  if (w == -1) return Sparsity();
2007 
2008  Sparsity sp;
2009  if (nnz_in(iind) > 3*bvec_size && nnz_out(oind) > 3*bvec_size &&
2011  if (symmetric) {
2012  sp = get_jac_sparsity_hierarchical_symm(oind, iind);
2013  } else {
2014  sp = get_jac_sparsity_hierarchical(oind, iind);
2015  }
2016  } else {
2017  // Number of nonzero inputs and outputs
2018  casadi_int nz_in = nnz_in(iind);
2019  casadi_int nz_out = nnz_out(oind);
2020 
2021  // Number of forward sweeps we must make
2022  casadi_int nsweep_fwd = nz_in/bvec_size;
2023  if (nz_in%bvec_size) nsweep_fwd++;
2024 
2025  // Number of adjoint sweeps we must make
2026  casadi_int nsweep_adj = nz_out/bvec_size;
2027  if (nz_out%bvec_size) nsweep_adj++;
2028 
2029  // Use forward mode?
2030  if (w*static_cast<double>(nsweep_fwd) <= (1-w)*static_cast<double>(nsweep_adj)) {
2031  sp = get_jac_sparsity_gen<true>(oind, iind);
2032  } else {
2033  sp = get_jac_sparsity_gen<false>(oind, iind);
2034  }
2035  }
2036  return sp;
2037  } else {
2038  // Not calculated
2039  return Sparsity();
2040  }
2041  }
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 1338 of file function_internal.cpp.

1338  {
1339  // Number of nonzero inputs and outputs
1340  casadi_int nz_in = nnz_in(iind);
1341  casadi_int nz_out = nnz_out(oind);
1342 
1343  // Evaluation buffers
1344  std::vector<typename JacSparsityTraits<fwd>::arg_t> arg(sz_arg(), nullptr);
1345  std::vector<bvec_t*> res(sz_res(), nullptr);
1346  std::vector<casadi_int> iw(sz_iw());
1347  std::vector<bvec_t> w(sz_w(), 0);
1348 
1349  // Seeds and sensitivities
1350  std::vector<bvec_t> seed(nz_in, 0);
1351  arg[iind] = get_ptr(seed);
1352  std::vector<bvec_t> sens(nz_out, 0);
1353  res[oind] = get_ptr(sens);
1354  if (!fwd) std::swap(seed, sens);
1355 
1356  // Number of forward sweeps we must make
1357  casadi_int nsweep = seed.size() / bvec_size;
1358  if (seed.size() % bvec_size) nsweep++;
1359 
1360  // Print
1361  if (verbose_) {
1362  casadi_message(str(nsweep) + std::string(fwd ? " forward" : " reverse") + " sweeps "
1363  "needed for " + str(seed.size()) + " directions");
1364  }
1365 
1366  // Progress
1367  casadi_int progress = -10;
1368 
1369  // Temporary vectors
1370  std::vector<casadi_int> jcol, jrow;
1371 
1372  // Loop over the variables, bvec_size variables at a time
1373  for (casadi_int s=0; s<nsweep; ++s) {
1374 
1375  // Print progress
1376  if (verbose_) {
1377  casadi_int progress_new = (s*100)/nsweep;
1378  // Print when entering a new decade
1379  if (progress_new / 10 > progress / 10) {
1380  progress = progress_new;
1381  casadi_message(str(progress) + " %");
1382  }
1383  }
1384 
1385  // Nonzero offset
1386  casadi_int offset = s*bvec_size;
1387 
1388  // Number of local seed directions
1389  casadi_int ndir_local = seed.size()-offset;
1390  ndir_local = std::min(static_cast<casadi_int>(bvec_size), ndir_local);
1391 
1392  for (casadi_int i=0; i<ndir_local; ++i) {
1393  seed[offset+i] |= bvec_t(1)<<i;
1394  }
1395 
1396  // Propagate the dependencies
1397  JacSparsityTraits<fwd>::sp(this, get_ptr(arg), get_ptr(res),
1398  get_ptr(iw), get_ptr(w), memory(0));
1399 
1400  // Loop over the nonzeros of the output
1401  for (casadi_int el=0; el<sens.size(); ++el) {
1402 
1403  // Get the sparsity sensitivity
1404  bvec_t spsens = sens[el];
1405 
1406  if (!fwd) {
1407  // Clear the sensitivities for the next sweep
1408  sens[el] = 0;
1409  }
1410 
1411  // If there is a dependency in any of the directions
1412  if (spsens!=0) {
1413 
1414  // Loop over seed directions
1415  for (casadi_int i=0; i<ndir_local; ++i) {
1416 
1417  // If dependents on the variable
1418  if ((bvec_t(1) << i) & spsens) {
1419  // Add to pattern
1420  jcol.push_back(el);
1421  jrow.push_back(i+offset);
1422  }
1423  }
1424  }
1425  }
1426 
1427  // Remove the seeds
1428  for (casadi_int i=0; i<ndir_local; ++i) {
1429  seed[offset+i] = 0;
1430  }
1431  }
1432 
1433  // Construct sparsity pattern and return
1434  if (!fwd) swap(jrow, jcol);
1435  Sparsity ret = Sparsity::triplet(nz_out, nz_in, jcol, jrow);
1436  if (verbose_) {
1437  casadi_message("Formed Jacobian sparsity pattern (dimension " + str(ret.size()) + ", "
1438  + str(ret.nnz()) + " (" + str(ret.density()) + " %) nonzeros.");
1439  }
1440  return ret;
1441  }
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 from the (row, col) index of every nonzero.
Definition: sparsity.cpp:1157

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

1678  {
1679  // Number of nonzero inputs
1680  casadi_int nz_in = nnz_in(iind);
1681 
1682  // Number of nonzero outputs
1683  casadi_int nz_out = nnz_out(oind);
1684 
1685  // Seeds and sensitivities
1686  std::vector<bvec_t> s_in(nz_in, 0);
1687  std::vector<bvec_t> s_out(nz_out, 0);
1688 
1689  // Evaluation buffers
1690  std::vector<const bvec_t*> arg_fwd(sz_arg(), nullptr);
1691  std::vector<bvec_t*> arg_adj(sz_arg(), nullptr);
1692  arg_fwd[iind] = arg_adj[iind] = get_ptr(s_in);
1693  std::vector<bvec_t*> res(sz_res(), nullptr);
1694  res[oind] = get_ptr(s_out);
1695  std::vector<casadi_int> iw(sz_iw());
1696  std::vector<bvec_t> w(sz_w());
1697 
1698  // Sparsity triplet accumulator
1699  std::vector<casadi_int> jcol, jrow;
1700 
1701  // Cols of the coarse blocks
1702  std::vector<casadi_int> coarse_col(2, 0); coarse_col[1] = nz_out;
1703  // Rows of the coarse blocks
1704  std::vector<casadi_int> coarse_row(2, 0); coarse_row[1] = nz_in;
1705 
1706  // Cols of the fine blocks
1707  std::vector<casadi_int> fine_col;
1708 
1709  // Rows of the fine blocks
1710  std::vector<casadi_int> fine_row;
1711 
1712  // In each iteration, subdivide each coarse block in this many fine blocks
1713  casadi_int subdivision = bvec_size;
1714 
1715  Sparsity r = Sparsity::dense(1, 1);
1716 
1717  // The size of a block
1718  casadi_int granularity_row = nz_in;
1719  casadi_int granularity_col = nz_out;
1720 
1721  bool use_fwd = true;
1722 
1723  casadi_int nsweeps = 0;
1724 
1725  bool hasrun = false;
1726 
1727  // Get weighting factor
1728  double sp_w = sp_weight();
1729 
1730  // Lookup table for bvec_t
1731  std::vector<bvec_t> bvec_lookup;
1732  bvec_lookup.reserve(bvec_size);
1733  for (casadi_int i=0;i<bvec_size;++i) {
1734  bvec_lookup.push_back(bvec_t(1) << i);
1735  }
1736 
1737  while (!hasrun || coarse_col.size()!=nz_out+1 || coarse_row.size()!=nz_in+1) {
1738  if (verbose_) {
1739  casadi_message("Block size: " + str(granularity_col) + " x " + str(granularity_row));
1740  }
1741 
1742  // Clear the sparsity triplet acccumulator
1743  jcol.clear();
1744  jrow.clear();
1745 
1746  // Clear the fine block structure
1747  fine_row.clear();
1748  fine_col.clear();
1749 
1750  // r transpose will be needed in the algorithm
1751  Sparsity rT = r.T();
1752 
1755  // Forward mode
1756  Sparsity D1 = rT.uni_coloring(r);
1757  // Adjoint mode
1758  Sparsity D2 = r.uni_coloring(rT);
1759  if (verbose_) {
1760  casadi_message("Coloring on " + str(r.dim()) + " (fwd seeps: " + str(D1.size2()) +
1761  " , adj sweeps: " + str(D2.size1()) + ")");
1762  }
1763 
1764  // Use whatever required less colors if we tried both (with preference to forward mode)
1765  double fwd_cost = static_cast<double>(use_fwd ? granularity_row : granularity_col) *
1766  sp_w*static_cast<double>(D1.size2());
1767  double adj_cost = static_cast<double>(use_fwd ? granularity_col : granularity_row) *
1768  (1-sp_w)*static_cast<double>(D2.size2());
1769  use_fwd = fwd_cost <= adj_cost;
1770  if (verbose_) {
1771  casadi_message(std::string(use_fwd ? "Forward" : "Reverse") + " mode chosen "
1772  "(fwd cost: " + str(fwd_cost) + ", adj cost: " + str(adj_cost) + ")");
1773  }
1774 
1775  // Get seeds and sensitivities
1776  bvec_t* seed_v = use_fwd ? get_ptr(s_in) : get_ptr(s_out);
1777  bvec_t* sens_v = use_fwd ? get_ptr(s_out) : get_ptr(s_in);
1778 
1779  // The number of zeros in the seed and sensitivity directions
1780  casadi_int nz_seed = use_fwd ? nz_in : nz_out;
1781  casadi_int nz_sens = use_fwd ? nz_out : nz_in;
1782 
1783  // Clear the seeds
1784  for (casadi_int i=0; i<nz_seed; ++i) seed_v[i]=0;
1785 
1786  // Choose the active jacobian coloring scheme
1787  Sparsity D = use_fwd ? D1 : D2;
1788 
1789  // Adjoint mode amounts to swapping
1790  if (!use_fwd) {
1791  std::swap(coarse_col, coarse_row);
1792  std::swap(granularity_col, granularity_row);
1793  std::swap(r, rT);
1794  }
1795 
1796  // Subdivide the coarse block cols
1797  for (casadi_int k=0;k<coarse_col.size()-1;++k) {
1798  casadi_int diff = coarse_col[k+1]-coarse_col[k];
1799  casadi_int new_diff = diff/subdivision;
1800  if (diff%subdivision>0) new_diff++;
1801  std::vector<casadi_int> temp = range(coarse_col[k], coarse_col[k+1], new_diff);
1802  fine_col.insert(fine_col.end(), temp.begin(), temp.end());
1803  }
1804  // Subdivide the coarse block rows
1805  for (casadi_int k=0;k<coarse_row.size()-1;++k) {
1806  casadi_int diff = coarse_row[k+1]-coarse_row[k];
1807  casadi_int new_diff = diff/subdivision;
1808  if (diff%subdivision>0) new_diff++;
1809  std::vector<casadi_int> temp = range(coarse_row[k], coarse_row[k+1], new_diff);
1810  fine_row.insert(fine_row.end(), temp.begin(), temp.end());
1811  }
1812  if (fine_row.back()!=coarse_row.back()) fine_row.push_back(coarse_row.back());
1813  if (fine_col.back()!=coarse_col.back()) fine_col.push_back(coarse_col.back());
1814 
1815  granularity_col = fine_col[1] - fine_col[0];
1816  granularity_row = fine_row[1] - fine_row[0];
1817 
1818  // The index into the bvec bit vector
1819  casadi_int bvec_i = 0;
1820 
1821  // Create lookup tables for the fine blocks
1822  std::vector<casadi_int> fine_col_lookup = lookupvector(fine_col, nz_sens+1);
1823  std::vector<casadi_int> fine_row_lookup = lookupvector(fine_row, nz_seed+1);
1824 
1825  // Triplet data used as a lookup table
1826  std::vector<casadi_int> lookup_col;
1827  std::vector<casadi_int> lookup_row;
1828  std::vector<casadi_int> lookup_value;
1829 
1830 
1831  // The maximum number of fine blocks contained in one coarse block
1832  casadi_int n_fine_blocks_max = 0;
1833  for (casadi_int i=0;i<coarse_row.size()-1;++i) {
1834  casadi_int del = fine_row_lookup[coarse_row[i+1]]-fine_row_lookup[coarse_row[i]];
1835  n_fine_blocks_max = std::max(n_fine_blocks_max, del);
1836  }
1837 
1838  // Loop over all coarse seed directions from the coloring
1839  for (casadi_int csd=0; csd<D.size2(); ++csd) {
1840 
1841  casadi_int fci_offset = 0;
1842  casadi_int fci_cap = bvec_size-bvec_i;
1843 
1844  // Flag to indicate if all fine blocks have been handled
1845  bool f_finished = false;
1846 
1847  // Loop while not finished
1848  while (!f_finished) {
1849 
1850  // Loop over all coarse rows that are found in the coloring for this coarse seed direction
1851  for (casadi_int k=D.colind(csd); k<D.colind(csd+1); ++k) {
1852  casadi_int cci = D.row(k);
1853 
1854  // The first and last rows of the fine block
1855  casadi_int fci_start = fine_row_lookup[coarse_row[cci]];
1856  casadi_int fci_end = fine_row_lookup[coarse_row[cci+1]];
1857 
1858  // Local counter that modifies index into bvec
1859  casadi_int bvec_i_mod = 0;
1860 
1861  casadi_int value = -bvec_i + fci_offset + fci_start;
1862 
1863  // Loop over the rows of the fine block
1864  for (casadi_int fci = fci_offset; fci < std::min(fci_end-fci_start, fci_cap); ++fci) {
1865 
1866  // Loop over the coarse block cols that appear in the coloring
1867  // for the current coarse seed direction
1868  for (casadi_int cri=rT.colind(cci);cri<rT.colind(cci+1);++cri) {
1869  lookup_col.push_back(rT.row(cri));
1870  lookup_row.push_back(bvec_i+bvec_i_mod);
1871  lookup_value.push_back(value);
1872  }
1873 
1874  // Toggle on seeds
1875  bvec_toggle(seed_v, fine_row[fci+fci_start], fine_row[fci+fci_start+1],
1876  bvec_i+bvec_i_mod);
1877  bvec_i_mod++;
1878  }
1879  }
1880 
1881  // Bump bvec_i for next major coarse direction
1882  bvec_i+= std::min(n_fine_blocks_max, fci_cap);
1883 
1884  // Check if bvec buffer is full
1885  if (bvec_i==bvec_size || csd==D.size2()-1) {
1886  // Calculate sparsity for bvec_size directions at once
1887 
1888  // Statistics
1889  nsweeps+=1;
1890 
1891  // Construct lookup table
1892  IM lookup = IM::triplet(lookup_row, lookup_col, lookup_value, bvec_size,
1893  coarse_col.size());
1894 
1895  // Propagate the dependencies
1896  if (use_fwd) {
1897  JacSparsityTraits<true>::sp(this, get_ptr(arg_fwd), get_ptr(res),
1898  get_ptr(iw), get_ptr(w), memory(0));
1899  } else {
1900  std::fill(w.begin(), w.end(), 0);
1901  JacSparsityTraits<false>::sp(this, get_ptr(arg_adj), get_ptr(res),
1902  get_ptr(iw), get_ptr(w), memory(0));
1903  }
1904 
1905  // Temporary bit work vector
1906  bvec_t spsens;
1907 
1908  // Loop over the cols of coarse blocks
1909  for (casadi_int cri=0;cri<coarse_col.size()-1;++cri) {
1910 
1911  // Loop over the cols of fine blocks within the current coarse block
1912  for (casadi_int fri=fine_col_lookup[coarse_col[cri]];
1913  fri<fine_col_lookup[coarse_col[cri+1]];++fri) {
1914  // Lump individual sensitivities together into fine block
1915  bvec_or(sens_v, spsens, fine_col[fri], fine_col[fri+1]);
1916 
1917  // Next iteration if no sparsity
1918  if (!spsens) continue;
1919 
1920  // Loop over all bvec_bits
1921  for (casadi_int bvec_i=0;bvec_i<bvec_size;++bvec_i) {
1922  if (spsens & bvec_lookup[bvec_i]) {
1923  // if dependency is found, add it to the new sparsity pattern
1924  casadi_int ind = lookup.sparsity().get_nz(bvec_i, cri);
1925  if (ind==-1) continue;
1926  jrow.push_back(bvec_i+lookup->at(ind));
1927  jcol.push_back(fri);
1928  }
1929  }
1930  }
1931  }
1932 
1933  // Clear the forward seeds/adjoint sensitivities, ready for next bvec sweep
1934  std::fill(s_in.begin(), s_in.end(), 0);
1935 
1936  // Clear the adjoint seeds/forward sensitivities, ready for next bvec sweep
1937  std::fill(s_out.begin(), s_out.end(), 0);
1938 
1939  // Clean lookup table
1940  lookup_col.clear();
1941  lookup_row.clear();
1942  lookup_value.clear();
1943  }
1944 
1945  if (n_fine_blocks_max>fci_cap) {
1946  fci_offset += std::min(n_fine_blocks_max, fci_cap);
1947  bvec_i = 0;
1948  fci_cap = bvec_size;
1949  } else {
1950  f_finished = true;
1951  }
1952 
1953  }
1954 
1955  }
1956 
1957  // Swap results if adjoint mode was used
1958  if (use_fwd) {
1959  // Construct fine sparsity pattern
1960  r = Sparsity::triplet(fine_row.size()-1, fine_col.size()-1, jrow, jcol);
1961  coarse_col = fine_col;
1962  coarse_row = fine_row;
1963  } else {
1964  // Construct fine sparsity pattern
1965  r = Sparsity::triplet(fine_col.size()-1, fine_row.size()-1, jcol, jrow);
1966  coarse_col = fine_row;
1967  coarse_row = fine_col;
1968  }
1969  hasrun = true;
1970  }
1971  if (verbose_) {
1972  casadi_message("Number of sweeps: " + str(nsweeps));
1973  casadi_message("Formed Jacobian sparsity pattern (dimension " + str(r.size()) + ", " +
1974  str(r.nnz()) + " (" + str(r.density()) + " %) nonzeros.");
1975  }
1976 
1977  return r.T();
1978  }
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 (row indices, column indices, values)
static Sparsity dense(casadi_int nrow, casadi_int ncol=1)
Create a dense rectangular sparsity pattern.
Definition: sparsity.cpp:1041
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 1443 of file function_internal.cpp.

1444  {
1445  casadi_assert_dev(has_spfwd());
1446 
1447  // Number of nonzero inputs
1448  casadi_int nz = nnz_in(iind);
1449  casadi_assert_dev(nz==nnz_out(oind));
1450 
1451  // Evaluation buffers
1452  std::vector<const bvec_t*> arg(sz_arg(), nullptr);
1453  std::vector<bvec_t*> res(sz_res(), nullptr);
1454  std::vector<casadi_int> iw(sz_iw());
1455  std::vector<bvec_t> w(sz_w());
1456 
1457  // Seeds
1458  std::vector<bvec_t> seed(nz, 0);
1459  arg[iind] = get_ptr(seed);
1460 
1461  // Sensitivities
1462  std::vector<bvec_t> sens(nz, 0);
1463  res[oind] = get_ptr(sens);
1464 
1465  // Sparsity triplet accumulator
1466  std::vector<casadi_int> jcol, jrow;
1467 
1468  // Cols/rows of the coarse blocks
1469  std::vector<casadi_int> coarse(2, 0); coarse[1] = nz;
1470 
1471  // Cols/rows of the fine blocks
1472  std::vector<casadi_int> fine;
1473 
1474  // In each iteration, subdivide each coarse block in this many fine blocks
1475  casadi_int subdivision = bvec_size;
1476 
1477  Sparsity r = Sparsity::dense(1, 1);
1478 
1479  // The size of a block
1480  casadi_int granularity = nz;
1481 
1482  casadi_int nsweeps = 0;
1483 
1484  bool hasrun = false;
1485 
1486  while (!hasrun || coarse.size()!=nz+1) {
1487  if (verbose_) casadi_message("Block size: " + str(granularity));
1488 
1489  // Clear the sparsity triplet acccumulator
1490  jcol.clear();
1491  jrow.clear();
1492 
1493  // Clear the fine block structure
1494  fine.clear();
1495 
1496  Sparsity D = r.star_coloring();
1497 
1498  if (verbose_) {
1499  casadi_message("Star coloring on " + str(r.dim()) + ": "
1500  + str(D.size2()) + " <-> " + str(D.size1()));
1501  }
1502 
1503  // Clear the seeds
1504  std::fill(seed.begin(), seed.end(), 0);
1505 
1506  // Subdivide the coarse block
1507  for (casadi_int k=0; k<coarse.size()-1; ++k) {
1508  casadi_int diff = coarse[k+1]-coarse[k];
1509  casadi_int new_diff = diff/subdivision;
1510  if (diff%subdivision>0) new_diff++;
1511  std::vector<casadi_int> temp = range(coarse[k], coarse[k+1], new_diff);
1512  fine.insert(fine.end(), temp.begin(), temp.end());
1513  }
1514  if (fine.back()!=coarse.back()) fine.push_back(coarse.back());
1515 
1516  granularity = fine[1] - fine[0];
1517 
1518  // The index into the bvec bit vector
1519  casadi_int bvec_i = 0;
1520 
1521  // Create lookup tables for the fine blocks
1522  std::vector<casadi_int> fine_lookup = lookupvector(fine, nz+1);
1523 
1524  // Triplet data used as a lookup table
1525  std::vector<casadi_int> lookup_col;
1526  std::vector<casadi_int> lookup_row;
1527  std::vector<casadi_int> lookup_value;
1528 
1529  // The maximum number of fine blocks contained in one coarse block
1530  casadi_int n_fine_blocks_max = 0;
1531  for (casadi_int i=0;i<coarse.size()-1;++i) {
1532  casadi_int del = fine_lookup[coarse[i+1]]-fine_lookup[coarse[i]];
1533  n_fine_blocks_max = std::max(n_fine_blocks_max, del);
1534  }
1535 
1536  // Loop over all coarse seed directions from the coloring
1537  for (casadi_int csd=0; csd<D.size2(); ++csd) {
1538 
1539 
1540  casadi_int fci_offset = 0;
1541  casadi_int fci_cap = bvec_size-bvec_i;
1542 
1543  // Flag to indicate if all fine blocks have been handled
1544  bool f_finished = false;
1545 
1546  // Loop while not finished
1547  while (!f_finished) {
1548 
1549  // Loop over all coarse rows that are found in the coloring for this coarse seed direction
1550  for (casadi_int k=D.colind(csd); k<D.colind(csd+1); ++k) {
1551  casadi_int cci = D.row(k);
1552 
1553  // The first and last rows of the fine block
1554  casadi_int fci_start = fine_lookup[coarse[cci]];
1555  casadi_int fci_end = fine_lookup[coarse[cci+1]];
1556 
1557  // Local counter that modifies index into bvec
1558  casadi_int bvec_i_mod = 0;
1559 
1560  casadi_int value = -bvec_i + fci_offset + fci_start;
1561 
1562  //casadi_assert_dev(value>=0);
1563 
1564  // Loop over the rows of the fine block
1565  for (casadi_int fci = fci_offset; fci<std::min(fci_end-fci_start, fci_cap); ++fci) {
1566 
1567  // Loop over the coarse block cols that appear in the
1568  // coloring for the current coarse seed direction
1569  for (casadi_int cri=r.colind(cci);cri<r.colind(cci+1);++cri) {
1570  lookup_col.push_back(r.row(cri));
1571  lookup_row.push_back(bvec_i+bvec_i_mod);
1572  lookup_value.push_back(value);
1573  }
1574 
1575  // Toggle on seeds
1576  bvec_toggle(get_ptr(seed), fine[fci+fci_start], fine[fci+fci_start+1],
1577  bvec_i+bvec_i_mod);
1578  bvec_i_mod++;
1579  }
1580  }
1581 
1582  // Bump bvec_i for next major coarse direction
1583  bvec_i += std::min(n_fine_blocks_max, fci_cap);
1584 
1585  // Check if bvec buffer is full
1586  if (bvec_i==bvec_size || csd==D.size2()-1) {
1587  // Calculate sparsity for bvec_size directions at once
1588 
1589  // Statistics
1590  nsweeps+=1;
1591 
1592  // Construct lookup table
1593  IM lookup = IM::triplet(lookup_row, lookup_col, lookup_value,
1594  bvec_size, coarse.size());
1595 
1596  std::reverse(lookup_col.begin(), lookup_col.end());
1597  std::reverse(lookup_row.begin(), lookup_row.end());
1598  std::reverse(lookup_value.begin(), lookup_value.end());
1599  IM duplicates =
1600  IM::triplet(lookup_row, lookup_col, lookup_value, bvec_size, coarse.size())
1601  - lookup;
1602  duplicates = sparsify(duplicates);
1603  lookup(duplicates.sparsity()) = -bvec_size;
1604 
1605  // Propagate the dependencies
1606  JacSparsityTraits<true>::sp(this, get_ptr(arg), get_ptr(res),
1607  get_ptr(iw), get_ptr(w), nullptr);
1608 
1609  // Temporary bit work vector
1610  bvec_t spsens;
1611 
1612  // Loop over the cols of coarse blocks
1613  for (casadi_int cri=0; cri<coarse.size()-1; ++cri) {
1614 
1615  // Loop over the cols of fine blocks within the current coarse block
1616  for (casadi_int fri=fine_lookup[coarse[cri]];fri<fine_lookup[coarse[cri+1]];++fri) {
1617  // Lump individual sensitivities together into fine block
1618  bvec_or(get_ptr(sens), spsens, fine[fri], fine[fri+1]);
1619 
1620  // Loop over all bvec_bits
1621  for (casadi_int bvec_i=0;bvec_i<bvec_size;++bvec_i) {
1622  if (spsens & (bvec_t(1) << bvec_i)) {
1623  // if dependency is found, add it to the new sparsity pattern
1624  casadi_int ind = lookup.sparsity().get_nz(bvec_i, cri);
1625  if (ind==-1) continue;
1626  casadi_int lk = lookup->at(ind);
1627  if (lk>-bvec_size) {
1628  jrow.push_back(bvec_i+lk);
1629  jcol.push_back(fri);
1630  jrow.push_back(fri);
1631  jcol.push_back(bvec_i+lk);
1632  }
1633  }
1634  }
1635  }
1636  }
1637 
1638  // Clear the forward seeds/adjoint sensitivities, ready for next bvec sweep
1639  std::fill(seed.begin(), seed.end(), 0);
1640 
1641  // Clean lookup table
1642  lookup_col.clear();
1643  lookup_row.clear();
1644  lookup_value.clear();
1645  }
1646 
1647  if (n_fine_blocks_max>fci_cap) {
1648  fci_offset += std::min(n_fine_blocks_max, fci_cap);
1649  bvec_i = 0;
1650  fci_cap = bvec_size;
1651  } else {
1652  f_finished = true;
1653  }
1654  }
1655  }
1656 
1657  // Construct fine sparsity pattern
1658  r = Sparsity::triplet(fine.size()-1, fine.size()-1, jrow, jcol);
1659 
1660  // There may be false positives here that are not present
1661  // in the reverse mode that precedes it.
1662  // This can lead to an assymetrical result
1663  // cf. #1522
1664  r=r*r.T();
1665 
1666  coarse = fine;
1667  hasrun = true;
1668  }
1669  if (verbose_) {
1670  casadi_message("Number of sweeps: " + str(nsweeps));
1671  casadi_message("Formed Jacobian sparsity pattern (dimension " + str(r.size()) +
1672  ", " + str(r.nnz()) + " (" + str(r.density()) + " %) nonzeros.");
1673  }
1674 
1675  return r.T();
1676  }

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

std::string casadi::FunctionInternal::get_jit_directory ( const Dict &  jit_options)
staticinherited

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

Definition at line 717 of file function_internal.cpp.

717  {
718  // Start with default temp work dir
719  std::string jit_directory = GlobalOptions::getTempWorkDir();
720 
721  // Get user-specified directory
722  std::string directory;
723  directory = get_from_dict(jit_options, "directory", std::string(""));
724 
725  // What if directory itself is absolute?
726  if (Filesystem::is_absolute(directory)) {
727  // Override
728  jit_directory = directory;
729  } else {
730  jit_directory = jit_directory + directory;
731  if (Filesystem::is_enabled()) {
732  jit_directory = Filesystem::absolute(jit_directory);
733  }
734  }
735 
736  return Filesystem::ensure_trailing_slash(jit_directory);
737  }
static std::string absolute(const std::string &path)
Definition: filesystem.cpp:78
static bool is_absolute(const std::string &path)
Definition: filesystem.cpp:162
static std::string ensure_trailing_slash(const std::string &path)
Definition: filesystem.cpp:155
static bool is_enabled()
Definition: filesystem.cpp:83
static std::string getTempWorkDir()
T get_from_dict(const std::map< std::string, T > &d, const std::string &key, const T &default_value)

References casadi::Filesystem::absolute(), casadi::Filesystem::ensure_trailing_slash(), casadi::get_from_dict(), casadi::GlobalOptions::getTempWorkDir(), casadi::Filesystem::is_absolute(), and casadi::Filesystem::is_enabled().

Referenced by casadi::FunctionInternal::finalize(), and casadi::ShellCompiler::init().

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

1106  {
1107  return inf;
1108  }
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 1113 of file function_internal.hpp.

1113  {
1114  return -inf;
1115  }

References casadi::inf.

◆ get_n_in()

size_t casadi::Integrator::get_n_in ( )
inlineoverridevirtualinherited

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

Reimplemented from casadi::FunctionInternal.

Definition at line 115 of file integrator_impl.hpp.

115 { return INTEGRATOR_NUM_IN;}

References casadi::INTEGRATOR_NUM_IN.

◆ get_n_out()

size_t casadi::Integrator::get_n_out ( )
inlineoverridevirtualinherited

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

Reimplemented from casadi::FunctionInternal.

Definition at line 116 of file integrator_impl.hpp.

116 { return INTEGRATOR_NUM_OUT;}

References casadi::INTEGRATOR_NUM_OUT.

◆ get_name_in()

std::string casadi::Integrator::get_name_in ( casadi_int  i)
inlineoverridevirtualinherited

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

Reimplemented from casadi::FunctionInternal.

Definition at line 131 of file integrator_impl.hpp.

131 { return integrator_in(i);}

References casadi::integrator_in().

◆ get_name_out()

std::string casadi::Integrator::get_name_out ( casadi_int  i)
inlineoverridevirtualinherited

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

Reimplemented from casadi::FunctionInternal.

Definition at line 132 of file integrator_impl.hpp.

132 { return integrator_out(i);}

References casadi::integrator_out().

◆ get_nominal_in()

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

Reimplemented in casadi::FmuFunction.

Definition at line 1117 of file function_internal.hpp.

1117  {
1118  return std::vector<double>(nnz_in(ind), 1.);
1119  }

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

1121  {
1122  return std::vector<double>(nnz_out(ind), 1.);
1123  }

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

◆ get_options()

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

Reimplemented from casadi::RuntimeIntegrator.

Definition at line 94 of file rosenbrock.hpp.

94 { return options_;}
static const Options options_
Options.
Definition: rosenbrock.hpp:93

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

2135  {
2136  if (verbose_) casadi_message(name_ + "::get_partition");
2137  casadi_assert(allow_forward || allow_reverse, "Inconsistent options");
2138 
2139  // Sparsity pattern with transpose
2140  Sparsity &AT = jac_sparsity(oind, iind, compact, symmetric);
2141  Sparsity A = symmetric ? AT : AT.T();
2142 
2143  // Get seed matrices by graph coloring
2144  if (symmetric) {
2145  casadi_assert_dev(enable_forward_ || enable_fd_);
2146  casadi_assert_dev(allow_forward);
2147 
2148  // Star coloring if symmetric
2149  if (verbose_) casadi_message("FunctionInternal::getPartition star_coloring");
2150  D1 = A.star_coloring();
2151  if (verbose_) {
2152  casadi_message("Star coloring completed: " + str(D1.size2())
2153  + " directional derivatives needed ("
2154  + str(A.size1()) + " without coloring).");
2155  }
2156 
2157  } else {
2158  casadi_assert_dev(enable_forward_ || enable_fd_ || enable_reverse_);
2159  // Get weighting factor
2160  double w = ad_weight();
2161 
2162  // Which AD mode?
2163  if (w==1) allow_forward = false;
2164  if (w==0) allow_reverse = false;
2165  casadi_assert(allow_forward || allow_reverse, "Conflicting ad weights");
2166 
2167  // Best coloring encountered so far (relatively tight upper bound)
2168  double best_coloring = std::numeric_limits<double>::infinity();
2169 
2170  // Test forward mode first?
2171  bool test_fwd_first = allow_forward && w*static_cast<double>(A.size1()) <=
2172  (1-w)*static_cast<double>(A.size2());
2173  casadi_int mode_fwd = test_fwd_first ? 0 : 1;
2174 
2175  // Test both coloring modes
2176  for (casadi_int mode=0; mode<2; ++mode) {
2177  // Is this the forward mode?
2178  bool fwd = mode==mode_fwd;
2179 
2180  // Skip?
2181  if (!allow_forward && fwd) continue;
2182  if (!allow_reverse && !fwd) continue;
2183 
2184  // Perform the coloring
2185  if (fwd) {
2186  if (verbose_) casadi_message("Unidirectional coloring (forward mode)");
2187  bool d = best_coloring>=w*static_cast<double>(A.size1());
2188  casadi_int max_colorings_to_test =
2189  d ? A.size1() : static_cast<casadi_int>(floor(best_coloring/w));
2190  D1 = AT.uni_coloring(A, max_colorings_to_test);
2191  if (D1.is_null()) {
2192  if (verbose_) {
2193  casadi_message("Forward mode coloring interrupted (more than "
2194  + str(max_colorings_to_test) + " needed).");
2195  }
2196  } else {
2197  if (verbose_) {
2198  casadi_message("Forward mode coloring completed: "
2199  + str(D1.size2()) + " directional derivatives needed ("
2200  + str(A.size1()) + " without coloring).");
2201  }
2202  D2 = Sparsity();
2203  best_coloring = w*static_cast<double>(D1.size2());
2204  }
2205  } else {
2206  if (verbose_) casadi_message("Unidirectional coloring (adjoint mode)");
2207  bool d = best_coloring>=(1-w)*static_cast<double>(A.size2());
2208  casadi_int max_colorings_to_test =
2209  d ? A.size2() : static_cast<casadi_int>(floor(best_coloring/(1-w)));
2210 
2211  D2 = A.uni_coloring(AT, max_colorings_to_test);
2212  if (D2.is_null()) {
2213  if (verbose_) {
2214  casadi_message("Adjoint mode coloring interrupted (more than "
2215  + str(max_colorings_to_test) + " needed).");
2216  }
2217  } else {
2218  if (verbose_) {
2219  casadi_message("Adjoint mode coloring completed: "
2220  + str(D2.size2()) + " directional derivatives needed ("
2221  + str(A.size2()) + " without coloring).");
2222  }
2223  D1 = Sparsity();
2224  best_coloring = (1-w)*static_cast<double>(D2.size2());
2225  }
2226  }
2227  }
2228 
2229  }
2230  }
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_q()

void casadi::Integrator::get_q ( IntegratorMemory *  m,
double *  q 
) const
inherited

Definition at line 2620 of file integrator.cpp.

2620  {
2621  casadi_copy(m->q, nq_, q);
2622 }

References casadi::casadi_copy(), casadi::Integrator::nq_, and casadi::IntegratorMemory::q.

Referenced by casadi::Integrator::eval(), and casadi::RuntimeIntegrator::eval().

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

1128  {
1129  return eps;
1130  }

References casadi::eps.

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

◆ get_reverse()

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

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

Reimplemented from casadi::FunctionInternal.

Definition at line 1697 of file integrator.cpp.

1700  {
1701  if (verbose_) casadi_message(name_ + "::get_reverse");
1702 
1703  // Events not implemented by all plugins
1704  casadi_assert(has_reverse(nadj), "Event support not implemented for Integrator::get_reverse");
1705 
1706  // Integrator options
1707  Dict aug_opts = getDerivativeOptions(false);
1708  for (auto&& i : augmented_options_) {
1709  aug_opts[i.first] = i.second;
1710  }
1711 
1712  // Get the current oracle, augmented with any existing forward sensitivity equations
1713  Function this_dae = augmented_dae();
1714 
1715  // With a backward problem, reformulate as forward-over-reverse: one forward direction
1716  // (d, a) for each adjoint seed d and adjoint direction a of this integrator
1717  casadi_int na = nrx_ == 0 ? 1 : nadj_;
1718  casadi_assert(na == 1 || nfwd_ == 0, "Reverse mode of forward sensitivities of an integrator "
1719  "with several adjoint directions is not implemented");
1720 
1721  // Create integrator for augmented DAE
1722  std::string aug_prefix = "asens" + str(nadj) + "_";
1723  aug_opts["derivative_of"] = self();
1724  if (nrx_ == 0) {
1725  // Add backward problem
1726  aug_opts["nadj"] = nadj;
1727  aug_opts["nfwd"] = 0;
1728  } else {
1729  // Reformulate as forward-over-reverse
1730  aug_opts["nfwd"] = nadj * na;
1731  aug_opts["nadj"] = nadj_;
1732  }
1733  Function aug_int = integrator(aug_prefix + name_, plugin_name(),
1734  this_dae, t0_, tout_, aug_opts);
1735 
1736  // All inputs of the return function
1737  std::vector<MX> ret_in;
1739 
1740  // Add nondifferentiated inputs to ret_in
1741  for (casadi_int i = 0; i < INTEGRATOR_NUM_IN; ++i) {
1742  ret_in.push_back(MX::sym(integrator_in(i), sparsity_in(i)));
1743  }
1744 
1745  // Add nondifferentiated outputs (unused) to ret_in
1746  for (casadi_int i = 0; i < INTEGRATOR_NUM_OUT; ++i) {
1747  ret_in.push_back(MX::sym("out_" + integrator_out(i), Sparsity(size_out(i))));
1748  }
1749 
1750  // Create symbolic expressions for augmented problem, add adjoint seeds to ret_in
1751  std::vector<std::vector<MX>> aug_in(INTEGRATOR_NUM_OUT);
1752  std::vector<MX> v(nadj);
1753  for (casadi_int i = 0; i < INTEGRATOR_NUM_OUT; ++i) {
1754  for (casadi_int d=0; d<nadj; ++d) {
1755  v[d] = MX::sym("adj" + str(d) + "_" + integrator_out(i), sparsity_out(i));
1756  aug_in[i].push_back(v[d]);
1757  }
1758  ret_in.push_back(horzcat(v));
1759  }
1760 
1761  // Call the augmented integrator
1762  std::vector<MX> integrator_in(INTEGRATOR_NUM_IN);
1763  for (casadi_int i = 0; i < INTEGRATOR_NUM_IN; ++i) {
1764  // Output index contributing to adjoint seeds
1765  casadi_int j = adjmap_out(i);
1766  // Number of grid points for this integrator input
1767  casadi_int n_grid = n_grid_in(i);
1768  // Split input and seeds by grid points, if necessary
1769  std::vector<MX> ret_in_split;
1770  std::vector<std::vector<MX>> aug_in_split(nadj);
1771  if (n_grid > 1) {
1772  // Split nondifferentiated input by grid point; it is empty without a backward problem,
1773  // but the seeds still need to be ordered by grid point
1774  ret_in_split = ret_in[i].size2() > 0 ? horzsplit_n(ret_in[i], n_grid)
1775  : std::vector<MX>(n_grid, MX(size1_in(i), 0));
1776  // Split augmented input by grid point
1777  for (casadi_int d = 0; d < nadj; ++d) {
1778  aug_in_split[d] = horzsplit_n(aug_in[j][d], n_grid);
1779  }
1780  } else {
1781  // No reordering necessary
1782  ret_in_split = {ret_in[i]};
1783  for (casadi_int d = 0; d < nadj; ++d) aug_in_split[d] = {aug_in[j][d]};
1784  }
1785  // Vectorize all inputs to allow concatenation (unlike forward sensitivities,
1786  // number of rows for sensitivities may be different from original inputs)
1787  for (auto&& e : ret_in_split) e = vec(e);
1788  for (auto&& e1 : aug_in_split) {
1789  for (auto&& e2 : e1) e2 = vec(e2);
1790  }
1791  // Assemble input argument
1792  v.clear();
1793  for (casadi_int k = 0; k < ret_in_split.size(); ++k) {
1794  v.push_back(ret_in_split.at(k));
1795  for (casadi_int d = 0; d < nadj; ++d) {
1796  if (na == 1) {
1797  v.push_back(aug_in_split[d].at(k));
1798  } else if (i < INTEGRATOR_ADJ_XF) {
1799  // Seed of an adjoint output: direction (d, a) gets the part of adjoint direction a
1800  for (const MX& e : vertsplit_n(aug_in_split[d].at(k), na)) v.push_back(e);
1801  } else {
1802  // Seed of a forward output: first adjoint direction of (d, 0) only, counted once
1803  casadi_int n = numel_in(i) / n_grid, n_seed = aug_in_split[d].at(k).numel();
1804  v.push_back(vertcat(aug_in_split[d].at(k), MX(n - n_seed, 1)));
1805  for (casadi_int a = 1; a < na; ++a) v.push_back(MX(n, 1));
1806  }
1807  }
1808  }
1809  integrator_in[i] = reshape(vertcat(v), aug_int.size_in(i));
1810  }
1811  std::vector<MX> integrator_out = aug_int(integrator_in);
1812 
1813  // Collect adjoint sensitivites
1814  std::vector<MX> ret_out;
1815  ret_out.reserve(INTEGRATOR_NUM_IN);
1816  for (casadi_int i = 0; i < INTEGRATOR_NUM_IN; ++i) {
1817  casadi_int j = adjmap_out(i);
1818  // Split return by grid points and sensitivities
1819  casadi_int n_grid = n_grid_out(j);
1820  casadi_int n_dir = nadj * na, n_block = (na == 1 ? numel_in(i) : numel_out(j)) / n_grid;
1821  std::vector<casadi_int> offset = {0};
1822  for (casadi_int k = 0; k < n_grid; ++k) {
1823  offset.push_back(offset.back() + numel_out(j) / n_grid);
1824  for (casadi_int d = 0; d < n_dir; ++d) {
1825  offset.push_back(offset.back() + n_block);
1826  }
1827  }
1828  std::vector<MX> integrator_out_split = vertsplit(vec(integrator_out[j]), offset);
1829  // Collect sensitivity blocks in the right order
1830  std::vector<MX> ret_out_split;
1831  ret_out_split.reserve(n_grid * nadj);
1832  for (casadi_int d = 0; d < nadj; ++d) {
1833  for (casadi_int k = 0; k < n_grid; ++k) {
1834  // Block of direction (d, a)
1835  auto block = [&](casadi_int a) -> MX {
1836  return integrator_out_split.at((n_dir + 1) * k + d * na + a + 1);
1837  };
1838  MX s;
1839  if (na == 1) {
1840  s = block(0);
1841  } else if (i < INTEGRATOR_ADJ_XF) {
1842  // Adjoint output: sum of the parts of adjoint direction a over directions (d, a)
1843  s = MX(numel_in(i) / n_grid, 1);
1844  for (casadi_int a = 0; a < na; ++a) s += vertsplit_n(block(a), na).at(a);
1845  } else {
1846  // Forward output: direction (d, a) gives the part of adjoint direction a
1847  std::vector<MX> parts;
1848  for (casadi_int a = 0; a < na; ++a) parts.push_back(block(a));
1849  s = vertcat(parts);
1850  }
1851  ret_out_split.push_back(reshape(s, size1_in(i), size2_in(i) / n_grid));
1852  }
1853  }
1854  ret_out.push_back(horzcat(ret_out_split));
1855  }
1856 
1857  Dict options = opts;
1858  options["allow_duplicate_io_names"] = true;
1859  // The wrapper calls a non-codegenable integrator, which jits its own dependencies
1860  options["jit"] = false;
1861 
1862  // Create derivative function and return
1863  return Function(name, ret_in, ret_out, inames, onames, options);
1864 }
bool has_reverse(casadi_int nadj) const override
Generate a function that calculates nadj adjoint derivatives.
static casadi_int adjmap_out(casadi_int i)
Which output is used to calculate a given input in adjoint sensitivity analysis.
Definition: integrator.cpp:339
Definition: sx_elem.cpp:523

References casadi::Integrator::adjmap_out(), casadi::Integrator::augmented_dae(), casadi::Integrator::augmented_options_, casadi::FunctionInternal::Function, casadi::Integrator::getDerivativeOptions(), casadi::Integrator::has_reverse(), casadi::integrator(), casadi::INTEGRATOR_ADJ_XF, casadi::integrator_in(), casadi::INTEGRATOR_NUM_IN, casadi::INTEGRATOR_NUM_OUT, casadi::integrator_out(), casadi::Integrator::n_grid_in(), casadi::Integrator::n_grid_out(), casadi::Integrator::nadj_, casadi::ProtoFunction::name_, casadi::Integrator::nfwd_, casadi::Integrator::nrx_, casadi::FunctionInternal::numel_in(), casadi::FunctionInternal::numel_out(), casadi::PluginInterface< Integrator >::plugin_name(), casadi::FunctionInternal::size1_in(), casadi::FunctionInternal::size2_in(), casadi::Function::size_in(), casadi::FunctionInternal::size_out(), casadi::FunctionInternal::sparsity_in(), casadi::FunctionInternal::sparsity_out(), casadi::str(), casadi::GenericMatrix< MX >::sym(), casadi::Integrator::t0_, casadi::Integrator::tout_, and casadi::ProtoFunction::verbose_.

◆ get_sparsity_in()

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

Controls and their adjoints: a column per control group

Reimplemented from casadi::Integrator.

Definition at line 447 of file runtime_integrator.cpp.

447  {
448  if (i == INTEGRATOR_U) return Sparsity::dense(nu1_, ngroup() * (1 + nfwd_));
449  return Integrator::get_sparsity_in(i);
450 }
Sparsity get_sparsity_in(casadi_int i) override
Sparsities of function inputs and outputs.
Definition: integrator.cpp:284

References casadi::Sparsity::dense(), casadi::Integrator::get_sparsity_in(), casadi::INTEGRATOR_U, casadi::Integrator::nfwd_, casadi::RuntimeIntegrator::ngroup(), and casadi::Integrator::nu1_.

◆ get_sparsity_out()

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

Controls and their adjoints: a column per control group

Reimplemented from casadi::Integrator.

Definition at line 452 of file runtime_integrator.cpp.

452  {
453  if (i == INTEGRATOR_ADJ_U) return Sparsity::dense(nuq1_, nadj_ * (1 + nfwd_) * ngroup());
455 }
Sparsity get_sparsity_out(casadi_int i) override
Sparsities of function inputs and outputs.
Definition: integrator.cpp:298

References casadi::Sparsity::dense(), casadi::Integrator::get_sparsity_out(), casadi::INTEGRATOR_ADJ_U, casadi::Integrator::nadj_, casadi::Integrator::nfwd_, casadi::RuntimeIntegrator::ngroup(), and casadi::Integrator::nuq1_.

◆ get_stats()

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

Reimplemented from casadi::OracleFunction.

Definition at line 1081 of file runtime_integrator.cpp.

1081  {
1082  Dict stats = Integrator::get_stats(mem);
1083  auto m = static_cast<RuntimeIntegratorMemory*>(mem);
1084  stats["n_steps"] = m->d.n_steps;
1085  stats["n_reject"] = m->d.n_reject;
1086  stats["n_rhs"] = m->d.n_rhs;
1087  stats["n_jac"] = m->d.n_jac;
1088  stats["n_vjp"] = m->d.n_vjp;
1089  stats["n_events"] = m->d.n_events;
1090  return stats;
1091 }
Dict get_stats(void *mem) const override
Get all statistics.

References casadi::RuntimeIntegratorMemory::d, and casadi_ivp_data< T1 >::n_steps.

◆ get_x()

void casadi::Integrator::get_x ( IntegratorMemory *  m,
double *  x 
) const
inherited

Definition at line 2624 of file integrator.cpp.

2624  {
2625  casadi_copy(m->x, nx_, x);
2626 }

References casadi::casadi_copy(), casadi::Integrator::nx_, and casadi::IntegratorMemory::x.

Referenced by casadi::Integrator::eval(), and casadi::RuntimeIntegrator::eval().

◆ get_z()

void casadi::Integrator::get_z ( IntegratorMemory *  m,
double *  z 
) const
inherited

Definition at line 2628 of file integrator.cpp.

2628  {
2629  casadi_copy(m->z, nz_, z);
2630 }

References casadi::casadi_copy(), casadi::Integrator::nz_, and casadi::IntegratorMemory::z.

Referenced by casadi::Integrator::eval(), and casadi::RuntimeIntegrator::eval().

◆ getAdaptorSolverName()

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

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

Definition at line 306 of file function_internal.hpp.

306 { return ""; }

◆ getCount()

Definition at line 60 of file generic_shared_internal.hpp.

210  {
211  return static_cast<const Internal*>(this)->count;
212  }

◆ getDerivativeOptions()

Dict casadi::Integrator::getDerivativeOptions ( bool  fwd) const
virtualinherited

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

Definition at line 1866 of file integrator.cpp.

1866  {
1867  // Copy all options
1868  return opts_;
1869 }
Dict opts_
Copy of the options.

References casadi::Integrator::opts_.

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

◆ getPlugin()

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

Definition at line 102 of file plugin_interface.hpp.

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

◆ has_codegen()

bool casadi::RuntimeIntegrator::has_codegen ( ) const
overridevirtualinherited

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

Reimplemented from casadi::FunctionInternal.

Definition at line 844 of file runtime_integrator.cpp.

844  {
845  // Adjoint sensitivities need a tape of bounded size
846  return nadj_ == 0 || tape_capacity() > 0;
847 }
casadi_int tape_capacity() const
Capacity of the tape in the work vector (0: unbounded, in the virtual machine only)

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

437 { return false;}

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

◆ has_forward()

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

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

Reimplemented from casadi::FunctionInternal.

Definition at line 317 of file integrator_impl.hpp.

317 { return true;}

◆ has_free()

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

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

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

Definition at line 756 of file function_internal.hpp.

756 { return false;}

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

◆ has_function()

bool casadi::OracleFunction::has_function ( const std::string &  fname) const
overridevirtualinherited

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

3919  {
3920  return ind<mem_.size();
3921  }

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

1120  {
1121  return get_options().find(option_name) != nullptr;
1122  }
const Options::Entry * find(const std::string &name) const
Definition: options.cpp:32

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

◆ has_plugin()

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

Definition at line 76 of file plugin_interface.hpp.

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

◆ has_reverse()

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

Reimplemented from casadi::Integrator.

Definition at line 88 of file runtime_integrator.hpp.

88 { return true;}

◆ has_spfwd()

bool casadi::Integrator::has_spfwd ( ) const
inlineoverridevirtualinherited

Is the class able to propagate seeds through the algorithm? Not through events

Reimplemented from casadi::FunctionInternal.

Definition at line 305 of file integrator_impl.hpp.

305 { return ne_ == 0;}

◆ has_sprev()

bool casadi::Integrator::has_sprev ( ) const
inlineoverridevirtualinherited

Is the class able to propagate seeds through the algorithm? Not through events

Reimplemented from casadi::FunctionInternal.

Definition at line 306 of file integrator_impl.hpp.

306 { return ne_ == 0;}

◆ impulseB()

void casadi::RuntimeIntegrator::impulseB ( IntegratorMemory *  mem,
const double *  adj_x,
const double *  adj_z,
const double *  adj_q 
) const
overridevirtualinherited

Implements casadi::Integrator.

Definition at line 434 of file runtime_integrator.cpp.

435  {
436  auto m = static_cast<RuntimeIntegratorMemory*>(mem);
437  double* seed = m->d.seed;
438  casadi_copy(adj_x, nrx_, seed);
439  casadi_copy(adj_z, nrz_, seed + nrx_);
440  casadi_copy(adj_q, nrp_, seed + nrx_ + nrz_);
441  casadi_ivp_impulse(&m->d, m->t);
442  run(m);
443  casadi_assert(m->d.status == IVP_SUCCESS, name_ + ": adjoint seed at t = "
444  + str(m->t) + " failed, status " + str(static_cast<casadi_int>(m->d.status)));
445 }

References casadi::casadi_copy(), casadi::RuntimeIntegratorMemory::d, casadi::ProtoFunction::name_, casadi::Integrator::nrp_, casadi::Integrator::nrx_, casadi::Integrator::nrz_, casadi::RuntimeIntegrator::run(), casadi_ivp_data< T1 >::seed, and casadi::str().

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

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

1162  {
1163  for (casadi_int i=0; i<name_in_.size(); ++i) {
1164  if (name_in_[i]==name) return i;
1165  }
1166  casadi_error("FunctionInternal::index_in: could not find entry \""
1167  + name + "\". Available names are: " + str(name_in_) + ".");
1168  return -1;
1169  }

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

1174  {
1175  for (casadi_int i=0; i<name_out_.size(); ++i) {
1176  if (name_out_[i]==name) return i;
1177  }
1178  casadi_error("FunctionInternal::index_out: could not find entry \""
1179  + name + "\". Available names are: " + str(name_out_) + ".");
1180  return -1;
1181  }

References casadi::str().

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

◆ info()

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

◆ init()

void casadi::Rosenbrock::init ( const Dict &  opts)
overridevirtual

Reimplemented from casadi::RuntimeIntegrator.

Definition at line 68 of file rosenbrock.cpp.

68  {
69  // Call the base class init
71 
72  // Default options
73  init_tol_ = 1e-3;
74  init_max_iter_ = 20;
75 
76  // Read options
77  for (auto&& op : opts) {
78  if (op.first == "init_tol") {
79  init_tol_ = op.second;
80  } else if (op.first == "init_max_iter") {
81  init_max_iter_ = op.second;
82  }
83  }
84 
85  // Reverse communication problem
86  set_iteration_matrix();
87  set_coefficients();
88  set_ivp_prob();
90  set_rosenbrock_prob();
91 
92  // Work vectors of the kernel, and of the nominal integration
94  casadi_int sz_arg = 0, sz_res = 0, sz_iw = 0, sz_w = 0;
95  casadi_rosenbrock_work(&pr_, &sz_arg, &sz_res, &sz_iw, &sz_w);
96  if (replay_) casadi_rosenbrock_work(&pr_nom_, &sz_arg, &sz_res, &sz_iw, &sz_w);
97  alloc_w(sz_w, true);
98  }
void init(const Dict &opts) override
Initialize: functions of the kernel tasks.
void alloc_ivp_work()
Work vectors of the shared kernel data.

References casadi::RuntimeIntegrator::alloc_ivp_work(), casadi::FunctionInternal::alloc_w(), casadi::RuntimeIntegrator::init(), casadi::RuntimeIntegrator::replay_, casadi::RuntimeIntegrator::set_ivp_prob(), casadi::RuntimeIntegrator::set_nominal_prob(), casadi::FunctionInternal::sz_arg(), casadi::FunctionInternal::sz_iw(), casadi::FunctionInternal::sz_res(), and casadi::FunctionInternal::sz_w().

◆ init_mem()

int casadi::RuntimeIntegrator::init_mem ( void *  mem) const
overridevirtualinherited

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

Reimplemented from casadi::Integrator.

Definition at line 380 of file runtime_integrator.cpp.

380  {
381  if (Integrator::init_mem(mem)) return 1;
382  auto m = static_cast<RuntimeIntegratorMemory*>(mem);
383  casadi_ivp_clear_stats(&m->d);
384  return 0;
385 }
int init_mem(void *mem) const override
Initalize memory block.
Definition: integrator.cpp:916

References casadi::Integrator::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()

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

Definition at line 106 of file plugin_interface.hpp.

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

◆ instruction_constant()

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

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

Reimplemented in casadi::SXFunction.

Definition at line 3656 of file function_internal.cpp.

3656  {
3657  casadi_error("'instruction_constant' not defined for " + class_name());
3658  }

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

3648  {
3649  casadi_error("'instruction_id' not defined for " + class_name());
3650  }

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

3652  {
3653  casadi_error("'instruction_input' not defined for " + class_name());
3654  }

References casadi::SharedObjectInternal::class_name().

◆ instruction_MX()

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

Reimplemented in casadi::MXFunction.

Definition at line 3664 of file function_internal.cpp.

3664  {
3665  casadi_error("'instruction_MX' not defined for " + class_name());
3666  }

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

3660  {
3661  casadi_error("'instruction_output' not defined for " + class_name());
3662  }

References casadi::SharedObjectInternal::class_name().

◆ instructions_sx()

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

Reimplemented in casadi::SXFunction.

Definition at line 3668 of file function_internal.cpp.

3668  {
3669  casadi_error("'instructions_sx' not defined for " + class_name());
3670  }

References casadi::SharedObjectInternal::class_name().

◆ is_a()

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

◆ jac_is_symm()

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

Definition at line 1980 of file function_internal.cpp.

1980  {
1981  // If derivative expression
1982  if (!derivative_of_.is_null()) {
1983  std::string n = derivative_of_.name();
1984  // Reverse move
1985  if (name_ == "adj1_" + n) {
1986  if (iind == oind) return true;
1987  }
1988  }
1989  // Not symmetric by default
1990  return false;
1991  }
bool is_null() const
Is a null pointer?

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

2069  {
2070 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
2071  // Safe access to jac_sparsity_
2072  std::lock_guard<std::mutex> lock(jac_sparsity_mtx_);
2073 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
2074  // If first call, allocate cache
2075  for (bool c : {false, true}) {
2076  if (jac_sparsity_[c].empty()) jac_sparsity_[c].resize(n_in_ * n_out_);
2077  }
2078  // Flat index
2079  casadi_int ind = iind + oind * n_in_;
2080  // Reference to the block
2081  Sparsity& jsp = jac_sparsity_[compact].at(ind);
2082  // If null, generate
2083  if (jsp.is_null()) {
2084  // Use (non)-compact pattern, if given
2085  Sparsity& jsp_other = jac_sparsity_[!compact].at(ind);
2086  if (!jsp_other.is_null()) {
2087  jsp = compact ? to_compact(oind, iind, jsp_other) : from_compact(oind, iind, jsp_other);
2088  } else {
2089  // Generate pattern
2090  Sparsity sp;
2091  bool sp_is_compact;
2092  if (!is_diff_out_.at(oind) || !is_diff_in_.at(iind)) {
2093  // All-zero sparse
2094  sp = Sparsity(nnz_out(oind), nnz_in(iind));
2095  sp_is_compact = true;
2096  } else {
2097  // Use internal routine to determine sparsity
2098  if (has_spfwd() || has_sprev() || has_jac_sparsity(oind, iind)) {
2099  sp = get_jac_sparsity(oind, iind, symmetric);
2100  }
2101  // If null, dense
2102  if (sp.is_null()) sp = Sparsity::dense(nnz_out(oind), nnz_in(iind));
2103  // Is the return the compact pattern?
2104  sp_is_compact = sp.size1() == nnz_out(oind) && sp.size2() == nnz_in(iind);
2105  }
2106  // Save to cache and convert if needed
2107  if (sp_is_compact == compact) {
2108  jsp = sp;
2109  } else {
2110  jsp_other = sp;
2111  jsp = compact ? to_compact(oind, iind, sp) : from_compact(oind, iind, sp);
2112  }
2113  }
2114  }
2115 
2116  // Make sure the Jacobian is symmetric if requested, cf. #1522, #3074, #3134
2117  if (symmetric) {
2118  if (compact) {
2119  Sparsity sp = from_compact(oind, iind, jsp);
2120  if (!sp.is_symmetric()) {
2121  sp = sp * sp.T();
2122  jsp = to_compact(oind, iind, sp);
2123  }
2124  } else {
2125  if (!jsp.is_symmetric()) jsp = jsp * jsp.T();
2126  }
2127  }
2128 
2129  // Return a reference to the block
2130  return jsp;
2131  }
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 2468 of file function_internal.cpp.

2468  {
2469  // Used wrapped function if jacobian not available
2470  if (!has_jacobian()) {
2471  // Derivative information must be available
2472  casadi_assert(has_derivative(),
2473  "Derivatives cannot be calculated for " + name_);
2474  return wrap().jacobian();
2475  }
2476  // Retrieve/generate cached
2477  Function f;
2478  std::string fname = "jac_" + name_;
2479  if (!incache(fname, f)) {
2480  // Names of inputs
2481  std::vector<std::string> inames;
2482  for (casadi_int i=0; i<n_in_; ++i) inames.push_back(name_in_[i]);
2483  for (casadi_int i=0; i<n_out_; ++i) inames.push_back("out_" + name_out_[i]);
2484  // Names of outputs
2485  std::vector<std::string> onames;
2486  onames.reserve(n_in_ * n_out_);
2487  for (size_t oind = 0; oind < n_out_; ++oind) {
2488  for (size_t iind = 0; iind < n_in_; ++iind) {
2489  onames.push_back("jac_" + name_out_[oind] + "_" + name_in_[iind]);
2490  }
2491  }
2492  // Options
2494  opts["derivative_of"] = self();
2495  // Generate derivative function
2496  casadi_assert_dev(enable_jacobian_);
2497  f = get_jacobian(fname, inames, onames, opts);
2498  // Consistency checks
2499  casadi_assert(f.n_in() == inames.size(),
2500  "Mismatching input signature, expected " + str(inames));
2501  casadi_assert(f.n_out() == onames.size(),
2502  "Mismatching output signature, expected " + str(onames));
2503  // Save to cache
2504  tocache_if_missing(f);
2505  }
2506  return f;
2507  }
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
Get a function computing all Jacobian blocks at once.
Definition: function.cpp:1068

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

void casadi::OracleFunction::jit_dependencies ( const std::string &  fname)
overridevirtualinherited

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

Reimplemented from casadi::FunctionInternal.

Definition at line 442 of file oracle_function.cpp.

442  {
443  if (compiler_.is_null()) {
444  if (verbose_) casadi_message("compiling to "+ fname+"'.");
445  // JIT dependent functions
448  }
449  // Replace the Oracle functions with generated functions
450  for (auto&& e : all_functions_) {
451  if (verbose_) casadi_message("loading '" + e.second.f.name() + "' from '" + fname + "'.");
452  if (e.second.jit) {
453  e.second.f_original = e.second.f;
454  e.second.f = external(e.second.f.name(), compiler_);
455  }
456  }
457 }
std::string generate_dependencies(const std::string &fname, const Dict &opts) const override
Export / Generate C code for the generated functions.
Function external(const std::string &name, const Importer &li, const Dict &opts)
Load a just-in-time compiled external function.
Definition: external.cpp:42

References casadi::OracleFunction::all_functions_, casadi::FunctionInternal::codegen_options_, casadi::FunctionInternal::compiler_, casadi::FunctionInternal::compiler_plugin_, casadi::external(), casadi::OracleFunction::generate_dependencies(), casadi::GenericShared< Shared, Internal >::is_null(), casadi::FunctionInternal::jit_options_, and casadi::ProtoFunction::verbose_.

◆ join_results()

void casadi::OracleFunction::join_results ( OracleMemory *  m) const
inherited

Definition at line 168 of file oracle_function.cpp.

168  {
169  // Combine runtime statistics
170  // Note: probably not correct to simply add wall times
171  for (int i = 0; i < max_num_threads_; ++i) {
172  auto* ml = m->thread_local_mem[i];
173  for (auto&& s : ml->fstats) {
174  m->fstats.at(s.first).join(s.second);
175  }
176  }
177 }

References casadi::ProtoFunctionMemory::fstats, casadi::OracleFunction::max_num_threads_, and casadi::OracleMemory::thread_local_mem.

Referenced by casadi::Nlpsol::eval(), casadi::Integrator::eval(), and casadi::RuntimeIntegrator::eval().

◆ jump_function()

Function casadi::RuntimeIntegrator::jump_function ( ) const
protectedinherited

Definition at line 199 of file runtime_integrator.cpp.

199  {
200  // State after the event selected by w as a function of the state before it: moved along
201  // the trajectory to the event surface, through the transition and back to t, to second
202  // order in the time s to the surface. At an event s vanishes, so the value is that of the
203  // transition and the first and second derivatives are those of the event, including the
204  // dependence of its time. Algebraic states are consistent along the way: the given ones
205  // are only starting points
206  MX t = MX::sym("t"), s = MX::sym("s"), w = MX::sym("w", ne_), q = MX::sym("q", nq1_);
207  MX x = MX::sym("x", oracle_.sparsity_in(DYN_X)), z = MX::sym("z", oracle_.sparsity_in(DYN_Z));
208  MX p = MX::sym("p", oracle_.sparsity_in(DYN_P)), u = MX::sym("u", oracle_.sparsity_in(DYN_U));
209  const Function& tr = get_function("transition");
210  // Argument i of f, empty if f does not depend on it
211  auto arg = [](const Function& f, casadi_int i, const MX& v) -> MX {
212  return f.nnz_in(i) == 0 ? MX(f.sparsity_in(i)) : v;
213  };
214  auto dae = [&](const MX& tt, const MX& xx, const MX& zz) -> std::vector<MX> {
215  return oracle_(std::vector<MX>{arg(oracle_, DYN_T, tt), xx, zz, p, u});
216  };
217  // Algebraic states consistent with (tt, xx), from zz
218  Function z_solve;
219  if (nz1_ > 0) {
220  MX zs = MX::sym("z", z.sparsity()), ts = MX::sym("t"), xs = MX::sym("x", x.sparsity());
221  Function alg("alg", {zs, ts, xs, p, u}, {dae(ts, xs, zs)[DYN_ALG]});
222  z_solve = rootfinder("z_consistent", "fast_newton", alg,
223  Dict{{"abstol", 1e-14}, {"abstolStep", 1e-14}, {"max_iter", 50}});
224  }
225  auto consistent = [&](const MX& tt, const MX& xx, const MX& zz) -> MX {
226  return nz1_ == 0 ? zz : z_solve(std::vector<MX>{zz, tt, xx, p, u}).at(0);
227  };
228  // Rates of x, q at (tt, xx) and their derivatives along the trajectory
229  auto rates = [&](const MX& tt, const MX& xx, const MX& zz, std::vector<MX>& r) -> void {
230  std::vector<MX> r0 = dae(tt, xx, consistent(tt, xx, zz));
231  MX x1 = xx + s * r0[DYN_ODE];
232  std::vector<MX> r1 = dae(tt + s, x1, consistent(tt + s, x1, zz));
233  r = MX::substitute({r0[DYN_ODE], r0[DYN_QUAD], MX::jacobian(r1[DYN_ODE], s),
234  MX::jacobian(r1[DYN_QUAD], s)}, {s}, {MX(0)});
235  };
236  // Time to the surface of the selected zero-crossing function
237  std::vector<MX> r;
238  rates(t, x, z, r);
239  MX x_s = x + s * r[0] + 0.5 * s * s * r[2];
240  MX g = MX::dot(w, dae(t + s, x_s, consistent(t + s, x_s, z))[DYN_ZERO]);
241  MX g_s = MX::jacobian(g, s);
242  std::vector<MX> gv = MX::substitute({g, g_s, MX::jacobian(g_s, s)}, {s}, {MX(0)});
243  MX s1 = -gv[0] / gv[1];
244  MX ss = s1 - 0.5 * gv[2] * s1 * s1 / gv[1];
245  // Transition on the surface
246  std::vector<double> index(ne_);
247  for (casadi_int i = 0; i < ne_; ++i) index[i] = static_cast<double>(i);
248  MX x_ev = x + ss * r[0] + 0.5 * ss * ss * r[2];
249  MX q_ev = q + ss * r[1] + 0.5 * ss * ss * r[3];
250  std::vector<MX> post = tr(std::vector<MX>{arg(tr, EVENT_INDEX, MX::dot(w, MX(DM(index)))),
251  arg(tr, EVENT_T, t + ss), x_ev, consistent(t + ss, x_ev, z), arg(tr, EVENT_P, p),
252  arg(tr, EVENT_U, u)});
253  // Back to t along the trajectory after the event
254  MX z_post = consistent(t + ss, post[EVENT_POST_X], post[EVENT_POST_Z]);
255  rates(t + ss, post[EVENT_POST_X], z_post, r);
256  MX x_post = post[EVENT_POST_X] - ss * r[0] + 0.5 * ss * ss * r[2];
257  MX q_post = q_ev - ss * r[1] + 0.5 * ss * ss * r[3];
258  return Function("jumpF", {t, x, z, q, p, u, w}, {x_post, z_post, q_post},
259  {"t", "x", "z", "q", "p", "u", "w"}, {"post_x", "post_z", "post_q"});
260 }
static MX substitute(const MX &ex, const MX &v, const MX &vdef)
Definition: mx.cpp:1518
static MX jacobian(const MX &f, const MX &x, const Dict &opts=Dict())
Definition: mx.cpp:1913
static MX dot(const MX &x, const MX &y)
Definition: mx.cpp:738
Function rootfinder(const std::string &name, const std::string &solver, const SXDict &rfp, const Dict &opts)
Definition: rootfinder.cpp:111
@ EVENT_INDEX
Definition: integrator.hpp:929
@ EVENT_POST_Z
Definition: integrator.hpp:940
@ EVENT_POST_X
Definition: integrator.hpp:939
Matrix< double > DM
Definition: dm_fwd.hpp:33

References casadi::MX::dot(), casadi::DYN_ALG, casadi::DYN_ODE, casadi::DYN_P, casadi::DYN_QUAD, casadi::DYN_T, casadi::DYN_U, casadi::DYN_X, casadi::DYN_Z, casadi::DYN_ZERO, casadi::EVENT_INDEX, casadi::EVENT_P, casadi::EVENT_POST_X, casadi::EVENT_POST_Z, casadi::EVENT_T, casadi::EVENT_U, casadi::FunctionInternal::Function, casadi::OracleFunction::get_function(), casadi::MX::jacobian(), casadi::Integrator::ne_, casadi::Function::nnz_in(), casadi::Integrator::nq1_, casadi::Integrator::nz1_, casadi::OracleFunction::oracle_, casadi::rootfinder(), casadi::MX::sparsity(), casadi::Function::sparsity_in(), casadi::MX::substitute(), and casadi::GenericMatrix< MX >::sym().

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

◆ kernel()

int casadi::Rosenbrock::kernel ( RuntimeIntegratorMemory *  m) const
overrideprotectedvirtual

Implements casadi::RuntimeIntegrator.

Definition at line 215 of file rosenbrock.cpp.

215  {
216  auto m = static_cast<RosenbrockMemory*>(mem);
217  return casadi_rosenbrock(&m->d, &m->r);
218  }

◆ load_library()

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

Definition at line 92 of file plugin_interface.hpp.

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

◆ load_plugin()

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

Definition at line 88 of file plugin_interface.hpp.

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

◆ local_init_mem()

int casadi::OracleFunction::local_init_mem ( void *  mem) const
inherited

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

Definition at line 469 of file oracle_function.cpp.

469  {
470  if (ProtoFunction::init_mem(mem)) return 1;
471  if (!mem) return 1;
472  auto *m = static_cast<LocalOracleMemory*>(mem);
473 
474  // Create statistics
475  for (auto&& e : all_functions_) {
476  m->add_stat(e.first);
477  }
478 
479  return 0;
480 }

References casadi::ProtoFunctionMemory::add_stat(), casadi::OracleFunction::all_functions_, and casadi::ProtoFunction::init_mem().

Referenced by casadi::OracleFunction::init_mem().

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

1207  {
1208  Function f;
1209  if (parallelization=="serial") {
1210  // Serial maps are cached
1211  std::string fname = "map" + str(n) + "_" + name_;
1212  if (!incache(fname, f)) {
1213  // Create new serial map
1214  f = Map::create(parallelization, self(), n);
1215  casadi_assert_dev(f.name()==fname);
1216  // Save in cache
1217  tocache_if_missing(f);
1218  }
1219  } else {
1220  // Non-serial maps are not cached
1221  f = Map::create(parallelization, self(), n);
1222  }
1223  return f;
1224  }
static Function create(const std::string &parallelization, const Function &f, casadi_int n)
Definition: map.cpp:43

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

◆ map2oracle()

template<typename XType >
Function casadi::Integrator::map2oracle ( const std::string &  name,
const std::map< std::string, XType > &  d 
)
staticinherited

Definition at line 2396 of file integrator.cpp.

2397  {
2398  std::vector<XType> de_in(DYN_NUM_IN), de_out(DYN_NUM_OUT);
2399  for (auto&& i : d) {
2400  if (i.first=="t") {
2401  de_in[DYN_T]=i.second;
2402  } else if (i.first=="x") {
2403  de_in[DYN_X]=i.second;
2404  } else if (i.first=="z") {
2405  de_in[DYN_Z]=i.second;
2406  } else if (i.first=="p") {
2407  de_in[DYN_P]=i.second;
2408  } else if (i.first=="u") {
2409  de_in[DYN_U]=i.second;
2410  } else if (i.first=="ode") {
2411  de_out[DYN_ODE]=i.second;
2412  } else if (i.first=="alg") {
2413  de_out[DYN_ALG]=i.second;
2414  } else if (i.first=="quad") {
2415  de_out[DYN_QUAD]=i.second;
2416  } else if (i.first=="zero") {
2417  de_out[DYN_ZERO]=i.second;
2418  } else {
2419  casadi_error("No such field: " + i.first);
2420  }
2421  }
2422 
2423  // Consistency checks, input sparsities
2424  for (casadi_int i = 0; i < DYN_NUM_IN; ++i) {
2425  const Sparsity& sp = de_in[i].sparsity();
2426  if (i == DYN_T) {
2427  casadi_assert(sp.is_empty() || sp.is_scalar(), "DAE time variable must be empty or scalar. "
2428  "Got dimension " + str(sp.size()));
2429  } else {
2430  casadi_assert(sp.is_empty() || sp.is_vector(), "DAE inputs must be empty or vectors. "
2431  + dyn_in(i) + " has dimension " + str(sp.size()) + ".");
2432  }
2433  casadi_assert(sp.is_dense(), "DAE inputs must be dense . "
2434  + dyn_in(i) + " is sparse.");
2435  // Convert row vectors to column vectors
2436  de_in[i] = vec(de_in[i]);
2437  }
2438 
2439  // Consistency checks, output sparsities
2440  for (casadi_int i = 0; i < DYN_NUM_OUT; ++i) {
2441  const Sparsity& sp = de_out[i].sparsity();
2442  casadi_assert(sp.is_empty() || sp.is_vector(), "DAE outputs must be empty or vectors. "
2443  + dyn_out(i) + " has dimension " + str(sp.size()));
2444  // Make sure dense and vector
2445  de_out[i] = vec(densify(de_out[i]));
2446  }
2447 
2448  // Construct
2449  return Function(name, de_in, de_out, dyn_in(), dyn_out());
2450 }

References casadi::DYN_ALG, casadi::dyn_in(), casadi::DYN_NUM_IN, casadi::DYN_NUM_OUT, casadi::DYN_ODE, casadi::dyn_out(), casadi::DYN_P, casadi::DYN_QUAD, casadi::DYN_T, casadi::DYN_U, casadi::DYN_X, casadi::DYN_Z, casadi::DYN_ZERO, casadi::FunctionInternal::Function, casadi::Sparsity::is_dense(), casadi::Sparsity::is_empty(), casadi::Sparsity::is_scalar(), casadi::Sparsity::is_vector(), casadi::Sparsity::size(), and casadi::str().

Referenced by casadi::integrator().

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

3678  {
3679  if (x.empty()) return x;
3680  // Check number of arguments
3681  casadi_assert(x.size()==n_in_, "mapsum_mx: Wrong number_i of arguments");
3682  // Number of parallel calls
3683  casadi_int npar = 1;
3684  // Check/replace arguments
3685  std::vector<MX> x_mod(x.size());
3686  for (casadi_int i=0; i<n_in_; ++i) {
3687  if (check_mat(x[i].sparsity(), sparsity_in_[i], npar)) {
3688  x_mod[i] = replace_mat(x[i], sparsity_in_[i], npar);
3689  } else {
3690  // Mismatching sparsity: The following will throw an error message
3691  npar = 0;
3692  check_arg(x, npar);
3693  }
3694  }
3695 
3696  casadi_int n = 1;
3697  for (casadi_int i=0; i<x_mod.size(); ++i) {
3698  n = std::max(x_mod[i].size2() / size2_in(i), n);
3699  }
3700 
3701  std::vector<casadi_int> reduce_in;
3702  for (casadi_int i=0; i<x_mod.size(); ++i) {
3703  if (x_mod[i].size2()/size2_in(i)!=n) {
3704  reduce_in.push_back(i);
3705  }
3706  }
3707 
3708  Function ms = self().map("mapsum", parallelization, n, reduce_in, range(n_out_));
3709 
3710  // Call the internal function
3711  return ms(x_mod);
3712  }
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 1811 of file function_internal.hpp.

1811  {
1812  check_arg(arg, npar);
1813  for (casadi_int i=0; i<n_in_; ++i) {
1814  if (arg.at(i).size1()!=size1_in(i)) return false;
1815  if (arg.at(i).size2()!=size2_in(i) && arg.at(i).size2()!=npar*size2_in(i)) return false;
1816  }
1817  return true;
1818  }

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

1821  {
1822  check_res(res, npar);
1823  for (casadi_int i=0; i<n_out_; ++i) {
1824  if (res.at(i).size1()!=size1_out(i)) return false;
1825  if (res.at(i).size2()!=size2_out(i) && res.at(i).size2()!=npar*size2_out(i)) return false;
1826  }
1827  return true;
1828  }
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 3912 of file function_internal.cpp.

3912  {
3913 #ifdef CASADI_WITH_THREAD
3914  std::lock_guard<std::mutex> lock(mtx_);
3915 #endif //CASADI_WITH_THREAD
3916  return mem_.at(ind);
3917  }

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

3628  {
3629  }

◆ monitored()

bool casadi::OracleFunction::monitored ( const std::string &  name) const
virtualinherited

Definition at line 561 of file oracle_function.cpp.

561  {
562  auto it = all_functions_.find(name);
563  casadi_assert(it!=all_functions_.end(),
564  "No function \"" + name + "\" in " + name_+ ". " +
565  "Available functions: " + join(get_function()) + ".");
566  return it->second.monitored;
567 }

References casadi::OracleFunction::all_functions_, casadi::OracleFunction::get_function(), casadi::join(), and casadi::ProtoFunction::name_.

Referenced by casadi::OracleFunction::calc_function().

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

3607  {
3608  std::vector<MX> ret(n_in_);
3609  for (casadi_int i=0; i<ret.size(); ++i) {
3610  ret[i] = mx_in(i);
3611  }
3612  return ret;
3613  }
virtual const std::vector< MX > mx_in() const
Get function input(s) and output(s)

References casadi::FunctionInternal::n_in_.

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

◆ mx_in() [2/2]

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

◆ mx_out() [1/2]

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

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

Definition at line 3615 of file function_internal.cpp.

3615  {
3616  std::vector<MX> ret(n_out_);
3617  for (casadi_int i=0; i<ret.size(); ++i) {
3618  ret[i] = mx_out(i);
3619  }
3620  return ret;
3621  }
virtual const std::vector< MX > mx_out() const
Get function input(s) and output(s)

References casadi::FunctionInternal::n_out_.

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

◆ mx_out() [2/2]

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

◆ n_grid_in()

casadi_int casadi::Integrator::n_grid_in ( casadi_int  i) const
inherited

Definition at line 312 of file integrator.cpp.

312  {
313  switch (static_cast<IntegratorInput>(i)) {
314  case INTEGRATOR_U:
315  // A plugin may hold the controls over several output intervals
316  return size2_in(INTEGRATOR_U) / (1 + nfwd_);
317  case INTEGRATOR_ADJ_XF:
318  case INTEGRATOR_ADJ_ZF:
319  case INTEGRATOR_ADJ_QF:
320  return nt();
321  default: break;
322  }
323  return 1;
324 }
casadi_int nt() const
Number of output times.

References casadi::INTEGRATOR_ADJ_QF, casadi::INTEGRATOR_ADJ_XF, casadi::INTEGRATOR_ADJ_ZF, casadi::INTEGRATOR_U, casadi::Integrator::nfwd_, casadi::Integrator::nt(), and casadi::FunctionInternal::size2_in().

Referenced by casadi::Integrator::get_forward(), casadi::Integrator::get_reverse(), and casadi::Integrator::n_grid_out().

◆ n_grid_out()

casadi_int casadi::Integrator::n_grid_out ( casadi_int  i) const
inherited

Definition at line 326 of file integrator.cpp.

326  {
327  switch (static_cast<IntegratorOutput>(i)) {
328  case INTEGRATOR_XF:
329  case INTEGRATOR_ZF:
330  case INTEGRATOR_QF:
331  return nt();
332  case INTEGRATOR_ADJ_U:
333  return n_grid_in(INTEGRATOR_U);
334  default: break;
335  }
336  return 1;
337 }
IntegratorOutput
Output arguments of an integrator.
Definition: integrator.hpp:964

References casadi::INTEGRATOR_ADJ_U, casadi::INTEGRATOR_QF, casadi::INTEGRATOR_U, casadi::INTEGRATOR_XF, casadi::INTEGRATOR_ZF, casadi::Integrator::n_grid_in(), and casadi::Integrator::nt().

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

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

3644  {
3645  casadi_error("'n_instructions' not defined for " + class_name());
3646  }

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

3672  {
3673  casadi_error("'n_nodes' not defined for " + class_name());
3674  }

References casadi::SharedObjectInternal::class_name().

◆ needs_jacobian()

bool casadi::Rosenbrock::needs_jacobian ( ) const
inlineoverrideprotectedvirtual

Implements casadi::RuntimeIntegrator.

Definition at line 125 of file rosenbrock.hpp.

125 { return true;}

◆ next_stop()

casadi_int casadi::Integrator::next_stop ( casadi_int  k,
const double *  u 
) const
inherited

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

Definition at line 2632 of file integrator.cpp.

2632  {
2633  // Integrate till the end if no input signals
2634  if (nu_ == 0 || u == nullptr) return nt() - 1;
2635  // Find the next discontinuity, if any
2636  for (; k + 1 < nt(); ++k) {
2637  // Next control value
2638  const double *u_next = u + nu_;
2639  // Check if there is any change in input from k to k + 1
2640  for (casadi_int i = 0; i < nu_; ++i) {
2641  // Step change detected: stop integration at k
2642  if (u[i] != u_next[i]) return k;
2643  }
2644  // Shift u
2645  u = u_next;
2646  }
2647  // No step changes detected
2648  return k;
2649 }

References casadi::Integrator::nt(), and casadi::Integrator::nu_.

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

◆ next_stopB()

casadi_int casadi::Integrator::next_stopB ( casadi_int  k,
const double *  u 
) const
inherited

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

Definition at line 2804 of file integrator.cpp.

2804  {
2805  // Integrate till the beginning if no input signals
2806  if (nu_ == 0 || u == nullptr) return -1;
2807  // Find the next discontinuity, if any
2808  for (; k-- > 0; ) {
2809  // Next control value
2810  const double *u_next = u - nu_;
2811  // Check if there is any change in input from k to k + 1
2812  for (casadi_int i = 0; i < nu_; ++i) {
2813  // Step change detected: stop integration at k
2814  if (u[i] != u_next[i]) return k;
2815  }
2816  // Shift u
2817  u = u_next;
2818  }
2819  // No step changes detected
2820  return k;
2821 }

References casadi::Integrator::nu_.

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

◆ ngroup()

casadi_int casadi::RuntimeIntegrator::ngroup ( ) const
inlineprotectedinherited

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

2427  {
2428  casadi_int ret=0;
2429  for (casadi_int iind=0; iind<n_in_; ++iind) ret += nnz_in(iind);
2430  return ret;
2431  }

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::FunctionInternal::open_trace(), casadi::ImplicitToNlp::set_work(), casadi::CbcInterface::solve(), casadi::ClpInterface::solve(), casadi::CplexInterface::solve(), casadi::OoqpInterface::solve(), casadi::PiqpInterface::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 1010 of file function_internal.hpp.

1010 { return sparsity_in(ind).nnz(); }
casadi_int nnz() const
Number of structural nonzeros.
Definition: sparsity.cpp:150

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

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

◆ nt()

casadi_int casadi::Integrator::nt ( ) const
inlineinherited

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

2439  {
2440  casadi_int ret=0;
2441  for (casadi_int iind=0; iind<n_in_; ++iind) ret += numel_in(iind);
2442  return ret;
2443  }

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

1020 { return sparsity_in(ind).numel(); }
casadi_int numel() const
Total number of entries, structural zeros included, i.e. size1()*size2()
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 2445 of file function_internal.cpp.

2445  {
2446  casadi_int ret=0;
2447  for (casadi_int oind=0; oind<n_out_; ++oind) ret += numel_out(oind);
2448  return ret;
2449  }

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

1021 { 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 3767 of file function_internal.cpp.

3767  {
3768  // Disallow parallel inputs
3769  casadi_int npar = -1;
3770  if (!matching_arg(arg, npar)) {
3771  return nz_in(replace_arg(arg, npar));
3772  }
3773 
3774  std::vector<DM> arg2 = project_arg(arg, 1);
3775  std::vector<double> ret(nnz_in());
3776  casadi_int offset = 0;
3777  for (casadi_int i=0;i<n_in_;++i) {
3778  const double* e = arg2.at(i).ptr();
3779  std::copy(e, e+nnz_in(i), ret.begin()+offset);
3780  offset+= nnz_in(i);
3781  }
3782  return ret;
3783  }

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_activity(), 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 3737 of file function_internal.cpp.

3737  {
3738  casadi_assert(nnz_in()==arg.size(),
3739  "Dimension mismatch. Expecting " + str(nnz_in()) +
3740  ", got " + str(arg.size()) + " instead.");
3741 
3742  std::vector<DM> ret = dm_in();
3743  casadi_int offset = 0;
3744  for (casadi_int i=0;i<n_in_;++i) {
3745  DM& r = ret.at(i);
3746  std::copy(arg.begin()+offset, arg.begin()+offset+nnz_in(i), r.ptr());
3747  offset+= nnz_in(i);
3748  }
3749  return ret;
3750  }

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

3785  {
3786  // Disallow parallel inputs
3787  casadi_int npar = -1;
3788  if (!matching_res(res, npar)) {
3789  return nz_out(replace_res(res, npar));
3790  }
3791 
3792  std::vector<DM> res2 = project_res(res, 1);
3793  std::vector<double> ret(nnz_out());
3794  casadi_int offset = 0;
3795  for (casadi_int i=0;i<n_out_;++i) {
3796  const double* e = res2.at(i).ptr();
3797  std::copy(e, e+nnz_out(i), ret.begin()+offset);
3798  offset+= nnz_out(i);
3799  }
3800  return ret;
3801  }
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_activity(), 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 3752 of file function_internal.cpp.

3752  {
3753  casadi_assert(nnz_out()==res.size(),
3754  "Dimension mismatch. Expecting " + str(nnz_out()) +
3755  ", got " + str(res.size()) + " instead.");
3756 
3757  std::vector<DM> ret = dm_out();
3758  casadi_int offset = 0;
3759  for (casadi_int i=0;i<n_out_;++i) {
3760  DM& r = ret.at(i);
3761  std::copy(res.begin()+offset, res.begin()+offset+nnz_out(i), r.ptr());
3762  offset+= nnz_out(i);
3763  }
3764  return ret;
3765  }

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

◆ open_trace()

std::unique_ptr< std::ostream > casadi::FunctionInternal::open_trace ( const double **  arg,
casadi_int  dump_id 
) const
protectedinherited

Definition at line 854 of file function_internal.cpp.

855  {
856  if (dump_id < 0) dump_id = get_dump_id();
857  std::stringstream filename;
858  filename << dump_dir_ << filesep() << name_ << "." << std::setfill('0')
859  << std::setw(6) << dump_id << ".trace.jsonl";
860  auto output = Filesystem::ofstream_ptr(filename.str());
861  std::ostream& trace = *output;
862  normalized_setup(trace);
863  trace << "{\"event\":\"header\",\"format\":\"casadi_trace\",\"version\":1,"
864  << "\"function\":\"" << name_ << "\",\"type\":\"" << class_name()
865  << "\",\"dump_id\":" << dump_id << "}\n";
866  trace << "{\"event\":\"inputs\",\"values\":[";
867  for (casadi_int i = 0; i < n_in_; ++i) {
868  if (i) trace << ",";
869  trace_values(trace, arg[i], nnz_in(i));
870  }
871  trace << "]}\n";
872  return output;
873  }
std::string filesep()
Definition: casadi_os.cpp:71
std::string filename(const std::string &path)
Definition: ghc.cpp:55

References casadi::SharedObjectInternal::class_name(), casadi::FunctionInternal::dump_dir_, casadi::filename(), casadi::filesep(), casadi::FunctionInternal::n_in_, casadi::ProtoFunction::name_, casadi::FunctionInternal::nnz_in(), casadi::normalized_setup(), casadi::Filesystem::ofstream_ptr(), and casadi::FunctionInternal::trace_values().

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

◆ oracle()

const Function& casadi::OracleFunction::oracle ( ) const
inlineoverridevirtualinherited

◆ plugin_deserialize()

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

Definition at line 82 of file plugin_interface.hpp.

165  {
166  Deserialize m = getPlugin(pname).deserialize;
167  casadi_assert(m, "Plugin \"" + pname + "\" does not support deserialize");
168  return m;
169  }
ProtoFunction *(* Deserialize)(DeserializingStream &)

◆ plugin_name()

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

Implements casadi::PluginInterface< Integrator >.

Definition at line 86 of file rosenbrock.hpp.

86 { return "rosenbrock";}

◆ plugin_options()

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

Definition at line 79 of file plugin_interface.hpp.

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

◆ pluginFromRegFcn()

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

Definition at line 85 of file plugin_interface.hpp.

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

◆ predict_events()

int casadi::Integrator::predict_events ( IntegratorMemory *  m) const
inherited

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

Definition at line 2684 of file integrator.cpp.

2684  {
2685  // Event time same as stopping time, by default
2686  double t_event = m->t_stop;
2687  casadi_int event_index = -1;
2688  // Calculate m->e and m->edot
2689  if (calc_edot(m)) return 1;
2690  // Save the values of the zero-crossing functions
2691  casadi_copy(m->e, ne_, m->old_e);
2692  // Find the next event, if any
2693  for (casadi_int i = 0; i < ne_; ++i) {
2694  if (!m->event_triggered[i]) {
2695  // Check if zero crossing function is positive and moving in the negative direction
2696  if (m->e[i] > 0 && m->edot[i] < 0) {
2697  // Projected zero-crossing time
2698  double t = m->t - m->e[i] / m->edot[i];
2699  // Save if earlier than current t_event
2700  if (t < t_event) {
2701  t_event = t;
2702  event_index = i;
2703  }
2704  }
2705  }
2706  }
2707  // Zero crossing projected
2708  if (event_index >= 0) {
2709  // Print progress
2710  if (verbose_) casadi_message("Projected zero crossing for index " + str(event_index)
2711  + " at t = " + str(t_event));
2712  // Update t_stop and t_next accordingly
2713  m->t_stop = t_event;
2714  m->t_next = std::min(m->t_next, t_event);
2715  }
2716  return 0;
2717 }

References casadi::Integrator::calc_edot(), casadi::casadi_copy(), casadi::IntegratorMemory::e, casadi::IntegratorMemory::edot, casadi::IntegratorMemory::event_triggered, casadi::Integrator::ne_, casadi::IntegratorMemory::old_e, casadi::str(), casadi::IntegratorMemory::t, casadi::IntegratorMemory::t_next, casadi::IntegratorMemory::t_stop, and casadi::ProtoFunction::verbose_.

Referenced by casadi::Integrator::advance().

◆ print()

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

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

Definition at line 4170 of file function_internal.cpp.

4170  {
4171  // Variable number of arguments
4172  va_list args;
4173  va_start(args, fmt);
4174  // Static & dynamic buffers
4175  char buf[256];
4176  size_t buf_sz = sizeof(buf);
4177  char* buf_dyn = nullptr;
4178  // Try to print with a small buffer
4179  casadi_int n = vsnprintf(buf, buf_sz, fmt, args);
4180  // Need a larger buffer?
4181  if (n>static_cast<casadi_int>(buf_sz)) {
4182  buf_sz = static_cast<size_t>(n+1);
4183  buf_dyn = new char[buf_sz];
4184  n = vsnprintf(buf_dyn, buf_sz, fmt, args);
4185  }
4186  // Print buffer content
4187  if (n>=0) uout() << (buf_dyn ? buf_dyn : buf) << std::flush;
4188  // Cleanup
4189  delete[] buf_dyn;
4190  va_end(args);
4191  // Throw error if failure
4192  casadi_assert(n>=0, "Print failure while processing '" + std::string(fmt) + "'");
4193  }

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

973  {
974  StreamStateGuard backup(stream);
975  normalized_setup(stream);
976  if (nz) {
977  stream << "[";
978  for (casadi_int i=0; i<sz; ++i) {
979  if (i>0) stream << ", ";
980  normalized_out(stream, nz[i]);
981  }
982  stream << "]";
983  } else {
984  stream << "NULL";
985  }
986  }

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

989  {
990  StreamStateGuard backup(stream);
991  normalized_setup(stream);
992  if (nz) {
993  if (!sp.is_scalar(true)) {
994  stream << sp.dim(false) << ": ";
995  stream << "[";
996  }
997  for (casadi_int i=0; i<sp.nnz(); ++i) {
998  if (i>0) stream << ", ";
999  normalized_out(stream, nz[i]);
1000  }
1001  if (!sp.is_scalar(true)) {
1002  stream << "]";
1003  if (!sp.is_dense()) {
1004  stream << ", colind: [";
1005  for (casadi_int i=0; i<sp.size2()+1; ++i) {
1006  if (i>0) stream << ", ";
1007  stream << sp.colind()[i];
1008  }
1009  stream << "]";
1010  stream << ", row: [";
1011  for (casadi_int i=0; i<sp.nnz(); ++i) {
1012  if (i>0) stream << ", ";
1013  stream << sp.row()[i];
1014  }
1015  stream << "]";
1016  }
1017  }
1018  } else {
1019  stream << "NULL";
1020  }
1021  }

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

1023  {
1024  StreamStateGuard backup(stream);
1025  normalized_setup(stream);
1026  normalized_out(stream, a);
1027  }

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

1099  {
1100  stream << " Number of inputs: " << n_in_ << std::endl;
1101  for (casadi_int i=0; i<n_in_; ++i) {
1102  stream << " Input " << i << " (\"" << name_in_[i] << "\"): "
1103  << sparsity_in_[i].dim() << std::endl;
1104  }
1105  stream << " Number of outputs: " << n_out_ << std::endl;
1106  for (casadi_int i=0; i<n_out_; ++i) {
1107  stream << " Output " << i << " (\"" << name_out_[i] << "\"): "
1108  << sparsity_out_[i].dim() << std::endl;
1109  }
1110  }

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

939  {
940  stream << "Function " << name_ << " (" << this << ")" << std::endl;
941  for (casadi_int i=0; i<n_in_; ++i) {
942  stream << "Input " << i << " (" << name_in_[i] << "): ";
943  if (arg[i]) {
944  if (print_canonical_) {
945  print_canonical(stream, sparsity_in_[i], arg[i]);
946  } else {
947  DM::print_default(stream, sparsity_in_[i], arg[i], truncate);
948  }
949  stream << std::endl;
950  } else {
951  stream << "NULL" << std::endl;
952  }
953  }
954  }
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 1116 of file function_internal.cpp.

1116  {
1117  get_options().print_one(name, stream);
1118  }
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 1112 of file function_internal.cpp.

1112  {
1113  get_options().print_all(stream);
1114  }
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 956 of file function_internal.cpp.

956  {
957  stream << "Function " << name_ << " (" << this << ")" << std::endl;
958  for (casadi_int i=0; i<n_out_; ++i) {
959  stream << "Output " << i << " (" << name_out_[i] << "): ";
960  if (res[i]) {
961  if (print_canonical_) {
962  print_canonical(stream, sparsity_out_[i], res[i]);
963  } else {
964  DM::print_default(stream, sparsity_out_[i], res[i], truncate);
965  }
966  stream << std::endl;
967  } else {
968  stream << "NULL" << std::endl;
969  }
970  }
971  }

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

void casadi::RuntimeIntegrator::print_stats ( IntegratorMemory *  mem) const
overridevirtualinherited

Reimplemented from casadi::Integrator.

Definition at line 1093 of file runtime_integrator.cpp.

1093  {
1094  auto m = static_cast<RuntimeIntegratorMemory*>(mem);
1095  print("%s: %lld steps, %lld rejected, %lld rhs, %lld jac, %lld vjp, %lld events\n",
1096  plugin_name(), static_cast<long long>(m->d.n_steps), static_cast<long long>(m->d.n_reject),
1097  static_cast<long long>(m->d.n_rhs), static_cast<long long>(m->d.n_jac),
1098  static_cast<long long>(m->d.n_vjp), static_cast<long long>(m->d.n_events));
1099 }
void print(const char *fmt,...) const
C-style formatted printing during evaluation.

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

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

4090  {
4091  if (!print_time_) return;
4092  // Length of the name being printed
4093  size_t name_len=0;
4094  for (auto &&s : fstats) {
4095  name_len = std::max(s.first.size(), name_len);
4096  }
4097  name_len = std::max(name_.size(), name_len);
4098 
4099  // Print name with a given length. Format: "%NNs "
4100  char namefmt[10];
4101  sprint(namefmt, sizeof(namefmt), "%%%ds ", static_cast<casadi_int>(name_len));
4102 
4103  // Print header
4104  print(namefmt, name_.c_str());
4105 
4106  print(" : %8s %10s %8s %10s %9s\n", "t_proc", "(avg)", "t_wall", "(avg)", "n_eval");
4107 
4108 
4109  char buffer_proc[10];
4110  char buffer_wall[10];
4111  char buffer_proc_avg[10];
4112  char buffer_wall_avg[10];
4113 
4114  // Print keys
4115  for (const auto &s : fstats) {
4116  if (s.second.n_call!=0) {
4117  print(namefmt, s.first.c_str());
4118  format_time(buffer_proc, s.second.t_proc);
4119  format_time(buffer_wall, s.second.t_wall);
4120  format_time(buffer_proc_avg, s.second.t_proc/s.second.n_call);
4121  format_time(buffer_wall_avg, s.second.t_wall/s.second.n_call);
4122  print(" | %s (%s) %s (%s) %9d\n",
4123  buffer_proc, buffer_proc_avg,
4124  buffer_wall, buffer_wall_avg, s.second.n_call);
4125  }
4126  }
4127  }
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 1683 of file function_internal.hpp.

1684  {
1685  casadi_assert_dev(arg.size()==n_in_);
1686 
1687  // Which arguments require mapped evaluation
1688  std::vector<bool> mapped(n_in_);
1689  for (casadi_int i=0; i<n_in_; ++i) {
1690  mapped[i] = arg[i].size2()!=size2_in(i);
1691  }
1692 
1693  // Check if matching input sparsity
1694  std::vector<bool> matching(n_in_);
1695  bool any_mismatch = false;
1696  for (casadi_int i=0; i<n_in_; ++i) {
1697  if (mapped[i]) {
1698  matching[i] = arg[i].sparsity().is_stacked(sparsity_in(i), npar);
1699  } else {
1700  matching[i] = arg[i].sparsity()==sparsity_in(i);
1701  }
1702  any_mismatch = any_mismatch || !matching[i];
1703  }
1704 
1705  // Correct input sparsity
1706  if (any_mismatch) {
1707  std::vector<M> arg2(arg);
1708  for (casadi_int i=0; i<n_in_; ++i) {
1709  if (!matching[i]) {
1710  if (mapped[i]) {
1711  arg2[i] = project(arg2[i], repmat(sparsity_in(i), 1, npar));
1712  } else {
1713  arg2[i] = project(arg2[i], sparsity_in(i));
1714  }
1715  }
1716  }
1717  return arg2;
1718  }
1719  return arg;
1720  }

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

1724  {
1725  return arg;
1726  }

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

1576  {
1577  for (auto i=v.begin(); i!=v.end(); ++i) {
1578  if (!i->is_zero()) return false;
1579  }
1580  return true;
1581  }

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

◆ quad_out()

static std::vector<std::string> casadi::Integrator::quad_out ( )
inlinestaticinherited

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

Definition at line 369 of file integrator_impl.hpp.

369 { return {"quad"}; }

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

◆ registerPlugin() [1/2]

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

Definition at line 96 of file plugin_interface.hpp.

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

◆ registerPlugin() [2/2]

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

Definition at line 99 of file plugin_interface.hpp.

273  {
274  registerPlugin(pluginFromRegFcn(regfcn), needs_lock);
275  }

◆ release()

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

Definition at line 3944 of file function_internal.cpp.

3944  {
3945 #ifdef CASADI_WITH_THREAD
3946  std::lock_guard<std::mutex> lock(mtx_);
3947 #endif //CASADI_WITH_THREAD
3948  unused_.push(mem);
3949  }

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

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

1859  {
1860  std::vector<M> r(arg.size());
1861  for (casadi_int i=0; i<r.size(); ++i) r[i] = replace_mat(arg[i], sparsity_in(i), npar);
1862  return r;
1863  }

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

1883  {
1884  std::vector<std::vector<M> > r(aseed.size());
1885  for (casadi_int d=0; d<r.size(); ++d) r[d] = replace_res(aseed[d], npar);
1886  return r;
1887  }

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

1875  {
1876  std::vector<std::vector<M> > r(fseed.size());
1877  for (casadi_int d=0; d<r.size(); ++d) r[d] = replace_arg(fseed[d], npar);
1878  return r;
1879  }

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

1867  {
1868  std::vector<M> r(res.size());
1869  for (casadi_int i=0; i<r.size(); ++i) r[i] = replace_mat(res[i], sparsity_out(i), npar);
1870  return r;
1871  }

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

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

◆ reset()

void casadi::RuntimeIntegrator::reset ( IntegratorMemory *  mem,
bool  first_call 
) const
overridevirtualinherited

Reimplemented from casadi::Integrator.

Definition at line 395 of file runtime_integrator.cpp.

395  {
396  auto m = static_cast<RuntimeIntegratorMemory*>(mem);
397  casadi_ivp_data<double>* d = &m->d;
398  // State y = [x; z; q]
399  casadi_copy(m->x, nx_, d->y);
400  casadi_copy(m->z, nz_, d->y + nx_);
401  casadi_copy(m->q, nq_, d->y + nx_ + nz_);
402  casadi_ivp_reset(d, m->t, m->u, first_call);
403 }

References casadi::casadi_copy(), casadi::Integrator::nq_, casadi::Integrator::nx_, casadi::Integrator::nz_, casadi_ivp_data< T1 >::t, and casadi_ivp_data< T1 >::y.

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

◆ reset_dump_count()

void casadi::FunctionInternal::reset_dump_count ( )
inherited

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

Definition at line 476 of file function_internal.cpp.

476  {
477  dump_count_ = 0;
478  }

References casadi::FunctionInternal::dump_count_.

◆ resetB()

void casadi::RuntimeIntegrator::resetB ( IntegratorMemory *  mem) const
overridevirtualinherited

Implements casadi::Integrator.

Definition at line 429 of file runtime_integrator.cpp.

429  {
430  auto m = static_cast<RuntimeIntegratorMemory*>(mem);
431  casadi_ivp_reset_backward(&m->d);
432 }

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

◆ retreat()

void casadi::RuntimeIntegrator::retreat ( IntegratorMemory *  mem,
const double *  u,
double *  adj_x,
double *  adj_p,
double *  adj_u 
) const
overridevirtualinherited

Implements casadi::Integrator.

Definition at line 573 of file runtime_integrator.cpp.

574  {
575  auto m = static_cast<RuntimeIntegratorMemory*>(mem);
576  casadi_ivp_data<double>* d = &m->d;
577  // The controls of each step are taped
578  casadi_ivp_retreat(d, m->t, m->t_next);
579  run(m);
580  casadi_assert(d->status == IVP_SUCCESS,
581  name_ + ": adjoint sweep failed, status " + str(static_cast<casadi_int>(d->status)));
582  casadi_copy(d->ry, nrx_, adj_x);
583  casadi_copy(d->adj_p, nrq_, adj_p);
584  casadi_copy(d->adj_u, nuq_, adj_u);
585 }

References casadi_ivp_data< T1 >::adj_p, casadi_ivp_data< T1 >::adj_u, casadi::casadi_copy(), casadi::ProtoFunction::name_, casadi::Integrator::nrq_, casadi::Integrator::nrx_, casadi::Integrator::nuq_, casadi::RuntimeIntegrator::run(), casadi_ivp_data< T1 >::ry, casadi_ivp_data< T1 >::status, casadi::str(), and casadi_ivp_data< T1 >::t.

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

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

2350  {
2351  casadi_assert_dev(nadj>=0);
2352  // Used wrapped function if reverse not available
2353  if (!enable_reverse_) {
2354  // Derivative information must be available
2355  casadi_assert(has_derivative(), "Derivatives cannot be calculated for " + name_);
2356  return wrap().reverse(nadj);
2357  }
2358  // Retrieve/generate cached
2359  Function f;
2360  std::string fname = reverse_name(name_, nadj);
2361  if (!incache(fname, f)) {
2362  casadi_int i;
2363  // Prefix to be used for adjoint seeds, sensitivities
2364  std::string pref = diff_prefix("adj");
2365  // Names of inputs
2366  std::vector<std::string> inames;
2367  for (i=0; i<n_in_; ++i) inames.push_back(name_in_[i]);
2368  for (i=0; i<n_out_; ++i) inames.push_back("out_" + name_out_[i]);
2369  for (i=0; i<n_out_; ++i) inames.push_back(pref + name_out_[i]);
2370  // Names of outputs
2371  std::vector<std::string> onames;
2372  for (casadi_int i=0; i<n_in_; ++i) onames.push_back(pref + name_in_[i]);
2373  // Options
2375  opts = combine(opts, generate_options("reverse"));
2376  opts["derivative_of"] = self();
2377  // Generate derivative function
2378  casadi_assert_dev(enable_reverse_);
2379  f = get_reverse(nadj, fname, inames, onames, opts);
2380  // Consistency check for inputs
2381  casadi_assert_dev(f.n_in()==n_in_ + n_out_ + n_out_);
2382  casadi_int ind=0;
2383  for (i=0; i<n_in_; ++i) f.assert_size_in(ind++, size1_in(i), size2_in(i));
2384  for (i=0; i<n_out_; ++i) f.assert_size_in(ind++, size1_out(i), size2_out(i));
2385  for (i=0; i<n_out_; ++i) f.assert_size_in(ind++, size1_out(i), nadj*size2_out(i));
2386  // Consistency check for outputs
2387  casadi_assert_dev(f.n_out()==n_in_);
2388  for (i=0; i<n_in_; ++i) f.assert_sparsity_out(i, sparsity_in(i), nadj);
2389  // Save to cache
2390  tocache_if_missing(f);
2391  }
2392  return f;
2393  }
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 computing nadj reverse (adjoint) directional derivatives.
Definition: function.cpp:1332

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

675  {
676  return "adj" + str(nadj) + "_" + fcn;
677  }

References casadi::str().

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

◆ root()

const RuntimeIntegrator * casadi::RuntimeIntegrator::root ( ) const
protectedinherited

Definition at line 262 of file runtime_integrator.cpp.

262  {
263  // Integrator at the start of the chain of derivatives
264  const RuntimeIntegrator* r = this;
265  while (!r->derivative_of_.is_null()) r = r->derivative_of_.get<RuntimeIntegrator>();
266  return r;
267 }

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

Referenced by codegen_method(), and casadi::RuntimeIntegrator::set_nominal_prob().

◆ run()

void casadi::RuntimeIntegrator::run ( RuntimeIntegratorMemory *  m) const
protectedinherited

Definition at line 387 of file runtime_integrator.cpp.

387  {
388  // Carry out the tasks requested by the kernel, for it or for the nominal integration
389  while (kernel(m)) {
391  if (a == &m->d ? task(m) : eval_task(m, a, calls_nom_)) a->fail = 1;
392  }
393 }
virtual int kernel(RuntimeIntegratorMemory *m) const =0
Call the kernel of the method: returns 1 while a task is requested.
casadi_ivp_data< T1 > * active
Definition: casadi_ivp.hpp:191

References casadi_ivp_data< T1 >::active, casadi::RuntimeIntegratorMemory::d, casadi_ivp_data< T1 >::fail, and casadi::RuntimeIntegrator::kernel().

Referenced by casadi::RuntimeIntegrator::advance_noevent(), casadi::RuntimeIntegrator::impulseB(), and casadi::RuntimeIntegrator::retreat().

◆ self()

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

◆ serialize()

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

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

Definition at line 4467 of file function_internal.cpp.

4467  {
4468  serialize_type(s);
4469  serialize_body(s);
4470  }
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::Integrator::serialize_base_function ( ) const
inlineoverridevirtualinherited

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

Reimplemented from casadi::ProtoFunction.

Definition at line 479 of file integrator_impl.hpp.

479 { return "Integrator"; }

◆ serialize_body()

void casadi::Rosenbrock::serialize_body ( SerializingStream &  s) const
overridevirtual

Reimplemented from casadi::RuntimeIntegrator.

Definition at line 269 of file rosenbrock.cpp.

269  {
271  s.version("Rosenbrock", 1);
272  s.pack("Rosenbrock::init_tol", init_tol_);
273  s.pack("Rosenbrock::init_max_iter", init_max_iter_);
274  }
void serialize_body(SerializingStream &s) const override
Serialize an object without type information.

References casadi::SerializingStream::pack(), casadi::RuntimeIntegrator::serialize_body(), and casadi::SerializingStream::version().

◆ serialize_type()

void casadi::Integrator::serialize_type ( SerializingStream &  s) const
overridevirtualinherited

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

Reimplemented from casadi::FunctionInternal.

Definition at line 2506 of file integrator.cpp.

2506  {
2509 }
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().

◆ set_function() [1/2]

void casadi::OracleFunction::set_function ( const Function &  fcn)
inlineinherited

Register the function for evaluation and statistics gathering

Definition at line 183 of file oracle_function.hpp.

183 { set_function(fcn, fcn.name()); }

References casadi::Function::name(), and casadi::OracleFunction::set_function().

Referenced by casadi::OracleFunction::set_function().

◆ set_function() [2/2]

void casadi::OracleFunction::set_function ( const Function &  fcn,
const std::string &  fname,
bool  jit = false 
)
inherited

◆ set_ivp_prob()

void casadi::RuntimeIntegrator::set_ivp_prob ( )
protectedinherited

Definition at line 269 of file runtime_integrator.cpp.

269  {
270  // Problem structure for the shared part of the kernel
271  p_.nx1 = nx1_;
272  p_.nz1 = nz1_;
273  p_.nq1 = nq1_;
274  p_.np1 = np1_;
275  p_.nu1 = nu1_;
276  p_.nfwd = nfwd_;
277  p_.nadj = nadj_;
278  p_.n_stages = alpha_.size();
279  p_.a = get_ptr(a_);
280  p_.alpha = get_ptr(alpha_);
281  p_.m = get_ptr(m_);
282  p_.n_dense = n_dense_;
284  for (casadi_int k = 0; k < IVP_NUM_JAC; ++k) {
285  p_.sp_jac[k] = sp_jac_.empty() ? nullptr : static_cast<const casadi_int*>(sp_jac_[k]);
286  }
289  p_.nx_err = nx_err_;
290  p_.nz_err = nz_err_;
291  p_.nq_err = quad_err_con_ ? nq_err_ : 0;
292  p_.abstol = abstol_;
293  p_.reltol = reltol_;
295  p_.m_err = m_err_.empty() ? nullptr : get_ptr(m_err_);
296  p_.safety = 0.9;
297  p_.fac_min = 0.2;
298  p_.fac_max = 6;
301  p_.h_init = step0_;
303  p_.ne = ne_;
304  p_.has_transition = has_function("transition");
309  casadi_ivp_setup(&p_);
310  calls_ = task_calls("");
311 }
std::vector< double > m_dense_
std::vector< double > alpha_
std::vector< Sparsity > sp_jac_
std::vector< double > m_err_
casadi_int order_err
Definition: casadi_ivp.hpp:134
casadi_int nz_err
Definition: casadi_ivp.hpp:130
casadi_int n_dense
Definition: casadi_ivp.hpp:120
const T1 * m
Definition: casadi_ivp.hpp:118
const T1 * m_err
Definition: casadi_ivp.hpp:135
const casadi_int * sp_jac[IVP_NUM_JAC]
Definition: casadi_ivp.hpp:123
const T1 * alpha
Definition: casadi_ivp.hpp:118
const T1 * m_dense
Definition: casadi_ivp.hpp:121
casadi_int max_num_steps
Definition: casadi_ivp.hpp:137
casadi_int max_event_iter
Definition: casadi_ivp.hpp:143
casadi_int max_events
Definition: casadi_ivp.hpp:143
casadi_int nx_err
Definition: casadi_ivp.hpp:130
casadi_int nz1
Definition: casadi_ivp.hpp:112
casadi_int np1
Definition: casadi_ivp.hpp:112
casadi_int nfwd
Definition: casadi_ivp.hpp:114
casadi_int nu1
Definition: casadi_ivp.hpp:112
casadi_int nx1
Definition: casadi_ivp.hpp:112
casadi_int nadj
Definition: casadi_ivp.hpp:114
const T1 * a
Definition: casadi_ivp.hpp:118
casadi_int ne
Definition: casadi_ivp.hpp:140
casadi_int nq1
Definition: casadi_ivp.hpp:112
casadi_int nq_err
Definition: casadi_ivp.hpp:130
casadi_int n_stages
Definition: casadi_ivp.hpp:117

References casadi_ivp_prob< T1 >::a, casadi::RuntimeIntegrator::a_, casadi_ivp_prob< T1 >::abstol, casadi::RuntimeIntegrator::abstol_, casadi_ivp_prob< T1 >::alpha, casadi::RuntimeIntegrator::alpha_, casadi_ivp_prob< T1 >::event_acceptable_tol, casadi::Integrator::event_acceptable_tol_, casadi_ivp_prob< T1 >::event_tol, casadi::Integrator::event_tol_, casadi_ivp_prob< T1 >::fac_max, casadi_ivp_prob< T1 >::fac_min, casadi::get_ptr(), casadi_ivp_prob< T1 >::h_init, casadi_ivp_prob< T1 >::h_max, casadi_ivp_prob< T1 >::h_min, casadi::OracleFunction::has_function(), casadi_ivp_prob< T1 >::has_transition, casadi_ivp_prob< T1 >::m, casadi::RuntimeIntegrator::m_, casadi_ivp_prob< T1 >::m_dense, casadi::RuntimeIntegrator::m_dense_, casadi_ivp_prob< T1 >::m_err, casadi::RuntimeIntegrator::m_err_, casadi_ivp_prob< T1 >::max_event_iter, casadi::Integrator::max_event_iter_, casadi_ivp_prob< T1 >::max_events, casadi::Integrator::max_events_, casadi_ivp_prob< T1 >::max_num_steps, casadi::RuntimeIntegrator::max_num_steps_, casadi::RuntimeIntegrator::max_step_size_, casadi::RuntimeIntegrator::min_step_size_, casadi_ivp_prob< T1 >::n_dense, casadi::RuntimeIntegrator::n_dense_, casadi_ivp_prob< T1 >::n_stages, casadi_ivp_prob< T1 >::nadj, casadi::Integrator::nadj_, casadi_ivp_prob< T1 >::ne, casadi::Integrator::ne_, casadi_ivp_prob< T1 >::nfwd, casadi::Integrator::nfwd_, casadi_ivp_prob< T1 >::np1, casadi::Integrator::np1_, casadi_ivp_prob< T1 >::nq1, casadi::Integrator::nq1_, casadi_ivp_prob< T1 >::nq_err, casadi::RuntimeIntegrator::nq_err_, casadi_ivp_prob< T1 >::nu1, casadi::Integrator::nu1_, casadi_ivp_prob< T1 >::nx1, casadi::Integrator::nx1_, casadi_ivp_prob< T1 >::nx_err, casadi::RuntimeIntegrator::nx_err_, casadi_ivp_prob< T1 >::nz1, casadi::Integrator::nz1_, casadi_ivp_prob< T1 >::nz_err, casadi::RuntimeIntegrator::nz_err_, casadi_ivp_prob< T1 >::order_err, casadi::RuntimeIntegrator::order_err_, casadi::RuntimeIntegrator::p_, casadi::RuntimeIntegrator::quad_err_con_, casadi_ivp_prob< T1 >::reltol, casadi::RuntimeIntegrator::reltol_, casadi_ivp_prob< T1 >::safety, casadi_ivp_prob< T1 >::sp_jac, casadi::RuntimeIntegrator::sp_jac_, casadi::RuntimeIntegrator::step0_, casadi_ivp_prob< T1 >::step_size, casadi::RuntimeIntegrator::step_size_, casadi::RuntimeIntegrator::tape_capacity(), and casadi_ivp_prob< T1 >::tape_size.

Referenced by casadi::Erk::Erk(), casadi::Erk::init(), init(), and Rosenbrock().

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

4034  {
4035 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
4036  // Safe access to jac_sparsity_
4037  std::lock_guard<std::mutex> lock(jac_sparsity_mtx_);
4038 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
4039  casadi_int ind = iind + oind * n_in_;
4040  jac_sparsity_[false].resize(n_in_ * n_out_);
4041  jac_sparsity_[false].at(ind) = sp;
4042  jac_sparsity_[true].resize(n_in_ * n_out_);
4043  jac_sparsity_[true].at(ind) = to_compact(oind, iind, sp);
4044  }

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

◆ set_nominal_prob()

void casadi::RuntimeIntegrator::set_nominal_prob ( )
protectedinherited

Definition at line 313 of file runtime_integrator.cpp.

313  {
314  // Forward directions folded into the DAE change the arithmetic of the nominal states: with
315  // adaptive steps, replay the steps of a nominal integration with the original functions
316  const RuntimeIntegrator* r = root();
317  if (!has_function("rhsF_nom") && r != this && r->nx1_ != nx1_ && step_size_ == 0) {
318  for (auto&& calls : r->task_calls("")) {
319  for (auto&& c : calls) {
320  std::string fname = c.fname + "_nom";
321  if (!has_function(fname)) set_function(r->get_function(c.fname), fname);
322  }
323  }
324  }
325  replay_ = has_function("rhsF_nom");
326  if (!replay_) return;
327  calls_nom_ = root()->task_calls("_nom");
328  p_nom_ = root()->p_;
329  p_nom_.tape_size = 0;
330  casadi_ivp_setup(&p_nom_);
331 }

References casadi::OracleFunction::get_function(), casadi::OracleFunction::has_function(), casadi::Integrator::nx1_, casadi::RuntimeIntegrator::p_, casadi::RuntimeIntegrator::p_nom_, casadi::RuntimeIntegrator::replay_, casadi::RuntimeIntegrator::root(), casadi::OracleFunction::set_function(), casadi::RuntimeIntegrator::step_size_, and casadi_ivp_prob< T1 >::tape_size.

Referenced by casadi::Erk::Erk(), casadi::Erk::init(), init(), and Rosenbrock().

◆ set_p()

void casadi::Integrator::set_p ( IntegratorMemory *  m,
const double *  p 
) const
inherited

Definition at line 2612 of file integrator.cpp.

2612  {
2613  casadi_copy(p, np_, m->p);
2614 }

References casadi::casadi_copy(), casadi::Integrator::np_, and casadi::IntegratorMemory::p.

Referenced by casadi::Integrator::eval(), and casadi::RuntimeIntegrator::eval().

◆ set_q()

void casadi::Integrator::set_q ( IntegratorMemory *  m,
const double *  q 
) const
inherited

Definition at line 2600 of file integrator.cpp.

2600  {
2601  casadi_copy(q, nq_, m->q);
2602 }

References casadi::casadi_copy(), casadi::Integrator::nq_, and casadi::IntegratorMemory::q.

Referenced by casadi::Integrator::eval(), and casadi::RuntimeIntegrator::eval().

◆ set_temp()

void casadi::OracleFunction::set_temp ( void *  mem,
const double **  arg,
double **  res,
casadi_int *  iw,
double *  w 
) const
overridevirtualinherited

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

Reimplemented from casadi::FunctionInternal.

Definition at line 509 of file oracle_function.cpp.

510  {
511 
512  auto *m = static_cast<OracleMemory*>(mem);
513  m->arg = arg;
514  m->res = res;
515  m->iw = iw;
516  m->w = w;
517  m->d_oracle.arg = arg;
518  m->d_oracle.res = res;
519  m->d_oracle.iw = iw;
520  m->d_oracle.w = w;
521  for (int i = 0; i < max_num_threads_; ++i) {
522  auto* ml = m->thread_local_mem[i];
523  for (auto&& s : ml->fstats) s.second.reset();
524  ml->arg = arg;
525  ml->res = res;
526  ml->iw = iw;
527  ml->w = w;
528  arg += stride_arg_;
529  res += stride_res_;
530  iw += stride_iw_;
531  w += stride_w_;
532  }
533 }

References casadi::OracleMemory::arg, casadi::OracleFunction::max_num_threads_, casadi::OracleFunction::stride_arg_, casadi::OracleFunction::stride_iw_, casadi::OracleFunction::stride_res_, and casadi::OracleFunction::stride_w_.

◆ set_u()

void casadi::Integrator::set_u ( IntegratorMemory *  m,
const double *  u 
) const
inherited

Definition at line 2616 of file integrator.cpp.

2616  {
2617  casadi_copy(u, nu_, m->u);
2618 }

References casadi::casadi_copy(), casadi::Integrator::nu_, and casadi::IntegratorMemory::u.

Referenced by casadi::Integrator::eval(), and casadi::RuntimeIntegrator::eval().

◆ set_work()

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

Reimplemented from casadi::RuntimeIntegrator.

Definition at line 202 of file rosenbrock.cpp.

203  {
204  auto m = static_cast<RosenbrockMemory*>(mem);
205  RuntimeIntegrator::set_work(mem, arg, res, iw, w);
206  m->r.prob = &pr_;
207  casadi_rosenbrock_set_work(&m->r, &arg, &res, &iw, &w);
208  if (replay_) {
209  m->r_nom.prob = &pr_nom_;
210  casadi_rosenbrock_set_work(&m->r_nom, &arg, &res, &iw, &w);
211  m->r.nom = &m->r_nom;
212  }
213  }
void set_work(void *mem, const double **&arg, double **&res, casadi_int *&iw, double *&w) const override
Set the (persistent) work vectors.

References casadi::RuntimeIntegrator::replay_, and casadi::RuntimeIntegrator::set_work().

◆ set_x()

void casadi::Integrator::set_x ( IntegratorMemory *  m,
const double *  x 
) const
inherited

Definition at line 2604 of file integrator.cpp.

2604  {
2605  casadi_copy(x, nx_, m->x);
2606 }

References casadi::casadi_copy(), casadi::Integrator::nx_, and casadi::IntegratorMemory::x.

Referenced by casadi::Integrator::eval(), and casadi::RuntimeIntegrator::eval().

◆ set_z()

void casadi::Integrator::set_z ( IntegratorMemory *  m,
const double *  z 
) const
inherited

Definition at line 2608 of file integrator.cpp.

2608  {
2609  casadi_copy(z, nz_, m->z);
2610 }

References casadi::casadi_copy(), casadi::Integrator::nz_, and casadi::IntegratorMemory::z.

Referenced by casadi::Integrator::eval(), and casadi::RuntimeIntegrator::eval().

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

3804  {
3805  set_work(mem, arg, res, iw, w);
3806  set_temp(mem, arg, res, iw, w);
3807  auto *m = static_cast<FunctionMemory*>(mem);
3808  m->stats_available = true;
3809  }
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::RuntimeIntegrator::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 2562 of file function_internal.cpp.

2562  {
2563  return "int " + fname + "(const casadi_real** arg, casadi_real** res, "
2564  "casadi_int* iw, casadi_real* w, int mem)";
2565  }

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

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

2567  {
2568  std::vector<std::string> args;
2569  for (auto e : name_in_) {
2570  args.push_back("const casadi_real* " + str(e));
2571  }
2572  for (auto e : name_out_) {
2573  args.push_back("casadi_real* " + str(e));
2574  }
2575  args.push_back("const casadi_real** arg");
2576  args.push_back("casadi_real** res");
2577  args.push_back("casadi_int* iw");
2578  args.push_back("casadi_real* w");
2579  args.push_back("int mem");
2580  return "int " + fname + "_unrolled(" + join(args, ", ") + ")";
2581  }

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

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

◆ simplify_passes()

Function casadi::FunctionInternal::simplify_passes ( const std::vector< std::pair< std::string, casadi_int > > &  tasks) const
virtualinherited

Each pass is a (task, count) pair; count>0 runs the task that many times, count==0 runs it until a fixed point.

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

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

Definition at line 4003 of file function_internal.cpp.

4004  {
4005  casadi_assert(tasks.empty(), "simplify passes not supported for " + class_name());
4006  return self();
4007  }

References casadi::SharedObjectInternal::class_name().

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

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

4017  {
4018  return wrap().slice(name, order_in, order_out, opts);
4019  }
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
Create a function with a subset or reordering of the inputs and outputs.
Definition: function.cpp:899

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

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

◆ sp_forward()

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

Propagate sparsity, with the controls of a group at each of its output intervals

Reimplemented from casadi::Integrator.

Definition at line 530 of file runtime_integrator.cpp.

531  {
532  if (ne_ > 0 || ngroup() == nt()) return Integrator::sp_forward(arg, res, iw, w, mem);
533  // Controls and control adjoints by output interval
534  const bvec_t* u = arg[INTEGRATOR_U];
535  bvec_t* adj_u = res[INTEGRATOR_ADJ_U];
536  bvec_t* u_k = w; w += nu_ * nt();
537  bvec_t* adj_u_k = w; w += nuq_ * nt();
538  if (u) groups_to_intervals(group_start_, u, u_k, nu_);
539  arg[INTEGRATOR_U] = u ? u_k : nullptr;
540  res[INTEGRATOR_ADJ_U] = adj_u ? adj_u_k : nullptr;
541  int flag = Integrator::sp_forward(arg, res, iw, w, mem);
542  arg[INTEGRATOR_U] = u;
543  res[INTEGRATOR_ADJ_U] = adj_u;
544  if (adj_u) {
545  std::fill_n(adj_u, nuq_ * ngroup(), 0);
546  intervals_to_groups(group_start_, adj_u_k, adj_u, nuq_);
547  }
548  return flag;
549 }
int sp_forward(const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const override
Propagate sparsity forward.

References casadi::RuntimeIntegrator::group_start_, casadi::INTEGRATOR_ADJ_U, casadi::INTEGRATOR_U, casadi::Integrator::ne_, casadi::RuntimeIntegrator::ngroup(), casadi::Integrator::nt(), casadi::Integrator::nu_, casadi::Integrator::nuq_, and casadi::Integrator::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 3109 of file function_internal.cpp.

3110  {
3111  // Get the sparsity of the Jacobian block
3112  Sparsity sp = jac_sparsity(oind, iind, true, false);
3113  if (sp.is_null() || sp.nnz() == 0) return 0; // Skip if zero
3114  // Carry out the sparse matrix-vector multiplication
3115  casadi_int d1 = sp.size2();
3116  const casadi_int *colind = sp.colind(), *row = sp.row();
3117  for (casadi_int cc=0; cc<d1; ++cc) {
3118  for (casadi_int el = colind[cc]; el < colind[cc+1]; ++el) {
3119  res[oind][row[el]] |= arg[iind][cc];
3120  }
3121  }
3122  return 0;
3123  }

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

Sparsity casadi::Integrator::sp_jac_aug ( const Sparsity &  J,
const Sparsity &  J1 
) const
inherited

Definition at line 1871 of file integrator.cpp.

1871  {
1872  // Row 1, column 2 in the augmented Jacobian
1873  Sparsity J12(J.size1(), nfwd_ * J.size2());
1874  // Row 2, column 1 in the augmented Jacobian
1875  Sparsity J21 = vertcat(std::vector<Sparsity>(nfwd_, J1));
1876  // Row 2, column 2 in the augmented Jacobian
1877  Sparsity J22 = diagcat(std::vector<Sparsity>(nfwd_, J));
1878  // Form block matrix
1879  return blockcat(J, J12, J21, J22);
1880 }

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

Referenced by casadi::Integrator::sp_jac_dae(), and casadi::Integrator::sp_jac_rdae().

◆ sp_jac_dae()

Sparsity casadi::Integrator::sp_jac_dae ( )
inherited

Definition at line 1883 of file integrator.cpp.

1883  {
1884  // Get the functions
1885  const Function& F = get_function("daeF");
1886  // Sparsity pattern for nonaugmented system
1887  Sparsity J_xx = F.jac_sparsity(DAE_ODE, DYN_X) + Sparsity::diag(nx1_);
1888  Sparsity J_xz = F.jac_sparsity(DAE_ODE, DYN_Z);
1889  Sparsity J_zx = F.jac_sparsity(DAE_ALG, DYN_X);
1890  Sparsity J_zz = F.jac_sparsity(DAE_ALG, DYN_Z);
1891  // Augment with sensitivity equations
1892  if (nfwd_ > 0) {
1893  const Function& fwd_F = get_function(forward_name("daeF", 1));
1894  J_xx = sp_jac_aug(J_xx, fwd_F.jac_sparsity(DAE_ODE, DYN_X));
1895  J_xz = sp_jac_aug(J_xz, fwd_F.jac_sparsity(DAE_ODE, DYN_Z));
1896  J_zx = sp_jac_aug(J_zx, fwd_F.jac_sparsity(DAE_ALG, DYN_X));
1897  J_zz = sp_jac_aug(J_zz, fwd_F.jac_sparsity(DAE_ALG, DYN_Z));
1898  }
1899  // Assemble the block matrix
1900  return blockcat(J_xx, J_xz, J_zx, J_zz);
1901 }
Sparsity sp_jac_aug(const Sparsity &J, const Sparsity &J1) const
Helper function, get augmented system Jacobian.
static Sparsity diag(casadi_int nrow)
Create a diagonal sparsity pattern.
Definition: sparsity.hpp:723

References casadi::Integrator::DAE_ALG, casadi::Integrator::DAE_ODE, casadi::Sparsity::diag(), casadi::DYN_X, casadi::DYN_Z, casadi::FunctionInternal::forward_name(), casadi::OracleFunction::get_function(), casadi::Function::jac_sparsity(), casadi::Integrator::nfwd_, casadi::Integrator::nx1_, and casadi::Integrator::sp_jac_aug().

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

◆ sp_jac_rdae()

Sparsity casadi::Integrator::sp_jac_rdae ( )
inherited

Definition at line 1903 of file integrator.cpp.

1903  {
1904  // Get the functions
1905  const Function& G = get_function("daeB");
1906  // Sparsity pattern for nonaugmented system
1907  Sparsity J_xx = G.jac_sparsity(BDAE_ADJ_X, BDYN_ADJ_ODE) + Sparsity::diag(nrx1_ * nadj_);
1908  Sparsity J_xz = G.jac_sparsity(BDAE_ADJ_X, BDYN_ADJ_ALG);
1909  Sparsity J_zx = G.jac_sparsity(BDAE_ADJ_Z, BDYN_ADJ_ODE);
1910  Sparsity J_zz = G.jac_sparsity(BDAE_ADJ_Z, BDYN_ADJ_ALG);
1911  // Augment with sensitivity equations
1912  if (nfwd_ > 0) {
1913  const Function& fwd_G = get_function(forward_name("daeB", 1));
1914  J_xx = sp_jac_aug(J_xx, fwd_G.jac_sparsity(BDAE_ADJ_X, BDYN_ADJ_ODE));
1915  J_xz = sp_jac_aug(J_xz, fwd_G.jac_sparsity(BDAE_ADJ_X, BDYN_ADJ_ALG));
1916  J_zx = sp_jac_aug(J_zx, fwd_G.jac_sparsity(BDAE_ADJ_Z, BDYN_ADJ_ODE));
1917  J_zz = sp_jac_aug(J_zz, fwd_G.jac_sparsity(BDAE_ADJ_Z, BDYN_ADJ_ALG));
1918  }
1919  // Assemble the block matrix
1920  return blockcat(J_xx, J_xz, J_zx, J_zz);
1921 }

References casadi::Integrator::BDAE_ADJ_X, casadi::Integrator::BDAE_ADJ_Z, casadi::Integrator::BDYN_ADJ_ALG, casadi::Integrator::BDYN_ADJ_ODE, casadi::Sparsity::diag(), casadi::FunctionInternal::forward_name(), casadi::OracleFunction::get_function(), casadi::Function::jac_sparsity(), casadi::Integrator::nadj_, casadi::Integrator::nfwd_, casadi::Integrator::nrx1_, and casadi::Integrator::sp_jac_aug().

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

◆ sp_reverse()

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

Propagate sparsity, with the controls of a group at each of its output intervals

Reimplemented from casadi::Integrator.

Definition at line 551 of file runtime_integrator.cpp.

552  {
553  if (ne_ > 0 || ngroup() == nt()) return Integrator::sp_reverse(arg, res, iw, w, mem);
554  // Controls and control adjoints by output interval
555  bvec_t* u = arg[INTEGRATOR_U];
556  bvec_t* adj_u = res[INTEGRATOR_ADJ_U];
557  bvec_t* u_k = w; w += nu_ * nt();
558  bvec_t* adj_u_k = w; w += nuq_ * nt();
559  std::fill_n(u_k, nu_ * nt(), 0);
560  if (adj_u) {
561  groups_to_intervals(group_start_, adj_u, adj_u_k, nuq_);
562  std::fill_n(adj_u, nuq_ * ngroup(), 0);
563  }
564  arg[INTEGRATOR_U] = u ? u_k : nullptr;
565  res[INTEGRATOR_ADJ_U] = adj_u ? adj_u_k : nullptr;
566  int flag = Integrator::sp_reverse(arg, res, iw, w, mem);
567  arg[INTEGRATOR_U] = u;
568  res[INTEGRATOR_ADJ_U] = adj_u;
569  if (u) intervals_to_groups(group_start_, u_k, u, nu_);
570  return flag;
571 }
int sp_reverse(bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const override
Propagate sparsity backwards.

References casadi::RuntimeIntegrator::group_start_, casadi::INTEGRATOR_ADJ_U, casadi::INTEGRATOR_U, casadi::Integrator::ne_, casadi::RuntimeIntegrator::ngroup(), casadi::Integrator::nt(), casadi::Integrator::nu_, casadi::Integrator::nuq_, and casadi::Integrator::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 3540 of file function_internal.cpp.

3540  {
3541  // If reverse mode propagation unavailable, use forward
3542  if (!has_sprev()) return 0;
3543 
3544  // If forward mode propagation unavailable, use reverse
3545  if (!has_spfwd()) return 1;
3546 
3547  // Use the (potentially user set) option
3548  return ad_weight_sp_;
3549  }

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

4158  {
4159  // Variable number of arguments
4160  va_list args;
4161  va_start(args, fmt);
4162  // Print to buffer
4163  casadi_int n = vsnprintf(buf, buf_sz, fmt, args);
4164  // Cleanup
4165  va_end(args);
4166  // Throw error if failure
4167  casadi_assert(n>=0 && n<buf_sz, "Print failure while processing '" + std::string(fmt) + "'");
4168  }

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

◆ string_from_UnifiedReturnStatus()

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

Definition at line 4226 of file function_internal.cpp.

4226  {
4227  switch (status) {
4228  case SOLVER_RET_LIMITED: return "SOLVER_RET_LIMITED";
4229  case SOLVER_RET_NAN: return "SOLVER_RET_NAN";
4230  case SOLVER_RET_SUCCESS: return "SOLVER_RET_SUCCESS";
4231  default: return "SOLVER_RET_UNKNOWN";
4232  }
4233  }
@ 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 3567 of file function_internal.cpp.

3567  {
3568  std::vector<SX> ret(n_in_);
3569  for (casadi_int i=0; i<ret.size(); ++i) {
3570  ret[i] = sx_in(i);
3571  }
3572  return ret;
3573  }
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 3575 of file function_internal.cpp.

3575  {
3576  std::vector<SX> ret(n_out_);
3577  for (casadi_int i=0; i<ret.size(); ++i) {
3578  ret[i] = sx_out(i);
3579  }
3580  return ret;
3581  }
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 1272 of file function_internal.cpp.

1272  {
1273  return self()(arg);
1274  }

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

1602  {
1603  std::vector<std::vector<MatType> > aseed(nadj, v);
1604  for (casadi_int dir=0; dir<nadj; ++dir) {
1605  // Replace symbolic inputs
1606  casadi_int oind=0;
1607  for (typename std::vector<MatType>::iterator i=aseed[dir].begin();
1608  i!=aseed[dir].end();
1609  ++i, ++oind) {
1610  // Name of the adjoint seed
1611  std::stringstream ss;
1612  ss << "a";
1613  if (nadj>1) ss << dir << "_";
1614  ss << oind;
1615 
1616  // Save to matrix
1617  *i = MatType::sym(ss.str(), is_diff_out_[oind] ? i->sparsity() : Sparsity(i->size()));
1618 
1619  }
1620  }
1621  return aseed;
1622  }

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

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

Definition at line 1233 of file function_internal.hpp.

1233 { return sz_w_per_ + sz_w_tmp_;}

Referenced by casadi::FunctionInternal::alloc(), casadi::RuntimeIntegrator::alloc_ivp_work(), casadi::FunctionInternal::alloc_w(), casadi::FunctionInternal::call_gen(), casadi::OmpMap::codegen_body(), casadi::ThreadMap::codegen_body(), casadi::MXFunction::codegen_body(), casadi::ThreadMap::codegen_declarations(), casadi::FunctionInternal::codegen_meta(), casadi::FunctionInternal::codegen_sz_w(), casadi::MXFunction::codegen_sz_w(), casadi::SXFunction::codegen_sz_w(), casadi::OmpMap::eval(), casadi::FunctionInternal::eval_gen(), casadi::SXFunction::eval_mx(), casadi::OracleFunction::finalize(), casadi::FunctionInternal::get_jac_sparsity_gen(), casadi::FunctionInternal::get_jac_sparsity_hierarchical(), casadi::FunctionInternal::get_jac_sparsity_hierarchical_symm(), casadi::External::init(), casadi::MXFunction::init(), casadi::Nlpsol::init(), casadi::Rootfinder::init(), casadi::MadmpecInterface::init(), casadi::ClarabelInterface::init(), casadi::DaqpInterface::init(), casadi::FatropConicInterface::init(), casadi::FatropInterface::init(), casadi::HighsInterface::init(), casadi::HpipmInterface::init(), casadi::MadnlpInterface::init(), casadi::MosekInterface::init(), casadi::XpressInterface::init(), casadi::Feasiblesqpmethod::init(), casadi::Qrqp::init(), init(), casadi::Sqpmethod::init(), casadi::MXFunction::sp_reverse(), casadi::SXFunction::sp_reverse(), and casadi::FunctionInternal::sz_work().

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

3158  {
3159  sz_arg = this->sz_arg();
3160  sz_res = this->sz_res();
3161  sz_iw = this->sz_iw();
3162  sz_w = this->sz_w();
3163  }

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

◆ tape_capacity()

casadi_int casadi::RuntimeIntegrator::tape_capacity ( ) const
protectedinherited

Definition at line 343 of file runtime_integrator.cpp.

343  {
344  // Steps: a user bound with adaptive steps, a run of steps per control group with fixed steps
345  casadi_int ny = nx_ + nz_ + nq_, n_step = max_tape_steps_, n_init, n_event = 0;
346  if (step_size_ > 0) {
347  n_step = 0;
348  for (casadi_int j = 0; j < ngroup(); ++j) {
349  double t = j == 0 ? t0_ : tout_[group_start_[j] - 1];
350  n_step += casadi_ivp_steps(tout_[group_start_[j + 1] - 1] - t, step_size_);
351  }
352  }
353  if (nadj_ == 0 || n_step == 0) return 0;
354  // Every output interval may start with a consistent initialization
355  n_init = nz_ > 0 ? nt() : 0;
356  if (ne_ > 0) {
357  // Event records, room for one more with each step; after an event, a consistent
358  // initialization and, with fixed steps, a new run of steps
359  n_event = max_events_ + 1;
360  if (nz_ > 0) n_init += max_events_;
361  if (step_size_ > 0) n_step += max_events_;
362  }
363  return n_step * (ny * (static_cast<casadi_int>(alpha_.size()) + 1) + nu_ + 5)
364  + (n_init + n_event) * (ny + nu_ + 5);
365 }

References casadi::RuntimeIntegrator::alpha_, casadi::RuntimeIntegrator::group_start_, casadi::Integrator::max_events_, casadi::RuntimeIntegrator::max_tape_steps_, casadi::Integrator::nadj_, casadi::Integrator::ne_, casadi::RuntimeIntegrator::ngroup(), casadi::Integrator::nq_, casadi::Integrator::nt(), casadi::Integrator::nu_, casadi::Integrator::nx_, casadi::Integrator::nz_, casadi::RuntimeIntegrator::step_size_, casadi::Integrator::t0_, and casadi::Integrator::tout_.

Referenced by casadi::RuntimeIntegrator::set_ivp_prob().

◆ to_compact()

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

Definition at line 2043 of file function_internal.cpp.

2044  {
2045  // Strip rows and columns
2046  std::vector<casadi_int> mapping;
2047  return sp.sub(sparsity_out(oind).find(), sparsity_in(iind).find(), mapping);
2048  }

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

◆ trace_values()

void casadi::FunctionInternal::trace_values ( std::ostream &  trace,
const double *  values,
casadi_int  nnz 
)
staticprotectedinherited

Definition at line 833 of file function_internal.cpp.

834  {
835  if (!values) {
836  trace << "null";
837  return;
838  }
839  trace << "[";
840  for (casadi_int i = 0; i < nnz; ++i) {
841  if (i) trace << ",";
842  double v = values[i];
843  if (isnan(v)) {
844  trace << "\"nan\"";
845  } else if (isinf(v)) {
846  trace << (v < 0 ? "\"-inf\"" : "\"inf\"");
847  } else {
848  normalized_out(trace, v);
849  }
850  }
851  trace << "]";
852  }

References casadi::normalized_out().

Referenced by casadi::FunctionInternal::finish_trace(), casadi::FunctionInternal::open_trace(), casadi::MXFunction::trace_instruction(), and casadi::SXFunction::trace_instruction().

◆ trigger_event()

int casadi::Integrator::trigger_event ( IntegratorMemory *  m,
casadi_int *  ind 
) const
inherited

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

Definition at line 2719 of file integrator.cpp.

2719  {
2720  // Throw an error if too many events are happening within a single control interval
2721  if (++m->num_events > max_events_) {
2722  casadi_error("At t = " + str(m->t) + ": Too many event iterations during interval "
2723  + str(m->k));
2724  }
2725  // Consistency checks
2726  if (*ind < 0 || m->event_triggered[*ind]) return 1;
2727  // Mark event as triggered
2728  m->event_triggered[*ind] = 1;
2729  // Print progress
2730  if (verbose_) casadi_message("Zero crossing for index " + str(*ind) + " at t = " + str(m->t));
2731  // The event time will be impacted by perturbations in x, z, u, p.
2732  // the perturbed time will be given by the following implicit function:
2733  // e[ind](t, x + (t - t_event) * xdot, z + (t - t_event) * zdot, u, p) = 0
2734  // The sensitivities of t as a functions of fwd_x, fwd_z, fwd_u and fwd_p
2735  // are given by the implicit function theorem:
2736  // de/dt(t, x, z, u, p) * fwd_t + de/dx * fwd_x + de/dz * fwd_z + de/du * fwd_u + de/dp * fwd_p
2737  // <=> fwd_t = -fwd_e(fwd_x, fwd_z, fwd_u, fwd_p) / edot
2738  if (nfwd_ > 0) {
2739  m->arg[DYN_NUM_IN + DYN_ODE] = m->xdot; // out:ode
2740  m->arg[DYN_NUM_IN + DYN_ALG] = nullptr; // out:alg
2741  m->arg[DYN_NUM_IN + DYN_QUAD] = nullptr; // out:quad
2742  m->arg[DYN_NUM_IN + DYN_ZERO] = m->e; // out:zero
2743  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_T] = nullptr; // fwd:t
2744  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_X] = m->x + nx1_; // fwd:x
2745  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_Z] = m->z + nz1_; // fwd:z
2746  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_P] = m->p + np1_; // fwd:p
2747  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_U] = m->u + nu1_; // fwd:u
2748  m->res[DYN_ODE] = nullptr; // fwd:ode
2749  m->res[DYN_ALG] = nullptr; // fwd:alg
2750  m->res[DYN_QUAD] = nullptr; // fwd:quad
2751  m->res[DYN_ZERO] = m->tmp1; // fwd:zero
2752  if (calc_function(m, forward_name("dae", nfwd_))) return 1;
2753  // Calculate sensitivity in t
2754  for (casadi_int i = 0; i < nfwd_; ++i) {
2755  m->tmp1[i] = -m->tmp1[*ind + ne_ * i] / m->edot[*ind];
2756  }
2757  // Propagate this sensitivity to the state vector
2758  for (casadi_int i = 0; i < nfwd_; ++i) {
2759  casadi_axpy(nx1_, m->tmp1[i], m->xdot, m->x + nx1_ * (1 + i));
2760  }
2761  }
2762  // Call event transition function, if any
2763  if (has_function("transition")) {
2764  // Evaluate to tmp2
2765  double index = *ind; // function expects floating point values
2766  m->arg[EVENT_INDEX] = &index; // index
2767  m->arg[EVENT_T] = &m->t; // t
2768  m->arg[EVENT_X] = m->x; // x
2769  m->arg[EVENT_Z] = m->z; // z
2770  m->arg[EVENT_P] = m->p; // p
2771  m->arg[EVENT_U] = m->u; // u
2772  m->res[EVENT_POST_X] = m->tmp2; // post_x
2773  m->res[EVENT_POST_Z] = m->tmp2 + nx_; // post_z
2774  if (calc_function(m, "transition")) return 1;
2775  // Propagate forward sensitivities
2776  if (nfwd_ > 0) {
2777  // Propagate sensitivities through event transition
2778  m->arg[EVENT_NUM_IN + EVENT_POST_X] = m->tmp2; // out:post_x
2779  m->arg[EVENT_NUM_IN + EVENT_POST_Z] = m->tmp2 + nx_; // out:post_z
2780  m->arg[EVENT_NUM_IN + EVENT_NUM_OUT + EVENT_INDEX] = nullptr; // fwd:index
2781  m->arg[EVENT_NUM_IN + EVENT_NUM_OUT + EVENT_T] = m->tmp1; // fwd:t
2782  m->arg[EVENT_NUM_IN + EVENT_NUM_OUT + EVENT_X] = m->x + nx1_; // fwd:x
2783  m->arg[EVENT_NUM_IN + EVENT_NUM_OUT + EVENT_Z] = m->z + nz1_; // fwd:z
2784  m->arg[EVENT_NUM_IN + EVENT_NUM_OUT + EVENT_P] = m->p + np1_; // fwd:p
2785  m->arg[EVENT_NUM_IN + EVENT_NUM_OUT + EVENT_U] = m->u + nu1_; // fwd:u
2786  m->res[EVENT_POST_X] = m->tmp2 + nx1_; // fwd:post_x
2787  m->res[EVENT_POST_Z] = m->tmp2 + nx_ + nz1_; // fwd:post_z
2788  calc_function(m, forward_name("transition", nfwd_));
2789  }
2790  }
2791  // Update x, z
2792  casadi_copy(m->tmp2, nx_ + nz_, m->x);
2793  // Calculate m->xdot and m->zdot
2794  if (calc_edot(m)) return 1;
2795  // Propagate this sensitivity to the state vector
2796  for (casadi_int i = 0; i < nfwd_; ++i) {
2797  casadi_axpy(nx1_, -m->tmp1[i], m->xdot, m->x + nx1_ * (1 + i));
2798  }
2799  // TODO(@jaeandersson): Check if other events need to be triggered
2800  *ind = -1; // for now, do not trigger other events
2801  return 0;
2802 }
@ EVENT_NUM_IN
Definition: integrator.hpp:935
@ EVENT_NUM_OUT
Definition: integrator.hpp:941
void casadi_axpy(casadi_int n, T1 alpha, const T1 *x, T1 *y)
AXPY: y <- a*x + y.

References casadi::OracleMemory::arg, casadi::Integrator::calc_edot(), casadi::OracleFunction::calc_function(), casadi::casadi_axpy(), casadi::casadi_copy(), casadi::DYN_ALG, casadi::DYN_NUM_IN, casadi::DYN_NUM_OUT, casadi::DYN_ODE, casadi::DYN_P, casadi::DYN_QUAD, casadi::DYN_T, casadi::DYN_U, casadi::DYN_X, casadi::DYN_Z, casadi::DYN_ZERO, casadi::IntegratorMemory::e, casadi::IntegratorMemory::edot, casadi::EVENT_INDEX, casadi::EVENT_NUM_IN, casadi::EVENT_NUM_OUT, casadi::EVENT_P, casadi::EVENT_POST_X, casadi::EVENT_POST_Z, casadi::EVENT_T, casadi::IntegratorMemory::event_triggered, casadi::EVENT_U, casadi::EVENT_X, casadi::EVENT_Z, casadi::FunctionInternal::forward_name(), casadi::OracleFunction::has_function(), casadi::IntegratorMemory::k, casadi::Integrator::max_events_, casadi::Integrator::ne_, casadi::Integrator::nfwd_, casadi::Integrator::np1_, casadi::Integrator::nu1_, casadi::IntegratorMemory::num_events, casadi::Integrator::nx1_, casadi::Integrator::nx_, casadi::Integrator::nz1_, casadi::Integrator::nz_, casadi::IntegratorMemory::p, casadi::OracleMemory::res, casadi::str(), casadi::IntegratorMemory::t, casadi::IntegratorMemory::tmp1, casadi::IntegratorMemory::tmp2, casadi::IntegratorMemory::u, casadi::ProtoFunction::verbose_, casadi::IntegratorMemory::x, casadi::IntegratorMemory::xdot, and casadi::IntegratorMemory::z.

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

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

215  {
216 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
217  auto* w = weak_ref_.load(std::memory_order_acquire);
218  if (!w) {
219  auto* nw = new GenericWeakRef<Shared, Internal>(static_cast<Internal*>(this));
220  GenericWeakRef<Shared, Internal>* expected = nullptr;
221  if (weak_ref_.compare_exchange_strong(
222  expected, nw, std::memory_order_release, std::memory_order_acquire)) {
223  w = nw;
224  } else {
225  delete nw; // lost the race; another thread published first
226  w = expected;
227  }
228  }
229  return w;
230 #else
231  if (weak_ref_==nullptr) {
232  weak_ref_ = new GenericWeakRef<Shared, Internal>(static_cast<Internal*>(this));
233  }
234  return weak_ref_;
235 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
236  }

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

3997  {
3998  Function f = shared_from_this<Function>();
3999  f = f.wrap();
4000  return f.which_depends(s_in, s_out, order, tr);
4001  }

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

◆ wrap() [1/2]

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

◆ wrap() [2/2]

Function casadi::FunctionInternal::wrap ( const std::string &  name) const
inherited

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

Definition at line 1251 of file function_internal.cpp.

1251  {
1252  Function f;
1253  if (!incache(name, f)) {
1254  // Options
1255  Dict opts;
1256  opts["derivative_of"] = derivative_of_;
1257  opts["ad_weight"] = ad_weight();
1258  opts["ad_weight_sp"] = sp_weight();
1259  opts["max_num_dir"] = max_num_dir_;
1260  opts["is_diff_in"] = is_diff_in_;
1261  opts["is_diff_out"] = is_diff_out_;
1262  // Wrap the function
1263  std::vector<MX> arg = mx_in();
1264  std::vector<MX> res = self()(arg);
1265  f = Function(name, arg, res, name_in_, name_out_, opts);
1266  // Save in cache
1267  tocache_if_missing(f);
1268  }
1269  return f;
1270  }

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::FunctionInternal::name_in_, casadi::FunctionInternal::name_out_, casadi::FunctionInternal::sp_weight(), and casadi::FunctionInternal::tocache_if_missing().

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

◆ wrap_as_needed() [1/2]

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

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

Definition at line 1226 of file function_internal.cpp.

1226  {
1227  return wrap_as_needed("wrap_" + name_, opts);
1228  }
Function wrap_as_needed(const std::string &name, const Dict &opts) const
Wrap in an Function instance consisting of only one MX call.

References casadi::ProtoFunction::name_, and casadi::FunctionInternal::wrap_as_needed().

◆ wrap_as_needed() [2/2]

Function casadi::FunctionInternal::wrap_as_needed ( const std::string &  name,
const Dict &  opts 
) const
inherited

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

Definition at line 1230 of file function_internal.cpp.

1230  {
1231  if (opts.empty() && name==name_) return shared_from_this<Function>();
1232  // Options
1233  Dict my_opts = opts;
1234  my_opts["derivative_of"] = derivative_of_;
1235  if (my_opts.find("ad_weight")==my_opts.end())
1236  my_opts["ad_weight"] = ad_weight();
1237  if (my_opts.find("ad_weight_sp")==my_opts.end())
1238  my_opts["ad_weight_sp"] = sp_weight();
1239  if (my_opts.find("max_num_dir")==my_opts.end())
1240  my_opts["max_num_dir"] = max_num_dir_;
1241  // Wrap the function
1242  std::vector<MX> arg = mx_in();
1243  std::vector<MX> res = self()(arg);
1244  return Function(name, arg, res, name_in_, name_out_, my_opts);
1245  }

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(), and casadi::FunctionInternal::wrap_as_needed().

Member Data Documentation

◆ a_

std::vector<double> casadi::RuntimeIntegrator::a_
protectedinherited

Definition at line 181 of file runtime_integrator.hpp.

Referenced by casadi::RuntimeIntegrator::set_ivp_prob().

◆ abstol_

double casadi::RuntimeIntegrator::abstol_
protectedinherited

◆ ad_weight_

double casadi::FunctionInternal::ad_weight_
inherited

◆ ad_weight_sp_

double casadi::FunctionInternal::ad_weight_sp_
inherited

◆ all_functions_

std::map<std::string, RegFun> casadi::OracleFunction::all_functions_
protectedinherited

◆ alpha_

std::vector<double> casadi::RuntimeIntegrator::alpha_
protectedinherited

◆ always_inline_

bool casadi::FunctionInternal::always_inline_
inherited

◆ augmented_options_

Dict casadi::Integrator::augmented_options_
inherited

◆ cache_

WeakCache<std::string, Function> casadi::FunctionInternal::cache_
mutableinherited

◆ cache_init_

Dict casadi::FunctionInternal::cache_init_
inherited

◆ checkout_

casadi_checkout_t casadi::FunctionInternal::checkout_
inherited

◆ codegen_options_

Dict casadi::FunctionInternal::codegen_options_
inherited

◆ common_options_

Dict casadi::OracleFunction::common_options_
protectedinherited

◆ compiler_

Importer casadi::FunctionInternal::compiler_
inherited

◆ compiler_plugin_

std::string casadi::FunctionInternal::compiler_plugin_
inherited

◆ custom_jacobian_

Function casadi::FunctionInternal::custom_jacobian_
inherited

◆ decref_

signal_t casadi::FunctionInternal::decref_
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},
{"ForwardDiff", ForwardDiff::deserialize},
{"BackwardDiff", BackwardDiff::deserialize},
{"CentralDiff", CentralDiff::deserialize},
{"Smoothing", Smoothing::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)
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
static ProtoFunction * deserialize(DeserializingStream &s)
void deserialize(DeserializingStream &s, SDPToSOCPMem &m)
Definition: conic.cpp:958
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
Definition: external.cpp:508
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize without type information.
static ProtoFunction * deserialize(DeserializingStream &s)
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:114
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
Definition: nlpsol.cpp:1435
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into a plugin instance (dispatches on the plugin name)
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
Definition: rootfinder.cpp:595
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize without type information.
static ProtoFunction * deserialize(DeserializingStream &s)
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize without type information.
Definition: switch.hpp:150

Definition at line 1517 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

◆ event_acceptable_tol_

double casadi::Integrator::event_acceptable_tol_
inherited

◆ event_tol_

double casadi::Integrator::event_tol_
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

◆ group_start_

std::vector<casadi_int> casadi::RuntimeIntegrator::group_start_
protectedinherited

◆ has_refcount_

bool casadi::FunctionInternal::has_refcount_
inherited

◆ has_refcount_in_deps_

bool casadi::FunctionInternal::has_refcount_in_deps_
inherited

◆ incref_

signal_t casadi::FunctionInternal::incref_
inherited

◆ infix_

const std::string casadi::Integrator::infix_ = "integrator"
staticinherited

Definition at line 456 of file integrator_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_directory_

std::string casadi::FunctionInternal::jit_directory_
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

◆ m_

std::vector<double> casadi::RuntimeIntegrator::m_
protectedinherited

Definition at line 181 of file runtime_integrator.hpp.

Referenced by casadi::RuntimeIntegrator::set_ivp_prob().

◆ m_dense_

std::vector<double> casadi::RuntimeIntegrator::m_dense_
protectedinherited

Definition at line 181 of file runtime_integrator.hpp.

Referenced by casadi::RuntimeIntegrator::set_ivp_prob().

◆ m_err_

std::vector<double> casadi::RuntimeIntegrator::m_err_
protectedinherited

◆ max_event_iter_

casadi_int casadi::Integrator::max_event_iter_
inherited

◆ max_events_

casadi_int casadi::Integrator::max_events_
inherited

◆ max_io_

casadi_int casadi::FunctionInternal::max_io_
inherited

◆ max_num_dir_

casadi_int casadi::FunctionInternal::max_num_dir_
inherited

◆ max_num_steps_

casadi_int casadi::RuntimeIntegrator::max_num_steps_
protectedinherited

◆ max_num_threads_

int casadi::OracleFunction::max_num_threads_
protectedinherited

◆ max_step_size_

double casadi::RuntimeIntegrator::max_step_size_
protectedinherited

◆ max_tape_steps_

casadi_int casadi::RuntimeIntegrator::max_tape_steps_
protectedinherited

◆ meta_doc

const std::string casadi::Rosenbrock::meta_doc
static

Definition at line 111 of file rosenbrock.hpp.

Referenced by casadi::casadi_register_integrator_rosenbrock().

◆ min_step_size_

double casadi::RuntimeIntegrator::min_step_size_
protectedinherited

◆ monitor_

std::vector<std::string> casadi::OracleFunction::monitor_
protectedinherited

◆ n_dense_

casadi_int casadi::RuntimeIntegrator::n_dense_
protectedinherited

Definition at line 182 of file runtime_integrator.hpp.

Referenced by casadi::RuntimeIntegrator::set_ivp_prob().

◆ n_in_

size_t casadi::FunctionInternal::n_in_
inherited

Definition at line 1312 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::ThreadMap::codegen_body(), casadi::MapSum::codegen_body(), casadi::MXFunction::codegen_body(), casadi::Switch::codegen_body(), casadi::SXFunction::codegen_body(), casadi::FastNewton::codegen_body(), casadi::ThreadMap::codegen_declarations(), 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::MXFunction::eval_activity(), casadi::FunctionInternal::eval_gen(), casadi::Map::eval_gen(), casadi::MapSum::eval_gen(), casadi::MXFunction::eval_mx(), casadi::SXFunction::eval_mx(), casadi::Switch::eval_sx(), casadi::SXFunction::export_code_body(), casadi::CallbackInternal::finalize(), casadi::FmuFunction::FmuFunction(), casadi::FunctionInternal::forward(), casadi::KinsolInterface::func(), casadi::FunctionInternal::FunctionInternal(), casadi::FunctionInternal::fwd_seed(), casadi::FunctionInternal::generate_in(), casadi::GenericExternal::get_jac_sparsity(), casadi::GenericExternal::has_jac_sparsity(), casadi::FunctionInternal::init(), casadi::MXFunction::init(), casadi::Switch::init(), casadi::SXFunction::init(), casadi::ImplicitToNlp::init(), casadi::FunctionInternal::jac_sparsity(), casadi::FunctionInternal::jacobian(), casadi::KinsolInterface::jtimes(), casadi::FunctionInternal::mapsum_mx(), casadi::FunctionInternal::matching_arg(), casadi::FunctionInternal::mx_in(), casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::numel_in(), casadi::FunctionInternal::nz_in(), casadi::FunctionInternal::open_trace(), 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 1312 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::ThreadMap::codegen_body(), casadi::MapSum::codegen_body(), casadi::MXFunction::codegen_body(), casadi::Switch::codegen_body(), casadi::SXFunction::codegen_body(), casadi::FastNewton::codegen_body(), casadi::ThreadMap::codegen_declarations(), 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_activity(), casadi::MXFunction::eval_activity(), casadi::FunctionInternal::eval_gen(), casadi::Map::eval_gen(), casadi::MapSum::eval_gen(), casadi::Switch::eval_sx(), casadi::CallbackInternal::finalize(), casadi::FunctionInternal::finish_trace(), 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().

◆ nadj_

casadi_int casadi::Integrator::nadj_
inherited

◆ name_

std::string casadi::ProtoFunction::name_
inherited

Definition at line 248 of file function_internal.hpp.

Referenced by casadi::MXFunction::ad_forward(), casadi::SXFunction::ad_forward(), casadi::MXFunction::ad_reverse(), casadi::SXFunction::ad_reverse(), casadi::RuntimeIntegrator::advance_noevent(), 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::finish_trace(), 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::RuntimeIntegrator::impulseB(), casadi::BlazingSplineFunction::init(), 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::OnnxRuntimeInterface::init_mem(), casadi::FunctionInternal::jac_is_symm(), casadi::FunctionInternal::jacobian(), casadi::FunctionInternal::map(), casadi::OracleFunction::monitored(), casadi::FunctionInternal::open_trace(), 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::RuntimeIntegrator::retreat(), 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

◆ ne_

casadi_int casadi::Integrator::ne_
inherited

◆ never_inline_

bool casadi::FunctionInternal::never_inline_
inherited

◆ nfwd_

casadi_int casadi::Integrator::nfwd_
inherited

Definition at line 391 of file integrator_impl.hpp.

Referenced by casadi::FixedStepIntegrator::advance_noevent(), casadi::Integrator::augmented_dae(), casadi::Integrator::bdae_sp_forward(), casadi::Integrator::bdae_sp_reverse(), casadi::Integrator::bquad_sp_forward(), casadi::Integrator::bquad_sp_reverse(), casadi::SundialsInterface::calc_daeB(), casadi::SundialsInterface::calc_daeF(), casadi::SundialsInterface::calc_jtimesF(), casadi::SundialsInterface::calc_quadB(), casadi::SundialsInterface::calc_quadF(), casadi::Integrator::fdae_sp_forward(), casadi::Integrator::fdae_sp_reverse(), casadi::Integrator::fquad_sp_forward(), casadi::Integrator::fquad_sp_reverse(), casadi::Integrator::get_forward_dae(), casadi::Integrator::get_reverse(), casadi::Integrator::get_sparsity_in(), casadi::RuntimeIntegrator::get_sparsity_in(), casadi::Integrator::get_sparsity_out(), casadi::RuntimeIntegrator::get_sparsity_out(), casadi::FixedStepIntegrator::impulseB(), casadi::Integrator::init(), casadi::FixedStepIntegrator::init(), casadi::ImplicitFixedStepIntegrator::init(), casadi::RuntimeIntegrator::init(), casadi::IdasInterface::init(), casadi::SundialsInterface::init(), casadi::SundialsInterface::init_mem(), casadi::Integrator::Integrator(), casadi::Integrator::n_grid_in(), casadi::Integrator::serialize_body(), casadi::RuntimeIntegrator::set_ivp_prob(), casadi::RungeKutta::setup_step(), casadi::IdasInterface::solve_transposed(), casadi::Integrator::sp_jac_aug(), casadi::Integrator::sp_jac_dae(), casadi::Integrator::sp_jac_rdae(), casadi::FixedStepIntegrator::stepB(), casadi::FixedStepIntegrator::stepF(), and casadi::Integrator::trigger_event().

◆ nom_x_

std::vector<double> casadi::Integrator::nom_x_
inherited

◆ nom_z_

std::vector<double> casadi::Integrator::nom_z_
inherited

◆ np1_

casadi_int casadi::Integrator::np1_
inherited

◆ np_

casadi_int casadi::Integrator::np_
inherited

◆ nq1_

casadi_int casadi::Integrator::nq1_
inherited

◆ nq_

casadi_int casadi::Integrator::nq_
inherited

◆ nq_err_

casadi_int casadi::RuntimeIntegrator::nq_err_
protectedinherited

◆ nrp1_

casadi_int casadi::Integrator::nrp1_
inherited

◆ nrp_

casadi_int casadi::Integrator::nrp_
inherited

◆ nrq1_

casadi_int casadi::Integrator::nrq1_
inherited

◆ nrq_

casadi_int casadi::Integrator::nrq_
inherited

◆ nrx1_

casadi_int casadi::Integrator::nrx1_
inherited

◆ nrx_

casadi_int casadi::Integrator::nrx_
inherited

◆ nrz1_

casadi_int casadi::Integrator::nrz1_
inherited

◆ nrz_

casadi_int casadi::Integrator::nrz_
inherited

◆ ntmp_

casadi_int casadi::Integrator::ntmp_
inherited

◆ nu1_

casadi_int casadi::Integrator::nu1_
inherited

◆ nu_

casadi_int casadi::Integrator::nu_
inherited

◆ nuq1_

casadi_int casadi::Integrator::nuq1_
inherited

◆ nuq_

casadi_int casadi::Integrator::nuq_
inherited

◆ nx1_

casadi_int casadi::Integrator::nx1_
inherited

◆ nx_

casadi_int casadi::Integrator::nx_
inherited

◆ nx_err_

casadi_int casadi::RuntimeIntegrator::nx_err_
protectedinherited

◆ nz1_

casadi_int casadi::Integrator::nz1_
inherited

◆ nz_

casadi_int casadi::Integrator::nz_
inherited

◆ nz_err_

casadi_int casadi::RuntimeIntegrator::nz_err_
protectedinherited

◆ options_

const Options casadi::Rosenbrock::options_
static
Initial value:
{{"init_tol",
"Tolerance on the scaled Newton step when making the algebraic states "
"consistent [1e-3]"}},
{"init_max_iter",
"Maximum number of Newton iterations for consistent algebraic states [20]"}}
}
}
static const Options options_
Options.

Definition at line 93 of file rosenbrock.hpp.

Referenced by casadi::casadi_register_integrator_rosenbrock().

◆ opts_

Dict casadi::Integrator::opts_
inherited

◆ oracle_

Function casadi::OracleFunction::oracle_
protectedinherited

◆ order_err_

casadi_int casadi::RuntimeIntegrator::order_err_
protectedinherited

Definition at line 182 of file runtime_integrator.hpp.

Referenced by casadi::RuntimeIntegrator::set_ivp_prob().

◆ p_

casadi_ivp_prob<double> casadi::RuntimeIntegrator::p_
protectedinherited

◆ p_nom_

casadi_ivp_prob<double> casadi::RuntimeIntegrator::p_nom_
protectedinherited

◆ post_expand_

bool casadi::OracleFunction::post_expand_
protectedinherited

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

bool casadi::Integrator::print_stats_
inherited

◆ print_time_

bool casadi::ProtoFunction::print_time_
inherited

◆ quad_err_con_

bool casadi::RuntimeIntegrator::quad_err_con_
protectedinherited

◆ rdae_

Function casadi::Integrator::rdae_
inherited

◆ record_time_

bool casadi::ProtoFunction::record_time_
inherited

◆ registered_functions_

std::vector<Function> casadi::FunctionInternal::registered_functions_
inherited

◆ regularity_check_

bool casadi::ProtoFunction::regularity_check_
inherited

◆ release_

casadi_release_t casadi::FunctionInternal::release_
inherited

◆ reltol_

double casadi::RuntimeIntegrator::reltol_
protectedinherited

◆ replay_

bool casadi::RuntimeIntegrator::replay_
protectedinherited

◆ reverse_options_

Dict casadi::FunctionInternal::reverse_options_
inherited

◆ show_eval_warnings_

bool casadi::OracleFunction::show_eval_warnings_
protectedinherited

◆ solvers_

std::map< std::string, Integrator::Plugin > casadi::Integrator::solvers_
staticinherited

Definition at line 449 of file integrator_impl.hpp.

◆ sp_jac_

std::vector<Sparsity> casadi::RuntimeIntegrator::sp_jac_
protectedinherited

◆ sp_jac_dae_

Sparsity casadi::Integrator::sp_jac_dae_
inherited

◆ sp_jac_rdae_

Sparsity casadi::Integrator::sp_jac_rdae_
inherited

◆ sparsity_in_

std::vector<Sparsity> casadi::FunctionInternal::sparsity_in_
inherited

◆ sparsity_out_

std::vector<Sparsity> casadi::FunctionInternal::sparsity_out_
inherited

◆ specific_options_

Dict casadi::OracleFunction::specific_options_
protectedinherited

◆ stats_

Dict casadi::FunctionInternal::stats_
inherited

◆ step0_

double casadi::RuntimeIntegrator::step0_
protectedinherited

◆ step_size_

double casadi::RuntimeIntegrator::step_size_
protectedinherited

◆ stride_arg_

size_t casadi::OracleFunction::stride_arg_
protectedinherited

◆ stride_iw_

size_t casadi::OracleFunction::stride_iw_
protectedinherited

◆ stride_res_

size_t casadi::OracleFunction::stride_res_
protectedinherited

◆ stride_w_

size_t casadi::OracleFunction::stride_w_
protectedinherited

◆ t0_

double casadi::Integrator::t0_
inherited

◆ tout_

std::vector<double> casadi::Integrator::tout_
inherited

◆ transition_

Function casadi::Integrator::transition_
inherited

◆ user_data_

void* casadi::FunctionInternal::user_data_
inherited

◆ verbose_

bool casadi::ProtoFunction::verbose_
inherited

Definition at line 251 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::RuntimeIntegrator::advance_noevent(), casadi::ProtoFunction::change_option(), casadi::BSplineInterpolant::construct_graph(), casadi::OracleFunction::create_function(), 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::CodeGenerator::generate_dump(), 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::MadmpecInterface::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::MosekInterface::init_mem(), casadi::IdasInterface::init_mem(), casadi::UnoInterface::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: