function [K,phi,fval] = trynbreak(K,phi,m0,n0,comstr) global Ainl Binl Ain1 Bin1 GG iif m n mylinopt %warning off warning on mylinopt = optimset('Diagnostics','off'); mylinopt = optimset('Display','off'); m = m0, n = n0 if isempty(K) K = randn(m^n,1); end if isempty(phi) phi = randlip(m,n)'; end n1 = n-1; dum = phi(:); LBK = -ones(size(dum)); UBK = ones(size(dum)); LBf = zeros(size(dum)); UBf = n*ones(size(dum)); LB = [LBf; LBK]; UB = [UBf; UBK]; [Ainl,Binl] = lipab(m,n); %[Ain1,Bin1] = lipab(m,n1); Ain = assembleblock({Ainl,zeros(0,m^n)}); Bin = [Binl]; x0 = [phi(:); K(:)]; switch comstr case 'reverse' [x,fval] = fmincon(@myobj_reverse,K,[],[],[],[],LB,UB); case 'greedy' [x,fval] = fmincon(@myobjm_greedy,x0,Ain,Bin,[],[],LB,UB); case 'psi' [x,fval] = fmincon(@myobjm_psi,x0,Ain,Bin,[],[],LB,UB); case 'phi1' [x,fval] = fmincon(@myobjm_phi1,x0,Ain,Bin,[],[],LB,UB); case 'pos0' %LBK = zeros(size(dum)); %LB = [LBf; LBK]; [x,fval] = fmincon(@myobjm_pos0,x0,Ain,Bin,[],[],LB,UB); case 'pos' UBf = n1*ones(size(dum)); UB = [UBf; UBK]; LBK = zeros(size(dum)); LB = [LBf; LBK]; [x,fval] = fmincon(@myobjm_pos,x0,Ain,Bin,[],[],LB,UB); case 'posneg' [x,fval] = fmincon(@myobjm_posneg,x0,Ain,Bin,[],[],LB,UB); case 'zajim' [x,fval] = fmincon(@myobjm_zajim,x0,Ain,Bin,[],[],LB,UB); case 'conv' [x,fval] = fmincon(@myobjm_conv,x0,Ain,Bin,[],[],LB,UB); case 'phir' [x,fval] = fmincon(@myobjm_phir,x0,Ain,Bin,[],[],LB,UB); case 'phim' [x,fval] = fmincon(@myobjm_phim,x0,Ain,Bin,[],[],LB,UB); case 'lips' [x,fval] = fmincon(@myobjm_lips,x0,Ain,Bin,[],[],LB,UB); case 'ratio' x0 = [K(:)]; UB = [UBK]; LB = [LBK]; [x,fval] = fmincon(@myobj_ratio,x0,[],[],[],[],LB,UB); K = x; case 'drat' x0 = [K(:)]; UB = [UBK]; LB = [LBK]; [x,fval] = fmincon(@myobj_drat,x0,[],[],[],[],LB,UB); K = x; otherwise error('unknown obj function'); end %phi = x(1:m^n)'; %K = x(m^n+1:end); %if phi*K<0 %K = -K; %end return function y = myobj_drat(x) global Ainl Binl Ain1 Bin1 GG iif m n mylinopt %phi = x(1:m^n)'; %K = x(m^n+1:end); K = x; yPsi = psinorm(K); dpsi = ndpsi(K); %y = yPsi - dpsi*K; y = -(yPsi - dpsi*K)^2; return function y = myobj_ratio(x) global Ainl Binl Ain1 Bin1 GG iif m n mylinopt %phi = x(1:m^n)'; %K = x(m^n+1:end); K = x; yF = phinorm(K); yPsi = psinorm(K,m,n); y = -yF/(yPsi+realmin); return function y = myobj_reverse(x) global Ainl Binl Ain1 Bin1 GG iif m n mylinopt %phi = x(1:m^n)'; %K = x(m^n+1:end); K = x; yF = phinorm(K); yPsi = psinorm(K,m,n); r = yPsi/yF; %r = yF/yPsi; y = -r; global maxr if r > maxr global optK optK = K; maxr = r; fprintf('n=%d; m=%d; maxr = %1.9f \n',n,m,maxr); end return function y = myobjm_lips(x) global Ainl Binl Ain1 Bin1 GG iif m n mylinopt phi = x(1:m^n)'; K = x(m^n+1:end); n1 = n-1; K1 = getK1(K,m,n); ksig = (K>0); phiks=pl(phi-ksig'); Kf = getK1(phiks'.*K,m,n); phil = fitlips(K1,Kf,m,n1); fprintf('.'); if ~islip(phil) 'not lip' keyboard end y = phil*K1 - phiks*K; return function y = myobjm_phim(x) global Ainl Binl Ain1 Bin1 GG iif m n mylinopt phi = x(1:m^n)'; K = x(m^n+1:end); n1 = n-1; K1 = getK1(K,m,n); ksig = (K>0); phiks=pl(phi-ksig'); phim = meanphi(phi,m,n); phim = ceil(phim); phim = min(phim,n1); if ~islip(phim) 'not lip' keyboard end y = phim*K1 - phiks*K; return function y = myobjm_phir(x) global Ainl Binl Ain1 Bin1 GG iif m n mylinopt phi = x(1:m^n)'; K = x(m^n+1:end); n1 = n-1; K1 = getK1(K,m,n); ksig = (K>0); phiks=pl(phi-ksig'); Kf = getK1(phiks'.*K,m,n); phir = recphi(K1,Kf,m,n1); fprintf('.'); if ~islip(phir) 'not lip' keyboard end y = phir*K1 - phiks*K; return function y = myobjm_conv(x) global Ainl Binl Ain1 Bin1 GG iif m n mylinopt n1 = n-1; phi = x(1:m^n)'; K = x(m^n+1:end); K1 = getK1(K,m,n); ksig = (K>0); phiks=pl(phi-ksig'); phic = convlips(K1,m,n1)'; fprintf('.'); y = phic*K1 - phiks*K; return function y = myobjm_zajim(x) global Ainl Binl Ain1 Bin1 GG iif m n mylinopt n1 = n-1; phi = x(1:m^n)'; K = x(m^n+1:end); fprintf('.'); global phi00 K00 phi00=phi;K00=K; K1 = getK1(K,m,n); ksig = (K>0); phiks=pl(phi-ksig'); phim = meanphi(phiks,m,n); %phim = round(phim); phiz = zajim(K1,phim,m,n1); y = phiz*K1 - phiks*K; return function y = myobjm_posneg(x) global Ainl Binl Ain1 Bin1 GG iif m n mylinopt n1 = n-1; phi = x(1:m^n)'; K = x(m^n+1:end); Kpl = pl(K); Kng = pl(-K); ksig = (K>0); phiks=pl(phi-ksig'); K1 = getK1(K,m,n); if phiks*K <= 1e-6 phib = zeros(1,m^n1); else K1p = getK1(Kpl,m,n); K1n = getK1(Kng,m,n); %phibp = ceil(termwisebd2(Kpl,phiks,m,n)); %phibn = ceil(termwisebd2(Kng,phi ,m,n)); %phibp = termwisebd2(Kpl,phiks,m,n); %phibn = termwisebd2(Kng,phi ,m,n); %phibn = meanphi(phiks,m,n); phibp = termwisebdu(Kpl,phiks,m,n); if 0 phibn = termwisebdl(Kng,phi ,m,n); %[x,fval] = linprog(-K1p,Ain1,Bin1,[],[],0*K1,0*K1+n1,0,mylinopt); %phibp = x'; %[x,fval] = linprog(-K1n,Ain1,Bin1,[],[],0*K1,0*K1+n1,0,mylinopt); %phibn = x'; phib = pl(phibp - phibn); phib = min(phib,n1); %phib=phibp; %d=max(abs(Ain1*phib')) + eps; %phib = phib/d; if ~islip(phib) %'not lip' phil = lowelip(phib,m,n1); phiu = upperlip(phib,m,n1); if (phiu-phil)*K1 > 0 phib = phiu; else phib = phil; end end end phib = phibp; end y = phib*K1 - phiks*K; return function y = myobjm_pos(x) global Ainl Binl Ain1 Bin1 GG iif m n mylinopt n1 = n-1; % K is positive % phi:X^n -> {0,...,n-1} phi = x(1:m^n)'; K = x(m^n+1:end); K1 = getK1(K,m,n); %[x,fval] = linprog(-K1,Ain1,Bin1,[],[],0*K1,0*K1+n1,0,mylinopt); %phi1 = x'; phi1 = termwisebd(K,phi,m,n); y = phi1*K1 - phi*K; return function y = myobjm_pos0(x) global Ainl Binl Ain1 Bin1 GG iif m n n1 = n-1; phi = x(1:m^n)'; K = x(m^n+1:end); Kpl = pl(K); Kng = pl(-K); ksig = (K>0); phiks=pl(phi-ksig'); K1 = getK1(K,m,n); if phiks*K <= 0 phib = zeros(1,m^n1); else phibp = termwisebd1(Kpl,phiks,m,n); phibn = termwisebd1(Kng,phi,m,n); phib = pl(phibp - phibn); phib = min(phib,n1); if ~islip(phib) 'not lip' keyboard end end y = phib*K1 - phiks*K; return function y = myobjm_greedy(x) global Ainl Binl Ain1 Bin1 GG iif m n n1 = n-1; phi = x(1:m^n)'; K = x(m^n+1:end); ksig = (K>0); phiks=pl(phi-ksig'); K1 = getK1(K,m,n); phim = meanphi(phiks,m,n); phim = min(phim,n1); d = max(Ain1*phim'); %if (d>1) % phim = min(phim/d,n1); %end phim = phim/d; phim = phim-min(phim); %phig = ceil(phim); %phig = phim; if 1 [a,b] = sort(abs(K1)); %[a,b] = sort(K1); b = b(end:-1:1); phig = greedymaxf(K1,phim,m,n,b'); phig = greedymaxf(K1,phig,m,n,b'); %phig = ceil(phig); end y = phig*K1 - phiks*K; return function y = myobjm_psi(x) global Ainl Binl Ain1 Bin1 GG iif m n phi = x(1:m^n)'; K = x(m^n+1:end); K1 = getK1(K,m,n); y = -phi*K; return function y = myobjm_phi1(x) global Ainl Binl Ain1 Bin1 GG iif m n mylinopt n1 = n-1; phi = x(1:m^n)'; K = x(m^n+1:end); ksig = (K>0); phiks=pl(phi-ksig'); %phiks=pl(phi-1); %bad! BAD!! K1 = getK1(K,m,n); [x,fval] = linprog(-K1,Ain1,Bin1,[],[],0*K1,0*K1+n1,0,mylinopt); phi1 = x'; y = phi1*K1 - phiks*K; return