コード例 #1
0
 def test_depth_more_than_nodes(self) -> None:
     # In this case, the graph has no way to satisfy the min_depth requirement.
     # The user, or the higher level wrapper should make sure given proper
     # parameters. Otherwise, we will create the following output.
     solving_context = ClingoContext(number_of_nodes=3, min_depth=5)
     with self.assertRaises(expected_exception=RuntimeError,
                            msg="Received unreasonable parameters."):
         agentGenerator.generate_logic_rules(solving_context)
コード例 #2
0
 def test_depth_less_than_nodes(self) -> None:
     solving_context = ClingoContext(number_of_nodes=12, min_depth=3)
     exp = [
         'internal_symbols("S0", 0;"S1", 1;"S2", 2;"S3", 3;"S4", 4;"S5", 5;"S6",'
         ' 6;"S7", 7;"S8", 8;"S9", 9;"S10", 10;"S11", 11).',
         'extends_to("S0", "S4").',
         'extends_to("S4", "S8").',
     ]
     self.assertListEqual(
         exp, agentGenerator.generate_logic_rules(solving_context))
コード例 #3
0
 def test_degree_distribution(self) -> None:
     solving_context = ClingoContext(number_of_nodes=12,
                                     degree_distribution=[1, 3, 5])
     exp = [
         'internal_symbols("S0", 0;"S1", 1;"S2", 2;"S3", 3;"S4", 4;"S5", 5;"S6",'
         ' 6;"S7", 7;"S8", 8;"S9", 9;"S10", 10;"S11", 11).',
         ":- #count{X : in_degree(X, 0)} < 1.",
         ":- #count{X : in_degree(X, 1)} < 3.",
         ":- #count{X : in_degree(X, 2)} < 5.",
     ]
     self.assertListEqual(
         exp, agentGenerator.generate_logic_rules(solving_context))
コード例 #4
0
 def test_depth_equals_to_nodes(self) -> None:
     solving_context = ClingoContext(number_of_nodes=7, min_depth=7)
     exp = [
         'internal_symbols("S0", 0;"S1", 1;"S2", 2;"S3", 3;"S4", 4;"S5",'
         ' 5;"S6", 6).',
         'extends_to("S0", "S1").',
         'extends_to("S1", "S2").',
         'extends_to("S2", "S3").',
         'extends_to("S3", "S4").',
         'extends_to("S4", "S5").',
         'extends_to("S5", "S6").',
     ]
     self.assertListEqual(
         exp, agentGenerator.generate_logic_rules(solving_context))
コード例 #5
0
    def test_unsatisfiable_parameters(self) -> None:
        # Given 5 nodes, but asking for 3 classes + 4 interfaces with
        solving_context = ClingoContext(number_of_nodes=5,
                                        min_classes=3,
                                        min_interfaces=4)
        hack_codegen = hackGenerator.HackCodeGenerator(solving_context)

        with self.assertRaises(expected_exception=RuntimeError,
                               msg="Unsatisfiable."):
            agentGenerator.do_reasoning(
                additional_programs=agentGenerator.generate_logic_rules(
                    solving_context),
                generator=hack_codegen,
            )
コード例 #6
0
    def test_hack_code_gen_with_partial_dependency_graph_given_by_user(
            self) -> None:
        solving_context = ClingoContext(
            number_of_nodes=12,
            min_depth=3,
            min_classes=3,
            min_interfaces=4,
            lower_bound=1,
            higher_bound=5,
        )
        deps = """\
Extends A -> Type B
Extends I -> Type B
Extends T -> Type A
Type A -> Type B
Type I -> Type B
Type T -> Type A, Type B"""
        exp = """\
<?hh
class S9   {}
class S10   {}
class S11   {}
interface A extends T {}
interface B extends A,I {}
interface I  {}
interface T  {}
interface S0  {}
interface S1  {}
interface S2  {}
interface S3  {}
interface S4 extends S0 {}
interface S5  {}
interface S6  {}
interface S7  {}
interface S8 extends S4 {}
"""

        hack_codegen = hackGenerator.HackCodeGenerator(solving_context)
        combined_rules = agentGenerator.generate_logic_rules(
            solving_context) + agentGenerator.extract_logic_rules(
                deps.split("\n"))
        agentGenerator.do_reasoning(additional_programs=combined_rules,
                                    generator=hack_codegen)
        self.assertEqual(str(hack_codegen), exp)
コード例 #7
0
    def test_hack_code_gen(self) -> None:
        solving_context = ClingoContext(
            number_of_nodes=12,
            min_depth=3,
            min_classes=3,
            min_interfaces=4,
            lower_bound=1,
            higher_bound=5,
            min_stub_classes=4,
            min_stub_interfaces=1,
            degree_distribution=[1, 3, 5],
        )

        hack_codegen = hackGenerator.HackCodeGenerator(solving_context)
        agentGenerator.do_reasoning(
            additional_programs=agentGenerator.generate_logic_rules(
                solving_context),
            generator=hack_codegen,
        )
        self.assertTrue(hack_codegen.validate())
コード例 #8
0
 def test_sum_of_degrees_greater_than_nodes(self) -> None:
     solving_context = ClingoContext(number_of_nodes=12,
                                     degree_distribution=[3, 5, 7])
     with self.assertRaises(expected_exception=RuntimeError,
                            msg="Received unreasonable parameters."):
         agentGenerator.generate_logic_rules(solving_context)