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

#include <integrator_impl.hpp>

Detailed Description


List of available options
IdTypeDescriptionUsed in
ad_weightOT_DOUBLEWeighting factor for derivative calculation.When there is an option of either using forward or reverse mode directional derivatives, the condition ad_weight*nf<=(1-ad_weight)*na is used where nf and na are estimates of the number of forward/reverse mode directional derivatives needed. By default, ad_weight is calculated automatically, but this can be overridden by setting this option. In particular, 0 means forcing forward mode and 1 forcing reverse mode. Leave unset for (class specific) heuristics.casadi::FunctionInternal
ad_weight_spOT_DOUBLEWeighting factor for sparsity pattern calculation calculation.Overrides default behavior. Set to 0 and 1 to force forward and reverse mode respectively. Cf. option "ad_weight". When set to -1, sparsity is completely ignored and dense matrices are used.casadi::FunctionInternal
always_inlineOT_BOOLForce inlining.casadi::FunctionInternal
augmented_optionsOT_DICTOptions to be passed down to the augmented integrator, if one is constructedcasadi::Integrator
cacheOT_DICTPrepopulate the function cache. Default: emptycasadi::FunctionInternal
common_optionsOT_DICTOptions for auto-generated functionscasadi::OracleFunction
compilerOT_STRINGJust-in-time compiler plugin to be used.casadi::FunctionInternal
custom_jacobianOT_FUNCTIONOverride CasADi's AD. Use together with 'jac_penalty': 0. Note: Highly experimental. Syntax may break often.casadi::FunctionInternal
der_optionsOT_DICTDefault options to be used to populate forward_options, reverse_options, and jacobian_options before those options are merged in.casadi::FunctionInternal
derivative_ofOT_FUNCTIONThe function is a derivative of another function. The type of derivative (directional derivative, Jacobian) is inferred from the function name.casadi::FunctionInternal
dumpOT_BOOLDump function to file upon first evaluation. [false]casadi::FunctionInternal
dump_dirOT_STRINGDirectory to dump inputs/outputs to. Make sure the directory exists [.]casadi::FunctionInternal
dump_formatOT_STRINGChoose file format to dump matrices. See DM.from_file [mtx]casadi::FunctionInternal
dump_inOT_BOOLDump numerical values of inputs to file (readable with DM.from_file) [default: false]casadi::FunctionInternal
dump_outOT_BOOLDump numerical values of outputs to file (readable with DM.from_file) [default: false]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
input_schemeOT_STRINGVECTORDeprecated option (ignored)casadi::FunctionInternal
inputs_checkOT_BOOLThrow exceptions when the numerical values of the inputs don't make sensecasadi::FunctionInternal
is_diff_inOT_BOOLVECTORIndicate for each input if it should be differentiable.casadi::FunctionInternal
is_diff_outOT_BOOLVECTORIndicate for each output if it should be differentiable.casadi::FunctionInternal
jac_penaltyOT_DOUBLEWhen requested for a number of forward/reverse directions, it may be cheaper to compute first the full jacobian and then multiply with seeds, rather than obtain the requested directions in a straightforward manner. Casadi uses a heuristic to decide which is cheaper. A high value of 'jac_penalty' makes it less likely for the heurstic to chose the full Jacobian strategy. The special value -1 indicates never to use the full Jacobian strategycasadi::FunctionInternal
jacobian_optionsOT_DICTOptions to be passed to a Jacobian constructorcasadi::FunctionInternal
jitOT_BOOLUse just-in-time compiler to speed up the evaluationcasadi::FunctionInternal
jit_cleanupOT_BOOLCleanup up the temporary source file that jit creates. Default: truecasadi::FunctionInternal
jit_nameOT_STRINGThe file name used to write out code. The actual file names used depend on 'jit_temp_suffix' and include extensions. Default: 'jit_tmp'casadi::FunctionInternal
jit_optionsOT_DICTOptions to be passed to the jit compiler.casadi::FunctionInternal
jit_serializeOT_STRINGSpecify behaviour when serializing a jitted function: SOURCE|link|embed.casadi::FunctionInternal
jit_temp_suffixOT_BOOLUse a temporary (seemingly random) filename suffix for generated code and libraries. This is desired for thread-safety. This behaviour may defeat caching compiler wrappers. Default: truecasadi::FunctionInternal
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
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::FixedStepIntegrator
output_schemeOT_STRINGVECTORDeprecated option (ignored)casadi::FunctionInternal
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_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
record_timeOT_BOOLrecord information about execution time, for retrieval with stats().casadi::ProtoFunction
regularity_checkOT_BOOLThrow exceptions when NaN or Inf appears during evaluationcasadi::ProtoFunction
reverse_optionsOT_DICTOptions to be passed to a reverse mode constructorcasadi::FunctionInternal
rootfinderOT_STRINGAn implicit function solvercasadi::FixedStepIntegrator
rootfinder_optionsOT_DICTOptions to be passed to the NLP Solvercasadi::FixedStepIntegrator
show_eval_warningsOT_BOOLShow warnings generated from function evaluations [true]casadi::OracleFunction
simplifyOT_BOOLImplement as MX Function (codegeneratable/serializable) default: falsecasadi::FixedStepIntegrator
simplify_optionsOT_DICTAny options to pass to simplified form Function constructorcasadi::FixedStepIntegrator
specific_optionsOT_DICTOptions for specific auto-generated functions, overwriting the defaults from common_options. Nested dictionary.casadi::OracleFunction
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 566 of file integrator_impl.hpp.

Inheritance diagram for casadi::FixedStepIntegrator:
Inheritance graph
[legend]
Collaboration diagram for casadi::FixedStepIntegrator:
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

 FixedStepIntegrator (const std::string &name, const Function &dae, double t0, const std::vector< double > &tout)
 Constructor. More...
 
 ~FixedStepIntegrator () override
 Destructor. More...
 
void init (const Dict &opts) override
 Initialize stage. More...
 
void set_work (void *mem, const double **&arg, double **&res, casadi_int *&iw, double *&w) const override
 Set the (persistent) work vectors. More...
 
Function create_advanced (const Dict &opts) override
 
void * alloc_mem () const override
 Create memory block. More...
 
int init_mem (void *mem) const override
 Initalize memory block. More...
 
void free_mem (void *mem) const override
 Free memory block. More...
 
virtual void setup_step ()=0
 Setup step functions. More...
 
void reset (IntegratorMemory *mem, bool first_call) const override
 Reset the forward solver at the start or after an event. More...
 
int advance_noevent (IntegratorMemory *mem) const override
 Advance solution in time. More...
 
void resetB (IntegratorMemory *mem) const override
 Reset the backward problem and take time to tf. 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...
 
void retreat (IntegratorMemory *mem, const double *u, double *adj_x, double *adj_p, double *adj_u) const override
 Retreat solution in time. More...
 
void stepF (FixedStepMemory *m, double t, double h, const double *x0, const double *v0, double *xf, double *vf, double *qf) const
 Take integrator step forward. More...
 
void stepB (FixedStepMemory *m, double t, double h, const double *x0, const double *xf, const double *vf, const double *adj_xf, const double *rv0, double *adj_x0, double *adj_p, double *adj_u) const
 Take integrator step backward. More...
 
void serialize_body (SerializingStream &s) const override
 Serialize an object without type information. More...
 
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 eval (const double **arg, double **res, casadi_int *iw, double *w, void *mem) const override
 evaluate More...
 
virtual void print_stats (IntegratorMemory *mem) const
 Print solver statistics. 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 sp_forward (const bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const override
 Propagate sparsity forward. 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...
 
int sp_reverse (bvec_t **arg, bvec_t **res, casadi_int *iw, bvec_t *w, void *mem) const override
 Propagate sparsity backwards. 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...
 
void finalize () override
 Finalize initialization. More...
 
void join_results (OracleMemory *m) const
 Combine results from different threads. More...
 
const Functionoracle () 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 Functionget_function (const std::string &name) 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...
 
Dict get_stats (void *mem) const override
 Get all statistics. 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...
 
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 *, Function > &all_fun, const Function &dep, casadi_int max_depth) const
 
virtual void find (std::map< FunctionInternal *, Function > &all_fun, casadi_int max_depth) const
 
virtual std::vector< bool > which_depends (const std::string &s_in, const std::vector< std::string > &s_out, casadi_int order, bool tr=false) const
 Which variables enter with some order. More...
 
virtual int eval_sx (const SXElem **arg, SXElem **res, casadi_int *iw, SXElem *w, void *mem, bool always_inline, bool never_inline) const
 Evaluate with symbolic scalars. More...
 
virtual void eval_mx (const MXVector &arg, MXVector &res, bool always_inline, bool never_inline) const
 Evaluate with symbolic matrices. More...
 
template<typename M >
void call (const std::vector< M > &arg, std::vector< M > &res, bool always_inline, bool never_inline) const
 Call a function, templated. More...
 
template<typename M >
bool matching_arg (const std::vector< M > &arg, casadi_int &npar) const
 Check if input arguments that needs to be replaced. More...
 
template<typename M >
bool matching_res (const std::vector< M > &arg, casadi_int &npar) const
 Check if output arguments that needs to be replaced. More...
 
template<typename M >
std::vector< M > replace_arg (const std::vector< M > &arg, casadi_int npar) const
 Replace 0-by-0 inputs. More...
 
template<typename M >
std::vector< M > project_arg (const std::vector< M > &arg, casadi_int npar) const
 Project sparsities. More...
 
template<typename M >
std::vector< M > project_res (const std::vector< M > &arg, casadi_int npar) const
 Project sparsities. More...
 
template<typename M >
std::vector< M > replace_res (const std::vector< M > &res, casadi_int npar) const
 Replace 0-by-0 outputs. More...
 
template<typename M >
std::vector< std::vector< M > > replace_fseed (const std::vector< std::vector< M >> &fseed, casadi_int npar) const
 Replace 0-by-0 forward seeds. More...
 
template<typename M >
std::vector< std::vector< M > > replace_fseed (const std::vector< std::vector< M > > &fseed, casadi_int npar) const
 
template<typename M >
std::vector< std::vector< M > > replace_aseed (const std::vector< std::vector< M >> &aseed, casadi_int npar) const
 Replace 0-by-0 reverse seeds. More...
 
template<typename M >
std::vector< std::vector< M > > replace_aseed (const std::vector< std::vector< M > > &aseed, casadi_int npar) const
 
std::vector< MXmapsum_mx (const std::vector< MX > &arg, const std::string &parallelization)
 Parallel evaluation. More...
 
virtual bool uses_output () const
 Do the derivative functions need nondifferentiated outputs? More...
 
std::string diff_prefix (const std::string &prefix) const
 Determine prefix for differentiated functions. More...
 
virtual Function slice (const std::string &name, const std::vector< casadi_int > &order_in, const std::vector< casadi_int > &order_out, const Dict &opts) const
 returns a new function with a selection of inputs/outputs of the original More...
 
bool has_derivative () const
 Can derivatives be calculated in any way? More...
 
virtual double ad_weight () const
 Weighting factor for chosing forward/reverse mode. More...
 
virtual double sp_weight () const
 Weighting factor for chosing forward/reverse mode,. More...
 
virtual std::vector< MXfree_mx () const
 Get free variables (MX) More...
 
virtual std::vector< SXfree_sx () const
 Get free variables (SX) More...
 
virtual bool has_free () const
 Does the function have free variables. More...
 
virtual void generate_lifted (Function &vdef_fcn, Function &vinit_fcn) const
 Extract the functions needed for the Lifted Newton method. More...
 
virtual casadi_int n_instructions () const
 Get the number of atomic operations. More...
 
virtual casadi_int instruction_id (casadi_int k) const
 Get an atomic operation operator index. More...
 
virtual std::vector< casadi_int > instruction_input (casadi_int k) const
 Get the (integer) input arguments of an atomic operation. More...
 
virtual double instruction_constant (casadi_int k) const
 Get the floating point output argument of an atomic operation. More...
 
virtual std::vector< casadi_int > instruction_output (casadi_int k) const
 Get the (integer) output argument of an atomic operation. More...
 
virtual casadi_int n_nodes () const
 Number of nodes in the algorithm. More...
 
virtual MX instruction_MX (casadi_int k) const
 get MX expression associated with instruction More...
 
virtual SX instructions_sx () const
 get SX expression associated with instructions More...
 
Function wrap () const
 Wrap in an Function instance consisting of only one MX call. More...
 
Function wrap_as_needed (const Dict &opts) const
 Wrap in an Function instance consisting of only one MX call. More...
 
Dict cache () const
 Get all functions in the cache. More...
 
bool incache (const std::string &fname, Function &f, const std::string &suffix="") const
 Get function in cache. More...
 
void tocache (const Function &f, const std::string &suffix="") const
 Save function to cache. More...
 
void tocache_if_missing (Function &f, const std::string &suffix="") const
 Save function to cache, only if missing. More...
 
void codegen (CodeGenerator &g, const std::string &fname) const
 Generate code the function. More...
 
void codegen_meta (CodeGenerator &g) const
 Generate meta-information allowing a user to evaluate a generated function. More...
 
void codegen_sparsities (CodeGenerator &g) const
 Codegen sparsities. More...
 
virtual std::string codegen_name (const CodeGenerator &g, bool ns=true) const
 Get name in codegen. More...
 
std::string codegen_mem (CodeGenerator &g, const std::string &index="mem") const
 Get thread-local memory object. More...
 
virtual void codegen_incref (CodeGenerator &g) const
 Codegen incref for dependencies. More...
 
virtual void codegen_decref (CodeGenerator &g) const
 Codegen decref for dependencies. More...
 
virtual void codegen_alloc_mem (CodeGenerator &g) const
 Codegen decref for alloc_mem. More...
 
virtual void codegen_init_mem (CodeGenerator &g) const
 Codegen decref for init_mem. More...
 
virtual void codegen_free_mem (CodeGenerator &g) const
 Codegen for free_mem. More...
 
virtual void codegen_checkout (CodeGenerator &g) const
 Codegen for checkout. More...
 
virtual void codegen_release (CodeGenerator &g) const
 Codegen for release. More...
 
std::string signature (const std::string &fname) const
 Code generate the function. More...
 
std::string signature_unrolled (const std::string &fname) const
 Code generate the function. More...
 
virtual void codegen_declarations (CodeGenerator &g) const
 Generate code for the declarations of the C function. More...
 
virtual void codegen_body (CodeGenerator &g) const
 Generate code for the function body. More...
 
virtual std::string codegen_mem_type () const
 Thread-local memory object type. More...
 
virtual bool has_codegen () const
 Is codegen supported? 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 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...
 
virtual std::string class_name () const =0
 Readable name of the internal class. More...
 
casadi_int getCount () const
 Get the reference count. More...
 
std::string debug_repr (const SharedObjectInternal *) const
 
GenericWeakRef< SharedObject, SharedObjectInternal > * weak ()
 Get a weak reference to the object. More...
 
virtual const char * plugin_name () const=0
 
size_t get_n_in () override
 Number of function inputs and outputs. More...
 
size_t get_n_out () override
 Number of function inputs and outputs. More...
 
Sparsity get_sparsity_in (casadi_int i) override
 Sparsities of function inputs and outputs. More...
 
Sparsity get_sparsity_out (casadi_int i) override
 Sparsities of function inputs and outputs. More...
 
std::string get_name_in (casadi_int i) override
 Names of function input and outputs. More...
 
std::string get_name_out (casadi_int i) override
 Names of function input and outputs. More...
 
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...
 
bool has_reverse (casadi_int nadj) 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< DMeval_dm (const std::vector< DM > &arg) const
 Evaluate with DM matrices. More...
 
virtual bool has_eval_dm () const
 Evaluate with DM matrices. More...
 
void call_gen (const MXVector &arg, MXVector &res, casadi_int npar, bool always_inline, bool never_inline) const
 Call a function, overloaded. More...
 
template<typename D >
void call_gen (const std::vector< Matrix< D > > &arg, std::vector< Matrix< D > > &res, casadi_int npar, bool always_inline, bool never_inline) const
 Call a function, overloaded. More...
 
template<typename M >
void check_arg (const std::vector< M > &arg, casadi_int &npar) const
 Check if input arguments have correct length and dimensions. More...
 
template<typename M >
void check_res (const std::vector< M > &res, casadi_int &npar) const
 Check if output arguments have correct length and dimensions. More...
 
template<typename M >
std::map< std::string, M > convert_arg (const std::vector< M > &arg) const
 Convert from/to input/output lists/map. More...
 
template<typename M >
std::vector< M > convert_arg (const std::map< std::string, M > &arg) const
 Convert from/to input/output lists/map. More...
 
template<typename M >
std::map< std::string, M > convert_res (const std::vector< M > &res) const
 Convert from/to input/output lists/map. More...
 
template<typename M >
std::vector< M > convert_res (const std::map< std::string, M > &res) const
 Convert from/to input/output lists/map. More...
 
std::vector< double > nz_in (const std::vector< DM > &arg) const
 Convert from/to flat vector of input/output nonzeros. More...
 
std::vector< DMnz_in (const std::vector< double > &arg) const
 Convert from/to flat vector of input/output nonzeros. More...
 
std::vector< double > nz_out (const std::vector< DM > &res) const
 Convert from/to flat vector of input/output nonzeros. More...
 
std::vector< DMnz_out (const std::vector< double > &res) const
 Convert from/to flat vector of input/output nonzeros. More...
 
virtual void call_forward (const std::vector< MX > &arg, const std::vector< MX > &res, const std::vector< std::vector< MX > > &fseed, std::vector< std::vector< MX > > &fsens, bool always_inline, bool never_inline) const
 Forward mode AD, virtual functions overloaded in derived classes. More...
 
virtual void call_forward (const std::vector< SX > &arg, const std::vector< SX > &res, const std::vector< std::vector< SX > > &fseed, std::vector< std::vector< SX > > &fsens, bool always_inline, bool never_inline) const
 Forward mode AD, virtual functions overloaded in derived classes. More...
 
virtual void call_reverse (const std::vector< MX > &arg, const std::vector< MX > &res, const std::vector< std::vector< MX > > &aseed, std::vector< std::vector< MX > > &asens, bool always_inline, bool never_inline) const
 Reverse mode, virtual functions overloaded in derived classes. More...
 
virtual void call_reverse (const std::vector< SX > &arg, const std::vector< SX > &res, const std::vector< std::vector< SX > > &aseed, std::vector< std::vector< SX > > &asens, bool always_inline, bool never_inline) const
 Reverse mode, virtual functions overloaded in derived classes. More...
 
Function jacobian () const
 Return Jacobian of all input elements with respect to all output elements. More...
 
virtual bool has_jacobian () const
 Return Jacobian of all input elements with respect to all output elements. More...
 
virtual Function get_jacobian (const std::string &name, const std::vector< std::string > &inames, const std::vector< std::string > &onames, const Dict &opts) const
 Return Jacobian of all input elements with respect to all output elements. More...
 
Sparsityjac_sparsity (casadi_int oind, casadi_int iind, bool compact, bool symmetric) const
 Get Jacobian sparsity. More...
 
virtual bool has_jac_sparsity (casadi_int oind, casadi_int iind) const
 Get Jacobian sparsity. More...
 
virtual Sparsity get_jac_sparsity (casadi_int oind, casadi_int iind, bool symmetric) const
 Get Jacobian sparsity. More...
 
Function forward (casadi_int nfwd) const
 Return function that calculates forward derivatives. More...
 
Function reverse (casadi_int nadj) const
 Return function that calculates adjoint derivatives. More...
 
virtual const SX sx_in (casadi_int ind) const
 Get function input(s) and output(s) More...
 
virtual const std::vector< SXsx_in () const
 Get function input(s) and output(s) More...
 
virtual const SX sx_out (casadi_int ind) const
 Get function input(s) and output(s) More...
 
virtual const std::vector< SXsx_out () const
 Get function input(s) and output(s) More...
 
virtual const MX mx_in (casadi_int ind) const
 Get function input(s) and output(s) More...
 
virtual const std::vector< MXmx_in () const
 Get function input(s) and output(s) More...
 
virtual const MX mx_out (casadi_int ind) const
 Get function input(s) and output(s) More...
 
virtual const std::vector< MXmx_out () const
 Get function input(s) and output(s) More...
 
const DM dm_in (casadi_int ind) const
 Get function input(s) and output(s) More...
 
const std::vector< DMdm_in () const
 Get function input(s) and output(s) More...
 
const DM dm_out (casadi_int ind) const
 Get function input(s) and output(s) More...
 
const std::vector< DMdm_out () const
 Get function input(s) and output(s) More...
 
casadi_int nnz_in () const
 Number of input/output nonzeros. More...
 
casadi_int nnz_in (casadi_int ind) const
 Number of input/output nonzeros. More...
 
casadi_int nnz_out () const
 Number of input/output nonzeros. More...
 
casadi_int nnz_out (casadi_int ind) const
 Number of input/output nonzeros. More...
 
casadi_int numel_in () const
 Number of input/output elements. More...
 
casadi_int numel_in (casadi_int ind) const
 Number of input/output elements. More...
 
casadi_int numel_out (casadi_int ind) const
 Number of input/output elements. More...
 
casadi_int numel_out () const
 Number of input/output elements. More...
 
casadi_int size1_in (casadi_int ind) const
 Input/output dimensions. More...
 
casadi_int size2_in (casadi_int ind) const
 Input/output dimensions. More...
 
casadi_int size1_out (casadi_int ind) const
 Input/output dimensions. More...
 
casadi_int size2_out (casadi_int ind) const
 Input/output dimensions. More...
 
std::pair< casadi_int, casadi_int > size_in (casadi_int ind) const
 Input/output dimensions. More...
 
std::pair< casadi_int, casadi_int > size_out (casadi_int ind) const
 Input/output dimensions. More...
 
const Sparsitysparsity_in (casadi_int ind) const
 Input/output sparsity. More...
 
const Sparsitysparsity_out (casadi_int ind) const
 Input/output sparsity. More...
 
bool all_scalar () const
 Are all inputs and outputs scalar. More...
 
virtual bool jac_is_symm (casadi_int oind, casadi_int iind) const
 Is a Jacobian block known to be symmetric a priori? More...
 
Sparsity to_compact (casadi_int oind, casadi_int iind, const Sparsity &sp) const
 Convert to compact Jacobian sparsity pattern. More...
 
Sparsity from_compact (casadi_int oind, casadi_int iind, const Sparsity &sp) const
 Convert from compact Jacobian sparsity pattern. More...
 
template<bool fwd>
Sparsity get_jac_sparsity_gen (casadi_int oind, casadi_int iind) const
 Get the sparsity pattern via sparsity seed propagation. More...
 
Sparsity get_jac_sparsity_hierarchical (casadi_int oind, casadi_int iind) const
 A flavor of get_jac_sparsity_gen that does hierarchical block structure recognition. More...
 
Sparsity get_jac_sparsity_hierarchical_symm (casadi_int oind, casadi_int iind) const
 
virtual std::vector< MXsymbolic_output (const std::vector< MX > &arg) const
 Get a vector of symbolic variables corresponding to the outputs. More...
 
virtual 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 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 ProtoFunctiondeserialize (DeserializingStream &s)
 Deserialize into MX. More...
 
