function pen = sedumi2pen(F_struc,K,c,x0) %SEDUMI2MPEN Internal function to convert SeDuMi structure to format needed in PENNON % Author Johan Löfberg % $Id: sedumi2pen.m,v 1.15 2006/08/24 17:12:27 joloef Exp $ % General data pen.vars = length(c); pen.constr = K.l; if length(K.s)>1 pen.mconstr = length(K.s); else if K.s==0 pen.mconstr=0; else pen.mconstr=1; end end pen.msizes = K.s; pen.fobj = c(:)'; pen.x0 = zeros(1,length(c)); % Linear constraints if K.l>0 pen.ci = full(F_struc(K.f+1:K.f+K.l,1))'; pen.bi_dim = zeros(1,K.f+K.l); [variables,constr,val] = find(-F_struc(1:K.l,2:end)'); pen.bi_idx = variables(:)'-1; pen.bi_val = val(:)'; j = 1; if ~isempty(constr) rr = histc(constr,[1:max(constr)]); uu = find(rr); pen.bi_dim(uu) = rr(uu); %uns = uniquestripped(constr); %for j = 1:length(uns) % pen.bi_dim(uns(j)) = sum(constr==uns(j)); %end end else pen.ci = 0; pen.bi_dim = 0; pen.bi_idx = 0; pen.bi_val = 0; end % Semidefnite constraints if K.s>0 top = K.l+K.f+1; constraints = 1; pen.ai_dim = zeros(1,length(K.s)); % First, optimized code for scalar SDPs (happens for nonlinear scalar constraints) if all(K.s==1) Avec = -F_struc(top:top+length(K.s)-1,:); [variables,constr,val] = find(Avec'); j = 1; n_nz = length(val); pen.ai_nzs = repmat(1,1,n_nz); pen.ai_row = repmat(0,1,n_nz); pen.ai_col = pen.ai_row;%repmat(0,1,n_nz); pen.ai_val = val(:)'; pen.ai_idx = variables(:)'-1; while j<=length(val) first_constraint = constr(j); n_nz = 1; while j+n_nz<=length(val) & constr(j+n_nz)==first_constraint n_nz = n_nz + 1; end pen.ai_dim(first_constraint) = n_nz; j = j + n_nz; end else pen.ai_idx = []; pen.ai_val = []; pen.ai_row = []; pen.ai_col = []; pen.ai_nzs = []; while (constraints<=length(K.s)) n = K.s(constraints); Avec = -F_struc(top:top+n^2-1,:); picker = reshape(1:n^2,n,n);picker = tril(picker-diag(diag(picker)));picker = find(picker(:)); [rowcols,varindicies,vals]=find(Avec); %the_col = 1+floor((rowcols-1)/n); %the_row = rowcols-(the_col-1)*n; %removethese = the_row > the_col; removethese = find(ismembc(rowcols,picker)); rowcols(removethese) =[]; varindicies(removethese)=[]; vals(removethese)=[]; if ~isempty(rowcols) cols = ceil(rowcols/n); rows = rowcols - n*(cols-1); uns = uniquestripped(varindicies); difference = diff([varindicies(:) ; max(varindicies)+1]); count = diff(find([1 ; difference]))'; pen.ai_nzs = [pen.ai_nzs count]; pen.ai_dim(constraints) = length(uniquestripped(varindicies)); pen.ai_idx = [pen.ai_idx uns(:)'-1]; pen.ai_row = [pen.ai_row rows(:)'-1]; pen.ai_col = [pen.ai_col cols(:)'-1]; pen.ai_val = [pen.ai_val vals(:)']; end constraints = constraints+1; top = top+n*n; end end else pen.ai_dim = 0; pen.ai_idx = 0; pen.ai_val = 0; pen.ai_row = 0; pen.ai_col = 0; pen.ai_nzs = 0; end