Example #1
0
    def test_get_slot_values_same_slot_name(self):
        t1 = Template([self.a, self.slot_x, self.a, self.slot_y, self.a, self.slot_x])
        t2 = Template([self.a, self.b, self.a, self.b, self.a, self.c])

        self.assertEqual(
            {self.slot_x: {self.bt, self.ct}, self.slot_y: {self.bt}},
            t1.get_slot_values([t2]),
        )
Example #2
0
    def test_merge_relative_overlap_values_three_variables_2(self):
        contents = _create_contents(10)
        slot_values = SlotValues({
            self.a: set(contents[1:5]),
            self.b: set(contents[0:2]),
            self.c: set(contents[2:6]),
        })

        # It should not merge if the relative similarity threshold is > 0.2
        merged_none = slot_values.merge_slots()
        self.assertEqual(slot_values, merged_none)

        merged_1 = slot_values.merge_slots(relative_similarity_threshold=1)
        self.assertEqual(slot_values, merged_1)

        merged_061 = slot_values.merge_slots(
            relative_similarity_threshold=0.61)
        self.assertEqual(slot_values, merged_061)

        expected_first_merged = SlotValues({
            self.a: set(contents[1:6]),
            self.b: set(contents[0:2]),
            self.c: {Template([self.a])},
        })

        merged_06 = slot_values.merge_slots(relative_similarity_threshold=0.6)
        self.assertEqual(
            expected_first_merged,
            merged_06,
        )

        merged_021 = slot_values.merge_slots(
            relative_similarity_threshold=0.21)
        self.assertEqual(
            expected_first_merged,
            merged_021,
        )

        expected_full_merged = SlotValues({
            self.a: set(contents[0:6]),
            self.b: {Template([self.a])},
            self.c: {Template([self.a])},
        })
        merged_02 = slot_values.merge_slots(relative_similarity_threshold=0.2)
        self.assertEqual(
            expected_full_merged,
            merged_02,
        )
        merged_01 = slot_values.merge_slots(relative_similarity_threshold=0.1)
        self.assertEqual(
            expected_full_merged,
            merged_01,
        )
Example #3
0
    def test_get_slot_values(self):
        t1 = Template(
            [self.a, self.slot_x, self.a, self.slot_y, self.a, self.slot_z])
        t2 = Template([self.a, self.b, self.a, self.b, self.a, self.b])
        t3 = Template([self.a, self.c, self.a, self.b, self.a, self.c])
        tc = Template([self.a, self.c, self.a, self.c, self.a, self.c])
        ta = Template([self.a, self.a, self.a, self.a, self.a, self.a])

        self.assertEqual(
            {
                self.slot_x: {self.bt},
                self.slot_y: {self.bt},
                self.slot_z: {self.bt}
            },
            t1.get_slot_values([t2]),
        )

        self.assertEqual(
            {
                self.slot_x: {self.bt, self.ct},
                self.slot_y: {self.bt},
                self.slot_z: {self.bt, self.ct},
            },
            t1.get_slot_values([t2, t3]),
        )
        self.assertEqual(
            {
                self.slot_x: {self.bt, self.ct},
                self.slot_y: {self.bt, self.ct},
                self.slot_z: {self.bt, self.ct},
            },
            t1.get_slot_values([t2, t3, tc]),
        )
        self.assertEqual(
            {
                self.slot_x: {self.at, self.bt, self.ct},
                self.slot_y: {self.at, self.bt, self.ct},
                self.slot_z: {self.at, self.bt, self.ct},
            },
            t1.get_slot_values([t2, t3, tc, ta]),
        )
        self.assertEqual(
            {
                self.slot_x: {self.at, self.ct},
                self.slot_y: {self.at, self.ct},
                self.slot_z: {self.at, self.ct},
            },
            t1.get_slot_values([tc, ta]),
        )
Example #4
0
    def setUp(self) -> None:
        random.seed(123)

        self.a = TemplateString("a")
        self.b = TemplateString("b")
        self.c = TemplateString("c")
        self.slot1 = TemplateSlot()
        self.slot2 = TemplateSlot()
        self.slot_x = NamedTemplateSlot("x")
        self.slot_y = NamedTemplateSlot("y")
        self.slot_z = NamedTemplateSlot("z")

        self.at = Template([self.a])
        self.bt = Template([self.b])
        self.ct = Template([self.c])
