示例#1
0
文件: app.py 项目: clrichar/worms
def search_func(criteria, bbs, monte_carlo, **kw):

    stages = [criteria]
    if hasattr(criteria, 'stages'):
        stages = criteria.stages(bbs=bbs, **kw)
    if len(stages) > 1:
        assert kw['merge_bblock'] is not None

    assert len(monte_carlo) in (1, len(stages))
    if len(monte_carlo) != len(stages):
        monte_carlo *= len(stages)

    results = list()
    for i, stage in enumerate(stages):
        crit, stage_bbs = stage
        if callable(crit): crit = crit(*results[-1][:-1])
        lbl = f'stage{i}'
        if kw['merge_bblock'] is not None:
            lbl = f'stage{i}_mbb{kw["merge_bblock"]:04}'
        results.append(
            search_single_stage(crit,
                                monte_carlo=monte_carlo[i],
                                lbl=lbl,
                                bbs=stage_bbs,
                                **kw))
        if len(results[-1][2].idx) is 0:
            print('mbb', kw['merge_bblock'], 'no results at stage', i)
            return None, None, None

    if len(results) == 1:
        return results[0][1:]
    elif len(results) == 2:
        # todo: this whole block is very protocol-specific... needs refactoring
        mseg = criteria.merge_segment(**kw)
        # simple_search_dag getting not-to-simple maybe split?
        _____, ssdA, rsltA, logA = results[0]
        critB, ssdB, rsltB, logB = results[1]
        assert _shared_ssdag
        ssdag = simple_search_dag(criteria,
                                  only_seg=mseg,
                                  make_edges=False,
                                  source=_shared_ssdag,
                                  bbs=bbs,
                                  **kw)
        ssdag.verts = ssdB.verts[:-1] + (ssdag.verts[mseg], ) + ssdA.verts[1:]
        assert len(ssdag.verts) == len(criteria.bbspec)
        rslt = merge_results_concat(criteria, ssdag, ssdA, rsltA, critB, ssdB,
                                    rsltB, **kw)
        return ssdag, rslt, logA + logB
    else:
        raise NotImplementedError('dunno more than two stages!')
示例#2
0
def search_single_stage(criteria, lbl="", **kw):

    if kw["run_cache"]:
        if os.path.exists(kw["run_cache"] + lbl + ".pickle"):
            with (open(kw["run_cache"] + lbl + ".pickle", "rb")) as inp:
                ssdag, result = _pickle.load(inp)
                return criteria, ssdag, result, ["from run cache " + lbl]

    ssdag = simple_search_dag(criteria, source=_shared_ssdag, lbl=lbl, **kw)

    result, tsearch = run_and_time(
        grow_linear,
        ssdag=ssdag,
        loss_function=criteria.jit_lossfunc(),
        last_bb_same_as=criteria.from_seg if criteria.is_cyclic else -1,
        lbl=lbl,
        **kw,
    )

    Nsparse = result.stats.total_samples[0]
    Nsparse_rate = int(Nsparse / tsearch)

    log = []
    if len(result.idx):
        frac_redundant = result.stats.n_redundant_results[0] / len(result.idx)
        log = [
            f"grow_linear {lbl} done, nresults {len(result.idx):,}, " +
            f"total_samples {result.stats.total_samples[0]:,}, " +
            f"samp/sec {Nsparse_rate:,}, redundant ratio {frac_redundant}"
        ]
    if log:
        print(log[-1])

    if kw["run_cache"]:
        with (open(kw["run_cache"] + lbl + ".pickle", "wb")) as out:
            _pickle.dump((ssdag, result), out)

    return criteria, ssdag, result, log
示例#3
0
文件: app.py 项目: clrichar/worms
def search_single_stage(criteria, lbl='', **kw):

    if kw['run_cache']:
        if os.path.exists(kw['run_cache'] + lbl + '.pickle'):
            with (open(kw['run_cache'] + lbl + '.pickle', 'rb')) as inp:
                ssdag, result = _pickle.load(inp)
                return criteria, ssdag, result, ['from run cache ' + lbl]

    assert _shared_ssdag
    ssdag = simple_search_dag(criteria, source=_shared_ssdag, lbl=lbl, **kw)
    # print('number of bblocks:', [len(x) for x in ssdag.bbs])

    result, tsearch = run_and_time(
        grow_linear,
        ssdag=ssdag,
        loss_function=criteria.jit_lossfunc(),
        last_bb_same_as=criteria.from_seg if criteria.is_cyclic else -1,
        lbl=lbl,
        **kw)

    Nsparse = result.stats.total_samples[0]
    Nsparse_rate = int(Nsparse / tsearch)

    log = []
    if len(result.idx):
        frac_redundant = result.stats.n_redundant_results[0] / len(result.idx)
        log = [
            f'grow_linear {lbl} done, nresults {len(result.idx):,}, ' +
            f'samp/sec {Nsparse_rate:,}, redundant ratio {frac_redundant}'
        ]
    if log: print(log[-1])

    if kw['run_cache']:
        with (open(kw['run_cache'] + lbl + '.pickle', 'wb')) as out:
            _pickle.dump((ssdag, result), out)

    return criteria, ssdag, result, log
