def profile_cartographer(theory='skj', extra_size=0, tool='time', infer=True): ''' Profile cartographer load-infer-dump on region of world. Available tools: time, valgrind, cachegrind, callgrind, helgrind ''' size = pomagma.util.MIN_SIZES[theory] + extra_size with atlas.chdir(theory): opts = {'log_file': 'profile.log', 'log_level': 2} region = DB('region.normal.{:d}'.format(size)) temp = pomagma.util.temp_name(DB('profile')) world = DB('world') world_size = atlas.get_item_count(world) if size >= world_size: print 'Using world of size {}'.format(world_size) region = world elif not os.path.exists(region): print 'Creating {} for profile'.format(region) assert os.path.exists(world), 'First initialize world map' with cartographer.load(theory, world, **opts) as db: db.trim([{'size': size, 'filename': region}]) opts.setdefault('runner', PROFILERS.get(tool, tool)) with cartographer.load(theory, region, **opts) as db: if infer: for priority in [0, 1]: count = db.infer(priority) print 'Proved {} theorems'.format(count) db.dump(temp) print 'Hash:', atlas.get_hash(temp) os.remove(temp)
def _test_atlas(theory): ''' Test basic operations in one theory: init, validate, copy, survey, aggregate, conjecture_diverge, conjecture_equal ''' buildtype = 'debug' if pomagma.util.debug else 'release' path = os.path.join(pomagma.util.DATA, 'test', buildtype, 'atlas', theory) if os.path.exists(path): os.system('rm -f {}/*'.format(path)) else: os.makedirs(path) with ExitStack() as stack: with_ = stack.enter_context with_(pomagma.util.chdir(path)) with_(mock.patch('pomagma.util.BLOB_DIR', new=path)) with_(pomagma.util.mutex(block=False)) min_size = pomagma.util.MIN_SIZES[theory] dsize = min(64, 1 + min_size) sizes = [min_size + i * dsize for i in range(10)] opts = {'log_file': 'test.log', 'log_level': 2} diverge_conjectures = 'diverge_conjectures.facts' diverge_theorems = 'diverge_theorems.facts' equal_conjectures = 'equal_conjectures.facts' equal_theorems = 'equal_theorems.facts' surveyor.init(theory, DB(0), sizes[0], **opts) changed = atlas.update_theory(theory, DB(0), DB(1), **opts) assert not changed with cartographer.load(theory, DB(0), **opts) as db: db.validate() db.dump(DB(1)) expected_size = atlas.get_item_count(DB(1)) actual_size = db.info()['item_count'] assert actual_size == expected_size surveyor.survey(theory, DB(1), DB(2), sizes[1], **opts) with cartographer.load(theory, DB(2), **opts) as db: db.trim([{'size': sizes[0], 'filename': DB(3)}]) surveyor.survey(theory, DB(3), DB(4), sizes[1], **opts) with cartographer.load(theory, DB(2), **opts) as db: db.aggregate(DB(4)) db.dump(DB(5)) with cartographer.load(theory, DB(5), **opts) as db: db.aggregate(DB(0)) db.dump(DB(6)) digest5 = atlas.get_hash(DB(5)) digest6 = atlas.get_hash(DB(6)) assert digest5 == digest6 counts = db.conjecture(diverge_conjectures, equal_conjectures) assert counts['diverge_count'] > 0, counts['diverge_count'] assert counts['equal_count'] > 0, counts['equal_count'] if theory != 'h4': theorem_count = theorist.try_prove_diverge( diverge_conjectures, diverge_conjectures, diverge_theorems, **opts) assert theorem_count > 0, theorem_count counts = db.assume(diverge_theorems) assert counts['pos'] + counts['neg'] > 0, counts assert counts['ignored'] == 0, counts db.validate() db.dump(DB(6)) theorem_count = theorist.try_prove_nless( theory, DB(6), equal_conjectures, equal_conjectures, equal_theorems, **opts) # assert theorem_count > 0, theorem_count if theory != 'h4': with cartographer.load(theory, DB(6), **opts) as db: db.assume(equal_theorems) if theorem_count > 0: assert counts['merge'] > 0, counts db.validate() for priority in [0, 1]: while db.infer(priority): db.validate() for priority in [0, 1]: assert not db.infer(priority) db.dump(DB(7)) with analyst.load(theory, DB(7), **opts) as db: fail_count = db.test_inference() assert fail_count == 0, 'analyst.test_inference failed' blobstore.validate_blobs()