Example #5
0
    def test_merge_relative_overlap_values(self):
        contents = _create_contents(10)
        slot_values = SlotValues({
            self.a: set(contents),
            self.b: _shuffled_subset(contents, 0, 2),
        })

        # It should not merge if the relative similarity threshold is > 0.2
        merged_none = slot_values.merge_slots()
        self.assertEqual(slot_values, merged_none)

        merged_1 = slot_values.merge_slots(relative_similarity_threshold=1)
        self.assertEqual(slot_values, merged_1)

        merged_09 = slot_values.merge_slots(relative_similarity_threshold=0.9)
        self.assertEqual(slot_values, merged_09)

        merged_05 = slot_values.merge_slots(relative_similarity_threshold=0.5)
        self.assertEqual(slot_values, merged_05)

        # B should merge into A if the threshold is <= 0.2
        expected_merged = SlotValues({
            self.a: set(contents),
            self.b: {Template([self.a])}
        })

        merged_02 = slot_values.merge_slots(relative_similarity_threshold=0.2)
        self.assertEqual(expected_merged, merged_02)

        merged_01 = slot_values.merge_slots(relative_similarity_threshold=0.1)
        self.assertEqual(expected_merged, merged_01)
Example #6
0
def _contains_slot_as_template(vals: Collection["Template"],
                               slot: TemplateSlot) -> bool:
    """
    Checks if the template elements contain the given slot as a single template element
    """
    slot_as_template = Template((slot, ))
    return slot_as_template in vals
Example #7
0
    def test_merge_containing_slot(self):
        slot_values = SlotValues({
            self.a: {Template([self.b]), self.e1, self.e2, self.e3},
            self.b: self.e123,
            self.c: self.e456,
        })

        merged = slot_values.merge_slots()

        self.assertEqual(hashabledict({self.a: self.b}),
                         merged.get_replacements())
        self.assertEqual(
            SlotValues({
                self.a: {Template([self.b])},
                self.b: self.e123,
                self.c: self.e456
            }),
            merged,
        )
 def test_from_string(self):
     input_dict = {"A": ["<B>, world", "hi"], "B": ["hello"]}
     expected_output = ContextFreeGrammar(
         {
             NamedTemplateSlot("A"): [
                 Template(
                     [
                         NamedTemplateSlot("B"),
                         TemplateString(","),
                         TemplateString("world"),
                     ]
                 ),
                 Template([TemplateString("hi")]),
             ],
             NamedTemplateSlot("B"): [Template([TemplateString("hello")])],
         }
     )
     output = ContextFreeGrammar.from_string(input_dict)
     self.assertEqual(expected_output, output)
Example #9
0
    def test_merge_all(self):
        t1 = Template([self.slot_x, self.a, self.b])
        t2 = Template([self.slot_x, self.a, self.slot_y])
        t3 = Template([self.slot_x, self.c])

        t12 = Template([self.slot_x, self.a, self.slot1])
        self.assertEqual(t12, Template.merge_all([t1, t2]))
        self.assertEqual(t12, Template.merge_all([t1, t2, t12]))

        t123 = Template([self.slot_x, self.slot1])
        self.assertEqual(t123, Template.merge_all([t12, t3]))
        self.assertEqual(t123, Template.merge_all([t12, t3, t123]))
        self.assertEqual(t123, Template.merge_all([t3, t12]))
        self.assertEqual(t123, Template.merge_all([t3, t12, t123]))

        self.assertEqual(t123, Template.merge_all([t1, t2, t3]))
        self.assertEqual(t123, Template.merge_all([t1, t2, t3, t123]))
        self.assertEqual(t123, Template.merge_all([t3, t2, t1]))
        self.assertEqual(t123, Template.merge_all([t3, t2, t1, t123]))
