function checkpsi(m,n) n1 = n-1; phi = zeros(m^n,1); phi1 = zeros(m^n1,1); LBK = -ones(size(phi)); UBK = ones(size(phi)); LBg = zeros(size(phi)); %UBg = n+zeros(size(phi)); %LBg = -n*ones(size(phi)); UBg = n*ones(size(phi)); LBg1 = zeros(size(phi1)); UBg1 = n1+zeros(size(phi1)); [Aing,Bing] = gradab(m^n); [Ainl,Binl] = lipab(m,n); [Ain1,Bin1] = lipab(m,n1); GG = gengray(n,m); iif = invperm(GG+1); good = 1; %load PSIV while good K = genK(m,n); [x,fval] = linprog(-K,Ainl,Binl,[],[],LBg,UBg); %if phi*K < 0, K = -K; end fs = abs(fval); S = Psi(K,m,n); %good = (phi*K <= S + 1e-9); good = (fs <= S + 1e-9); if ~good 'rats' save PSIFAIL K phi keyboard end if 1 if flip phi = round(x'); else phi = randlip(m,n); end %[x,fval] = linprog(-K,[],[],[],[],LBg,UBg); %phi = x'; if phi*K < 0, K = -K; end ksig = (K>0)'; phi1 = max(phi-ksig,0); %phi1 = max(phi-1,0); % CAN!! subtract 1 from phi uniformly!!! % BUT, it's too crude a bound %good = (phi*K <= Psit(K,m,n,1) + phi1*K + 1e-9); %good = (phi*K <= Psit(K,m,n,n) + 1e-9); [x,fval] = linprog(-K,Ainl,Binl,[],[],0*K,n1+0*K); phi1 = x'; K1 = getK1(K,m,n); [x,fval] = linprog(-K1,Ain1,Bin1,[],[],0*K1,n1+0*K1); phi11 = x'; good = (phi1*K <= phi11*K1 + 1e-7); if ~good %if 1 'blah' keyboard end if 0 %iim = find(phi1==n); %phi1(iim) = phi1(iim)-1; %[phi1m,phi1M] = collapsephi(K,phi1,m,n); %phi11 = collapsephi(K,phi1,m,n); %phi11 = ceil(phi11); %islip = (max(abs(Ain1*phi11'))<=1); %islipm = (max(abs(Ain1*phi1m'))<=1); %islipM = (max(abs(Ain1*phi1M'))<=1); %if ~(islipm & islipM) %if ~islip % 'oh well, no lip' % keyboard % save NOTLIP K phi %end end end if 0 %ksig = (K>0)'; %phi1 = max(phi-ksig,0); K1 = getK1(K,m,n); %[x,fval] = linprog(-K1,Ain1,Bin1,[],[],LBg1,UBg1); %phi11 = x'; %phi11 = round(phi11-min(phi11)); %s2 = max(phi1m*K1,phi1M*K1); s2 = phi11*K1; good = (phi1*K <= s2+1e-9); %good = (phi1*K <= phi11*K1); %good = (phi*K <= Psit(K,m,n,1)+phi11*getK1(K,m,n) + 1e-9); if ~good 'wtf' save WTF K phi keyboard end end if 0 St = PsiT(K,m,n,n-1); if phi*K > St 'vindication!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' nv = size(VIND,1)+1; VIND{nv,1} = K; VIND{nv,2} = phi; save PSIV VIND end end %fprintf('...........................loop %d: completed %d out of %d \n',loop,rc,nc); %end end return function S = Psi(K,m,n) S = 0; for t=1:n S = S + sum(K.*(K>0)); K = getK1(K,m,n-t+1); end return function S = PsiT(K,m,n,T) S = 0; for t=1:T S = S + sum(K.*(K>0)); K = getK1(K,m,n-t+1); end return