77 lines
2.1 KiB
Mathematica
77 lines
2.1 KiB
Mathematica
|
|
function p = pwaproj(h,w)
|
||
|
|
|
||
|
|
if prod(size(h))>1
|
||
|
|
error('pwaproj is currently only applicable to scalars');
|
||
|
|
end
|
||
|
|
|
||
|
|
hvars = getvariables(h);
|
||
|
|
wvars = getvariables(w);
|
||
|
|
basis = getbase(h);
|
||
|
|
coefficients = basis(2:end);
|
||
|
|
|
||
|
|
Complicating = find(ismember(hvars,yalmip('extvariables')));
|
||
|
|
if length(Complicating)==length(hvars)
|
||
|
|
LinearTerm = 0;
|
||
|
|
else
|
||
|
|
NonComplicating = find(~ismember(hvars,yalmip('extvariables')));
|
||
|
|
LinearwIndex = find(ismember(hvars,wvars));
|
||
|
|
NonComplicating = setdiff(NonComplicating,LinearwIndex);
|
||
|
|
LinearTerm = recover(hvars(NonComplicating))'*coefficients(NonComplicating)';
|
||
|
|
if isempty(LinesarwIndex)
|
||
|
|
Linearw = 0;
|
||
|
|
else
|
||
|
|
Linearw = recover(hvars(LinearwIndex))'*coefficients(LinearwIndex)';
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if isempty(Complicating)
|
||
|
|
p = h;
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
basis = getbase(h);
|
||
|
|
coefficients = basis(2:end);
|
||
|
|
|
||
|
|
totalobjective = 0;
|
||
|
|
totalF = [];
|
||
|
|
allz = [];
|
||
|
|
allargs = [];
|
||
|
|
if ~isempty(Complicating)
|
||
|
|
for i = 1:length(Complicating)
|
||
|
|
extstruct = yalmip('extstruct',hvars(Complicating(i)));
|
||
|
|
[properties{i},F{i},arguments{i}]=model(recover(hvars(Complicating(i))));
|
||
|
|
if intersect(depends(arguments{i}),wvars)
|
||
|
|
RequiresEpi(i) = 1;
|
||
|
|
z = sdpvar(size(arguments{i},1),size(arguments{i},2));
|
||
|
|
allz = [allz;z];
|
||
|
|
allargs = [allargs;arguments{i}];
|
||
|
|
extstruct.arg{1} = z;
|
||
|
|
t = feval(properties{i}{1}.name,z);
|
||
|
|
f = eval(['@' properties{i}{1}.name]);
|
||
|
|
t = f(extstruct.arg{1:end-1});
|
||
|
|
[dummy{i},thisF]=model(t);
|
||
|
|
totalF = totalF + thisF;
|
||
|
|
totalobjective=coefficients(Complicating(i))*t+totalobjective;
|
||
|
|
else
|
||
|
|
LinearTerm = LinearTerm + recover(hvars(Complicating(i)))'*coefficients(Complicating(i))';
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
sdpvar t
|
||
|
|
|
||
|
|
totalF = [totalF, totalobjective < t];
|
||
|
|
P = projection([totalF,t<1234],[allz;t]);
|
||
|
|
|
||
|
|
P = full(getbase(P));
|
||
|
|
b = P(:,1);
|
||
|
|
A = P(:,2:end);
|
||
|
|
rmv = find(A(:,end)== 0);
|
||
|
|
A(rmv,:)=[];
|
||
|
|
b(rmv) = [];
|
||
|
|
rmv = find(abs(b-1234)<1e-8);
|
||
|
|
A(rmv,:)=[];
|
||
|
|
b(rmv) = [];
|
||
|
|
|
||
|
|
p = basis(1)+LinearTerm+max((A(:,1:end-1)*allargs-b)./A(:,end));
|
||
|
|
|