Dynamic-Calibration/utils/SDPT3-4.0/Solver/qops.m

46 lines
1.5 KiB
Matlab
Executable File

%%********************************************************
%% qops: Fu = qops(pblk,w,f,options,u);
%%
%% options = 1, Fu(i) = <wi,fi>
%% = 2, Fu(i) = 2*wi(1)*fi(1)-<wi,fi>
%% = 3, Fui = w(i)*fi
%% = 4, Fui = w(i)*fi, Fui(1) = -Fui(1).
%% options = 5, Fu = w [ f'*u ; ub + fb*alp ], where
%% alp = (f'*u + u0)/(1+f0);
%% options = 6, compute Finv*u.
%%
%% Note F = w [f0 fb'; fb I+ fb*fb'/(1+f0) ], where
%% f0*f0 - fb*fb' = 1.
%% Finv = (1/w) [f0 -fb'; -fb I+ fb*fb'/(1+f0) ].
%%*****************************************************************
%% SDPT3: version 4.0
%% Copyright (c) 1997 by
%% Kim-Chuan Toh, Michael J. Todd, Reha H. Tutuncu
%% Last Modified: 16 Sep 2004
%%*****************************************************************
function Fu = qops(pblk,w,f,options,u);
if (options >= 1 & options <= 4)
Fu = mexqops(pblk{2},w,f,options);
elseif (options == 5)
s = 1 + [0 cumsum(pblk{2})];
idx1 = s(1:length(pblk{2}));
inprod = mexqops(pblk{2},f,u,1);
tmp = (u(idx1)+inprod)./(1+f(idx1));
Fu = u + mexqops(pblk{2},tmp,f,3);
Fu(idx1) = inprod;
Fu = mexqops(pblk{2},w,Fu,3);
elseif (options == 6)
s = 1 + [0 cumsum(pblk{2})];
idx1 = s(1:length(pblk{2}));
gamprod = mexqops(pblk{2},f,u,2);
tmp = (u(idx1)+gamprod)./(1+f(idx1));
Fu = u - mexqops(pblk{2},tmp,f,3);
Fu(idx1) = gamprod;
Fu = mexqops(pblk{2},1./w,Fu,3);
end
%%********************************************************