static bool grid_in (casadi_int i)
 Is an input repeated for each grid point? More...
 
static bool grid_out (casadi_int i)
 Is an output repeated for each grid point? 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...
 
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 bool has_plugin (const std::string &pname, bool verbose=false)
 Check if a plugin is available or can be loaded. More...
 
static const Optionsplugin_options (const std::string &pname)
 Get the plugin options. More...
 
static Deserialize plugin_deserialize (const std::string &pname)
 Get the plugin deserialize_map. More...
 
static Plugin pluginFromRegFcn (RegFcn regfcn)
 Instantiate a Plugin struct from a factory function. More...
 
static Plugin load_plugin (const std::string &pname, bool register_plugin=true, bool needs_lock=true)
 Load a plugin dynamically. More...
 
static handle_t load_library (const std::string &libname, std::string &resultpath, bool global)
 Load a library dynamically. More...
 
static void registerPlugin (const Plugin &plugin, bool needs_lock=true)
 Register an integrator in the factory. More...
 
static void registerPlugin (RegFcn regfcn, bool needs_lock=true)
 Register an integrator in the factory. More...
 
static Plugin & getPlugin (const std::string &pname)
 Load and get the creator function. More...
 
static Integratorinstantiate (const std::string &fname, const std::string &pname, Problem problem)
 
static bool check_mat (const Sparsity &arg, const Sparsity &inp, casadi_int &npar)
 

Public Attributes

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

Static Public Attributes

static 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

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

Protected Attributes

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, RegFunall_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 Optionsget_options () const override
 Options. 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...
 
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...
 

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

◆ FixedStepIntegrator() [1/2]

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

Definition at line 1865 of file integrator.cpp.

1866  : Integrator(name, dae, t0, tout) {
1867 
1868  // Default options
1869  nk_target_ = 20;
1870 }
Integrator(const std::string &name, const Function &oracle, double t0, const std::vector< double > &tout)
Constructor.
Definition: integrator.cpp:264

References nk_target_.

◆ ~FixedStepIntegrator()

casadi::FixedStepIntegrator::~FixedStepIntegrator ( )
override

Definition at line 1872 of file integrator.cpp.

1872  {
1873  clear_mem();
1874 }
void clear_mem()
Clear all memory (called from destructor)

References casadi::ProtoFunction::clear_mem().

◆ FixedStepIntegrator() [2/2]

casadi::FixedStepIntegrator::FixedStepIntegrator ( DeserializingStream s)
explicitprotected

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

Definition at line 2492 of file integrator.cpp.

2492  : Integrator(s) {
2493  s.version("FixedStepIntegrator", 3);
2494  s.unpack("FixedStepIntegrator::nk_target", nk_target_);
2495  s.unpack("FixedStepIntegrator::disc", disc_);
2496  s.unpack("FixedStepIntegrator::nv", nv_);
2497  s.unpack("FixedStepIntegrator::nv1", nv1_);
2498  s.unpack("FixedStepIntegrator::nrv", nrv_);
2499  s.unpack("FixedStepIntegrator::nrv1", nrv1_);
2500 }
std::vector< casadi_int > disc_
casadi_int nv_
Number of dependent variables in the discrete time integration.

References disc_, nk_target_, nrv1_, nrv_, nv1_, nv_, 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 3190 of file function_internal.cpp.

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

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

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

◆ add_embedded()

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

Definition at line 3633 of file function_internal.cpp.

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

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

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

◆ adjmap_out()

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

Definition at line 336 of file integrator.cpp.

336  {
337  switch (static_cast<IntegratorInput>(i)) {
338  case INTEGRATOR_X0: return INTEGRATOR_ADJ_X0;
339  case INTEGRATOR_Z0: return INTEGRATOR_ADJ_Z0;
340  case INTEGRATOR_P: return INTEGRATOR_ADJ_P;
341  case INTEGRATOR_U: return INTEGRATOR_ADJ_U;
342  case INTEGRATOR_ADJ_XF: return INTEGRATOR_XF;
343  case INTEGRATOR_ADJ_ZF: return INTEGRATOR_ZF;
344  case INTEGRATOR_ADJ_QF: return INTEGRATOR_QF;
345  default: break;
346  }
347  return -1;
348 }
@ INTEGRATOR_ADJ_U
Adjoint sensitivities corresponding to the control vector.
Definition: integrator.hpp:257
@ INTEGRATOR_ADJ_Z0
Adjoint sensitivities corresponding to the algebraic variable guess.
Definition: integrator.hpp:253
@ INTEGRATOR_QF
Quadrature state at all output times.
Definition: integrator.hpp:249
@ INTEGRATOR_ADJ_P
Adjoint sensitivities corresponding to the parameter vector.
Definition: integrator.hpp:255
@ INTEGRATOR_ZF
Algebraic variable at all output times.
Definition: integrator.hpp:247
@ INTEGRATOR_XF
Differential state at all output times.
Definition: integrator.hpp:245
@ INTEGRATOR_ADJ_X0
Adjoint sensitivities corresponding to the initial state.
Definition: integrator.hpp:251
IntegratorInput
Input arguments of an integrator.
Definition: integrator.hpp:223
@ INTEGRATOR_U
Piecewise constant control, a new control interval starts at each output time.
Definition: integrator.hpp:231
@ INTEGRATOR_ADJ_QF
Adjoint seeds corresponding to the quadratures at the output times.
Definition: integrator.hpp:237
@ INTEGRATOR_ADJ_ZF
Adjoint seeds corresponding to the algebraic variables at the output times.
Definition: integrator.hpp:235
@ INTEGRATOR_P
Parameters.
Definition: integrator.hpp:229
@ INTEGRATOR_ADJ_XF
Adjoint seeds corresponding to the states at the output times.
Definition: integrator.hpp:233
@ INTEGRATOR_Z0
Initial guess for the algebraic variable at the initial time.
Definition: integrator.hpp:227
@ INTEGRATOR_X0
Differential state at the initial time.
Definition: integrator.hpp:225

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

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

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

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

◆ advance()

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

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

Definition at line 532 of file integrator.cpp.

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

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

Implements casadi::Integrator.

Definition at line 2041 of file integrator.cpp.

2041  {
2042  auto m = static_cast<FixedStepMemory*>(mem);
2043 
2044  // State at previous step
2045  double* x_prev = m->tmp1;
2046 
2047  // Number of finite elements and time steps
2048  casadi_int nj = disc_[m->k + 1] - disc_[m->k];
2049  double h = (m->t_next - m->t) / nj;
2050 
2051  // Take steps
2052  for (casadi_int j = 0; j < nj; ++j) {
2053  // Current time
2054  double t = m->t + j * h;
2055 
2056  // Update the previous step
2057  casadi_copy(m->x, nx_, x_prev);
2058  casadi_copy(m->v, nv_, m->v_prev);
2059  casadi_copy(m->q, nq_, m->q_prev);
2060 
2061  // Take step
2062  stepF(m, t, h, x_prev, m->v_prev, m->x, m->v, m->q);
2063  casadi_axpy(nq_, 1., m->q_prev, m->q);
2064 
2065  // Save state, if needed
2066  if (nrx_ > 0) {
2067  casadi_int tapeind = disc_[m->k] + j;
2068  casadi_copy(m->x, nx_, m->x_tape + nx_ * (tapeind + 1));
2069  casadi_copy(m->v, nv_, m->v_tape + nv_ * tapeind);
2070  }
2071  }
2072 
2073  // Save algebraic variables
2074  casadi_copy(m->v + nv_ - nz_, nz_, m->z);
2075 
2076  return 0;
2077 }
void stepF(FixedStepMemory *m, double t, double h, const double *x0, const double *v0, double *xf, double *vf, double *qf) const
Take integrator step forward.
casadi_int nrx_
Number of states for the backward integration.
casadi_int nx_
Number of states for the forward integration.
void casadi_copy(const T1 *x, casadi_int n, T1 *y)
COPY: y <-x.
void casadi_axpy(casadi_int n, T1 alpha, const T1 *x, T1 *y)
AXPY: y <- a*x + y.

References casadi::casadi_axpy(), casadi::casadi_copy(), disc_, casadi::Integrator::nq_, casadi::Integrator::nrx_, nv_, casadi::Integrator::nx_, casadi::Integrator::nz_, stepF(), and casadi::IntegratorMemory::tmp1.

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

◆ all_scalar()

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

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

Definition at line 3664 of file function_internal.cpp.

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

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

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

◆ all_zero()

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

Definition at line 2736 of file integrator.cpp.

2736  {
2737  // Quick return if trivially zero
2738  if (v == 0 || n == 0) return true;
2739  // Loop over entries
2740  for (casadi_int i = 0; i < n; ++i) {
2741  if (v[i] != 0.) return false;
2742  }
2743  // All zero if reached here
2744  return true;
2745 }

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

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

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

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

◆ alloc_arg()

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

◆ alloc_iw()

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

◆ alloc_mem()

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

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

Reimplemented from casadi::FunctionInternal.

Definition at line 599 of file integrator_impl.hpp.

599 { return new FixedStepMemory();}

◆ alloc_res()

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

◆ alloc_w()

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

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

Definition at line 2866 of file function_internal.cpp.

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

References casadi::FunctionInternal::sz_w().

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

◆ augmented_dae()

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

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

Definition at line 919 of file integrator.cpp.

919  {
920  // If no sensitivities, augmented oracle is the oracle itself
921  if (nfwd_ == 0) return oracle_;
922  // Name of augmented DAE
923  std::string aug_name = "fsens" + str(nfwd_) + "_" + oracle_.name();
924  // Use function in cache, if available
925  Function ret;
926  // if (incache(aug_name, ret)) return ret; // caching disabled while implementing #3047
927  // Create new augmented oracle
928  try {
929  if (oracle_.is_a("SXFunction")) {
930  ret = get_forward_dae<SX>(aug_name);
931  } else {
932  ret = get_forward_dae<MX>(aug_name);
933  }
934  } catch (std::exception& e) {
935  casadi_error("Failed to generate augmented DAE for " + name_ + ":\n" + e.what());
936  }
937  // Save to Function cache and return
938  // tocache(ret); // caching disabled while implementing #3047
939  return ret;
940 }
const std::string & name() const
Name of the function.
Definition: function.cpp:1307
bool is_a(const std::string &type, bool recursive=true) const
Check if the function is of a particular type.
Definition: function.cpp:1664
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 1053 of file integrator.cpp.

1055  {
1056  // Evaluate nondifferentiated
1057  m->arg[BDYN_T] = nullptr; // t
1058  m->arg[BDYN_X] = x; // x
1059  m->arg[BDYN_Z] = z; // z
1060  m->arg[BDYN_P] = p; // p
1061  m->arg[BDYN_U] = u; // u
1062  m->arg[BDYN_OUT_ODE] = nullptr; // out_ode
1063  m->arg[BDYN_OUT_ALG] = nullptr; // out_alg
1064  m->arg[BDYN_OUT_QUAD] = nullptr; // out_quad
1065  m->arg[BDYN_OUT_ZERO] = nullptr; // out_zero
1066  m->arg[BDYN_ADJ_ODE] = adj_ode; // adj_ode
1067  m->arg[BDYN_ADJ_ALG] = nullptr; // adj_alg
1068  m->arg[BDYN_ADJ_QUAD] = adj_quad; // adj_quad
1069  m->arg[BDYN_ADJ_ZERO] = nullptr; // adj_zero
1070  m->res[BDAE_ADJ_X] = adj_x; // adj_x
1071  m->res[BDAE_ADJ_Z] = adj_z; // adj_z
1072  if (calc_sp_forward("daeB", m->arg, m->res, m->iw, m->w)) return 1;
1073  // Evaluate sensitivities
1074  for (casadi_int i = 0; i < nfwd_; ++i) {
1075  m->arg[BDYN_NUM_IN + BDAE_ADJ_X] = adj_x; // out:adj_x
1076  m->arg[BDYN_NUM_IN + BDAE_ADJ_Z] = adj_z; // out:adj_z
1077  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_T] = nullptr; // fwd:t
1078  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_X] = x + (i + 1) * nx1_; // fwd:x
1079  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_Z] = z + (i + 1) * nz1_; // fwd:z
1080  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_P] = p + (i + 1) * np1_; // fwd:p
1081  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_U] = u + (i + 1) * nu1_; // fwd:u
1082  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_ODE] = nullptr; // fwd:out_ode
1083  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_ALG] = nullptr; // fwd:out_alg
1084  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_QUAD] = nullptr; // fwd:out_quad
1085  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_ZERO] = nullptr; // fwd:out_zero
1087  = adj_ode + (i + 1) * nrx1_ * nadj_; // fwd:adj_ode
1088  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_ADJ_ALG] = nullptr; // fwd:adj_alg
1090  = adj_quad + (i + 1) * nrz1_ * nadj_; // fwd:adj_quad
1091  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_ADJ_ZERO] = nullptr; // fwd:adj_zero
1092  m->res[BDAE_ADJ_X] = adj_x + (i + 1) * nrx1_ * nadj_; // fwd:adj_x
1093  m->res[BDAE_ADJ_Z] = adj_z + (i + 1) * nrz1_ * nadj_; // fwd:adj_z
1094  if (calc_sp_forward(forward_name("daeB", 1), m->arg, m->res, m->iw, m->w)) return 1;
1095  }
1096  return 0;
1097 }
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 1317 of file integrator.cpp.

1319  {
1320  // Nondifferentiated inputs
1321  m->arg[BDYN_T] = nullptr; // t
1322  m->arg[BDYN_X] = x; // x
1323  m->arg[BDYN_Z] = z; // z
1324  m->arg[BDYN_P] = p; // p
1325  m->arg[BDYN_U] = u; // u
1326  m->arg[BDYN_OUT_ODE] = nullptr; // out_ode
1327  m->arg[BDYN_OUT_ALG] = nullptr; // out_alg
1328  m->arg[BDYN_OUT_QUAD] = nullptr; // out_quad
1329  m->arg[BDYN_OUT_ZERO] = nullptr; // out_zero
1330  m->arg[BDYN_ADJ_ODE] = adj_ode; // adj_ode
1331  m->arg[BDYN_ADJ_ALG] = nullptr; // adj_alg
1332  m->arg[BDYN_ADJ_QUAD] = adj_quad; // adj_quad
1333  m->arg[BDYN_ADJ_ZERO] = nullptr; // adj_zero
1334  // Propagate through sensitivities
1335  for (casadi_int i = 0; i < nfwd_; ++i) {
1336  m->res[BDAE_ADJ_X] = adj_x + (i + 1) * nrx1_ * nadj_; // fwd:adj_x
1337  m->res[BDAE_ADJ_Z] = adj_z + (i + 1) * nrz1_ * nadj_; // fwd:adj_z
1338  m->arg[BDYN_NUM_IN + BDAE_ADJ_X] = adj_x; // out:adj_x
1339  m->arg[BDYN_NUM_IN + BDAE_ADJ_Z] = adj_z; // out:adj_z
1340  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_T] = nullptr; // fwd:t
1341  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_X] = x + (i + 1) * nx1_; // fwd:x
1342  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_Z] = z + (i + 1) * nz1_; // fwd:z
1343  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_P] = p + (i + 1) * np1_; // fwd:p
1344  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_U] = u + (i + 1) * nu1_; // fwd:u
1345  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_ODE] = nullptr; // fwd:out_ode
1346  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_ALG] = nullptr; // fwd:out_alg
1347  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_QUAD] = nullptr; // fwd:out_quad
1348  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_OUT_ZERO] = nullptr; // fwd:out_zero
1349  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_ADJ_ODE] =
1350  adj_ode + (i + 1) * nrx1_ * nadj_; // fwd:adj_ode
1351  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_ADJ_ALG] = nullptr; // fwd:adj_alg
1352  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_ADJ_QUAD] =
1353  adj_quad + (i + 1) * nrz1_ * nadj_; // fwd:adj_quad
1354  m->arg[BDYN_NUM_IN + BDAE_NUM_OUT + BDYN_ADJ_ZERO] = nullptr; // fwd:adj_zero
1355  if (calc_sp_reverse(forward_name("daeB", 1), m->arg, m->res, m->iw, m->w)) return 1;
1356  }
1357  // Propagate through nondifferentiated
1358  m->res[BDAE_ADJ_X] = adj_x; // adj_x
1359  m->res[BDAE_ADJ_Z] = adj_z; // adj_z
1360  if (calc_sp_reverse("daeB", m->arg, m->res, m->iw, m->w)) return 1;
1361  return 0;
1362 }
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().

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

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

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 1364 of file integrator.cpp.

1366  {
1367  // Nondifferentiated inputs
1368  m->arg[BDYN_T] = nullptr; // t
1369  m->arg[BDYN_X] = x; // x
1370  m->arg[BDYN_Z] = z; // z
1371  m->arg[BDYN_P] = p; // p
1372  m->arg[BDYN_U] = u; // u
1373  m->arg[BDYN_OUT_ODE] = adj_ode; // out_ode
1374  m->arg[BDYN_OUT_ALG] = adj_alg; // out_alg
1375  m->arg[BDYN_OUT_QUAD] = adj_quad; // out_quad
1376  m->arg[BDYN_OUT_ZERO] = nullptr; // out_zero
1377  m->arg[BDYN_ADJ_ODE] = adj_ode; // adj_ode
1378  m->arg[BDYN_ADJ_ALG] = adj_alg; // adj_alg
1379  m->arg[BDYN_ADJ_QUAD] = adj_quad; // adj_quad
1380  m->arg[BDYN_ADJ_ZERO] = nullptr; // adj_zero
1381  // Propagate through sensitivities
1382  for (casadi_int i = 0; i < nfwd_; ++i) {
1383  m->res[BQUAD_ADJ_P] = adj_p ? adj_p + (i + 1) * nrq1_ * nadj_ : 0; // fwd:adj_p
1384  m->res[BQUAD_ADJ_U] = adj_u ? adj_u + (i + 1) * nuq1_ * nadj_ : 0; // fwd:adj_u
1385  m->arg[BDYN_NUM_IN + BQUAD_ADJ_P] = adj_p; // out:adj_p
1386  m->arg[BDYN_NUM_IN + BQUAD_ADJ_U] = adj_u; // out:adj_u
1387  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_T] = nullptr; // fwd:t
1388  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_X] = x + (i + 1) * nx1_; // fwd:x
1389  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_Z] = z + (i + 1) * nz1_; // fwd:z
1390  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_P] = p + (i + 1) * np1_; // fwd:p
1391  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_U] = u + (i + 1) * nu1_; // fwd:u
1392  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_OUT_ODE] = nullptr; // fwd:out_ode
1393  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_OUT_ALG] = nullptr; // fwd:out_alg
1394  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_OUT_QUAD] = nullptr; // fwd:out_quad
1395  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_OUT_ZERO] = nullptr; // fwd:out_zero
1396  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_ADJ_ODE] =
1397  adj_ode + (i + 1) * nrx1_ * nadj_; // fwd:adj_ode
1398  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_ADJ_ALG] =
1399  adj_alg + (i + 1) * nrz1_ * nadj_; // fwd:adj_alg
1401  adj_quad + (i + 1) * nrp1_ * nadj_; // fwd:adj_quad
1402  m->arg[BDYN_NUM_IN + BQUAD_NUM_OUT + BDYN_ADJ_ZERO] = nullptr; // fwd:adj_zero
1403  if (calc_sp_reverse(forward_name("quadB", 1), m->arg, m->res, m->iw, m->w)) return 1;
1404  }
1405  // Propagate through nondifferentiated
1406  m->res[BQUAD_ADJ_P] = adj_p; // adj_p
1407  m->res[BQUAD_ADJ_U] = adj_u; // adj_u
1408  if (calc_sp_reverse("quadB", m->arg, m->res, m->iw, m->w)) return 1;
1409  return 0;
1410 }

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

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

References casadi::FunctionInternal::cache_.

◆ calc_edot()

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

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

Definition at line 2564 of file integrator.cpp.

2564  {
2565  // Evaluate the DAE and zero crossing function
2566  m->arg[DYN_T] = &m->t; // t
2567  m->arg[DYN_X] = m->x; // x
2568  m->arg[DYN_Z] = m->z; // z
2569  m->arg[DYN_P] = m->p; // p
2570  m->arg[DYN_U] = m->u; // u
2571  m->res[DYN_ODE] = m->xdot; // ode
2572  m->res[DYN_ALG] = m->tmp1 + nx_; // alg
2573  m->res[DYN_QUAD] = nullptr; // quad
2574  m->res[DYN_ZERO] = m->e; // zero
2575  if (calc_function(m, "dae")) return 1;
2576  // Calculate de_dt using by forward mode AD applied to zero crossing function
2577  // Note: Currently ignoring dependency propagation via algebraic equations
2578  double dt_dt = 1;
2579  m->arg[DYN_NUM_IN + DYN_ODE] = m->xdot; // out:ode
2580  m->arg[DYN_NUM_IN + DYN_ALG] = m->tmp1 + nx_; // out:alg
2581  m->arg[DYN_NUM_IN + DYN_QUAD] = nullptr; // out:quad
2582  m->arg[DYN_NUM_IN + DYN_ZERO] = m->e; // out:zero
2583  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_T] = &dt_dt; // fwd:t
2584  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_X] = m->xdot; // fwd:x
2585  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_Z] = nullptr; // fwd:z
2586  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_P] = nullptr; // fwd:p
2587  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_U] = nullptr; // fwd:u
2588  m->res[DYN_ODE] = nullptr; // fwd:ode
2589  m->res[DYN_ALG] = nullptr; // fwd:alg
2590  m->res[DYN_QUAD] = nullptr; // fwd:quad
2591  m->res[DYN_ZERO] = m->edot; // fwd:zero
2592  if (calc_function(m, forward_name("dae", 1))) return 1;
2593  // Success
2594  return 0;
2595 }
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:196
@ DYN_NUM_OUT
Definition: integrator.hpp:204

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 302 of file oracle_function.cpp.

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

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

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

◆ call_forward() [1/2]

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

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

Definition at line 2945 of file function_internal.cpp.

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

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

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

◆ call_forward() [2/2]

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

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

Definition at line 3164 of file function_internal.cpp.

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

References casadi::SharedObjectInternal::class_name().

◆ call_gen() [1/2]

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

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

Definition at line 3838 of file function_internal.cpp.

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

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

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

◆ call_gen() [2/2]

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

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

Definition at line 1640 of file function_internal.hpp.

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

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

◆ call_reverse() [1/2]

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

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

Definition at line 3050 of file function_internal.cpp.

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

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

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

◆ call_reverse() [2/2]

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

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

Definition at line 3177 of file function_internal.cpp.

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

References casadi::SharedObjectInternal::class_name().

◆ change_option()

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

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

Reimplemented from casadi::ProtoFunction.

Reimplemented in casadi::MXFunction.

Definition at line 423 of file function_internal.cpp.

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

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

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

◆ check_arg()

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

Raises errors.

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

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

Definition at line 1687 of file function_internal.hpp.

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

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

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

◆ check_mat()

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

Helper function

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

Definition at line 3376 of file function_internal.cpp.

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

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

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

◆ check_mem_count()

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

Purpose if to allow more helpful error messages

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

