コード例 #1
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
def ok2addaVpath(e, p, g, g2, rate=2):
    mask = addaVpath(g, e, p)
    if not gk.isedgesubset(bfu.undersample(g, rate), g2):
        cleanVedges(g, e, p, mask)
        return False
    cleanVedges(g, e, p, mask)
    return True
コード例 #2
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
def prunepaths_1D(g2, path, conn):
    c = []
    g = cloneempty(g2)
    for p in conn:
        mask = addapath(g, path, p)
        if gk.isedgesubset(bfu.increment(g), g2):
            c.append(tuple(p))
        delapath(g, path, p, mask)
    return c
コード例 #3
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
def g22g1(g2, capsize=None):
    '''
    computes all g1 that are in the equivalence class for g2
    '''
    if bfu.isSclique(g2):
        print 'Superclique - any SCC with GCD = 1 fits'
        return set([-1])

    single_cache = {}

    @memo  # memoize the search
    def nodesearch(g, g2, edges, s):
        if edges:
            if bfu.increment(g) == g2:
                s.add(g2num(g))
                if capsize and len(s) > capsize:
                    raise ValueError('Too many elements')
                return g
            e = edges[0]
            for n in g2:

                if (n, e) in single_cache:
                    continue
                if not edge_increment_ok(e[0], n, e[1], g, g2):
                    continue

                mask = add2edges(g, e, n)
                r = nodesearch(g, g2, edges[1:], s)
                del2edges(g, e, n, mask)

        elif bfu.increment(g) == g2:
            s.add(g2num(g))
            if capsize and len(s) > capsize:
                raise ValueError('Too many elements in eqclass')
            return g

    # find all directed g1's not conflicting with g2
    n = len(g2)
    edges = gk.edgelist(g2)
    random.shuffle(edges)
    g = cloneempty(g2)

    for e in edges:
        for n in g2:

            mask = add2edges(g, e, n)
            if not gk.isedgesubset(bfu.increment(g), g2):
                single_cache[(n, e)] = False
            del2edges(g, e, n, mask)

    s = set()
    try:
        nodesearch(g, g2, edges, s)
    except ValueError:
        s.add(0)
    return s
コード例 #4
0
ファイル: bfutils.py プロジェクト: undercoveridiot/gunfolds
def call_u_conflicts2(G_star, H):
    glist = [G_star]
    while True:
        g = increment_u(G_star, glist[-1])
        if gk.isedgesubset(g, H):
            return False, glist
        if g in glist:
            return True, glist
        glist.append(g)
    return True, glist
コード例 #5
0
ファイル: bfutils.py プロジェクト: undercoveridiot/gunfolds
def call_u_conflicts_d(G_star, H, checkrate=0):
    glist = [G_star]
    while True:
        g = dincrement_u(G_star, glist[-1])
        if gk.isedgesubset(g, H):
            return False
        if g in glist:
            return True
        glist.append(g)
    return True
コード例 #6
0
ファイル: bfutils.py プロジェクト: undercoveridiot/gunfolds
def overshoot(G_star, H):
    glist = [G_star]
    while True:
        g = increment_u(G_star, glist[-1])
        if isSclique(g):
            return False
        if gk.isedgesubset(H, g):
            return True
        if g in glist:
            return False
        glist.append(g)
    return False
コード例 #7
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
def edge_backtrack2g1_directed(g2, capsize=None):
    '''
    computes all g1 that are in the equivalence class for g2
    '''
    if bfu.isSclique(g2):
        print 'Superclique - any SCC with GCD = 1 fits'
        return set([-1])

    single_cache = {}

    def edgeset(g):
        return set(gk.edgelist(g))

    @memo  # memoize the search
    def nodesearch(g, g2, edges, s):
        if edges:
            e = edges.pop()
            ln = [n for n in g2]
            for n in ln:
                if (n, e) in single_cache:
                    continue
                mask = add2edges(g, e, n)
                if gk.isedgesubset(bfu.increment(g), g2):
                    r = nodesearch(g, g2, edges, s)
                    if r and edgeset(bfu.increment(r)) == edgeset(g2):
                        s.add(g2num(r))
                        if capsize and len(s) > capsize:
                            raise ValueError('Too many elements in eqclass')
                del2edges(g, e, n, mask)
            edges.append(e)
        else:
            return g
    # find all directed g1's not conflicting with g2
    n = len(g2)
    edges = gk.edgelist(g2)
    random.shuffle(edges)
    g = cloneempty(g2)

    for e in edges:
        for n in g2:
            mask = add2edges(g, e, n)
            if not gk.isedgesubset(bfu.increment(g), g2):
                single_cache[(n, e)] = False
            del2edges(g, e, n, mask)

    s = set()
    try:
        nodesearch(g, g2, edges, s)
    except ValueError:
        s.add(0)
    return s
