cython wrapper for acados (#22784)
* cython wrapper for acados
* fix building
* sconscript cleanup
* no cython numpy
* cleanup
* upgrade build script
* try without slices
* new acados commit
* c3 update acados libs
* c2 libs
* make faster
* undo profiling
* fix build
* somewhat faster
* tryout cost_set_slice
* Revert "tryout cost_set_slice"
This reverts commit d358d93a13
.
* cleanup
* undo t_renderer change
Co-authored-by: Comma Device <device@comma.ai>
pull/22886/head
parent
8a8cee5e54
commit
89d0a52d16
60 changed files with 1735 additions and 440 deletions
@ -1 +1,6 @@ |
|||||||
__pycache__/ |
__pycache__/ |
||||||
|
|
||||||
|
# Cython intermediates |
||||||
|
*_pyx.c |
||||||
|
*_pyx.o |
||||||
|
*_pyx.so |
||||||
|
@ -0,0 +1,427 @@ |
|||||||
|
# -*- coding: future_fstrings -*- |
||||||
|
# |
||||||
|
# Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, |
||||||
|
# Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, |
||||||
|
# Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, |
||||||
|
# Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl |
||||||
|
# |
||||||
|
# This file is part of acados. |
||||||
|
# |
||||||
|
# The 2-Clause BSD License |
||||||
|
# |
||||||
|
# Redistribution and use in source and binary forms, with or without |
||||||
|
# modification, are permitted provided that the following conditions are met: |
||||||
|
# |
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, |
||||||
|
# this list of conditions and the following disclaimer. |
||||||
|
# |
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice, |
||||||
|
# this list of conditions and the following disclaimer in the documentation |
||||||
|
# and/or other materials provided with the distribution. |
||||||
|
# |
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
||||||
|
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||||
|
# POSSIBILITY OF SUCH DAMAGE.; |
||||||
|
# |
||||||
|
# cython: language_level=3 |
||||||
|
# cython: profile=False |
||||||
|
# distutils: language=c |
||||||
|
|
||||||
|
cimport cython |
||||||
|
from libc cimport string |
||||||
|
|
||||||
|
cimport acados_solver_common |
||||||
|
cimport acados_solver |
||||||
|
|
||||||
|
cimport numpy as cnp |
||||||
|
|
||||||
|
import os |
||||||
|
import numpy as np |
||||||
|
|
||||||
|
|
||||||
|
cdef class AcadosOcpSolverFast: |
||||||
|
""" |
||||||
|
Class to interact with the acados ocp solver C object. |
||||||
|
|
||||||
|
:param acados_ocp: type AcadosOcp - description of the OCP for acados |
||||||
|
:param json_file: name for the json file used to render the templated code - default: acados_ocp_nlp.json |
||||||
|
:param simulink_opts: Options to configure Simulink S-function blocks, mainly to activate possible Inputs and Outputs |
||||||
|
""" |
||||||
|
|
||||||
|
cdef acados_solver.nlp_solver_capsule *capsule |
||||||
|
cdef void *nlp_opts |
||||||
|
cdef acados_solver_common.ocp_nlp_dims *nlp_dims |
||||||
|
cdef acados_solver_common.ocp_nlp_config *nlp_config |
||||||
|
cdef acados_solver_common.ocp_nlp_out *nlp_out |
||||||
|
cdef acados_solver_common.ocp_nlp_in *nlp_in |
||||||
|
cdef acados_solver_common.ocp_nlp_solver *nlp_solver |
||||||
|
|
||||||
|
cdef str model_name |
||||||
|
cdef int N |
||||||
|
cdef bint solver_created |
||||||
|
|
||||||
|
def __cinit__(self, str model_name, int N, str code_export_dir): |
||||||
|
self.model_name = model_name |
||||||
|
self.N = N |
||||||
|
|
||||||
|
self.solver_created = False |
||||||
|
|
||||||
|
# create capsule |
||||||
|
self.capsule = acados_solver.acados_create_capsule() |
||||||
|
|
||||||
|
# create solver |
||||||
|
assert acados_solver.acados_create(self.capsule) == 0 |
||||||
|
self.solver_created = True |
||||||
|
|
||||||
|
# get pointers solver |
||||||
|
self.nlp_opts = acados_solver.acados_get_nlp_opts(self.capsule) |
||||||
|
self.nlp_dims = acados_solver.acados_get_nlp_dims(self.capsule) |
||||||
|
self.nlp_config = acados_solver.acados_get_nlp_config(self.capsule) |
||||||
|
self.nlp_out = acados_solver.acados_get_nlp_out(self.capsule) |
||||||
|
self.nlp_in = acados_solver.acados_get_nlp_in(self.capsule) |
||||||
|
self.nlp_solver = acados_solver.acados_get_nlp_solver(self.capsule) |
||||||
|
|
||||||
|
|
||||||
|
def solve(self): |
||||||
|
""" |
||||||
|
Solve the ocp with current input. |
||||||
|
""" |
||||||
|
return acados_solver.acados_solve(self.capsule) |
||||||
|
|
||||||
|
|
||||||
|
def set_new_time_steps(self, new_time_steps): |
||||||
|
""" |
||||||
|
Set new time steps before solving. Only reload library without code generation but with new time steps. |
||||||
|
|
||||||
|
:param new_time_steps: vector of new time steps for the solver |
||||||
|
|
||||||
|
.. note:: This allows for different use-cases: either set a new size of time-steps or a new distribution of |
||||||
|
the shooting nodes without changing the number, e.g., to reach a different final time. Both cases |
||||||
|
do not require a new code export and compilation. |
||||||
|
""" |
||||||
|
raise NotImplementedError() |
||||||
|
|
||||||
|
|
||||||
|
def get(self, int stage, str field_): |
||||||
|
""" |
||||||
|
Get the last solution of the solver: |
||||||
|
|
||||||
|
:param stage: integer corresponding to shooting node |
||||||
|
:param field: string in ['x', 'u', 'z', 'pi', 'lam', 't', 'sl', 'su',] |
||||||
|
|
||||||
|
.. note:: regarding lam, t: \n |
||||||
|
the inequalities are internally organized in the following order: \n |
||||||
|
[ lbu lbx lg lh lphi ubu ubx ug uh uphi; \n |
||||||
|
lsbu lsbx lsg lsh lsphi usbu usbx usg ush usphi] |
||||||
|
|
||||||
|
.. note:: pi: multipliers for dynamics equality constraints \n |
||||||
|
lam: multipliers for inequalities \n |
||||||
|
t: slack variables corresponding to evaluation of all inequalities (at the solution) \n |
||||||
|
sl: slack variables of soft lower inequality constraints \n |
||||||
|
su: slack variables of soft upper inequality constraints \n |
||||||
|
""" |
||||||
|
|
||||||
|
out_fields = ['x', 'u', 'z', 'pi', 'lam', 't', 'sl', 'su'] |
||||||
|
field = field_.encode('utf-8') |
||||||
|
|
||||||
|
if field_ not in out_fields: |
||||||
|
raise Exception('AcadosOcpSolver.get(): {} is an invalid argument.\ |
||||||
|
\n Possible values are {}. Exiting.'.format(field_, out_fields)) |
||||||
|
|
||||||
|
if stage < 0 or stage > self.N: |
||||||
|
raise Exception('AcadosOcpSolver.get(): stage index must be in [0, N], got: {}.'.format(self.N)) |
||||||
|
|
||||||
|
if stage == self.N and field_ == 'pi': |
||||||
|
raise Exception('AcadosOcpSolver.get(): field {} does not exist at final stage {}.'\ |
||||||
|
.format(field_, stage)) |
||||||
|
|
||||||
|
cdef int dims = acados_solver_common.ocp_nlp_dims_get_from_attr(self.nlp_config, |
||||||
|
self.nlp_dims, self.nlp_out, stage, field) |
||||||
|
|
||||||
|
cdef cnp.ndarray[cnp.float64_t, ndim=1] out = np.zeros((dims,)) |
||||||
|
acados_solver_common.ocp_nlp_out_get(self.nlp_config, \ |
||||||
|
self.nlp_dims, self.nlp_out, stage, field, <void *> out.data) |
||||||
|
|
||||||
|
return out |
||||||
|
|
||||||
|
|
||||||
|
def print_statistics(self): |
||||||
|
""" |
||||||
|
prints statistics of previous solver run as a table: |
||||||
|
- iter: iteration number |
||||||
|
- res_stat: stationarity residual |
||||||
|
- res_eq: residual wrt equality constraints (dynamics) |
||||||
|
- res_ineq: residual wrt inequality constraints (constraints) |
||||||
|
- res_comp: residual wrt complementarity conditions |
||||||
|
- qp_stat: status of QP solver |
||||||
|
- qp_iter: number of QP iterations |
||||||
|
- qp_res_stat: stationarity residual of the last QP solution |
||||||
|
- qp_res_eq: residual wrt equality constraints (dynamics) of the last QP solution |
||||||
|
- qp_res_ineq: residual wrt inequality constraints (constraints) of the last QP solution |
||||||
|
- qp_res_comp: residual wrt complementarity conditions of the last QP solution |
||||||
|
""" |
||||||
|
raise NotImplementedError() |
||||||
|
|
||||||
|
|
||||||
|
def store_iterate(self, filename='', overwrite=False): |
||||||
|
""" |
||||||
|
Stores the current iterate of the ocp solver in a json file. |
||||||
|
|
||||||
|
:param filename: if not set, use model_name + timestamp + '.json' |
||||||
|
:param overwrite: if false and filename exists add timestamp to filename |
||||||
|
""" |
||||||
|
raise NotImplementedError() |
||||||
|
|
||||||
|
|
||||||
|
def load_iterate(self, filename): |
||||||
|
""" |
||||||
|
Loads the iterate stored in json file with filename into the ocp solver. |
||||||
|
""" |
||||||
|
raise NotImplementedError() |
||||||
|
|
||||||
|
|
||||||
|
def get_stats(self, field_): |
||||||
|
""" |
||||||
|
Get the information of the last solver call. |
||||||
|
|
||||||
|
:param field: string in ['statistics', 'time_tot', 'time_lin', 'time_sim', 'time_sim_ad', 'time_sim_la', 'time_qp', 'time_qp_solver_call', 'time_reg', 'sqp_iter'] |
||||||
|
""" |
||||||
|
raise NotImplementedError() |
||||||
|
|
||||||
|
|
||||||
|
def get_cost(self): |
||||||
|
""" |
||||||
|
Returns the cost value of the current solution. |
||||||
|
""" |
||||||
|
# compute cost internally |
||||||
|
acados_solver_common.ocp_nlp_eval_cost(self.nlp_solver, self.nlp_in, self.nlp_out) |
||||||
|
|
||||||
|
# create output |
||||||
|
cdef double out |
||||||
|
|
||||||
|
# call getter |
||||||
|
acados_solver_common.ocp_nlp_get(self.nlp_config, self.nlp_solver, "cost_value", <void *> &out) |
||||||
|
|
||||||
|
return out |
||||||
|
|
||||||
|
|
||||||
|
def get_residuals(self): |
||||||
|
""" |
||||||
|
Returns an array of the form [res_stat, res_eq, res_ineq, res_comp]. |
||||||
|
""" |
||||||
|
raise NotImplementedError() |
||||||
|
|
||||||
|
|
||||||
|
# Note: this function should not be used anymore, better use cost_set, constraints_set |
||||||
|
def set(self, int stage, str field_, value_): |
||||||
|
|
||||||
|
""" |
||||||
|
Set numerical data inside the solver. |
||||||
|
|
||||||
|
:param stage: integer corresponding to shooting node |
||||||
|
:param field: string in ['x', 'u', 'pi', 'lam', 't', 'p'] |
||||||
|
|
||||||
|
.. note:: regarding lam, t: \n |
||||||
|
the inequalities are internally organized in the following order: \n |
||||||
|
[ lbu lbx lg lh lphi ubu ubx ug uh uphi; \n |
||||||
|
lsbu lsbx lsg lsh lsphi usbu usbx usg ush usphi] |
||||||
|
|
||||||
|
.. note:: pi: multipliers for dynamics equality constraints \n |
||||||
|
lam: multipliers for inequalities \n |
||||||
|
t: slack variables corresponding to evaluation of all inequalities (at the solution) \n |
||||||
|
sl: slack variables of soft lower inequality constraints \n |
||||||
|
su: slack variables of soft upper inequality constraints \n |
||||||
|
""" |
||||||
|
cost_fields = ['y_ref', 'yref'] |
||||||
|
constraints_fields = ['lbx', 'ubx', 'lbu', 'ubu'] |
||||||
|
out_fields = ['x', 'u', 'pi', 'lam', 't', 'z', 'sl', 'su'] |
||||||
|
|
||||||
|
field = field_.encode('utf-8') |
||||||
|
|
||||||
|
cdef double[::1] value |
||||||
|
|
||||||
|
# treat parameters separately |
||||||
|
if field_ == 'p': |
||||||
|
value = np.ascontiguousarray(value_, dtype=np.double) |
||||||
|
assert acados_solver.acados_update_params(self.capsule, stage, <double *> &value[0], value.shape[0]) == 0 |
||||||
|
else: |
||||||
|
if field_ not in constraints_fields + cost_fields + out_fields: |
||||||
|
raise Exception("AcadosOcpSolver.set(): {} is not a valid argument.\ |
||||||
|
\nPossible values are {}. Exiting.".format(field, \ |
||||||
|
constraints_fields + cost_fields + out_fields + ['p'])) |
||||||
|
|
||||||
|
dims = acados_solver_common.ocp_nlp_dims_get_from_attr(self.nlp_config, |
||||||
|
self.nlp_dims, self.nlp_out, stage, field) |
||||||
|
|
||||||
|
if value_.shape[0] != dims: |
||||||
|
msg = 'AcadosOcpSolver.set(): mismatching dimension for field "{}" '.format(field_) |
||||||
|
msg += 'with dimension {} (you have {})'.format(dims, value_.shape[0]) |
||||||
|
raise Exception(msg) |
||||||
|
|
||||||
|
value = np.ascontiguousarray(value_, dtype=np.double) |
||||||
|
if field_ in constraints_fields: |
||||||
|
acados_solver_common.ocp_nlp_constraints_model_set(self.nlp_config, |
||||||
|
self.nlp_dims, self.nlp_in, stage, field, <void *> &value[0]) |
||||||
|
elif field_ in cost_fields: |
||||||
|
acados_solver_common.ocp_nlp_cost_model_set(self.nlp_config, |
||||||
|
self.nlp_dims, self.nlp_in, stage, field, <void *> &value[0]) |
||||||
|
elif field_ in out_fields: |
||||||
|
acados_solver_common.ocp_nlp_out_set(self.nlp_config, |
||||||
|
self.nlp_dims, self.nlp_out, stage, field, <void *> &value[0]) |
||||||
|
|
||||||
|
|
||||||
|
def cost_set(self, int stage, str field_, value_): |
||||||
|
""" |
||||||
|
Set numerical data in the cost module of the solver. |
||||||
|
|
||||||
|
:param stage: integer corresponding to shooting node |
||||||
|
:param field: string, e.g. 'yref', 'W', 'ext_cost_num_hess' |
||||||
|
:param value: of appropriate size |
||||||
|
""" |
||||||
|
field = field_.encode('utf-8') |
||||||
|
|
||||||
|
cdef int dims[2] |
||||||
|
acados_solver_common.ocp_nlp_cost_dims_get_from_attr(self.nlp_config, \ |
||||||
|
self.nlp_dims, self.nlp_out, stage, field, &dims[0]) |
||||||
|
|
||||||
|
cdef double[::1,:] value |
||||||
|
|
||||||
|
value_shape = value_.shape |
||||||
|
if len(value_shape) == 1: |
||||||
|
value_shape = (value_shape[0], 0) |
||||||
|
value = np.asfortranarray(value_[None,:]) |
||||||
|
|
||||||
|
elif len(value_shape) == 2: |
||||||
|
# Get elements in column major order |
||||||
|
value = np.asfortranarray(value_) |
||||||
|
|
||||||
|
if value_shape[0] != dims[0] or value_shape[1] != dims[1]: |
||||||
|
raise Exception('AcadosOcpSolver.cost_set(): mismatching dimension', \ |
||||||
|
' for field "{}" with dimension {} (you have {})'.format( \ |
||||||
|
field_, tuple(dims), value_shape)) |
||||||
|
|
||||||
|
acados_solver_common.ocp_nlp_cost_model_set(self.nlp_config, \ |
||||||
|
self.nlp_dims, self.nlp_in, stage, field, <void *> &value[0][0]) |
||||||
|
|
||||||
|
|
||||||
|
def constraints_set(self, int stage, str field_, value_): |
||||||
|
""" |
||||||
|
Set numerical data in the constraint module of the solver. |
||||||
|
|
||||||
|
:param stage: integer corresponding to shooting node |
||||||
|
:param field: string in ['lbx', 'ubx', 'lbu', 'ubu', 'lg', 'ug', 'lh', 'uh', 'uphi', 'C', 'D'] |
||||||
|
:param value: of appropriate size |
||||||
|
""" |
||||||
|
field = field_.encode('utf-8') |
||||||
|
|
||||||
|
cdef int dims[2] |
||||||
|
acados_solver_common.ocp_nlp_constraint_dims_get_from_attr(self.nlp_config, \ |
||||||
|
self.nlp_dims, self.nlp_out, stage, field, &dims[0]) |
||||||
|
|
||||||
|
cdef double[::1,:] value |
||||||
|
|
||||||
|
value_shape = value_.shape |
||||||
|
if len(value_shape) == 1: |
||||||
|
value_shape = (value_shape[0], 0) |
||||||
|
value = np.asfortranarray(value_[None,:]) |
||||||
|
|
||||||
|
elif len(value_shape) == 2: |
||||||
|
# Get elements in column major order |
||||||
|
value = np.asfortranarray(value_) |
||||||
|
|
||||||
|
if value_shape[0] != dims[0] or value_shape[1] != dims[1]: |
||||||
|
raise Exception('AcadosOcpSolver.constraints_set(): mismatching dimension' \ |
||||||
|
' for field "{}" with dimension {} (you have {})'.format(field_, tuple(dims), value_shape)) |
||||||
|
|
||||||
|
acados_solver_common.ocp_nlp_constraints_model_set(self.nlp_config, \ |
||||||
|
self.nlp_dims, self.nlp_in, stage, field, <void *> &value[0][0]) |
||||||
|
|
||||||
|
return |
||||||
|
|
||||||
|
|
||||||
|
def dynamics_get(self, int stage, str field_): |
||||||
|
""" |
||||||
|
Get numerical data from the dynamics module of the solver: |
||||||
|
|
||||||
|
:param stage: integer corresponding to shooting node |
||||||
|
:param field: string, e.g. 'A' |
||||||
|
""" |
||||||
|
field = field_.encode('utf-8') |
||||||
|
|
||||||
|
# get dims |
||||||
|
cdef int[2] dims |
||||||
|
acados_solver_common.ocp_nlp_dynamics_dims_get_from_attr(self.nlp_config, self.nlp_dims, self.nlp_out, stage, field, &dims[0]) |
||||||
|
|
||||||
|
# create output data |
||||||
|
out = np.zeros((dims[0], dims[1]), order='F', dtype=np.float64) |
||||||
|
|
||||||
|
# call getter |
||||||
|
acados_solver_common.ocp_nlp_get_at_stage(self.nlp_config, self.nlp_dims, self.nlp_solver, stage, field, <void *> out.data) |
||||||
|
|
||||||
|
return out |
||||||
|
|
||||||
|
|
||||||
|
def options_set(self, str field_, value_): |
||||||
|
""" |
||||||
|
Set options of the solver. |
||||||
|
|
||||||
|
:param field: string, e.g. 'print_level', 'rti_phase', 'initialize_t_slacks', 'step_length', 'alpha_min', 'alpha_reduction' |
||||||
|
:param value: of type int, float |
||||||
|
""" |
||||||
|
int_fields = ['print_level', 'rti_phase', 'initialize_t_slacks'] |
||||||
|
double_fields = ['step_length', 'tol_eq', 'tol_stat', 'tol_ineq', 'tol_comp', 'alpha_min', 'alpha_reduction'] |
||||||
|
string_fields = ['globalization'] |
||||||
|
|
||||||
|
# encode |
||||||
|
field = field_.encode('utf-8') |
||||||
|
|
||||||
|
cdef int int_value |
||||||
|
cdef double double_value |
||||||
|
cdef unsigned char[::1] string_value |
||||||
|
|
||||||
|
# check field availability and type |
||||||
|
if field_ in int_fields: |
||||||
|
if not isinstance(value_, int): |
||||||
|
raise Exception('solver option {} must be of type int. You have {}.'.format(field_, type(value_))) |
||||||
|
|
||||||
|
if field_ == 'rti_phase': |
||||||
|
if value_ < 0 or value_ > 2: |
||||||
|
raise Exception('AcadosOcpSolver.solve(): argument \'rti_phase\' can ' |
||||||
|
'take only values 0, 1, 2 for SQP-RTI-type solvers') |
||||||
|
if self.acados_ocp.solver_options.nlp_solver_type != 'SQP_RTI' and value_ > 0: |
||||||
|
raise Exception('AcadosOcpSolver.solve(): argument \'rti_phase\' can ' |
||||||
|
'take only value 0 for SQP-type solvers') |
||||||
|
|
||||||
|
int_value = value_ |
||||||
|
acados_solver_common.ocp_nlp_solver_opts_set(self.nlp_config, self.nlp_opts, field, <void *> &int_value) |
||||||
|
|
||||||
|
elif field_ in double_fields: |
||||||
|
if not isinstance(value_, float): |
||||||
|
raise Exception('solver option {} must be of type float. You have {}.'.format(field_, type(value_))) |
||||||
|
|
||||||
|
double_value = value_ |
||||||
|
acados_solver_common.ocp_nlp_solver_opts_set(self.nlp_config, self.nlp_opts, field, <void *> &double_value) |
||||||
|
|
||||||
|
elif field_ in string_fields: |
||||||
|
if not isinstance(value_, bytes): |
||||||
|
raise Exception('solver option {} must be of type str. You have {}.'.format(field_, type(value_))) |
||||||
|
|
||||||
|
string_value = value_.encode('utf-8') |
||||||
|
acados_solver_common.ocp_nlp_solver_opts_set(self.nlp_config, self.nlp_opts, field, <void *> &string_value[0]) |
||||||
|
|
||||||
|
raise Exception('AcadosOcpSolver.options_set() does not support field {}.'\ |
||||||
|
'\n Possible values are {}.'.format(field_, ', '.join(int_fields + double_fields + string_fields))) |
||||||
|
|
||||||
|
|
||||||
|
def __del__(self): |
||||||
|
if self.solver_created: |
||||||
|
acados_solver.acados_free(self.capsule) |
||||||
|
acados_solver.acados_free_capsule(self.capsule) |
@ -0,0 +1,102 @@ |
|||||||
|
# -*- coding: future_fstrings -*- |
||||||
|
# |
||||||
|
# Copyright 2019 Gianluca Frison, Dimitris Kouzoupis, Robin Verschueren, |
||||||
|
# Andrea Zanelli, Niels van Duijkeren, Jonathan Frey, Tommaso Sartor, |
||||||
|
# Branimir Novoselnik, Rien Quirynen, Rezart Qelibari, Dang Doan, |
||||||
|
# Jonas Koenemann, Yutao Chen, Tobias Schöls, Jonas Schlagenhauf, Moritz Diehl |
||||||
|
# |
||||||
|
# This file is part of acados. |
||||||
|
# |
||||||
|
# The 2-Clause BSD License |
||||||
|
# |
||||||
|
# Redistribution and use in source and binary forms, with or without |
||||||
|
# modification, are permitted provided that the following conditions are met: |
||||||
|
# |
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, |
||||||
|
# this list of conditions and the following disclaimer. |
||||||
|
# |
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice, |
||||||
|
# this list of conditions and the following disclaimer in the documentation |
||||||
|
# and/or other materials provided with the distribution. |
||||||
|
# |
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
||||||
|
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||||
|
# POSSIBILITY OF SUCH DAMAGE.; |
||||||
|
# |
||||||
|
|
||||||
|
|
||||||
|
cdef extern from "acados/ocp_nlp/ocp_nlp_common.h": |
||||||
|
ctypedef struct ocp_nlp_config: |
||||||
|
pass |
||||||
|
|
||||||
|
ctypedef struct ocp_nlp_dims: |
||||||
|
pass |
||||||
|
|
||||||
|
ctypedef struct ocp_nlp_in: |
||||||
|
pass |
||||||
|
|
||||||
|
ctypedef struct ocp_nlp_out: |
||||||
|
pass |
||||||
|
|
||||||
|
|
||||||
|
cdef extern from "acados_c/ocp_nlp_interface.h": |
||||||
|
ctypedef enum ocp_nlp_solver_t: |
||||||
|
pass |
||||||
|
|
||||||
|
ctypedef enum ocp_nlp_cost_t: |
||||||
|
pass |
||||||
|
|
||||||
|
ctypedef enum ocp_nlp_dynamics_t: |
||||||
|
pass |
||||||
|
|
||||||
|
ctypedef enum ocp_nlp_constraints_t: |
||||||
|
pass |
||||||
|
|
||||||
|
ctypedef enum ocp_nlp_reg_t: |
||||||
|
pass |
||||||
|
|
||||||
|
ctypedef struct ocp_nlp_plan: |
||||||
|
pass |
||||||
|
|
||||||
|
ctypedef struct ocp_nlp_solver: |
||||||
|
pass |
||||||
|
|
||||||
|
int ocp_nlp_cost_model_set(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_in *in_, |
||||||
|
int start_stage, const char *field, void *value) |
||||||
|
int ocp_nlp_constraints_model_set(ocp_nlp_config *config, ocp_nlp_dims *dims, |
||||||
|
ocp_nlp_in *in_, int stage, const char *field, void *value) |
||||||
|
|
||||||
|
# out |
||||||
|
void ocp_nlp_out_set(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_out *out, |
||||||
|
int stage, const char *field, void *value) |
||||||
|
void ocp_nlp_out_get(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_out *out, |
||||||
|
int stage, const char *field, void *value) |
||||||
|
void ocp_nlp_get_at_stage(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_solver *solver, |
||||||
|
int stage, const char *field, void *value) |
||||||
|
int ocp_nlp_dims_get_from_attr(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_out *out, |
||||||
|
int stage, const char *field) |
||||||
|
void ocp_nlp_constraint_dims_get_from_attr(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_out *out, |
||||||
|
int stage, const char *field, int *dims_out) |
||||||
|
void ocp_nlp_cost_dims_get_from_attr(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_out *out, |
||||||
|
int stage, const char *field, int *dims_out) |
||||||
|
void ocp_nlp_dynamics_dims_get_from_attr(ocp_nlp_config *config, ocp_nlp_dims *dims, ocp_nlp_out *out, |
||||||
|
int stage, const char *field, int *dims_out) |
||||||
|
|
||||||
|
# opts |
||||||
|
void ocp_nlp_solver_opts_set(ocp_nlp_config *config, void *opts_, const char *field, void* value) |
||||||
|
|
||||||
|
# solver |
||||||
|
void ocp_nlp_eval_residuals(ocp_nlp_solver *solver, ocp_nlp_in *nlp_in, ocp_nlp_out *nlp_out) |
||||||
|
void ocp_nlp_eval_cost(ocp_nlp_solver *solver, ocp_nlp_in *nlp_in_, ocp_nlp_out *nlp_out) |
||||||
|
|
||||||
|
# get/set |
||||||
|
void ocp_nlp_get(ocp_nlp_config *config, ocp_nlp_solver *solver, const char *field, void *return_value_) |
||||||
|
void ocp_nlp_set(ocp_nlp_config *config, ocp_nlp_solver *solver, int stage, const char *field, void *value) |
@ -0,0 +1,22 @@ |
|||||||
|
cimport acados_solver_common |
||||||
|
|
||||||
|
cdef extern from "acados_solver_{{ model.name }}.h": |
||||||
|
ctypedef struct nlp_solver_capsule "{{ model.name }}_solver_capsule": |
||||||
|
pass |
||||||
|
|
||||||
|
nlp_solver_capsule * acados_create_capsule "{{ model.name }}_acados_create_capsule"() |
||||||
|
int acados_free_capsule "{{ model.name }}_acados_free_capsule"(nlp_solver_capsule *capsule) |
||||||
|
|
||||||
|
int acados_create "{{ model.name }}_acados_create"(nlp_solver_capsule * capsule) |
||||||
|
int acados_update_params "{{ model.name }}_acados_update_params"(nlp_solver_capsule * capsule, int stage, double *value, int np_) |
||||||
|
int acados_solve "{{ model.name }}_acados_solve"(nlp_solver_capsule * capsule) |
||||||
|
int acados_free "{{ model.name }}_acados_free"(nlp_solver_capsule * capsule) |
||||||
|
void acados_print_stats "{{ model.name }}_acados_print_stats"(nlp_solver_capsule * capsule) |
||||||
|
|
||||||
|
acados_solver_common.ocp_nlp_in *acados_get_nlp_in "{{ model.name }}_acados_get_nlp_in"(nlp_solver_capsule * capsule) |
||||||
|
acados_solver_common.ocp_nlp_out *acados_get_nlp_out "{{ model.name }}_acados_get_nlp_out"(nlp_solver_capsule * capsule) |
||||||
|
acados_solver_common.ocp_nlp_solver *acados_get_nlp_solver "{{ model.name }}_acados_get_nlp_solver"(nlp_solver_capsule * capsule) |
||||||
|
acados_solver_common.ocp_nlp_config *acados_get_nlp_config "{{ model.name }}_acados_get_nlp_config"(nlp_solver_capsule * capsule) |
||||||
|
void *acados_get_nlp_opts "{{ model.name }}_acados_get_nlp_opts"(nlp_solver_capsule * capsule) |
||||||
|
acados_solver_common.ocp_nlp_dims *acados_get_nlp_dims "{{ model.name }}_acados_get_nlp_dims"(nlp_solver_capsule * capsule) |
||||||
|
acados_solver_common.ocp_nlp_plan *acados_get_nlp_plan "{{ model.name }}_acados_get_nlp_plan"(nlp_solver_capsule * capsule) |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue