Dynamic-Calibration/utils/YALMIP-master/modules/sos/create_kernelmodel.m

81 lines
2.6 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function [F,obj,BlockedQ,Primal_matrices,Free_variables] = create_kernelmodel(BlockedA,Blockedb,F_parametric,parobj,options,sparsityPattern);
% To get the primal kernel representation, we simply use
% the built-in dualization module!
% First, write the problem in primal kernel format
traceobj = 0;
dotraceobj = options.sos.traceobj;
F = F_parametric;
for i = 1:length(Blockedb)
sizematrixSOS = sqrt(size(Blockedb{i},2));
for k = 1:sizematrixSOS
for r = k:sizematrixSOS
res{(k-1)*sizematrixSOS+r} = 0;
end
end
for j = 1:length(BlockedA{i})
n = sqrt(size(BlockedA{i}{j},2));
BlockedQ{i}{j} = sdpvar(n*sizematrixSOS,n*sizematrixSOS);
F = F + lmi(BlockedQ{i}{j});
if sizematrixSOS>0
% Matrix valued sum of sqaures
% Loop over all elements
starttop = 1;
for k = 1:sizematrixSOS
startleft = 1;
for r = 1:sizematrixSOS
if k<=r
Qkr = BlockedQ{i}{j}(starttop:starttop+n-1,startleft:startleft+n-1);
res{(k-1)*sizematrixSOS+r} = res{(k-1)*sizematrixSOS+r} + BlockedA{i}{j}*reshape(Qkr,n^2,1);
end
startleft = startleft + n;
end
starttop = starttop + n;
end
else
% Standard case
res{1} = res{1} + BlockedA{i}{j}*reshape(BlockedQ{i}{j},n^2,1);
end
if dotraceobj
traceobj = traceobj + trace(BlockedQ{i}{j});
end
end
for k = 1:sizematrixSOS
for r = k:sizematrixSOS
F = F + (res{(k-1)*sizematrixSOS+r} == Blockedb{i}(:,(k-1)*sizematrixSOS+r));
end
end
end
% % Constrain elements according to a desired sparsity
if ~isempty(sparsityPattern)
res = [];
for i = 1:length(BlockedQ)
for j = 1:length(BlockedQ{i})
if ~isempty(sparsityPattern{i}{j})
H = spalloc(length(BlockedQ{i}{j}),length(BlockedQ{i}{j}),length(sparsityPattern{i}{j}));
H(sparsityPattern{i}{j}) = 1;
k = find(triu(H));
res = [res;BlockedQ{i}{j}(k)];
end
end
end
F = F + (0 == res);
end
% And get the primal model of this
if isempty(parobj)
if options.sos.traceobj
[F,obj,Primal_matrices,Free_variables] = dualize(F,traceobj,1,options.sos.extlp);
else
[F,obj,Primal_matrices,Free_variables] = dualize(F,[],1,options.sos.extlp);
end
else
[F,obj,Primal_matrices,Free_variables] = dualize(F,parobj,1,options.sos.extlp);
end
% In dual mode, we maximize
obj = -obj;