Example #10
0
    def test_get_slot_content_mappings(self):
        self.assertEqual(set(), self.s1.get_slot_content_mappings())

        slot1 = NamedTemplateSlot("x")
        slot2 = NamedTemplateSlot("y")
        a = TemplateString("a")
        b = TemplateString("b")
        c = TemplateString("c")

        # Simple tree
        simple_tree = TemplateTree(
            Template([a, slot1]), [TemplateTree(Template([a, b]), [])]
        )
        simple_slot_contents = simple_tree.get_slot_content_mappings()

        self.assertEqual(1, len(simple_slot_contents))
        simple_slot_content = list(simple_slot_contents)[0]
        self.assertTrue(slot1 in simple_slot_content)
        self.assertTrue(slot1 in simple_slot_content.keys())
        self.assertEqual(Template([b]), simple_slot_content[slot1])

        self.assertEqual({SlotAssignment({slot1: Template([b])})}, simple_slot_contents)

        # Two slot tree
        two_slot_tree = TemplateTree(
            Template([slot1, b, slot2]), [TemplateTree(Template([a, b, c]), [])]
        )
        two_slot_tree_contents = two_slot_tree.get_slot_content_mappings()
        self.assertEqual(
            {SlotAssignment({slot1: Template([a]), slot2: Template([c])})},
            two_slot_tree_contents,
        )

        # Test tree
        u1_slot = self.u1.get_template().get_slots()[0]
        self.assertEqual(
            {
                SlotAssignment({u1_slot: Template([TemplateString("c")])}),
                SlotAssignment({u1_slot: Template([TemplateString("e")])}),
            },
            self.u1.get_slot_content_mappings(),
        )
Example #11
0
 def test_get_all_slot_assignments(self):
     slot_values = SlotValues({
         self.a: {Template([self.c]), self.e1},
         self.c: self.e12
     })
     self.assertEqual(
         {
             SlotAssignment({self.c: self.e1}),
             SlotAssignment({self.c: self.e2})
         },
         set(slot_values.get_all_possible_assignments([self.c])),
     )
Example #12
0
    def test_named_slots(self):

        self.assertEqual(
            Template([self.slot_x]),
            Template([self.slot1
                      ]).name_template_slots({self.slot1: self.slot_x}),
        )
        self.assertEqual(
            Template([self.slot_x, self.a, self.slot_y]),
            Template([self.slot1, self.a, self.slot2]).name_template_slots({
                self.slot1:
                self.slot_x,
                self.slot2:
                self.slot_y
            }),
        )
        self.assertEqual(
            Template([self.slot_x, self.a, self.slot_x]),
            Template([self.slot1, self.a, self.slot2]).name_template_slots({
                self.slot1:
                self.slot_x,
                self.slot2:
                self.slot_x
            }),
        )
Example #13
0
    def test_merge_relative_overlap_values_three_variables_1(self):
        contents = _create_contents(10)
        slot_values = SlotValues({
            self.a: set(contents),
            self.b: set(contents[0:2]),
            self.c: set(contents[5:8]),
        })

        # It should not merge if the relative similarity threshold is > 0.2
        merged_none = slot_values.merge_slots()
        self.assertEqual(slot_values, merged_none)

        merged_1 = slot_values.merge_slots(relative_similarity_threshold=1)
        self.assertEqual(slot_values, merged_1)

        merged_05 = slot_values.merge_slots(relative_similarity_threshold=0.5)
        self.assertEqual(slot_values, merged_05)

        merged_03 = slot_values.merge_slots(relative_similarity_threshold=0.3)
        self.assertEqual(
            SlotValues({
                self.a: set(contents),
                self.b: set(contents[0:2]),
                self.c: {Template([self.a])},
            }),
            merged_03,
        )

        # B should merge into A if the threshold is <= 0.2
        full_merge = SlotValues({
            self.a: set(contents),
            self.b: {Template([self.a])},
            self.c: {Template([self.a])},
        })

        merged_02 = slot_values.merge_slots(relative_similarity_threshold=0.2)
        self.assertEqual(full_merge, merged_02)

        merged_01 = slot_values.merge_slots(relative_similarity_threshold=0.1)
        self.assertEqual(full_merge, merged_01)
