Dynamic-Calibration/utils/YALMIP-master/extras/schurgateway.m

79 lines
2.7 KiB
Matlab
Executable File

function schurtmp_Total = schurgateway(X,Z,userdata)
schurtmp_Total = 0;
sizes = [userdata{1}.blk{1}];
Xtotal = X;
Ztotal = Z;
top = 1;
for blkSDP = 1:length(sizes)%length(userdata)
% Send slack, dual and user-data to the Hessian compiler
k = top:top+sizes(blkSDP)-1;top = top + sizes(blkSDP);
X = Xtotal(k,k);
Z = Ztotal(k,k);
schurtmp1 = feval(userdata{blkSDP}.fun,full(X),full(Z),userdata{blkSDP}.extra,userdata{blkSDP}.data{:});
% Place these values in the correct location in the global Hessian
if (1+userdata{blkSDP}.index(end)-userdata{blkSDP}.index(1)) == length(userdata{1}.index)
n1 = userdata{blkSDP}.index(1)-1;
% n2 = userdata{1}.nvars-length(userdata{1}.index)-n1;
n3 = size(schurtmp1,1);
schurtmp = zeros(userdata{blkSDP}.nvars);
schurtmp(n1+1:n1+n3,n1+1:n1+n3) = schurtmp1;
% schurtmp = blkdiag(blkdiag(zeros(n1,n1),schurtmp),zeros(n2,n2));
else
[i,j,k] = find(schurtmp1);
schurtmp = sparse(userdata{blkSDP}.index(i),userdata{blkSDP}.index(j),k,userdata{blkSDP}.nvars,userdata{blkSDP}.nvars);
end
schurtmp_Total = schurtmp_Total + schurtmp;
end
% function schurtmp = schurgateway(X,Z,userdata)
%
% %Send slack, dual and user-data to the Hessian compiler
% schurtmp = feval(userdata{1}.fun,(X),(Z),userdata{1}.data{:});
%
% %Place these values in the correct location in the global Hessian
% if (1+userdata{1}.index(end)-userdata{1}.index(1)) == length(userdata{1}.index)
% n1 = userdata{1}.index(1)-1;
% n2 = userdata{1}.nvars-length(userdata{1}.index)-n1;
% if n2 == 0
% schurtmp = blkdiag(zeros(n1,n1),schurtmp);
% else
% schurtmp = blkdiag(blkdiag(zeros(n1,n1),schurtmp),zeros(n2,n2));
% end
% else
% [i,j,k] = find(schurtmp);
% schurtmp = sparse(userdata{1}.index(i),userdata{1}.index(j),k,userdata{1}.nvars,userdata{1}.nvars);
% end
%
% %
% %
% % % % Send slack, dual and user-data to the Hessian compiler
% % schurtmp1 = feval(userdata{1}.fun,full(X),full(Z),userdata{1}.data{:});
% %
% % % Place these values in the correct location in the global Hessian
% % %[i,j,k] = find(schurtmp);
% % if (1+userdata{1}.index(end)-userdata{1}.index(1)) == length(userdata{1}.index)
% % n1 = userdata{1}.index(1)-1;
% % % n2 = userdata{1}.nvars-length(userdata{1}.index)-n1;
% %
% % n3 = size(schurtmp1,1); schurtmp = zeros(userdata{1}.nvars); schurtmp(n1+1:n1+n3,n1+1:n1+n3) = schurtmp1;
% % % schurtmp = blkdiag(blkdiag(zeros(n1,n1),schurtmp),zeros(n2,n2));
% %
% % else
% % [i,j,k] = find(schurtmp1);
% % schurtmp = sparse(userdata{1}.index(i),userdata{1}.index(j),k,userdata{1}.nvars,userdata{1}.nvars);
% % end