示例#4
0
文件: app.py 项目: clrichar/worms
def worms_main2(criteria_list, kw):

    print('worms_main,', len(criteria_list), 'criteria, args:')
    for k, v in kw.items():
        print('   ', k, v)
    pyrosetta.init('-mute all -beta -preserve_crystinfo')
    blosc.set_releasegil(True)

    orig_output_prefix = kw['output_prefix']

    for icrit, criteria in enumerate(criteria_list):
        if len(criteria_list) > 1:
            assert len(criteria_list) is len(kw['config_file'])
            name = os.path.basename(kw['config_file'][icrit])
            name = name.replace('.config', '')
            kw['output_prefix'] = orig_output_prefix + '_' + name
        print('================== start job', icrit, '======================')
        print('output_prefix:', kw['output_prefix'])
        print('criteria:', criteria)
        print('bbspec:', criteria.bbspec)

        if kw['precache_splices']:
            print('precaching splices')
            merge_bblock = kw['merge_bblock']
            del kw['merge_bblock']
            kw['bbs'] = simple_search_dag(criteria,
                                          merge_bblock=None,
                                          precache_only=True,
                                          **kw)
            kw['merge_bblock'] = merge_bblock
            if kw['precache_splices_and_quit']:
                return

        global _shared_ssdag
        if 'bbs' in kw and (len(kw['bbs']) > 2
                            or kw['bbs'][0] is not kw['bbs'][1]):

            ############3

            #

            # _shared_ssdag = simple_search_dag(
            #    criteria, print_edge_summary=True, **kw
            # )

            merge_bblock = kw['merge_bblock']
            del kw['merge_bblock']
            _shared_ssdag = simple_search_dag(criteria,
                                              merge_bblock=0,
                                              print_edge_summary=True,
                                              **kw)
            kw['merge_bblock'] = merge_bblock
            print('memuse for global _shared_ssdag:')
            _shared_ssdag.report_memory_use()

            ####

            #

        if _shared_ssdag:
            if not 'bbs' in kw:
                kw['bbs'] = _shared_ssdag.bbs
            assert len(_shared_ssdag.bbs) == len(kw['bbs'])
            for a, b in zip(_shared_ssdag.bbs, kw['bbs']):
                for aa, bb in zip(a, b):
                    assert aa is bb

        log = worms_main_each_mergebb(criteria, **kw)
        if kw['pbar']:
            print('======================== logs ========================')
            for msg in log:
                print(msg)
    print('======================== done ========================')
示例#5
0
def worms_main2(criteria_list, kw):
    print("worms_main,", len(criteria_list), "criteria, args:")
    orig_output_prefix = kw["output_prefix"]
    for icrit, criteria in enumerate(criteria_list):
        if len(criteria_list) > 1:
            assert len(criteria_list) is len(kw["config_file"])
            name = os.path.basename(kw["config_file"][icrit])
            name = name.replace(".config", "")
            kw["output_prefix"] = orig_output_prefix + "_" + name
        print("================== start job", icrit, "======================")
        print("output_prefix:", kw["output_prefix"])
        print("criteria:", criteria)
        print("bbspec:", criteria.bbspec)

        if kw["precache_splices"]:
            print("precaching splices")
            merge_bblock = kw["merge_bblock"]
            del kw["merge_bblock"]
            pbar = kw["pbar"]
            del kw["pbar"]
            kw["bbs"] = simple_search_dag(criteria,
                                          merge_bblock=None,
                                          precache_only=True,
                                          pbar=True,
                                          **kw)
            if kw["only_bblocks"]:
                assert len(kw["bbs"]) is len(kw["only_bblocks"])
                for i, bb in enumerate(kw["bbs"]):
                    kw["bbs"][i] = [bb[kw["only_bblocks"][i]]]
                print("modified bblock numbers (--only_bblocks)")
                print("   ", [len(b) for b in kw["bbs"]])
            kw["merge_bblock"] = merge_bblock
            kw["pbar"] = pbar
            if kw["precache_splices_and_quit"]:
                return

        global _shared_ssdag
        if "bbs" in kw and (len(kw["bbs"]) > 2
                            or kw["bbs"][0] is not kw["bbs"][1]):

            ############3

            #

            # _shared_ssdag = simple_search_dag(
            #    criteria, print_edge_summary=True, **kw
            # )

            merge_bblock = kw["merge_bblock"]
            del kw["merge_bblock"]
            _shared_ssdag = simple_search_dag(criteria,
                                              merge_bblock=0,
                                              print_edge_summary=True,
                                              **kw)
            kw["merge_bblock"] = merge_bblock
            print("memuse for global _shared_ssdag:")
            _shared_ssdag.report_memory_use()

            ####

            #

        if _shared_ssdag:
            if not "bbs" in kw:
                kw["bbs"] = _shared_ssdag.bbs
            assert len(_shared_ssdag.bbs) == len(kw["bbs"])
            for a, b in zip(_shared_ssdag.bbs, kw["bbs"]):
                for aa, bb in zip(a, b):
                    assert aa is bb

        if kw["context_structure"]:
            kw["context_structure"] = ClashGrid(kw["context_structure"], **kw)
        else:
            kw["context_structure"] = None

        log = worms_main_each_mergebb(criteria, **kw)
        if kw["pbar"]:
            print("======================== logs ========================")
            for msg in log:
                print(msg)
    print("======================== done ========================")
