81 lines
2.6 KiB
Matlab
Executable File
81 lines
2.6 KiB
Matlab
Executable File
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;
|