def test_kernel_small_family(self):
     family = [{1, 2, 3}, {1, 3, 4}, {1, 2, 5}, {1, 8, 9}, {1, 5, 6}]
     universe = reduce(set.union, family, set())
     kernel, _ = kernel_hitting_set(family, universe, 3, 1)
     intersection = reduce(set.intersection, kernel, universe)
     self.assertEqual(intersection, {1})
     self.assertLessEqual(len(kernel), 3)
 def test_kernel_brute(self):
     family = [{1, 3}, {2, 4}, {1, 5}, {2, 6}, {1, 7}, {2, 8}, {1, 9},
               {2, 10}, {1, 11}, {2, 12}, {1, 12}, {2, 11}, {1, 10}, {2, 9},
               {1, 8}, {2, 7}, {1, 6}]
     universe = {i for i in range(13)}
     kernel = kernel_hitting_set(family, universe, 2, 2)
     k_result = brute_hitting_set(kernel[0], kernel[1], 2)
     b_result = brute_hitting_set(family, universe, 2)
     self.assertLessEqual(len(kernel[0]), 6)
     self.assertLessEqual(len(kernel[1]), 12)
     self.assertEqual(k_result, b_result)
     self.assertEqual(k_result, {1, 2})
 def test_empty_family(self):
     family = []
     result = kernel_hitting_set(family, set(), 5, 2)
     self.assertEqual(result[0], [])
     self.assertEqual(result[1], set())
 def test_universe_error(self):
     family = [{'a'}]
     with self.assertRaises(ValueError):
         kernel_hitting_set(family, {'b'}, 2, 1)
 def test_family_error(self):
     family = [{'a', 'b'}, {'c', 'd', 'e'}]
     with self.assertRaises(ValueError):
         kernel_hitting_set(family, {'a', 'b', 'c', 'd', 'e'}, 2, 1)