function aphiadd(m0,n0) global m n m = m0; n = n0; global pstr pstr = 'aphiadd' global lstr rstr global reqstat reqstat = 0; P = ones(m^n,1); P = P/sum(P); zz = P*0 + 1e-12; oo = P*0+1; global LB UB Lmf Lmf = getLmf(m,n); pdim = m^n; fdim = m*n; xdim = pdim + fdim; LB = zeros(xdim,1); LB(pdim+1:end) = 0*LB(pdim+1:end)-1; UB = LB*0; UB(1:pdim) = oo; UB(pdim+1:end) = 0*UB(pdim+1:end) + 1; if ~reqstat %DON'T require stationarity Aeq = zeros(1,xdim); Aeq(1:pdim) = oo'; Beq=1; else % require stationarity Aeq0 = zeros(1,xdim); Aeq0(1:pdim) = oo'; Aeq = is_stat(m,n); Aeq = assembleblock({Aeq,zeros(0,fdim)}); Aeq = [Aeq;Aeq0]; Beq = zeros(size(Aeq,1),1); Beq(end)=1; end Ain = []; Bin = []; global A maxr maxr = 0; while 1 if reqstat Py = unifP(m,1); P = randgivenstat(m,n,Py); else P = unifP(m,n); end M = randn(m,n); x = [P(:);M(:)]; y = fmincon(@radrat,x,Ain,Bin,Aeq,Beq,LB,UB); fprintf('%s: n=%d m=%d; rat = %s/%s; maxr = %1.9f \n',pstr,n,m,lstr,rstr,maxr); end return function y = radrat(x) global m n global lstr rstr pstr global Lmf pdim = m^n; fdim = m*n; xdim = pdim + fdim; P = x(1:pdim); M = x(pdim+1:end); P = makepos(P); U = prodmeas(P,m,n); F = Lmf * M; [hh,Ht,H] = gethhn(P,m,n); FP = abs(F'*P); FU = abs(F'*U); lstr = 'FP'; rstr = 'FU'; lhs = eval(lstr); rhs = eval(rstr)+1e-12; r = lhs/rhs; y = -r; global maxr if r > maxr global optP optF optP = P; optF = F; maxr = r; fprintf('%s: n=%d m=%d; rat = %s/%s; maxr = %1.9f \n',pstr,n,m,lstr,rstr,maxr); end return function phi = randlip global Ainf Binf m n mylinopt K = genK(m,n); [x,fval] = linprog(-K,Ainf,Binf,[],[],0*K,0*K+n,0,mylinopt); phi = x'; return function c=i2c(i,m,n) dims = repmat(m,[1 n]); c = ind2coord(i,dims); return