def test_congruence_by_pairs1(self): ReportGuard(False) S = FroidurePin(Transformation([1, 0, 1]), Transformation([0, 0, 0])) C = CongruenceByPairs("left", S) C.add_pair([0], [1]) self.assertEqual(C.nr_classes(), 1) self.assertEqual(S.size(), 4)
def test_idempotents(self): S = FroidurePin(Transformation([1, 0, 1]), Transformation([0, 0, 0])) self.assertEqual( list(S.idempotents()), [ Transformation([0, 0, 0]), Transformation([0, 1, 0]), Transformation([1, 1, 1]), ], )
def test_deleted_methods(self): S = FroidurePin(Transformation([1, 0, 1])) with self.assertRaises(LibsemigroupsCppyyException): S.add_generators() with self.assertRaises(LibsemigroupsCppyyException): S.copy_add_generators() with self.assertRaises(LibsemigroupsCppyyException): S.closure() with self.assertRaises(LibsemigroupsCppyyException): S.copy_closure()
def test_036(self): S = FroidurePin(Transformation([1, 3, 4, 2, 3]), Transformation([3, 2, 1, 3, 3])) tc = ToddCoxeter("twosided") tc.set_nr_generators(2) tc.add_pair([0], [1]) tc.add_pair([0, 0], [0]) self.assertEqual(tc.nr_classes(), 1) with self.assertRaises(LibsemigroupsException): tc.prefill(S.right_cayley_graph())
def test_sorted_elements(self): S = FroidurePin(Transformation([1, 0, 1]), Transformation([0, 0, 0])) expected = [ Transformation([0, 0, 0]), Transformation([0, 1, 0]), Transformation([1, 0, 1]), Transformation([1, 1, 1]), ] self.assertEqual(list(S.sorted_elements()), expected) self.assertEqual(S.sorted_elements()[:2], expected[:2]) self.assertEqual(S.sorted_elements()[::-1], expected[::-1])
def test_init(self): FroidurePin(Transformation([1, 0, 1]), Transformation([0, 0, 0])) with self.assertRaises(KeyError): FroidurePin() with self.assertRaises(ValueError): FroidurePin(PartialPerm([1, 2], [0, 1], 3), Transformation([0, 1])) with self.assertRaises(TypeError): FroidurePin({2, 3})
def test_prefixes_and_suffixes(self): S = FroidurePin(Transformation(list(range(1, 5)) + [0])) self.assertEqual(S.prefix(0), 18446744073709551615) for i in range(1, S.size()): self.assertEqual(S.prefix(i), i - 1) self.assertEqual(S.suffix(i), i - 1) self.assertEqual(S.first_letter(i), 0) self.assertEqual(S.final_letter(i), 0)
def check_initialisation(self, t): ReportGuard(False) x = t() x.set_alphabet("ba") x.add_rule([0, 1], [1, 0]) with self.assertRaises(TypeError): x.add_rule([0, 1], [2]) S = FroidurePin(Transformation([1, 2, 0]), Transformation([1, 0, 2])) x.add_rules(S) self.assertEqual(x.size(), 2) x = t() x.set_alphabet("abBe") x.set_identity("e") x.set_inverses("aBbe") x.add_rule("bb", "B") x.add_rule("BaBa", "abab") self.assertEqual(x.size(), 24) x = t() x.set_alphabet(1) x.set_identity(0) self.assertEqual(x.size(), 1)
def test_iterator(self): S = FroidurePin(Transformation([1, 0, 1]), Transformation([0, 0, 0])) self.assertEqual( list(S), [ Transformation([1, 0, 1]), Transformation([0, 0, 0]), Transformation([0, 1, 0]), Transformation([1, 1, 1]), ], )
def test_products(self): S = FroidurePin(Transformation(list(range(1, 5)) + [0])) S.run() for i in range(5): for j in range(5): self.assertEqual(S.fast_product(i, j), ((i + j + 1) % 5)) self.assertEqual(S.product_by_reduction(i, j), ((i + j + 1) % 5))
def test_constructors(self): ReportGuard(False) S = FroidurePin(Transformation([1, 0, 1]), Transformation([0, 0, 0])) T = FpSemigroup(S) self.assertFalse(T.has_froidure_pin()) if compare_version_numbers(libsemigroups_version(), "1.1.0"): self.assertEqual(S.nr_rules(), T.nr_rules()) self.assertEqual( S.rules(), [[[0, 1], [1]], [[1, 1], [1]], [[0, 0, 0], [0]], [[1, 0, 0], [1]]], ) self.assertEqual( T.rules(), [ ["\x01\x02", "\x02"], ["\x02\x02", "\x02"], ["\x01\x01\x01", "\x01"], ["\x02\x01\x01", "\x02"], ], ) self.assertEqual(T.size(), S.size())
def test_basic(self): ReportGuard(False) s1 = PythonElement(1) s2 = PythonElement(2) s3 = PythonElement(3) self.assertEqual(s3.get_value(), 3) self.assertTrue(not s1 < s1) self.assertTrue(s1 < s2) s = s2 * s3 self.assertEqual(s.get_value(), 6) # Fails with Sage Integers S = FroidurePin([s1]) self.assertEqual(S.size(), 1) S = FroidurePin([s1, s2, s3]) S.enumerate(100) self.assertEqual(S.current_size(), 8195) self.assertEqual(S.current_nr_rules(), 6)
def test_idempotents(self): S = FroidurePin(Transformation([1, 0, 1]), Transformation([0, 0, 0])) S.run() self.assertEqual( std.distance(S.cbegin_idempotents(), S.cend_idempotents()), S.nr_idempotents(), ) self.assertEqual( list(S.idempotents()), [ Transformation([0, 0, 0]), Transformation([0, 1, 0]), Transformation([1, 1, 1]), ], )
def test_bug1_works_zno(self): S = FpSemigroup() S.set_alphabet("01") S.add_rule("000", "0") S.add_rule("1111", "1") S.add_rule("01110", "00") S.add_rule("1001", "11") S.add_rule("001010101010", "00") S.run() S.rules() S = FroidurePin(Transformation([1, 0, 1]), Transformation([0, 0, 0])) self.assertEqual(S.size(), 4) self.assertEqual(std.distance(S.cbegin(), S.cend()), S.size())
def test_copy_constructor(self): S = FroidurePin(Transformation([1, 0, 1]), Transformation([0, 0, 0])) T = S self.assertTrue(T is S) self.assertTrue(S is T) T = FroidurePin(S) self.assertFalse(S is T) self.assertFalse(T is S) self.assertEqual(T.size(), 4) self.assertEqual(S.current_size(), 2)
def test_attributes(self): tc = ToddCoxeter("left") tc.set_nr_generators(1) tc.add_pair([0, 0, 0, 0, 0, 0], [0, 0, 0]) self.assertEqual(tc.nr_classes(), 5) self.assertTrue(tc.contains([0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0])) self.assertFalse(tc.contains([0, 0, 0], [0, 0])) self.assertEqual(tc.const_contains([0, 0, 0], [0, 0]), 0) self.assertEqual(tc.kind(), "left") self.assertFalse(tc.empty()) self.assertEqual(tc.class_index_to_word(1), [0, 0]) self.assertEqual(tc.word_to_class_index([0, 0]), 1) self.assertFalse(tc.has_parent_froidure_pin()) self.assertEqual(tc.nr_generators(), 1) self.assertEqual(tc.nr_generating_pairs(), 1) self.assertTrue(tc.less([0], [0, 0])) S = FroidurePin(Transformation([1, 2, 2]), Transformation([2, 0, 1])) tc = ToddCoxeter("twosided", S) self.assertEqual(tc.nr_classes(), 24) self.assertTrue(tc.has_parent_froidure_pin()) try: tc.parent_froidure_pin() except: self.fail("unexpected exception thrown") try: tc.quotient_froidure_pin() except: self.fail("unexpected exception thrown") K = KnuthBendix() K.set_alphabet("a") K.add_rule("aaaa", "aa") tc = ToddCoxeter("left", K) self.assertEqual(tc.nr_classes(), 3) tc = ToddCoxeter("twosided") tc.set_nr_generators(1) self.assertTrue(tc.is_quotient_obviously_infinite()) self.assertFalse(tc.is_quotient_obviously_finite()) tc.add_pair([0, 0, 0], [0]) self.assertFalse(tc.is_quotient_obviously_infinite()) tc.run() self.assertTrue(tc.is_quotient_obviously_finite())
def test_aaa_bug(self): ReportGuard(False) S = FroidurePin(Transformation([1, 0, 1]), Transformation([0, 0, 0])) S.run() self.assertEqual(std.distance(S.cbegin(), S.cend()), 4) self.assertEqual( list(S), [ Transformation([1, 0, 1]), Transformation([0, 0, 0]), Transformation([0, 1, 0]), Transformation([1, 1, 1]), ], )
def test_settings(self): ReportGuard(False) tc = ToddCoxeter("left") tc.set_nr_generators(1) tc.add_pair([0, 0, 0, 0], [0, 0]) try: tc.reserve(10) except: self.fail("unexpected exception thrown") tc.run() self.assertFalse(tc.is_standardized()) try: tc.standardize("lex") except: self.fail("unexpected exception thrown") self.assertTrue(tc.is_standardized()) try: tc.standardize("shortlex") except: self.fail("unexpected exception thrown") try: tc.standardize("recursive") except: self.fail("unexpected exception thrown") try: tc.standardize(True) except: self.fail("unexpected exception thrown") try: tc.standardize(False) except: self.fail("unexpected exception thrown") with self.assertRaises(TypeError): tc.standardize(1) with self.assertRaises(ValueError): tc.standardize("shooortlex") S = FroidurePin(Transformation([3, 1, 2, 1, 2]), Transformation([1, 1, 1, 2, 2])) tc = ToddCoxeter("twosided", S) try: tc.froidure_pin_policy() except: self.fail("unexpected exception thrown") try: tc.froidure_pin_policy("none") except: self.fail("unexpected exception thrown") self.assertEqual(tc.froidure_pin_policy(), "none") try: tc.froidure_pin_policy("use_relations") except: self.fail("unexpected exception thrown") self.assertEqual(tc.froidure_pin_policy(), "use_relations") try: tc.froidure_pin_policy("use_cayley_graph") except: self.fail("unexpected exception thrown") self.assertEqual(tc.froidure_pin_policy(), "use_cayley_graph") with self.assertRaises(TypeError): tc.froidure_pin_policy(1) with self.assertRaises(ValueError): tc.froidure_pin_policy("userelations") tc = ToddCoxeter("left") tc.set_nr_generators(2) tc.add_pair([0, 0, 0, 0], [0]) tc.add_pair([1, 1, 1, 1], [0]) with self.assertRaises(ValueError): tc.strategy("feelsch") with self.assertRaises(TypeError): tc.strategy(1) try: tc.strategy("felsch") except: self.fail("unexpected exception thrown") self.assertEqual(tc.strategy(), "felsch") try: tc.strategy("hlt") except: self.fail("unexpected exception thrown") self.assertEqual(tc.strategy(), "hlt") try: tc.strategy("random") except: self.fail("unexpected exception thrown") self.assertEqual(tc.strategy(), "random")
def test_constructors(self): try: ToddCoxeter("left") except: self.fail("unexpected exception thrown") try: ToddCoxeter("right") except: self.fail("unexpected exception thrown") try: ToddCoxeter("twosided") except: self.fail("unexpected exception thrown") with self.assertRaises(TypeError): ToddCoxeter(45) with self.assertRaises(ValueError): ToddCoxeter("lft") with self.assertRaises(TypeError): ToddCoxeter("twosided", "left", "right") S = FroidurePin(Transformation([0, 0, 1, 2, 3])) with self.assertRaises(TypeError): ToddCoxeter(S) try: ToddCoxeter("twosided", S) except: self.fail("unexpected exception thrown") K = KnuthBendix() with self.assertRaises(TypeError): ToddCoxeter("left", K) K.set_alphabet("a") try: ToddCoxeter("left", K) except: self.fail("unexpected exception thrown") T = ToddCoxeter("left") with self.assertRaises(TypeError): ToddCoxeter("left", T) T.set_nr_generators(1) with self.assertRaises(TypeError): ToddCoxeter("right", T) with self.assertRaises(TypeError): ToddCoxeter("twosided", T) try: ToddCoxeter("left", T) except: self.fail("unexpected exception thrown") T = ToddCoxeter("right") with self.assertRaises(TypeError): ToddCoxeter("right", T) T.set_nr_generators(1) with self.assertRaises(TypeError): ToddCoxeter("left", T) with self.assertRaises(TypeError): ToddCoxeter("twosided", T) try: ToddCoxeter("right", T) except: self.fail("unexpected exception thrown") T = ToddCoxeter("twosided") with self.assertRaises(TypeError): ToddCoxeter("twosided", T) T.set_nr_generators(1) try: ToddCoxeter("left", T) except: self.fail("unexpected exception thrown") try: ToddCoxeter("right", T) except: self.fail("unexpected exception thrown") try: ToddCoxeter("twosided", T) except: self.fail("unexpected exception thrown") tc = ToddCoxeter("left") tc.set_nr_generators(2) with self.assertRaises(LibsemigroupsException): tc.add_pair([0, 0, 1, 0], [1, 1, 2])
def test_add_generator(self): ReportGuard(False) S = FroidurePin(Transformation([1, 0, 1]), Transformation([0, 0, 0])) self.assertEqual(S.size(), 4) S.add_generator(Transformation([1, 2, 0])) self.assertEqual(S.size(), 24)
def test_settings(self): S = FroidurePin(Transformation([1, 0, 1])) self.assertTrue(isinstance(S.batch_size(), int)) S.batch_size(10) self.assertEqual(S.batch_size(), 10) self.assertTrue(isinstance(S.concurrency_threshold(), int)) S.concurrency_threshold(10) self.assertEqual(S.concurrency_threshold(), 10) self.assertFalse(S.immutable()) self.assertTrue(isinstance(S.max_threads(), int)) S.max_threads(1) self.assertEqual(S.max_threads(), 1)
def test_cayley_graphs(self): ReportGuard(False) S = FroidurePin(Transformation(list(range(1, 10)) + [0])) S.run() for i in range(S.size()): self.assertEqual(S.left(i, 0), S.right(i, 0)) for i in range(S.size()): self.assertEqual(S.left_cayley_graph().get(i, 0), S.left(i, 0)) self.assertEqual(S.right_cayley_graph().get(i, 0), S.right(i, 0))
def test_run_for(self): ReportGuard(False) S = FroidurePin(Transformation([1, 0] + list(range(2, 10)))) S.add_generator(Transformation(list(range(1, 10)) + [0])) S.run_for(milliseconds(10))
def test_run_until(self): if compare_version_numbers(libsemigroups_version(), "1.0.8"): ReportGuard(False) S = FroidurePin(Transformation([1, 0] + list(range(2, 10)))) S.add_generator(Transformation(list(range(1, 10)) + [0])) S.run_until(lambda: S.current_size() > 10) self.assertFalse(S.finished()) self.assertTrue(S.current_size() > 10) S.run_until(lambda: S.current_nr_rules() > 100) self.assertFalse(S.finished()) self.assertTrue(S.current_nr_rules() > 100)
def test_state(self): ReportGuard(False) S = FroidurePin(Transformation([1, 0] + list(range(2, 10)))) S.add_generator(Transformation(list(range(1, 10)) + [0])) self.assertFalse(S.started()) S.run_for(milliseconds(10)) self.assertTrue(S.started()) self.assertTrue(S.timed_out()) self.assertTrue(S.stopped()) self.assertFalse(S.finished())
def test_attributes(self): ReportGuard(False) S = FroidurePin(Transformation(list(range(1, 10)) + [0])) self.assertEqual(S.current_nr_rules(), 0) self.assertEqual(S.current_size(), 1) self.assertEqual(S.degree(), 10) self.assertEqual(S.size(), 10) self.assertTrue(S.is_idempotent(9)) for i in range(8): self.assertFalse(S.is_idempotent(i)) with self.assertRaises(LibsemigroupsException): S.is_idempotent(10) self.assertTrue(S.is_monoid()) self.assertEqual(S.nr_generators(), 1) self.assertEqual(S.nr_idempotents(), 1)
def test_factorisation(self): S = FroidurePin(Transformation([1, 0, 1]), Transformation([0, 0, 0])) self.assertEqual(S.size(), 4) self.assertEqual([S.factorisation(x) for x in range(S.size())], [[0], [1], [0, 0], [1, 0]]) with self.assertRaises(LibsemigroupsCppyyException): S.factorisation(4) # check again because of some bug in an early version of # unwrap(_return_value) self.assertEqual([S.factorisation(x) for x in range(S.size())], [[0], [1], [0, 0], [1, 0]]) with self.assertRaises(LibsemigroupsCppyyException): S.factorisation(Transformation([1, 1, 2])) self.assertEqual([S.factorisation(x) for x in S], [[0], [1], [0, 0], [1, 0]])
def test_membership(self): S = FroidurePin(Transformation(list(range(1, 5)) + [0])) S.add_generator(Transformation([1, 0] + list(range(2, 5)))) if compare_version_numbers(libsemigroups_version(), "1.0.8"): self.assertEqual( S.current_position(Transformation([2, 0, 3, 4, 1])), 18446744073709551615, ) self.assertEqual(S.at(10), Transformation([2, 0, 3, 4, 1])) with self.assertRaises(Exception): S.at(120) with self.assertRaises(Exception): S[120] self.assertTrue(S.contains(Transformation([2, 0, 3, 4, 1]))) self.assertEqual(S.position(Transformation([2, 0, 3, 4, 1])), 10) self.assertEqual(S.sorted_position(Transformation([2, 0, 3, 4, 1])), 51) self.assertEqual(S.sorted_at(51), Transformation([2, 0, 3, 4, 1])) if compare_version_numbers(libsemigroups_version(), "1.0.8"): self.assertEqual( S.current_position(Transformation([2, 0, 3, 4, 1])), 15)
def test_factorisation_and_relations(self): ReportGuard(False) S = FroidurePin(Transformation(list(range(1, 10)) + [0])) self.assertEqual(S.length_const(0), 1) with self.assertRaises(LibsemigroupsException): S.length_const(1) self.assertEqual(S.current_max_word_length(), 1) S.run() self.assertEqual(S.current_max_word_length(), 10) self.assertTrue(S.equal_to([0, 0], [0, 0])) self.assertFalse(S.equal_to([0], [0, 0])) self.assertFalse(S.equal_to([0] * 10, [0])) with self.assertRaises(LibsemigroupsException): self.assertFalse(S.equal_to([0] * 10, [1])) with self.assertRaises(LibsemigroupsException): self.assertFalse(S.equal_to([1], [0] * 10)) for i in range(S.size()): self.assertEqual(S.length_const(i), i + 1) self.assertEqual(S.length_non_const(i), i + 1) with self.assertRaises(LibsemigroupsException): S.length_non_const(10) self.assertEqual(S.letter_to_pos(0), 0) with self.assertRaises(LibsemigroupsException): S.letter_to_pos(1) S.add_generator(Transformation([1, 0] + list(range(2, 10)))) self.assertEqual(S.letter_to_pos(1), 10) S.add_generator(Transformation(list(range(1, 10)) + [0])) self.assertEqual(S.letter_to_pos(2), 0) self.assertEqual( [S.minimal_factorisation(x) for x in range(10)], [ [0], [0, 0], [0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1], ], ) with self.assertRaises(LibsemigroupsCppyyException): S.next_relation() S = FroidurePin(Transformation(list(range(1, 5)) + [0])) S.add_generator(Transformation([1, 0] + list(range(2, 5)))) self.assertEqual(S.current_nr_rules(), 0) self.assertEqual(S.word_to_pos([0, 1, 0, 1]), 18446744073709551615) self.assertEqual(S.nr_rules(), 25) self.assertEqual(S.word_to_element([0, 1, 0, 1]), Transformation([0, 3, 4, 1, 2])) self.assertEqual(S.word_to_pos([0, 1, 0, 1]), 15)