FYI, Tally is still broken.
- To: mathgroup at smc.vnet.net
- Subject: [mg89571] FYI, Tally is still broken.
- From: DrMajorBob <drmajorbob at att.net>
- Date: Fri, 13 Jun 2008 06:10:25 -0400 (EDT)
- References: <JNEIICAJLELPIHHIMDJDOEIMCEAA.michael.weyrauch@gmx.de>
- Reply-to: drmajorbob at longhorns.com
For any who might be curious, the Tally failure detailed below (in December 2007) is unchanged in version 6.0.3. $Version "6.0 for Mac OS X x86 (64-bit) (May 21, 2008)" (Here's a repeat of the same code, without all those >> interruptions.) Needs["Combinatorica`"]; diagrams::usage = "Calculate diagrams"; basicedges::usage; wick[a_, b_] := pair[a, b]; wick[a_, b__] := Sum[Expand[pair[a, {b}[[i]]] Delete[Unevaluated[wick[b]], i]], {i, Length[{b}]}]; ham[n_Integer] := (ns = 4*n - 3; {c[ns], c[ns + 1], d[ns + 2], d[ns + 3]}); basicedges[n_] := Flatten[Table[{{{i, i + 1}, EdgeColor -> Red}}, {i, 1, 2*n, 2}], 1]; hamserie[n_Integer] := Flatten[Table[ham[i], {i, n}]]; cvertices[n_Integer] := {{n, 1}, {n, 0}}; cvertexserie[n_Integer] := Flatten[Table[cvertices[i], {i, n}], 1]; pair[c[_], c[_]] := 0; pair[d[_], d[_]] := 0; pair[a_Integer, b_Integer] /; (a > b) := pair[b, a]; diagrams[n_] := Module[{wickli, rep, i, cgraph, cvertices, congraph, le, un, ta}, wickli = wick[Sequence @@ hamserie[n]] /. Plus -> List; le = Length[wickli[[1]]]; wickli = wickli /. {pair[c[i_], d[j_]] -> pair[i, j], pair[d[i_], c[j_]] -> pair[i, j]}; graph = {}; While[wickli =!= {}, wickli = rempar[First[wickli], wickli, n, le]];(*edge reduction and edgelist construction for use by> > Combinatorica*) rep = Dispatch[Flatten[Table[{Rule[2*i - 1, i], Rule[2*i, i]}, {i, 2*n}]]]; graph = (Take[#, -le] /. rep /. pair[a__]^_ -> pair[a]) & /@ graph; be = basicedges[n]; cgraph = Map[List, (graph /. {pair -> List, Times -> List}), {2}]; cvertices = List /@ cvertexserie[n]; cgraph = Join[be, #] & /@ cgraph; cgraph = Graph[#, cvertices] & /@ cgraph;(*Now I compare Union and Tally*) saved = cgraph; un = Union[cgraph, SameTest -> IsomorphicQ]; Print["Union: number of elements: ", Length[un]]; Print[GraphicsGrid[ Partition[ShowGraph[#] & /@ un, 3, 3, {1, 1}, {}]]]; ta = Sort@Tally[cgraph, IsomorphicQ][[All, 1]]; Print["Tally: Number of Elements: ", Length[ta]]; Print[GraphicsGrid[Partition[ShowGraph /@ ta, 3, 3, {1, 1}, {}]]]; Print[GraphicsGrid[ Partition[ShowGraph /@ ta[[{2, 4}]], 3, 3, {1, 1}, {}]]]; Print["Are 2 and 4 isomorphic? ", IsomorphicQ[ta[[2]], ta[[4]]]]; Print["Are 4 and 2 isomorphic? ", IsomorphicQ[ta[[4]], ta[[2]]]]; ] rempar[li_, wickli_List, n_Integer, le_] := Module[{lis, mult, gem, pre, i}, lis = {Take[li, -le]}; pre = Drop[li, -le]; Do[lis = Join[lis, lis /. {i -> i + 1, i + 1 -> i}], {i, 1, 4*n - 1, 2}]; lis = Union[lis]; mult = Length[lis]; graph = Join[graph, {li*mult}]; Complement[wickli, pre*lis]] diagrams[3] Union: number of elements: 8 Tally: Number of Elements: 11 Are 2 and 4 isomorphic? True Are 4 and 2 isomorphic? True saved // Length index = Thread[saved -> Range@Length@saved]; (u = Union[saved, SameTest -> IsomorphicQ]) // Length (t = Sort@Tally[saved, IsomorphicQ][[All, 1]]) // Length 21 8 11 These are the cgraph indices returned by Union and Tally : u /. index t /. index {1, 11, 4, 21, 8, 18, 15, 6} {1, 11, 4, 2, 8, 14, 3, 18, 15, 7, 6} Comparing cgraph[[5]] and cgraph[[10]] is irrelevant, as you can see. (boo = Boole@Outer[IsomorphicQ, t, t, 1]) // MatrixForm; boo == Transpose@boo Cases[Position[boo, 1], {a_, b_} /; a < b, 1] True {{2, 4}, {5, 7}, {8, 10}} Bobby On Fri, 07 Dec 2007 12:27:32 -0600, Michael Weyrauch <michael.weyrauch at gmx.de> wrote: > Dear Bobby, > > thanks for asking. > > Yes, indeed, I reported this problem to WRI using official support > channels (thanks to a service contract of my company). > > I got the answer from some WRI support engineer that Tally[] is indeed > broken, > and does not function correctly in more complicated cases. However, > appyling > it > repeatedly until nothing changes any more does give the correct result. > (The last bit I did not yet check for myself.) > > In practice I wrote my own Tally[], which works but is probably much > much > slower > than a (correctly working) built-in Tally[]. > > I hope that in a future version Tally will work correctly, because I > find it > very useful in principle. > > > Regards Michael > > "DrMajorBob" <drmajorbob at bigfoot.com> schrieb im Newsbeitrag > news:<fjav9f$rjb$1 at smc.vnet.net>... >> Did we get an answer on whether this is a bug in Tally? >> >> Bobby >> >> On Sun, 18 Nov 2007 16:09:01 -0600, DrMajorBob <drmajorbob at bigfoot.com> >> wrote: >> >> > There is, apparently, something wrong with Tally, but your test wasn't >> > the right one, since cgraph's 5th and 10th elements were not returned >> in > >> >> > the Tally results. Here's a modification of your code and some tests: >> > >> > Needs["Combinatorica`"]; >> > diagrams::usage = "Calculate diagrams"; >> > basicedges::usage; >> > >> > wick[a_, b_] := pair[a, b]; >> > wick[a_, b__] := >> > Sum[Expand[pair[a, {b}[[i]]] Delete[Unevaluated[wick[b]], i]], {i, >> > Length[{b}]}]; >> > ham[n_Integer] := (ns = 4*n - 3; {c[ns], c[ns + 1], d[ns + 2], >> > d[ns + 3]}); >> > basicedges[n_] := >> > Flatten[Table[{{{i, i + 1}, EdgeColor -> Red}}, {i, 1, 2*n, 2}], >> > 1]; >> > hamserie[n_Integer] := Flatten[Table[ham[i], {i, n}]]; >> > cvertices[n_Integer] := {{n, 1}, {n, 0}}; >> > cvertexserie[n_Integer] := Flatten[Table[cvertices[i], {i, n}], 1]; >> > pair[c[_], c[_]] := 0; >> > pair[d[_], d[_]] := 0; >> > pair[a_Integer, b_Integer] /; (a > b) := pair[b, a]; >> > >> > diagrams[n_] := >> > Module[{wickli, rep, i, cgraph, cvertices, congraph, le, un, ta} , >> > wickli = wick[Sequence @@ hamserie[n]] /. Plus -> List; >> > le = Length[wickli[[1]]]; >> > wickli = >> > wickli /. {pair[c[i_], d[j_]] -> pair[i, j], >> > pair[d[i_], c[j_]] -> pair[i, j]}; >> > graph = {}; >> > While[wickli =!= {}, >> > wickli = rempar[First[wickli], wickli, n, le]]; >> > (*edge reduction and edgelist construction for use by \ >> > Combinatorica*) >> > rep = Dispatch[ >> > Flatten[Table[{Rule[2*i - 1, i], Rule[2*i, i]}, {i, 2*n}]]]; >> > graph = (Take[#, -le] /. rep /. pair[a__]^_ -> pair[a]) & /@ >> > graph; >> > be = basicedges[n]; >> > cgraph = Map[List, (graph /. {pair -> List, Times -> List}), {2} >> ]; >> > cvertices = List /@ cvertexserie[n]; >> > cgraph = Join[be, #] & /@ cgraph; >> > cgraph = Graph[#, cvertices] & /@ cgraph; >> > (*Now I compare Union and Tally*) >> > saved = cgraph; >> > un = Union[cgraph, SameTest -> IsomorphicQ]; >> > Print["Union: number of elements: ", Length[un]]; >> > Print[GraphicsGrid[ >> > Partition[ShowGraph[#] & /@ un, 3, 3, {1, 1}, {}]]]; >> > ta = Sort@Tally[cgraph, IsomorphicQ][[All, 1]]; >> > Print["Tally: Number of Elements: ", Length[ta]]; >> > Print[GraphicsGrid[Partition[ShowGraph /@ ta, 3, 3, {1, 1}, >> {}]]];= >> >> > Print[GraphicsGrid[ >> > Partition[ShowGraph /@ ta[[{2, 4}]], 3, 3, {1, 1}, {}]]]; >> > Print["Are 2 and 4 isomorphic? ", IsomorphicQ[ta[[2]], ta[[4]]]]; >> > Print["Are 4 and 2 isomorphic? ", IsomorphicQ[ta[[4]], ta[[2]]]]; >> > ]; >> > >> > rempar[li_, wickli_List, n_Integer, le_] := >> > Module[{lis, mult, gem, pre, i}, lis = {Take[li, -le]}; >> > pre = Drop[li, -le]; >> > Do[lis = Join[lis, lis /. {i -> i + 1, i + 1 -> i}], {i, 1, >> > 4*n - 1, 2}]; >> > lis = Union[lis]; >> > mult = Length[lis]; >> > graph = Join[graph, {li*mult}]; >> > Complement[wickli, pre*lis]]; >> > >> > diagrams[3] >> > Union: number of elements: 8 >> > Tally: Number of Elements: 11 >> > Are 2 and 4 isomorphic? True >> > Are 4 and 2 isomorphic? True >> > >> > saved // Length >> > index = Thread[saved -> Range@Length@saved]; >> > (u = Union[saved, SameTest -> IsomorphicQ]) // Length >> > (t = Sort@Tally[saved, IsomorphicQ][[All, 1]]) // Length >> > >> > 21 >> > >> > 8 >> > >> > 11 >> > >> > These are the cgraph indices returned by Union and Tally: >> > >> > u /. index >> > t /. index >> > >> > {1, 11, 4, 21, 8, 18, 15, 6} >> > >> > {1, 11, 4, 2, 8, 14, 3, 18, 15, 7, 6} >> > >> > Comparing cgraph[[5]] and cgraph[[10]] is irrelevant, as you can see. >> > >> > (boo = Boole@Outer[IsomorphicQ, t, t, 1]) // MatrixForm; >> > boo == Transpose@boo >> > Cases[Position[boo, 1], {a_, b_} /; a < b, 1] >> > >> > True >> > >> > {{2, 4}, {5, 7}, {8, 10}} >> > >> > boo is NOT an identity matrix, so Tally did something very odd. >> > >> > Bobby >> > >> > On Sun, 18 Nov 2007 03:53:16 -0600, Michael Weyrauch >> >> > <michael.weyrauch at gmx.de> wrote: >> > >> >> Hello, >> >> >> >> in the Mathematica 6.0 documentation it says in the entry for >> Tally:= >> = >> >> >> Properties and Relations: >> >> >> >> "A sorted Tally is equivalent to a list of counts for the Union: " >> >> >> >> This is what I indeed expect of Tally and Union, in particular then >> i= >> t = >> >> >> holds for any list: >> >> Length[Tally[list]] is equal to Length[Union[list]]. >> >> >> >> Now, I have an example, where Mathematica 6.0 produces a result >> where= >> >> >> Tally[list] and Union[list] are different in length, which surpris= es = >> = >> me. >> >> And in fact, the result of Tally[ ] seems wrong to me. >> >> >> >> You can reproduce this result using the small Mathematica package = = >> >> >> enclosed, which >> >> uses Combinatorica. (Sorry for the somewhat complicated example, = = >> but= >> I = >> >> >> did not find >> >> a simpler case showing the effect.) >> >> >> >> If you load this package into a notebook and then execute >> >> >> >> diagrams[2] >> >> >> >> Tally and Union produce the expected result: both lists have equal= = >> >> >> length. >> >> (The list elements are diagrams.) >> >> >> >> However, if you execute >> >> >> >> diagrams[3] >> >> >> >> Tally and Union produce lists of different length. >> >> >> >> To my opinion, it really should never happen that Tally and Union= >> >> produce lists of different length. I just expect of Tally to tell = me = >> = >> = >> >> >> the multpilicities in the equivalence classes, in addition to >> >> the information produced by Union. (The two list to be compared a= re = >> = >> = >> >> >> called "ta" and "un" in the package enclosed.) >> >> >> >> Strangely enough, the program compares list elements 5 and 10 == >> >> >> explicitly, and comes to the >> >> conclusion that element 5 and 10 belong to the same equivalence = >> class= >> , = >> >> >> nevertheless they are >> >> both listed seperately in the Tally, but - correctly - lumped up = in = >> = >> = >> >> >> the Union. >> >> >> >> Do I misinterpret something here or is there a bug in Tally? (Tal= ly = >> = >> is = >> >> >> new in Mathematica 6, and I >> >> would find it extremely useful, if it would do what I expect it to= = >> do= >> .) >> >> >> >> Michael >> >> >> >> Here comes my little package in order to reproduce the effect.... >> >> >> >> BeginPackage["wick`"] >> >> >> >> Needs["Combinatorica`"]; >> >> diagrams::usage="Calculate diagrams"; >> >> basicedges::usage; >> >> >> >> Begin["`Private`"] >> >> >> >> wick[a_, b_] := pair[a, b]; >> >> wick[a_, b__]:= Sum[Expand[pair[a, {b}[[i]]] = >> >> >> Delete[Unevaluated[wick[b]], i]], {i, Length[{b}]}]; >> >> ham[n_Integer]:=(ns=4*n-3;{c[ns],c[ns+1],d[ns+2],d[ns+3]}); >> >> basicedges[n_]:=Flatten[Table[{{{i,i+1}, EdgeColor->Red}}, == >> >> >> {i,1,2*n,2}],1]; >> >> hamserie[n_Integer]:=Flatten[Table[ham[i],{i,n}]]; >> >> cvertices[n_Integer]:={{n,1},{n,0}}; >> >> cvertexserie[n_Integer]:=Flatten[Table[cvertices[i],{i,n}],1]; >> >> pair[c[_],c[_]]:=0; >> >> pair[d[_],d[_]]:=0; >> >> pair[a_Integer,b_Integer]/;(a>b):=pair[b,a]; >> >> >> >> diagrams[n_]:=Module[{wickli, rep, i, cgraph, cvertices, congrap= h, = >> le, = >> >> >> un, ta}, >> >> >> >> wickli=wick[Sequence@@hamserie[n]]/.Plus->List; >> >> le=Length[wickli[[1]]]; >> >> wickli=wickli/.{pair[c[i_],d[j_]]->pair[i,j], >> >> pair[d[i_],c[j_]]->pair[i,j]}; >> >> graph={}; >> >> While[wickli=!={}, >> >> wickli=rempar[First[wickli],wickli,n, le]]; >> >> >> >> (*edge reduction and edgelist construction for use by = >> Combinatorica= >> *) >> >> rep=Dispatch[Flatten[Table[{Rule[2*i-1,i],Rule[2*i,i]},{i,2*n}= ]]]= >> ; >> >> graph=(Take[#,-le]/.rep/.pair[a__]^_->pair[a])&/@graph; >> >> >> >> be=basicedges[n]; >> >> cgraph=Map[List,(graph/.{pair->List, Times->List}),{2}]; >> >> cvertices=List/@cvertexserie[n]; >> >> cgraph=Join[be,#]&/@cgraph; >> >> cgraph=Graph[#,cvertices]&/@cgraph; >> >> >> >> (* Now I compare Union and Tally *) >> >> un=Union[cgraph,SameTest->IsomorphicQ]; >> >> Print["Union: number of elements: ", Length[un]]; >> >> Print[GraphicsGrid[Partition[ShowGraph[#]&/@un, 3,3,{1,1},{}]]];= >> >> >> >> ta=Tally[cgraph,IsomorphicQ]; >> >> ta=Sort[ta]; >> >> Print["Tally: Number of Elements: ", Length[ta]]; >> >> Print[GraphicsGrid[Partition[ShowGraph[#]&/@(First/@ta), = >> >> >> 3,3,{1,1},{}]]]; >> >> >> >> Print["Are 5 and 10 isomorphic? ", IsomorphicQ[cgraph[[5]], == >> >> >> cgraph[[10]]]]; >> >> >> >> ]; >> >> >> >> rempar[li_,wickli_List,n_Integer,le_]:=Module[{lis, mult, gem, = pre= >> , i}, >> >> lis={Take[li,-le]}; pre=Drop[li,-le]; >> >> Do[lis=Join[lis,lis /. {i->i+1, i+1->i}], {i,1,4*n-1,2}]; >> >> lis =Union[lis]; >> >> mult=Length[lis]; >> >> graph=Join[graph,{li*mult}]; >> >> Complement[wickli,pre*lis] >> >> ]; >> >> >> >> End[]; >> >> EndPackage[]; >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> > >> > >> > >> >> >> >> -- = >> >> DrMajorBob at bigfoot.com >> > > -- = DrMajorBob at longhorns.com