0001
0002 function [] = mpen_update(obj)
0003
0004
0005 idx=obj.Yboxindbar;
0006 pnew=obj.PYbox;
0007 pnew(idx)=p_update(obj.PYbox(idx), obj.allopts.mpenalty_update, obj.allopts.mpenalty_border, obj.allopts.mpenalty_min);
0008
0009 if ~isempty(obj.Yboxindbar)
0010 for k=obj.Yboxindbar
0011 Ykx = obj.Y{obj.Yboxmap(k)};
0012 Akx=obj.Yboxshift(k)*speye(size(Ykx)) + obj.Yboxmlt(k)*Ykx;
0013
0014
0015 [pnew(k), nfactor] = p_check(-Akx, pnew(k), obj.PYbox(k));
0016 end
0017 end
0018 obj.PYbox(idx) = max(pnew(idx));
0019
0020 idx=obj.Yboxindphi;
0021 pnew=obj.PYbox;
0022 pnew(idx)=p_update(obj.PYbox(idx), obj.allopts.mpenalty_update, obj.allopts.mpenalty_border, obj.allopts.mpenalty_min);
0023
0024 if ~isempty(obj.Yboxindphi)
0025 for k=obj.Yboxindphi
0026 Ykx = obj.Y{obj.Yboxmap(k)};
0027 Akx=obj.Yboxshift(k)*speye(size(Ykx)) + obj.Yboxmlt(k)*Ykx;
0028
0029
0030 [pnew(k), nfactor] = p_check(-Akx, pnew(k), obj.PYbox(k));
0031 end
0032 end
0033 obj.PYbox(idx) = max(pnew(idx));
0034
0035
0036 idx=obj.Aindphi;
0037
0038 pnew=obj.PA;
0039 pnew(idx)=p_update(obj.PA(idx), obj.allopts.mpenalty_update, obj.allopts.mpenalty_border, obj.allopts.mpenalty_min);
0040
0041
0042
0043 if ~isempty(obj.Aindphi)
0044 for k=obj.Aindphi
0045 kuser=obj.Amap(k);
0046 [Akuserx, obj.userdata] = obj.mconfun(obj.x, obj.Y, kuser, obj.userdata);
0047 Akx = obj.Ashift(k)*speye(size(Akuserx)) + obj.Amlt(k) .* Akuserx;
0048
0049
0050 [pnew(k), nfactor] = p_check(-Akx, pnew(k), obj.PA(k));
0051 end
0052 end
0053
0054
0055 obj.PA(idx) = max(pnew(idx));
0056
0057 end
0058
0059
0060
0061
0062
0063
0064
0065
0066 function [p] = p_update(p, pfactor, pborder, pmin)
0067 idxnormal = p>pborder;
0068
0069 p(idxnormal) = p(idxnormal)*pfactor;
0070 p(~idxnormal) = p(~idxnormal)*0.9;
0071
0072
0073 p = max(p,pmin);
0074
0075 end
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087 function [p, nfactor] = p_check(M, p, pold)
0088
0089 rFactor=0.75;
0090 nfactor=0;
0091
0092 [n m] = size(M);
0093 Missparse = n>10 && issparse(M) && nnz(M)<0.15*n*n;
0094
0095 if (Missparse)
0096 perm=amd(M);
0097 M=M(perm,perm);
0098 I=speye(n,n);
0099 else
0100
0101 M=full(M);
0102 I=eye(n,n);
0103 end
0104
0105 [R,k] = chol(M+p*I);
0106 nfactor=nfactor+1;
0107 if (k==0)
0108
0109 return;
0110 end
0111
0112 while (k~=0)
0113 p=rFactor*p + (1-rFactor)*pold;
0114 [R,k] = chol(M+p*I);
0115
0116 nfactor=nfactor+1;
0117
0118 end
0119
0120 end
0121
0122