0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 function pen=sed2pen(fname, compressed);
0015
0016
0017
0018
0019 clear pen;
0020
0021 K.q = [];
0022 K.l = [];
0023 A = 0;
0024 At = 0;
0025 AAk = 0;
0026 ii = 0;
0027 ss = 0;
0028 fname2 = strcat(fname,'.dat-s');
0029
0030 compressed=0;
0031 if (compressed == 1);
0032 fprintf('** Unzip Problem. \n');
0033 unix(['gunzip ', fname,'.mat.gz']);
0034 elseif (compressed == 2);
0035 unix(['uncompress ', fname,'.mat.Z']);
0036 end
0037 if exist([fname,'.mat']) | exist(fname)
0038 eval(['load ', fname]);
0039 else
0040 fprintf('** Problem not found, please specify the correct path. \n');
0041 return;
0042 end
0043 if (compressed == 1)
0044 unix(['gzip ', fname,'.mat']);
0045 elseif (compressed == 2)
0046 unix(['compress ', fname,'.mat']);
0047 end
0048
0049
0050 if (size(c,1) == 1), c = c'; end;
0051 if (size(b,1) == 1), b = b'; end;
0052 if (At == 0), At = A'; end; clear A;
0053
0054 [nn,mm] = size(At);
0055 if length(b)==nn, At=At'; [nn,mm] = size(At); end
0056 if (max(size(c)) == 1); c = c*ones(nn,1); end;
0057
0058 if ~isfield(K,'l'); K.l = 0; end
0059 if ~isfield(K,'f'); K.f = 0; end
0060
0061 if ~isfield(K,'s'); K.s = 0; end
0062 if isempty(K.l) | K.l == 0; K.l = 0; end;
0063 if isempty(K.f) | K.f == 0; K.f = 0; end;
0064
0065 if sum(K.s) == 0 | isempty(K.s); K.s = 0; end
0066 m = length(b);
0067 pen.vars = m;
0068
0069 llen = 0;
0070 offset1 = 0;
0071 offset2 = 0;
0072 if(K.l > 0); llen = llen + length(K.l); end;
0073 offset1 = llen;
0074
0075 offset2 = llen;
0076 if(K.s > 0); llen = llen + length(K.s); end;
0077
0078
0079 pen.fobj = full(b);
0080
0081 rowidx = 0; idxblk = 0; aidx = 0; bk1 = 1; hidx = 0;
0082
0083 pen.constr = 0; pen.ci = 0; pen.bi_dim = 0; pen.bi_idx = 0; pen.bi_val = 0;
0084 if ~(K.l == 0) | ~(K.f == 0)
0085 len = K.l + K.f;
0086 pen.constr = len + K.f;
0087 pen.ci = c(1:len);
0088 if (K.l == 0)
0089 if (K.f ~= 0), pen.ci = full([c(1:K.f);-c(1:K.f)]);end;
0090 else
0091 if (K.f ~= 0), pen.ci = full([c(1:K.f);-c(1:K.f)';c(K.f+1,len)]);end;
0092 end
0093 idxblk = idxblk + 1;
0094 if(K.f == 0)
0095 for k = 1:len
0096 Atmp = At(rowidx+k,:);
0097 [ii,jj,ss] = find(Atmp);
0098 pen.bi_dim(k) = nnz(Atmp);
0099 pen.bi_idx(bk1:bk1+nnz(Atmp)-1) = jj-1;
0100 pen.bi_val(bk1:bk1+nnz(Atmp)-1) = -ss;
0101 bk1 = bk1 + nnz(Atmp);
0102
0103
0104
0105 end
0106 else
0107 for k = 1:K.f
0108 Atmp = At(rowidx+k,:);
0109 [ii,jj,ss] = find(Atmp);
0110 pen.bi_dim(k) = nnz(Atmp);
0111 pen.bi_idx(bk1:bk1+nnz(Atmp)-1) = jj-1;
0112 pen.bi_val(bk1:bk1+nnz(Atmp)-1) = -ss;
0113 bk1 = bk1 + nnz(Atmp);
0114
0115
0116
0117 end
0118 for k = 1:K.f
0119 Atmp = At(rowidx+k,:);
0120 [ii,jj,ss] = find(Atmp);
0121 pen.bi_dim(K.f+k) = nnz(Atmp);
0122 pen.bi_idx(bk1:bk1+nnz(Atmp)-1) = jj-1;
0123 pen.bi_val(bk1:bk1+nnz(Atmp)-1) = ss;
0124 bk1 = bk1 + nnz(Atmp);
0125
0126
0127
0128 end
0129 if (K.l ~= 0)
0130 for k = K.f+1,len
0131 Atmp = At(rowidx+k,:);
0132 [ii,jj,ss] = find(Atmp);
0133 pen.bi_dim(K.f+k) = nnz(Atmp);
0134 pen.bi_idx(bk1:bk1+nnz(Atmp)-1) = jj-1;
0135 pen.bi_val(bk1:bk1+nnz(Atmp)-1) = -ss;
0136 bk1 = bk1 + nnz(Atmp);
0137
0138
0139
0140 end
0141 end
0142 end
0143 rowidx = rowidx + len;
0144 end
0145
0146 if ~(K.s == 0)
0147 blksize = K.s;
0148 if size(blksize,2) == 1; blksize = blksize'; end
0149 pen.ai_dim = zeros(1,length(blksize));
0150 pen.msizes = blksize;
0151 pen.mconstr = length(blksize);
0152 blknnz = [0 cumsum(blksize.*blksize)];
0153 for p = 1:length(blksize)
0154 idxblk = idxblk + 1;
0155 n = blksize(p);
0156 Ctmp = c(rowidx+blknnz(p)+[1:n*n]);
0157 nn = nnz(Ctmp);
0158 if(nn>0)
0159 aidx = aidx + 1;
0160 pen.ai_dim(p) = 1;
0161 pen.ai_idx(aidx) = 0;
0162 [ii,jj,ss] = find(Ctmp);
0163 iinz = 0;
0164 for kk = 1:nn
0165 idxi = fix(((ii(kk)-1)./n)+1);
0166 idxj = mod(ii(kk)-1,n)+1;
0167 if ~(idxi > idxj)
0168 hidx = hidx + 1;
0169 iinz = iinz + 1;
0170 pen.ai_val(hidx) = -ss(kk);
0171 pen.ai_row(hidx) = idxi-1;
0172 pen.ai_col(hidx) = idxj-1;
0173
0174 end
0175 end
0176 pen.ai_nzs(aidx) = iinz;
0177 end
0178
0179 Atmp = At(rowidx+blknnz(p)+[1:n*n],:);
0180 for k = 1:m
0181 AAk = Atmp(:,k);
0182 nn = nnz(AAk);
0183 if(nn>0)
0184 aidx = aidx + 1;
0185 pen.ai_dim(p) = pen.ai_dim(p) + 1;
0186 pen.ai_idx(aidx) = k;
0187 iinz = 0;
0188 [ii,jj,ss] = find(AAk);
0189 for kk = 1:nn
0190 idxi = fix(((ii(kk)-1)./n)+1);
0191 idxj = mod(ii(kk)-1,n)+1;
0192 if ~(idxi > idxj)
0193 hidx = hidx + 1;
0194 iinz = iinz + 1;
0195 pen.ai_val(hidx) = -ss(kk);
0196 pen.ai_row(hidx) = idxi-1;
0197 pen.ai_col(hidx) = idxj-1;
0198
0199 end
0200 end
0201 pen.ai_nzs(aidx) = iinz;
0202 end
0203 end
0204 end
0205 end
0206
0207 pen.x0 = zeros(1,pen.vars);
0208
0209
0210
0211
0212
0213
0214 pen.ioptions = [1 50 100 2 0 1 0 0 3 2 0 0 2 1 1];
0215
0216 pen.foptions = [1 0.7 0.1 1.0E-4 1.0E-7 1.0E-14 1.0E-2 1.0 0.5 1.0 1.0e-6 0.05];