function dtreesketch(m0,n0) global n m global SUBT randomize m = m0; n = n0; global mrat mrat = 0; while 1 SUBT = []; treecheck fprintf('n=%d mrat = %1.9f \n',n,mrat); if mrat > 1.01 keyboard end end %trexplore %trespc %doplot %strucsearch return function maxtha global A mtha [ni,nj,m,m] = size(A); mtha = 0; for i=1:ni for j=1:nj Aij = squeeze(A(i,j,:,:)); mtha = max(mtha,strict(Aij)); end end return function treecheck global n m hh0 global A C T P T = randdtree(n); %fstr='1<2;1<3'; %fstr='1<2<3'; %fstr = '1<2;1<3;2<4;3<5'; %fstr = '1<2;1<3;2<4;3<5;5<6'; %fstr = '1<2;1<3;2<4;' %T = readtree(fstr); [n,n] = size(T); [nodesi,nodesj]=find(T); L = treewidth(T); th0 = 1/L; %A = zeros(length(nodesi),length(nodesi),m,m); A=[]; A0 = pnormdim(rand(m,m),1); for e=1:length(nodesi) e1 = nodesi(e); e2 = nodesj(e); %Ae = pnormdim(rand(m,m),1); Ae = randAth(m,th0); %Ae = A0; Ae = reshape(Ae,1,1,m,m); A(e1,e2,:,:) = Ae; end maxtha; C = pnormdim(rand(m,1),1); P = dtreefillprob(m,n,T,A,C); [hh0,Ht,H] = gethhn(P,m,n); for i=1:n for j=i+1:n etaij(P,m,n,i,j); h = mxetaij(P,m,n,i,j); % the new one, as in Samson %tp = thaprod(i,j); h1 = treehij(A,C,T,i,j) + 1e-14; global mrat mA mC mT r = h/h1; if r > 1.01 keyboard end if r > mrat mrat = r; mA = A; mT = T; mC = C; end %good = (h<=tp+1e-9) %if ~good % 'bad bound' % keyboard %end end end return function [h,xim] = etaij(P,m,n,i,j) global hh0 h = 0; xim = 0; dims = repmat([m],[1 i-1]); for xi = 1:m^(i-1) X = ind2coord(xi,dims); hX = etaijX0(P,m,n,i,j,X); if hX > h h = hX; xim = xi; end end return function h = etaijX0(P,m,n,i,j,X) global A C T h = 0; for y1 = 1:m for y2 = y1+1:m if 1 P0 = getcondP(P,m,n,[j:n],[1:i],[X y1]); P1 = getcondP(P,m,n,[j:n],[1:i],[X y2]); h0 = .5*sum(abs(P0-P1)); %h1 = treesubij1(i,j,y1,y2); %h1 = treesubtensub(i,j,y1,y2); %h1 = etaijXdtree23(P,m,n,i,j,X,y1,y2); h1 = etaijtreetens3(i,j,y1,y2); g1 = abs(h0-h1)<1e-9; %h1 = etaijXdtree22ub(P,m,n,i,j,X,y1,y2); %g2 = h01 % keyboard %end return h = 0; for x2 = 1:m for x3 = 1:m pp1 = A(1,2,x2,w1)*A(1,3,x3,w1); pp2 = A(1,2,x2,w2)*A(1,3,x3,w2); h = h + .5*abs(pp1-pp2); end end return function pq = tensprod(p,q) m = length(p); pq = zeros(m^2,1); for x = 1:m for y = 1:m xyind = coord2ind([x y],[m m]); pq(xyind) = p(x) * q(y); end end return function AB = ABprod(A,B) [mA,nA] = size(A); [mB,nB] = size(B); AB = []; for x=1:nA for y = 1:nB abind = coord2ind([x y],[nA nB]); AB(:,abind) = tensprod(A(:,x),B(:,y)); end end return function d = TV(x) d = .5 * sum(abs(x)); return function tp = thaprod(i,j) global A T mtha dp = dpath(T,i,j); L = treewidth(T); tp = ((2*L-1)*mtha)^(length(dp)-1); return tp = 0; for ki = 1:length(dp)-1 u = dp(ki); v = dp(ki+1); Auv = squeeze(A(u,v,:,:)); %tp = tp * strict(Auv); tp = max(tp,strict(Auv)); end tp = tp^(length(dp)-1); return function h = etaijXdtree3(P,m,n,i,j,y,w1,w2) global A C T h = 0; dp = dpath(T,i,j); ldp = length(dp)-1; Ddp = repmat([m],[1 ldp]); if dp(1)~=i h = 0; return end Sum = 0; for si=1:prod(Ddp) s = ind2coord(si,Ddp); f = 1; for t=2:ldp f = f * A(dp(t),dp(t+1),s(t),s(t-1)); end g1 = 1; g2 = 1; ikids = find(T(i,:)); for vi = 1:length(ikids) v = ikids(vi); g1 = g1 * A(i,v,s(1),w1); g2 = g2 * A(i,v,s(1),w2); end %Sum = Sum + f*g1 - f*g2; Sum = Sum + abs(f*g1 - f*g2); end h = .5*abs(Sum); return function h = etaijXdtree22(P,m,n,i,j,y,w1,w2) global A C T global LEVELS h = 0; LEVELS = repmat({[]},n,1); Ti = getSubt(T,i); jj = Ti(Ti>=j); if isempty(jj) return end getLevels(T,1,0); j0 = min(jj); levi0 = getLevu(i); levj0 = getLevu(j0); %xind = intersect(LEVELS{levj0},j0:n); %xind = intersect(xind,Ti); Ej = getEj(T,j0); %if ~isempty(setdiff(Ej(:,2),Ti)) % 'aha' % keyboard %end % really do need the intersect!! % in both cases xind = intersect(Ej(:,2),Ti); DX = repmat([m],[1 length(xind)]); zind = intersect(Ti,i+1:j0-1); % YES, really do need zind def %zind0 = intersect(Ti,1:j0-1); %if ~isempty(symsetdiff(zind,zind0)) % 'aha' % keyboard %end DZ = repmat([m],[1 length(zind)]); for xi=1:prod(DX) x = ind2coord(xi,DX); Sum = 0; for zi=1:prod(DZ) z = ind2coord(zi,DZ); pcond1 = getcondP0([zind xind],[i],[z x],[w1]); pcond2 = getcondP0([zind xind],[i],[z x],[w2]); Sum = Sum + pcond1 - pcond2; end h = h + .5*abs(Sum); end return function h = etaijXdtree22ub(P,m,n,i,j,y,w1,w2) global A C T global LEVELS h = 0; LEVELS = repmat({[]},n,1); Ti = getSubt(T,i); jj = Ti(Ti>=j); if isempty(jj) return end getLevels(T,1,0); j0 = min(jj); levi0 = getLevu(i); levj0 = getLevu(j0); Ej = getEj(T,j0); xind = intersect(Ej(:,2),Ti); xind = intersect(xind,LEVELS{levj0}); DX = repmat([m],[1 length(xind)]); zind = intersect(Ti,i+1:j0-1); DZ = repmat([m],[1 length(zind)]); for xi=1:prod(DX) x = ind2coord(xi,DX); Sum = 0; for zi=1:prod(DZ) z = ind2coord(zi,DZ); pcond1 = getcondP0([zind xind],[i],[z x],[w1]); pcond2 = getcondP0([zind xind],[i],[z x],[w2]); Sum = Sum + pcond1 - pcond2; end h = h + .5*abs(Sum); end return function Pc = getcondP0(jj,ii,x,y) global P m n % P = P{ X[jj]=x | X[ii]=y } Pjoin = getPX(P,m,n,[y x],[ii jj]); Pmarg = getPX(P,m,n,[y ],[ii ]); Pc = Pjoin/(Pmarg+realmin); return % good function h = etaijXdtree21(P,m,n,i,j,y,w1,w2) global A C T h = 0; Djn = repmat([m],[1 n-j+1]); Dij = repmat([m],[1 j-i-1]); D1n = repmat([m],[1 n]); Ei = getEij(T,i,i+1); for xi=1:prod(Djn) xjn = ind2coord(xi,Djn); px = PI(T,xjn,j:n); Sum = 0; for zi=1:prod(Dij) zij = ind2coord(zi,Dij); yw1zx = [y w1 zij xjn]; ind1 = coord2ind(yw1zx,D1n); yw2zx = [y w2 zij xjn]; ind2 = coord2ind(yw2zx,D1n); s = [y w1 zij xjn]; f2 = 1; g1 = 1; g2 = 1; for e=1:size(Ei,1) u = Ei(e,1); v = Ei(e,2); if u==i g1 = g1 * A(i,v,s(v),w1); g2 = g2 * A(i,v,s(v),w2); else f2 = f2 * A(u,v,s(v),s(u)); end end pcond1 = px*f2*g1; pcond2 = px*f2*g2; Sum = Sum + pcond1 - pcond2; end h = h + .5*abs(Sum); end return function h = etaijXdtree2(P,m,n,i,j,y,w1,w2) global A C T h = 0; Djn = repmat([m],[1 n-j+1]); Dij = repmat([m],[1 j-i-1]); D1n = repmat([m],[1 n]); Ei = getEij(T,i,i+1); for xi=1:prod(Djn) xjn = ind2coord(xi,Djn); Sum = 0; for zi=1:prod(Dij) zij = ind2coord(zi,Dij); yw1zx = [y w1 zij xjn]; ind1 = coord2ind(yw1zx,D1n); yw2zx = [y w2 zij xjn]; ind2 = coord2ind(yw2zx,D1n); s = [y w1 zij xjn]; f1 = 1; for e=1:size(Ei,1) u = Ei(e,1); v = Ei(e,2); f1 = f1 * Pi(T,v,s); end f2 = 1; g1 = 1; g2 = 1; for e=1:size(Ei,1) u = Ei(e,1); v = Ei(e,2); if u==i g1 = g1 * A(i,v,s(v),w1); g2 = g2 * A(i,v,s(v),w2); else f2 = f2 * A(u,v,s(v),s(u)); end end pcond1 = f1*f2*g1; pcond2 = f1*f2*g2; Sum = Sum + pcond1 - pcond2; end h = h + .5*abs(Sum); end return function h = etaijXdtree1(P,m,n,i,j,y,w1,w2) global A C T h = 0; Djn = repmat([m],[1 n-j+1]); Dij = repmat([m],[1 j-i-1]); D1n = repmat([m],[1 n]); Pw1 = getPX(P,m,n,[y w1],1:i); Pw2 = getPX(P,m,n,[y w2],1:i); for xi=1:prod(Djn) xjn = ind2coord(xi,Djn); Sum = 0; for zi=1:prod(Dij) zij = ind2coord(zi,Dij); yw1zx = [y w1 zij xjn]; ind1 = coord2ind(yw1zx,D1n); yw2zx = [y w2 zij xjn]; ind2 = coord2ind(yw2zx,D1n); s1 = [y w1 zij xjn]; s2 = [y w2 zij xjn]; Ei = getEij(T,i,i+1); f1 = 1; for e=1:size(Ei,1) u = Ei(e,1); v = Ei(e,2); f1 = f1 * Pi(T,v,s1); end f2 = 1; g1 = 1; g2 = 1; for e=1:size(Ei,1) u = Ei(e,1); v = Ei(e,2); if u==i g1 = g1 * A(u,v,s1(v),s1(u)); g2 = g2 * A(u,v,s2(v),s2(u)); else f2 = f2 * A(u,v,s1(v),s1(u)); end end pcond1 = f1*f2*g1; pcond2 = f1*f2*g2; Sum = Sum + pcond1 - pcond2; end h = h + .5*abs(Sum); end return function p = treecondpr(T,i,yx) global A Eij = getEij(T,i,i+1); p = 1; for e=1:size(Eij,1) u = Eij(e,1); v = Eij(e,2); p = p * Psubt(T,u,v,yx); %p1 = Psubt(T,u,v,yx); %p2 = A(u,v,yx(v),yx(u)) * Pi(T,v,yx); %good = abs(p1-p2)<1e-9; %if ~good % 'not good tcp' % keyboard %end end return function p = Psubt(T,u,v,yx) global A % Pr{sub-tree starting at v == x | v's parent u == y} %if isempty(x) % p = 1; %else p = A(u,v,yx(v),yx(u)); vkids = find(T(v,:)); u1 = v; for vi=1:length(vkids) v1 = vkids(vi); p = p * Psubt(T,u1,v1,yx); end %end return function p = PI(T,x,jj) global SUBT n p = 1; s = zeros(1,n); s(jj) = x; while ~isempty(jj) v = jj(1); SUBT = []; p = p*Pi(T,v,s); jj = setdiff(jj,SUBT); end return function p = Pi(T,v,x) global A SUBT p = 1; SUBT(end+1) = v; vkids = find(T(v,:)); for vi=1:length(vkids) v1 = vkids(vi); p = p * A(v,v1,x(v1),x(v)); p = p * Pi(T,v1,x); end %[nodesi,nodesj]=find(T); %for e=1:length(nodesi) % i = nodesi(e); % j = nodesj(e); % if (i>=v) % p = p * A(i,j,x(j),x(i)); % end %end return function Eij = getEij(T,i,j) Eij = []; [nodesi,nodesj]=find(T); for e=1:length(nodesi) e1 = nodesi(e); e2 = nodesj(e); if ((e1<=i) & (e2>=j)) Eij = [Eij;[e1 e2]]; end end return function P = dtreefillprob(m,n,T,A,C) % for directed trees % the first node is always the root P = zeros(m^n,1); dims = repmat([m],[1 n]); [nodesi,nodesj]=find(T); ne = length(nodesi); for xind = 1:m^n x = ind2coord(xind,dims); p = C(x(1)); for e=1:length(nodesi) i = nodesi(e); j = nodesj(e); p = p * A(i,j,x(j),x(i)); end P(xind) = p; end return %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function strucsearch global n m P T A C th0 global mrat mT mA mC global longA longA = 0; mrat = 0; while 1 T = randdtree(n); maxd = fanout(T); for b = .01:.1:.99 %for b1 = .0:.1:1 for b1 = 0 A = eye(2); A(1,1) = b; A(2,1) = 1-b; A(1,2) = b1; A(2,2) = 1-b1; A = A + eps; A = pnormdim(A,1); C = ones(m,1)/m; P = dtreefillprob(m,n,T,A,C); th = getTH(A); [hh,Ht,H] = gethhn(P,m,n); maxhr = 0; for i=1:n-1 for j=i+1:n i0=geti0(T,i,j); di0 = sum(T(i0,:)); %Bij = th^(j-i)*maxd; if maxd<=1 mdep = j-i; else %mdep = ceil(log(j-i)/log(maxd)); %N = j-i+1; %mdep = floor(log(N*(maxd-1)+1)/log(maxd)-1); N = j-i; %mdep = floor(log(N*(maxd-1)+1)/log(maxd)-1); %mdep = minlev(j,maxd)-minlev(i,maxd); li = minlev(i,maxd); lj = floor(log(N*(maxd-1)/maxd^li + 1)/log(maxd)) + li -1; mdep = lj - li; end Bij = di0*th^mdep; if min(Bij,hh(i,j)) > 1e-13 % otherwise, all bets are off -- numerics too sketchy rat = hh(i,j)/Bij; maxhr = max(maxhr,rat); if rat > 1.01 fprintf('i=%d j=%d mdep = %d Bij = %1.5f rat = %1.5f\n',i,j,mdep,Bij,hh(i,j)/Bij); end end end %maxhr = max(maxhr,hh(i,i+1)); end r = maxhr; if r > mrat mrat = r; mT = T; mA = A; mC = C; save TREDAT mT mA mC mrat end fprintf('strucsearch n=%d k=%d MRAT = %1.9f\n',n,maxd,mrat); end end end return function doplot global n m P T A C th0 global mrat mT mA mC global longA longA = 0; mrat = 0; bb = []; rr = []; %T = randdtree(n); %fstr = '1<2<5; 2<6; 1<3<7; 3<8; 1<4<9; 4<10'; %fstr = '1 < 2 ;1 < 3 ;2 < 4 ;2 < 5 ;4 < 6 ;6 < 7 '; fstr = '1<2;1<3;2<4;2<5;3<6;3<7;7<8' fstr='1 < 2;2 < 3;2 < 4;3 < 5;3 < 6;5 < 8;5 < 9;6 < 10;6 < 11;11 < 12;4 < 7' T = readtree(fstr); %T = readtree(fstr); %n = size(T,1); lev = 4; T = bintree(lev) n = size(T,1); while 1 b = rand; A = eye(2); A(1,1) = b; A(2,1) = 1-b; C = ones(m,1)/m; P = dtreefillprob(m,n,T,A,C); maxd = fanout(T); th = getTH(A); if 1 i = 1; %j = 5; j = 2^(lev-1); hij = mxetaij(P,m,n,i,j); N = j-i+1; mdep = floor(log(N*(maxd-1)+1)/log(maxd)-1); Bij = maxd*th^mdep; r = hij/Bij; else [hh,Ht,H] = gethhn(P,m,n); maxhr = 0; for i=1:n-1 for j=i+1:n %Bij = th^(j-i)*maxd; if maxd==1 mdep = j-i; else %mdep = ceil(log(j-i)/log(maxd)); N = j-i+1; mdep = floor(log(N*(maxd-1)+1)/log(maxd)-1); end Bij = maxd*th^mdep; if min(Bij,hh(i,j)) > 1e-13 % otherwise, all bets are off -- numerics too sketchy rat = hh(i,j)/Bij; maxhr = max(maxhr,rat); if rat > .9 fprintf('i=%d j=%d mdep = %d Bij = %1.5f rat = %1.5f\n',i,j,mdep,Bij,hh(i,j)/Bij); end end end %maxhr = max(maxhr,hh(i,i+1)); end r = maxhr; end bb(end+1) = b; rr(end+1) = r; plot(bb,rr,'.'); drawnow end return function trespc global n m P T A C th0 global mrat mT mA mC global longA longA = 1; mrat = 0; global lev lev = 4; adim = m^2; xdim = adim; LB = zeros(xdim,1)+1e-10; UB = ones(xdim,1); % normalization constraints Aeq = zeros(m,adim); for i=1:m for j=1:m Aeq(i,m*(i-1)+j) = 1; end end Beq = ones(m,1); while 1 th0 = rand; %T = randdtree(n); %fstr = '1<2<5; 2<6; 1<3<7; 3<8; 1<4<9; 4<10'; %T = readtree(fstr); T = bintree(lev) n = size(T,1); if longA [nodesi,nodesj]=find(T); ne = length(nodesi); Aeq = zeros(m*T,m^2*ne); for i=1:m*ne for j=1:m Aeq(i,m*(i-1)+j) = 1; end end Beq = ones(m*ne,1); [Ain,Bin] = constrict(m,th0,ne); LB = zeros(m^2*ne,1)+1e-10; UB = ones(m^2*ne,1); A = pnormdim(rand(m,m,ne),1); else [Ain,Bin] = constrict(m,th0,1); A = pnormdim(rand(m,m),1); %C = pnormdim(rand(m,1),1); end C = pnormdim(ones(m,1),1); x = A(:); [x,fval] = fmincon(@spcopt,x,Ain,Bin,Aeq ,Beq ,LB,UB); end return function y = spcopt(x) global n m P T C th0 global mrat mT mA mC global longA global lev if longA [nodesi,nodesj]=find(T); ne = length(nodesi); A = reshape(x,[m m ne]); else A = reshape(x,[m m]); end P = dtreefillprob(m,n,T,A,C); %[hh,Ht,H] = gethhn(P,m,n); maxd = fanout(T); th = getTH(A); th = max(th); %th = max(th0,th); i = 1; %j = 5; j = 2^(lev-1); N = j-i+1; hij = mxetaij(P,m,n,i,j); mdep = floor(log(N*(maxd-1)+1)/log(maxd)-1); Bij = maxd*th^mdep; r = 0; if min(Bij,hij) > 1e-13 % otherwise, all bets are off -- numerics too sketchy r = hij/Bij; %maxhr = max(maxhr,rat); %if rat > 10 % fprintf('i=%d j=%d mdep = %d Bij = %1.5f rat = %1.5f\n',i,j,mdep,Bij,hh(i,j)/Bij); %end end y = -r; if r > mrat mrat = r; mT = T; mA = A; mC = C; save TREDAT mT mA mC mrat end fprintf('spcopt n=%d k=%d MRAT = %1.9f\n',n,maxd,mrat); return function trexplore global n m P T A C th0 global mrat mT mA mC global longA longA = 0; mrat = 0; adim = m^2; xdim = adim; LB = zeros(xdim,1)+1e-10; UB = ones(xdim,1); % normalization constraints Aeq = zeros(m,adim); for i=1:m for j=1:m Aeq(i,m*(i-1)+j) = 1; end end Beq = ones(m,1); while 1 th0 = rand; T = randdtree(n); %fstr='1<2;1<3;2<4;2<5;4<7;5<8;5<9;3<6;6<10;6<11;11<12;'; % this is the problem one *** %fstr = '1<2; 2<3; 2<4<7; 3<5<8; 3<5<9; 3<6<10; 6<11<12'; % try to simplify it %fstr = '1<2; 2<3; 2<4<7; 3<5<8; 3<5<9; 3<6<10; 6<11'; %fstr = '1<2; 1<3<6; 2<4<7; 2<4<8; 2<5<9 ; 5<10'; % still 'good' %fstr = '1<2; 1<3<6; 3<7; 2<4<8; 2<4<9; 2<5<10; 5<11'; %fstr = '1<2; 1<3<6; 2<4<7; 2<4<8; 2<5<9 ; 5<10; 7<11; 8<12; 9<13; 10<14'; %fstr = '1<2; 1<3<6; 2<4<7; 2<4<8; 2<5<9 ; 5<10; 6<11'; % still 'good' %fstr = '1<2; 1<3<6; 2<4<7; 2<4<8; 2<5<9'; %'nope' %fstr = '1<2; 1<3; 2<4<6; 2<4<7; 2<5<8 ; 5< 9'; %nope -- need 6 %T = readtree(fstr); %n = size(T,1); if longA nothing_yet else [Ain,Bin] = constrict(m,th0,1); A = pnormdim(rand(m,m),1); C = pnormdim(rand(m,1),1); end x = A(:); [x,fval] = fmincon(@treeopt,x,Ain,Bin,Aeq ,Beq ,LB,UB); end return function y = treeopt(x) global n m P T C th0 global mrat mT mA mC global longA A = reshape(x,[m m]); P = dtreefillprob(m,n,T,A,C); [hh,Ht,H] = gethhn(P,m,n); maxd = fanout(T); th = getTH(A); %th = max(th0,th); maxhr = 0; for i=1:n-1 for j=i+1:n %Bij = th^(j-i)*maxd; if maxd==1 mdep = j-i; else %mdep = ceil(log(j-i)/log(maxd)); N = j-i; %mdep = floor(log(N*(maxd-1)+1)/log(maxd)-1); %mdep = minlev(j,maxd)-minlev(i,maxd); li = minlev(i,maxd); lj = floor(log(N*(maxd-1)/maxd^li + 1)/log(maxd)) + li -1; mdep = lj - li; end Bij = th^mdep; if min(Bij,hh(i,j)) > 1e-13 % otherwise, all bets are off -- numerics too sketchy rat = hh(i,j)/Bij; maxhr = max(maxhr,rat); if rat > 1.01 fprintf('i=%d j=%d mdep = %d Bij = %1.5f rat = %1.5f\n',i,j,mdep,Bij,hh(i,j)/Bij); end end end %maxhr = max(maxhr,hh(i,i+1)); end r = maxhr; y = -r; if r > mrat mrat = r; mT = T; mA = A; mC = C; save TREDAT mT mA mC mrat end fprintf('trexplore n=%d k=%d MRAT = %1.9f\n',n,maxd,mrat); return function d = dimn(n) global m d = repmat([m],[1 n]); return function p = pi(u,i,j) global n m T psi p = 1; for k=i:j-1 p = p * psi(u(k-i+1),u(k-i+2),k); end return function chainxplore global n m P T pi global mrat mT mpsi global longpsi longpsi = 1; mrat = 0; T = chaingraph(n); while 1 %pi = randperm(n); if longpsi [nodesi,nodesj]=find(T); ii = find(nodesi mrat mrat = r; mT = T; mpsi = psi; mpi = pi; end fprintf('chainxplore n=%d MRAT = %1.9f\n',n,mrat); return function [Aina,Bina] = constrict(m,h,T) % stricture constraints if ~exist('T','var') T = 1; end SIGNS = 2*list_all_ind(repmat([2],[1 m]))-3; Aina = zeros(size(SIGNS,1)*m*(m-1)/2*T,m^2*T); rind = 0; for t=1:T for i1=1:m for i2=i1+1:m for s = 1:size(SIGNS,1) rind = rind+1; ss = SIGNS(s,:); for j=1:m ind1 = coord2ind([j i1 t],[m m T]); ind2 = coord2ind([j i2 t],[m m T]); Aina(rind,ind1) = ss(j); Aina(rind,ind2) = -ss(j); end end end end end Bina = ones(size(Aina,1),1)*h; Bina = Bina * 2; return function hh = getTH(A) [n,n,T] = size(A); hh = zeros(1,T); for t=1:T h = 0; for i=1:n for j=i+1:n x = A(:,i,t); y = A(:,j,t); d = .5*sum(abs(x-y)); if d>h h=d; end end end hh(t) = h; end return function h = etaijXdtree00(P,m,n,i,j,y,w1,w2) global A C T h = 0; Djn = repmat([m],[1 n-j+1]); Dij = repmat([m],[1 j-i-1]); D1n = repmat([m],[1 n]); Pw1 = getPX(P,m,n,[y w1],1:i); Pw2 = getPX(P,m,n,[y w2],1:i); for xi=1:prod(Djn) xjn = ind2coord(xi,Djn); Sum = 0; for zi=1:prod(Dij) zij = ind2coord(zi,Dij); yw1zx = [y w1 zij xjn]; ind1 = coord2ind(yw1zx,D1n); yw2zx = [y w2 zij xjn]; ind2 = coord2ind(yw2zx,D1n); if 0 %Sum = Sum + P(ind1)/Pw1 - P(ind2)/Pw2; s1 = [y w1 zij xjn]; s2 = [y w2 zij xjn]; %pcond1 = treecondpr(T,i,[y w1 zij xjn]); %pcond2 = treecondpr(T,i,[y w2 zij xjn]); Ei = getEij(T,i,i+1); f1 = 1; for e=1:size(Ei,1) u = Ei(e,1); v = Ei(e,2); f1 = f1 * A(u,v,s1(v),s1(u))* Pi(T,v,s1); end pcond1 = f1; f2 = 1; for e=1:size(Ei,1) u = Ei(e,1); v = Ei(e,2); f2 = f2 * A(u,v,s2(v),s2(u))* Pi(T,v,s2); end pcond2 = f2; g1 = abs(pcond1-P(ind1)/Pw1)<1e-9; g2 = abs(pcond2-P(ind2)/Pw2)<1e-9; good = g1 & g2; if ~good 'not good' keyboard end Sum = Sum + pcond1 - pcond2; end if 1 s1 = [y w1 zij xjn]; s2 = [y w2 zij xjn]; Ei = getEij(T,i,i+1); f1 = 1; for e=1:size(Ei,1) u = Ei(e,1); v = Ei(e,2); f1 = f1 * Pi(T,v,s1); end f2 = 1; for e=1:size(Ei,1) u = Ei(e,1); v = Ei(e,2); if u~=i f2 = f2 * A(u,v,s1(v),s1(u)); end end g1 = 1; for e=1:size(Ei,1) u = Ei(e,1); v = Ei(e,2); if u==i g1 = g1 * A(u,v,s1(v),s1(u)); end end g2 = 1; for e=1:size(Ei,1) u = Ei(e,1); v = Ei(e,2); if u==i g2 = g2 * A(u,v,s2(v),s2(u)); end end %g1 = abs(pcond1-P(ind1)/Pw1)<1e-9; %g2 = abs(pcond2-P(ind2)/Pw2)<1e-9; %good = g1 & g2; %if ~good % 'not good' % keyboard %end pcond1 = f1*f2*g1; pcond2 = f1*f2*g2; Sum = Sum + pcond1 - pcond2; %Sum = Sum + f1*neqi*eqi; end if 0 Ei = getEij(T,i,i+1); f1 = 1; s1 = [y w1 zij xjn]; s2 = [y w2 zij xjn]; for e=1:size(Ei,1) v = Ei(e,2); f1 = f1 * Pi(T,v,s1); %good = abs(Pi(T,v,s1)-Pi(T,v,s2))<1e-9; if ~good, 'not good f1', keyboard; end end f2 = 1; for e=1:size(Ei,1) u = Ei(e,1); if u~=i v = Ei(e,2); f2 = f2 * A(u,v,s1(v),s1(u)); good = abs(A(u,v,s1(v),s1(u))-A(u,v,s2(v),s2(u)))<1e-9; if ~good, 'not good f2', keyboard; end end end f3 = 1; for e=1:size(Ei,1) u = Ei(e,1); if u==i v = Ei(e,2); f3 = f3 * (A(i,v,s1(v),w1) - A(i,v,s2(v),w2)); end end Sum = Sum + f1*f2*f3; end end h = h + .5*abs(Sum); end return function sT = getSubt(T,v) % a list of v's descendents in T % includes v itself global SUBT SUBT = []; Pi0(T,v); sT = SUBT; return function Pi0(T,v) global SUBT SUBT(end+1) = v; vkids = find(T(v,:)); for vi=1:length(vkids) v1 = vkids(vi); Pi0(T,v1); end function getLevels(T,u,ell) global LEVELS ell = ell+1; LEVELS{ell}(end+1) = u; ukids = find(T(u,:)); for vi=1:length(ukids) v = ukids(vi); getLevels(T,v,ell); end return function [ell0,LEVu] = getLevu(u) global LEVELS for ell=1:length(LEVELS) if ismember(u,LEVELS{ell}) LEVu = LEVELS{ell}; ell0 = ell; return end end return function Ej = getEj(T,j) Ej = []; [nodesi,nodesj]=find(T); for e=1:length(nodesi) u = nodesi(e); v = nodesj(e); if ((u=j)) %if ((u