Releases: casadi/casadi
3.6.7
Install
Grab a binary from the table:
Windows | Linux | Mac classic (High Sierra or above) | Mac M1 | |
---|---|---|---|---|
Matlab | R2018b or later | R2018b or later | R2018b or later | R2023b or later (Apple Silicon) R2018b or later (Rosetta) |
Octave | 6.2.0 or later | 6.2.0 or later | 6.2.0 or later | 6.2.0 or later |
Python | pip install casadi (needs pip -V >=8.1) |
For Matlab/Octave, unzip in your home directory and adapt the path:
addpath('<yourpath>/casadi-3.6.7-windows64-matlab2018b')
Check your installation:
Matlab/Octave | Python |
---|---|
|
|
Get started with the example pack. Onboarding pointers have been gathered by the community at our wiki.
Troubleshooting
- KNITRO on linux crashes with a segmentation fault without
LD_PRELOAD=<knitro_lin_path>/libiomp5.so
. - Callbacks with one argument are broken in Matlab CasADi
Release notes
Symbolic expressions
- Added SX/MX/DM operations #1595:
hypot(x,y) = sqrt(x*x+y*y)
log1p(x) = log(1+x)
expm1(x) = exp(x-1)
- Added operation
remainder
with the semantics of the C operation - breaking AD rule of
fmin/
fmax` is now symmetric:
jacobian(fmin(x,y),vertcat(x,y))
used to be [1 0] for x==y. Now yields [0.5 0.5]. - Added AD rules for
mmin
/mmax
- Added
logsumexp
which behaves likelog(sum(exp(x)))
but is numerically more accurate (and no overflow issues). - breaking
vertcat
/vcat
,horzcat
/hcat
, etc now return aDM
type instead of aSparsity
type #2549 - breaking CasADi-Matlab
mod
has been renamed torem
, because its numerical behaviour is like the builtin-Matlabrem
. The builtin-Matlabmod
has no CasADi counterpart. CasADi-Pythonmod
has been removed, because its numerical behaviour is not likenumpy.mod
. #2767.numpy.mod
has no counterpart in CasADi; onlyfmod
is equivalent. - DAE index reduction support (Pantelides structural algorithm) See https://github.com/casadi/casadi/blob/3.6.0/docs/examples/python/dae_reduced_index.py
- Fixed flaw in codegen with MX if_else
Common subexpression elimination
- Added Common Subexpression Elimination #1540 for MX and SX.
CasADi can now efficiently eliminate redundant computation by inspecting an expression graph and removing redundant nodes.
Before, CasADi internals would avoid introducing redundant nodes during operations on a given expression, but the user was responsible to avoid duplication when constructing that expression.
There is a function cse()
that you may apply to expressions:
x = MX.sym('x')
# User responsibility
sx = sin(x)
y = sqrt(sx)+sx # MX(@1=sin(x), (sqrt(@1)+@1))
# cse
y = sqrt(sin(x))+sin(x) # MX((sqrt(sin(x))+sin(x)))
y = cse(y) # MX(@1=sin(x), (sqrt(@1)+@1))
There is a boolean option cse
that may be used when constructing a Function
:
x = MX.sym('x')
f = Function('f',[x],[sqrt(sin(x))+sin(x)],{"cse":True})
f.disp(True)
f:(i0)->(o0) MXFunction
Algorithm:
@0 = input[0][0]
@0 = sin(@0)
@1 = sqrt(@0)
@1 = (@1+@0)
output[0][0] = @1
The technique scales favorably for large graphs.
Triangular solve triangular solve nodes in MX
MX how has atomic support for solving upper and lower triangular linear systems without allocating any linear solver instance. The operation handles the case with unity diagonal separately for efficiency and supports C code generation. To use the feature, call casadi.solve(A, b)
(Python or MATLAB/Octave)
# Python
import casadi
A = casadi.MX.sym('A', casadi.Sparsity.upper(2))
b = casadi.MX.sym('b', 2)
x = casadi.solve(A, b)
// C++
casadi::MX A = casadi::MX::sym("A", casadi::Sparsity::upper(2));
casadi::MX b = casadi::MX::sym("b", 2);
casadi::MX x = solve(A, b); // for argument-dependent lookup, alternatively casadi::MX::solve(A, b) for static function
Cf. #2688.
Function
- breaking
SX
/MX
Function
construction with free variables (i.e. symbols used in the output expressions that are not declared as inputs) now fails immediately unless theallow_free
option is used. - breaking
SX
/MX
Function
construction now fails if there are duplicates in input names or output names, unless theallow_duplicate_io_names
option is used #2604. - breaking Serialization: files saved with CasADi 3.5.5 will load in CasADi 3.6.0 (unittested), except for Functions that include a 'mumps' linear solver since serialization of this solver was deficient, and except for Functions that include an Integrator.
- breaking
custom_jacobian
semantics changed. The Function must now return individual blocks (Jacobian of an output w.r.t. to an input) - breaking Changed API part for Jacobian sparsity (relevant for advanced use through
external
orCallback
)
bool has_jac_sparsity(casadi_int oind, casadi_int iind) const override;
Sparsity get_jac_sparsity(casadi_int oind, casadi_int iind, bool symmetric) const override;
Function.find_function
Can be used to retrieve Functions in a hierarchy.- Avoid truncation in printing #2452
- breaking: Function outputs that are not used (passed a null pointer internally) will be logged (
dump_in
option ) asnan
instead of earlier0
. E.g. Ipoptnlp_grad_f
has two outputs,f
andgrad_f_x
. Thef
output is not used internally, so will be logged asnan
.
Code-generation
Function
objects with anexternal
call can now be codegenerated.mmin
/mmax
now support codegeneration
Solvers/plugins
nlpsol
/Opti.solver
can now take an option 'detect_simple_bounds' (defaultFalse
) that will promote general constraints to simple bounds (lbx/ubx).- Added SPRAL linear solver for Ipopt
- Added QP solvers HPIPM, Proxqp, Highs
- CPLEX interface will dynamically load
libcplex<CPLEX_VERSION>
, where CPLEX_VERSION is read from environmental variables. Same strategy forGurobi
. - SqpMethod Eigen-reflect/eigen-clip incorrect #2896
Generalized integrator support
The Integrator
class, which solves initial-value problems in ODEs and DAEs has been thoroughly refactored. Changes include:
- The integrator class now has a much more mature support for returning the IVP solution at multiple time points. It can now be obtained by providing a time grid to the
integrator
constructor. Unlike before, this support should now work in combination with forward/adjoint sensitivity analysis (to any order) and sparsity pattern calculations. Cf. #2823. - The integrator class now includes support for a piecewise constant control (
u
). The interface will keep track of changes tou
and avoid integrating past such changes; for the Sundials (CVODES/IDAS) interfaces by setting a "stop time", for fixed step integrators by aligning the integration points with the grid points. Cf. #3025. Development versions of CasADi included support for this in a dedicated class, calledSimulator
, but this class has now been removed (breaking) and the functionality has been ported to theIntegrator
class.
If you had code looking likecs.integrator('sim_function', 'cvodes', dae, tgrid, opts)
, you may replace it bycs.integrator('sim_function', 'cvodes', dae, 0, tgrid[1:], opts)
. - The Integrator class now much better exploits the problem structure in the sensitivity calculations, especially adjoint (and forward-over-adjoint, adjoint-over-adjoint) sensitivity calculations. Cf. #2823, #3047. The sensitivity analysis relies to a much less extent on symbolic reformulations and instead uses calls to the
Function
class for derivat...
nightly-oct_compat3
Post 3.6.7
nightly-release-3.6.7
automated commit by docs target [skip ci]
nightly-se2
automated commit by docs target [skip ci]
nightly-oct_compat2
Issue #3831: relocatability fix for homebrew
nightly-graph_substitute
Issue #3831: relocatability fix for homebrew
nightly-se
issue #3807: return values of fatrop
3.6.6
Install
Grab a binary from the table:
Windows | Linux | Mac classic (High Sierra or above) | Mac M1 | |
---|---|---|---|---|
Matlab | R2018b or later | R2018b or later | R2018b or later | R2020b or later (normal Matlab) R2018b or later (Open Beta/M1) |
Octave | 6.2.0 or later | 6.2.0 or later | 6.2.0 or later | 6.2.0 or later |
Python | pip install casadi (needs pip -V >=8.1) |
For Matlab/Octave, unzip in your home directory and adapt the path:
addpath('<yourpath>/casadi-3.6.6-windows64-matlab2018b')
Check your installation:
Matlab/Octave | Python |
---|---|
|
|
Get started with the example pack. Onboarding pointers have been gathered by the community at our wiki.
Troubleshooting
- KNITRO on linux crashes with a segmentation fault without
LD_PRELOAD=<knitro_lin_path>/libiomp5.so
. - Callbacks with one argument are broken in Matlab CasADi
Release notes
Symbolic expressions
- Added SX/MX/DM operations #1595:
hypot(x,y) = sqrt(x*x+y*y)
log1p(x) = log(1+x)
expm1(x) = exp(x-1)
- Added operation
remainder
with the semantics of the C operation - breaking AD rule of
fmin/
fmax` is now symmetric:
jacobian(fmin(x,y),vertcat(x,y))
used to be [1 0] for x==y. Now yields [0.5 0.5]. - Added AD rules for
mmin
/mmax
- Added
logsumexp
which behaves likelog(sum(exp(x)))
but is numerically more accurate (and no overflow issues). - breaking
vertcat
/vcat
,horzcat
/hcat
, etc now return aDM
type instead of aSparsity
type #2549 - breaking CasADi-Matlab
mod
has been renamed torem
, because its numerical behaviour is like the builtin-Matlabrem
. The builtin-Matlabmod
has no CasADi counterpart. CasADi-Pythonmod
has been removed, because its numerical behaviour is not likenumpy.mod
. #2767.numpy.mod
has no counterpart in CasADi; onlyfmod
is equivalent. - DAE index reduction support (Pantelides structural algorithm) See https://github.com/casadi/casadi/blob/3.6.0/docs/examples/python/dae_reduced_index.py
- Fixed flaw in codegen with MX if_else
Common subexpression elimination
- Added Common Subexpression Elimination #1540 for MX and SX.
CasADi can now efficiently eliminate redundant computation by inspecting an expression graph and removing redundant nodes.
Before, CasADi internals would avoid introducing redundant nodes during operations on a given expression, but the user was responsible to avoid duplication when constructing that expression.
There is a function cse()
that you may apply to expressions:
x = MX.sym('x')
# User responsibility
sx = sin(x)
y = sqrt(sx)+sx # MX(@1=sin(x), (sqrt(@1)+@1))
# cse
y = sqrt(sin(x))+sin(x) # MX((sqrt(sin(x))+sin(x)))
y = cse(y) # MX(@1=sin(x), (sqrt(@1)+@1))
There is a boolean option cse
that may be used when constructing a Function
:
x = MX.sym('x')
f = Function('f',[x],[sqrt(sin(x))+sin(x)],{"cse":True})
f.disp(True)
f:(i0)->(o0) MXFunction
Algorithm:
@0 = input[0][0]
@0 = sin(@0)
@1 = sqrt(@0)
@1 = (@1+@0)
output[0][0] = @1
The technique scales favorably for large graphs.
Triangular solve triangular solve nodes in MX
MX how has atomic support for solving upper and lower triangular linear systems without allocating any linear solver instance. The operation handles the case with unity diagonal separately for efficiency and supports C code generation. To use the feature, call casadi.solve(A, b)
(Python or MATLAB/Octave)
# Python
import casadi
A = casadi.MX.sym('A', casadi.Sparsity.upper(2))
b = casadi.MX.sym('b', 2)
x = casadi.solve(A, b)
// C++
casadi::MX A = casadi::MX::sym("A", casadi::Sparsity::upper(2));
casadi::MX b = casadi::MX::sym("b", 2);
casadi::MX x = solve(A, b); // for argument-dependent lookup, alternatively casadi::MX::solve(A, b) for static function
Cf. #2688.
Function
- breaking
SX
/MX
Function
construction with free variables (i.e. symbols used in the output expressions that are not declared as inputs) now fails immediately unless theallow_free
option is used. - breaking
SX
/MX
Function
construction now fails if there are duplicates in input names or output names, unless theallow_duplicate_io_names
option is used #2604. - breaking Serialization: files saved with CasADi 3.5.5 will load in CasADi 3.6.0 (unittested), except for Functions that include a 'mumps' linear solver since serialization of this solver was deficient, and except for Functions that include an Integrator.
- breaking
custom_jacobian
semantics changed. The Function must now return individual blocks (Jacobian of an output w.r.t. to an input) - breaking Changed API part for Jacobian sparsity (relevant for advanced use through
external
orCallback
)
bool has_jac_sparsity(casadi_int oind, casadi_int iind) const override;
Sparsity get_jac_sparsity(casadi_int oind, casadi_int iind, bool symmetric) const override;
Function.find_function
Can be used to retrieve Functions in a hierarchy.- Avoid truncation in printing #2452
- breaking: Function outputs that are not used (passed a null pointer internally) will be logged (
dump_in
option ) asnan
instead of earlier0
. E.g. Ipoptnlp_grad_f
has two outputs,f
andgrad_f_x
. Thef
output is not used internally, so will be logged asnan
.
Code-generation
Function
objects with anexternal
call can now be codegenerated.mmin
/mmax
now support codegeneration
Solvers/plugins
nlpsol
/Opti.solver
can now take an option 'detect_simple_bounds' (defaultFalse
) that will promote general constraints to simple bounds (lbx/ubx).- Added SPRAL linear solver for Ipopt
- Added QP solvers HPIPM, Proxqp, Highs
- CPLEX interface will dynamically load
libcplex<CPLEX_VERSION>
, where CPLEX_VERSION is read from environmental variables. Same strategy forGurobi
. - SqpMethod Eigen-reflect/eigen-clip incorrect #2896
Generalized integrator support
The Integrator
class, which solves initial-value problems in ODEs and DAEs has been thoroughly refactored. Changes include:
- The integrator class now has a much more mature support for returning the IVP solution at multiple time points. It can now be obtained by providing a time grid to the
integrator
constructor. Unlike before, this support should now work in combination with forward/adjoint sensitivity analysis (to any order) and sparsity pattern calculations. Cf. #2823. - The integrator class now includes support for a piecewise constant control (
u
). The interface will keep track of changes tou
and avoid integrating past such changes; for the Sundials (CVODES/IDAS) interfaces by setting a "stop time", for fixed step integrators by aligning the integration points with the grid points. Cf. #3025. Development versions of CasADi included support for this in a dedicated class, calledSimulator
, but this class has now been removed (breaking) and the functionality has been ported to theIntegrator
class.
If you had code looking likecs.integrator('sim_function', 'cvodes', dae, tgrid, opts)
, you may replace it bycs.integrator('sim_function', 'cvodes', dae, 0, tgrid[1:], opts)
. - The Integrator class now much better exploits the problem structure in the sensitivity calculations, especially adjoint (and forward-over-adjoint, adjoint-over-adjoint) sensitivity calculations. Cf. #2823, #3047. The sensitivity analysis relies to a much less extent on...
nightly-plugin_madnlp2
automated commit by docs target [skip ci]
nightly-basemodelica
Adding bfgs to sqpmethod codegen