Example #14
0
    def test_merge_containing_multiple_slots_complely(self):
        slot_values = SlotValues({
            self.a: {Template([self.b]),
                     Template([self.c]), self.e1, self.e2},
            self.b: self.e123,
            self.c: self.e123,
        })

        merged = slot_values.merge_slots()

        self.assertEqual(hashabledict({
            self.a: self.b,
            self.c: self.b
        }), merged.get_replacements())
        self.assertEqual(
            SlotValues({
                self.a: {Template([self.b])},
                self.b: self.e123,
                self.c: {Template([self.b])},
            }),
            merged,
        )
Example #15
0
    def test_merge_small_overlap(self):
        slot_values = SlotValues({self.a: self.e12, self.b: self.e23})

        merged = slot_values.merge_slots(relative_similarity_threshold=0.3)

        self.assertEqual(hashabledict({self.b: self.a}),
                         merged.get_replacements())
        self.assertEqual(
            SlotValues({
                self.a: self.e123,
                self.b: {Template([self.a])}
            }),
            merged,
        )
Example #16
0
    def test_named_slot_parsing(self):
        original_string = "a <A> c d <B>"
        template = Template.from_string(original_string)

        self.assertEqual(
            Template([
                TemplateString("a"),
                NamedTemplateSlot("A"),
                TemplateString("c"),
                TemplateString("d"),
                NamedTemplateSlot("B"),
            ]),
            template,
        )
Example #17
0
    def test_merge_superlarge(self):
        nb_template_elements = 1000
        slot_values, contents = _create_large_slotvalues(
            nb_template_elements=nb_template_elements,
            nb_slots=5000,
            max_elements_per_slot=20,
        )
        merged = slot_values.merge_slots(relative_similarity_threshold=0.001)
        # print(merged)

        first_slot = list(merged.keys())[0]
        self.assertEqual(set(contents), merged[first_slot])
        for slot in merged:
            if slot is not first_slot:
                self.assertEqual({Template([first_slot])}, merged[slot])
Example #18
0
    def test_merge_basic(self):
        slot_values = SlotValues({
            self.a: self.e123,
            self.b: self.e123,
            self.c: self.e456
        })

        merged = slot_values.merge_slots()

        self.assertEqual(hashabledict({self.b: self.a}),
                         merged.get_replacements())
        self.assertEqual(
            SlotValues({
                self.a: self.e123,
                self.b: {Template([self.a])},
                self.c: self.e456
            }),
            merged,
        )
Example #19
0
def _remove_single_element_slot_templates(slot_values):
    """ Removes slots that only occurs once, and in a template only containing this slot.
     Example: D -> <E> | "hello" and E -> "hi" | "bonjour" becomes D -> "hello" | "hi" | "bonjour" and marking E as replaced
     """
    single_slot_occurrences: Dict[
        TemplateSlot, Set[TemplateSlot]] = defaultdict(lambda: set())
    for i, i_slot in enumerate(slot_values.get_unreplaced_slots()):
        i_single_slot_values = {
            template.get_elements()[0]
            for template in slot_values[i_slot]
            if template.get_number_of_elements() == 1
            and template.get_elements()[0].is_slot()
        }

        # Register that this slot occurs as a single-element-slot-template for slot i
        for single_slot in i_single_slot_values:
            single_slot_occurrences[single_slot].add(i_slot)

    # Now check which ones occur only once, and replace them
    for redundant_slot, slots_mapping_to_slot in single_slot_occurrences.items(
    ):
        if len(slots_mapping_to_slot) == 1:
            redudant_slot_as_template = Template([redundant_slot])
            redudant_slot_values = slot_values[redundant_slot]

            containing_slot = next(iter(slots_mapping_to_slot))

            i_vals = slot_values[containing_slot]
            new_i_vals = {
                val
                for val in i_vals if val != redudant_slot_as_template
            }.union(redudant_slot_values)
            slot_values[containing_slot] = new_i_vals

            # Mark as updated & replaced
            # updated.add(containing_slot)
            slot_values.add_replacement(redundant_slot, containing_slot)
