def _filter_clades(clade_counts, cutoff):
    """ 
    A subfunc of consensus_tree(). Removes clades that occur 
    with freq < cutoff.
    """

    ## store clades that pass filter
    passed = []
    clades = np.array([list(i[0]) for i in clade_counts], dtype=np.int8)
    counts = np.array([i[1] for i in clade_counts], dtype=np.float64)
    
    for idx in xrange(clades.shape[0]):
        conflict = False
    
        if counts[idx] < cutoff:
            continue
            
        if np.sum(clades[idx]) > 1:
            # check the current clade against all the accepted clades to see if
            # it conflicts. A conflict is defined as:
            # 1. the clades are not disjoint
            # 2. neither clade is a subset of the other
            # OR:
            # 1. it is inverse of clade (affects only <fake> root state)
            # because at root node it mirror images {0011 : 95}, {1100 : 5}.
            for aidx in passed:
                #intersect = clade.intersection(accepted_clade)
                summed = clades[idx] + clades[aidx]
                intersect = np.max(summed) > 1
                subset_test0 = np.all(clades[idx] - clades[aidx] >= 0)
                subset_test1 = np.all(clades[aidx] - clades[idx] >= 0)
                invert_test = np.bool_(clades[aidx]) != np.bool_(clades[idx])

                if np.all(invert_test):
                    counts[aidx] += counts[idx]
                    conflict = True
                if intersect:
                    if (not subset_test0) and (not subset_test1):
                        conflict = True

        if conflict == False:
            passed.append(idx)

    ## rebuild the dict
    rclades = []#j for i, j in enumerate(clade_counts) if i in passed]
    ## set the counts to include mirrors
    for idx in passed:
        rclades.append((clades[idx], counts[idx]))
    return rclades
def _filter_clades(clade_counts, cutoff):
    """ 
    A subfunc of consensus_tree(). Removes clades that occur 
    with freq < cutoff.
    """

    ## store clades that pass filter
    passed = []
    clades = np.array([list(i[0]) for i in clade_counts], dtype=np.int8)
    counts = np.array([i[1] for i in clade_counts], dtype=np.float64)
    
    for idx in xrange(clades.shape[0]):
        conflict = False
    
        if counts[idx] < cutoff:
            continue
            
        if np.sum(clades[idx]) > 1:
            # check the current clade against all the accepted clades to see if
            # it conflicts. A conflict is defined as:
            # 1. the clades are not disjoint
            # 2. neither clade is a subset of the other
            # OR:
            # 1. it is inverse of clade (affects only <fake> root state)
            # because at root node it mirror images {0011 : 95}, {1100 : 5}.
            for aidx in passed:
                #intersect = clade.intersection(accepted_clade)
                summed = clades[idx] + clades[aidx]
                intersect = np.max(summed) > 1
                subset_test0 = np.all(clades[idx] - clades[aidx] >= 0)
                subset_test1 = np.all(clades[aidx] - clades[idx] >= 0)
                invert_test = np.bool_(clades[aidx]) != np.bool_(clades[idx])

                if np.all(invert_test):
                    counts[aidx] += counts[idx]
                    conflict = True
                if intersect:
                    if (not subset_test0) and (not subset_test1):
                        conflict = True

        if conflict == False:
            passed.append(idx)

    ## rebuild the dict
    rclades = []#j for i, j in enumerate(clade_counts) if i in passed]
    ## set the counts to include mirrors
    for idx in passed:
        rclades.append((clades[idx], counts[idx]))
    return rclades
def _filter_clades ( clade_counts , cutoff ) : ## store clades that pass filter passed = [ ] clades = np . array ( [ list ( i [ 0 ] ) for i in clade_counts ] , dtype = np . int8 ) counts = np . array ( [ i [ 1 ] for i in clade_counts ] , dtype = np . float64 ) for idx in xrange ( clades . shape [ 0 ] ) : conflict = False if counts [ idx ] < cutoff : continue if np . sum ( clades [ idx ] ) > 1 : # check the current clade against all the accepted clades to see if # it conflicts. A conflict is defined as: # 1. the clades are not disjoint # 2. neither clade is a subset of the other # OR: # 1. it is inverse of clade (affects only <fake> root state) # because at root node it mirror images {0011 : 95}, {1100 : 5}. for aidx in passed : #intersect = clade.intersection(accepted_clade) summed = clades [ idx ] + clades [ aidx ] intersect = np . max ( summed ) > 1 subset_test0 = np . all ( clades [ idx ] - clades [ aidx ] >= 0 ) subset_test1 = np . all ( clades [ aidx ] - clades [ idx ] >= 0 ) invert_test = np . bool_ ( clades [ aidx ] ) != np . bool_ ( clades [ idx ] ) if np . all ( invert_test ) : counts [ aidx ] += counts [ idx ] conflict = True if intersect : if ( not subset_test0 ) and ( not subset_test1 ) : conflict = True if conflict == False : passed . append ( idx ) ## rebuild the dict rclades = [ ] #j for i, j in enumerate(clade_counts) if i in passed] ## set the counts to include mirrors for idx in passed : rclades . append ( ( clades [ idx ] , counts [ idx ] ) ) return rclades
A subfunc of consensus_tree(). Removes clades that occur 
    with freq < cutoff.
A subfunc of consensus_tree () . Removes clades that occur with freq < cutoff .