def subsets_embed_number(cseg1, cseg2): """Returns the number of time the normal form of a csubseg appears in cseg subsets. Marvin and Laprade (1987). >>> c1, c2 = Contour([0, 1, 2, 3]), Contour([1, 0, 2]) >>> subsets_embed_number(c1, c2) 0 """ cseg, csubseg = utils.greatest_first(cseg1, cseg2) dic = contour.Contour(cseg).subsets_normal(len(csubseg)) if tuple(csubseg) in dic: return len(dic[tuple(csubseg)]) else: return 0
def subsets_embed_total_number(cseg1, cseg2): """Returns the number of subsets with csubseg_size in a set with cseg_size. Marvin and Laprade (1987, p. 237). >>> c1, c2 = Contour([0, 1, 2, 3]), Contour([1, 0, 2]) >>> subsets_embed_total_number(c1, c2) 4 """ cseg, csubseg = utils.greatest_first(cseg1, cseg2) cseg_size = len(cseg) csubseg_size = len(csubseg) a = math.factorial(cseg_size) b = math.factorial(csubseg_size) c = math.factorial(cseg_size - csubseg_size) return a / (b * c)
def contour_embed(cseg1, cseg2): """Returns similarity between contours with different cardinalities. 1 for greater similarity. Marvin and Laprade (1987). >>> contour_embed(Contour([0, 1, 2, 3]), Contour([0, 1, 2])) 1.0 """ cseg, csubseg = utils.greatest_first(cseg1, cseg2) n_csubseg = contour.Contour(csubseg).translation() cseg_size = len(cseg) csubseg_size = len(csubseg) embed_times = subsets_embed_number(cseg, n_csubseg) total_subsets = subsets_embed_total_number(cseg, csubseg) return 1.0 * embed_times / total_subsets
def test_greatest_first(self): result = utils.greatest_first([0, 1], [3, 2, 1]) self.assertEqual(result, [[3, 2, 1], [0, 1]])