Example #20
0
    def setUp(self) -> None:
        random.seed(123)

        self.a = NamedTemplateSlot("A")
        self.b = NamedTemplateSlot("B")
        self.c = NamedTemplateSlot("C")
        self.d = NamedTemplateSlot("D")

        self.e1 = Template([TemplateString("hello")])
        self.e2 = Template([TemplateString("hi")])
        self.e3 = Template([TemplateString("hey")])
        self.e12 = {self.e1, self.e2}
        self.e23 = {self.e2, self.e3}
        self.e123 = {self.e1, self.e2, self.e3}

        self.e4 = Template([TemplateString("world")])
        self.e5 = Template([TemplateString("earth")])
        self.e6 = Template([TemplateString("everyone")])
        self.e456 = {self.e4, self.e5, self.e6}
Example #21
0
    def test_collapse_using_slot_values(self):
        hello = TemplateString("hello")
        hey = TemplateString("hey")
        hi = TemplateString("hi")

        h1 = TemplateTree(Template([hello, hello]))
        h2 = TemplateTree(Template([hey, hello]))
        h3 = TemplateTree(Template([hello, hi]))
        h4 = TemplateTree(Template([hi, hello]))
        h5 = TemplateTree(Template([hi, hi]))

        hello_t = Template([hello])
        hey_t = Template([hey])
        hi_t = Template([hi])

        slot_a = NamedTemplateSlot("A")
        slot_b = NamedTemplateSlot("B")
        slot_c = NamedTemplateSlot("C")
        slot_d = NamedTemplateSlot("D")
        slot_e = NamedTemplateSlot("E")
        slot_f = NamedTemplateSlot("F")

        t1 = TemplateTree(Template([hello, slot_a]), [h1, h3])
        t2 = TemplateTree(Template([slot_b, hello]), [h1, h2, h4])
        t3 = TemplateTree(Template([slot_c, hi]), [h3, h5])
        t4 = TemplateTree(Template([hi, slot_d]), [h4, h5])
        t5 = TemplateTree(Template([slot_e, slot_f]), [t1, t2, t3, t4])

        slot_values = SlotValues(
            {
                slot_a: {Template([slot_e])},
                slot_b: {Template([slot_e])},
                slot_c: {Template([slot_e])},
                slot_d: {Template([slot_e])},
                slot_e: {hello_t, hi_t, hey_t},
                slot_f: {Template([slot_e])},
            }
        )

        self.assertEqual(
            slot_values,
            t5.get_slot_values().merge_slots(relative_similarity_threshold=0.01),
        )
        renamed_tree = t5.name_template_slots(
            {
                slot_a: slot_e,
                slot_b: slot_e,
                slot_c: slot_e,
                slot_d: slot_e,
                slot_f: slot_e,
            }
        )
        collapsed_tree = renamed_tree.collapse_using_slot_values(slot_values)
        self.assertEqual(Template([slot_e, slot_e]), collapsed_tree.get_template())
        self.assertEqual(
            {tt.get_template() for tt in [h1, h2, h3, h4, h5]},
            {tt.get_template() for tt in collapsed_tree.get_children()},
        )
