function sketchpadaux %tmpcheck % this shows why you really do need sublip %betlp %return global m n K K0 m=2 n=2 [Ainf,Binf] = lipab(m,n); 'rounding seems to matter -- investigate!!!' dmin = 1; while 1 K = genK(m,n); K1 = getK1(K,m,n); ksig = (K>0)'; [A,B,LB,UB] = alfab(K,m,n); UB1 = UB + 1; [x,fval] = linprog(-K,A,B,[],[],LB,UB); % fails(!!!) for UB1 alf = x'; alf = round(alf); [x,fval] = linprog(-K,A,B,[],[],LB,UB1); alf1 = x'; alf1 = round(alf1); if ~tryfail(alf1*K,pl(sum(K))+alf*K,'basic SL ineq(1) fails') keyboard, end if 0 trymyalf(alf1,K,m,n); if 1, for t=1:10 K0 = randn(size(K)); [x,fval] = linprog(-K0,A,B,[],[],LB,UB1); alf1 = x'; alf1 = round(alf1); % alf1 is a random element of B_n trymyalf(alf1,K,m,n); end end end end return function [A,B,LB,UB] = alfab(K,m,n) n1 = n-1; MN = repmat([m],[1 n ]); MN1 = repmat([m],[1 n1]); mn = m^n; mn1 = m^n1; A=zeros(0,mn); B=zeros(0,1); rind = 0; for ind1 = 1:mn for ind2 = ind1+1:mn x = ind2coord(ind1,MN); y = ind2coord(ind2,MN); d = rho(x,y); if (sign(K(ind1))==sign(K(ind2))) % signs equal -- ordinary Lip. cond if 1 % condition (ii).a for s = [-1,1] rind = rind+1; A(rind,ind1) = s; A(rind,ind2) = -s; B(rind,1) = d; end end elseif d==1 if (K(ind1)>0) pos = ind1; neg = ind2; else pos = ind2; neg = ind1; end if 0 % condition (ii).b -- DO need this!! rind = rind+1; A(rind,neg) = -1; A(rind,pos) = 1; B(rind,1) = 0; end end end end LB = 0*K; UB = LB + n - (~~pl(K)); %UB = LB + n + 1 - (~~pl(K)); %UB = LB + n + 1; %UB = LB + n; return function alf = mungea(alf,K,m,n) alf0 = alf; %alf = round(alf); % it's much simpler than I thought [A,B,LB,UB] = alfab(K,m,n); if ~all(alf < UB'+1e-8) alf = pl(alf-1); %alf = alf - min(min(alf),1); % NOPE end b = all(LB'<=alf) & all(alf<=UB'+1e-9); b = b & all(A*alf' <= B+1e-9); if ~b 'bad alf' keyboard end return function alf = mungea1(alf,K,m,n) [A,B,LB,UB] = alfab(K,m,n); % DO seem to need this if all(alf < UB'+1e-8) % we're already good return end alf = pl(alf-1); return %don't seem to need this %if min(alf)>1-1e-8 % alf = pl(alf-1); % return %end %if alf*K <= 0 % alf = alf*0; % return %end MN = repmat([m],[1 n ]); ii = find( K'<0 ); alf(ii) = pl(alf(ii)-1); % force sublip property while 1 ii = find(A*alf' > B+1e-6); if isempty(ii) break; % we're done -- they all conform! else i = ii(1); inds = find(A(i,:)); ind1 = inds(1); ind2 = inds(2); % simple idea: just make the bigger one smaller if alf(ind1)>alf(ind2) alf(ind1) = pl(alf(ind1) - 1); else alf(ind2) = pl(alf(ind2) - 1); end end end return function trymyalf(alf,K,m,n) betacheck(alf,K,m,n); atil = mungea(alf,K,m,n); del = alf - atil; if ~tryfail(del*K,pl(sum(K)),'my alf ineq fails!!!!') %if ~tryfail(alf*K,pl(sum(K))+atil*K,'my alf ineq fails!!!!') keyboard, end return function [A,B] = betab(K,m,n) n1 = n-1; MN = repmat([m],[1 n ]); MN1 = repmat([m],[1 n1]); mn = m^n; mn1 = m^n1; A=zeros(0,mn); B=zeros(0,1); rind = 0; for ind1 = 1:mn for ind2 = 1:mn x = ind2coord(ind1,MN); y = ind2coord(ind2,MN); if (sign(K(ind1))>sign(K(ind2))) rind = rind+1; A(rind,ind2) = -1; A(rind,ind1) = 1; B(rind,1) = 0; end end end return function betacheck(bet,K,m,n) %[A,B,LB,UB] = alfab(K,m,n); %UB1 = UB+1; %if 1 % NO!! %if ~all(bet < UB'+1e-8) if max(bet)-min(bet) > n zind = find((K<0) & (~bet')); xind = find((K>0) & (bet')); if (~isempty(zind) & ~isempty(xind)) 'predicate fails' keyboard end if (~isempty(zind)) 'weaker predicate fails' keyboard end if 1 % in fact, strong sublip is FALSE!! [A,B] = betab(K,m,n); %b = all(A*bet' < B+1e-9); b = all(A*(~~bet') < B+1e-9); if ~b 'strong sublip fails' keyboard end end end return function sketchpadaux3 global m n K K0 m=2 n=3 [Ainf,Binf] = lipab(m,n); dmin = 1; while 1 K = genK(m,n); K1 = getK1(K,m,n); ksig = (K>0)'; [A,B,LB,UB] = alfab(K,m,n); UB1 = UB + 1; [x,fval] = linprog(-K,A,B,[],[],LB,UB); % fails(!!!) for UB1 alf = x'; %alf = round(alf); [x,fval] = linprog(-K,A,B,[],[],LB,UB1); alf1 = x'; %alf1 = round(alf1); if 0 d = min(min(alf1),dmin); atil = alf1-d; b = all(LB'<=atil) & all(atil<=UB'+1e-6); b = b & all(A*atil' <= B+1e-9); if ~b 'bad atil' keyboard end end if 1 for t=1:20 %K0 = genK(m,n); %K0 = K; %K0 = abs(randn(m^n,1)).*sign(K); K0 = randn(size(K)); [x,fval] = linprog(-K0,A,B,[],[],LB,UB); alf = x'; [x,fval] = linprog(-K0,A,B,[],[],LB,UB1); alf1 = x'; % alf,alf1 are random elements of A_n and B_n, resp if ~tryfail(alf1*K,pl(sum(K))+alf*K,'basic SL ineq fails') keyboard, end % nope %d0 = max(alf)-min(alf); %d1 = max(alf1)-min(alf1); %if ~tryfail(max(d0,d1),n,'diam fails'), % keyboard, %end %if ~tryfail(max(Ainf*alf1'),2,'Lip2 fails'), % keyboard, %end %phi = alf1+ksig; %if ~tryfail(max(Ainf*phi'),1,'Lip1 fails'), % keyboard, %end end end end return function sketchpadaux2 global m n m=2 n=3 while 1 K = genK(m,n); K1 = getK1(K,m,n); ksig = (K>0)'; [A,B] = lipab(m,n); [x,fval] = linprog(-K,A,B,[],[],0*K,n+0*K); %phi = round(x'); phi = (x'); ptil = pl(phi-ksig); [A,B,LB,UB] = alfab(K,m,n); UB1 = UB + 1; [x,fval] = linprog(-K,A,B,[],[],LB,UB); % fails(!!!) for UB1 %[x,fval] = linprog(-K,[],[],[],[],LB,UB); % fails(!!!) for UB1 alf = x'; %alf = round(alf); [x,fval] = linprog(-K,A,B,[],[],LB,UB1); %[x,fval] = linprog(-K,[],[],[],[],LB,UB1); alf1 = x'; %alf1 = round(alf1); if ~tryfail(alf*K,Psi(K1,m,n-1),'(1) fails'), keyboard, end %if ~tryfail(alf1*K,pl(sum(K))+alf*K,'(2) fails'), %this indeed fails if ~tryfail(alf1*K,pl(sum(K))+Psi(K1,m,n-1),'(2) fails'), keyboard, end if 1 %K0 = genK(m,n); %K0 = K; K0 = abs(randn(m^n,1)).*sign(K); UB = UB+0; %dmin = 2; dmin = 1; UB1 = UB + dmin; [x,fval] = linprog(-K0,A,B,[],[],LB,UB); alf = x'; [x,fval] = linprog(-K0,A,B,[],[],LB,UB1); alf1 = x'; end if 1 atil = ptil; b = all(LB'<=atil) & all(atil<=UB'); b = b & all(A*atil' <= B+1e-9); if ~b 'bad ptil' keyboard end end d = min(min(alf1),dmin); %atil = alf1-(min(alf1)>=1); atil = alf1-d; b = all(LB'<=atil) & all(atil<=UB'+1e-9); b = b & all(A*atil' <= B+1e-9); if ~b 'bad atil' keyboard end 'its ok', keyboard %if ~tryfail(alf1*K,pl(sum(K))+atil*K,'alf ineq fails'), keyboard, end %if ~tryfail(alf1*K,pl(sum(K))+alf*K,'BASIC alf ineq fails'), keyboard, end % this basic one FAILS!! % see /home/lkontor/SKETCHFAIL1 end return function sketchpadaux1 global m n A B K K1 phi ksig ptil m=3 n=3 while 1 K = genK(m,n); K1 = getK1(K,m,n); ksig = (K>0)'; s = 0; for y=1:m Ky = getky(K,y,m,n); Ky1 = getky(K1,y,m,n-1); s = s + pl(sum(Ky)) + Psi(Ky1,m,n-2); end if ~tryfail(s,Psi(K1,m,n-1),'psi ineq(1) fails'),keyboard,end % seems to work s = 0; for y=1:m Ky = getky(K,y,m,n); s = s + pl(sum(Ky)) + Psi(Ky,m,n-1); end if ~tryfail(s,Psi(K,m,n),'psi ineq(2) fails'),keyboard,end % seems to work % NO if 0 if flip alf = rand(size(K'))*n; else [x,fval] = linprog(-K,[],[],[],[],0*K,0*K+n); alf = x'; if ~tryfail(alf*K,pl(sum(K))+pl(alf-1)*K,'(1) fails'), keyboard, end end end %if flip %if 0 % randliphi %else % optphi %end %advphi %alfconj [A,B,LB,UB] = alfab(K,m,n); UB1 = UB + 1; [x,fval] = linprog(-K,A,B,[],[],LB,UB); % fails(!!!) for UB1 alf = x'; if ~tryfail(alf*K,Psi(K1,m,n-1),'(1) fails'), keyboard, end [x,fval] = linprog(-K,A,B,[],[],LB,UB1); alf1 = x'; %if ~tryfail(alf1*K,pl(sum(K))+alf*K,'(2) fails'), %this indeed fails if ~tryfail(alf1*K,pl(sum(K))+Psi(K1,m,n-1),'(2) fails'), keyboard, end if 0 % NO s = []; for i=2:n s(i) = 0; for y=1:m %Ky = getky(K,y,m,n); Ky = project(K,y,m,n,i); s(i) = s(i) + pl(sum(Ky)); end end ms = max(s); [x,fval] = linprog(-K,A,B,[],[],LB,UB); % fails(!!!) for UB1 alf = x'; %if ~tryfail(alf*K,pl(sum(K))+pl(alf-1)*K,'alf ineq fails'), if ~tryfail(alf*K,ms+pl(alf-1)*K,'alf ineq fails'), keyboard, end end if 1 %if flip if 1 %alf1 = rand(size(K'))*n - (~~pl(K')); alf1 = rand(size(K'))*100; else [x,fval] = linprog(-K,[],[],[],[],0*K,0*K+n); alf1 = x'; end end ii = find(alf1==n+1); atil = alf1; atil(ii) = atil(ii)-1; %atil = pl(alf1-1); % this one don't work!!! if ~tryfail(alf1*K,pl(sum(K))+atil*K,'alf ineq fails'), keyboard, end end return function [A,B,LB,UB] = alfab0(K,m,n) n1 = n-1; MN = repmat([m],[1 n ]); MN1 = repmat([m],[1 n1]); mn = m^n; mn1 = m^n1; A=zeros(0,mn); B=zeros(0,1); rind = 0; rind = 0; for ind1 = 1:mn for ind2 = ind1+1:mn x = ind2coord(ind1,MN); y = ind2coord(ind2,MN); %if rho(x,y)==1 % Hamming dist == 1 if 1 d = rho(x,y); if (sign(K(ind1))==sign(K(ind2))) % signs equal -- ordinary Lip. cond if 1 % condition (ii).a for s = [-1,1] rind = rind+1; A(rind,ind1) = s; A(rind,ind2) = -s; B(rind,1) = d; end end else % try w/o this? -- not quite % try alternative % "neg" ind - "pos" ind <= 2 % "pos" - "neg" <= 0 if (K(ind1)>0) pos = ind1; neg = ind2; else pos = ind2; neg = ind1; end if 1 % condition (ii).b -- DO need this!! rind = rind+1; A(rind,neg) = -1; A(rind,pos) = 1; B(rind,1) = 0; end end end end end LB = 0*K; UB = LB + n - (~~pl(K)); %UB = LB + n + 1 - (~~pl(K)); %UB = LB + n + 1; %UB = LB + n; return function [fval,alf] = alflp(K,m,n) global ptil [A,B,LB,UB] = alfab(K,m,n); [x,fval] = linprog(-K,A,B,[],[],LB,UB); alf = x'; fval = -fval; %lhs = max(A*ptil' - B) ; %rhs = 0; %tryfail(lhs,rhs,'ptil glitch'); return function alf = atil(alf,K,m,n) alf0=alf; % take off one for the negative K's %ii = ~~(K<0); %a1 = pl(alf - ii'); %a1 = min(alf,n-1); %a1 = min(alf,n); %ii = (~~(K'>0))&(alf>n-1); %a1 = alf - ii; %ii = ~~(K>0); %a1 = pl(alf - ii'); %a1 = pl(alf-1); [A,B,LB,UB] = alfab(K,m,n); alf = round(alf); alf = alf - (alf>UB'); ii = find(K<0)'; alf(ii) = min(alf(ii),n); if sum(K)<=0 alf = alf - min(alf); end b = all(LB'<=alf) & all(alf<=UB'); b = b & all(A*alf' <= B+1e-9); if ~b 'bad atil' keyboard end %[fval,a1] = alflp(K,m,n); return function alf = mungea0(alf,K,m,n) % try the following simple algorithm % 1. find smallest (most neg) value of K[x] % 2. find all y within rho(1) of x % 3. A[y] -= 1 % 4. enforce (ii) % too complicated --> prob won't work! % different idea [A,B,LB,UB] = alfab(K,m,n); if all(alf < UB'+1e-8) % we're already good return end if min(alf)>1-1e-8 alf = pl(alf-1); return end if alf*K <= 0 alf = alf*0; return end MN = repmat([m],[1 n ]); %ii = find(K'<0); %ii = find( (alf > UB'+1e-6) ); %ii = find( (alf > UB'+1e-6) | (alf > n+1-1e-6) ); ii = find( (alf > UB'+1e-6) | (K'<0) ); % seems like really need this!! alf(ii) = pl(alf(ii)-1); % this takes care of the LB, UB condition % force sublip property while 1 ii = find(A*alf' > B+1e-6); if isempty(ii) % we're done -- they all conform! break; else i = ii(1); inds = find(A(i,:)); ind1 = inds(1); ind2 = inds(2); % simple idea: just make the bigger one smaller if alf(ind1)>alf(ind2) alf(ind1) = pl(alf(ind1) - 1); else alf(ind2) = pl(alf(ind2) - 1); end %x = ind2coord(ind1,MN); %y = ind2coord(ind2,MN); % it must be the case that sign(K(x))~=sign(K(y)) if 0 if (K(ind1)>0) pos = ind1; neg = ind2; else pos = ind2; neg = ind1; end end end end return function checkay(alf) global m n A B K K1 phi ksig ptil %a1 = atil(alf,K,m,n); %if ~tryfail(alf*K,pl(sum(K))+a1*K,'decomposition fails'),keyboard,end s = 0; for y=1:m %y Ky = getky(K,y,m,n); K1y = getky(K1,y,m,n-1); %ay = getky(a1,y,m,n); ay = getky(alf,y,m,n); %a1 = atil(0,Ky,m,n-1); % force UB to hold a1 = atil(ay,Ky,m,n-1); % force UB to hold if 0 [A,B,LB,UB] = alfab(Ky,m,n-1); b = all(LB'<=ay) & all(ay<=UB'); b = b & all(A*ay' <= B+1e-9); if ~b, 'A_n membership fails', keyboard, end end %if ~tryfail(ay*Ky,Psi(K1y,m,n-2),'inner ineq fails'),keyboard,end if ~tryfail(ay*Ky,pl(sum(Ky))+a1*Ky,'inner ineq fails'),keyboard,end %s = s + Psi(K1y,m,n-2); s = s + ay*Ky; end %if ~tryfail(alf*K,Psi(K1,m,n-1),'outer ineq fails'),keyboard,end if ~tryfail(alf*K,pl(sum(K))+s,'outer ineq fails'),keyboard,end return function randliphi global m n A B K K1 phi ksig ptil phi = randlip(m,n); ptil = pl(phi-ksig); return function advphi global m n A B K K1 phi ksig ptil % adversarial phi phi = zeros(1,m^n); ii = find(K>0); phi(ii) = n*ones(size(ii)); ptil = pl(phi-ksig); return function optphi global m n A B K K1 phi ksig ptil [A,B] = lipab(m,n); [x,fval] = linprog(-K,A,B,[],[],0*K,n+0*K); phi = round(x'); ptil = pl(phi-ksig); return function alfconj global m n A B K K1 phi ksig ptil [fval,alf] = alflp(K,m,n); checkay(alf); lhs = fval; rhs = Psi(K1,m,n-1); if ~tryfail(lhs,rhs,'alfconj FALSE') keyboard,end return %a1 = min(alf,n-1); a1 = atil(alf,K,m,n); %tryfail(alf*K,sum(K)+a1*K ,'fail1'); %tryfail( sum(K)+a1*K,pl(sum(K))+a1*K ,'fail2'); %tryfail(alf*K,pl(sum(K))+a1*K ,'fail2.1'); return tryfail(alf*K,pl(sum(K))+sumkphiy(K,a1,m,n) ,'fail2.5'); tryfail(pl(sum(K))+a1*K, Psi(K1,m,n-1) ,'fail3'); tryfail(pl(sum(K))+a1*K, pl(sum(K1))+sumky(K1,m,n-1) ,'fail4'); lhs = alf*K; rhs = pl(sum(K1)) + sumky(K1,m,n-1); %tryfail(lhs,rhs,'huh?'); return function Ky = project(K,y,m,n,i) %global m n MN = repmat([m],[1 n]); Ky = []; mn = m^n; for ind = 1:mn z = ind2coord(ind,MN); %if z(end)==y %if z(1)==y if z(i)==y Ky(end+1) = K(ind); end end %Ky=Ky(:); Ky = reshape(Ky,size(K(1:length(Ky)))); return function S = sumky(K,m,n) %global m n S = 0; for y=1:m Ky = getky(K,y,m,n); S = S + Psi(Ky,m,n-1); end return function S = sumkphiy(K,phi,m,n) %global m n S = 0; for y=1:m Ky = getky(K,y,m,n); phiy = getky(phi,y,m,n); S = S + phiy*Ky; end return function Ky = getky(K,y,m,n) %global m n MN = repmat([m],[1 n]); Ky = []; mn = m^n; for ind = 1:mn z = ind2coord(ind,MN); if z(end)==y %if z(1)==y Ky(end+1) = K(ind); end end %Ky=Ky(:); Ky = reshape(Ky,size(K(1:length(Ky)))); return function good = tryfail(lhs,rhs,failstr) global m n A B K K1 phi ksig ptil good = (lhs <= rhs+1e-6); if ~good failstr %save SKETCHFAIL m n A B K K1 phi ksig ptil %keyboard end return function betlp global m n K K0 m=2 n=3 while 1 K = genK(m,n); K1 = getK1(K,m,n); ksig = (K>0)'; if 1 [Ad,Bd,LBd,UBd] = delab(K,m,n); [x,fval] = linprog(-K,Ad,Bd,[],[],0*K,0*K+1); oneb = x'; oneb = round(oneb); if ~tryfail(oneb*K,pl(sum(K)),'oneb dont work!!!'), keyboard, end end [A,B,LB,UB] = alfab(K,m,n); if flip [x,fval] = linprog(-K,A,B,[],[],LB,UB+1); else K0 = randn(size(K)); [x,fval] = linprog(-K0,A,B,[],[],LB,UB+1); end bet = x'; bet = round(bet); alf = mungea(bet,K,m,n); oneb = bet - alf; %b = all(Ad*oneb'1e-9)) %if 1 % only works when oneb is nonhomogeneous!!!! %[K oneb'] phitable(K,oneb,m,n) %[Ad,Bd,LBd,UBd] = delab(K,m,n); b = all(Ad*oneb'0)'; [x,fval] = linprog(-K,Ainf,Binf,[],[],0*K,0*K+n); phi = x'; phi = round(phi); %phi1 = pl(phi-1); phi1 = pl(phi-ksig); %if ~tryfail(phi*K,sum(pl(K))+phi1*K,'simple -1 dont work dude!!!'), if ~tryfail(phi*K,sum(pl(K))+phi1*K,'phi1 dont work dude!!!'), keyboard, end if 1 % ok, so it's obv not sublip [A,B,LB,UB] = alfab(K,m,n); alf = phi1; b = all(LB'<=alf) & all(alf<=UB'+1e-9); b = b & all(A*alf' <= B+1e-9); if ~b 'bad alf' keyboard end end if ~tryfail(phi1*K,Psi(K1,m,n-1),'psi bound fails for phi1'), keyboard, end end return function [A,B,LB,UB] = delab(K,m,n) n1 = n-1; MN = repmat([m],[1 n ]); MN1 = repmat([m],[1 n1]); mn = m^n; mn1 = m^n1; A=zeros(0,mn); B=zeros(0,1); rind = 0; for ind1 = 1:mn for ind2 = 1:mn x = ind2coord(ind1,MN); y = ind2coord(ind2,MN); % no need to enforce lip -- the range is [0,1] if (sign(K(ind1))>sign(K(ind2))) rind = rind+1; A(rind,ind2) = -1; B(rind,1) = -1; rind = rind+1; A(rind,ind2) = -1; A(rind,ind1) = 1; B(rind,1) = 0; end end end LB = 0*K; UB = 0*K + 1; return