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
コード例 #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 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
コード例 #4
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
コード例 #5
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
コード例 #6
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
    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
コード例 #7
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
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
コード例 #8
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
    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
コード例 #10
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
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
コード例 #11
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
コード例 #12
0
ファイル: traversal.py プロジェクト: undercoveridiot/gunfolds
    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