Example #22
0
    def test_merge_large(self):
        contents = _create_contents(100)
        slot_values = SlotValues({
            NamedTemplateSlot("a"): set(contents[0:2]),
            NamedTemplateSlot("b"): set(contents[2:4]),
            NamedTemplateSlot("c"): set(contents[4:6]),
            NamedTemplateSlot("d"): set(contents[6:8]),
            NamedTemplateSlot("e"): set(contents[8:10]),
            NamedTemplateSlot("f"): set(contents[10:12]),
            NamedTemplateSlot("g"): set(contents[12:14]),
            NamedTemplateSlot("h"): set(contents[14:16]),
            NamedTemplateSlot("i"): set(contents[16:18]),
            NamedTemplateSlot("j"): set(contents[18:20]),
            NamedTemplateSlot("k"): set(contents[20:22]),
            NamedTemplateSlot("l"): set(contents[22:24]),
            NamedTemplateSlot("m"): set(contents[24:26]),
            NamedTemplateSlot("n"): set(contents[26:28]),
            NamedTemplateSlot("o"): set(contents[28:30]),
            NamedTemplateSlot("p"): set(contents[30:32]),
            NamedTemplateSlot("q"): set(contents[32:34]),
            NamedTemplateSlot("r"): set(contents[34:36]),
            NamedTemplateSlot("s"): set(contents[36:38]),
            NamedTemplateSlot("t"): set(contents[38:40]),
            NamedTemplateSlot("u"): set(contents[40:42]),
            NamedTemplateSlot("v"): set(contents[42:44]),
            NamedTemplateSlot("w"): set(contents[44:46]),
            NamedTemplateSlot("x"): set(contents[46:48]),
            NamedTemplateSlot("y"): set(contents[48:50]),
            NamedTemplateSlot("z"): set(contents[50:52]),
        })
        self.assertEqual(slot_values, slot_values.merge_slots())
        self.assertEqual(slot_values, slot_values.merge_slots(0.1))
        self.assertEqual(slot_values, slot_values.merge_slots(0.001))

        # Now add something that overlaps
        extra_slot_1 = NamedTemplateSlot("zzz-extra")
        slot_values[extra_slot_1] = set(contents[0:9])
        self.assertEqual(slot_values, slot_values.merge_slots())

        merged_011 = slot_values.merge_slots(0.112)
        self.assertEqual(set(contents[0:9]),
                         merged_011[NamedTemplateSlot("a")])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged_011[NamedTemplateSlot("b")])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged_011[NamedTemplateSlot("c")])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged_011[NamedTemplateSlot("d")])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged_011[extra_slot_1])
        self.assertEqual(
            set(contents[8:10]),
            merged_011[NamedTemplateSlot("e")],
        )

        merged_01 = slot_values.merge_slots(0.1)
        self.assertEqual(set(contents[0:10]),
                         merged_01[NamedTemplateSlot("a")])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged_01[NamedTemplateSlot("d")])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged_011[extra_slot_1])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged_01[NamedTemplateSlot("e")])

        extra_slot_2 = NamedTemplateSlot("zzz-extra-2")
        slot_values[extra_slot_2] = set(contents[11:52])
        self.assertEqual(slot_values, slot_values.merge_slots())

        merged2_005 = slot_values.merge_slots(0.05)
        self.assertEqual(set(contents[0:10]),
                         merged2_005[NamedTemplateSlot("a")])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged2_005[NamedTemplateSlot("d")])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged2_005[extra_slot_1])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged2_005[NamedTemplateSlot("e")])
        self.assertEqual(set(contents[11:52]), merged2_005[extra_slot_2])
        self.assertEqual(set(contents[10:12]),
                         merged2_005[NamedTemplateSlot("f")])
        self.assertEqual(set(contents[14:16]),
                         merged2_005[NamedTemplateSlot("h")])

        merged2_0023 = slot_values.merge_slots(0.023)
        self.assertEqual(set(contents[0:10]),
                         merged2_0023[NamedTemplateSlot("a")])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged2_0023[NamedTemplateSlot("d")])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged2_0023[extra_slot_1])
        self.assertEqual({Template([NamedTemplateSlot("a")])},
                         merged2_0023[NamedTemplateSlot("e")])
        self.assertEqual(set(contents[10:52]),
                         merged2_0023[NamedTemplateSlot("f")])
        self.assertEqual({Template([NamedTemplateSlot("f")])},
                         merged2_0023[NamedTemplateSlot("g")])
        self.assertEqual({Template([NamedTemplateSlot("f")])},
                         merged2_0023[NamedTemplateSlot("h")])
        self.assertEqual({Template([NamedTemplateSlot("f")])},
                         merged2_0023[extra_slot_2])

        extra_slot_3 = NamedTemplateSlot("zzz-extra-3")
        slot_values[extra_slot_3] = set(contents[9:11])
        self.assertEqual(slot_values, slot_values.merge_slots())
        a = {Template([NamedTemplateSlot("a")])}
        self.assertEqual(
            SlotValues({
                NamedTemplateSlot("a"): set(contents[0:52]),
                NamedTemplateSlot("b"): a,
                NamedTemplateSlot("c"): a,
                NamedTemplateSlot("d"): a,
                NamedTemplateSlot("e"): a,
                NamedTemplateSlot("f"): a,
                NamedTemplateSlot("g"): a,
                NamedTemplateSlot("h"): a,
                NamedTemplateSlot("i"): a,
                NamedTemplateSlot("j"): a,
                NamedTemplateSlot("k"): a,
                NamedTemplateSlot("l"): a,
                NamedTemplateSlot("m"): a,
                NamedTemplateSlot("n"): a,
                NamedTemplateSlot("o"): a,
                NamedTemplateSlot("p"): a,
                NamedTemplateSlot("q"): a,
                NamedTemplateSlot("r"): a,
                NamedTemplateSlot("s"): a,
                NamedTemplateSlot("t"): a,
                NamedTemplateSlot("u"): a,
                NamedTemplateSlot("v"): a,
                NamedTemplateSlot("w"): a,
                NamedTemplateSlot("x"): a,
                NamedTemplateSlot("y"): a,
                NamedTemplateSlot("z"): a,
                extra_slot_1: a,
                extra_slot_2: a,
                extra_slot_3: a,
            }),
            slot_values.merge_slots(0.01),
        )
