I am experiencing trouble with using spmd in the objective function of fmincon. My code is as follows:
theta1 = zeros(size(outstruct.x1, 2),1);
data = load(['dataworker' num2str(labindex) '.mat']);
theta20 = sig.x;
fun = @(theta2)gmmobj(theta2, outstruct, data);
options = optimoptions('fmincon', ...
'SpecifyObjectiveGradient',true, 'Display', 'off', ...
'MaxFunctionEvaluations', 2, ...
'OptimalityTolerance', 1e-14, 'FunctionTolerance', 1e-14);
[x, fval] = fmincon(fun, theta20, , , , , , , , options);
The objective function gmmobj() is coded as
function [f, grad] = gmmobj(theta2, outstruct, data)
[mktmval, jac] = meanutil_jacEQN(theta2, data.struct);
delta = cell2mat(mktmval(:));
jacobian = cell2mat(jac(:));
clear mktmval jac;
if max(isnan(delta)) == 1
f = 1e+10
temp1 = outstruct.x1'*outstruct.IVs;
temp2 = delta'*outstruct.IVs;
theta1 = (temp1/outstruct.W*temp1')\(temp1/outstruct.W*temp2');
clear temp1 temp2
gmmresid = delta - outstruct.x1*theta1;
temp1 = gmmresid'*outstruct.IVs;
f = temp1/outstruct.W*temp1';
if nargout > 1
grad = 2*jacobian'*outstruct.IVs/outstruct.W*outstruct.IVs'*gmmresid;
disp(['GMM objective: ' num2str(f)])
When I call the gmmobj() function on its own, it runs fine. But once I start running the optimization with "fmincon", I get the following output and error:
GMM objective: 36532.679
Error using gmmobj (line 13)
Error detected on workers 1 2 3 4 5 6.
Error in @(theta2)gmmobj(theta2,outstruct,data)
Error in barrier
Error in fmincon (line 834)
[X,FVAL,EXITFLAG,OUTPUT,LAMBDA,GRAD,HESSIAN] = barrier(funfcn,X,A,B,Aeq,Beq,l,u,confcn,options.HessFcn, ...
Error using levenbergMarquardt (line 16)
Objective function is returning undefined values at initial point. fsolve cannot continue.
Note that line 13 of the "gmmobj" function is where the "spmd" block starts. The gmmobj() function was obviously evaluated once, but on the second iteration, fmincon doesn't seem to recognize the spmd block. Can someone help me with making this work?