79 lines
2.7 KiB
Mathematica
79 lines
2.7 KiB
Mathematica
|
|
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
|