Example #23
0
 def add_replacement(self, slot_from: TemplateSlot,
                     slot_to: TemplateElement):
     self._replacements[slot_from] = slot_to
     self[slot_from] = {Template([slot_to])}
Example #24
0
    Dict,
    Collection,
    KeysView,
    ValuesView,
    Union,
    Iterable,
    Tuple,
)

from sortedcontainers import SortedSet

from gitta.hashabledict import hashabledict
from gitta.template_elements import TemplateSlot, SlotAssignment, TemplateElement
from gitta.template import Template

empty_string_template = Template([])


def has_similar_content(
    values_set_1: Set["Template"],
    values_set_2: Set["Template"],
    relative_similarity_threshold,
):

    if relative_similarity_threshold == 1:
        return values_set_1 == values_set_2

    # If both values sets contain the empty string, don't count in overlap!
    (
        both_contain_empty,
        any_contain_empty,
Example #25
0
def _create_contents(max_number: int) -> List[Template]:
    return [Template([TemplateString(str(i))]) for i in range(max_number)]
Example #26
0
    def test_collapse_using_slot_values(self):
        hello = TemplateString("hello")
        hey = TemplateString("hey")
        world = TemplateString("world")
        universe = TemplateString("universe")

        h1 = TemplateTree(Template([hello, world]))
        h2 = TemplateTree(Template([hey, world]))
        h3 = TemplateTree(Template([hello, universe]))
        h4 = TemplateTree(Template([hey, universe]))

        slot_a = NamedTemplateSlot("A")
        slot_b = NamedTemplateSlot("B")
        slot_c = NamedTemplateSlot("C")

        expected = TemplateTree(Template([slot_a, slot_b]), [h1, h2, h3, h4])
        expected_values = SlotValues(
            {
                slot_a: {Template([hello]), Template([hey])},
                slot_b: {Template([world]), Template([universe])},
            }
        )

        # Test first argument
        hello_t = Template([hello, slot_b])
        hello_tt = TemplateTree(hello_t, [h1, h3])
        hey_t = Template([hey, slot_b])
        hey_tt = TemplateTree(hey_t, [h2, h4])
        greeting_t = Template([slot_a, slot_b])
        greeting_tt = TemplateTree(greeting_t, [hello_tt, hey_tt])

        self.assertTrue(greeting_t.encompasses(hey_t, expected_values))
        self.assertTrue(greeting_t.encompasses(hello_t, expected_values))
        self.assertFalse(hello_t.encompasses(greeting_t, expected_values))

        self.assertEqual(
            expected_values, greeting_tt.calculated_merged_independent_slot_values()
        )

        self.assertEqual(
            expected, greeting_tt.collapse_using_slot_values(expected_values)
        )

        # Do same, but for second argument
        world_t = Template([slot_a, world])
        world_tt = TemplateTree(world_t, [h1, h2])
        universe_t = Template([slot_a, universe])
        universe_tt = TemplateTree(universe_t, [h3, h4])
        place_t = Template([slot_a, slot_b])
        place_tt = TemplateTree(place_t, [world_tt, universe_tt])

        self.assertEqual(
            expected_values, place_tt.calculated_merged_independent_slot_values()
        )

        self.assertEqual(expected, place_tt.collapse_using_slot_values(expected_values))

        # Test mix
        mix_tt = TemplateTree(place_t, [world_tt, hey_tt, h3])

        self.assertEqual(
            expected_values, mix_tt.calculated_merged_independent_slot_values()
        )

        self.assertEqual(expected, mix_tt.collapse_using_slot_values(expected_values))

        # Now with some noise
        noise = Template([TemplateString("noise")])
        noise_tt = TemplateTree(noise)

        noise_t = Template([slot_c])
        full_noise_tt = TemplateTree(noise_t, [greeting_tt, noise_tt])

        noise_values = SlotValues(
            {
                slot_a: {Template([hello]), Template([hey])},
                slot_b: {Template([world]), Template([universe])},
                slot_c: {Template([slot_a, slot_b]), noise},
            }
        )

        collapsed_full_noise = full_noise_tt.collapse_using_slot_values(noise_values)

        self.assertEqual(
            noise_values, full_noise_tt.calculated_merged_independent_slot_values(),
        )
        self.assertEqual(
            TemplateTree(Template([slot_c]), [expected, noise_tt]),
            collapsed_full_noise,
        )
Example #27
0
    def test_fill(self):
        a = self.a
        b = self.b
        c = self.c
        slot1 = self.slot1
        slot2 = self.slot2

        self.assertEqual(
            Template.from_string("b"),
            Template([slot1]).fill(SlotAssignment({slot1: Template([b])})),
        )
        self.assertEqual(
            Template.from_string("a b"),
            Template([a, slot1]).fill(SlotAssignment({slot1: Template([b])})),
        )
        self.assertEqual(
            Template.from_string("a b c"),
            Template([a, slot1, c]).fill(SlotAssignment({slot1:
                                                         Template([b])})),
        )
        self.assertEqual(
            Template.from_string("a b c a"),
            Template([a, slot1, c, slot2]).fill(
                SlotAssignment({
                    slot1: Template([b]),
                    slot2: Template([a])
                })),
        )
        self.assertEqual(
            Template.from_string("a b a c"),
            Template([a, slot1, slot2, c]).fill(
                SlotAssignment({
                    slot1: Template([b]),
                    slot2: Template([a])
                })),
        )
        self.assertEqual(
            Template.from_string("a b a c"),
            Template([a, slot1, slot2, c]).fill(
                SlotAssignment({
                    slot2: Template([a]),
                    slot1: Template([b])
                })),
        )
        self.assertEqual(
            Template.from_string("a b a c"),
            Template([a, slot1, slot2, c]).fill_with_strings(["b", "a"]),
        )
Example #28
0
    def test_encompasses(self):
        template_1 = Template([self.slot_x, self.a, self.slot_y])
        template_2 = Template([self.slot_x, self.a, self.b])
        template_3 = Template([self.c, self.a, self.b])
        template_4 = Template([self.slot_z, self.a, self.b])

        self.assertTrue(
            template_1.encompasses(
                template_1,
                SlotValues({
                    self.slot_x: [Template([self.slot_x])],
                    self.slot_y: [Template([self.slot_y])],
                }),
            ))
        self.assertTrue(
            template_1.encompasses(
                template_2,
                SlotValues({
                    self.slot_x: [Template([self.slot_x])],
                    self.slot_y: [Template([self.b])],
                }),
            ))
        self.assertTrue(
            template_1.encompasses(
                template_3,
                SlotValues({
                    self.slot_x: [Template([self.c])],
                    self.slot_y: [Template([self.b])],
                }),
            ))
        self.assertTrue(
            template_1.encompasses(
                template_4,
                SlotValues({
                    self.slot_x: [Template([self.slot_z])],
                    self.slot_y: [Template([self.b])],
                }),
            ))
        self.assertFalse(
            template_1.encompasses(
                template_2,
                SlotValues({
                    self.slot_x: [Template([self.slot_x])],
                    self.slot_y: [Template([self.a])],
                }),
            ))