0001 function sdpdata=readsdpa(filename);
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 if ( nargin ~= 1 | ( nargin == 1 & ~isstr(filename) ) )
0046 error('input argument must be a filename');
0047 end
0048
0049 sdpdata=[];
0050
0051
0052 bsparse=0;
0053 len=length(filename);
0054 if len >= 2
0055 str=filename(end-1:end);
0056 if strncmp(str,'-s',2)
0057 bsparse=1;
0058 end
0059 end
0060
0061 fid=fopen(filename,'r');
0062 if fid == -1
0063 error(sprintf('Cannot open %s',filename));
0064 end
0065
0066
0067 while 1
0068 str=fgetl(fid);
0069 if( str(1)~='*' & str(1) ~='"' )
0070 mDIM=sscanf(str,'%d',1);
0071 break;
0072 end
0073 end
0074
0075
0076
0077 nBLOCK=fscanf(fid,'%d',1);
0078
0079
0080
0081 bLOCKsTRUCT=zeros(nBLOCK,1);
0082 for idx=1:nBLOCK
0083 bLOCKsTRUCT(idx)=fscanf(fid,'%*[^0-9+-]%d',1);
0084
0085
0086
0087 end
0088
0089
0090 c=zeros(mDIM,1);
0091 for idx=1:mDIM
0092 c(idx)=fscanf(fid,'%*[^0-9+-]%lg',1);
0093 end
0094
0095
0096 F=cell(nBLOCK,mDIM+1);
0097
0098 if bsparse
0099
0100 while 1
0101 [k,cnt]=fscanf(fid,'%*[^0-9+-]%d',1);
0102 [l,cnt]=fscanf(fid,'%*[^0-9+-]%d',1);
0103 [i,cnt]=fscanf(fid,'%*[^0-9+-]%d',1);
0104 [j,cnt]=fscanf(fid,'%*[^0-9+-]%d',1);
0105 [value,cnt]=fscanf(fid,'%*[^0-9+-]%lg',1);
0106 if cnt
0107 if isempty(F{l,k+1})
0108 bsize=abs(bLOCKsTRUCT(l));
0109 if bLOCKsTRUCT(l) < 0
0110 F{l,k+1}=sparse(zeros(bsize,1));
0111 else
0112 F{l,k+1}=sparse(zeros(bsize));
0113 end
0114 end
0115 if bLOCKsTRUCT(l) < 0
0116 F{l,k+1}(i)=value;
0117 else
0118 if i < j
0119 F{l,k+1}(i,j)=value;
0120 F{l,k+1}(j,i)=value;
0121 elseif i == j
0122 F{l,k+1}(i,j)=value;
0123 end
0124 end
0125 else
0126 break;
0127 end
0128 end
0129 else
0130
0131 for k=1:mDIM+1
0132 for l=1:nBLOCK
0133 bsize=abs(bLOCKsTRUCT(l));
0134 if bLOCKsTRUCT(l) > 0
0135 F{l,k}=zeros(bsize);
0136 for i=1:bsize
0137 for j=1:bsize
0138 [value,cnt]=fscanf(fid,'%*[^0-9+-]%lg',1);
0139 if cnt
0140 F{l,k}(i,j)=value;
0141 else
0142 error(sprintf('Failed to read an element at %d %d %d %d'),...
0143 k-1,l,i,j);
0144 end
0145 end
0146 end
0147 else
0148 F{l,k}=zeros(bsize,1);
0149 for i=1:bsize
0150 [value,cnt]=fscanf(fid,'%*[^0-9+-]%lg',1);
0151 if cnt
0152 F{l,k}(i)=value;
0153 else
0154 error(sprintf('Failed to read an element at %d %d %d %d'),...
0155 k-1,l,i,i);
0156 end
0157 end
0158 end
0159 end
0160 end
0161 end
0162 fclose(fid);
0163
0164
0165
0166 linblk=find(bLOCKsTRUCT<0);
0167 matr=setdiff(1:nBLOCK,linblk);
0168 sdpdata.Ng=sum(abs(bLOCKsTRUCT(linblk)));
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178 B=[]; d=[];
0179
0180
0181
0182 if (~isempty(linblk))
0183 for k=linblk
0184 sz=abs(bLOCKsTRUCT(k));
0185 for i=1:mDIM+1
0186 if (isempty(F{k,i}))
0187 F{k,i} = sparse(sz, 1);
0188 end
0189 end
0190 end
0191 for k=linblk
0192 Bk=[F{k,2:end}];
0193 dk=[F{k,1}];
0194
0195 if (size(Bk,1)~=abs(bLOCKsTRUCT(k)) || size(Bk,2)~=mDIM)
0196 disp(sprintf('ERR: wrong dimensions of Bk, k=%i: %i %i',k,size(Bk)))
0197 end
0198 if (size(dk,1)~=abs(bLOCKsTRUCT(k)) || size(dk,2)~=1)
0199 disp(sprintf('ERR: wrong dimensions of dk, k=%i: %i %i',k,size(dk)))
0200 end
0201
0202 B=[B;Bk];
0203 d=[d;dk];
0204 end
0205 end
0206
0207
0208
0209
0210
0211 for k=matr
0212 sz=bLOCKsTRUCT(k);
0213 if (isempty(F{k,1}))
0214 F{k,1}=sparse(sz,sz);
0215 end
0216 end
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229 sdpdata.name=filename;
0230 sdpdata.Nx=mDIM;
0231 sdpdata.Na=length(matr);
0232 sdpdata.B=B;
0233 sdpdata.d=d;
0234 sdpdata.c=c;
0235 sdpdata.NaDims=bLOCKsTRUCT(matr);
0236 sdpdata.A=F(matr,:);
0237
0238
0239 sdpdata.Adep=cell(sdpdata.Na,1);
0240 for k=1:sdpdata.Na
0241 list=[];
0242 for i=2:mDIM+1
0243 if (~isempty(sdpdata.A{k,i}) && nnz(sdpdata.A{k,i})>0)
0244 list=[list,i-1];
0245 end
0246 end
0247 sdpdata.Adep{k}=list;
0248 end
0249
0250 sdpdata.origF=F;
0251 sdpdata.origNaDims=bLOCKsTRUCT;
0252
0253