def test_clip(): pat, _ = autoguess_life_file("lifep/breeder.lif") node = construct(pat) verify_clipped(node, 0, 0, 1600, 1600) verify_clipped(node, 0, 0, 160, 160) verify_clipped(node, 40, 40, 1600, 1600) verify_clipped(node, 40, 40, 160, 160)
def test_gray(): pat, _ = autoguess_life_file("lifep/breeder.lif") node = construct(pat) total_on = len(expand(node)) for l in range(6): expansion = expand(node, level=l) gray_sum = sum([g for (x, y, g) in expansion]) assert gray_sum == total_on / (2 ** (l * 2))
def test_ffwd_large(): pat, _ = autoguess_life_file("lifep/breeder.lif") ffwd(construct(pat), 64)
def test_all_patterns(): for pat_fname in os.listdir("lifep"): if pat_fname.endswith(".lif"): pat, _ = autoguess_life_file("lifep/" + pat_fname) verify_baseline(pat, 64)
# try to generate all 4x4 successors def product_tree(pieces): return [join(a, b, c, d) for a, b, c, d in product(pieces, repeat=4)] # check cache is working for i in range(2): boot_2x2 = product_tree([on, off]) boot_4x4 = product_tree(boot_2x2) centres = {p: successor(p, 1) for p in boot_4x4} assert join.cache_info().currsize == 65536 + 16 assert successor.cache_info().currsize == 65536 test_fname = "lifep/gun30.lif" test_pattern, _ = autoguess_life_file(test_fname) def test_advance(): pat_node = construct(test_pattern) for i in range(32): node = advance(pat_node, i) validate_tree(node) for i in range(4): node, gens = ffwd(pat_node, i) validate_tree(node) assert advance(get_zero(8), 8).n == 0 assert ffwd(get_zero(8), 4)[0].n == 0
def load_life(fname): return lifeparsers.to_numpy(lifeparsers.autoguess_life_file(fname)[0])
def load_lif(fname): pat, comments = autoguess_life_file(fname) return construct(pat)