Reimplemented in casadi::FmuFunction.

Definition at line 179 of file function_internal.hpp.

179 { }

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

◆ check_res()

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

Raises errors.

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

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

Definition at line 1711 of file function_internal.hpp.

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

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

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

◆ checkout()

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

Definition at line 3585 of file function_internal.cpp.

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

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

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

◆ class_name()

virtual std::string casadi::SharedObjectInternal::class_name ( ) const
pure virtualinherited

Implemented in casadi::SymbolicQr, casadi::Sqpmethod, casadi::ShellCompiler, casadi::Scpgen, casadi::RungeKutta, casadi::Qrsqp, casadi::Qrqp, casadi::QpToNlp, casadi::Newton, casadi::Lsqr, casadi::LinsolTridiag, casadi::LinsolQr, casadi::LinsolLdl, casadi::LinearInterpolantJac, casadi::LinearInterpolant, casadi::Ipqp, casadi::ImplicitToNlp, casadi::Feasiblesqpmethod, casadi::FastNewton, casadi::Collocation, casadi::BSplineInterpolant, casadi::WorhpInterface, casadi::TinyXmlInterface, casadi::SuperscsInterface, casadi::KinsolInterface, casadi::IdasInterface, casadi::CvodesInterface, casadi::SqicInterface, casadi::SnoptInterface, casadi::SlicotExpm, casadi::SlicotDple, casadi::SLEQPInterface, casadi::QpoasesInterface, casadi::ProxqpInterface, casadi::OsqpInterface, casadi::OoqpInterface, casadi::MumpsInterface, casadi::MadnlpInterface, casadi::LapackQr, casadi::LapackLu, casadi::KnitroInterface, casadi::IpoptInterface, casadi::Ma27Interface, casadi::HpmpcInterface, casadi::HpipmInterface, casadi::HighsInterface, casadi::GurobiInterface, casadi::FatropInterface, casadi::FatropConicInterface, casadi::DaqpInterface, casadi::CsparseInterface, casadi::CSparseCholeskyInterface, casadi::CplexInterface, casadi::ClpInterface, casadi::ClarabelInterface, casadi::ClangCompiler, casadi::CbcInterface, casadi::BonminInterface, casadi::Blocksqp, casadi::AmplInterface, casadi::AlpaqaInterface, casadi::SXFunction, casadi::Switch, casadi::SparsityInternal, casadi::WeakRefInternal, casadi::ZipMemResource, casadi::ZipResource, casadi::DirResource, casadi::OptiNode, casadi::Nlpsol, casadi::MXNode, casadi::MXFunction, casadi::MapSum, casadi::ThreadMap, casadi::OmpMap, casadi::Map, casadi::JitFunction, casadi::Interpolant, casadi::DllLibrary, casadi::ImporterInternal, casadi::GenericTypeInternal< ID, T >, casadi::FmuFunction, casadi::Fmu3, casadi::Fmu2, casadi::Smoothing, casadi::CentralDiff, casadi::BackwardDiff, casadi::ForwardDiff, casadi::External, casadi::DaeBuilderInternal, casadi::CallbackInternal, and casadi::BlazingSplineFunction.

Referenced by casadi::FunctionInternal::call_forward(), casadi::FunctionInternal::call_reverse(), casadi::FunctionInternal::codegen_body(), casadi::ProtoFunction::construct(), casadi::FmuInternal::deserialize(), casadi::ResourceInternal::deserialize(), casadi::FmuInternal::disp(), casadi::FunctionInternal::disp(), casadi::LinsolInternal::disp(), casadi::XmlFileInternal::dump(), casadi::FunctionInternal::eval(), casadi::FunctionInternal::eval_dm(), casadi::FunctionInternal::eval_sx(), casadi::FunctionInternal::export_code(), casadi::LinsolInternal::generate(), casadi::FunctionInternal::generate_dependencies(), casadi::Conic::generateNativeCode(), casadi::FmuInternal::get_adjoint_derivative(), casadi::FunctionInternal::get_forward(), casadi::FunctionInternal::get_function(), casadi::FunctionInternal::get_jacobian(), casadi::FunctionInternal::get_reverse(), casadi::FiniteDiff::init(), casadi::FunctionInternal::instruction_constant(), casadi::FunctionInternal::instruction_id(), casadi::FunctionInternal::instruction_input(), casadi::FunctionInternal::instruction_MX(), casadi::FunctionInternal::instruction_output(), casadi::FunctionInternal::instructions_sx(), casadi::LinsolInternal::linsol_eval_sx(), casadi::FunctionInternal::n_instructions(), casadi::FunctionInternal::n_nodes(), casadi::LinsolInternal::neig(), casadi::LinsolInternal::nfact(), casadi::FunctionInternal::oracle(), casadi::XmlFileInternal::parse(), casadi::LinsolInternal::rank(), casadi::FmuInternal::serialize_type(), casadi::ResourceInternal::serialize_type(), and casadi::LinsolInternal::solve().

◆ clear_mem()

void casadi::ProtoFunction::clear_mem ( )
inherited

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

Definition at line 3473 of file function_internal.cpp.

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

References casadi::ProtoFunction::free_mem().

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

◆ codegen()

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

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

Definition at line 2306 of file function_internal.cpp.

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

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

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

◆ codegen_alloc_mem()

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

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

Reimplemented in casadi::External.

Definition at line 2354 of file function_internal.cpp.

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

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

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

◆ codegen_body()

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

◆ codegen_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 295 of file oracle_function.cpp.

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

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 299 of file oracle_function.cpp.

299  {
300  }

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

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

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

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

◆ codegen_declarations()

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

◆ codegen_decref()

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

◆ codegen_free_mem()

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

◆ codegen_incref()

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

◆ codegen_init_mem()

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

◆ codegen_mem()

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

◆ codegen_mem_type()

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

◆ codegen_meta()

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

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

Definition at line 2400 of file function_internal.cpp.

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

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

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

◆ codegen_name()

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

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

Definition at line 2717 of file function_internal.cpp.

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

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

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

◆ codegen_release()

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

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

Reimplemented in casadi::External.

Definition at line 2389 of file function_internal.cpp.

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

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

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

◆ codegen_sparsities()

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

◆ codegen_sz_arg()

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

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

Definition at line 2829 of file function_internal.cpp.

2829  {
2830  return sz_arg();
2831  }

References casadi::FunctionInternal::sz_arg().

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

◆ codegen_sz_iw()

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

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

Definition at line 2835 of file function_internal.cpp.

2835  {
2836  return sz_iw();
2837  }

References casadi::FunctionInternal::sz_iw().

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

◆ codegen_sz_res()

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

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

Definition at line 2832 of file function_internal.cpp.

2832  {
2833  return sz_res();
2834  }

References casadi::FunctionInternal::sz_res().

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

◆ codegen_sz_w()

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

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

Reimplemented in casadi::SXFunction.

Definition at line 2838 of file function_internal.cpp.

2838  {
2839  return sz_w();
2840  }

References casadi::FunctionInternal::sz_w().

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

◆ construct()

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

Prepares the function for evaluation

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

Definition at line 137 of file function_internal.cpp.

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

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

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

◆ convert_arg() [1/2]

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

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

Definition at line 1811 of file function_internal.hpp.

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

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

◆ convert_arg() [2/2]

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

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

Definition at line 1799 of file function_internal.hpp.

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

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

◆ convert_res() [1/2]

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

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

Definition at line 1840 of file function_internal.hpp.

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

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

◆ convert_res() [2/2]

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

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

Definition at line 1828 of file function_internal.hpp.

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

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

◆ create_advanced()

Function casadi::FixedStepIntegrator::create_advanced ( const Dict opts)
overridevirtual

Helper for a more powerful 'integrator' factory

Reimplemented from casadi::Integrator.

Definition at line 1892 of file integrator.cpp.

1892  {
1893  Function temp = Function::create(this, opts);
1894 
1895  // Check if we need to simplify
1896  bool simplify = false;
1897  auto it = opts.find("simplify");
1898  if (it != opts.end()) simplify = it->second;
1899 
1900  if (simplify && nrx_==0 && nt()==1) {
1901  // Retrieve explicit simulation step (one finite element)
1902  Function F = get_function("step");
1903 
1904  MX z0 = MX::sym("z0", sparsity_in(INTEGRATOR_Z0));
1905 
1906  // Create symbols
1907  std::vector<MX> F_in = F.mx_in();
1908 
1909  // Prepare return Function inputs
1910  std::vector<MX> intg_in(INTEGRATOR_NUM_IN);
1911  intg_in[INTEGRATOR_X0] = F_in[STEP_X0];
1912  intg_in[INTEGRATOR_Z0] = z0;
1913  intg_in[INTEGRATOR_P] = F_in[STEP_P];
1914  intg_in[INTEGRATOR_U] = F_in[STEP_U];
1915  F_in[STEP_V0] = algebraic_state_init(intg_in[INTEGRATOR_X0], z0);
1916 
1917  // Number of finite elements and time steps
1918  double h = (tout_.back() - t0_)/static_cast<double>(disc_.back());
1919 
1920  // Prepare return Function outputs
1921  std::vector<MX> intg_out(INTEGRATOR_NUM_OUT);
1922  F_in[STEP_T] = t0_;
1923  F_in[STEP_H] = h;
1924 
1925  std::vector<MX> F_out;
1926  // Loop over finite elements
1927  for (casadi_int k=0; k<disc_.back(); ++k) {
1928  F_out = F(F_in);
1929 
1930  F_in[STEP_X0] = F_out[STEP_XF];
1931  F_in[STEP_V0] = F_out[STEP_VF];
1932  intg_out[INTEGRATOR_QF] = k==0? F_out[STEP_QF] : intg_out[INTEGRATOR_QF]+F_out[STEP_QF];
1933  F_in[STEP_T] += h;
1934  }
1935 
1936  intg_out[INTEGRATOR_XF] = F_out[STEP_XF];
1937 
1938  // If-clause needed because rk abuses STEP_VF output for intermediate state output
1939  if (nz_) {
1940  intg_out[INTEGRATOR_ZF] = algebraic_state_output(F_out[STEP_VF]);
1941  }
1942 
1943  // Extract options for Function constructor
1944  Dict sopts;
1945  sopts["print_time"] = print_time_;
1946  auto it = opts.find("simplify_options");
1947  if (it!=opts.end()) update_dict(sopts, it->second);
1948 
1949  return Function(temp.name(), intg_in, intg_out, integrator_in(), integrator_out(), sopts);
1950  } else {
1951  return temp;
1952  }
1953 }
static Function create(FunctionInternal *node)
Create from node.
Definition: function.cpp:336
static MX sym(const std::string &name, casadi_int nrow=1, casadi_int ncol=1)
Create an nrow-by-ncol symbolic primitive.
virtual MX algebraic_state_output(const MX &Z) const
casadi_int nt() const
Number of output times.
virtual MX algebraic_state_init(const MX &x0, const MX &z0) const
std::vector< double > tout_
Output time grid.
double t0_
Initial time.
std::vector< std::string > integrator_out()
Get integrator output scheme of integrators.
Definition: integrator.cpp:190
std::vector< std::string > integrator_in()
Get input scheme of integrators.
Definition: integrator.cpp:184
@ STEP_H
Step size.
@ STEP_T
Current time.
@ STEP_U
Controls.
@ STEP_X0
State vector.
@ STEP_P
Parameter.
@ STEP_V0
Dependent variables.
@ INTEGRATOR_NUM_OUT
Number of output arguments of an integrator.
Definition: integrator.hpp:259
@ INTEGRATOR_NUM_IN
Number of input arguments of an integrator.
Definition: integrator.hpp:239
@ STEP_XF
State vector at next time.
@ STEP_QF
Quadrature state contribution.
@ STEP_VF
Dependent variables at next time.
void update_dict(Dict &target, const Dict &source, bool recurse)
Update the target dictionary in place with source elements.
double simplify(double x)
Definition: calculus.hpp:271

References casadi::Integrator::algebraic_state_init(), casadi::Integrator::algebraic_state_output(), casadi::Function::create(), disc_, casadi::FunctionInternal::Function, casadi::OracleFunction::get_function(), casadi::integrator_in(), casadi::INTEGRATOR_NUM_IN, casadi::INTEGRATOR_NUM_OUT, casadi::integrator_out(), casadi::INTEGRATOR_P, casadi::INTEGRATOR_QF, casadi::INTEGRATOR_U, casadi::INTEGRATOR_X0, casadi::INTEGRATOR_XF, casadi::INTEGRATOR_Z0, casadi::INTEGRATOR_ZF, casadi::Function::mx_in(), casadi::Function::name(), casadi::Integrator::nrx_, casadi::Integrator::nt(), casadi::Integrator::nz_, casadi::ProtoFunction::print_time_, casadi::simplify(), casadi::FunctionInternal::sparsity_in(), casadi::STEP_H, casadi::STEP_P, casadi::STEP_QF, casadi::STEP_T, casadi::STEP_U, casadi::STEP_V0, casadi::STEP_VF, casadi::STEP_X0, casadi::STEP_XF, casadi::GenericMatrix< MX >::sym(), casadi::Integrator::t0_, casadi::Integrator::tout_, and casadi::update_dict().

◆ 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::SLEQPInterface::init(), casadi::SundialsInterface::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
Definition: function.cpp:1812
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::AlpaqaInterface::init(), casadi::Blocksqp::init(), casadi::BonminInterface::init(), casadi::FatropInterface::init(), casadi::IpoptInterface::init(), casadi::KnitroInterface::init(), casadi::MadnlpInterface::init(), casadi::SLEQPInterface::init(), casadi::SnoptInterface::init(), casadi::SundialsInterface::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_.

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

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

◆ definition()

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

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

Definition at line 941 of file function_internal.cpp.

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

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

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

◆ deserialize()

ProtoFunction * casadi::Integrator::deserialize ( DeserializingStream s)
staticinherited

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

Definition at line 2424 of file integrator.cpp.

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

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

◆ destroySingleton()

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

Called in the destructor of singletons

Definition at line 77 of file generic_shared_internal.hpp.

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

◆ diff_prefix()

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

Definition at line 2043 of file function_internal.cpp.

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

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

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

◆ disp()

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

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

Implements casadi::SharedObjectInternal.

Definition at line 962 of file function_internal.cpp.

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

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

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

◆ disp_more()

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

◆ dm_in() [1/2]

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

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

Definition at line 3244 of file function_internal.cpp.

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

References casadi::FunctionInternal::n_in_.

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

◆ dm_in() [2/2]

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

◆ dm_out() [1/2]

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

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

Definition at line 3252 of file function_internal.cpp.

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

References casadi::FunctionInternal::n_out_.

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

◆ dm_out() [2/2]

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

◆ ensure_stacked()

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

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

Definition at line 1857 of file function_internal.hpp.

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

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

◆ eval()

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

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

Reimplemented from casadi::FunctionInternal.

Definition at line 354 of file integrator.cpp.

355  {
356  auto m = static_cast<IntegratorMemory*>(mem);
357 
358  // Read inputs
359  const double* x0 = arg[INTEGRATOR_X0];
360  const double* z0 = arg[INTEGRATOR_Z0];
361  const double* p = arg[INTEGRATOR_P];
362  const double* u = arg[INTEGRATOR_U];
363  const double* adj_xf = arg[INTEGRATOR_ADJ_XF];
364  const double* rz0 = arg[INTEGRATOR_ADJ_ZF];
365  const double* rp = arg[INTEGRATOR_ADJ_QF];
366  arg += INTEGRATOR_NUM_IN;
367 
368  // Read outputs
369  double* x = res[INTEGRATOR_XF];
370  double* z = res[INTEGRATOR_ZF];
371  double* q = res[INTEGRATOR_QF];
372  double* adj_x = res[INTEGRATOR_ADJ_X0];
373  double* adj_p = res[INTEGRATOR_ADJ_P];
374  double* adj_u = res[INTEGRATOR_ADJ_U];
375  res += INTEGRATOR_NUM_OUT;
376 
377  // Setup memory object
378  setup(m, arg, res, iw, w);
379 
380  // Pass initial state, parameters
381  set_q(m, 0);
382  set_x(m, x0);
383  set_z(m, z0);
384  set_p(m, p);
385 
386  // Reset number of events
387  m->num_events = 0;
388 
389  // Is this the first call to reset?
390  bool first_call = true;
391 
392  // Take time to t0
393  m->t = t0_;
394 
395  // Ensure that control is updated at the first iteration
396  casadi_int k_stop = -1;
397 
398  // Do we need to reset the solver?
399  m->reset_solver = false;
400 
401  // Integrate forward
402  for (m->k = 0; m->k < nt(); ++m->k) {
403  // Start of the current interval
404  m->t_start = m->t;
405  // Next output time
406  m->t_next_out = tout_[m->k];
407  // By default, integrate until the next output time
408  m->t_next = m->t_next_out;
409  // Handle changes in control input
410  if (m->k > k_stop) {
411  // Pass new controls
412  set_u(m, u);
413  // Detect next stopping time
414  k_stop = next_stop(m->k, u);
415  m->t_stop = m->t_step = tout_[k_stop];
416  // Need to reset solver
417  m->reset_solver = true;
418  }
419  // Mark all events as not triggered
420  std::fill_n(m->event_triggered, ne_, 0);
421  // Keep integrating until we reach the next output time
422  do {
423  // Reset the solver
424  if (m->reset_solver) {
425  reset(m, first_call);
426  m->reset_solver = false;
427  first_call = false;
428  }
429  // Advance solution
430  if (verbose_) {
431  casadi_message("Interval " + str(m->k) + ": Integrating forward from "
432  + str(m->t) + " to " + str(m->t_next) + ", t_stop = " + str(m->t_stop));
433  }
434  if (advance(m)) return 1;
435  // Trigger all event, if any
436  if (m->event_index >= 0) {
437  // Clear list of triggered events
438  std::fill_n(m->event_triggered, ne_, 0);
439  // Trigger the specific event and any chained events
440  while (m->event_index >= 0) {
441  // Trigger event, get any chained event
442  if (trigger_event(m, &m->event_index)) return 1;
443  // Solver needs to be reset
444  m->reset_solver = true;
445  }
446  // Move past event
447  m->t_start = m->t;
448  m->t_stop = m->t_step;
449  m->t_next = m->t_next_out;
450  }
451  } while (m->t != m->t_next);
452  // Get solution
453  get_x(m, x);
454  get_z(m, z);
455  get_q(m, q);
456  if (x) x += nx_;
457  if (z) z += nz_;
458  if (q) q += nq_;
459  if (u) u += nu_;
460  }
461 
462  // Backwards integration, if needed
463  if (nrx_ > 0) {
464  // Take adj_xf, rz0, rp past the last grid point
465  if (adj_xf) adj_xf += nrx_ * nt();
466  if (rz0) rz0 += nrz_ * nt();
467  if (rp) rp += nrp_ * nt();
468  if (adj_u) adj_u += nuq_ * nt();
469  // Next stop time due to step change in input
470  k_stop = nt();
471  // Reset the solver
472  resetB(m);
473  // Any adjoint seed so far?
474  bool any_impulse = false;
475  // Integrate backward
476  for (m->k = nt(); m->k-- > 0; ) {
477  m->t = tout_[m->k];
478  // Add impulse to backwards integration
479  if (adj_xf) adj_xf -= nrx_;
480  if (rz0) rz0 -= nrz_;
481  if (rp) rp -= nrp_;
482  if (adj_u) adj_u -= nuq_;
483  if (u) u -= nu_;
484  if (!all_zero(adj_xf, nrx_) || !all_zero(rz0, nrz_) || !all_zero(rp, nrp_)) {
485  if (verbose_) casadi_message("Impulse from adjoint seeds at output time " + str(m->k));
486  impulseB(m, adj_xf, rz0, rp);
487  any_impulse = true;
488  }
489  // Next output time, or beginning
490  casadi_int k_next = m->k - 1;
491  m->t_next = k_next < 0 ? t0_ : tout_[k_next];
492  // Update integrator stopping time
493  if (k_next < k_stop) k_stop = next_stopB(m->k, u);
494  m->t_stop = k_stop < 0 ? t0_ : tout_[k_stop];
495  // Proceed to the previous time point or t0
496  if (any_impulse) {
497  if (verbose_) casadi_message("Integrating backward from output time " + str(m->k)
498  + ": t_next = " + str(m->t_next) + ", t_stop = " + str(m->t_stop));
499  if (m->k > 0) {
500  retreat(m, u, 0, 0, adj_u);
501  } else {
502  retreat(m, u, adj_x, adj_p, adj_u);
503  }
504  } else {
505  if (verbose_) casadi_message("No adjoint seeds from output time " + str(m->k)
506  + ": t_next = " + str(m->t_next) + ", t_stop = " + str(m->t_stop));
507  casadi_clear(adj_u, nuq_);
508  if (m->k == 0) {
509  casadi_clear(adj_x, nrx_);
510  casadi_clear(adj_p, nrq_);
511  }
512  }
513  }
514  // adj_u should contain the contribution from the grid point, not cumulative
515  if (adj_u) {
516  for (m->k = 0; m->k < nt() - 1; ++m->k) {
517  casadi_axpy(nuq_, -1., adj_u + nuq_, adj_u);
518  adj_u += nuq_;
519  }
520  }
521  }
522 
523  // Collect oracle statistics
524  join_results(m);
525 
526  // Print integrator statistics
527  if (print_stats_) print_stats(m);
528 
529  return 0;
530 }
void setup(void *mem, const double **arg, double **res, casadi_int *iw, double *w) const
Set the (persistent and temporary) work vectors.
virtual void reset(IntegratorMemory *mem, bool first_call) const
Reset the forward solver at the start or after an event.
void set_z(IntegratorMemory *m, const double *z) const
virtual void resetB(IntegratorMemory *mem) const =0
Reset the backward problem.
void get_z(IntegratorMemory *m, double *z) const
void set_x(IntegratorMemory *m, const double *x) const
casadi_int next_stopB(casadi_int k, const double *u) const
Find next stop time.
int advance(IntegratorMemory *m) const
Advance solution in time, with events handling.
Definition: integrator.cpp:532
void get_q(IntegratorMemory *m, double *q) const
casadi_int next_stop(casadi_int k, const double *u) const
Find next stop time.
virtual void retreat(IntegratorMemory *mem, const double *u, double *adj_x, double *adj_p, double *adj_u) const =0
Retreat solution in time.
void set_u(IntegratorMemory *m, const double *u) const
bool print_stats_
Options.
virtual void impulseB(IntegratorMemory *mem, const double *adj_x, const double *adj_z, const double *adj_q) const =0
Introduce an impulse into the backwards integration at the current time.
void get_x(IntegratorMemory *m, double *x) const
virtual void print_stats(IntegratorMemory *mem) const
Print solver statistics.
int trigger_event(IntegratorMemory *m, casadi_int *ind) const
Trigger an event.
static bool all_zero(const double *v, casadi_int n)
Helper function: Vector has only zeros?
void set_q(IntegratorMemory *m, const double *q) const
casadi_int nu_
Number of controls.
void set_p(IntegratorMemory *m, const double *p) const
void join_results(OracleMemory *m) const
Combine results from different threads.
void casadi_clear(T1 *x, casadi_int n)
CLEAR: x <- 0.

