function [C,A,b,blk] = dsdpdata(F,h) %DSDPDATA Internal function create DSDP data % Author Johan Löfberg % $Id: dsdpdata.m,v 1.3 2004/11/24 09:13:05 johanl Exp $ if ~(isempty(F) | isa(F,'lmi')) help lmi error('First argument (F) should be an lmi object. See help text above'); end if ~(isempty(h) | isa(h,'sdpvar')) help solvesdp error('Third argument (the objective function h) should be an sdpvar object (or empty). See help text above'); end [ProblemString,real_data] = catsdp(F); if (real_data == 0) error('DSDP does not support complex data') end % This one is used a lot nvars = sdpvar('nvars'); % Convert the objective onlyfeasible = 0; if isempty(h) c=zeros(nvars,1); else [n,m]=size(h); if ~((n==1) & (m==1)) error('Scalar expression to minimize please.'); else lmi_variables = getvariables(h); c = zeros(nvars,1); for i=1:length(lmi_variables) c(lmi_variables(i))=getbasematrix(h,lmi_variables(i)); end; end end [F_struc,K,F_blksz] = lmi2spstruct(F); % Which sdpvar variables are actually in the problem used_variables_LMI = find(any(F_struc(:,2:end),1)); used_variables_obj = find(any(c',1)); used_variables = uniquestripped([used_variables_LMI used_variables_obj]); % Check for unbounded variables unbounded_variables = setdiff(used_variables_obj,used_variables_LMI); if ~isempty(unbounded_variables) % Remove unbounded variable from problem used_variables = setdiff(used_variables,unbounded_variables); end % Pick out the necessary rows if length(used_variables)0) % Extract the inequalities A_equ = F_struc(1:K.f,2:end); b_equ = -F_struc(1:K.f,1); % Find feasible (turn off annoying warning on PC) % Using method from Nocedal-Wright book showprogress('Solving equalities',options.ShowProgress); [Q,R] = qr(A_equ'); n = size(R,2); Q1 = Q(:,1:n); R = R(1:n,:); x_equ = Q1*(R'\b_equ); % Exit if no consistent solution exist if (norm(A_equ*x_equ-b_equ)>sqrt(eps)) error('Linear constraints inconsistent.'); return end % We dont need the rows for equalities anymore F_struc = F_struc(K.f+1:end,:); K.f = 0; % We found a new basis H = Q(:,n+1:end); % New basis % objective in new basis c = H'*c; % LMI in new basis F_struc = [F_struc*[1;x_equ] F_struc(:,2:end)*H]; else % For simpliciy we introduce a dummy coordinate change x_equ = 0; H = 1; end % Convert from SP format (same format as SDPT3-2.3) [C,A,b,blk] = sp2sdpt323(F_struc,F_blksz,c);