Fmincon code generation with C++ objective

T
Timothy · Dec 12, 2020 · 2K views
Question
I try to generate a mex file for fmincon in combination with an objective in c++. My objective looks like:   #include #include #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.
Expert Answer
Profile picture of Neeta Dsouza
Neeta Dsouza PhD Expert
Answered Aug 23, 2026

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
Have a different question? Ask here

Get a Free Consultation or a Sample Assignment Review!