References casadi::Integrator::advance(), casadi::Integrator::all_zero(), casadi::casadi_axpy(), casadi::casadi_clear(), casadi::Integrator::get_q(), casadi::Integrator::get_x(), casadi::Integrator::get_z(), casadi::Integrator::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::Integrator::ne_, casadi::Integrator::next_stop(), casadi::Integrator::next_stopB(), casadi::Integrator::nq_, casadi::Integrator::nrp_, casadi::Integrator::nrq_, casadi::Integrator::nrx_, casadi::Integrator::nrz_, casadi::Integrator::nt(), casadi::Integrator::nu_, casadi::Integrator::nuq_, casadi::Integrator::nx_, casadi::Integrator::nz_, casadi::Integrator::print_stats(), casadi::Integrator::print_stats_, casadi::Integrator::reset(), casadi::Integrator::resetB(), casadi::Integrator::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::str(), casadi::Integrator::t0_, casadi::Integrator::tout_, casadi::Integrator::trigger_event(), and casadi::ProtoFunction::verbose_.

◆ eval_dm()

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

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

Reimplemented in casadi::CallbackInternal.

Definition at line 2026 of file function_internal.cpp.

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

References casadi::SharedObjectInternal::class_name().

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

◆ eval_gen() [1/3]

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

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

Definition at line 430 of file function_internal.hpp.

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

◆ eval_gen() [2/3]

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

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

Definition at line 830 of file function_internal.cpp.

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

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

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

◆ eval_gen() [3/3]

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

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

Definition at line 426 of file function_internal.hpp.

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

◆ eval_mx()

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

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

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

Definition at line 2241 of file function_internal.cpp.

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

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

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

◆ eval_sx()

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

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

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

Definition at line 2030 of file function_internal.cpp.

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

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

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

◆ expand()

void casadi::OracleFunction::expand ( )
inherited

Definition at line 455 of file oracle_function.cpp.

455  {
456  oracle_ = oracle_.expand();
457 }
Function expand() const
Expand a function to SX.
Definition: function.cpp:308

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

Referenced by 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 1002 of file integrator.cpp.

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

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 1264 of file integrator.cpp.

1265  {
1266  // Nondifferentiated inputs
1267  m->arg[DYN_T] = nullptr; // t
1268  m->arg[DYN_X] = x; // x
1269  m->arg[DYN_Z] = nullptr; // z
1270  m->arg[DYN_P] = p; // p
1271  m->arg[DYN_U] = u; // u
1272  // Propagate through sensitivities
1273  for (casadi_int i = 0; i < nfwd_; ++i) {
1274  m->res[DAE_ODE] = ode + (i + 1) * nx1_; // fwd:ode
1275  m->res[DAE_ALG] = alg + (i + 1) * nz1_; // fwd:alg
1276  m->arg[DYN_NUM_IN + DAE_ODE] = ode; // out:ode
1277  m->arg[DYN_NUM_IN + DAE_ALG] = alg; // out:alg
1278  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_T] = nullptr; // fwd:t
1279  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_X] = x + (i + 1) * nx1_; // fwd:x
1280  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_Z] = nullptr; // fwd:z
1281  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_P] = p + (i + 1) * np1_; // fwd:p
1282  m->arg[DYN_NUM_IN + DAE_NUM_OUT + DYN_U] = u + (i + 1) * nu1_; // fwd:u
1283  if (calc_sp_reverse(forward_name("daeF", 1), m->arg, m->res, m->iw, m->w)) return 1;
1284  }
1285  // Propagate through nondifferentiated
1286  m->res[DAE_ODE] = ode; // ode
1287  m->res[DAE_ALG] = alg; // alg
1288  if (calc_sp_reverse("daeF", m->arg, m->res, m->iw, m->w)) return 1;
1289  return 0;
1290 }

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

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

◆ format_time()

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

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

Definition at line 3772 of file function_internal.cpp.

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

References casadi::ProtoFunction::sprint().

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

◆ forward()

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

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

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

Definition at line 2079 of file function_internal.cpp.

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

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 1029 of file integrator.cpp.

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

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 1292 of file integrator.cpp.

1293  {
1294  // Nondifferentiated inputs
1295  m->arg[DYN_T] = nullptr; // t
1296  m->arg[DYN_X] = x; // x
1297  m->arg[DYN_Z] = z; // z
1298  m->arg[DYN_P] = p; // p
1299  m->arg[DYN_U] = u; // u
1300  // Propagate through sensitivities
1301  for (casadi_int i = 0; i < nfwd_; ++i) {
1302  m->res[QUAD_QUAD] = quad + (i + 1) * nq1_; // fwd:quad
1303  m->arg[DYN_NUM_IN + QUAD_QUAD] = quad; // out:quad
1304  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_T] = nullptr; // fwd:t
1305  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_X] = x + (i + 1) * nx1_; // fwd:x
1306  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_Z] = z + (i + 1) * nz1_; // fwd:z
1307  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_P] = p + (i + 1) * np1_; // fwd:p
1308  m->arg[DYN_NUM_IN + QUAD_NUM_OUT + DYN_U] = u + (i + 1) * nu1_; // fwd:u
1309  if (calc_sp_reverse(forward_name("quadF", 1), m->arg, m->res, m->iw, m->w)) return 1;
1310  }
1311  // Propagate through nondifferentiated
1312  m->res[QUAD_QUAD] = quad; // quad
1313  if (calc_sp_reverse("quadF", m->arg, m->res, m->iw, m->w)) return 1;
1314  return 0;
1315 }

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::FixedStepIntegrator::free_mem ( void *  mem) const
inlineoverridevirtual

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

Reimplemented from casadi::FunctionInternal.

Definition at line 609 of file integrator_impl.hpp.

609 { delete static_cast<FixedStepMemory*>(mem);}

◆ free_mx()

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

Reimplemented in casadi::MXFunction.

Definition at line 3293 of file function_internal.cpp.

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

◆ free_sx()

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

Reimplemented in casadi::SXFunction.

Definition at line 3297 of file function_internal.cpp.

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

◆ from_compact()

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

Definition at line 1844 of file function_internal.cpp.

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

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

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

◆ fwd_seed()

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

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

Definition at line 1496 of file function_internal.hpp.

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

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

◆ fwdViaJac()

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

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

Definition at line 2909 of file function_internal.cpp.

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

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

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

◆ generate_dependencies()

std::string casadi::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 428 of file oracle_function.cpp.

429  {
430  CodeGenerator gen(fname, opts);
431  gen.add(oracle_);
432  for (auto&& e : all_functions_) {
433  if (e.second.jit) gen.add(e.second.f);
434  }
435  return gen.generate();
436 }

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

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

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

◆ generate_lifted()

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

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

Reimplemented in casadi::MXFunction.

Definition at line 3301 of file function_internal.cpp.

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

◆ generate_options()

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

Reimplemented from casadi::ProtoFunction.

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

Definition at line 382 of file function_internal.cpp.

382  {
383  Dict opts = ProtoFunction::generate_options(target);
384  opts["jac_penalty"] = jac_penalty_;
385  opts["user_data"] = user_data_;
386  opts["inputs_check"] = inputs_check_;
387  if (target!="tmp") opts["jit"] = jit_;
388  opts["jit_cleanup"] = jit_cleanup_;
389  opts["jit_serialize"] = jit_serialize_;
390  opts["compiler"] = compiler_plugin_;
391  opts["jit_options"] = jit_options_;
392  opts["jit_name"] = jit_base_name_;
393  opts["jit_temp_suffix"] = jit_temp_suffix_;
394  opts["ad_weight"] = ad_weight_;
395  opts["ad_weight_sp"] = ad_weight_sp_;
396  opts["always_inline"] = always_inline_;
397  opts["never_inline"] = never_inline_;
398  opts["max_num_dir"] = max_num_dir_;
399  if (target=="clone" || target=="tmp") {
400  opts["enable_forward"] = enable_forward_op_;
401  opts["enable_reverse"] = enable_reverse_op_;
402  opts["enable_jacobian"] = enable_jacobian_op_;
403  opts["enable_fd"] = enable_fd_op_;
404  opts["reverse_options"] = reverse_options_;
405  opts["forward_options"] = forward_options_;
406  opts["jacobian_options"] = jacobian_options_;
407  opts["der_options"] = der_options_;
408  opts["derivative_of"] = derivative_of_;
409  }
410  opts["fd_options"] = fd_options_;
411  opts["fd_method"] = fd_method_;
412  opts["print_in"] = print_in_;
413  opts["print_out"] = print_out_;
414  opts["max_io"] = max_io_;
415  opts["dump_in"] = dump_in_;
416  opts["dump_out"] = dump_out_;
417  opts["dump_dir"] = dump_dir_;
418  opts["dump_format"] = dump_format_;
419  opts["dump"] = dump_;
420  return opts;
421  }
std::string jit_serialize_
Serialize behaviour.
std::string compiler_plugin_
Just-in-time compiler.
void * user_data_
User-set field.
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::compiler_plugin_, casadi::FunctionInternal::der_options_, casadi::FunctionInternal::derivative_of_, casadi::FunctionInternal::dump_, casadi::FunctionInternal::dump_dir_, casadi::FunctionInternal::dump_format_, casadi::FunctionInternal::dump_in_, casadi::FunctionInternal::dump_out_, casadi::FunctionInternal::enable_fd_op_, casadi::FunctionInternal::enable_forward_op_, casadi::FunctionInternal::enable_jacobian_op_, casadi::FunctionInternal::enable_reverse_op_, casadi::FunctionInternal::fd_method_, casadi::FunctionInternal::fd_options_, casadi::FunctionInternal::forward_options_, casadi::ProtoFunction::generate_options(), casadi::FunctionInternal::inputs_check_, casadi::FunctionInternal::jac_penalty_, casadi::FunctionInternal::jacobian_options_, casadi::FunctionInternal::jit_, casadi::FunctionInternal::jit_base_name_, casadi::FunctionInternal::jit_cleanup_, casadi::FunctionInternal::jit_options_, casadi::FunctionInternal::jit_serialize_, casadi::FunctionInternal::jit_temp_suffix_, casadi::FunctionInternal::max_io_, casadi::FunctionInternal::max_num_dir_, casadi::FunctionInternal::never_inline_, casadi::FunctionInternal::print_in_, casadi::FunctionInternal::print_out_, casadi::FunctionInternal::reverse_options_, and casadi::FunctionInternal::user_data_.

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

◆ generate_out()

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

Definition at line 747 of file function_internal.cpp.

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

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

◆ get_abstol()

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

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

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

Definition at line 1094 of file function_internal.hpp.

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

References casadi::eps.

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

◆ get_default_in()

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

◆ get_diff_in()

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 1558 of file integrator.cpp.

1561  {
1562  if (verbose_) casadi_message(name_ + "::get_forward");
1563 
1564  // Integrator options
1565  Dict aug_opts = getDerivativeOptions(true);
1566  for (auto&& i : augmented_options_) {
1567  aug_opts[i.first] = i.second;
1568  }
1569 
1570  // Get current DAE, with any existing sensitivity equations augmented
1571  Function this_dae = augmented_dae();
1572 
1573  // Create integrator for augmented DAE
1574  std::string aug_prefix = "fsens" + str(nfwd) + "_";
1575  aug_opts["derivative_of"] = self();
1576  aug_opts["nfwd"] = nfwd;
1577  aug_opts["nadj"] = nadj_;
1578  Function aug_int = integrator(aug_prefix + name_, plugin_name(),
1579  this_dae, t0_, tout_, aug_opts);
1580 
1581  // All inputs of the return function
1582  std::vector<MX> ret_in;
1584 
1585  // Add nondifferentiated inputs to ret_in
1586  for (casadi_int i = 0; i < INTEGRATOR_NUM_IN; ++i) {
1587  ret_in.push_back(MX::sym(integrator_in(i), sparsity_in(i)));
1588  }
1589 
1590  // Add nondifferentiated outputs (unused) to ret_in
1591  for (casadi_int i = 0; i < INTEGRATOR_NUM_OUT; ++i) {
1592  ret_in.push_back(MX::sym("out_" + integrator_out(i), Sparsity(size_out(i))));
1593  }
1594 
1595  // Create symbolic expressions for augmented problem, add forward seeds to ret_in
1596  std::vector<std::vector<MX>> aug_in(INTEGRATOR_NUM_IN);
1597  std::vector<MX> v(nfwd);
1598  for (casadi_int i = 0; i < INTEGRATOR_NUM_IN; ++i) {
1599  for (casadi_int d = 0; d < nfwd; ++d) {
1600  v[d] = MX::sym("fwd" + str(d) + "_" + integrator_in(i), sparsity_in(i));
1601  aug_in[i].push_back(v[d]);
1602  }
1603  ret_in.push_back(horzcat(v));
1604  }
1605 
1606  // Call the augmented integrator
1607  std::vector<MX> integrator_in(INTEGRATOR_NUM_IN);
1608  for (casadi_int i = 0; i < INTEGRATOR_NUM_IN; ++i) {
1609  if (size1_in(i) > 0 && grid_in(i) && nt() > 1) {
1610  // Split nondifferentiated input by grid point
1611  std::vector<MX> ret_in_split = horzsplit_n(ret_in[i], nt());
1612  // Split augmented input by grid point
1613  std::vector<std::vector<MX>> aug_in_split(nfwd);
1614  for (casadi_int d = 0; d < nfwd; ++d) {
1615  aug_in_split[d] = horzsplit_n(aug_in[i][d], nt());
1616  }
1617  // Reorder columns
1618  v.clear();
1619  for (casadi_int k = 0; k < nt(); ++k) {
1620  v.push_back(ret_in_split.at(k));
1621  for (casadi_int d = 0; d < nfwd; ++d) {
1622  v.push_back(aug_in_split[d].at(k));
1623  }
1624  }
1625  } else {
1626  // No reordering necessary
1627  v = aug_in[i];
1628  v.insert(v.begin(), ret_in[i]);
1629  }
1630  // Flatten all elements
1631  for (MX& e : v) e = vec(e);
1632  integrator_in[i] = horzcat(v);
1633  }
1634  std::vector<MX> integrator_out = aug_int(integrator_in);
1635 
1636  // Collect forward sensitivites
1637  std::vector<MX> ret_out;
1638  ret_out.reserve(INTEGRATOR_NUM_OUT);
1639  for (casadi_int i = 0; i < INTEGRATOR_NUM_OUT; ++i) {
1640  // Split return by grid points and sensitivities
1641  casadi_int n_grid = grid_out(i) ? nt() : 1;
1642  std::vector<casadi_int> offset = {0};
1643  for (casadi_int k = 0; k < n_grid; ++k) {
1644  for (casadi_int d = 0; d <= nfwd; ++d) {
1645  offset.push_back(offset.back() + size2_out(i) / n_grid);
1646  }
1647  }
1648  std::vector<MX> integrator_out_split = horzsplit(
1649  reshape(integrator_out[i], size1_out(i), offset.back()), offset);
1650  // Collect sensitivity blocks in the right order
1651  std::vector<MX> ret_out_split;
1652  ret_out_split.reserve(n_grid * nfwd);
1653  for (casadi_int d = 0; d < nfwd; ++d) {
1654  for (casadi_int k = 0; k < n_grid; ++k) {
1655  ret_out_split.push_back(integrator_out_split.at((nfwd + 1) * k + d + 1));
1656  }
1657  }
1658  ret_out.push_back(horzcat(ret_out_split));
1659  }
1660 
1661  Dict options = opts;
1662  options["allow_duplicate_io_names"] = true;
1663 
1664  // Create derivative function and return
1665  return Function(name, ret_in, ret_out, inames, onames, options);
1666 }
Dict augmented_options_
Augmented user option.
static bool grid_out(casadi_int i)
Is an output repeated for each grid point?
Definition: integrator.cpp:324
static bool grid_in(casadi_int i)
Is an input repeated for each grid point?
Definition: integrator.cpp:312
Function augmented_dae() const
Generate the augmented DAE system.
Definition: integrator.cpp:919
virtual Dict getDerivativeOptions(bool fwd) const
Set solver specific options to generated augmented integrators.
virtual const char * plugin_name() const=0
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::grid_in(), casadi::Integrator::grid_out(), casadi::integrator(), casadi::integrator_in(), casadi::INTEGRATOR_NUM_IN, casadi::INTEGRATOR_NUM_OUT, casadi::integrator_out(), casadi::Integrator::nadj_, casadi::ProtoFunction::name_, casadi::Integrator::nt(), casadi::PluginInterface< Integrator >::plugin_name(), casadi::FunctionInternal::size1_in(), casadi::FunctionInternal::size1_out(), casadi::FunctionInternal::size2_out(), 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 943 of file integrator.cpp.

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

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

References casadi::FunctionInternal::has_free().

◆ get_function() [1/2]

std::vector< std::string > casadi::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 531 of file oracle_function.cpp.

531  {
532  std::vector<std::string> ret;
533  ret.reserve(all_functions_.size());
534  for (auto&& e : all_functions_) {
535  ret.push_back(e.first);
536  }
537  return ret;
538 }

References casadi::OracleFunction::all_functions_.

Referenced by casadi::Rootfinder::ad_forward(), casadi::Rootfinder::ad_reverse(), casadi::OracleFunction::calc_function(), 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_body_exit(), casadi::Nlpsol::codegen_declarations(), casadi::FatropInterface::codegen_declarations(), casadi::IpoptInterface::codegen_declarations(), casadi::MadnlpInterface::codegen_declarations(), casadi::FastNewton::codegen_declarations(), casadi::Feasiblesqpmethod::codegen_declarations(), casadi::Sqpmethod::codegen_declarations(), casadi::Feasiblesqpmethod::codegen_feasibility_iterations(), 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(), init(), casadi::ImplicitFixedStepIntegrator::init(), casadi::Blocksqp::init(), casadi::BonminInterface::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::OracleFunction::monitored(), casadi::FatropInterface::set_fatrop_prob(), casadi::IpoptInterface::set_ipopt_prob(), casadi::MadnlpInterface::set_madnlp_prob(), casadi::SundialsInterface::set_work(), casadi::Collocation::setup_step(), casadi::RungeKutta::setup_step(), casadi::Integrator::sp_jac_dae(), and casadi::Integrator::sp_jac_rdae().

◆ get_function() [2/2]

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

Reimplemented from casadi::FunctionInternal.

Definition at line 540 of file oracle_function.cpp.

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

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

1788  {
1789  if (symmetric) {
1790  casadi_assert(sparsity_out_[oind].is_dense(),
1791  "Symmetry exploitation in Jacobian assumes dense expression. "
1792  "A potential workaround is to apply densify().");
1793  }
1794  // Check if we are able to propagate dependencies through the function
1795  if (has_spfwd() || has_sprev()) {
1796  // Get weighting factor
1797  double w = sp_weight();
1798 
1799  // Skip generation, assume dense
1800  if (w == -1) return Sparsity();
1801 
1802  Sparsity sp;
1803  if (nnz_in(iind) > 3*bvec_size && nnz_out(oind) > 3*bvec_size &&
1805  if (symmetric) {
1806  sp = get_jac_sparsity_hierarchical_symm(oind, iind);
1807  } else {
1808  sp = get_jac_sparsity_hierarchical(oind, iind);
1809  }
1810  } else {
1811  // Number of nonzero inputs and outputs
1812  casadi_int nz_in = nnz_in(iind);
1813  casadi_int nz_out = nnz_out(oind);
1814 
1815  // Number of forward sweeps we must make
1816  casadi_int nsweep_fwd = nz_in/bvec_size;
1817  if (nz_in%bvec_size) nsweep_fwd++;
1818 
1819  // Number of adjoint sweeps we must make
1820  casadi_int nsweep_adj = nz_out/bvec_size;
1821  if (nz_out%bvec_size) nsweep_adj++;
1822 
1823  // Use forward mode?
1824  if (w*static_cast<double>(nsweep_fwd) <= (1-w)*static_cast<double>(nsweep_adj)) {
1825  sp = get_jac_sparsity_gen<true>(oind, iind);
1826  } else {
1827  sp = get_jac_sparsity_gen<false>(oind, iind);
1828  }
1829  }
1830  return sp;
1831  } else {
1832  // Not calculated
1833  return Sparsity();
1834  }
1835  }
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 1132 of file function_internal.cpp.

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

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

◆ get_jac_sparsity_hierarchical()

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

Decide which ad_mode to take

Definition at line 1472 of file function_internal.cpp.

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

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

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

◆ get_jac_sparsity_hierarchical_symm()

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

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

Definition at line 1237 of file function_internal.cpp.

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

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

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

◆ get_jacobian()

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

◆ get_max_in()

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

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

Definition at line 1065 of file function_internal.hpp.

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

References casadi::inf.

◆ get_min_in()

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

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

Definition at line 1072 of file function_internal.hpp.

1072  {
1073  return -inf;
1074  }

References casadi::inf.

◆ get_n_in()

size_t casadi::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 1076 of file function_internal.hpp.

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

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

◆ get_nominal_out()

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

Reimplemented in casadi::FmuFunction.

Definition at line 1080 of file function_internal.hpp.

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

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

◆ get_options()

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

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

Reimplemented from casadi::Integrator.

Reimplemented in casadi::Collocation, and casadi::ImplicitFixedStepIntegrator.

Definition at line 581 of file integrator_impl.hpp.

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

◆ get_partition()

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

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

Definition at line 1927 of file function_internal.cpp.

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

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

◆ get_q()

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

Definition at line 2533 of file integrator.cpp.

2533  {
2534  casadi_copy(m->q, nq_, q);
2535 }

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

Referenced by casadi::Integrator::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 1087 of file function_internal.hpp.

1087  {
1088  return eps;
1089  }

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 1668 of file integrator.cpp.

