def iteqclass(H, verbose=True, capsize=100): ''' Find all graphs in the same equivalence class with respect to graph H and any undesampling rate. ''' if cmp.isSclique(H): print 'not running on superclique' return None g = {n: {} for n in H} s = set() Hnum = bfu.ug2num(H) if Hnum[1] == 0: s.add(Hnum[0]) cp = confpairs(H) ccf = conflictors(H) edges = gk.edgelist(gk.complement(g)) ds = {bfu.g2num(g): edges} if verbose: print '%3s' % 'i' + '%10s' % ' graphs' for i in range(len(H)**2): ds, ss = add2set_(ds, H, cp, ccf, iter=i, verbose=verbose, capsize=capsize) s = s | ss if capsize <= len(ss): break if not ds: break return s
def supergraphs_in_eq(g, g2, rate=1): '''Find all supergraphs of g that are also in the same equivalence class with respect to g2 and the rate. Currently works only for bfu.undersample by 1 ''' if bfu.undersample(g,rate) != g2: raise ValueError('g is not in equivalence class of g2') s = set() def addnodes(g,g2,edges): if edges: masks = [] for e in edges: if ok2addanedge(e[0],e[1],g,g2,rate=rate): masks.append(True) else: masks.append(False) nedges = [edges[i] for i in range(len(edges)) if masks[i]] n = len(nedges) if n: for i in range(n): mask = addanedge(g,nedges[i]) s.add(bfu.g2num(g)) addnodes(g,g2,nedges[:i]+nedges[i+1:]) delanedge(g,nedges[i],mask) edges = gk.edgelist(gk.complement(g)) addnodes(g,g2,edges) return s
def eqclass(H): ''' Find all graphs in the same equivalence class with respect to graph H and any undesampling rate. ''' g = {n: {} for n in H} s = set() @memo def addedges(g, H, edges): if edges: nedges = prune_conflicts(H, g, edges) n = len(nedges) if n == 0: return None for i in range(n): gk.addanedge(g, nedges[i]) if bfu.call_u_equals(g, H): s.add(bfu.g2num(g)) s.add(addedges(g, H, nedges[:i] + nedges[i + 1:])) gk.delanedge(g, nedges[i]) edges = gk.edgelist(gk.complement(g)) addedges(g, H, edges) return s - set([None])
def eqsearch(g2, rate=1): '''Find all g that are also in the equivalence class with respect to g2 and the rate. ''' s = set() noop = set() @memo1 def addnodes(g, g2, edges): if edges: masks = [] for e in edges: if ok2addanedge_(e[0], e[1], g, g2, rate=rate): masks.append(True) else: masks.append(False) nedges = [edges[i] for i in range(len(edges)) if masks[i]] n = len(nedges) if n: for i in range(n): mask = addanedge(g, nedges[i]) if bfu.undersample(g, rate) == g2: s.add(bfu.g2num(g)) addnodes(g, g2, nedges[:i] + nedges[i + 1:]) delanedge(g, nedges[i], mask) return s else: return noop else: return noop g = cloneempty(g2) edges = gk.edgelist(gk.complement(g)) addnodes(g, g2, edges) return s
def eqclass(H): ''' Find all graphs in the same equivalence class with respect to graph H and any undesampling rate. ''' g = {n:{} for n in H} s = set() @memo def addedges(g,H,edges): if edges: nedges = prune_conflicts(H, g, edges) n = len(nedges) if n == 0: return None for i in range(n): gk.addanedge(g,nedges[i]) if bfu.call_u_equals(g, H): s.add(bfu.g2num(g)) addedges(g,H,nedges[:i]+nedges[i+1:]) gk.delanedge(g,nedges[i]) edges = gk.edgelist(gk.complement(g)) addedges(g,H,edges) return s-set([None])
def iteqclass(H, verbose=True, capsize=100): ''' Find all graphs in the same equivalence class with respect to graph H and any undesampling rate. ''' if cmp.isSclique(H): print 'not running on superclique' return None g = {n:{} for n in H} s = set() Hnum = bfu.ug2num(H) if Hnum[1]==0: s.add(Hnum[0]) cp = confpairs(H) ccf = conflictors(H) edges = gk.edgelist(gk.complement(g)) ds = {bfu.g2num(g): edges} if verbose: print '%3s'%'i'+'%10s'%' graphs' for i in range(len(H)**2): ds, ss = add2set_(ds, H, cp, ccf, iter=i, verbose=verbose, capsize=capsize) s = s | ss if capsize <= len(ss): break if not ds: break return s
def dceqclass2(H): """Find all graphs in the same equivalence class with respect to H Arguments: - `H`: an undersampled graph """ if cmp.isSclique(H): print 'not running on superclique' return set() n = len(H) s = set() cp = confpairs(H) confs = conflictor_set(H) ccf = conflictors(H) def prune_loops(gl, H): l = [] for e in gl: if e[0] == e[1] and not (e[1] in H[e[0]] and (1, 0) in H[e[0]][e[1]]): continue l.append(e) return l edges = gk.edgelist(gk.complement(bfu.num2CG(0, n))) edges = prune_loops(edges, H) glist = map(lambda x: e2num(x, n), edges) #glist = list(2**np.arange(n**2)) i = 0 while glist != []: print 2**i, len(glist) glist_prev = glist glist, ss = quadmerge21(glist, H, confs) s = s | ss i += 1 ds = {x: edges for x in glist_prev} for j in range(i, len(H)**2): ds, ss = add2set_(ds, H, cp, ccf, iter=j, verbose=True) s = s | ss if not ds: break return s
def confpairs(H): n = len(H) g = {n: {} for n in H} d = {} edges = gk.edgelist(gk.complement(g)) edges = prune_conflicts(H, g, edges) for p in combinations(edges, 2): gk.addedges(g, p) if bfu.call_u_conflicts(g, H): n1 = e2num(p[0], n) n2 = e2num(p[1], n) d.setdefault(n1, set()).add(n2) d.setdefault(n2, set()).add(n1) gk.deledges(g, p) return d
def confpairs(H): n = len(H) g = {n:{} for n in H} d = {} edges = gk.edgelist(gk.complement(g)) edges = prune_conflicts(H, g, edges) for p in combinations(edges,2): gk.addedges(g,p) if bfu.call_u_conflicts(g, H): n1 = e2num(p[0],n) n2 = e2num(p[1],n) d.setdefault(n1,set()).add(n2) d.setdefault(n2,set()).add(n1) gk.deledges(g,p) return d
def eqclass_list(H): ''' Find all graphs in the same equivalence class with respect to graph H and any undesampling rate. ''' g = {n: {} for n in H} s = set() edges = gk.edgelist(gk.complement(g)) #edges = prune_conflicts(H, g, edges) gset = set([bfu.g2num(g)]) for i in range(len(H)**2): print i gset, ss, edges = add2set(gset, edges, H) s = s | ss if not edges: break return s
def eqclass_list(H): ''' Find all graphs in the same equivalence class with respect to graph H and any undesampling rate. ''' g = {n:{} for n in H} s = set() edges = gk.edgelist(gk.complement(g)) #edges = prune_conflicts(H, g, edges) gset = set([bfu.g2num(g)]) for i in range(len(H)**2): print i gset, ss, edges = add2set(gset, edges, H) s = s | ss if not edges: break return s
def dceqclass2(H): """Find all graphs in the same equivalence class with respect to H Arguments: - `H`: an undersampled graph """ if cmp.isSclique(H): print 'not running on superclique' return set() n = len(H) s = set() cp = confpairs(H) confs = conflictor_set(H) ccf = conflictors(H) def prune_loops(gl, H): l = [] for e in gl: if e[0] == e[1] and not (e[1] in H[e[0]] and (1,0) in H[e[0]][e[1]]): continue l.append(e) return l edges = gk.edgelist(gk.complement(bfu.num2CG(0,n))) edges = prune_loops(edges, H) glist = map(lambda x: e2num(x,n),edges) #glist = list(2**np.arange(n**2)) i = 0 while glist != []: print 2**i, len(glist) glist_prev = glist glist, ss = quadmerge21(glist, H, confs) s = s|ss i += 1 ds = {x: edges for x in glist_prev} for j in range(i, len(H)**2): ds, ss = add2set_(ds, H, cp, ccf, iter=j, verbose=True) s = s | ss if not ds: break return s
def eqsearch(g2, rate=1): '''Find all g that are also in the equivalence class with respect to g2 and the rate. ''' s = set() noop = set() @memo1 def addnodes(g,g2,edges): if edges: masks = [] for e in edges: if ok2addanedge_(e[0],e[1],g,g2,rate=rate): masks.append(True) else: masks.append(False) nedges = [edges[i] for i in range(len(edges)) if masks[i]] n = len(nedges) if n: for i in range(n): mask = addanedge(g,nedges[i]) if bfu.undersample(g,rate) == g2: s.add(bfu.g2num(g)) addnodes(g,g2,nedges[:i]+nedges[i+1:]) delanedge(g,nedges[i],mask) return s else: return noop else: return noop g = cloneempty(g2) edges = gk.edgelist(gk.complement(g)) addnodes(g,g2,edges) return s