def counts(A, parent, post):
    """
    Compute column counts.
    """
    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
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
Compute column counts.