1671  {
1672  if (verbose_) casadi_message(name_ + "::get_reverse");
1673 
1674  // Events not implemented
1675  casadi_assert(ne_ == 0, "Event support not implemented for Integrator::get_reverse");
1676 
1677  // Integrator options
1678  Dict aug_opts = getDerivativeOptions(false);
1679  for (auto&& i : augmented_options_) {
1680  aug_opts[i.first] = i.second;
1681  }
1682 
1683  // Get the current oracle, augmented with any existing forward sensitivity equations
1684  Function this_dae = augmented_dae();
1685 
1686  // Create integrator for augmented DAE
1687  std::string aug_prefix = "asens" + str(nadj) + "_";
1688  aug_opts["derivative_of"] = self();
1689  if (nrx_ == 0) {
1690  // Add backward problem
1691  aug_opts["nadj"] = nadj;
1692  aug_opts["nfwd"] = 0;
1693  } else {
1694  // Reformulate as forward-over-reverse
1695  aug_opts["nfwd"] = nadj;
1696  aug_opts["nadj"] = nadj_;
1697  }
1698  Function aug_int = integrator(aug_prefix + name_, plugin_name(),
1699  this_dae, t0_, tout_, aug_opts);
1700 
1701  // All inputs of the return function
1702  std::vector<MX> ret_in;
1704 
1705  // Add nondifferentiated inputs to ret_in
1706  for (casadi_int i = 0; i < INTEGRATOR_NUM_IN; ++i) {
1707  ret_in.push_back(MX::sym(integrator_in(i), sparsity_in(i)));
1708  }
1709 
1710  // Add nondifferentiated outputs (unused) to ret_in
1711  for (casadi_int i = 0; i < INTEGRATOR_NUM_OUT; ++i) {
1712  ret_in.push_back(MX::sym("out_" + integrator_out(i), Sparsity(size_out(i))));
1713  }
1714 
1715  // Create symbolic expressions for augmented problem, add adjoint seeds to ret_in
1716  std::vector<std::vector<MX>> aug_in(INTEGRATOR_NUM_OUT);
1717  std::vector<MX> v(nadj);
1718  for (casadi_int i = 0; i < INTEGRATOR_NUM_OUT; ++i) {
1719  for (casadi_int d=0; d<nadj; ++d) {
1720  v[d] = MX::sym("adj" + str(d) + "_" + integrator_out(i), sparsity_out(i));
1721  aug_in[i].push_back(v[d]);
1722  }
1723  ret_in.push_back(horzcat(v));
1724  }
1725 
1726  // Call the augmented integrator
1727  std::vector<MX> integrator_in(INTEGRATOR_NUM_IN);
1728  for (casadi_int i = 0; i < INTEGRATOR_NUM_IN; ++i) {
1729  // Output index contributing to adjoint seeds
1730  casadi_int j = adjmap_out(i);
1731  // Number of grid points for this integrator input
1732  casadi_int n_grid = grid_in(i) ? nt() : 1;
1733  // Split input and seeds by grid points, if necessary
1734  std::vector<MX> ret_in_split;
1735  std::vector<std::vector<MX>> aug_in_split(nadj);
1736  if (size1_in(i) > 0 && grid_in(i) && n_grid > 1) {
1737  // Split nondifferentiated input by grid point
1738  ret_in_split = horzsplit_n(ret_in[i], nt());
1739  // Split augmented input by grid point
1740  for (casadi_int d = 0; d < nadj; ++d) {
1741  aug_in_split[d] = horzsplit_n(aug_in[j][d], nt());
1742  }
1743  } else {
1744  // No reordering necessary
1745  ret_in_split = {ret_in[i]};
1746  for (casadi_int d = 0; d < nadj; ++d) aug_in_split[d] = {aug_in[j][d]};
1747  }
1748  // Vectorize all inputs to allow concatenation (unlike forward sensitivities,
1749  // number of rows for sensitivities may be different from original inputs)
1750  for (auto&& e : ret_in_split) e = vec(e);
1751  for (auto&& e1 : aug_in_split) {
1752  for (auto&& e2 : e1) e2 = vec(e2);
1753  }
1754  // Assemble input argument
1755  v.clear();
1756  for (casadi_int k = 0; k < ret_in_split.size(); ++k) {
1757  v.push_back(ret_in_split.at(k));
1758  for (casadi_int d = 0; d < nadj; ++d) {
1759  v.push_back(aug_in_split[d].at(k));
1760  }
1761  }
1762  integrator_in[i] = reshape(vertcat(v), aug_int.size_in(i));
1763  }
1764  std::vector<MX> integrator_out = aug_int(integrator_in);
1765 
1766  // Collect adjoint sensitivites
1767  std::vector<MX> ret_out;
1768  ret_out.reserve(INTEGRATOR_NUM_IN);
1769  for (casadi_int i = 0; i < INTEGRATOR_NUM_IN; ++i) {
1770  casadi_int j = adjmap_out(i);
1771  // Split return by grid points and sensitivities
1772  casadi_int n_grid = grid_out(j) ? nt() : 1;
1773  std::vector<casadi_int> offset = {0};
1774  for (casadi_int k = 0; k < n_grid; ++k) {
1775  offset.push_back(offset.back() + numel_out(j) / n_grid);
1776  for (casadi_int d = 0; d < nadj; ++d) {
1777  offset.push_back(offset.back() + numel_in(i) / n_grid);
1778  }
1779  }
1780  std::vector<MX> integrator_out_split = vertsplit(vec(integrator_out[j]), offset);
1781  // Collect sensitivity blocks in the right order
1782  std::vector<MX> ret_out_split;
1783  ret_out_split.reserve(n_grid * nadj);
1784  for (casadi_int d = 0; d < nadj; ++d) {
1785  for (casadi_int k = 0; k < n_grid; ++k) {
1786  ret_out_split.push_back(reshape(integrator_out_split.at((nadj + 1) * k + d + 1),
1787  size1_in(i), size2_in(i) / n_grid));
1788  }
1789  }
1790  ret_out.push_back(horzcat(ret_out_split));
1791  }
1792 
1793  Dict options = opts;
1794  options["allow_duplicate_io_names"] = true;
1795 
1796  // Create derivative function and return
1797  return Function(name, ret_in, ret_out, inames, onames, options);
1798 }
static casadi_int adjmap_out(casadi_int i)
Which output is used to calculate a given input in adjoint sensitivity analysis.
Definition: integrator.cpp:336

References casadi::Integrator::adjmap_out(), casadi::Integrator::augmented_dae(), casadi::Integrator::augmented_options_, casadi::FunctionInternal::Function, casadi::Integrator::getDerivativeOptions(), casadi::Integrator::grid_in(), casadi::Integrator::grid_out(), casadi::integrator(), casadi::integrator_in(), casadi::INTEGRATOR_NUM_IN, casadi::INTEGRATOR_NUM_OUT, casadi::integrator_out(), casadi::Integrator::nadj_, casadi::ProtoFunction::name_, casadi::Integrator::ne_, casadi::Integrator::nrx_, casadi::Integrator::nt(), 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::Integrator::get_sparsity_in ( casadi_int  i)
overridevirtualinherited

◆ get_sparsity_out()

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

◆ get_stats()

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

◆ get_x()

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

Definition at line 2537 of file integrator.cpp.

2537  {
2538  casadi_copy(m->x, nx_, x);
2539 }

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

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

◆ get_z()

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

Definition at line 2541 of file integrator.cpp.

2541  {
2542  casadi_copy(m->z, nz_, z);
2543 }

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

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

◆ getAdaptorSolverName()

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

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

Definition at line 304 of file function_internal.hpp.

304 { return ""; }

◆ getCount()

Definition at line 60 of file generic_shared_internal.hpp.

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

◆ getDerivativeOptions()

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

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

Definition at line 1800 of file integrator.cpp.

1800  {
1801  // Copy all options
1802  return opts_;
1803 }
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.

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

◆ grid_in()

bool casadi::Integrator::grid_in ( casadi_int  i)
staticinherited

Definition at line 312 of file integrator.cpp.

312  {
313  switch (static_cast<IntegratorInput>(i)) {
314  case INTEGRATOR_U:
315  case INTEGRATOR_ADJ_XF:
316  case INTEGRATOR_ADJ_ZF:
317  case INTEGRATOR_ADJ_QF:
318  return true;
319  default: break;
320  }
321  return false;
322 }

References casadi::INTEGRATOR_ADJ_QF, casadi::INTEGRATOR_ADJ_XF, casadi::INTEGRATOR_ADJ_ZF, and casadi::INTEGRATOR_U.

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

◆ grid_out()

bool casadi::Integrator::grid_out ( casadi_int  i)
staticinherited

Definition at line 324 of file integrator.cpp.

324  {
325  switch (static_cast<IntegratorOutput>(i)) {
326  case INTEGRATOR_XF:
327  case INTEGRATOR_ZF:
328  case INTEGRATOR_QF:
329  case INTEGRATOR_ADJ_U:
330  return true;
331  default: break;
332  }
333  return false;
334 }

References casadi::INTEGRATOR_ADJ_U, casadi::INTEGRATOR_QF, casadi::INTEGRATOR_XF, and casadi::INTEGRATOR_ZF.

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

◆ has_codegen()

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

◆ has_derivative()

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

◆ has_eval_dm()

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

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

Reimplemented in casadi::CallbackInternal.

Definition at line 419 of file function_internal.hpp.

419 { return false;}

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

◆ has_forward()

bool casadi::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 738 of file function_internal.hpp.

