def test_srow_contains_element_not_in_u(example): extra = 10 subset = 'B' example['s'][subset].add(extra) with pytest.raises(ExactCoverKeyError) as e: solve(example['u'], example['s']) assert (f'ExactCoverKeyError: Element {repr(extra)} in ' f'subsets_rows {repr(subset)} is not in Universe') == str(e.value)
def test_solution_in_single_srow(example): example['s']['A'] = set() example['s']['B'] = {1, 2, 3, 4, 5, 6, 7} example['s']['C'] = set() example['s']['D'] = set() example['s']['E'] = set() example['s']['F'] = set() assert [{'B'}] == solve(example['u'], example['s'])
def test_limit1_random_multiple_solutions(small_example): counts_ab = 0 counts_cd = 0 size = 100 for i in range(size): result = solve(small_example['u'], small_example['s'], limit=1, randomize=True) if [{'A', 'B'}] == result: counts_ab += 1 if [{'C', 'D'}] == result: counts_cd += 1 assert counts_ab != 0 and counts_cd != 0
def test_limit1_nonrandom_multiple_solutions(small_example): size = 100 counts = {} for i in range(size): result = tuple( sorted( list( solve(small_example['u'], small_example['s'], limit=1, randomize=False).pop()))) if result not in counts: counts[result] = 1 else: counts[result] += 1 assert len(counts) == 1 and counts[result] == size
def test_count_preseed_2solutionTo0count(example): example['s']['G'] = {3, 5, 6} result = solve(example['u'], example['s'], preseed={'A'}, count=True) assert 0 == result
def test_count_ignore(example): example['s']['G'] = {3, 5, 6} result = solve(example['u'], example['s'], count=3) assert [{'B', 'D', 'F'}, {'B', 'F', 'G'}] == result
def test_limitneg1_multiple_solutions(example): example['s']['G'] = {3, 5, 6} result = solve(example['u'], example['s'], limit=-1) assert [{'B', 'D', 'F'}, {'B', 'G', 'F'}] == result
def test_no_solution(example): example['s']['D'].remove(6) example['s']['E'].remove(6) assert [] == solve(example['u'], example['s'])
def test_accept_str_u(trivial): s = {k: set([str(x) for x in v]) for k, v in trivial['s'].items()} assert isinstance(solve(''.join(map(str, trivial['u'])), s), list)
def test_accept_dict_u(trivial): assert isinstance(solve({x: x for x in trivial['u']}, trivial['s']), list)
def test_preseed_contains_mix_invalid_correct(example): fill = 'G' with pytest.raises(ExactCoverKeyError) as e: solve(example['u'], example['s'], preseed={fill, 'B'}) assert (f'ExactCoverKeyError: Element {repr(fill)} in preseed ' f'is not in subsets_rows') == str(e.value)
def test_preseed_contains_mix_incorrect_correct(example): assert [] == solve(example['u'], example['s'], preseed={'A', 'B'})
def test_preseed_contains_all_correct_and_1x_incorrect(example): result = solve(example['u'], example['s'], preseed={'B', 'D', 'F', 'C'}) assert [] == result
def test_preseed_contains_2x_correct(example): result = solve(example['u'], example['s'], preseed={'B', 'F'}) assert [{'B', 'D', 'F'}] == result
def test_preseed_ignores_wrong_type(example): assert [{'B', 'D', 'F'}] == solve(example['u'], example['s'], preseed=[1])
def test_preseed_empty(example): assert [{'B', 'D', 'F'}] == solve(example['u'], example['s'], preseed={})
def test_returns_set(): assert isinstance(solve(set(), dict()), list)
def test_preseed_multiple_solutions_choose_correct_possibility(example): example['s']['G'] = {3, 5, 6} result_d = solve(example['u'], example['s'], limit=1, preseed={'D'}) result_g = solve(example['u'], example['s'], limit=1, preseed={'G'}) assert [{'B', 'D', 'F'}] == result_d assert [{'B', 'F', 'G'}] == result_g
def test_accept_list_u(trivial): assert isinstance(solve(list(trivial['u']), trivial['s']), list)
def test_preseed_multiple_solutions_choose_incorrect_possibility(example): example['s']['G'] = {3, 5, 6} result = solve(example['u'], example['s'], limit=1, preseed={'C'}) assert [] == result
def test_accept_tuple_u(trivial): assert isinstance(solve(tuple(trivial['u']), trivial['s']), list)
def test_s_contains_empty_srow(example): example['s']['G'] = set() assert [{'B', 'D', 'F'}] == solve(example['u'], example['s'])
def test_example(example): assert [{'B', 'D', 'F'}] == solve(example['u'], example['s'])
def test_one_each_in_subset(): u = {1, 2, 3} s = {10: {2}, 20: {1}, 30: {3}} assert [{10, 20, 30}] == solve(u, s)
def test_count_one_solution(example): assert 1 == solve(example['u'], example['s'], count=True)
def test_invalid_limit_multiple_solutions(example): example['s']['G'] = {3, 5, 6} result = solve(example['u'], example['s'], limit='a') assert [{'B', 'D', 'F'}, {'B', 'F', 'G'}] == result
def test_count_no_solution(example): example['s']['D'].remove(6) example['s']['E'].remove(6) assert 0 == solve(example['u'], example['s'], count=True)
def test_count_multiple_solutions(example): example['s']['G'] = {3, 5, 6} result = solve(example['u'], example['s'], count=True) assert 2 == result
"""Examples for exactcover.""" from exactcover.exactcover import solve # Basic usage u = {1, 2, 3, 4, 5, 6, 7} s = { 'A': {1, 4, 7}, 'B': {1, 4}, 'C': {4, 5, 7}, 'D': {3, 5, 6}, 'E': {2, 3, 6, 7}, 'F': {2, 7}, } result = solve(u, s) print(result) # [{'D', 'F', 'B'}] # An example with multiple solutions. u = {1, 2, 3, 4, 5, 6, 7} s = { 'A': {1, 4, 7}, 'B': {1, 4}, 'C': {4, 5, 7}, 'D': {3, 5, 6}, 'E': {2, 3, 6, 7}, 'F': {2, 7}, 'G': {3, 5, 6}, } result = solve(u, s) print(result) # [{'D', 'F', 'B'}, {'G', 'F', 'B'}]
def test_limit1_multiple_solutions(example): example['s']['G'] = {3, 5, 6} assert [{'B', 'D', 'F'}] == solve(example['u'], example['s'], limit=1)