From 62cccd49ce63c74302a84adcc1786067b766e9bc Mon Sep 17 00:00:00 2001 From: fetty Date: Fri, 29 Dec 2023 18:49:06 +0100 Subject: [PATCH] Minor changes --- CMakeLists.txt | 3 + README.md | 57 ++--- solver/codeGen/TailoredSolver.m | 2 +- solver/codeGen/TailoredSolver.mexa64 | Bin 298864 -> 298864 bytes .../codeGen/TailoredSolver/TailoredSolver.m | 2 +- .../TailoredSolver/include/TailoredSolver.h | 27 +- .../include/TailoredSolver_memory.h | 2 +- .../TailoredSolver/interface/TailoredSolver.m | 2 +- .../interface/TailoredSolverBuildable.m | 10 +- .../interface/TailoredSolver_build.py | 3 +- .../interface/TailoredSolver_dynamics_mex.c | 238 ------------------ .../TailoredSolver_inequalities_mex.c | 238 ------------------ .../interface/TailoredSolver_lib.mdl | 4 +- .../interface/TailoredSolver_mex.c | 4 +- .../interface/TailoredSolver_objective_mex.c | 238 ------------------ .../interface/TailoredSolver_py.py | 4 +- .../interface/TailoredSolver_simulinkBlock.c | 93 +++---- .../TailoredSolver_simulinkBlockcompact.c | 93 +++---- .../interface/TailoredSolvercompact_lib.mdl | 4 +- .../TailoredSolver/lib/libTailoredSolver.a | Bin 297052 -> 297100 bytes .../TailoredSolver/lib/libTailoredSolver.so | Bin 262520 -> 262512 bytes .../lib/libTailoredSolver_withModel.so | Bin 292704 -> 292696 bytes .../lib_target/libTailoredSolver.a | Bin 296740 -> 296788 bytes .../lib_target/libTailoredSolver.so | Bin 262744 -> 262728 bytes solver/codeGen/TailoredSolverBuildable.m | 10 +- solver/codeGen/TailoredSolver_adtool2forces.c | 8 +- solver/codeGen/TailoredSolver_adtool2forces.o | Bin 5104 -> 5104 bytes solver/codeGen/TailoredSolver_casadi.o | Bin 25368 -> 25368 bytes solver/codeGen/TailoredSolver_py.py | 4 +- 29 files changed, 154 insertions(+), 892 deletions(-) delete mode 100644 solver/codeGen/TailoredSolver/interface/TailoredSolver_dynamics_mex.c delete mode 100644 solver/codeGen/TailoredSolver/interface/TailoredSolver_inequalities_mex.c delete mode 100644 solver/codeGen/TailoredSolver/interface/TailoredSolver_objective_mex.c diff --git a/CMakeLists.txt b/CMakeLists.txt index decf4e1..bda6307 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,10 @@ find_package(catkin REQUIRED COMPONENTS as_msgs ) +find_package(Eigen3 REQUIRED) + find_package(OpenMP REQUIRED) + if(OPENMP_FOUND) message(STATUS "OPENMP FOUND") set(OpenMP_FLAGS ${OpenMP_CXX_FLAGS}) diff --git a/README.md b/README.md index e56e25d..f222946 100644 --- a/README.md +++ b/README.md @@ -3,27 +3,17 @@
Logo

Tailored MPC

-

- This pkg is thought to be the main AS controller for CAT15x. Within this repo you will find 3 different controllers (time-variant, spatial-variant and lateral (also time-variant)). The one used for the 2022-2023 season is the lateral approach, leaving the others for a future implementation. -
-

