Fmincon code generation with C++ objective

6 views (last 30 days)
Hello everyone,
I try to generate a mex file for fmincon in combination with an objective in c++.
My objective looks like:
#include <stdio.h>
#include <stdlib.h>
#include "obj.h"
double obj(double x)
{
return x*x;
}
and the corresponding header file:
double obj(double x);
On MATLAB side I have writte a wrapper as desribed in the MATLAB docs:
function y = callobj(x) %#codegen
y = 0.0;
if coder.target('MATLAB')
% Executing in MATLAB, call MATLAB equivalent of
% C function foo
y = x*x;
else
% Executing in generated code, call C function foo
coder.updateBuildInfo('addSourceFiles','obj.cpp');
coder.cinclude('obj.h');
y = coder.ceval('obj',coder.ref(x));
end
end
The objective is passed to the fmincon function in a matlab function:
function x_result = opt_th(x0,lb,ub)
options = optimoptions('fmincon','Algorithm','sqp');
x_result = fmincon(@callobj,x0,[],[],[],[],lb,ub,[],options);
end
The test script is defined as:
x0 = -2;
lb = -2.2;
ub = 3.3;
x_res = opt_th(x0,lb,ub);
So thats the definition of the problem.
If I run the Coder App I get an compiler error:
[1/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex opt_th_data.c /Fobuild\win64\opt_th_data.obj
opt_th_data.c
[2/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex rt_nonfinite.c /Fobuild\win64\rt_nonfinite.obj
rt_nonfinite.c
[3/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex factorQRE.c /Fobuild\win64\factorQRE.obj
factorQRE.c
[4/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2\obj.cpp" /Fobuild\win64\obj.obj
obj.cpp
[5/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex opt_th_mexutil.c /Fobuild\win64\opt_th_mexutil.obj
opt_th_mexutil.c
[6/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex opt_th_initialize.c /Fobuild\win64\opt_th_initialize.obj
opt_th_initialize.c
[7/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex factorQR.c /Fobuild\win64\factorQR.obj
factorQR.c
[8/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex eml_int_forloop_overflow_check.c /Fobuild\win64\eml_int_forloop_overflow_check.obj
eml_int_forloop_overflow_check.c
[9/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex computeObjective_.c /Fobuild\win64\computeObjective_.obj
FAILED: build/win64/computeObjective_.obj
cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex computeObjective_.c /Fobuild\win64\computeObjective_.obj
computeObjective_.c
computeObjective_.c(18): fatal error C1083: Datei (Include) kann nicht ge”ffnet werden: "ssq.h": No such file or directory
[10/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex opt_th.c /Fobuild\win64\opt_th.obj
opt_th.c
[11/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex computeFiniteDifferences.c /Fobuild\win64\computeFiniteDifferences.obj
computeFiniteDifferences.c
[12/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex squareQ_appendCol.c /Fobuild\win64\squareQ_appendCol.obj
squareQ_appendCol.c
[13/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex xcopy.c /Fobuild\win64\xcopy.obj
xcopy.c
[14/87] cl /c /Zp8 /GR /W3 /EHs /nologo /MD /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /DMATLAB_MEX_FILE /O2 /Oy- /DNDEBUG /fp:strict /I "." /I "D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2" /I ".\interface" /I "C:\Program Files\MATLAB\R2020a\extern\include" /I "." -DMODEL=opt_th_mex fmincon.c /Fobuild\win64\fmincon.obj
fmincon.c
D:\OneDrive\OneDrive - ruhr-uni-bochum.de\Fitter\code_gen_2\codegen\mex\opt_th\fmincon.c(159) : warning C4700: Die nicht initialisierte lokale Variable "FiniteDifferences" wurde verwendet.
ninja: build stopped: subcommand failed.
Thank you in advance!
Sven
  4 Comments
Walter Roberson
Walter Roberson on 9 Dec 2020
Did that solve the entire problem? I just expected it to be a small bug for execution time
Sven Pohl
Sven Pohl on 9 Dec 2020
It solved the entire problem. Now I was also able to build a mex file passing additional parameters to the objective in c++. Thank you again, you saved me a lot of time!

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 9 Dec 2020
Copying from my comment, as apparently it turned out to solve the entire problem:
double obj(double x)
The function expects a value, not a pointer to a value.
y = coder.ceval('obj',coder.ref(x));
You are passing a pointer to the value, not the value itself.
y = coder.ceval('obj', x); %just pass the value

More Answers (0)

Categories

Find more on MATLAB Algorithm Acceleration in Help Center and File Exchange

Products


Release

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!