function [phi,K,fval] = optphik(m0,n0) global m n sig X iix dims m = m0; n = n0; % pick a global mu/sig while 1 mu = round(rand(m,1)); if ~all(mu==mu(1)) break end end dims = repmat([m],[1 n]); X = list_all_ind(dims); iix = coord2ind(X,dims); phi = zeros(m^n,1); K = zeros(m^n,1); muv = ismember(X(:,1),mu); muv = muv(iix); muv = reshape(muv,size(phi)); sig = muv*2-1; LBK = zeros(size(phi)); UBK = ones(size(phi)); n1 = n-1; phi1 = zeros(m^n1,1); [Ainf,Binf] = lipab(m,n); LBf = zeros(m^n,1); UBf = n +zeros(m^n,1); xdim = 2*m^n; LB = [LBf; LBK]; UB = [UBf; UBK]; Ain = assembleblock({Ainf,zeros(0,m^n)}); Bin = [Binf]; FN = randFN(m,-n,1,'not'); phi0 = FN{n}; K0 = randn(size(K))/1000; x0 = [phi0(:); K0(:)]; [x,fval] = fmincon(@myobjm,x0,Ain,Bin,[],[],LB,UB); phi = x(1:m^n); K = x(m^n+1:end); phi=round(phi-min(phi)); K = K.*sig; ip = find(K>=0); in = find(K<0); K(ip) = K(ip)/sum(K(ip)); K(in) = K(in)/abs(sum(K(in))); fval = -fval; return function y = myobjm(x) global m n sig X iix dims phi = x(1:m^n); K = x(m^n+1:end); K = K.*sig; ip = find(K>=0); in = find(K<0); K(ip) = K(ip)/sum(K(ip)); K(in) = K(in)/abs(sum(K(in))); y = -phi'*K; return