738 { 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 3581 of file function_internal.cpp.

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

◆ has_option()

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

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

Definition at line 920 of file function_internal.cpp.

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

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

◆ has_plugin()

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

Definition at line 76 of file plugin_interface.hpp.

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

◆ has_reverse()

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

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

Reimplemented from casadi::FunctionInternal.

Definition at line 328 of file integrator_impl.hpp.

328 { return ne_ == 0;}

◆ has_spfwd()

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

Is the class able to propagate seeds through the algorithm?

Reimplemented from casadi::FunctionInternal.

Definition at line 305 of file integrator_impl.hpp.

305 { return true;}

◆ has_sprev()

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

Is the class able to propagate seeds through the algorithm?

Reimplemented from casadi::FunctionInternal.

Definition at line 306 of file integrator_impl.hpp.

306 { return true;}

◆ impulseB()

void casadi::FixedStepIntegrator::impulseB ( IntegratorMemory mem,
const double *  adj_x,
const double *  adj_z,
const double *  adj_q 
) const
overridevirtual

Implements casadi::Integrator.

Definition at line 2239 of file integrator.cpp.

2240  {
2241  auto m = static_cast<FixedStepMemory*>(mem);
2242  // Add impulse to backward parameters
2243  casadi_axpy(nrp_, 1., adj_q, m->adj_q);
2244 
2245  // Add impulse to state
2246  casadi_axpy(nrx_, 1., adj_x, m->adj_x);
2247 
2248  // Add impulse to backwards dependent variables
2249  casadi_axpy(nrz_, 1., adj_z, m->rv + nrv_ - nrz_);
2250 }

References casadi::casadi_axpy(), casadi::Integrator::nrp_, nrv_, casadi::Integrator::nrx_, and casadi::Integrator::nrz_.

◆ incache()

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

◆ index_in()

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

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

Definition at line 1121 of file function_internal.hpp.

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

References casadi::str().

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

◆ index_out()

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

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

Definition at line 1133 of file function_internal.hpp.

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

References casadi::str().

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

◆ info()

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

◆ init()

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

Reimplemented from casadi::Integrator.

Reimplemented in casadi::RungeKutta, casadi::Collocation, and casadi::ImplicitFixedStepIntegrator.

Definition at line 1955 of file integrator.cpp.

1955  {
1956  // Call the base class init
1957  Integrator::init(opts);
1958 
1959  // Read options
1960  for (auto&& op : opts) {
1961  if (op.first=="number_of_finite_elements") {
1962  nk_target_ = op.second;
1963  }
1964  }
1965 
1966  // Consistency check
1967  casadi_assert(nk_target_ > 0, "Number of finite elements must be strictly positive");
1968 
1969  // Target interval length
1970  double h_target = (tout_.back() - t0_) / nk_target_;
1971 
1972  // Number of finite elements for each control interval and in total
1973  disc_.reserve(1 + nt());
1974  disc_.push_back(0);
1975  double t_cur = t0_;
1976  for (double t_next : tout_) {
1977  disc_.push_back(disc_.back() + std::ceil((t_next - t_cur) / h_target));
1978  t_cur = t_next;
1979  }
1980 
1981  // Setup discrete time dynamics
1982  setup_step();
1983 
1984  // Get discrete time dimensions
1985  const Function& F = get_function(has_function("step") ? "step" : "implicit_step");
1986  nv1_ = F.nnz_out(STEP_VF);
1987  nrv1_ = nv1_ * nadj_;
1988  nv_ = nv1_ * (1 + nfwd_);
1989  nrv_ = nrv1_ * (1 + nfwd_);
1990 
1991  // Work vectors, forward problem
1992  alloc_w(nv_, true); // v
1993  alloc_w(nv_, true); // v_prev
1994  alloc_w(nq_, true); // q_prev
1995 
1996  // Work vectors, backward problem
1997  alloc_w(nrv_, true); // rv
1998  alloc_w(nuq_, true); // adj_u
1999  alloc_w(nrq_, true); // adj_p_prev
2000  alloc_w(nuq_, true); // adj_u_prev
2001 
2002  // Allocate tape if backward states are present
2003  if (nrx_ > 0) {
2004  alloc_w((disc_.back() + 1) * nx_, true); // x_tape
2005  alloc_w(disc_.back() * nv_, true); // v_tape
2006  }
2007 }
virtual void setup_step()=0
Setup step functions.
void init(const Dict &opts) override
Initialize.
Definition: integrator.cpp:642

References casadi::FunctionInternal::alloc_w(), disc_, casadi::OracleFunction::get_function(), casadi::OracleFunction::has_function(), casadi::Integrator::init(), casadi::Integrator::nadj_, casadi::Integrator::nfwd_, nk_target_, casadi::Function::nnz_out(), casadi::Integrator::nq_, casadi::Integrator::nrq_, nrv1_, nrv_, casadi::Integrator::nrx_, casadi::Integrator::nt(), casadi::Integrator::nuq_, nv1_, nv_, casadi::Integrator::nx_, setup_step(), casadi::STEP_VF, casadi::Integrator::t0_, and casadi::Integrator::tout_.

Referenced by casadi::ImplicitFixedStepIntegrator::init(), and casadi::RungeKutta::init().

◆ init_mem()

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

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

Reimplemented from casadi::Integrator.

Definition at line 2034 of file integrator.cpp.

2034  {
2035  if (Integrator::init_mem(mem)) return 1;
2036  // auto m = static_cast<FixedStepMemory*>(mem);
2037 
2038  return 0;
2039 }
int init_mem(void *mem) const override
Initalize memory block.
Definition: integrator.cpp:912

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.

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

◆ instruction_constant()

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

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

Reimplemented in casadi::SXFunction.

Definition at line 3318 of file function_internal.cpp.

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

References casadi::SharedObjectInternal::class_name().

◆ instruction_id()

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

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

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

Definition at line 3310 of file function_internal.cpp.

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

References casadi::SharedObjectInternal::class_name().

◆ instruction_input()

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

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

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

Definition at line 3314 of file function_internal.cpp.

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

References casadi::SharedObjectInternal::class_name().

◆ instruction_MX()

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

Reimplemented in casadi::MXFunction.

Definition at line 3326 of file function_internal.cpp.

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

References casadi::SharedObjectInternal::class_name().

◆ instruction_output()

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

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

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

Definition at line 3322 of file function_internal.cpp.

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

References casadi::SharedObjectInternal::class_name().

◆ instructions_sx()

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

Reimplemented in casadi::SXFunction.

Definition at line 3330 of file function_internal.cpp.

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

References casadi::SharedObjectInternal::class_name().

◆ is_a()

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

◆ jac_is_symm()

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

Definition at line 1774 of file function_internal.cpp.

1774  {
1775  // If derivative expression
1776  if (!derivative_of_.is_null()) {
1777  std::string n = derivative_of_.name();
1778  // Reverse move
1779  if (name_ == "adj1_" + n) {
1780  if (iind == oind) return true;
1781  }
1782  }
1783  // Not symmetric by default
1784  return false;
1785  }
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 1862 of file function_internal.cpp.

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

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

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

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

◆ jit_dependencies()

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 438 of file oracle_function.cpp.

438  {
439  if (compiler_.is_null()) {
440  if (verbose_) casadi_message("compiling to "+ fname+"'.");
441  // JIT dependent functions
442  compiler_ = Importer(generate_dependencies(fname, Dict()),
444  }
445  // Replace the Oracle functions with generated functions
446  for (auto&& e : all_functions_) {
447  if (verbose_) casadi_message("loading '" + e.second.f.name() + "' from '" + fname + "'.");
448  if (e.second.jit) {
449  e.second.f_original = e.second.f;
450  e.second.f = external(e.second.f.name(), compiler_);
451  }
452  }
453 }
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::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(), and casadi::Integrator::eval().

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

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

◆ load_plugin()

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

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

◆ 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 465 of file oracle_function.cpp.

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

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

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

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

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

◆ map2oracle()

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

Definition at line 2309 of file integrator.cpp.

2310  {
2311  std::vector<XType> de_in(DYN_NUM_IN), de_out(DYN_NUM_OUT);
2312  for (auto&& i : d) {
2313  if (i.first=="t") {
2314  de_in[DYN_T]=i.second;
2315  } else if (i.first=="x") {
2316  de_in[DYN_X]=i.second;
2317  } else if (i.first=="z") {
2318  de_in[DYN_Z]=i.second;
2319  } else if (i.first=="p") {
2320  de_in[DYN_P]=i.second;
2321  } else if (i.first=="u") {
2322  de_in[DYN_U]=i.second;
2323  } else if (i.first=="ode") {
2324  de_out[DYN_ODE]=i.second;
2325  } else if (i.first=="alg") {
2326  de_out[DYN_ALG]=i.second;
2327  } else if (i.first=="quad") {
2328  de_out[DYN_QUAD]=i.second;
2329  } else if (i.first=="zero") {
2330  de_out[DYN_ZERO]=i.second;
2331  } else {
2332  casadi_error("No such field: " + i.first);
2333  }
2334  }
2335 
2336  // Consistency checks, input sparsities
2337  for (casadi_int i = 0; i < DYN_NUM_IN; ++i) {
2338  const Sparsity& sp = de_in[i].sparsity();
2339  if (i == DYN_T) {
2340  casadi_assert(sp.is_empty() || sp.is_scalar(), "DAE time variable must be empty or scalar. "
2341  "Got dimension " + str(sp.size()));
2342  } else {
2343  casadi_assert(sp.is_empty() || sp.is_vector(), "DAE inputs must be empty or vectors. "
2344  + dyn_in(i) + " has dimension " + str(sp.size()) + ".");
2345  }
2346  casadi_assert(sp.is_dense(), "DAE inputs must be dense . "
2347  + dyn_in(i) + " is sparse.");
2348  // Convert row vectors to column vectors
2349  de_in[i] = vec(de_in[i]);
2350  }
2351 
2352  // Consistency checks, output sparsities
2353  for (casadi_int i = 0; i < DYN_NUM_OUT; ++i) {
2354  const Sparsity& sp = de_out[i].sparsity();
2355  casadi_assert(sp.is_empty() || sp.is_vector(), "DAE outputs must be empty or vectors. "
2356  + dyn_out(i) + " has dimension " + str(sp.size()));
2357  // Make sure dense and vector
2358  de_out[i] = vec(densify(de_out[i]));
2359  }
2360 
2361  // Construct
2362  return Function(name, de_in, de_out, dyn_in(), dyn_out());
2363 }

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

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

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

◆ matching_arg()

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

Raises errors

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

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

Definition at line 1722 of file function_internal.hpp.

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

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

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

◆ matching_res()

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

Raises errors

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

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

Definition at line 1732 of file function_internal.hpp.

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

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

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

◆ memory()

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

Definition at line 3574 of file function_internal.cpp.

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

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

◆ merge()

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

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

Reimplemented in casadi::BlazingSplineFunction.

Definition at line 3288 of file function_internal.cpp.

3289  {
3290  return;
3291  }

◆ monitored()

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

Definition at line 548 of file oracle_function.cpp.

548  {
549  auto it = all_functions_.find(name);
550  casadi_assert(it!=all_functions_.end(),
551  "No function \"" + name + "\" in " + name_+ ". " +
552  "Available functions: " + join(get_function()) + ".");
553  return it->second.monitored;
554 }

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

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

References casadi::FunctionInternal::n_in_.

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

◆ mx_in() [2/2]

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

◆ mx_out() [1/2]

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

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

Definition at line 3276 of file function_internal.cpp.

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

References casadi::FunctionInternal::n_out_.

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

◆ mx_out() [2/2]

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

◆ n_instructions()

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

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

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

Definition at line 3306 of file function_internal.cpp.

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

References casadi::SharedObjectInternal::class_name().

◆ n_nodes()

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

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

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

Definition at line 3334 of file function_internal.cpp.

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

References casadi::SharedObjectInternal::class_name().

◆ 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 2545 of file integrator.cpp.

2545  {
2546  // Integrate till the end if no input signals
2547  if (nu_ == 0 || u == 0) return nt() - 1;
2548  // Find the next discontinuity, if any
2549  for (; k + 1 < nt(); ++k) {
2550  // Next control value
2551  const double *u_next = u + nu_;
2552  // Check if there is any change in input from k to k + 1
2553  for (casadi_int i = 0; i < nu_; ++i) {
2554  // Step change detected: stop integration at k
2555  if (u[i] != u_next[i]) return k;
2556  }
2557  // Shift u
2558  u = u_next;
2559  }
2560  // No step changes detected
2561  return k;
2562 }

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 2717 of file integrator.cpp.

2717  {
2718  // Integrate till the beginning if no input signals
2719  if (nu_ == 0 || u == 0) return -1;
2720  // Find the next discontinuity, if any
2721  for (; k-- > 0; ) {
2722  // Next control value
2723  const double *u_next = u - nu_;
2724  // Check if there is any change in input from k to k + 1
2725  for (casadi_int i = 0; i < nu_; ++i) {
2726  // Step change detected: stop integration at k
2727  if (u[i] != u_next[i]) return k;
2728  }
2729  // Shift u
2730  u = u_next;
2731  }
2732  // No step changes detected
2733  return k;
2734 }

References casadi::Integrator::nu_.

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

◆ nnz_in() [1/2]

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

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

Definition at line 2217 of file function_internal.cpp.

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

References casadi::FunctionInternal::n_in_.

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

◆ nnz_in() [2/2]

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

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

Definition at line 969 of file function_internal.hpp.

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

◆ nnz_out() [1/2]

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

◆ nnz_out() [2/2]

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

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

Definition at line 971 of file function_internal.hpp.

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

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

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

References casadi::FunctionInternal::n_in_.

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

◆ numel_in() [2/2]

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

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

Definition at line 979 of file function_internal.hpp.

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

◆ numel_out() [1/2]

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

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

Definition at line 2235 of file function_internal.cpp.

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

References casadi::FunctionInternal::n_out_.

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

◆ numel_out() [2/2]

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

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

Definition at line 980 of file function_internal.hpp.

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

◆ nz_in() [1/2]

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

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

Definition at line 3429 of file function_internal.cpp.

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

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

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

◆ nz_in() [2/2]

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

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

Definition at line 3399 of file function_internal.cpp.

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

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

◆ nz_out() [1/2]

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

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

Definition at line 3447 of file function_internal.cpp.

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

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

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

◆ nz_out() [2/2]

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

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

Definition at line 3414 of file function_internal.cpp.

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

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

◆ oracle()

const Function& casadi::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.

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

◆ plugin_name()

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

◆ plugin_options()

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

Definition at line 79 of file plugin_interface.hpp.

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

◆ pluginFromRegFcn()

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

Definition at line 85 of file plugin_interface.hpp.

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

◆ predict_events()

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

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

Definition at line 2597 of file integrator.cpp.

2597  {
2598  // Event time same as stopping time, by default
2599  double t_event = m->t_stop;
2600  casadi_int event_index = -1;
2601  // Calculate m->e and m->edot
2602  if (calc_edot(m)) return 1;
2603  // Save the values of the zero-crossing functions
2604  casadi_copy(m->e, ne_, m->old_e);
2605  // Find the next event, if any
2606  for (casadi_int i = 0; i < ne_; ++i) {
2607  if (!m->event_triggered[i]) {
2608  // Check if zero crossing function is positive and moving in the negative direction
2609  if (m->e[i] > 0 && m->edot[i] < 0) {
2610  // Projected zero-crossing time
2611  double t = m->t - m->e[i] / m->edot[i];
2612  // Save if earlier than current t_event
2613  if (t < t_event) {
2614  t_event = t;
2615  event_index = i;
2616  }
2617  }
2618  }
2619  }
2620  // Zero crossing projected
2621  if (event_index >= 0) {
2622  // Print progress
2623  if (verbose_) casadi_message("Projected zero crossing for index " + str(event_index)
2624  + " at t = " + str(t_event));
2625  // Update t_stop and t_next accordingly
2626  m->t_stop = t_event;
2627  m->t_next = std::min(m->t_next, t_event);
2628  }
2629  return 0;
2630 }

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

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

References casadi::uout().

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

◆ print_dimensions()

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

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

Definition at line 899 of file function_internal.cpp.

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

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

◆ print_in()

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

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

Definition at line 804 of file function_internal.cpp.

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

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

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

◆ print_option()

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

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

Definition at line 916 of file function_internal.cpp.

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

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

◆ print_options()

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

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

Definition at line 912 of file function_internal.cpp.

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

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

◆ print_out()

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

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

Definition at line 817 of file function_internal.cpp.

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

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

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

◆ print_stats()

virtual void casadi::Integrator::print_stats ( IntegratorMemory mem) const
inlinevirtualinherited

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

Reimplemented in casadi::SundialsInterface.

Definition at line 254 of file integrator_impl.hpp.

254 {}

Referenced by casadi::Integrator::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 3733 of file function_internal.cpp.

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

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

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

◆ project_arg()

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

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

Definition at line 1594 of file function_internal.hpp.

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

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

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

◆ project_res()

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

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

Definition at line 1634 of file function_internal.hpp.

1635  {
1636  return arg;
1637  }

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

◆ purgable()

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

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

Definition at line 1487 of file function_internal.hpp.

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

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

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

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

◆ registerPlugin() [2/2]

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

Definition at line 99 of file plugin_interface.hpp.

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

◆ release()

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

Definition at line 3606 of file function_internal.cpp.

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

◆ replace_arg()

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

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

Definition at line 1767 of file function_internal.hpp.

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

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

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

◆ replace_aseed() [1/2]

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

Definition at line 1791 of file function_internal.hpp.

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

References casadi::FunctionInternal::replace_res().

◆ replace_aseed() [2/2]

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

◆ replace_fseed() [1/2]

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

Definition at line 1783 of file function_internal.hpp.

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

References casadi::FunctionInternal::replace_arg().

◆ replace_fseed() [2/2]

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

◆ replace_res()

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

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

Definition at line 1775 of file function_internal.hpp.

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

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

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

◆ reset()

void casadi::FixedStepIntegrator::reset ( IntegratorMemory mem,
bool  first_call 
) const
overridevirtual

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

Reimplemented from casadi::Integrator.

Reimplemented in casadi::Collocation.

Definition at line 2206 of file integrator.cpp.

2206  {
2207  auto m = static_cast<FixedStepMemory*>(mem);
2208 
2209  // Reset the base classes
2210  Integrator::reset(mem, first_call);
2211 
2212  // Only reset once
2213  if (first_call) {
2214  // Get consistent initial conditions
2215  casadi_fill(m->v, nv_, std::numeric_limits<double>::quiet_NaN());
2216 
2217  // Add the first element in the tape
2218  if (nrx_ > 0) {
2219  casadi_copy(m->x, nx_, m->x_tape);
2220  }
2221  }
2222 }
void casadi_fill(T1 *x, casadi_int n, T1 alpha)
FILL: x <- alpha.

References casadi::casadi_copy(), casadi::casadi_fill(), casadi::Integrator::nrx_, nv_, casadi::Integrator::nx_, and casadi::Integrator::reset().

Referenced by casadi::Collocation::reset().

◆ resetB()

void casadi::FixedStepIntegrator::resetB ( IntegratorMemory mem) const
overridevirtual

Implements casadi::Integrator.

Definition at line 2224 of file integrator.cpp.

2224  {
2225  auto m = static_cast<FixedStepMemory*>(mem);
2226 
2227  // Clear adjoint seeds
2228  casadi_clear(m->adj_q, nrp_);
2229  casadi_clear(m->adj_x, nrx_);
2230 
2231  // Reset summation states
2232  casadi_clear(m->adj_p, nrq_);
2233  casadi_clear(m->adj_u, nuq_);
2234 
2235  // Update backwards dependent variables
2236  casadi_clear(m->rv, nrv_);
2237 }

References casadi::casadi_clear(), casadi::Integrator::nrp_, casadi::Integrator::nrq_, nrv_, casadi::Integrator::nrx_, and casadi::Integrator::nuq_.

◆ retreat()

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

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

Implements casadi::Integrator.

Definition at line 2079 of file integrator.cpp.

2080  {
2081  auto m = static_cast<FixedStepMemory*>(mem);
2082 
2083  // Set controls
2084  casadi_copy(u, nu_, m->u);
2085 
2086  // Number of finite elements and time steps
2087  casadi_int nj = disc_[m->k + 1] - disc_[m->k];
2088  double h = (m->t - m->t_next) / nj;
2089 
2090  // Take steps
2091  for (casadi_int j = nj; j-- > 0; ) {
2092  // Current time
2093  double t = m->t_next + j * h;
2094 
2095  // Update the previous step
2096  casadi_copy(m->adj_x, nrx_, m->tmp1);
2097  casadi_copy(m->adj_p, nrq_, m->adj_p_prev);
2098  casadi_copy(m->adj_u, nuq_, m->adj_u_prev);
2099 
2100  // Take step
2101  casadi_int tapeind = disc_[m->k] + j;
2102  stepB(m, t, h,
2103  m->x_tape + nx_ * tapeind, m->x_tape + nx_ * (tapeind + 1),
2104  m->v_tape + nv_ * tapeind,
2105  m->tmp1, m->rv, m->adj_x, m->adj_p, m->adj_u);
2106  casadi_clear(m->rv, nrv_);
2107  casadi_axpy(nrq_, 1., m->adj_p_prev, m->adj_p);
2108  casadi_axpy(nuq_, 1., m->adj_u_prev, m->adj_u);
2109  }
2110 
2111  // Return to user
2112  casadi_copy(m->adj_x, nrx_, adj_x);
2113  casadi_copy(m->adj_p, nrq_, adj_p);
2114  casadi_copy(m->adj_u, nuq_, adj_u);
2115 }
void stepB(FixedStepMemory *m, double t, double h, const double *x0, const double *xf, const double *vf, const double *adj_xf, const double *rv0, double *adj_x0, double *adj_p, double *adj_u) const
Take integrator step backward.

References casadi::casadi_axpy(), casadi::casadi_clear(), casadi::casadi_copy(), disc_, casadi::Integrator::nrq_, nrv_, casadi::Integrator::nrx_, casadi::Integrator::nu_, casadi::Integrator::nuq_, nv_, casadi::Integrator::nx_, and stepB().

◆ reverse()

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

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

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

Definition at line 2140 of file function_internal.cpp.

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

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

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

◆ reverse_name()

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

Definition at line 657 of file function_internal.hpp.

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

References casadi::str().

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

◆ self()

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

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

Definition at line 348 of file function_internal.hpp.

348 { return shared_from_this<Function>();}

◆ serialize()

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

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

Definition at line 4090 of file function_internal.cpp.

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

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

◆ serialize_base_function()

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::FixedStepIntegrator::serialize_body ( SerializingStream s) const
overridevirtual

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

Reimplemented from casadi::Integrator.

Reimplemented in casadi::RungeKutta, casadi::Collocation, and casadi::ImplicitFixedStepIntegrator.

Definition at line 2480 of file integrator.cpp.

2480  {
2482 
2483  s.version("FixedStepIntegrator", 3);
2484  s.pack("FixedStepIntegrator::nk_target", nk_target_);
2485  s.pack("FixedStepIntegrator::disc", disc_);
2486  s.pack("FixedStepIntegrator::nv", nv_);
2487  s.pack("FixedStepIntegrator::nv1", nv1_);
2488  s.pack("FixedStepIntegrator::nrv", nrv_);
2489  s.pack("FixedStepIntegrator::nrv1", nrv1_);
2490 }
void serialize_body(SerializingStream &s) const override
Serialize an object without type information.

References disc_, nk_target_, nrv1_, nrv_, nv1_, nv_, casadi::SerializingStream::pack(), casadi::Integrator::serialize_body(), and casadi::SerializingStream::version().

Referenced by casadi::ImplicitFixedStepIntegrator::serialize_body(), and casadi::RungeKutta::serialize_body().

◆ 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 2419 of file integrator.cpp.

2419  {
2422 }
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_jac_sparsity()

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

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

Definition at line 3677 of file function_internal.cpp.

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

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

◆ set_p()

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

Definition at line 2525 of file integrator.cpp.

2525  {
2526  casadi_copy(p, np_, m->p);
2527 }
casadi_int np_
Number of forward and backward parameters.

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

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

◆ set_q()

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

Definition at line 2513 of file integrator.cpp.

2513  {
2514  casadi_copy(q, nq_, m->q);
2515 }

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

Referenced by casadi::Integrator::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 505 of file oracle_function.cpp.

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

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 2529 of file integrator.cpp.

2529  {
2530  casadi_copy(u, nu_, m->u);
2531 }

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

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

◆ set_work()

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

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

Reimplemented from casadi::Integrator.

Definition at line 2009 of file integrator.cpp.

2010  {
2011  auto m = static_cast<FixedStepMemory*>(mem);
2012 
2013  // Set work in base classes
2014  Integrator::set_work(mem, arg, res, iw, w);
2015 
2016  // Work vectors, forward problem
2017  m->v = w; w += nv_;
2018  m->v_prev = w; w += nv_;
2019  m->q_prev = w; w += nq_;
2020 
2021  // Work vectors, backward problem
2022  m->rv = w; w += nrv_;
2023  m->adj_u = w; w += nuq_;
2024  m->adj_p_prev = w; w += nrq_;
2025  m->adj_u_prev = w; w += nuq_;
2026 
2027  // Allocate tape if backward states are present
2028  if (nrx_ > 0) {
2029  m->x_tape = w; w += (disc_.back() + 1) * nx_;
2030  m->v_tape = w; w += disc_.back() * nv_;
2031  }
2032 }
void set_work(void *mem, const double **&arg, double **&res, casadi_int *&iw, double *&w) const override
Set the (persistent) work vectors.
Definition: integrator.cpp:882

References disc_, casadi::Integrator::nq_, casadi::Integrator::nrq_, nrv_, casadi::Integrator::nrx_, casadi::Integrator::nuq_, nv_, casadi::Integrator::nx_, and casadi::Integrator::set_work().

◆ set_x()

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

Definition at line 2517 of file integrator.cpp.

2517  {
2518  casadi_copy(x, nx_, m->x);
2519 }

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

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

◆ set_z()

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

Definition at line 2521 of file integrator.cpp.

2521  {
2522  casadi_copy(z, nz_, m->z);
2523 }

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

Referenced by casadi::Integrator::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 3465 of file function_internal.cpp.

3466  {
3467  set_work(mem, arg, res, iw, w);
3468  set_temp(mem, arg, res, iw, w);
3469  auto m = static_cast<FunctionMemory*>(mem);
3470  m->stats_available = true;
3471  }
virtual void set_work(void *mem, const double **&arg, double **&res, casadi_int *&iw, double *&w) const
Set the (persistent) work vectors.
virtual void set_temp(void *mem, const double **arg, double **res, casadi_int *iw, double *w) const
Set the (temporary) work vectors.

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

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

◆ setup_step()

virtual void casadi::FixedStepIntegrator::setup_step ( )
pure virtual

Implemented in casadi::RungeKutta, and casadi::Collocation.

Referenced by init().

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

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

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

◆ signature_unrolled()

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

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

Definition at line 2334 of file function_internal.cpp.

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

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

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

◆ size1_in()

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

◆ size1_out()

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

◆ size2_in()

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

◆ size2_out()

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

◆ size_in()

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

◆ size_out()

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

◆ slice()

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

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

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

Definition at line 3658 of file function_internal.cpp.

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

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

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

◆ sp_forward()

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

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

Reimplemented from casadi::FunctionInternal.

Definition at line 1147 of file integrator.cpp.

1148  {
1149  if (verbose_) casadi_message(name_ + "::sp_forward");
1150 
1151  // Inputs
1152  const bvec_t* x0 = arg[INTEGRATOR_X0];
1153  const bvec_t* p = arg[INTEGRATOR_P];
1154  const bvec_t* u = arg[INTEGRATOR_U];
1155  const bvec_t* adj_xf = arg[INTEGRATOR_ADJ_XF];
1156  const bvec_t* adj_qf = arg[INTEGRATOR_ADJ_QF];
1157  arg += n_in_;
1158 
1159  // Outputs
1160  bvec_t* xf = res[INTEGRATOR_XF];
1161  bvec_t* zf = res[INTEGRATOR_ZF];
1162  bvec_t* qf = res[INTEGRATOR_QF];
1163  bvec_t* adj_x0 = res[INTEGRATOR_ADJ_X0];
1164  bvec_t* adj_p0 = res[INTEGRATOR_ADJ_P];
1165  bvec_t* adj_u = res[INTEGRATOR_ADJ_U];
1166  res += n_out_;
1167 
1168  // Work vectors
1169  bvec_t *x = w; w += nx_;
1170 
1171  bvec_t *adj_x = w; w += nrx_;
1172  bvec_t *adj_z = w; w += nrz_;
1173  bvec_t *adj_p = w; w += nrq_;
1174 
1175  bvec_t *tmp1 = w; w += nx_ + nz_;
1176  bvec_t *tmp2 = w; w += nrx_;
1177 
1178  // Memory struct for function calls below
1179  SpForwardMem m = {arg, res, iw, w};
1180 
1181  // Copy initial guess to x
1182  std::copy_n(x0, nx_, x);
1183 
1184  // Propagate forward
1185  for (casadi_int k = 0; k < nt(); ++k) {
1186  // Propagate through DAE function
1187  if (fdae_sp_forward(&m, x, p, u, tmp1, tmp1 + nx_)) return 1;
1188  for (casadi_int i = 0; i < nx_; ++i) tmp1[i] |= x[i];
1189 
1190  // "Solve" in order to resolve interdependencies (cf. Rootfinder)
1191  std::copy_n(tmp1, nx_ + nx_, w);
1192  std::fill_n(tmp1, nx_ + nz_, 0);
1193  sp_jac_dae_.spsolve(tmp1, w, false);
1194 
1195  // Get xf and zf
1196  if (xf) std::copy_n(tmp1, nx_, xf);
1197  if (zf) std::copy_n(tmp1 + nx_, nz_, zf);
1198 
1199  // Propagate to quadratures
1200  if (nq_ > 0 && qf) {
1201  if (fquad_sp_forward(&m, tmp1, tmp1 + nx_, p, u, qf)) return 1;
1202  }
1203 
1204  // Shift time
1205  std::copy_n(tmp1, nx_, x);
1206  if (xf) xf += nx_;
1207  if (zf) zf += nz_;
1208  if (qf) qf += nq_;
1209  if (u) u += nu_;
1210  }
1211 
1212  if (nrx_ > 0) {
1213  // Clear tmp2, adj_p0
1214  std::fill_n(tmp2, nrx_, 0);
1215  if (adj_p0) std::fill_n(adj_p0, nrq_, 0);
1216 
1217  // Take adj_xf, rp, adj_u past the last grid point
1218  if (adj_xf) adj_xf += nrx_ * nt();
1219  if (adj_qf) adj_qf += nrp_ * nt();
1220  if (adj_u) adj_u += nuq_ * nt();
1221 
1222  // Integrate backward
1223  for (casadi_int k = nt(); k-- > 0; ) {
1224  // Shift time
1225  if (adj_xf) adj_xf -= nrx_;
1226  if (adj_qf) adj_qf -= nrp_;
1227  if (adj_u) adj_u -= nuq_;
1228  if (u) u -= nu_;
1229 
1230  // Add impulse from adj_xf
1231  if (adj_xf) {
1232  for (casadi_int i = 0; i < nrx_; ++i) tmp2[i] |= adj_xf[i];
1233  }
1234 
1235  // Propagate through DAE function
1236  if (bdae_sp_forward(&m, tmp1, tmp1 + nx_, p, u, tmp2, adj_qf, adj_x, adj_z)) return 1;
1237  for (casadi_int i = 0; i < nrx_; ++i) adj_x[i] |= tmp2[i];
1238 
1239  // "Solve" in order to resolve interdependencies (cf. Rootfinder)
1240  std::copy_n(adj_x, nrx_ + nrz_, w);
1241  std::fill_n(adj_x, nrx_ + nrz_, 0);
1242  sp_jac_rdae_.spsolve(adj_x, w, false);
1243 
1244  // Propagate to quadratures
1245  if ((nrq_ > 0 && adj_p0) || (nuq_ > 0 && adj_u)) {
1246  if (bquad_sp_forward(&m, tmp1, tmp1 + nx_, p, u, adj_x, adj_z, adj_qf, adj_p, adj_u))
1247  return 1;
1248  // Sum contributions to adj_p0
1249  if (adj_p0) {
1250  for (casadi_int i = 0; i < nrq_; ++i) adj_p0[i] |= adj_p[i];
1251  }
1252  }
1253 
1254  // Update tmp2
1255  std::copy_n(adj_x, nx_, tmp2);
1256  }
1257 
1258  // Get adj_x0 at initial time
1259  if (adj_x0) std::copy_n(adj_x, nrx_, adj_x0);
1260  }
1261  return 0;
1262 }
Sparsity sp_jac_dae_
Sparsity pattern of the extended Jacobians.
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.
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.
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.
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.
void spsolve(bvec_t *X, bvec_t *B, bool tr) const
Propagate sparsity through a linear solve.
Definition: sparsity.cpp:723

References casadi::Integrator::bdae_sp_forward(), casadi::Integrator::bquad_sp_forward(), casadi::Integrator::fdae_sp_forward(), casadi::Integrator::fquad_sp_forward(), casadi::INTEGRATOR_ADJ_P, casadi::INTEGRATOR_ADJ_QF, casadi::INTEGRATOR_ADJ_U, casadi::INTEGRATOR_ADJ_X0, casadi::INTEGRATOR_ADJ_XF, casadi::INTEGRATOR_P, casadi::INTEGRATOR_QF, casadi::INTEGRATOR_U, casadi::INTEGRATOR_X0, casadi::INTEGRATOR_XF, casadi::INTEGRATOR_ZF, casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::Integrator::nq_, casadi::Integrator::nrp_, casadi::Integrator::nrq_, casadi::Integrator::nrx_, casadi::Integrator::nrz_, casadi::Integrator::nt(), casadi::Integrator::nu_, casadi::Integrator::nuq_, casadi::Integrator::nx_, casadi::Integrator::nz_, casadi::Integrator::sp_jac_dae_, casadi::Integrator::sp_jac_rdae_, casadi::Sparsity::spsolve(), and casadi::ProtoFunction::verbose_.

◆ sp_forward_block()

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

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

Definition at line 2773 of file function_internal.cpp.

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

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

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

◆ sp_jac_aug()

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

Definition at line 1805 of file integrator.cpp.

1805  {
1806  // Row 1, column 2 in the augmented Jacobian
1807  Sparsity J12(J.size1(), nfwd_ * J.size2());
1808  // Row 2, column 1 in the augmented Jacobian
1809  Sparsity J21 = vertcat(std::vector<Sparsity>(nfwd_, J1));
1810  // Row 2, column 2 in the augmented Jacobian
1811  Sparsity J22 = diagcat(std::vector<Sparsity>(nfwd_, J));
1812  // Form block matrix
1813  return blockcat(J, J12, J21, J22);
1814 }

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 1817 of file integrator.cpp.

1817  {
1818  // Get the functions
1819  const Function& F = get_function("daeF");
1820  // Sparsity pattern for nonaugmented system
1821  Sparsity J_xx = F.jac_sparsity(DAE_ODE, DYN_X) + Sparsity::diag(nx1_);
1822  Sparsity J_xz = F.jac_sparsity(DAE_ODE, DYN_Z);
1823  Sparsity J_zx = F.jac_sparsity(DAE_ALG, DYN_X);
1824  Sparsity J_zz = F.jac_sparsity(DAE_ALG, DYN_Z);
1825  // Augment with sensitivity equations
1826  if (nfwd_ > 0) {
1827  const Function& fwd_F = get_function(forward_name("daeF", 1));
1828  J_xx = sp_jac_aug(J_xx, fwd_F.jac_sparsity(DAE_ODE, DYN_X));
1829  J_xz = sp_jac_aug(J_xz, fwd_F.jac_sparsity(DAE_ODE, DYN_Z));
1830  J_zx = sp_jac_aug(J_zx, fwd_F.jac_sparsity(DAE_ALG, DYN_X));
1831  J_zz = sp_jac_aug(J_zz, fwd_F.jac_sparsity(DAE_ALG, DYN_Z));
1832  }
1833  // Assemble the block matrix
1834  return blockcat(J_xx, J_xz, J_zx, J_zz);
1835 }
Sparsity sp_jac_aug(const Sparsity &J, const Sparsity &J1) const
Helper function, get augmented system Jacobian.
static Sparsity diag(casadi_int nrow)
Create diagonal sparsity pattern *.
Definition: sparsity.hpp:190

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 1837 of file integrator.cpp.

1837  {
1838  // Get the functions
1839  const Function& G = get_function("daeB");
1840  // Sparsity pattern for nonaugmented system
1841  Sparsity J_xx = G.jac_sparsity(BDAE_ADJ_X, BDYN_ADJ_ODE) + Sparsity::diag(nrx1_ * nadj_);
1842  Sparsity J_xz = G.jac_sparsity(BDAE_ADJ_X, BDYN_ADJ_ALG);
1843  Sparsity J_zx = G.jac_sparsity(BDAE_ADJ_Z, BDYN_ADJ_ODE);
1844  Sparsity J_zz = G.jac_sparsity(BDAE_ADJ_Z, BDYN_ADJ_ALG);
1845  // Augment with sensitivity equations
1846  if (nfwd_ > 0) {
1847  const Function& fwd_G = get_function(forward_name("daeB", 1));
1848  J_xx = sp_jac_aug(J_xx, fwd_G.jac_sparsity(BDAE_ADJ_X, BDYN_ADJ_ODE));
1849  J_xz = sp_jac_aug(J_xz, fwd_G.jac_sparsity(BDAE_ADJ_X, BDYN_ADJ_ALG));
1850  J_zx = sp_jac_aug(J_zx, fwd_G.jac_sparsity(BDAE_ADJ_Z, BDYN_ADJ_ODE));
1851  J_zz = sp_jac_aug(J_zz, fwd_G.jac_sparsity(BDAE_ADJ_Z, BDYN_ADJ_ALG));
1852  }
1853  // Assemble the block matrix
1854  return blockcat(J_xx, J_xz, J_zx, J_zz);
1855 }

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::Integrator::sp_reverse ( bvec_t **  arg,
bvec_t **  res,
casadi_int *  iw,
bvec_t w,
void *  mem 
) const
overridevirtualinherited

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

Reimplemented from casadi::FunctionInternal.

Definition at line 1412 of file integrator.cpp.

1413  {
1414  if (verbose_) casadi_message(name_ + "::sp_reverse");
1415 
1416  // Inputs
1417  bvec_t* x0 = arg[INTEGRATOR_X0];
1418  bvec_t* p = arg[INTEGRATOR_P];
1419  bvec_t* u = arg[INTEGRATOR_U];
1420  bvec_t* adj_xf = arg[INTEGRATOR_ADJ_XF];
1421  bvec_t* adj_qf = arg[INTEGRATOR_ADJ_QF];
1422  arg += n_in_;
1423 
1424  // Outputs
1425  bvec_t* xf = res[INTEGRATOR_XF];
1426  bvec_t* zf = res[INTEGRATOR_ZF];
1427  bvec_t* qf = res[INTEGRATOR_QF];
1428  bvec_t* adj_x0 = res[INTEGRATOR_ADJ_X0];
1429  bvec_t* adj_p0 = res[INTEGRATOR_ADJ_P];
1430  bvec_t* adj_u = res[INTEGRATOR_ADJ_U];
1431  res += n_out_;
1432 
1433  // Work vectors
1434  bvec_t *x = w; w += nx_;
1435 
1436  bvec_t *adj_x = w; w += nrx_;
1437  bvec_t *adj_z = w; w += nrz_;
1438  bvec_t *adj_p = w; w += nrq_;
1439 
1440  bvec_t *tmp1 = w; w += nx_ + nz_;
1441  bvec_t *tmp2 = w; w += nrx_;
1442 
1443  // Memory struct for function calls below
1444  SpReverseMem m = {arg, res, iw, w};
1445 
1446  // Clear state vector
1447  std::fill_n(tmp1, nx_ + nz_, 0);
1448 
1449  if (nrx_ > 0) {
1450  // Propagate from adj_x0 initial time
1451  if (adj_x0) {
1452  std::copy_n(adj_x0, nrx_, adj_x);
1453  std::fill_n(adj_x0, nrx_, 0);
1454  } else {
1455  std::fill_n(adj_x, nrx_, 0);
1456  }
1457  // Reset adj_z
1458  std::fill_n(adj_z, nrz_, 0);
1459 
1460  // Save adj_p0: See note below
1461  if (adj_p0) std::copy_n(adj_p0, nrq_, adj_p);
1462 
1463  // Step backwards through backward problem
1464  for (casadi_int k = 0; k < nt(); ++k) {
1465  // Restore adj_p0: See note below
1466  if (adj_p0) std::copy_n(adj_p, nrq_, adj_p0);
1467 
1468  // Add impulse from adj_xf
1469  if (adj_xf) {
1470  for (casadi_int i = 0; i < nrx_; ++i) adj_x[i] |= adj_xf[i];
1471  std::fill_n(adj_xf, nrx_, 0);
1472  }
1473 
1474  // Get dependencies from backward quadratures
1475  if ((nrq_ > 0 && adj_p0) || (nuq_ > 0 && adj_u)) {
1476  if (bquad_sp_reverse(&m, tmp1, tmp1 + nx_, p, u, adj_x, adj_z, adj_qf, adj_p0, adj_u))
1477  return 1;
1478  }
1479 
1480  // Propagate interdependencies
1481  std::fill_n(w, nrx_ + nrz_, 0);
1482  sp_jac_rdae_.spsolve(w, adj_x, true);
1483  std::copy_n(w, nrx_ + nrz_, adj_x);
1484 
1485  // Direct dependency tmp2 -> adj_x
1486  std::copy_n(adj_x, nrx_, tmp2);
1487 
1488  // Indirect dependency via g
1489  if (bdae_sp_reverse(&m, tmp1, tmp1 + nx_, p, u, tmp2, adj_qf, adj_x, adj_z)) return 1;
1490 
1491  // Update adj_x, adj_z
1492  std::copy_n(tmp2, nrx_, adj_x);
1493  std::fill_n(adj_z, nrz_, 0);
1494 
1495  // Shift time
1496  if (adj_xf) adj_xf += nrx_;
1497  if (adj_qf) adj_qf += nrp_;
1498  if (adj_u) adj_u += nuq_;
1499  if (u) u += nu_;
1500  }
1501  } else {
1502  // Take u past the last grid point
1503  if (u) u += nu_ * nt();
1504  }
1505 
1506  // Take xf, zf, qf past the last grid point
1507  if (xf) xf += nx_ * nt();
1508  if (zf) zf += nz_ * nt();
1509  if (qf) qf += nq_ * nt();
1510 
1511  // Step backwards through forward problem
1512  for (casadi_int k = nt(); k-- > 0; ) {
1513  // Shift time
1514  if (xf) xf -= nx_;
1515  if (zf) zf -= nz_;
1516  if (qf) qf -= nq_;
1517  if (u) u -= nu_;
1518 
1519  // Add impulse from outputs
1520  if (xf) {
1521  for (casadi_int i = 0; i < nx_; ++i) tmp1[i] |= xf[i];
1522  std::fill_n(xf, nx_, 0);
1523  }
1524  if (zf) {
1525  for (casadi_int i = 0; i < nz_; ++i) tmp1[nx_ + i] |= zf[i];
1526  std::fill_n(zf, nz_, 0);
1527  }
1528 
1529  // Get dependencies from forward quadratures, if any
1530  if (nq_ > 0 && qf) {
1531  if (fquad_sp_reverse(&m, tmp1, tmp1 + nx_, p, u, qf)) return 1;
1532  }
1533 
1534  // Propagate interdependencies
1535  std::fill_n(w, nx_ + nz_, 0);
1536  sp_jac_dae_.spsolve(w, tmp1, true);
1537  std::copy_n(w, nx_ + nz_, tmp1);
1538 
1539  // Direct dependency ode -> x
1540  std::copy_n(tmp1, nx_, x);
1541 
1542  // Indirect dependency through f
1543  if (fdae_sp_reverse(&m, x, p, u, tmp1, tmp1 + nx_)) return 1;
1544 
1545  // Update x, z
1546  std::copy_n(x, nx_, tmp1);
1547  std::fill_n(tmp1 + nx_, nz_, 0);
1548  }
1549 
1550  // Direct dependency x0 -> x
1551  if (x0) {
1552  for (casadi_int i = 0; i < nx_; ++i) x0[i] |= x[i];
1553  }
1554 
1555  return 0;
1556 }
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.
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.
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.
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.

References casadi::Integrator::bdae_sp_reverse(), casadi::Integrator::bquad_sp_reverse(), casadi::Integrator::fdae_sp_reverse(), casadi::Integrator::fquad_sp_reverse(), casadi::INTEGRATOR_ADJ_P, casadi::INTEGRATOR_ADJ_QF, casadi::INTEGRATOR_ADJ_U, casadi::INTEGRATOR_ADJ_X0, casadi::INTEGRATOR_ADJ_XF, casadi::INTEGRATOR_P, casadi::INTEGRATOR_QF, casadi::INTEGRATOR_U, casadi::INTEGRATOR_X0, casadi::INTEGRATOR_XF, casadi::INTEGRATOR_ZF, casadi::FunctionInternal::n_in_, casadi::FunctionInternal::n_out_, casadi::ProtoFunction::name_, casadi::Integrator::nq_, casadi::Integrator::nrp_, casadi::Integrator::nrq_, casadi::Integrator::nrx_, casadi::Integrator::nrz_, casadi::Integrator::nt(), casadi::Integrator::nu_, casadi::Integrator::nuq_, casadi::Integrator::nx_, casadi::Integrator::nz_, casadi::Integrator::sp_jac_dae_, casadi::Integrator::sp_jac_rdae_, casadi::Sparsity::spsolve(), and casadi::ProtoFunction::verbose_.

◆ sp_weight()

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

sparsity propagation

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

Definition at line 3201 of file function_internal.cpp.

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

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

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

◆ sparsity_in()

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

◆ sparsity_out()

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

◆ sprint()

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

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

Definition at line 3801 of file function_internal.cpp.

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

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

◆ stepB()

void casadi::FixedStepIntegrator::stepB ( FixedStepMemory m,
double  t,
double  h,
const double *  x0,
const double *  xf,
const double *  vf,
const double *  adj_xf,
const double *  rv0,
double *  adj_x0,
double *  adj_p,
double *  adj_u 
) const

Definition at line 2150 of file integrator.cpp.

2153  {
2154  // Evaluate nondifferentiated
2155  std::fill(m->arg, m->arg + BSTEP_NUM_IN, nullptr);
2156  m->arg[BSTEP_T] = &t; // t
2157  m->arg[BSTEP_H] = &h; // h
2158  m->arg[BSTEP_X0] = x0; // x0
2159  m->arg[BSTEP_V0] = nullptr; // v0
2160  m->arg[BSTEP_P] = m->p; // p
2161  m->arg[BSTEP_U] = m->u; // u
2162  m->arg[BSTEP_OUT_XF] = xf; // out:xf
2163  m->arg[BSTEP_OUT_VF] = vf; // out:vf
2164  m->arg[BSTEP_OUT_QF] = nullptr; // out:qf
2165  m->arg[BSTEP_ADJ_XF] = adj_xf; // adj:xf
2166  m->arg[BSTEP_ADJ_VF] = rv0; // adj:vf
2167  m->arg[BSTEP_ADJ_QF] = m->adj_q; // adj:qf
2168  std::fill(m->res, m->res + BSTEP_NUM_OUT, nullptr);
2169  m->res[BSTEP_ADJ_T] = nullptr; // adj:t
2170  m->res[BSTEP_ADJ_H] = nullptr; // adj:h
2171  m->res[BSTEP_ADJ_X0] = adj_x0; // adj:x0
2172  m->res[BSTEP_ADJ_V0] = nullptr; // adj:v0
2173  m->res[BSTEP_ADJ_P] = adj_p; // adj:p
2174  m->res[BSTEP_ADJ_U] = adj_u; // adj:u
2175  calc_function(m, reverse_name("step", nadj_));
2176  // Evaluate sensitivities
2177  if (nfwd_ > 0) {
2178  m->arg[BSTEP_NUM_IN + BSTEP_ADJ_T] = nullptr; // out:adj:t
2179  m->arg[BSTEP_NUM_IN + BSTEP_ADJ_H] = nullptr; // out:adj:h
2180  m->arg[BSTEP_NUM_IN + BSTEP_ADJ_X0] = adj_x0; // out:adj:x0
2181  m->arg[BSTEP_NUM_IN + BSTEP_ADJ_V0] = nullptr; // out:adj:v0
2182  m->arg[BSTEP_NUM_IN + BSTEP_ADJ_P] = adj_p; // out:adj:p
2183  m->arg[BSTEP_NUM_IN + BSTEP_ADJ_U] = adj_u; // out:adj:u
2184  m->arg[BSTEP_NUM_IN + BSTEP_NUM_OUT + BSTEP_T] = nullptr; // fwd:t
2185  m->arg[BSTEP_NUM_IN + BSTEP_NUM_OUT + BSTEP_H] = nullptr; // fwd:h
2186  m->arg[BSTEP_NUM_IN + BSTEP_NUM_OUT + BSTEP_X0] = x0 + nx1_; // fwd:x0
2187  m->arg[BSTEP_NUM_IN + BSTEP_NUM_OUT + BSTEP_V0] = nullptr; // fwd:v0
2188  m->arg[BSTEP_NUM_IN + BSTEP_NUM_OUT + BSTEP_P] = m->p + np1_; // fwd:p
2189  m->arg[BSTEP_NUM_IN + BSTEP_NUM_OUT + BSTEP_U] = m->u + nu1_; // fwd:u
2190  m->arg[BSTEP_NUM_IN + BSTEP_NUM_OUT + BSTEP_OUT_XF] = xf + nx1_; // fwd:out:xf
2191  m->arg[BSTEP_NUM_IN + BSTEP_NUM_OUT + BSTEP_OUT_VF] = vf + nv1_; // fwd:out:vf
2192  m->arg[BSTEP_NUM_IN + BSTEP_NUM_OUT + BSTEP_OUT_QF] = nullptr; // fwd:out:qf
2193  m->arg[BSTEP_NUM_IN + BSTEP_NUM_OUT + BSTEP_ADJ_XF] = adj_xf + nrx1_ * nadj_; // fwd:adj:xf
2194  m->arg[BSTEP_NUM_IN + BSTEP_NUM_OUT + BSTEP_ADJ_VF] = rv0 + nrv1_; // fwd:adj:vf
2195  m->arg[BSTEP_NUM_IN + BSTEP_NUM_OUT + BSTEP_ADJ_QF] = m->adj_q + nrp1_ * nadj_; // fwd:adj:qf
2196  m->res[BSTEP_ADJ_T] = nullptr; // fwd:adj:t
2197  m->res[BSTEP_ADJ_H] = nullptr; // fwd:adj:h
2198  m->res[BSTEP_ADJ_X0] = adj_x0 + nrx1_ * nadj_; // fwd:adj_x0
2199  m->res[BSTEP_ADJ_V0] = nullptr; // fwd:adj:v0
2200  m->res[BSTEP_ADJ_P] = adj_p + nrq1_ * nadj_; // fwd:adj_p
2201  m->res[BSTEP_ADJ_U] = adj_u + nuq1_ * nadj_; // fwd:adj_u
2203  }
2204 }

References casadi::IntegratorMemory::adj_q, casadi::OracleMemory::arg, casadi::BSTEP_ADJ_H, casadi::BSTEP_ADJ_P, casadi::BSTEP_ADJ_QF, casadi::BSTEP_ADJ_T, casadi::BSTEP_ADJ_U, casadi::BSTEP_ADJ_V0, casadi::BSTEP_ADJ_VF, casadi::BSTEP_ADJ_X0, casadi::BSTEP_ADJ_XF, casadi::BSTEP_H, casadi::BSTEP_NUM_IN, casadi::BSTEP_NUM_OUT, casadi::BSTEP_OUT_QF, casadi::BSTEP_OUT_VF, casadi::BSTEP_OUT_XF, casadi::BSTEP_P, casadi::BSTEP_T, casadi::BSTEP_U, casadi::BSTEP_V0, casadi::BSTEP_X0, casadi::OracleFunction::calc_function(), casadi::FunctionInternal::forward_name(), casadi::Integrator::nadj_, casadi::Integrator::nfwd_, casadi::Integrator::np1_, casadi::Integrator::nrp1_, casadi::Integrator::nrq1_, nrv1_, casadi::Integrator::nrx1_, casadi::Integrator::nu1_, casadi::Integrator::nuq1_, nv1_, casadi::Integrator::nx1_, casadi::IntegratorMemory::p, casadi::OracleMemory::res, casadi::FunctionInternal::reverse_name(), and casadi::IntegratorMemory::u.

Referenced by retreat().

◆ stepF()

void casadi::FixedStepIntegrator::stepF ( FixedStepMemory m,
double  t,
double  h,
const double *  x0,
const double *  v0,
double *  xf,
double *  vf,
double *  qf 
) const

Definition at line 2117 of file integrator.cpp.

2118  {
2119  // Evaluate nondifferentiated
2120  std::fill(m->arg, m->arg + STEP_NUM_IN, nullptr);
2121  m->arg[STEP_T] = &t; // t
2122  m->arg[STEP_H] = &h; // h
2123  m->arg[STEP_X0] = x0; // x0
2124  m->arg[STEP_V0] = v0; // v0
2125  m->arg[STEP_P] = m->p; // p
2126  m->arg[STEP_U] = m->u; // u
2127  std::fill(m->res, m->res + STEP_NUM_OUT, nullptr);
2128  m->res[STEP_XF] = xf; // xf
2129  m->res[STEP_VF] = vf; // vf
2130  m->res[STEP_QF] = qf; // qf
2131  calc_function(m, "step");
2132  // Evaluate sensitivities
2133  if (nfwd_ > 0) {
2134  m->arg[STEP_NUM_IN + STEP_XF] = xf; // out:xf
2135  m->arg[STEP_NUM_IN + STEP_VF] = vf; // out:vf
2136  m->arg[STEP_NUM_IN + STEP_QF] = qf; // out:qf
2137  m->arg[STEP_NUM_IN + STEP_NUM_OUT + STEP_T] = nullptr; // fwd:t
2138  m->arg[STEP_NUM_IN + STEP_NUM_OUT + STEP_H] = nullptr; // fwd:h
2139  m->arg[STEP_NUM_IN + STEP_NUM_OUT + STEP_X0] = x0 + nx1_; // fwd:x0
2140  m->arg[STEP_NUM_IN + STEP_NUM_OUT + STEP_V0] = v0 + nv1_; // fwd:v0
2141  m->arg[STEP_NUM_IN + STEP_NUM_OUT + STEP_P] = m->p + np1_; // fwd:p
2142  m->arg[STEP_NUM_IN + STEP_NUM_OUT + STEP_U] = m->u + nu1_; // fwd:u
2143  m->res[STEP_XF] = xf + nx1_; // fwd:xf
2144  m->res[STEP_VF] = vf + nv1_; // fwd:vf
2145  m->res[STEP_QF] = qf + nq1_; // fwd:qf
2146  calc_function(m, forward_name("step", nfwd_));
2147  }
2148 }
@ STEP_NUM_IN
Number of arguments.
@ STEP_NUM_OUT
Number of arguments.

References casadi::OracleMemory::arg, casadi::OracleFunction::calc_function(), casadi::FunctionInternal::forward_name(), casadi::Integrator::nfwd_, casadi::Integrator::np1_, casadi::Integrator::nq1_, casadi::Integrator::nu1_, nv1_, casadi::Integrator::nx1_, casadi::IntegratorMemory::p, casadi::OracleMemory::res, casadi::STEP_H, casadi::STEP_NUM_IN, casadi::STEP_NUM_OUT, casadi::STEP_P, casadi::STEP_QF, casadi::STEP_T, casadi::STEP_U, casadi::STEP_V0, casadi::STEP_VF, casadi::STEP_X0, casadi::STEP_XF, and casadi::IntegratorMemory::u.

Referenced by advance_noevent().

◆ string_from_UnifiedReturnStatus()

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

Definition at line 3869 of file function_internal.cpp.

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

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

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

◆ sx_in() [1/2]

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

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

Reimplemented in casadi::SXFunction.

Definition at line 3228 of file function_internal.cpp.

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

References casadi::FunctionInternal::n_in_.

◆ sx_in() [2/2]

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

◆ sx_out() [1/2]

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

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

Definition at line 3236 of file function_internal.cpp.

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

References casadi::FunctionInternal::n_out_.

◆ sx_out() [2/2]

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

◆ symbolic_output()

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

Reimplemented in casadi::MXFunction.

Definition at line 1066 of file function_internal.cpp.

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

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

◆ symbolicAdjSeed()

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

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

Definition at line 1512 of file function_internal.hpp.

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

References casadi::FunctionInternal::is_diff_out_.

◆ sz_arg()

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

◆ sz_iw()

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

◆ sz_res()

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

◆ sz_w()

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

◆ sz_work()

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

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

Definition at line 2821 of file function_internal.cpp.

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

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

◆ to_compact()

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

Definition at line 1837 of file function_internal.cpp.

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

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

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

◆ tocache()

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

◆ tocache_if_missing()

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

◆ 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 2632 of file integrator.cpp.

2632  {
2633  // Throw an error if too many events are happening within a single control interval
2634  if (++m->num_events > max_events_) {
2635  casadi_error("At t = " + str(m->t) + ": Too many event iterations during interval "
2636  + str(m->k));
2637  }
2638  // Consistency checks
2639  if (*ind < 0 || m->event_triggered[*ind]) return 1;
2640  // Mark event as triggered
2641  m->event_triggered[*ind] = 1;
2642  // Print progress
2643  if (verbose_) casadi_message("Zero crossing for index " + str(*ind) + " at t = " + str(m->t));
2644  // The event time will be impacted by perturbations in x, z, u, p.
2645  // the perturbed time will be given by the following implicit function:
2646  // e[ind](t, x + (t - t_event) * xdot, z + (t - t_event) * zdot, u, p) = 0
2647  // The sensitivities of t as a functions of fwd_x, fwd_z, fwd_u and fwd_p
2648  // are given by the implicit function theorem:
2649  // 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
2650  // <=> fwd_t = -fwd_e(fwd_x, fwd_z, fwd_u, fwd_p) / edot
2651  if (nfwd_ > 0) {
2652  m->arg[DYN_NUM_IN + DYN_ODE] = m->xdot; // out:ode
2653  m->arg[DYN_NUM_IN + DYN_ALG] = nullptr; // out:alg
2654  m->arg[DYN_NUM_IN + DYN_QUAD] = nullptr; // out:quad
2655  m->arg[DYN_NUM_IN + DYN_ZERO] = m->e; // out:zero
2656  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_T] = nullptr; // fwd:t
2657  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_X] = m->x + nx1_; // fwd:x
2658  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_Z] = m->z + nz1_; // fwd:z
2659  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_P] = m->p + np1_; // fwd:p
2660  m->arg[DYN_NUM_IN + DYN_NUM_OUT + DYN_U] = m->u + nu1_; // fwd:u
2661  m->res[DYN_ODE] = nullptr; // fwd:ode
2662  m->res[DYN_ALG] = nullptr; // fwd:alg
2663  m->res[DYN_QUAD] = nullptr; // fwd:quad
2664  m->res[DYN_ZERO] = m->tmp1; // fwd:zero
2665  if (calc_function(m, forward_name("dae", nfwd_))) return 1;
2666  // Calculate sensitivity in t
2667  for (casadi_int i = 0; i < nfwd_; ++i) {
2668  m->tmp1[i] = -m->tmp1[*ind + ne_ * i] / m->edot[*ind];
2669  }
2670  // Propagate this sensitivity to the state vector
2671  for (casadi_int i = 0; i < nfwd_; ++i) {
2672  casadi_axpy(nx1_, m->tmp1[i], m->xdot, m->x + nx1_ * (1 + i));
2673  }
2674  }
2675  // Call event transition function, if any
2676  if (has_function("transition")) {
2677  // Evaluate to tmp2
2678  double index = *ind; // function expects floating point values
2679  m->arg[EVENT_INDEX] = &index; // index
2680  m->arg[EVENT_T] = &m->t; // t
2681  m->arg[EVENT_X] = m->x; // x
2682  m->arg[EVENT_Z] = m->z; // z
2683  m->arg[EVENT_P] = m->p; // p
2684  m->arg[EVENT_U] = m->u; // u
2685  m->res[EVENT_POST_X] = m->tmp2; // post_x
2686  m->res[EVENT_POST_Z] = m->tmp2 + nx_; // post_z
2687  if (calc_function(m, "transition")) return 1;
2688  // Propagate forward sensitivities
2689  if (nfwd_ > 0) {
2690  // Propagate sensitivities through event transition
2691  m->arg[EVENT_NUM_IN + EVENT_POST_X] = m->tmp2; // out:post_x
2692  m->arg[EVENT_NUM_IN + EVENT_POST_Z] = m->tmp2 + nx_; // out:post_z
2693  m->arg[EVENT_NUM_IN + EVENT_NUM_OUT + EVENT_INDEX] = nullptr; // fwd:index
2694  m->arg[EVENT_NUM_IN + EVENT_NUM_OUT + EVENT_T] = m->tmp1; // fwd:t
2695  m->arg[EVENT_NUM_IN + EVENT_NUM_OUT + EVENT_X] = m->x + nx1_; // fwd:x
2696  m->arg[EVENT_NUM_IN + EVENT_NUM_OUT + EVENT_Z] = m->z + nz1_; // fwd:z
2697  m->arg[EVENT_NUM_IN + EVENT_NUM_OUT + EVENT_P] = m->p + np1_; // fwd:p
2698  m->arg[EVENT_NUM_IN + EVENT_NUM_OUT + EVENT_U] = m->u + nu1_; // fwd:u
2699  m->res[EVENT_POST_X] = m->tmp2 + nx1_; // fwd:post_x
2700  m->res[EVENT_POST_Z] = m->tmp2 + nx_ + nz1_; // fwd:post_z
2701  calc_function(m, forward_name("transition", nfwd_));
2702  }
2703  }
2704  // Update x, z
2705  casadi_copy(m->tmp2, nx_ + nz_, m->x);
2706  // Calculate m->xdot and m->zdot
2707  if (calc_edot(m)) return 1;
2708  // Propagate this sensitivity to the state vector
2709  for (casadi_int i = 0; i < nfwd_; ++i) {
2710  casadi_axpy(nx1_, -m->tmp1[i], m->xdot, m->x + nx1_ * (1 + i));
2711  }
2712  // TODO(@jaeandersson): Check if other events need to be triggered
2713  *ind = -1; // for now, do not trigger other events
2714  return 0;
2715 }
casadi_int max_events_
Maximum total number of events during the simulation.
@ EVENT_INDEX
Definition: integrator.hpp:208
@ EVENT_NUM_IN
Definition: integrator.hpp:214
@ EVENT_POST_Z
Definition: integrator.hpp:219
@ EVENT_POST_X
Definition: integrator.hpp:218
@ EVENT_NUM_OUT
Definition: integrator.hpp:220

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.

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