コード例 #8
0
ファイル: bfutils.py プロジェクト: undercoveridiot/gunfolds
def call_u_conflicts(G_star, H, checkrate=0):
    glist = [G_star]
    while True:
        # g = increment_u(G_star, glist[-1])
        g = directed_inc(G_star, glist[-1])
        if gk.isdedgesubset(g, H):
            return False
        g = bidirected_inc(g, glist[-1])
        if gk.isedgesubset(g, H):
            return False
        if g in glist:
            return True
        glist.append(g)
    return True
コード例 #9
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
 def nodesearch(g, g2, edges, s):
     if edges:
         e = edges.pop()
         ln = [n for n in g2]
         for n in ln:
             if (n, e) in single_cache:
                 continue
             mask = add2edges(g, e, n)
             if gk.isedgesubset(bfu.increment(g), g2):
                 r = nodesearch(g, g2, edges, s)
                 if r and edgeset(bfu.increment(r)) == edgeset(g2):
                     s.add(g2num(r))
                     if capsize and len(s) > capsize:
                         raise ValueError('Too many elements in eqclass')
             del2edges(g, e, n, mask)
         edges.append(e)
     else:
         return g
コード例 #10
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
 def nodesearch(g, g2, edges, s):
     if edges:
         # key, checklist = edges.popitem()
         key = random.choice(edges.keys())
         checklist = edges.pop(key)
         adder, remover = f[edge_function_idx(key)]
         checks_ok = c[edge_function_idx(key)]
         for n in checklist:
             mask = adder(g, key, n)
             if gk.isedgesubset(bfu.increment(g), g2):
                 r = nodesearch(g, g2, edges, s)
                 if r and bfu.increment(r) == g2:
                     s.add(g2num(r))
                     if capsize and len(s) > capsize:
                         raise ValueError('Too many elements')
             remover(g, key, n, mask)
         edges[key] = checklist
     else:
         return g
コード例 #11
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
def ok2addanedge_sub(s, e, g, g2, rate=1):
    mask = addanedge(g, (s, e))
    value = gk.isedgesubset(bfu.undersample(g, rate), g2)
    delanedge(g, (s, e), mask)
    return value
コード例 #12
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
def backtrack_more(g2, rate=1, capsize=None):
    '''
    computes all g1 that are in the equivalence class for g2
    '''
    if bfu.isSclique(g2):
        print 'Superclique - any SCC with GCD = 1 fits'
        return set([-1])

    single_cache = {}
    if rate == 1:
        ln = [n for n in g2]
    else:
        ln = []
        for x in itertools.combinations_with_replacement(g2.keys(), rate):
            ln.extend(itertools.permutations(x, rate))
        ln = set(ln)

    @memo  # memoize the search
    def nodesearch(g, g2, edges, s):
        if edges:
            if bfu.undersample(g, rate) == g2:
                s.add(g2num(g))
                if capsize and len(s) > capsize:
                    raise ValueError('Too many elements')
                return g
            e = edges[0]
            for n in ln:

                if (n, e) in single_cache:
                    continue
                if not ok2addaVpath(e, n, g, g2, rate=rate):
                    continue

                mask = addaVpath(g, e, n)
                r = nodesearch(g, g2, edges[1:], s)
                delaVpath(g, e, n, mask)

        elif bfu.undersample(g, rate) == g2:
            s.add(g2num(g))
            if capsize and len(s) > capsize:
                raise ValueError('Too many elements in eqclass')
            return g

    # find all directed g1's not conflicting with g2
    n = len(g2)
    edges = gk.edgelist(g2)
    random.shuffle(edges)
    g = cloneempty(g2)

    for e in edges:
        for n in ln:

            mask = addaVpath(g, e, n)
            if not gk.isedgesubset(bfu.undersample(g, rate), g2):
                single_cache[(n, e)] = False
            delaVpath(g, e, n, mask)

    s = set()
    try:
        nodesearch(g, g2, edges, s)
    except ValueError:
        s.add(0)
    return s