code: def counts(A, parent, post):
      
      n = A.size[0]
      colcount = matrix(0,(n,1))
      ancestor = matrix(range(n),(n,1))
      maxfirst = matrix(-1,(n,1))
      prevleaf = matrix(-1,(n,1))
      first = matrix(-1,(n,1))
      
      for k in range(n):
          j = post[k]
          if first[j] == -1:
              colcount[j] = 1
          else:
              colcount[j] = 0
          while  j != -1 and first[j] == -1:
              first[j] = k;
              j = parent[j]
  
      cp,ri,_ = A.CCS
      for k in range(n):
          j = post[k]
          if parent[j] != j:
              colcount[parent[j]] -= 1
          for p in range(cp[j],cp[j+1]):
              i = ri[p]
              if i <= j: continue
              q, jleaf = __leaf(i, j, first, maxfirst, prevleaf, ancestor)
              if jleaf >= 1: colcount[j] += 1
              if jleaf == 2: colcount[q] -= 1
          if parent[j] != j: ancestor[j] = parent[j]
      for j in range(n):
          if parent[j] != j: colcount[parent[j]] += colcount[j]
  
      return colcount
docs: Compute column counts.