示例#6
0
def search_func(criteria, bbs, monte_carlo, merge_segment, **kw):

    stages = [(criteria, bbs)]
    merge = None
    if hasattr(criteria, "stages"):
        stages, merge = criteria.stages(bbs=bbs, **kw)
    if len(stages) > 1:
        assert kw["merge_bblock"] is not None

    assert len(monte_carlo) in (1, len(stages))
    if len(monte_carlo) != len(stages):
        monte_carlo *= len(stages)

    results = list()
    for i, stage in enumerate(stages):
        crit, stage_bbs = stage
        if callable(crit):
            crit = crit(*results[-1][:-1])
        lbl = f"stage{i}"
        if kw["merge_bblock"] is not None:
            lbl = f'stage{i}_mbb{kw["merge_bblock"]:04}'
        results.append(
            search_single_stage(
                crit,
                monte_carlo=monte_carlo[i],
                lbl=lbl,
                bbs=stage_bbs,
                merge_segment=merge_segment,
                **kw,
            ))
        if not hasattr(crit,
                       "produces_no_results") and len(results[-1][2].idx) is 0:
            print("mbb", kw["merge_bblock"], "no results at stage", i)
            return None, None, None

    # todo: this whole block is very protocol-specific... needs refactoring
    if len(results) is 1:
        assert merge is None
        return results[0][1:]
    elif len(results) is 2:

        mseg = merge_segment
        if mseg is None:
            mseg = criteria.merge_segment(**kw)
        # simple_search_dag getting not-to-simple maybe split?
        _____, ssdA, rsltA, logA = results[0]
        critB, ssdB, rsltB, logB = results[1]
        assert _shared_ssdag
        ssdag = simple_search_dag(
            criteria,
            only_seg=mseg,
            make_edges=False,
            source=_shared_ssdag,
            bbs=bbs,
            **kw,
        )
        ssdag.verts = ssdB.verts[:-1] + (ssdag.verts[mseg], ) + ssdA.verts[1:]

        assert len(ssdag.verts) == len(criteria.bbspec)
        rslt = merge(criteria, ssdag, ssdA, rsltA, critB, ssdB, rsltB, **kw)
        return ssdag, rslt, logA + logB

    elif len(results) is 3:
        # hacky: assume 3stage is brigde protocol

        _____, ____, _____, logA = results[0]
        _____, ssdB, _____, logB = results[1]
        critC, ssdC, rsltC, logC = results[2]

        assert _shared_ssdag
        mseg = merge_segment
        if mseg is None:
            mseg = criteria.merge_segment(**kw)
        ssdag = simple_search_dag(
            criteria,
            only_seg=mseg,
            make_edges=False,
            source=_shared_ssdag,
            bbs=bbs,
            **kw,
        )
        ssdag.verts = ssdC.verts[:-1] + (ssdag.verts[mseg], ) + ssdB.verts[1:]
        assert len(ssdag.verts) == len(criteria.bbspec)

        rslt = merge(criteria, critC, ssdag, ssdB, ssdC, rsltC, **kw)

        return ssdag, rslt, logA + logB + logC

    else:

        assert 0, "unknown 3+ stage protcol"