◆ which_depends()

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

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

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

Definition at line 3644 of file function_internal.cpp.

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

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

◆ wrap()

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

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

Definition at line 1044 of file function_internal.cpp.

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

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

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

◆ wrap_as_needed()

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

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

Definition at line 1026 of file function_internal.cpp.

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

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

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

Member Data Documentation

◆ 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

◆ 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

◆ 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

◆ der_options_

Dict casadi::FunctionInternal::der_options_
inherited

◆ derivative_of_

Function casadi::FunctionInternal::derivative_of_
inherited

◆ deserialize_map

std::map< std::string, ProtoFunction *(*)(DeserializingStream &)> casadi::FunctionInternal::deserialize_map
staticinherited
Initial value:
= {
{"MXFunction", MXFunction::deserialize},
{"SXFunction", SXFunction::deserialize},
{"Interpolant", Interpolant::deserialize},
{"Switch", Switch::deserialize},
{"Map", Map::deserialize},
{"MapSum", MapSum::deserialize},
{"Nlpsol", Nlpsol::deserialize},
{"Rootfinder", Rootfinder::deserialize},
{"Integrator", Integrator::deserialize},
{"External", External::deserialize},
{"Conic", Conic::deserialize},
{"FmuFunction", FmuFunction::deserialize},
{"BlazingSplineFunction", BlazingSplineFunction::deserialize}
}
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
void deserialize(DeserializingStream &s, SDPToSOCPMem &m)
Definition: conic.cpp:729
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
Definition: external.cpp:512
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize without type information.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
Definition: mapsum.cpp:85
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize with type disambiguation.
Definition: map.cpp:103
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
Definition: nlpsol.cpp:1341
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize into MX.
Definition: rootfinder.cpp:592
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize without type information.
static ProtoFunction * deserialize(DeserializingStream &s)
Deserialize without type information.
Definition: switch.hpp:150

