def fan_wrapper(fold='None', n=10, dens=.2, sst=.9): scipy.random.seed() msl_time = None sat_time = None s = None c = None k = bfutils.dens2edgenum(dens, n=nodes) output = {} while True: try: output['gt'] = gk.ringmore(n, k) gdens = traversal.density(output['gt']) gu = bfutils.increment(output['gt']) output['transition'] = lm.transitionMatrix4(output['gt'], minstrength=.9) if estimate_gu: data = lm.drawsamplesLG(output['transition'], nstd=np.double(NOISE_STD), samples=BURNIN + NSAMPLES * URATE) data = data[:, BURNIN:] if np.max(data) > 1000.: raise NameError() gu_est, gu_time = gu_estimate(data[:, ::URATE], ALG) else: gu_est = None gu_time = None if estimate_g1: try: s, msl_time = msl_caller(gu_est) except TimeoutError: s = None msl_time = None try: c, sat_time = sat_caller(gu_est, fold) except TimeoutError: c = None sat_time = None if msl_time is not None: print "msl: {:2}: {:8} : {:4} {:10} seconds".\ format(fold, round(sst,3), len(s), round(msl_time/1000.,3)) if sat_time is not None: print "sat: {:2}: {:8} : {:4} {:10} seconds".\ format(fold, round(sst,3), len(c), round(sat_time/1000.,3)) else: s = None c = None msl_time = None sat_time = None output['gu'] = {'est': gu_est, 'truth': gu, 'ms': gu_time} output['MSL'] = {'eq': s, 'ms': msl_time} output['SAT'] = {'eq': c, 'ms': sat_time} except MemoryError: print 'memory error... retrying' continue break return output
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
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
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
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
def nodesearch0(g, g2, order, inlist, s, cds): if order: key = order.pop(0) tocheck = cds[len(inlist) - 1][inlist[0]] adder, remover, masker = f[edge_function_idx(key)] checks_ok = c[edge_function_idx(key)] if len(tocheck) > 1: for n in tocheck: if not checks_ok(key, n, g, g2): continue mask = masker(g, key, n) if not np.prod(mask): mask = adder(g, key, n) r = nodesearch0(g, g2, order, [n] + inlist, s, cds) 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) else: r = nodesearch0(g, g2, order, [n] + inlist, s, cds) if r and bfu.increment(r) == g2: s.add(g2num(r)) if capsize and len(s) > capsize: raise ValueError('Too many elements') elif tocheck: (n,) = tocheck mask = adder(g, key, n) r = nodesearch0(g, g2, order, [n] + inlist, s, cds) 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) order.insert(0, key) else: return g
def checker(n, ee): g = gk.ringmore(n, ee) g2 = bfu.increment(g) d = checkable(g2) t = [len(d[x]) for x in d] r = [] n = len(g2) ee = len(gk.edgelist(g2)) for i in range(1, len(t)): r.append(sum(np.log10(t[:i])) - ee * np.log10(n)) return r
def nodesearch(g, g2, order, inlist, s, cds, pool, pc): if order: if bfu.increment(g) == g2: s.add(g2num(g)) if capsize and len(s) > capsize: raise ValueError('Too many elements') s.update(supergraphs_in_eq(g, g2)) return g key = order[0] if pc: tocheck = [x for x in pc if x in cds[len(inlist) - 1][inlist[0]]] else: tocheck = cds[len(inlist) - 1][inlist[0]] if len(order) > 1: kk = order[1] pc = predictive_check(g, g2, pool[len(inlist)], c[edge_function_idx(kk)], kk) else: pc = set() adder, remover, masker = f[edge_function_idx(key)] checks_ok = c[edge_function_idx(key)] for n in tocheck: if not checks_ok(key, n, g, g2): continue masked = np.prod(masker(g, key, n)) if masked: nodesearch(g, g2, order[1:], [n] + inlist, s, cds, pool, pc) else: mask = adder(g, key, n) nodesearch(g, g2, order[1:], [n] + inlist, s, cds, pool, pc) remover(g, key, n, mask) elif bfu.increment(g) == g2: s.add(g2num(g)) if capsize and len(s) > capsize: raise ValueError('Too many elements') return g
def fan_wrapper(fold='None', n=10, dens=.2, sst=.9, card=2): scipy.random.seed() msl_time = None sat_time = None s = None c = None k = bfutils.dens2edgenum(dens, n=nodes) output = {} while True: try: output['gt'] = gk.ringmore(n, k) gdens = traversal.density(output['gt']) gu = bfutils.increment(output['gt']) if estimate_gu: data = dg.ConstructDynBN(output['gt'], [card] * n, sst, BURNIN + NSAMPLES * URATE) data = data[:, BURNIN:] gu_est, gu_time = gu_estimate(data[:, ::URATE], ALG) else: gu_est = None gu_time = None if estimate_g1: try: s, msl_time = msl_caller(gu_est) except TimeoutError: s = None msl_time = None try: c, sat_time = sat_caller(gu_est, fold) except TimeoutError: c = None sat_time = None if msl_time is not None: print "msl: {:2}: {:8} : {:4} {:10} seconds".\ format(fold, round(sst,3), len(s), round(msl_time/1000.,3)) if sat_time is not None: print "sat: {:2}: {:8} : {:4} {:10} seconds".\ format(fold, round(sst,3), len(c), round(sat_time/1000.,3)) else: s = None c = None msl_time = None sat_time = None output['gu'] = {'est': gu_est, 'truth': gu, 'ms': gu_time} output['MSL'] = {'eq': s, 'ms': msl_time} output['SAT'] = {'eq': c, 'ms': sat_time} except MemoryError: print 'memory error... retrying' continue break return output
def checkerDS(n, ee): g = gk.ringmore(n, ee) g2 = bfu.increment(g) gg = checkable(g2) d, p, idx = conformanceDS(g2, gg, gg.keys()) t = [len(x) for x in p] r = [] n = len(g2) ee = len(gk.edgelist(g2)) for i in range(1, len(t)): r.append(sum(np.log10(t[:i])) - ee * np.log10(n)) return r
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
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