+Here you can find the main Autonomous Systems controller for CAT15x, the [BCN eMotorsport](https://bcnemotorsport.upc.edu) 2022-23 car. Within this repo you will find 3 different MPC controllers: time-variant, spatial-variant and lateral (also time-variant). The one used for the 2022-2023 season is the lateral approach, leaving the others for a future implementation as they demand much more testing time. +
Table of Contents
  1. - Getting Started - + Disclaimer
  2. -
  3. Prerequisites - +
  4. Dependencies
  5. Approach @@ -34,18 +24,23 @@
-# Getting Started +# Disclaimer +This is a tailored control solution made for the CAT15x Formula Student vehicle. In order to make a propper use of this algorithm, it's the user duty to make sure the [dynamic model](docs/tfg.pdf) actually approximates the behaviour of the car. + +If you use this control algorithm in a Formula Student competition the **only** thing I ask for is to **ALWAYS REFERENCE** the team ___BCN eMotorsport___. -## Usage -In order to execute this pkg a [ForcesPro](https://forces.embotech.com/Documentation/index.html) software/hardware license is needed. If you don't have any license available read the __Solvers__ section in [AS README.md](https://bcnemotorsport.upc.edu:81/autonomous-systems-group/autonomous_systems). +# Dependencies +* [Ubuntu](https://ubuntu.com/) 20.04 +* [ROS](https://www.ros.org/) Noetic +* [Embotech](https://www.embotech.com/products/forcespro/overview/) FORCESPRO solver. A Hardware or Software Embotech license is mandatory. +* [Eigen3](https://eigen.tuxfamily.org) +* ___as_msgs___: self-defined ROS msgs pkg. You may change it for yours, adapting the [necessary callbacks](include/mpc.hh). -This pkg has a launch file for each dynamic event (or should have) because of the specific parametres used depending on the event. +# Approach -An example for executing the autocross controller: +For specific information on how the lateral controller work read [Tailored MPC](docs/tfg.pdf)'s paper. -```sh -roslaunch tailored_mpc autoX.launch -``` +For the sake of simplicity the different controllers are named after their more important characteristic. However, all the specified MPC controllers are curvature-based and follow a simplified non linear bicycle model. ## Branches Here's a quick explanation of this project branches: @@ -76,23 +71,11 @@ Here's a quick explanation of this project branches: __NOTE:__ The other branches are still in an early development process. They're not ready for deployment! -# Prerequisites - -## Msg dependencies -This pkg depends on the self-defined [as_msgs](https://bcnemotorsport.upc.edu:81/autonomous-systems-group/autonomous_systems). Make sure to have this msgs on your current workspace. - -## Solver dependecies -As said before, this pkg depends on [Embotech](https://www.embotech.com/products/forcespro/overview/) ForcesPro solver so a Hardware/Software license is needed. See the __Solvers__ section from [AS README.md](https://bcnemotorsport.upc.edu:81/autonomous-systems-group/autonomous_systems) for more information. - -# Approach - -For specific information on how these controllers work read [TRO](docs/TRO.pdf), [Lateral MPC](docs/KIT_lateral_MPC.pdf) and [Curvature MPC](docs/curvature_MPC.pdf) papers. - -For the sake of simplicity the different controllers are named after their more important characteristic. However, all the specified MPC controllers are curvature-based and follow a simplified non linear bicycle model. - # Workflow -In order to solve the Non Linear Optimization Problem (NLOP) stated in [solver declaration](solver/FORCES_problem.m) the following procedure must be followed (in this order): +Here's a quick summary of the steps taken by the algorithm in each iteration. + +In order to solve the Non Linear Optimization Problem (NLOP) defined with the [solver declaration API](solver/FORCES_problem.m) the following procedure is followed (in this order): * __Initial conditions__: the initial conditions for all the state/control variables must be computed. Usually the only unkown initial conditions are the path tracking variables `n` & `mu` so they must be calculated using the actual car state and the planned trajectory. diff --git a/solver/codeGen/TailoredSolver.m b/solver/codeGen/TailoredSolver.m index fa2808c..0703b2c 100644 --- a/solver/codeGen/TailoredSolver.m +++ b/solver/codeGen/TailoredSolver.m @@ -1,4 +1,4 @@ -% TailoredSolver - a fast solver generated by FORCESPRO v6.1.0 +% TailoredSolver - a fast solver generated by FORCESPRO v6.3.0 % % OUTPUT = TailoredSolver(PARAMS) solves a multistage problem % subject to the parameters supplied in the following struct: diff --git a/solver/codeGen/TailoredSolver.mexa64 b/solver/codeGen/TailoredSolver.mexa64 index b716b74d66270cfe6f29e4ed3639ca5e7d0f0985..a389b2b98a59f70065081b33715c04dd6949fccb 100755 GIT binary patch delta 6952 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 delta 6902 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 B`d9z} diff --git a/solver/codeGen/TailoredSolver/TailoredSolver.m b/solver/codeGen/TailoredSolver/TailoredSolver.m index fa2808c..0703b2c 100644 --- a/solver/codeGen/TailoredSolver/TailoredSolver.m +++ b/solver/codeGen/TailoredSolver/TailoredSolver.m @@ -1,4 +1,4 @@ -% TailoredSolver - a fast solver generated by FORCESPRO v6.1.0 +% TailoredSolver - a fast solver generated by FORCESPRO v6.3.0 % % OUTPUT = TailoredSolver(PARAMS) solves a multistage problem % subject to the parameters supplied in the following struct: diff --git a/solver/codeGen/TailoredSolver/include/TailoredSolver.h b/solver/codeGen/TailoredSolver/include/TailoredSolver.h index cb41b4a..95c5649 100644 --- a/solver/codeGen/TailoredSolver/include/TailoredSolver.h +++ b/solver/codeGen/TailoredSolver/include/TailoredSolver.h @@ -19,7 +19,7 @@ jurisdiction in case of any dispute. */ -/* Generated by FORCESPRO v6.1.0 on Monday, May 15, 2023 at 4:52:58 PM */ +/* Generated by FORCESPRO v6.3.0 on Tuesday, December 19, 2023 at 2:31:19 PM */ #ifndef TailoredSolver_H #define TailoredSolver_H @@ -94,21 +94,6 @@ typedef double TailoredSolverinterface_float; /* maximum number of supported elements in the filter */ #define MAX_FILTER_SIZE_TailoredSolver (150) -/* maximum number of supported elements in the filter */ -#define MAX_SOC_IT_TailoredSolver (4) - -/* desired relative duality gap */ -#define SET_ACC_RDGAP_TailoredSolver (TailoredSolver_float)(0.0001) - -/* desired maximum residual on equality constraints */ -#define SET_ACC_RESEQ_TailoredSolver (TailoredSolver_float)(1E-06) - -/* desired maximum residual on inequality constraints */ -#define SET_ACC_RESINEQ_TailoredSolver (TailoredSolver_float)(1E-06) - -/* desired maximum violation of complementarity */ -#define SET_ACC_KKTCOMPL_TailoredSolver (TailoredSolver_float)(1E-06) - /* whether callback return values should be checked */ #define EXTFUNC_RETURN_TailoredSolver (0) @@ -308,10 +293,12 @@ typedef struct /* SOLVER FUNCTION DEFINITION -------------------------------------------*/ -/* Time of Solver Generation: (UTC) Monday, May 15, 2023 4:53:02 PM */ -/* User License expires on: (UTC) Monday, September 25, 2023 10:00:00 PM (approx.) (at the time of code generation) */ -/* Solver Static License expires on: (UTC) Monday, September 25, 2023 10:00:00 PM (approx.) */ -/* Solver Id: 5ed8da90-0e85-42f3-a965-89843d08c984 */ +/* Time of Solver Generation: (UTC) Tuesday, December 19, 2023 2:31:26 PM */ +/* User License expires on: (UTC) Sunday, September 8, 2024 10:00:00 PM (approx.) (at the time of code generation) */ +/* Solver Static License expires on: (UTC) Sunday, September 8, 2024 10:00:00 PM (approx.) */ +/* Solver Id: d9462ecc-09c0-4c1a-841c-e467c14e3df8 */ +/* Host Compiler Version: d76500f0 */ +/* Target Compiler Version: d76500f0 */ /* examine exitflag before using the result! */ #ifdef __cplusplus extern "C" { diff --git a/solver/codeGen/TailoredSolver/include/TailoredSolver_memory.h b/solver/codeGen/TailoredSolver/include/TailoredSolver_memory.h index 4a3f7fa..c346805 100644 --- a/solver/codeGen/TailoredSolver/include/TailoredSolver_memory.h +++ b/solver/codeGen/TailoredSolver/include/TailoredSolver_memory.h @@ -19,7 +19,7 @@ jurisdiction in case of any dispute. */ -/* Generated by FORCESPRO v6.1.0 on Monday, May 15, 2023 at 4:52:58 PM */ +/* Generated by FORCESPRO v6.3.0 on Tuesday, December 19, 2023 at 2:31:19 PM */ #ifndef TailoredSolver_MEMORY_H #define TailoredSolver_MEMORY_H diff --git a/solver/codeGen/TailoredSolver/interface/TailoredSolver.m b/solver/codeGen/TailoredSolver/interface/TailoredSolver.m index fa2808c..0703b2c 100644 --- a/solver/codeGen/TailoredSolver/interface/TailoredSolver.m +++ b/solver/codeGen/TailoredSolver/interface/TailoredSolver.m @@ -1,4 +1,4 @@ -% TailoredSolver - a fast solver generated by FORCESPRO v6.1.0 +% TailoredSolver - a fast solver generated by FORCESPRO v6.3.0 % % OUTPUT = TailoredSolver(PARAMS) solves a multistage problem % subject to the parameters supplied in the following struct: diff --git a/solver/codeGen/TailoredSolver/interface/TailoredSolverBuildable.m b/solver/codeGen/TailoredSolver/interface/TailoredSolverBuildable.m index 5c0c959..ad9da31 100644 --- a/solver/codeGen/TailoredSolver/interface/TailoredSolverBuildable.m +++ b/solver/codeGen/TailoredSolver/interface/TailoredSolverBuildable.m @@ -50,7 +50,7 @@ function updateBuildInfo(buildInfo, cfg) end end - function [output,exitflag,info] = forcesInitOutputsMatlab() + function [output, exitflag, info] = forcesInitOutputsMatlab() infos_it = coder.nullcopy(zeros(1, 1)); infos_it2opt = coder.nullcopy(zeros(1, 1)); infos_res_eq = coder.nullcopy(zeros(1, 1)); @@ -104,7 +104,7 @@ function updateBuildInfo(buildInfo, cfg) [output,exitflag,info] = TailoredSolverBuildable.forcesCall(params.lb, params.ub, params.hu, params.xinit, params.x0, params.all_parameters, params.num_of_threads); end - function [output,exitflag,info] = forcesCall(lb, ub, hu, xinit, x0, all_parameters, num_of_threads) + function [output, exitflag, info] = forcesCall(lb, ub, hu, xinit, x0, all_parameters, num_of_threads) solvername = 'TailoredSolver'; @@ -116,14 +116,14 @@ function updateBuildInfo(buildInfo, cfg) 'all_parameters', double(all_parameters),... 'num_of_threads', uint32(num_of_threads)); - [output_c, exitflag_c, info_c] = TailoredSolverBuildable.forcesInitOutputsC(); + [output_c, exitflag_c, info_c] = TailoredSolverBuildable.forcesInitOutputsC(); %#ok headerName = [solvername '.h']; coder.cinclude(headerName); coder.cinclude([solvername '_memory.h']); coder.cinclude([solvername '_adtool2forces.h']); % define memory pointer - memptr = coder.opaque([solvername '_mem *'], 'HeaderFile', headerName); + memptr = coder.opaque([solvername '_mem *'], 'HeaderFile', headerName); %#ok memptr = coder.ceval([solvername '_internal_mem'], uint32(0)); % define solver input information (params, file and casadi) coder.cstructname(params, [solvername '_params'], 'extern', 'HeaderFile', headerName); @@ -168,7 +168,7 @@ function updateBuildInfo(buildInfo, cfg) end methods (Static, Access = private) - function [output,exitflag,info] = forcesInitOutputsC() + function [output, exitflag, info] = forcesInitOutputsC() infos_it = coder.nullcopy(int32(zeros(1, 1))); infos_it2opt = coder.nullcopy(int32(zeros(1, 1))); infos_res_eq = coder.nullcopy(double(zeros(1, 1))); diff --git a/solver/codeGen/TailoredSolver/interface/TailoredSolver_build.py b/solver/codeGen/TailoredSolver/interface/TailoredSolver_build.py index 508d238..05d26ca 100644 --- a/solver/codeGen/TailoredSolver/interface/TailoredSolver_build.py +++ b/solver/codeGen/TailoredSolver/interface/TailoredSolver_build.py @@ -17,6 +17,7 @@ #jurisdiction in case of any dispute. # from distutils.ccompiler import new_compiler +from distutils import unixccompiler c = new_compiler() #from numpy.distutils.intelccompiler import IntelCCompiler #c = IntelCCompiler() @@ -43,7 +44,7 @@ # compile into object file objdir = os.path.join(os.getcwd(),"TailoredSolver","obj") -if isinstance(c,distutils.unixccompiler.UnixCCompiler): +if isinstance(c,unixccompiler.UnixCCompiler): #objects = c.compile([sourcefile], output_dir=objdir, extra_preargs=['-O3','-fPIC','-fopenmp','-mavx']) objects = c.compile([sourcefile], output_dir=objdir, extra_preargs=['-O3','-fPIC','-mavx']) if sys.platform.startswith('linux'): diff --git a/solver/codeGen/TailoredSolver/interface/TailoredSolver_dynamics_mex.c b/solver/codeGen/TailoredSolver/interface/TailoredSolver_dynamics_mex.c deleted file mode 100644 index f069621..0000000 --- a/solver/codeGen/TailoredSolver/interface/TailoredSolver_dynamics_mex.c +++ /dev/null @@ -1,238 +0,0 @@ -/* -TailoredSolver : A fast customized optimization solver. - -Copyright (C) 2013-2023 EMBOTECH AG [info@embotech.com]. All rights reserved. - - -This program is distributed in the hope that it will be useful. -EMBOTECH makes NO WARRANTIES with respect to the use of the software -without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. - -EMBOTECH shall not have any liability for any damage arising from the use -of the software. - -This Agreement shall exclusively be governed by and interpreted in -accordance with the laws of Switzerland, excluding its principles -of conflict of laws. The Courts of Zurich-City shall have exclusive -jurisdiction in case of any dispute. - -*/ - -#include "mex.h" -#include "math.h" -#include -#include "../include/TailoredSolver.h" -#ifndef SOLVER_STDIO_H -#define SOLVER_STDIO_H -#include -#endif - -typedef TailoredSolver_float solver_float; -typedef solver_int32_default solver_int; -#define NSTAGES ( 40 ) -#define MAX(X, Y) ((X) < (Y) ? (Y) : (X)) - -/* For compatibility with Microsoft Visual Studio 2015 */ -#if _MSC_VER >= 1900 -FILE _iob[3]; -FILE * __cdecl __iob_func(void) -{ - _iob[0] = *stdin; - _iob[1] = *stdout; - _iob[2] = *stderr; - return _iob; -} -#endif - -/* copy functions */ - -void copyCArrayToM_TailoredSolver(TailoredSolver_float *src, double *dest, solver_int32_default dim) -{ - solver_int32_default i; - for( i = 0; i < dim; i++ ) - { - *dest++ = (double)*src++; - } -} - -void copyCValueToM_TailoredSolver(TailoredSolver_float* src, double* dest) -{ - *dest = (double)*src; -} - -void copyMArrayToC_TailoredSolver(double *src, TailoredSolver_float *dest, solver_int32_default dim) -{ - solver_int32_default i; - for( i = 0; i < dim; i++ ) - { - *dest++ = (TailoredSolver_float) (*src++) ; - } -} - -void copyMValueToC_TailoredSolver(double * src, TailoredSolver_float * dest) -{ - *dest = (TailoredSolver_float) *src; -} - - - -extern solver_int32_default TailoredSolver_adtool2forces(TailoredSolver_float *x, TailoredSolver_float *y, TailoredSolver_float *l, TailoredSolver_float *p, TailoredSolver_float *f, TailoredSolver_float *nabla_f, TailoredSolver_float *c, TailoredSolver_float *nabla_c, TailoredSolver_float *h, TailoredSolver_float *nabla_h, TailoredSolver_float *hess, solver_int32_default stage, solver_int32_default iteration, solver_int32_default threadID); -TailoredSolver_extfunc pt2function_TailoredSolver = &TailoredSolver_adtool2forces; - - -static void getDims(const solver_int stage, solver_int* nvar, solver_int* neq, solver_int* dimh, - solver_int* dimp, solver_int* diml, solver_int* dimu, solver_int* dimhl, solver_int* dimhu) -{ - const solver_int nvarArr[NSTAGES] = {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; - const solver_int neqArr[NSTAGES] = {7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}; - const solver_int dimhArr[NSTAGES] = {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; - const solver_int dimpArr[NSTAGES] = {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}; - const solver_int dimlArr[NSTAGES] = {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; - const solver_int dimuArr[NSTAGES] = {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; - const solver_int dimhlArr[NSTAGES] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - const solver_int dimhuArr[NSTAGES] = {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; - - *nvar = nvarArr[stage]; - *neq = neqArr[stage]; - *dimh = dimhArr[stage]; - *dimp = dimpArr[stage]; - *diml = dimlArr[stage]; - *dimu = dimuArr[stage]; - *dimhl = dimhlArr[stage]; - *dimhu = dimhuArr[stage]; -} - -/* Checks all inputs and returns stage number (1-indexed) */ -static void assignData(solver_int nrhs, const mxArray *prhs[], solver_int * const stage, solver_int * const nvar, solver_int * const neq, - solver_int * const dimh, solver_int * const dimp, solver_int * const diml, solver_int * const dimu, solver_int * const dimhl, solver_int * const dimhu) -{ - mxArray *arr; - - if (nrhs > 3 || nrhs < 1) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "This function takes at least one input: z. And at most 3 inputs: z, p, stage."); - } - - // get stage - *stage = (solver_int) 1; - if (nrhs == 3) - { - arr = prhs[2]; - if ( !mxIsDouble(arr) ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The third input (stage number) must be an integer."); - } - *stage = (solver_int) *mxGetPr(arr); - } - if ( *stage < 1 || (NSTAGES-1) < *stage ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "Stage must be between %d and %d.", 1, (NSTAGES-1)); - } - - /* Get other dimensions */ - *stage -= 1; /* 0-indexed stages */ - getDims(*stage, nvar, neq, dimh, dimp, diml, dimu, dimhl, dimhu); - - /* Check that passed z and p have correct dims */ - arr = prhs[0]; - if ( !mxIsDouble(arr) ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The first input (z) must be a column vector."); - } - if ( mxGetM(arr) != *nvar || mxGetN(arr) != 1 ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The first input (z) must be a column vector of length %d.", *nvar); - } - if (nrhs > 1) - { - arr = prhs[1]; - if ( *dimp > 0 && mxIsEmpty(arr)) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The second input (p) must be a column vector of length %d.", *dimp); - } - if ( !mxIsEmpty(arr) ) - { - if ( !mxIsDouble(arr) ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The second input (p) must be a column vector."); - } - if ( mxGetM(arr) != *dimp || mxGetN(arr) != 1 ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The second input (p) must be a column vector of length %d.", *dimp); - } - } - } - else - { - if ( *dimp > 0 ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "Run time parameters are required as a second input for evaluating this fcn."); - } - } -} - -/* THE mex-function */ -void mexFunction( solver_int nlhs, mxArray *plhs[], solver_int nrhs, const mxArray *prhs[] ) -{ - mxArray *arr; - solver_int nvar, neq, dimh, dimp, diml, dimu, dimhl, dimhu, stage, dimmul; - - // Allocate memory - solver_float *z, *p, *y, *l, *obj, *jacobj, *c, *jacc, *h, *jach, *hess; - - mxArray* c_mex; - mxArray* jacc_mex; - - - // get data - assignData(nrhs, prhs, &stage, &nvar, &neq, &dimh, &dimp, &diml, &dimu, &dimhl, &dimhu); - dimmul = diml+dimu+dimhl+dimhu; - - // Allocate memory - z = (solver_float *) malloc(sizeof(solver_float)*MAX(nvar,1)); - p = (solver_float *) malloc(sizeof(solver_float)*MAX(dimp,1)); - y = (solver_float *) malloc(sizeof(solver_float)*MAX(neq,1)); - l = (solver_float *) malloc(sizeof(solver_float)*MAX(dimmul,1)); - obj = (solver_float *) malloc(sizeof(solver_float)); - jacobj = (solver_float *) malloc(sizeof(solver_float)*MAX(nvar,1)); - c = (solver_float *) malloc(sizeof(solver_float)*MAX(neq,1)); - jacc = (solver_float *) malloc(sizeof(solver_float)*MAX(neq*nvar,1)); - h = (solver_float *) malloc(sizeof(solver_float)*MAX(dimh,1)); - jach = (solver_float *) malloc(sizeof(solver_float)*MAX(nvar*dimh,1)); - hess = (solver_float *) malloc(sizeof(solver_float)*MAX(nvar*nvar,1)); - - /* Initialize all inputs */ - arr = prhs[0]; - copyMArrayToC_TailoredSolver(mxGetPr(arr), z, nvar); - if (nrhs > 1) - { - arr = prhs[1]; - if ( !mxIsEmpty(arr) ) - { - copyMArrayToC_TailoredSolver(mxGetPr(arr), p, dimp); - } - } - memset(y, 0, sizeof(solver_float)*neq); - memset(l, 0, sizeof(solver_float)*dimmul); - memset(obj, 0, sizeof(solver_float)); - memset(jacobj, 0, sizeof(solver_float)*nvar); - memset(c, 0, sizeof(solver_float)*neq); - memset(jacc, 0, sizeof(solver_float)*neq*nvar); - memset(h, 0, sizeof(solver_float)*dimh); - memset(jach, 0, sizeof(solver_float)*dimh*nvar); - memset(hess, 0, sizeof(solver_float)*nvar*nvar); - - // Evaluate fcns and read output into mex format - TailoredSolver_adtool2forces(z, y, l, p, obj, jacobj, c, jacc, h, jach, hess, stage, 0, 0); - c_mex = mxCreateDoubleMatrix(neq, 1, mxREAL); - jacc_mex = mxCreateDoubleMatrix(neq, nvar, mxREAL); - copyCArrayToM_TailoredSolver(c, mxGetPr(c_mex), neq); - copyCArrayToM_TailoredSolver(jacc, mxGetPr(jacc_mex), neq*nvar); - plhs[0] = c_mex; - plhs[1] = jacc_mex; - - - // Free memory - free(z); free(p); free(y); free(l); free(obj); free(jacobj); free(c); free(jacc); free(h); free(jach); free(hess); -} \ No newline at end of file diff --git a/solver/codeGen/TailoredSolver/interface/TailoredSolver_inequalities_mex.c b/solver/codeGen/TailoredSolver/interface/TailoredSolver_inequalities_mex.c deleted file mode 100644 index 82c409d..0000000 --- a/solver/codeGen/TailoredSolver/interface/TailoredSolver_inequalities_mex.c +++ /dev/null @@ -1,238 +0,0 @@ -/* -TailoredSolver : A fast customized optimization solver. - -Copyright (C) 2013-2023 EMBOTECH AG [info@embotech.com]. All rights reserved. - - -This program is distributed in the hope that it will be useful. -EMBOTECH makes NO WARRANTIES with respect to the use of the software -without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. - -EMBOTECH shall not have any liability for any damage arising from the use -of the software. - -This Agreement shall exclusively be governed by and interpreted in -accordance with the laws of Switzerland, excluding its principles -of conflict of laws. The Courts of Zurich-City shall have exclusive -jurisdiction in case of any dispute. - -*/ - -#include "mex.h" -#include "math.h" -#include -#include "../include/TailoredSolver.h" -#ifndef SOLVER_STDIO_H -#define SOLVER_STDIO_H -#include -#endif - -typedef TailoredSolver_float solver_float; -typedef solver_int32_default solver_int; -#define NSTAGES ( 40 ) -#define MAX(X, Y) ((X) < (Y) ? (Y) : (X)) - -/* For compatibility with Microsoft Visual Studio 2015 */ -#if _MSC_VER >= 1900 -FILE _iob[3]; -FILE * __cdecl __iob_func(void) -{ - _iob[0] = *stdin; - _iob[1] = *stdout; - _iob[2] = *stderr; - return _iob; -} -#endif - -/* copy functions */ - -void copyCArrayToM_TailoredSolver(TailoredSolver_float *src, double *dest, solver_int32_default dim) -{ - solver_int32_default i; - for( i = 0; i < dim; i++ ) - { - *dest++ = (double)*src++; - } -} - -void copyCValueToM_TailoredSolver(TailoredSolver_float* src, double* dest) -{ - *dest = (double)*src; -} - -void copyMArrayToC_TailoredSolver(double *src, TailoredSolver_float *dest, solver_int32_default dim) -{ - solver_int32_default i; - for( i = 0; i < dim; i++ ) - { - *dest++ = (TailoredSolver_float) (*src++) ; - } -} - -void copyMValueToC_TailoredSolver(double * src, TailoredSolver_float * dest) -{ - *dest = (TailoredSolver_float) *src; -} - - - -extern solver_int32_default TailoredSolver_adtool2forces(TailoredSolver_float *x, TailoredSolver_float *y, TailoredSolver_float *l, TailoredSolver_float *p, TailoredSolver_float *f, TailoredSolver_float *nabla_f, TailoredSolver_float *c, TailoredSolver_float *nabla_c, TailoredSolver_float *h, TailoredSolver_float *nabla_h, TailoredSolver_float *hess, solver_int32_default stage, solver_int32_default iteration, solver_int32_default threadID); -TailoredSolver_extfunc pt2function_TailoredSolver = &TailoredSolver_adtool2forces; - - -static void getDims(const solver_int stage, solver_int* nvar, solver_int* neq, solver_int* dimh, - solver_int* dimp, solver_int* diml, solver_int* dimu, solver_int* dimhl, solver_int* dimhu) -{ - const solver_int nvarArr[NSTAGES] = {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; - const solver_int neqArr[NSTAGES] = {7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}; - const solver_int dimhArr[NSTAGES] = {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; - const solver_int dimpArr[NSTAGES] = {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}; - const solver_int dimlArr[NSTAGES] = {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; - const solver_int dimuArr[NSTAGES] = {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; - const solver_int dimhlArr[NSTAGES] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - const solver_int dimhuArr[NSTAGES] = {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; - - *nvar = nvarArr[stage]; - *neq = neqArr[stage]; - *dimh = dimhArr[stage]; - *dimp = dimpArr[stage]; - *diml = dimlArr[stage]; - *dimu = dimuArr[stage]; - *dimhl = dimhlArr[stage]; - *dimhu = dimhuArr[stage]; -} - -/* Checks all inputs and returns stage number (1-indexed) */ -static void assignData(solver_int nrhs, const mxArray *prhs[], solver_int * const stage, solver_int * const nvar, solver_int * const neq, - solver_int * const dimh, solver_int * const dimp, solver_int * const diml, solver_int * const dimu, solver_int * const dimhl, solver_int * const dimhu) -{ - mxArray *arr; - - if (nrhs > 3 || nrhs < 1) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "This function takes at least one input: z. And at most 3 inputs: z, p, stage."); - } - - // get stage - *stage = (solver_int) 1; - if (nrhs == 3) - { - arr = prhs[2]; - if ( !mxIsDouble(arr) ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The third input (stage number) must be an integer."); - } - *stage = (solver_int) *mxGetPr(arr); - } - if ( *stage < 1 || (NSTAGES) < *stage ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "Stage must be between %d and %d.", 1, (NSTAGES)); - } - - /* Get other dimensions */ - *stage -= 1; /* 0-indexed stages */ - getDims(*stage, nvar, neq, dimh, dimp, diml, dimu, dimhl, dimhu); - - /* Check that passed z and p have correct dims */ - arr = prhs[0]; - if ( !mxIsDouble(arr) ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The first input (z) must be a column vector."); - } - if ( mxGetM(arr) != *nvar || mxGetN(arr) != 1 ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The first input (z) must be a column vector of length %d.", *nvar); - } - if (nrhs > 1) - { - arr = prhs[1]; - if ( *dimp > 0 && mxIsEmpty(arr)) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The second input (p) must be a column vector of length %d.", *dimp); - } - if ( !mxIsEmpty(arr) ) - { - if ( !mxIsDouble(arr) ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The second input (p) must be a column vector."); - } - if ( mxGetM(arr) != *dimp || mxGetN(arr) != 1 ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The second input (p) must be a column vector of length %d.", *dimp); - } - } - } - else - { - if ( *dimp > 0 ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "Run time parameters are required as a second input for evaluating this fcn."); - } - } -} - -/* THE mex-function */ -void mexFunction( solver_int nlhs, mxArray *plhs[], solver_int nrhs, const mxArray *prhs[] ) -{ - mxArray *arr; - solver_int nvar, neq, dimh, dimp, diml, dimu, dimhl, dimhu, stage, dimmul; - - // Allocate memory - solver_float *z, *p, *y, *l, *obj, *jacobj, *c, *jacc, *h, *jach, *hess; - - mxArray* h_mex; - mxArray* jach_mex; - - - // get data - assignData(nrhs, prhs, &stage, &nvar, &neq, &dimh, &dimp, &diml, &dimu, &dimhl, &dimhu); - dimmul = diml+dimu+dimhl+dimhu; - - // Allocate memory - z = (solver_float *) malloc(sizeof(solver_float)*MAX(nvar,1)); - p = (solver_float *) malloc(sizeof(solver_float)*MAX(dimp,1)); - y = (solver_float *) malloc(sizeof(solver_float)*MAX(neq,1)); - l = (solver_float *) malloc(sizeof(solver_float)*MAX(dimmul,1)); - obj = (solver_float *) malloc(sizeof(solver_float)); - jacobj = (solver_float *) malloc(sizeof(solver_float)*MAX(nvar,1)); - c = (solver_float *) malloc(sizeof(solver_float)*MAX(neq,1)); - jacc = (solver_float *) malloc(sizeof(solver_float)*MAX(neq*nvar,1)); - h = (solver_float *) malloc(sizeof(solver_float)*MAX(dimh,1)); - jach = (solver_float *) malloc(sizeof(solver_float)*MAX(nvar*dimh,1)); - hess = (solver_float *) malloc(sizeof(solver_float)*MAX(nvar*nvar,1)); - - /* Initialize all inputs */ - arr = prhs[0]; - copyMArrayToC_TailoredSolver(mxGetPr(arr), z, nvar); - if (nrhs > 1) - { - arr = prhs[1]; - if ( !mxIsEmpty(arr) ) - { - copyMArrayToC_TailoredSolver(mxGetPr(arr), p, dimp); - } - } - memset(y, 0, sizeof(solver_float)*neq); - memset(l, 0, sizeof(solver_float)*dimmul); - memset(obj, 0, sizeof(solver_float)); - memset(jacobj, 0, sizeof(solver_float)*nvar); - memset(c, 0, sizeof(solver_float)*neq); - memset(jacc, 0, sizeof(solver_float)*neq*nvar); - memset(h, 0, sizeof(solver_float)*dimh); - memset(jach, 0, sizeof(solver_float)*dimh*nvar); - memset(hess, 0, sizeof(solver_float)*nvar*nvar); - - // Evaluate fcns and read output into mex format - TailoredSolver_adtool2forces(z, y, l, p, obj, jacobj, c, jacc, h, jach, hess, stage, 0, 0); - h_mex = mxCreateDoubleMatrix(dimh, 1, mxREAL); - jach_mex = mxCreateDoubleMatrix(dimh, nvar, mxREAL); - copyCArrayToM_TailoredSolver(h, mxGetPr(h_mex), dimh); - copyCArrayToM_TailoredSolver(jach, mxGetPr(jach_mex), dimh*nvar); - plhs[0] = h_mex; - plhs[1] = jach_mex; - - - // Free memory - free(z); free(p); free(y); free(l); free(obj); free(jacobj); free(c); free(jacc); free(h); free(jach); free(hess); -} \ No newline at end of file diff --git a/solver/codeGen/TailoredSolver/interface/TailoredSolver_lib.mdl b/solver/codeGen/TailoredSolver/interface/TailoredSolver_lib.mdl index 3902a8b..3162de2 100644 --- a/solver/codeGen/TailoredSolver/interface/TailoredSolver_lib.mdl +++ b/solver/codeGen/TailoredSolver/interface/TailoredSolver_lib.mdl @@ -60,13 +60,13 @@ Model { } } } - Created "5/15/2023 4:53:02 PM" + Created "12/19/2023 2:31:27 PM" Creator "embotech AG" UpdateHistory "UpdateHistoryNever" ModifiedByFormat "%" LastModifiedBy "embotech AG" ModifiedDateFormat "%" - LastModifiedDate "5/15/2023 4:53:02 PM" + LastModifiedDate "12/19/2023 2:31:27 PM" RTWModifiedTimeStamp 315310195 ModelVersionFormat "1.%" ConfigurationManager "None" diff --git a/solver/codeGen/TailoredSolver/interface/TailoredSolver_mex.c b/solver/codeGen/TailoredSolver/interface/TailoredSolver_mex.c index 9f3a581..ee97a99 100644 --- a/solver/codeGen/TailoredSolver/interface/TailoredSolver_mex.c +++ b/solver/codeGen/TailoredSolver/interface/TailoredSolver_mex.c @@ -136,13 +136,13 @@ extern solver_int32_default TailoredSolver_adtool2forces(TailoredSolver_float *x TailoredSolver_extfunc pt2function_TailoredSolver = &TailoredSolver_adtool2forces; -/* Some memory for mex-function */ +/* Some memory for MEX function */ static TailoredSolver_params params; static TailoredSolver_output output; static TailoredSolver_info info; static TailoredSolver_mem * mem; -/* THE mex-function */ +/* Main MEX function */ void mexFunction( solver_int32_default nlhs, mxArray *plhs[], solver_int32_default nrhs, const mxArray *prhs[] ) { /* file pointer for printing */ diff --git a/solver/codeGen/TailoredSolver/interface/TailoredSolver_objective_mex.c b/solver/codeGen/TailoredSolver/interface/TailoredSolver_objective_mex.c deleted file mode 100644 index 318c9aa..0000000 --- a/solver/codeGen/TailoredSolver/interface/TailoredSolver_objective_mex.c +++ /dev/null @@ -1,238 +0,0 @@ -/* -TailoredSolver : A fast customized optimization solver. - -Copyright (C) 2013-2023 EMBOTECH AG [info@embotech.com]. All rights reserved. - - -This program is distributed in the hope that it will be useful. -EMBOTECH makes NO WARRANTIES with respect to the use of the software -without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. - -EMBOTECH shall not have any liability for any damage arising from the use -of the software. - -This Agreement shall exclusively be governed by and interpreted in -accordance with the laws of Switzerland, excluding its principles -of conflict of laws. The Courts of Zurich-City shall have exclusive -jurisdiction in case of any dispute. - -*/ - -#include "mex.h" -#include "math.h" -#include -#include "../include/TailoredSolver.h" -#ifndef SOLVER_STDIO_H -#define SOLVER_STDIO_H -#include -#endif - -typedef TailoredSolver_float solver_float; -typedef solver_int32_default solver_int; -#define NSTAGES ( 40 ) -#define MAX(X, Y) ((X) < (Y) ? (Y) : (X)) - -/* For compatibility with Microsoft Visual Studio 2015 */ -#if _MSC_VER >= 1900 -FILE _iob[3]; -FILE * __cdecl __iob_func(void) -{ - _iob[0] = *stdin; - _iob[1] = *stdout; - _iob[2] = *stderr; - return _iob; -} -#endif - -/* copy functions */ - -void copyCArrayToM_TailoredSolver(TailoredSolver_float *src, double *dest, solver_int32_default dim) -{ - solver_int32_default i; - for( i = 0; i < dim; i++ ) - { - *dest++ = (double)*src++; - } -} - -void copyCValueToM_TailoredSolver(TailoredSolver_float* src, double* dest) -{ - *dest = (double)*src; -} - -void copyMArrayToC_TailoredSolver(double *src, TailoredSolver_float *dest, solver_int32_default dim) -{ - solver_int32_default i; - for( i = 0; i < dim; i++ ) - { - *dest++ = (TailoredSolver_float) (*src++) ; - } -} - -void copyMValueToC_TailoredSolver(double * src, TailoredSolver_float * dest) -{ - *dest = (TailoredSolver_float) *src; -} - - - -extern solver_int32_default TailoredSolver_adtool2forces(TailoredSolver_float *x, TailoredSolver_float *y, TailoredSolver_float *l, TailoredSolver_float *p, TailoredSolver_float *f, TailoredSolver_float *nabla_f, TailoredSolver_float *c, TailoredSolver_float *nabla_c, TailoredSolver_float *h, TailoredSolver_float *nabla_h, TailoredSolver_float *hess, solver_int32_default stage, solver_int32_default iteration, solver_int32_default threadID); -TailoredSolver_extfunc pt2function_TailoredSolver = &TailoredSolver_adtool2forces; - - -static void getDims(const solver_int stage, solver_int* nvar, solver_int* neq, solver_int* dimh, - solver_int* dimp, solver_int* diml, solver_int* dimu, solver_int* dimhl, solver_int* dimhu) -{ - const solver_int nvarArr[NSTAGES] = {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; - const solver_int neqArr[NSTAGES] = {7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}; - const solver_int dimhArr[NSTAGES] = {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; - const solver_int dimpArr[NSTAGES] = {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}; - const solver_int dimlArr[NSTAGES] = {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; - const solver_int dimuArr[NSTAGES] = {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}; - const solver_int dimhlArr[NSTAGES] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - const solver_int dimhuArr[NSTAGES] = {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; - - *nvar = nvarArr[stage]; - *neq = neqArr[stage]; - *dimh = dimhArr[stage]; - *dimp = dimpArr[stage]; - *diml = dimlArr[stage]; - *dimu = dimuArr[stage]; - *dimhl = dimhlArr[stage]; - *dimhu = dimhuArr[stage]; -} - -/* Checks all inputs and returns stage number (1-indexed) */ -static void assignData(solver_int nrhs, const mxArray *prhs[], solver_int * const stage, solver_int * const nvar, solver_int * const neq, - solver_int * const dimh, solver_int * const dimp, solver_int * const diml, solver_int * const dimu, solver_int * const dimhl, solver_int * const dimhu) -{ - mxArray *arr; - - if (nrhs > 3 || nrhs < 1) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "This function takes at least one input: z. And at most 3 inputs: z, p, stage."); - } - - // get stage - *stage = (solver_int) 1; - if (nrhs == 3) - { - arr = prhs[2]; - if ( !mxIsDouble(arr) ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The third input (stage number) must be an integer."); - } - *stage = (solver_int) *mxGetPr(arr); - } - if ( *stage < 1 || (NSTAGES) < *stage ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "Stage must be between %d and %d.", 1, (NSTAGES)); - } - - /* Get other dimensions */ - *stage -= 1; /* 0-indexed stages */ - getDims(*stage, nvar, neq, dimh, dimp, diml, dimu, dimhl, dimhu); - - /* Check that passed z and p have correct dims */ - arr = prhs[0]; - if ( !mxIsDouble(arr) ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The first input (z) must be a column vector."); - } - if ( mxGetM(arr) != *nvar || mxGetN(arr) != 1 ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The first input (z) must be a column vector of length %d.", *nvar); - } - if (nrhs > 1) - { - arr = prhs[1]; - if ( *dimp > 0 && mxIsEmpty(arr)) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The second input (p) must be a column vector of length %d.", *dimp); - } - if ( !mxIsEmpty(arr) ) - { - if ( !mxIsDouble(arr) ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The second input (p) must be a column vector."); - } - if ( mxGetM(arr) != *dimp || mxGetN(arr) != 1 ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "The second input (p) must be a column vector of length %d.", *dimp); - } - } - } - else - { - if ( *dimp > 0 ) - { - mexErrMsgIdAndTxt("FORCESPRO:IncorrectInputs", "Run time parameters are required as a second input for evaluating this fcn."); - } - } -} - -/* THE mex-function */ -void mexFunction( solver_int nlhs, mxArray *plhs[], solver_int nrhs, const mxArray *prhs[] ) -{ - mxArray *arr; - solver_int nvar, neq, dimh, dimp, diml, dimu, dimhl, dimhu, stage, dimmul; - - // Allocate memory - solver_float *z, *p, *y, *l, *obj, *jacobj, *c, *jacc, *h, *jach, *hess; - - mxArray* obj_mex; - mxArray* gradobj_mex; - - - // get data - assignData(nrhs, prhs, &stage, &nvar, &neq, &dimh, &dimp, &diml, &dimu, &dimhl, &dimhu); - dimmul = diml+dimu+dimhl+dimhu; - - // Allocate memory - z = (solver_float *) malloc(sizeof(solver_float)*MAX(nvar,1)); - p = (solver_float *) malloc(sizeof(solver_float)*MAX(dimp,1)); - y = (solver_float *) malloc(sizeof(solver_float)*MAX(neq,1)); - l = (solver_float *) malloc(sizeof(solver_float)*MAX(dimmul,1)); - obj = (solver_float *) malloc(sizeof(solver_float)); - jacobj = (solver_float *) malloc(sizeof(solver_float)*MAX(nvar,1)); - c = (solver_float *) malloc(sizeof(solver_float)*MAX(neq,1)); - jacc = (solver_float *) malloc(sizeof(solver_float)*MAX(neq*nvar,1)); - h = (solver_float *) malloc(sizeof(solver_float)*MAX(dimh,1)); - jach = (solver_float *) malloc(sizeof(solver_float)*MAX(nvar*dimh,1)); - hess = (solver_float *) malloc(sizeof(solver_float)*MAX(nvar*nvar,1)); - - /* Initialize all inputs */ - arr = prhs[0]; - copyMArrayToC_TailoredSolver(mxGetPr(arr), z, nvar); - if (nrhs > 1) - { - arr = prhs[1]; - if ( !mxIsEmpty(arr) ) - { - copyMArrayToC_TailoredSolver(mxGetPr(arr), p, dimp); - } - } - memset(y, 0, sizeof(solver_float)*neq); - memset(l, 0, sizeof(solver_float)*dimmul); - memset(obj, 0, sizeof(solver_float)); - memset(jacobj, 0, sizeof(solver_float)*nvar); - memset(c, 0, sizeof(solver_float)*neq); - memset(jacc, 0, sizeof(solver_float)*neq*nvar); - memset(h, 0, sizeof(solver_float)*dimh); - memset(jach, 0, sizeof(solver_float)*dimh*nvar); - memset(hess, 0, sizeof(solver_float)*nvar*nvar); - - // Evaluate fcns and read output into mex format - TailoredSolver_adtool2forces(z, y, l, p, obj, jacobj, c, jacc, h, jach, hess, stage, 0, 0); - obj_mex = mxCreateDoubleMatrix(1, 1, mxREAL); - gradobj_mex = mxCreateDoubleMatrix(nvar, 1, mxREAL); - copyCArrayToM_TailoredSolver(obj, mxGetPr(obj_mex), 1); - copyCArrayToM_TailoredSolver(jacobj, mxGetPr(gradobj_mex), nvar); - plhs[0] = obj_mex; - plhs[1] = gradobj_mex; - - - // Free memory - free(z); free(p); free(y); free(l); free(obj); free(jacobj); free(c); free(jacc); free(h); free(jach); free(hess); -} \ No newline at end of file diff --git a/solver/codeGen/TailoredSolver/interface/TailoredSolver_py.py b/solver/codeGen/TailoredSolver/interface/TailoredSolver_py.py index b63471c..699aa54 100644 --- a/solver/codeGen/TailoredSolver/interface/TailoredSolver_py.py +++ b/solver/codeGen/TailoredSolver/interface/TailoredSolver_py.py @@ -18,7 +18,7 @@ # #def __init__(): ''' -a Python wrapper for a fast solver generated by FORCESPRO v6.1.0 +a Python wrapper for a fast solver generated by FORCESPRO v6.3.0 OUTPUT = TailoredSolver_py.TailoredSolver_solve(PARAMS) solves a multistage problem subject to the parameters supplied in the following dictionary: @@ -197,7 +197,7 @@ class TailoredSolver_mem(ctypes.Structure): def TailoredSolver_solve(params_arg): ''' -a Python wrapper for a fast solver generated by FORCESPRO v6.1.0 +a Python wrapper for a fast solver generated by FORCESPRO v6.3.0 OUTPUT = TailoredSolver_py.TailoredSolver_solve(PARAMS) solves a multistage problem subject to the parameters supplied in the following dictionary: diff --git a/solver/codeGen/TailoredSolver/interface/TailoredSolver_simulinkBlock.c b/solver/codeGen/TailoredSolver/interface/TailoredSolver_simulinkBlock.c index cb84f34..5afcdcb 100644 --- a/solver/codeGen/TailoredSolver/interface/TailoredSolver_simulinkBlock.c +++ b/solver/codeGen/TailoredSolver/interface/TailoredSolver_simulinkBlock.c @@ -56,15 +56,15 @@ static void mdlInitializeSizes(SimStruct *S) DECL_AND_INIT_DIMSINFO(outputDimsInfo); ssSetNumSFcnParams(S, 0); if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) - { - return; /* Parameter mismatch will be reported by Simulink */ + { + return; /* Parameter mismatch will be reported by Simulink */ } - /* initialize size of continuous and discrete states to zero */ + /* initialize size of continuous and discrete states to zero */ ssSetNumContStates(S, 0); ssSetNumDiscStates(S, 0); - /* initialize input ports - there are 7 in total */ + /* initialize input ports - there are 7 in total */ if (!ssSetNumInputPorts(S, 7)) return; /* Input Port 0 */ @@ -118,9 +118,9 @@ static void mdlInitializeSizes(SimStruct *S) - /* initialize output ports - there are 2 in total */ + /* initialize output ports - there are 2 in total */ if (!ssSetNumOutputPorts(S, 2)) return; - + /* Output Port 0 */ ssSetOutputPortMatrixDimensions(S, 0, 160, 1); ssSetOutputPortDataType(S, 0, SS_DOUBLE); @@ -132,10 +132,10 @@ static void mdlInitializeSizes(SimStruct *S) ssSetOutputPortComplexSignal(S, 1, COMPLEX_NO); /* no complex signals suppported */ - /* set sampling time */ + /* set sampling time */ ssSetNumSampleTimes(S, 1); - /* set internal memory of block */ + /* set internal memory of block */ ssSetNumRWork(S, 0); ssSetNumIWork(S, 0); ssSetNumPWork(S, 0); @@ -143,11 +143,11 @@ static void mdlInitializeSizes(SimStruct *S) ssSetNumNonsampledZCs(S, 0); /* Take care when specifying exception free code - see sfuntmpl_doc.c */ - /* SS_OPTION_USE_TLC_WITH_ACCELERATOR removed */ - /* SS_OPTION_USE_TLC_WITH_ACCELERATOR removed */ + /* SS_OPTION_USE_TLC_WITH_ACCELERATOR removed */ + /* SS_OPTION_USE_TLC_WITH_ACCELERATOR removed */ /* ssSetOptions(S, (SS_OPTION_EXCEPTION_FREE_CODE | - SS_OPTION_WORKS_WITH_CODE_REUSE)); */ - ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE ); + SS_OPTION_WORKS_WITH_CODE_REUSE)); */ + ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE); } #if defined(MATLAB_MEX_FILE) @@ -209,13 +209,13 @@ static void mdlSetDefaultPortDataTypes(SimStruct *S) */ static void mdlOutputs(SimStruct *S, int_T tid) { - solver_int32_default i, j, k; - - /* file pointer for printing */ - FILE *fp = NULL; + solver_int32_default i, j, k; + + /* file pointer for printing */ + FILE *fp = NULL; - /* Simulink data */ - const real_T *lb = (const real_T*) ssGetInputPortSignal(S,0); + /* Simulink data */ + const real_T *lb = (const real_T*) ssGetInputPortSignal(S,0); const real_T *ub = (const real_T*) ssGetInputPortSignal(S,1); const real_T *hu = (const real_T*) ssGetInputPortSignal(S,2); const real_T *xinit = (const real_T*) ssGetInputPortSignal(S,3); @@ -227,15 +227,16 @@ static void mdlOutputs(SimStruct *S, int_T tid) real_T *X = (real_T*) ssGetOutputPortSignal(S,1); - /* Solver data */ - static TailoredSolver_params params; - static TailoredSolver_output output; - static TailoredSolver_info info; + /* Solver data + * Note: mem struct may store a state in case of warm-starting */ + static TailoredSolver_params params; + static TailoredSolver_output output; + static TailoredSolver_info info; static TailoredSolver_mem * mem; - solver_int32_default solver_exitflag; + solver_int32_default solver_exitflag; - /* Copy inputs */ - for(i = 0; i < 320; i++) + /* Copy inputs */ + for(i = 0; i < 320; i++) { params.lb[i] = (double) lb[i]; } @@ -270,35 +271,35 @@ static void mdlOutputs(SimStruct *S, int_T tid) #if SET_PRINTLEVEL_TailoredSolver > 0 - /* Prepare file for printfs */ + /* Prepare file for printfs */ fp = fopen("stdout_temp","w+"); - if( fp == NULL ) - { - mexErrMsgTxt("freopen of stdout did not work."); - } - rewind(fp); - #endif + if( fp == NULL ) + { + mexErrMsgTxt("freopen of stdout did not work."); + } + rewind(fp); + #endif if (mem == NULL) { mem = TailoredSolver_internal_mem(0); } - /* Call solver */ - solver_exitflag = TailoredSolver_solve(¶ms, &output, &info, mem, fp , pt2function_TailoredSolver); - - #if SET_PRINTLEVEL_TailoredSolver > 0 - /* Read contents of printfs printed to file */ - rewind(fp); - while( (i = fgetc(fp)) != EOF ) - { - ssPrintf("%c",i); - } - fclose(fp); - #endif + /* Call solver */ + solver_exitflag = TailoredSolver_solve(¶ms, &output, &info, mem, fp , pt2function_TailoredSolver); - /* Copy outputs */ - for(i = 0; i < 160; i++) + #if SET_PRINTLEVEL_TailoredSolver > 0 + /* Read contents of printfs printed to file */ + rewind(fp); + while( (i = fgetc(fp)) != EOF ) + { + ssPrintf("%c",i); + } + fclose(fp); + #endif + + /* Copy outputs */ + for(i = 0; i < 160; i++) { U[i] = (real_T) output.U[i]; } diff --git a/solver/codeGen/TailoredSolver/interface/TailoredSolver_simulinkBlockcompact.c b/solver/codeGen/TailoredSolver/interface/TailoredSolver_simulinkBlockcompact.c index 2d5921e..726c488 100644 --- a/solver/codeGen/TailoredSolver/interface/TailoredSolver_simulinkBlockcompact.c +++ b/solver/codeGen/TailoredSolver/interface/TailoredSolver_simulinkBlockcompact.c @@ -56,15 +56,15 @@ static void mdlInitializeSizes(SimStruct *S) DECL_AND_INIT_DIMSINFO(outputDimsInfo); ssSetNumSFcnParams(S, 0); if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) - { - return; /* Parameter mismatch will be reported by Simulink */ + { + return; /* Parameter mismatch will be reported by Simulink */ } - /* initialize size of continuous and discrete states to zero */ + /* initialize size of continuous and discrete states to zero */ ssSetNumContStates(S, 0); ssSetNumDiscStates(S, 0); - /* initialize input ports - there are 7 in total */ + /* initialize input ports - there are 7 in total */ if (!ssSetNumInputPorts(S, 7)) return; /* Input Port 0 */ @@ -118,19 +118,19 @@ static void mdlInitializeSizes(SimStruct *S) - /* initialize output ports - there are 1 in total */ + /* initialize output ports - there are 1 in total */ if (!ssSetNumOutputPorts(S, 1)) return; - + /* Output Port 0 */ ssSetOutputPortMatrixDimensions(S, 0, 320, 1); ssSetOutputPortDataType(S, 0, SS_DOUBLE); ssSetOutputPortComplexSignal(S, 0, COMPLEX_NO); /* no complex signals suppported */ - /* set sampling time */ + /* set sampling time */ ssSetNumSampleTimes(S, 1); - /* set internal memory of block */ + /* set internal memory of block */ ssSetNumRWork(S, 0); ssSetNumIWork(S, 0); ssSetNumPWork(S, 0); @@ -138,11 +138,11 @@ static void mdlInitializeSizes(SimStruct *S) ssSetNumNonsampledZCs(S, 0); /* Take care when specifying exception free code - see sfuntmpl_doc.c */ - /* SS_OPTION_USE_TLC_WITH_ACCELERATOR removed */ - /* SS_OPTION_USE_TLC_WITH_ACCELERATOR removed */ + /* SS_OPTION_USE_TLC_WITH_ACCELERATOR removed */ + /* SS_OPTION_USE_TLC_WITH_ACCELERATOR removed */ /* ssSetOptions(S, (SS_OPTION_EXCEPTION_FREE_CODE | - SS_OPTION_WORKS_WITH_CODE_REUSE)); */ - ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE ); + SS_OPTION_WORKS_WITH_CODE_REUSE)); */ + ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE); } #if defined(MATLAB_MEX_FILE) @@ -204,13 +204,13 @@ static void mdlSetDefaultPortDataTypes(SimStruct *S) */ static void mdlOutputs(SimStruct *S, int_T tid) { - solver_int32_default i, j, k; - - /* file pointer for printing */ - FILE *fp = NULL; + solver_int32_default i, j, k; + + /* file pointer for printing */ + FILE *fp = NULL; - /* Simulink data */ - const real_T *lb = (const real_T*) ssGetInputPortSignal(S,0); + /* Simulink data */ + const real_T *lb = (const real_T*) ssGetInputPortSignal(S,0); const real_T *ub = (const real_T*) ssGetInputPortSignal(S,1); const real_T *hu = (const real_T*) ssGetInputPortSignal(S,2); const real_T *xinit = (const real_T*) ssGetInputPortSignal(S,3); @@ -221,15 +221,16 @@ static void mdlOutputs(SimStruct *S, int_T tid) real_T *outputs = (real_T*) ssGetOutputPortSignal(S,0); - /* Solver data */ - static TailoredSolver_params params; - static TailoredSolver_output output; - static TailoredSolver_info info; + /* Solver data + * Note: mem struct may store a state in case of warm-starting */ + static TailoredSolver_params params; + static TailoredSolver_output output; + static TailoredSolver_info info; static TailoredSolver_mem * mem; - solver_int32_default solver_exitflag; + solver_int32_default solver_exitflag; - /* Copy inputs */ - for(i = 0; i < 320; i++) + /* Copy inputs */ + for(i = 0; i < 320; i++) { params.lb[i] = (double) lb[i]; } @@ -264,35 +265,35 @@ static void mdlOutputs(SimStruct *S, int_T tid) #if SET_PRINTLEVEL_TailoredSolver > 0 - /* Prepare file for printfs */ + /* Prepare file for printfs */ fp = fopen("stdout_temp","w+"); - if( fp == NULL ) - { - mexErrMsgTxt("freopen of stdout did not work."); - } - rewind(fp); - #endif + if( fp == NULL ) + { + mexErrMsgTxt("freopen of stdout did not work."); + } + rewind(fp); + #endif if (mem == NULL) { mem = TailoredSolver_internal_mem(0); } - /* Call solver */ - solver_exitflag = TailoredSolver_solve(¶ms, &output, &info, mem, fp , pt2function_TailoredSolver); - - #if SET_PRINTLEVEL_TailoredSolver > 0 - /* Read contents of printfs printed to file */ - rewind(fp); - while( (i = fgetc(fp)) != EOF ) - { - ssPrintf("%c",i); - } - fclose(fp); - #endif + /* Call solver */ + solver_exitflag = TailoredSolver_solve(¶ms, &output, &info, mem, fp , pt2function_TailoredSolver); - /* Copy outputs */ - for(i = 0; i < 160; i++) + #if SET_PRINTLEVEL_TailoredSolver > 0 + /* Read contents of printfs printed to file */ + rewind(fp); + while( (i = fgetc(fp)) != EOF ) + { + ssPrintf("%c",i); + } + fclose(fp); + #endif + + /* Copy outputs */ + for(i = 0; i < 160; i++) { outputs[i] = (real_T) output.U[i]; } diff --git a/solver/codeGen/TailoredSolver/interface/TailoredSolvercompact_lib.mdl b/solver/codeGen/TailoredSolver/interface/TailoredSolvercompact_lib.mdl index 1170256..2204f07 100644 --- a/solver/codeGen/TailoredSolver/interface/TailoredSolvercompact_lib.mdl +++ b/solver/codeGen/TailoredSolver/interface/TailoredSolvercompact_lib.mdl @@ -60,13 +60,13 @@ Model { } } } - Created "5/15/2023 4:53:02 PM" + Created "12/19/2023 2:31:27 PM" Creator "embotech AG" UpdateHistory "UpdateHistoryNever" ModifiedByFormat "%" LastModifiedBy "embotech AG" ModifiedDateFormat "%" - LastModifiedDate "5/15/2023 4:53:02 PM" + LastModifiedDate "12/19/2023 2:31:27 PM" RTWModifiedTimeStamp 315310195 ModelVersionFormat "1.%" ConfigurationManager "None" diff --git a/solver/codeGen/TailoredSolver/lib/libTailoredSolver.a b/solver/codeGen/TailoredSolver/lib/libTailoredSolver.a index eb5027b57062ecb890e60f151833ef5b2b5a390e..ec1b9885e36423ea7821b664a4b14632fc8f03d8 100644 GIT binary patch delta 3142 zcmZYB4{Q`w9tZH>oA+jSW_D(`EtS&BmL;{Y{;6GRq1?%)pax5@Py|JyP2sQtXa7J8 z)LJN8{a23a53^+&$|*A{G79ND-;)pG9Jkx+N>t zG&Hx=Ke@QMVPkzu{}ZHwCT1q^gE+gJ)EqfQR(`c)?%x6CobKKU0AJs2$37lU=yrUG z$AX6dJ|R5tQ7`jm;&wZ}%HygFb{yhy!AU#5&f}G2|E4p~XB}Ibs*iN%mjP5IVdp=e zI+FLz(r<%Rr|;MJm~`U+DJEM^UCk=yzu@$aD!vydC90it>T33WuoP|+7PtlrZ3fY?OjMA0~g}?l8 zx%{n)M^_eI-amE4hP~qwvo{xg_ii+{`_96;hI`V}X3%pg8nbBGmWZJ<2nI-4r6J2y zG!_gSR1c^Th49}R1S2Y80W)kVngLV~nN+u!qJj|)MFLuoghK{16mS*bV5Me;U3X!nM6dKUL2&#GwSSBc1m=ZO>f+5`iB}fB?riYjn zHVLSp>Y8C_h8AW)LV^TLP_?k8DyF6>3T0p#s;Ma!QTY#I669;UB^^uBoeA;=9%!U_ z`9A~z6d({g?3}z>r-5P|5nLK{I3@W$$qi^VaeiHL;)v7#h~#sa6r98V8pPxo$*Uz- zVWZ%!l2h+F{ZC1L7Y8^OT$DWezSAG3POIzqO%olTKc1gK0t}WrV=)muXG22EQ;RQ;EiEF2_ zTz+?Sp|zgxpvNAs!Nf760d`?haKFulcYWMZuVAC#L0LV??U(I-91#4rP{ z;3dulze_&rW7WdKjr?&Fvag~B!#>Z(>WzH%Jjwi3IcAIEX2C@^>o9u^0^E)V1eZ## z@$qyV5qz)YXM8*dtv1dNO78V>H6{fwmMmWIH*d?ZQE;8)ZBe5ak} zF+M7*{}36czUZa>Ui#Qe883}`>9R<8zK7+qush4GUb@{&rCzG^(p)bsaT9qQtJ`U* z`e(O8UF)SbFKzSEb6)E65{iVAds!|C<8^)-Ci0FPeqa9fSLZZbT&39IuvfCsOMkJ8 z&v)Ovo}WFv;-%|eQX_KRiW$Kdp5dp{?NAH6G}%pLX1cb6z8z3juEwrSbX+>Jl^#{J z4NYs-)wQ;_rq6Dtr8CHawE7`kSVBHcKXQ>iI7_+Gi?7|r=F*1=U}ZOp;%FzEKvEbj zW|cHmPVKipW;$6GZZEcFfD1W+BceHs(J8zc!dlVH#sS{ot5cYU7pAb8bnpC|>mQiP z>tDv&seI^TI3SvXI3k)FjK*1|akSleS-foyMq_RaZU%z%YT565?9H6zRO1_{0Y|yepd46LVGrl z--xgm_i-k}c7vG?7W98U<98iwU%G7*BMSK<-QLN5Cwyh?DZZqmcr3+w$Pt{=#bQeN zJ$pjMI2>o1I<2C-Jm##YFMXw5<1tTEj zQ4i3{iJ|;*i=d^IZD?inbY|JVVKtOxEp)l4&1xANO=oM4)j9W`%eA}CrswPLbN<~w zzV}|(llVh-Vs}|e6{6X(|Nd#O+EX=x7xv`g**y`g_QY@j$;(~T^AVnpHyj%Lwy z`UFBHL!B=mgt{+Sv75yX(~5gpymA*pA7d8SsFzq*eaMP0vl!cH#Q_%8A}b!?)h~Mv z3_qW6dD`0b!OqYEgi4E|bxGAni_biAHvUQ(dS*Lt+(FZdZmneiMnCYT3w2$BwOX=MCt5-oS%y<+N4Vv6@w&q#yT?;LKRp z*?t^9+b@0BD*fFae?6USOYwfn)q}-*gvoHU0bIR}d1F5o!Ns#&!Euc$&pB7LJY!clsBSoSpAR9i@uOosrNu>%RDl+^y z;4`T#>57IVIe;|3;ln0XbfT6cip+q{Hc|{(^=SlQSuv4c)dPl)P)$OrD(QagSA1AU zx~w3>B&O=eSmLKL*rwD}0s%J7P&J<)*!A56Z?{nzzpaSu$PMjR5Rwo^WAE5En!N>9 z8-?KrNe!j?5JLrxv0=QGve$~YOqk^S1Yb z)tGAUx&S9RUuTTj?OB>{*GmMeFwQwi<4pKpR!b0^ z3F);Y6>g~|>a;OYbF2tfFbkEjsr;%Yj@zCpyb)SCcUdb_^zL+6r1Nkg!3}NFN)Qj zv#o(X&J`B3$0^&>oU?6$Va`p0Cp_E*lbk^;UN!X`?Nwff@D|30EhgxcIFhsYhfu-! zE5Y3!9)(?;e-Voh#cD+&@@d{kztn2p4$Ha$Q zu3-azRj8Ky` zM@8ZsQ#0Ej+`xA15KB5Y!SUyzg7Y51X--}A0J}K%iN&3Fz!~)#oaB5+@ZC;b^haQv z^ZSCGTj-2B0qNTqe2^4YGtf#7?-#r|J2)hEd$-8kXKYi^u$BMnYn ze!z{1ZVb6G*NMsT))vyE(E5$d)$v)+kQ0(w-&EgF9jV+_vvJF|>dN?~7|F@Uo8u`b zNO>549Ah_<4G%zgE-fYliwJ+XDKN2}CcxggmJBk% zqcG09Zy-F6b*CW0I{0HARpGsPv=B#OoE69iWjD@Wlf~vAgGd&eQ3r#(I}PLZzrxwH z*gx9DzNJ}P6omPmbcPnGj?`{#nqQmKvj=C(3-SvKGpygc8S%ff>0hg`AO38nsr+WJ zrXcn+;6E)HGFxa4Of*vpYg%Y>=yt}5{L@_w6F+6pYG`j^>ueG{R&Klam_}Xj4rAPB zbuiXKeQ>RXzWT;XPg4mWi|^k~|G~Hv_D9(Ty$R=|vUOrlmc;gcR(dq9~PFR}jYA zT*B}kZTGM)T2$We_9>E%b+ZOTM^h0nH9>Q*hfroJR+RTTckQ$H^kDxnYp>sLt-bbI zd!2pG46e0YUTbMc!|5AFmg}!-kUDlWZ<&a#i&JHFte0AqxQM^V)vA*DwDLg244kFB5s`*1Ek`1z z?!aRdOIr%oDYvveiq9&IF!!_^Xq%>;o}Oz*sBiU*K)~tpnrmY)LPhl{lXGBI_b29r zT6JH}`kav}(*4mv0Qxph=jP`@bJk}Xm05@HvF^^cqrMSzrTWZUdIcbI-cUX`Ts$%f zd_Tyej!zW?0tcj7pu_U#`VN6=-aTBPYuB5uXDd^Wtivl>K0Wdv#=Df%_DPfONT5_s zHi$A;kGZx*4Jgf-Y)7}bv;BoNZMd-Jze43c0EUbU!E&18`)Q7!$_m_Lbijek#31{=xE2W13}SQbGf-VH zys(k(Smk+tuM&@y*qErV7oV>>p%F}8I)VcHr6>l{`0k@nJIsz+`z-E#;GC|k>P%WQFj3vlc@Sl;@6E0Q{|yBCvVRE#TwZrUa-z9*G9+g9 zM7F91U1rzMpqJI;>;xT|UHwdZi)lSfdxdF7L34N^Qa$MTA43{6^QS<8By*ky**{N- z?HVKRLh2s2D|dC(5A#7aAvc_F-nbv)di z=!TtC)OZDa+?jQ-%sqT7=qqKj$MRjjIe{kO2B7Z@G~ynbRS``K5J+`3i2kf!p+h~j z$!mc#dp0Ilfdp4f99sBpTOw#2@i zTzC%POt5=@zatO`Kn^~edJ5u=K)}%jnSKCz|47haM-Pn+w&k1ID)6piIcdeGm6VfB zX&+>$iT($K`;waKNoQ7TnLBeEAS)#`Raiq&uAa=DxcFvjoU`wQ0OtvD3f$6EFoTqG zRS}s5qVKJXykVR5E2EV9Q;xV#9jg6)DtN=b&!8R3=~E?mtup!ZHhHhr z4i|~!QFN!fMwrGHA*A*_SiJ=LFgSXcZieZiuheNHOz&(}r*Fb^Fh|*OE@jNq z^P%a@wTm<0PKmn|2>7H@ihzOBU7Ji-g6nqc)g(BTF-H}_pJjP}ZdIvyT?{xlbI|kW z%35ysM`j2YN0W!c@dNSeM}v1!{TR>BNzn0I=sGpeBriiN?*niv=?TYkaTFOJf%7u9 zsrOUn!(n#xeiKA2a$gv5Hq~j}I;j6s^n!9r&Cn0#-O^&vo|E44G)3U)IK=_?4;1&l zQE)_u3f*l^_dfGSlbkjCu;UkJ*2&7N&ics7#1aX%H<7uKxD(J>tj%#BKOz%HT!XYJgfy5>?O-UdM+*ga-?XE+s<`vXQmE>X!jx$G6yv}ql2xnc6nMB3n3VG!Z>Y=YA z4YBxPyp#;Y;t|%F0J;KC#e(%T%Gc%GxJ1(8aE5Tn?s+f{j}UPS`D;AR!)4^-cxGOyN_nNt{_B<$!~Zby zxt#En(BX5X-@#`4uZJ}ulK@Ecoec50&|SZCvdZ;w#OLam`8(HWq<(v5{f-<|k;c1& zD?K+GW@K73R{rL1#vXsO(DAH**Lrr26KfaAquxn`K9&+ZxkS8GyT)wLYmiQhLnSf9 zWE5nLF4Q3EwUSxDpvy>Smas-^3^fU|0g3t$qo_A&1PK{JL(E!PheJaQ8l#|>ut_T- zos5jK6e8*jrckYbHE>fH1g%ao$wqx>2-YAGnL===Q6q?285wkv{w`!PB0&xnv82`L zLi7eC=tQkS)`w_Jp+<}(B?K{m*t8Xd+ujEqQE~26JNMFe*WU|LHMYR$4o*8c{U{mnIe0e& z=>&!^g4O8QM`ls_drn)D7~IWiE2*aR49JJZo|(evx0yiCl4eRbaeCQJ3@_*OVbV+K zfuMIP!94I#Njhn?m7GSS86L+A@gl+9K=0yo!+1uQX_@?tI4C{9>1BC;ro%}I zr5#|cmXY5vLGPJl1EtG3o%bg5?lv>Ip0onJ=3P#sHU_(yK*s>bC>rHmva1NZfYs5> z?Hh*J|H|#Fj{n(S(y`qo?q~kROrU6nles-&Sj;4DbeS9FaHCbEx(8C&12jgVsQ7g_ za~RH0#_uD|ln!uj{{aTy!vva0dMRBFcQdU|qmSVZPB)RTGeGxndgeifPvU12N%ARu zD_mvj1M(@OFLUqJWI51|Mcc(KgzL)`5>6}O?PE>@=C)v=Fs(r6u= zE*?UELGW2PtcyUan`vju*|>W++zE6Se!dG0kCw#oo!_%)@I0!+!SQ!E4yrmPalC`C z6WrY#hOa?8IKl5lRLLD0hd8_x#QRxbcmt^8ZH}WphOgtr-p+CV1%`(+bF`P^UKM{F zp&)T2xDao*h1|i<@qh3Q1vCDEA4xWxuZe$r^w1VWH6K%Mf zEC=CufrqH#A%c~9o#S49*1<~cBwN5O#>*FP9P;vMC!IjAIm79yA@sMwX#9Ez7T{OF zX@@3$!4mf~fhNE!hIZ(jDXajzE~r4oZK#pw7QAL2V)pl=nL`|&M%%RV}FT2}?1#*%gNciz1dQ=jrfEql)$B}6VPZBD%b2KPf-td{`TdJ& zpD^Jk)nCCXgG>t{y;MtJB3l(P_rh~Z(?j$d0tUQ%)UlF;eGSG?IqE~0*u}&_Cc2rp zu8Kl)7|k*oHS9>`OE6&toCZiIEWlLGrgQtDRmmp!8;CfMiN}cpG^ren)#HE-QCiyk z8?c)J?Eoav1H<2vR=U7thHK#I4X3!2z-Lx6;)3|5=8=*Wj}Y@EahT_)3*y6CVZkG$ zvkyLe=U)={2y*4pN0-lEv1)}U<%*~m$IYKp^6297iqeI%%NIXUS}}G3T2i{Cykb@1 z(v_tZOG_3H;XPBXiCJ1t<*(u!60X=3qZz07^TY4jG)prDcWv4LzvDM`!mmuiux5$@ PU10SYA5QMSF2?^K)*D5N delta 5587 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 W0KaiWkJWeT!+Ur+Y-Ao*5B(oPz**-2 diff --git a/solver/codeGen/TailoredSolver/lib/libTailoredSolver_withModel.so b/solver/codeGen/TailoredSolver/lib/libTailoredSolver_withModel.so index d258fc03aae79a9a1d03d6832fe253cddef0eecb..2f4bd2722fa5466278111c0ec1773f8bf040ea7e 100755 GIT binary patch delta 5992 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 delta 6145 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 L;bC-bP!s+aCie`Y diff --git a/solver/codeGen/TailoredSolver/lib_target/libTailoredSolver.a b/solver/codeGen/TailoredSolver/lib_target/libTailoredSolver.a index 6ad62c5dcb80c6b7fb5ab1af60b739c0e3558660..7f241bce0e01778406b55aadd18057b587e739b3 100644 GIT binary patch delta 16981 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 Y&zR>pZ19C!}Ur>bd6Kg^(2}07~iIxa0 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 diff --git a/solver/codeGen/TailoredSolver/lib_target/libTailoredSolver.so b/solver/codeGen/TailoredSolver/lib_target/libTailoredSolver.so index a7d29a4b8cb2d1d35ccc5eca08ebcb821400d0e4..a311cde53bd51120b1242ce11bc52a3725673e8e 100755 GIT binary patch delta 18957 zcmZXc30zM3_s8$jQ%`9{Dp{fsqZA@$qQ>?hG&6?mF(hM)v1ERhj50N8#3QF+m@<~e z8X{X1V;xJ3rD2RPc&w8>OZtD#{oa1R$^Uu1X3lfY=Y7xl-h0pYZqH3|g7dKi=QLm0 zxTxtw+b33%_Q~0r)mE-i{pq9F@=>k-f^Q~|E2Y$Wh)%N@HEGu)QjkE1_MUtE) zH|d;tuC<#-T22$Or2hYJpjMacC1>+isIf~_E#662E!wi~SoXSg+orX?go{rt{8wFa zkaBfe3*vt)bFK(;n2nnpx_yAno@&Oz1KyG;)lg{mtPyOSt2semn+MhCCbu*HT*Fs( z-hQ&iq2cl-bK2BK^0(%lQ^&|d%wE$P$!)iHopzy5H?L0Kl4KbhUQuC6EO1KjkR>TR zwb2J3BWv;@r}_z6aZ_rDhZecK{}=+61wD2A20T-0(AzNch$DS#t_|~+EH0cXH7NR~ z0wu(3K5-}~TCzO|r>0VKB#1IA_`L9`a!*$wO_X!p>r8?XXGkzUAZrb-ht|?Mt0k-y^<`E}aedyxNE`cwiJ16_SY>4r8 zP7ZnuYw5kAqGDc|?36GQTNmh~I_9Di4doN&rzZkD6PZjl#ItF4aGGOuvg;HP8f)(G zTe{rTeEzp-4vRgJCtn*zP_()K$wm(T4ZNj7i*xcpEbL`YKG|^2&5yM4oP&u@eCU*T z>6^RAOoqfEV5Jhns>K)`YmeYlI)Dx6mf5v=N1n7i#>qe1f$e7=F^l()nu9u`_RXdF(^T-P>YiB@`a zzJMB=6VEh}oz0uhyp)5@Yl;GUSiA9He)Y2Wb;2~jK9Q3T-wmv&sK7ep)zS8X`mUlP z@Eq23J^Z^(;bBC*TUB=Dk}xf>!t8anrhMESbasvJ`nKANZh%RCq^;^jQ@g_GA@%k|B( zFYS<%&8>@D%YDsbiU-Si<|D<;5tFNp+G#TmFHA2)58-S8r+e8Wapq zzVpO+4m#dF`Bzi&L8txg zP4f=Qfv-&ME>3-7N_G93&N|Co3-hQ5yNCEM$Er& zSwji^T@jvq{HUR)?i@9A(Z2;295saeH`zom;cl$ZKhDExAFBBm@&H;%bAQ#d=Ce8~Ue~+)8eo=j|ppRF(VxP`BE0N8gqI zG?ebX#wOciham^Puq3{GSAlcgY>waHO_}@-6Tc5_t}T1XL+MOy`J=j_IIE&Nn?1u0 zN^PXNX$O+QSOPP5JNbIbiE<0t>?ymueuHxz4iX>M(i&zOyd*u!*L1Y}(WBY#gbA%?NA{I>Q{NnTsT9vQjbt;6(%5`L`?jHwFWrKtyp5yk+vR3*5ru4rxSGbW ziKBEj;Z(@Riyp!#&!$uDT%gCOOD>{6(j+#qw1Q1%I?l$Op0jyC4R)Z$A?m?q8GW?_ z!3p#en~&+Y9rAJ6S@TFqt&9cMF<94PkSIzG1VI*1`BK8m?^-;~Q;@M8xtI`N#4f5eP4Es^s&0DBD7K$YF)ObW?IruhQQxuk({0*qyF98Cfse@ZFL1q&|nil`{KBIfGR z0RVNZ1aR!Cs2DFQW&^lqMUS~+5jpHfrkz&W&|fQkXMiNRU|EPW;_3NV(zw+dZj z@CLo%lE)NnXc=XqqyUQ;+)OPBWRIXF0??bteV!<}0l?Qn5sj1|fDq3+0G6n{Sq1WG zYq^lZkILW47wOVb*1@+Ri6qHLZ#dlPb;h>rf57iWSsHVU}H5DGJsqj$EN

NG|5WQR?h$t)eI0( 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 Kb!z`st@nSD*(RO< delta 18976 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 L6>9KW_5c3>_v|m> diff --git a/solver/codeGen/TailoredSolverBuildable.m b/solver/codeGen/TailoredSolverBuildable.m index 5c0c959..ad9da31 100644 --- a/solver/codeGen/TailoredSolverBuildable.m +++ b/solver/codeGen/TailoredSolverBuildable.m @@ -50,7 +50,7 @@ function updateBuildInfo(buildInfo, cfg) end end - function [output,exitflag,info] = forcesInitOutputsMatlab() + function [output, exitflag, info] = forcesInitOutputsMatlab() infos_it = coder.nullcopy(zeros(1, 1)); infos_it2opt = coder.nullcopy(zeros(1, 1)); infos_res_eq = coder.nullcopy(zeros(1, 1)); @@ -104,7 +104,7 @@ function updateBuildInfo(buildInfo, cfg) [output,exitflag,info] = TailoredSolverBuildable.forcesCall(params.lb, params.ub, params.hu, params.xinit, params.x0, params.all_parameters, params.num_of_threads); end - function [output,exitflag,info] = forcesCall(lb, ub, hu, xinit, x0, all_parameters, num_of_threads) + function [output, exitflag, info] = forcesCall(lb, ub, hu, xinit, x0, all_parameters, num_of_threads) solvername = 'TailoredSolver'; @@ -116,14 +116,14 @@ function updateBuildInfo(buildInfo, cfg) 'all_parameters', double(all_parameters),... 'num_of_threads', uint32(num_of_threads)); - [output_c, exitflag_c, info_c] = TailoredSolverBuildable.forcesInitOutputsC(); + [output_c, exitflag_c, info_c] = TailoredSolverBuildable.forcesInitOutputsC(); %#ok headerName = [solvername '.h']; coder.cinclude(headerName); coder.cinclude([solvername '_memory.h']); coder.cinclude([solvername '_adtool2forces.h']); % define memory pointer - memptr = coder.opaque([solvername '_mem *'], 'HeaderFile', headerName); + memptr = coder.opaque([solvername '_mem *'], 'HeaderFile', headerName); %#ok memptr = coder.ceval([solvername '_internal_mem'], uint32(0)); % define solver input information (params, file and casadi) coder.cstructname(params, [solvername '_params'], 'extern', 'HeaderFile', headerName); @@ -168,7 +168,7 @@ function updateBuildInfo(buildInfo, cfg) end methods (Static, Access = private) - function [output,exitflag,info] = forcesInitOutputsC() + function [output, exitflag, info] = forcesInitOutputsC() infos_it = coder.nullcopy(int32(zeros(1, 1))); infos_it2opt = coder.nullcopy(int32(zeros(1, 1))); infos_res_eq = coder.nullcopy(double(zeros(1, 1))); diff --git a/solver/codeGen/TailoredSolver_adtool2forces.c b/solver/codeGen/TailoredSolver_adtool2forces.c index 5ffdae3..f920e81 100644 --- a/solver/codeGen/TailoredSolver_adtool2forces.c +++ b/solver/codeGen/TailoredSolver_adtool2forces.c @@ -8,7 +8,7 @@ #ifdef __cplusplus extern "C" { #endif - + #include "TailoredSolver/include/TailoredSolver.h" #ifndef NULL @@ -51,8 +51,8 @@ extern solver_int32_default TailoredSolver_adtool2forces(TailoredSolver_float *x TailoredSolver_float *nabla_h, /* Jacobian of inequality constraints (column major) */ TailoredSolver_float *hess, /* Hessian (column major) */ solver_int32_default stage, /* stage number (0 indexed) */ - solver_int32_default iteration, /* iteration number of solver */ - solver_int32_default threadID /* Id of caller thread */) + solver_int32_default iteration, /* iteration number of solver */ + solver_int32_default threadID /* Id of caller thread */) { /* AD tool input and output arrays */ const TailoredSolver_callback_float *in[4]; @@ -70,7 +70,7 @@ extern solver_int32_default TailoredSolver_adtool2forces(TailoredSolver_float *x TailoredSolver_callback_float nabla_h_sparse[6]; TailoredSolver_callback_float c_sparse[5]; TailoredSolver_callback_float nabla_c_sparse[26]; - + /* pointers to row and column info for * column compressed format used by AD tool */ diff --git a/solver/codeGen/TailoredSolver_adtool2forces.o b/solver/codeGen/TailoredSolver_adtool2forces.o index e88d8980e78b8755a2a9479a88d0c05676233a81..9b2ac774dd28cc53a7695dd850ea75ad575f4158 100644 GIT binary patch delta 14 VcmeyM{y}|%9tWe*W_^x>+yE=*1pWX3 delta 14 VcmeyM{y}|%9tWf0W_^x>+yE=#1pNR2 diff --git a/solver/codeGen/TailoredSolver_casadi.o b/solver/codeGen/TailoredSolver_casadi.o index 176fbee53cfd241b41710e0070aed460843db88c..f59c71315cd465abe429858124f975d5fbc0cba9 100644 GIT binary patch delta 16 YcmbPnjB&;>#tqKyj7FPX+^#tqKyjE0+C+^