Definition at line 1447 of file function_internal.hpp.

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

◆ disc_

std::vector<casadi_int> casadi::FixedStepIntegrator::disc_

◆ dump_

bool casadi::FunctionInternal::dump_
inherited

◆ dump_count_

casadi_int casadi::FunctionInternal::dump_count_
mutableinherited

Definition at line 1402 of file function_internal.hpp.

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

◆ dump_dir_

std::string casadi::FunctionInternal::dump_dir_
inherited

◆ dump_format_

std::string casadi::FunctionInternal::dump_format_
inherited

◆ dump_in_

bool casadi::FunctionInternal::dump_in_
inherited

◆ dump_out_

bool casadi::FunctionInternal::dump_out_
inherited

◆ enable_fd_

bool casadi::FunctionInternal::enable_fd_
inherited

◆ enable_fd_op_

bool casadi::FunctionInternal::enable_fd_op_
inherited

◆ enable_forward_

bool casadi::FunctionInternal::enable_forward_
inherited

◆ enable_forward_op_

bool casadi::FunctionInternal::enable_forward_op_
inherited

◆ enable_jacobian_

bool casadi::FunctionInternal::enable_jacobian_
inherited

◆ enable_jacobian_op_

bool casadi::FunctionInternal::enable_jacobian_op_
inherited

◆ enable_reverse_

bool casadi::FunctionInternal::enable_reverse_
inherited

◆ enable_reverse_op_

bool casadi::FunctionInternal::enable_reverse_op_
inherited

◆ error_on_fail_

bool casadi::ProtoFunction::error_on_fail_
inherited

◆ eval_

eval_t casadi::FunctionInternal::eval_
inherited

◆ 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

◆ has_refcount_

bool casadi::FunctionInternal::has_refcount_
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_name_

std::string casadi::FunctionInternal::jit_name_
inherited

◆ jit_options_

Dict casadi::FunctionInternal::jit_options_
inherited

◆ jit_serialize_

std::string casadi::FunctionInternal::jit_serialize_
inherited

◆ jit_temp_suffix_

bool casadi::FunctionInternal::jit_temp_suffix_
inherited

◆ max_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_threads_

int casadi::OracleFunction::max_num_threads_
protectedinherited

◆ monitor_

std::vector<std::string> casadi::OracleFunction::monitor_
protectedinherited

◆ n_in_

size_t casadi::FunctionInternal::n_in_
inherited

Definition at line 1261 of file function_internal.hpp.

Referenced by casadi::SXFunction::ad_forward(), casadi::Rootfinder::ad_reverse(), casadi::MXFunction::ad_reverse(), casadi::SXFunction::ad_reverse(), casadi::FunctionInternal::all_scalar(), casadi::KinsolInterface::bjac(), casadi::FunctionInternal::call_forward(), casadi::FunctionInternal::call_gen(), casadi::FunctionInternal::call_reverse(), casadi::SXFunction::call_setup(), casadi::FunctionInternal::check_arg(), casadi::JitFunction::codegen_body(), casadi::Map::codegen_body(), casadi::OmpMap::codegen_body(), casadi::MapSum::codegen_body(), casadi::MXFunction::codegen_body(), casadi::Switch::codegen_body(), casadi::SXFunction::codegen_body(), casadi::FastNewton::codegen_body(), casadi::FunctionInternal::codegen_meta(), casadi::FunctionInternal::convert_arg(), casadi::FunctionInternal::definition(), casadi::KinsolInterface::djac(), casadi::FunctionInternal::dm_in(), casadi::FunctionInternal::eval(), casadi::OmpMap::eval(), casadi::MXFunction::eval(), casadi::Switch::eval(), casadi::FunctionInternal::eval_gen(), casadi::Map::eval_gen(), casadi::MapSum::eval_gen(), casadi::MXFunction::eval_mx(), casadi::SXFunction::eval_mx(), casadi::Switch::eval_sx(), casadi::SXFunction::export_code_body(), casadi::CallbackInternal::finalize(), casadi::FmuFunction::FmuFunction(), casadi::FunctionInternal::forward(), casadi::KinsolInterface::func(), casadi::FunctionInternal::FunctionInternal(), casadi::FunctionInternal::fwd_seed(), casadi::FunctionInternal::generate_in(), casadi::GenericExternal::get_jac_sparsity(), casadi::GenericExternal::has_jac_sparsity(), casadi::FunctionInternal::init(), casadi::MXFunction::init(), casadi::Switch::init(), casadi::SXFunction::init(), casadi::ImplicitToNlp::init(), casadi::FunctionInternal::jac_sparsity(), casadi::FunctionInternal::jacobian(), casadi::KinsolInterface::jtimes(), casadi::FunctionInternal::mapsum_mx(), casadi::FunctionInternal::matching_arg(), casadi::FunctionInternal::mx_in(), casadi::FunctionInternal::nnz_in(), casadi::FunctionInternal::numel_in(), casadi::FunctionInternal::nz_in(), casadi::FunctionInternal::print_dimensions(), casadi::FunctionInternal::print_in(), casadi::FunctionInternal::project_arg(), casadi::KinsolInterface::psetup(), casadi::FunctionInternal::reverse(), casadi::FmuFunction::serialize_body(), casadi::FunctionInternal::set_jac_sparsity(), casadi::Rootfinder::set_work(), casadi::QpToNlp::solve(), casadi::KinsolInterface::solve(), casadi::FastNewton::solve(), casadi::ImplicitToNlp::solve(), casadi::Newton::solve(), casadi::FunctionInternal::sp_forward(), casadi::Integrator::sp_forward(), casadi::MXFunction::sp_forward(), casadi::Rootfinder::sp_forward(), casadi::FunctionInternal::sp_reverse(), casadi::Integrator::sp_reverse(), casadi::Map::sp_reverse(), casadi::MapSum::sp_reverse(), casadi::MXFunction::sp_reverse(), casadi::Rootfinder::sp_reverse(), and casadi::FunctionInternal::sx_in().

◆ n_out_

size_t casadi::FunctionInternal::n_out_
inherited

Definition at line 1261 of file function_internal.hpp.

Referenced by casadi::Rootfinder::ad_forward(), casadi::MXFunction::ad_forward(), casadi::SXFunction::ad_forward(), casadi::Rootfinder::ad_reverse(), casadi::SXFunction::ad_reverse(), casadi::FunctionInternal::all_scalar(), casadi::KinsolInterface::bjac(), casadi::FunctionInternal::call(), casadi::FunctionInternal::call_forward(), casadi::FunctionInternal::call_gen(), casadi::FunctionInternal::call_reverse(), casadi::SXFunction::call_setup(), casadi::FunctionInternal::check_res(), casadi::JitFunction::codegen_body(), casadi::Map::codegen_body(), casadi::OmpMap::codegen_body(), casadi::MapSum::codegen_body(), casadi::MXFunction::codegen_body(), casadi::Switch::codegen_body(), casadi::SXFunction::codegen_body(), casadi::FastNewton::codegen_body(), casadi::FunctionInternal::codegen_meta(), casadi::FunctionInternal::convert_res(), casadi::FunctionInternal::definition(), casadi::KinsolInterface::djac(), casadi::FunctionInternal::dm_out(), casadi::FunctionInternal::eval(), casadi::OmpMap::eval(), casadi::MXFunction::eval(), casadi::Switch::eval(), casadi::FunctionInternal::eval_gen(), casadi::Map::eval_gen(), casadi::MapSum::eval_gen(), casadi::Switch::eval_sx(), casadi::CallbackInternal::finalize(), casadi::FmuFunction::FmuFunction(), casadi::FunctionInternal::forward(), casadi::KinsolInterface::func(), casadi::FunctionInternal::FunctionInternal(), casadi::FunctionInternal::generate_out(), casadi::LinearInterpolantJac::get_jacobian(), casadi::FunctionInternal::init(), casadi::MapSum::init(), casadi::Nlpsol::init(), casadi::Switch::init(), casadi::FunctionInternal::jac_sparsity(), casadi::FunctionInternal::jacobian(), casadi::FunctionInternal::mapsum_mx(), casadi::FunctionInternal::matching_res(), casadi::FunctionInternal::mx_out(), casadi::FunctionInternal::nnz_out(), casadi::FunctionInternal::numel_out(), casadi::FunctionInternal::nz_out(), casadi::FunctionInternal::print_dimensions(), casadi::FunctionInternal::print_out(), casadi::KinsolInterface::psetup(), casadi::FunctionInternal::reverse(), casadi::FmuFunction::serialize_body(), casadi::FunctionInternal::set_jac_sparsity(), casadi::Rootfinder::set_work(), casadi::QpToNlp::solve(), casadi::KinsolInterface::solve(), casadi::FastNewton::solve(), casadi::ImplicitToNlp::solve(), casadi::Newton::solve(), casadi::FunctionInternal::sp_forward(), casadi::Integrator::sp_forward(), casadi::MXFunction::sp_forward(), casadi::Rootfinder::sp_forward(), casadi::FunctionInternal::sp_reverse(), casadi::Integrator::sp_reverse(), casadi::Map::sp_reverse(), casadi::MapSum::sp_reverse(), casadi::MXFunction::sp_reverse(), casadi::Rootfinder::sp_reverse(), and casadi::FunctionInternal::sx_out().

◆ nadj_

casadi_int casadi::Integrator::nadj_
inherited

◆ name_

std::string casadi::ProtoFunction::name_
inherited

Definition at line 246 of file function_internal.hpp.

Referenced by casadi::MXFunction::ad_forward(), casadi::SXFunction::ad_forward(), casadi::MXFunction::ad_reverse(), casadi::SXFunction::ad_reverse(), casadi::Integrator::augmented_dae(), casadi::OracleFunction::calc_function(), casadi::FunctionInternal::call_forward(), casadi::FunctionInternal::call_reverse(), casadi::FunctionInternal::codegen_body(), casadi::External::codegen_body(), casadi::External::codegen_checkout(), casadi::External::codegen_declarations(), casadi::MXFunction::codegen_declarations(), casadi::SXFunction::codegen_declarations(), casadi::External::codegen_decref(), casadi::External::codegen_incref(), casadi::FunctionInternal::codegen_meta(), casadi::FunctionInternal::codegen_name(), casadi::External::codegen_release(), casadi::FunctionInternal::codegen_sparsities(), casadi::ProtoFunction::construct(), casadi::OracleFunction::create_function(), casadi::FunctionInternal::definition(), casadi::FunctionInternal::eval(), casadi::MXFunction::eval(), casadi::SXFunction::eval(), casadi::FunctionInternal::eval_mx(), casadi::MXFunction::eval_mx(), casadi::SXFunction::eval_mx(), casadi::SXFunction::eval_sx(), casadi::FmuFunction::factory(), casadi::FunctionInternal::finalize(), casadi::FunctionInternal::forward(), casadi::FunctionInternal::FunctionInternal(), casadi::Integrator::get_forward(), casadi::Integrator::get_forward_dae(), casadi::Map::get_function(), casadi::MapSum::get_function(), casadi::OracleFunction::get_function(), casadi::GenericExternal::get_jac_sparsity(), casadi::BlazingSplineFunction::get_jacobian(), casadi::FunctionInternal::get_n_in(), casadi::External::get_n_in(), casadi::FunctionInternal::get_n_out(), casadi::External::get_n_out(), casadi::FunctionInternal::get_name_in(), casadi::External::get_name_in(), casadi::FunctionInternal::get_name_out(), casadi::External::get_name_out(), casadi::FunctionInternal::get_partition(), casadi::Integrator::get_reverse(), casadi::FunctionInternal::get_sparsity_in(), casadi::GenericExternal::get_sparsity_in(), casadi::FunctionInternal::get_sparsity_out(), casadi::GenericExternal::get_sparsity_out(), casadi::FunctionInternal::get_stats(), casadi::External::has_forward(), casadi::GenericExternal::has_jac_sparsity(), casadi::External::has_jacobian(), casadi::External::has_reverse(), casadi::External::init(), casadi::FunctionInternal::init(), casadi::MXFunction::init(), casadi::SXFunction::init(), casadi::CvodesInterface::init(), casadi::IdasInterface::init(), casadi::External::init_external(), casadi::GenericExternal::init_external(), casadi::FunctionInternal::jac_is_symm(), casadi::FunctionInternal::jacobian(), casadi::FunctionInternal::map(), casadi::OracleFunction::monitored(), casadi::MXFunction::print_arg(), casadi::FunctionInternal::print_in(), casadi::FunctionInternal::print_out(), casadi::MXFunction::print_res(), casadi::ProtoFunction::print_time(), casadi::ProtoFunction::ProtoFunction(), casadi::CvodesInterface::reset(), casadi::IdasInterface::reset(), casadi::IdasInterface::resetB(), casadi::FunctionInternal::reverse(), casadi::ProtoFunction::serialize_body(), casadi::GurobiInterface::solve(), casadi::SnoptInterface::solve(), casadi::Integrator::sp_forward(), casadi::Integrator::sp_reverse(), casadi::FunctionInternal::wrap(), and casadi::FunctionInternal::wrap_as_needed().

◆ name_in_

std::vector<std::string> casadi::FunctionInternal::name_in_
inherited

◆ name_out_

std::vector<std::string> casadi::FunctionInternal::name_out_
inherited

◆ ne_

casadi_int casadi::Integrator::ne_
inherited

◆ never_inline_

bool casadi::FunctionInternal::never_inline_
inherited

◆ nfwd_

casadi_int casadi::Integrator::nfwd_
inherited

◆ nk_target_

casadi_int casadi::FixedStepIntegrator::nk_target_

Definition at line 648 of file integrator_impl.hpp.

Referenced by FixedStepIntegrator(), init(), and serialize_body().

◆ 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

◆ 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

◆ nrv1_

casadi_int casadi::FixedStepIntegrator::nrv1_

Definition at line 654 of file integrator_impl.hpp.

Referenced by FixedStepIntegrator(), init(), serialize_body(), and stepB().

◆ nrv_

casadi_int casadi::FixedStepIntegrator::nrv_

◆ 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

◆ nv1_

casadi_int casadi::FixedStepIntegrator::nv1_

Definition at line 654 of file integrator_impl.hpp.

Referenced by FixedStepIntegrator(), init(), serialize_body(), stepB(), and stepF().

◆ nv_

casadi_int casadi::FixedStepIntegrator::nv_

◆ nx1_

casadi_int casadi::Integrator::nx1_
inherited

◆ nx_

casadi_int casadi::Integrator::nx_
inherited

◆ nz1_

casadi_int casadi::Integrator::nz1_
inherited

◆ nz_

casadi_int casadi::Integrator::nz_
inherited

◆ options_

const Options casadi::FixedStepIntegrator::options_
static
Initial value:
{{"number_of_finite_elements",
"Target number of finite elements. "
"The actual number may be higher to accommodate all output times"}},
{"simplify",
"Implement as MX Function (codegeneratable/serializable) default: false"}},
{"simplify_options",
"Any options to pass to simplified form Function constructor"}}
}
}
static const Options options_
Options.

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

Definition at line 580 of file integrator_impl.hpp.

Referenced by casadi::casadi_register_integrator_rk().

◆ opts_

Dict casadi::Integrator::opts_
inherited

◆ oracle_

Function casadi::OracleFunction::oracle_
protectedinherited

◆ post_expand_

bool casadi::OracleFunction::post_expand_
protectedinherited

◆ 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

◆ rdae_

Function casadi::Integrator::rdae_
inherited

◆ record_time_

bool casadi::ProtoFunction::record_time_
inherited

◆ regularity_check_

bool casadi::ProtoFunction::regularity_check_
inherited

◆ release_

casadi_release_t casadi::FunctionInternal::release_
inherited

◆ reverse_options_

Dict casadi::FunctionInternal::reverse_options_
inherited

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

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

Referenced by casadi::MXFunction::ad_forward(), casadi::SXFunction::ad_forward(), casadi::MXFunction::ad_reverse(), casadi::SXFunction::ad_reverse(), casadi::Integrator::advance(), casadi::ProtoFunction::change_option(), casadi::BSplineInterpolant::construct_graph(), casadi::OracleFunction::create_function(), casadi::FmuFunction::eval(), casadi::Integrator::eval(), casadi::MXFunction::eval(), casadi::SXFunction::eval(), casadi::MXFunction::eval_mx(), casadi::SXFunction::eval_mx(), casadi::SXFunction::eval_sx(), casadi::FmuFunction::factory(), casadi::FunctionInternal::finalize(), casadi::KinsolInterface::func(), casadi::ProtoFunction::generate_options(), casadi::FmuFunction::get_forward(), casadi::Integrator::get_forward(), casadi::Integrator::get_forward_dae(), casadi::FunctionInternal::get_jac_sparsity_gen(), casadi::FunctionInternal::get_jac_sparsity_hierarchical(), casadi::FunctionInternal::get_jac_sparsity_hierarchical_symm(), casadi::FmuFunction::get_jacobian(), casadi::FunctionInternal::get_partition(), casadi::FmuFunction::get_reverse(), casadi::Integrator::get_reverse(), casadi::ProtoFunction::init(), casadi::FiniteDiff::init(), casadi::FmuFunction::init(), casadi::FunctionInternal::init(), casadi::MXFunction::init(), casadi::SXFunction::init(), casadi::Blocksqp::init(), casadi::FatropConicInterface::init(), casadi::FatropInterface::init(), casadi::HpipmInterface::init(), casadi::HpmpcInterface::init(), casadi::IpoptInterface::init(), casadi::MadnlpInterface::init(), casadi::CvodesInterface::init(), casadi::IdasInterface::init(), casadi::Feasiblesqpmethod::init(), casadi::Scpgen::init(), casadi::Sqpmethod::init(), casadi::IpoptInterface::init_mem(), casadi::IdasInterface::init_mem(), casadi::SXFunction::instructions_sx(), casadi::BonminInterface::intermediate_callback(), casadi::OracleFunction::jit_dependencies(), casadi::CsparseInterface::nfact(), casadi::LapackLu::nfact(), casadi::LapackQr::nfact(), casadi::LinsolQr::nfact(), casadi::Integrator::predict_events(), casadi::ProtoFunction::ProtoFunction(), casadi::CvodesInterface::reset(), casadi::IdasInterface::reset(), casadi::IdasInterface::resetB(), casadi::ProtoFunction::serialize_body(), casadi::CbcInterface::solve(), casadi::ClpInterface::solve(), casadi::CplexInterface::solve(), casadi::GurobiInterface::solve(), casadi::HpipmInterface::solve(), casadi::QpoasesInterface::solve(), casadi::Ipqp::solve(), casadi::Qrqp::solve(), casadi::AlpaqaInterface::solve(), casadi::AmplInterface::solve(), casadi::SnoptInterface::solve(), casadi::KinsolInterface::solve(), casadi::WorhpInterface::solve(), casadi::Newton::solve(), casadi::Qrsqp::solve(), casadi::Scpgen::solve(), casadi::Sqpmethod::solve(), casadi::Sqpmethod::solve_ela_QP(), casadi::Feasiblesqpmethod::solve_LP(), casadi::Feasiblesqpmethod::solve_QP(), casadi::Qrsqp::solve_QP(), casadi::Sqpmethod::solve_QP(), casadi::Integrator::sp_forward(), casadi::Integrator::sp_reverse(), and casadi::Integrator::trigger_event().


The documentation for this class was generated from the following files: