function maxdevsketch(m0,n0,F0) global m n F randomize m = m0; n = n0; F = F0; global pstr pstr = 'maxdevsketch' global lstr rstr P = ones(m^n,1); P = P/sum(P); zz = P*0 + 1e-12; oo = P*0+1; pdim = m^n; adim = m*F; xdim = pdim + adim; LB = zeros(xdim,1); LB(1:adim) = LB(1:adim) - 10; LB(adim+1:end) = zz; UB = LB*0; UB(1:adim) = UB(1:adim) + 10; UB(adim+1:end) = oo; if 0 Aeq = zeros(1,xdim); Aeq(adim+1:end) = oo'; Beq=1; else % require stationarity Aeq0 = zeros(1,xdim); Aeq0(adim+1:end) = oo'; Aeq = is_stat(m,n); Aeq = assembleblock({zeros(0,adim),Aeq}); Aeq = [Aeq;Aeq0]; Beq = zeros(size(Aeq,1),1); Beq(end)=1; end global A maxr maxr = 0; while 1 A = randn(m,F); %P = unifP(m,n); Py = unifP(m,1); P = randgivenstat(m,n,Py); x = [A(:);P(:)]; y = fmincon(@radrat,x,[],[],Aeq,Beq,LB,UB); fprintf('%s: n=%d m=%d F=%d; rat = %s/%s; maxr = %1.9f \n',pstr,n,m,F,lstr,rstr,maxr); %fprintf('m=%d n=%d F=%d; maxr = %1.9f \n',m,n,F,maxr); end return function y = radrat(x) global m n F global lstr rstr global pstr pdim = m^n; adim = m*F; xdim = pdim + adim; A = reshape(x(1:adim),[m F]); P = x(adim+1:end); P = makepos(P); U = prodmeas(P,m,n); %U = 0*P+1; U=U/sum(U); %NO -- doesn't work!! [hh,Ht,H] = gethhn(P,m,n); EdP = Emaxdev(A,P); EdU = Emaxdev(A,U); %lstr = 'abs(EdP-EdU)'; %rstr = 'H'; %H1 = sum(hh(1,:))+1; lstr = 'EdP'; rstr = 'EdU*H'; lhs = eval(lstr); rhs = eval(rstr)+1e-9; r = lhs/rhs; %if r > 1.01 % keyboard %end y = -r; global maxr if r > maxr global optP optA optP = P; optA = A; maxr = r; fprintf('%s: n=%d m=%d F=%d; rat = %s/%s; maxr = %1.9f \n',pstr,n,m,F,lstr,rstr,maxr); %fprintf('m=%d n=%d F=%d; maxr = %1.9f \n',m,n,F,maxr); end return