1 | function pen = sedumi2pen(F_struc,K,c,x0) |
---|
2 | %SEDUMI2MPEN Internal function to convert SeDuMi structure to format needed in PENNON |
---|
3 | |
---|
4 | % Author Johan Löfberg |
---|
5 | % $Id: sedumi2pen.m,v 1.15 2006/08/24 17:12:27 joloef Exp $ |
---|
6 | |
---|
7 | % General data |
---|
8 | pen.vars = length(c); |
---|
9 | pen.constr = K.l; |
---|
10 | if length(K.s)>1 |
---|
11 | pen.mconstr = length(K.s); |
---|
12 | else |
---|
13 | if K.s==0 |
---|
14 | pen.mconstr=0; |
---|
15 | else |
---|
16 | pen.mconstr=1; |
---|
17 | end |
---|
18 | end |
---|
19 | pen.msizes = K.s; |
---|
20 | pen.fobj = c(:)'; |
---|
21 | pen.x0 = zeros(1,length(c)); |
---|
22 | |
---|
23 | % Linear constraints |
---|
24 | if K.l>0 |
---|
25 | pen.ci = full(F_struc(K.f+1:K.f+K.l,1))'; |
---|
26 | pen.bi_dim = zeros(1,K.f+K.l); |
---|
27 | [variables,constr,val] = find(-F_struc(1:K.l,2:end)'); |
---|
28 | pen.bi_idx = variables(:)'-1; |
---|
29 | pen.bi_val = val(:)'; |
---|
30 | j = 1; |
---|
31 | |
---|
32 | if ~isempty(constr) |
---|
33 | rr = histc(constr,[1:max(constr)]); |
---|
34 | uu = find(rr); |
---|
35 | pen.bi_dim(uu) = rr(uu); |
---|
36 | %uns = uniquestripped(constr); |
---|
37 | %for j = 1:length(uns) |
---|
38 | % pen.bi_dim(uns(j)) = sum(constr==uns(j)); |
---|
39 | %end |
---|
40 | end |
---|
41 | |
---|
42 | else |
---|
43 | pen.ci = 0; |
---|
44 | pen.bi_dim = 0; |
---|
45 | pen.bi_idx = 0; |
---|
46 | pen.bi_val = 0; |
---|
47 | end |
---|
48 | |
---|
49 | % Semidefnite constraints |
---|
50 | if K.s>0 |
---|
51 | top = K.l+K.f+1; |
---|
52 | constraints = 1; |
---|
53 | pen.ai_dim = zeros(1,length(K.s)); |
---|
54 | |
---|
55 | % First, optimized code for scalar SDPs (happens for nonlinear scalar constraints) |
---|
56 | if all(K.s==1) |
---|
57 | |
---|
58 | Avec = -F_struc(top:top+length(K.s)-1,:); |
---|
59 | [variables,constr,val] = find(Avec'); |
---|
60 | j = 1; |
---|
61 | n_nz = length(val); |
---|
62 | pen.ai_nzs = repmat(1,1,n_nz); |
---|
63 | pen.ai_row = repmat(0,1,n_nz); |
---|
64 | pen.ai_col = pen.ai_row;%repmat(0,1,n_nz); |
---|
65 | pen.ai_val = val(:)'; |
---|
66 | pen.ai_idx = variables(:)'-1; |
---|
67 | while j<=length(val) |
---|
68 | first_constraint = constr(j); |
---|
69 | n_nz = 1; |
---|
70 | while j+n_nz<=length(val) & constr(j+n_nz)==first_constraint |
---|
71 | n_nz = n_nz + 1; |
---|
72 | end |
---|
73 | pen.ai_dim(first_constraint) = n_nz; |
---|
74 | j = j + n_nz; |
---|
75 | end |
---|
76 | else |
---|
77 | pen.ai_idx = []; |
---|
78 | pen.ai_val = []; |
---|
79 | pen.ai_row = []; |
---|
80 | pen.ai_col = []; |
---|
81 | pen.ai_nzs = []; |
---|
82 | while (constraints<=length(K.s)) |
---|
83 | n = K.s(constraints); |
---|
84 | Avec = -F_struc(top:top+n^2-1,:); |
---|
85 | picker = reshape(1:n^2,n,n);picker = tril(picker-diag(diag(picker)));picker = find(picker(:)); |
---|
86 | [rowcols,varindicies,vals]=find(Avec); |
---|
87 | %the_col = 1+floor((rowcols-1)/n); |
---|
88 | %the_row = rowcols-(the_col-1)*n; |
---|
89 | %removethese = the_row > the_col; |
---|
90 | removethese = find(ismembc(rowcols,picker)); |
---|
91 | rowcols(removethese) =[]; |
---|
92 | varindicies(removethese)=[]; |
---|
93 | vals(removethese)=[]; |
---|
94 | if ~isempty(rowcols) |
---|
95 | cols = ceil(rowcols/n); |
---|
96 | rows = rowcols - n*(cols-1); |
---|
97 | uns = uniquestripped(varindicies); |
---|
98 | |
---|
99 | difference = diff([varindicies(:) ; max(varindicies)+1]); |
---|
100 | count = diff(find([1 ; difference]))'; |
---|
101 | pen.ai_nzs = [pen.ai_nzs count]; |
---|
102 | |
---|
103 | pen.ai_dim(constraints) = length(uniquestripped(varindicies)); |
---|
104 | pen.ai_idx = [pen.ai_idx uns(:)'-1]; |
---|
105 | pen.ai_row = [pen.ai_row rows(:)'-1]; |
---|
106 | pen.ai_col = [pen.ai_col cols(:)'-1]; |
---|
107 | pen.ai_val = [pen.ai_val vals(:)']; |
---|
108 | end |
---|
109 | constraints = constraints+1; |
---|
110 | top = top+n*n; |
---|
111 | end |
---|
112 | end |
---|
113 | else |
---|
114 | pen.ai_dim = 0; |
---|
115 | pen.ai_idx = 0; |
---|
116 | pen.ai_val = 0; |
---|
117 | pen.ai_row = 0; |
---|
118 | pen.ai_col = 0; |
---|
119 | pen.ai_nzs = 0; |
---|
120 | end |
---|