From ca5d4b8e608fcca743850d164feff0e4e2db6f02 Mon Sep 17 00:00:00 2001 From: kzh <1432245553@qq.com> Date: Fri, 29 Oct 2021 09:42:02 +0800 Subject: [PATCH 01/12] =?UTF-8?q?1.=E5=9C=A8=E4=BF=9D=E8=AF=81=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E6=80=A7=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B=EF=BC=8C?= =?UTF-8?q?=E4=BD=BF=E5=87=BD=E6=95=B0=E5=90=8D=E6=9B=B4=E5=85=B7=E5=8F=AF?= =?UTF-8?q?=E8=AF=BB=E6=80=A7=E3=80=82=E7=BB=9F=E4=B8=80=E6=9C=80=E9=95=BF?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E5=AD=90=E5=BA=8F=E5=88=97=E7=B3=BB=E5=88=97?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E4=B8=BAlcs=5Fsequence=5Fxx()=EF=BC=8C?= =?UTF-8?q?=E6=9C=80=E9=95=BF=E5=85=AC=E5=85=B1=E5=AD=90=E4=B8=B2=E7=B3=BB?= =?UTF-8?q?=E5=88=97=E5=87=BD=E6=95=B0=E4=B8=BAlcs=5Fstring=5Fxx()?= =?UTF-8?q?=E3=80=82=E5=90=8C=E6=97=B6=E4=BF=9D=E7=95=99=E5=8E=9F=E6=9C=89?= =?UTF-8?q?=E7=9A=84lcs=E5=92=8Clcs2=E7=9A=84=E6=8E=A5=E5=8F=A3=E3=80=82?= =?UTF-8?q?=202.=E5=8A=A0=E5=85=A5=E5=87=BD=E6=95=B0lcs=5Fsequence=5Fidx()?= =?UTF-8?q?=EF=BC=8Clcs=5Fstring=5Fidx()=E8=BF=94=E5=9B=9E=E5=AD=90?= =?UTF-8?q?=E4=B8=B2=E6=88=96=E5=AD=90=E5=BA=8F=E5=88=97=E7=9A=84=E4=B8=8B?= =?UTF-8?q?=E6=A0=87=EF=BC=8C=E5=8F=8D=E6=98=A0=E4=B8=A4=E6=AE=B5=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=E5=AF=B9=E9=BD=90=E5=85=B3=E7=B3=BB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.cpp | 144 ++++++++++++++++++++++++++++++-------------- tests/test_pylcs.py | 47 +++++++++++++-- 2 files changed, 142 insertions(+), 49 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a0f342e..3eeacec 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,7 +28,7 @@ vector utf8_split(const string &str){ // 最长公共子序列(不连续) -int lcs_length_(const string &str1, const string &str2) { +int lcs_sequence_length(const string &str1, const string &str2) { if (str1 == "" || str2 == "") return 0; vector s1 = utf8_split(str1); @@ -61,8 +61,51 @@ int lcs_length_(const string &str1, const string &str2) { } +vector lcs_sequence_idx(const string &str, const string &ref) { + vector s1 = utf8_split(str); + vector s2 = utf8_split(ref); + int m = s1.size(); + int n = s2.size(); + vector> dp(m + 1, vector(n + 1)); + vector> direct(m + 1, vector(n + 1)); + vector res(m, -1); + if (m == 0 || n == 0) + return res; + + int i, j; + for (i = 0; i <= m; i++) dp[i][0] = 0; + for (j = 0; j <= n; j++) dp[0][j] = 0; + for (i = 1; i <= m; i++) { + for (j = 1; j <= n; j++) { + if (s1[i - 1] == s2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1; + direct[i][j] = 'm'; // match + } else { + if (dp[i - 1][j] >= dp[i][j - 1]) { + dp[i][j] = dp[i - 1][j]; + direct[i][j] = 's'; // str+1 + } + else { + dp[i][j] = dp[i][j-1]; + direct[i][j] = 'r'; // ref+1 + } + } + } + } + for (i = m, j = n; i > 0 && j > 0; ){ + if (direct[i][j] == 'm') { + res[i-1] = j-1; + i--; j--; + } + else if (direct[i][j] == 's') i--; + else if (direct[i][j] == 'r') j--; + } + return res; +} + + // 最长公共子串(连续) -int lcs2_length_(const string &str1, const string &str2) { +int lcs_string_length(const string &str1, const string &str2) { if (str1 == "" || str2 == "") return 0; vector s1 = utf8_split(str1); @@ -96,34 +139,60 @@ int lcs2_length_(const string &str1, const string &str2) { } -// TODO 返回子序列 -int lcs(const string &str1, const string &str2){ - return lcs_length_(str1, str2); -} - +vector lcs_string_idx(const string &str, const string &ref) { + vector s1 = utf8_split(str); + vector s2 = utf8_split(ref); + int m = s1.size(); + int n = s2.size(); + vector> dp(m + 1, vector(n + 1)); + vector res(m, -1); + if (m == 0 || n == 0) + return res; -// TODO 返回子串 -int lcs2(const string &str1, const string &str2){ - return lcs2_length_(str1, str2); + int i, j; + int max_i = 0, max_j = 0; + for (i = 0; i <= m; i++) { + dp[i][0] = 0; + } + for (j = 0; j <= n; j++) { + dp[0][j] = 0; + } + for (i = 1; i <= m; i++) { + for (j = 1; j <= n; j++) { + if (s1[i - 1] == s2[j - 1]) { + dp[i][j] = dp[i - 1][j - 1] + 1; + if (dp[i][j] > dp[max_i][max_j]){ + max_i = i; max_j = j; + } + } + else { + dp[i][j] = 0; + } + } + } + for (i = 0; i < dp[max_i][max_j]; i++) { + res[max_i-i-1] = max_j-i-1; + } + return res; } -vector lcs_of_list(const string &str1, vector &str_list){ +vector lcs_sequence_of_list(const string &str1, vector &str_list){ int size = str_list.size(); vector ls(size); for (int i = 0; i < size; i++){ - int l = lcs(str1, str_list[i]); + int l = lcs_sequence_length(str1, str_list[i]); ls[i] = l; } return ls; } -vector lcs2_of_list(const string &str1, vector &str_list){ +vector lcs_string_of_list(const string &str1, vector &str_list){ int size = str_list.size(); vector ls(size); for (int i = 0; i < size; i++){ - int l = lcs2(str1, str_list[i]); + int l = lcs_string_length(str1, str_list[i]); ls[i] = l; } return ls; @@ -175,35 +244,20 @@ namespace py = pybind11; PYBIND11_MODULE(pylcs, m) { - m.def("lcs", &lcs, R"pbdoc( - Longest common subsequence - )pbdoc"); - - m.def("lcs_of_list", &lcs_of_list, R"pbdoc( - Longest common subsequence of list - )pbdoc"); - - m.def("lcs2", &lcs2, R"pbdoc( - Longest common substring - )pbdoc"); - - m.def("lcs2_of_list", &lcs2_of_list, R"pbdoc( - Longest common substring of list - )pbdoc"); - - m.def("levenshtein_distance", &levenshtein_distance, R"pbdoc( - Levenshtein Distance of Two Strings - )pbdoc"); - - m.def("edit_distance", &levenshtein_distance, R"pbdoc( - Same As levenshtein_distance(): Levenshtein Distance of Two Strings - )pbdoc"); - - m.def("levenshtein_distance_of_list", &levenshtein_distance_of_list, R"pbdoc( - Levenshtein Distance of one string to a list of strings - )pbdoc"); - - m.def("edit_distance_of_list", &levenshtein_distance_of_list, R"pbdoc( - Levenshtein Distance of one string to a list of strings - )pbdoc"); + m.def("lcs", &lcs_sequence_length, R"pbdoc(Longest common subsequence)pbdoc"); + m.def("lcs_sequence_length", &lcs_sequence_length, R"pbdoc(Longest common subsequence)pbdoc"); + m.def("lcs_sequence_idx", &lcs_sequence_idx, R"pbdoc(Longest common subsequence indices mapping from str to ref)pbdoc"); + m.def("lcs_of_list", &lcs_sequence_of_list, R"pbdoc(Longest common subsequence of list)pbdoc"); + m.def("lcs_sequence_of_list", &lcs_sequence_of_list, R"pbdoc(Longest common subsequence of list)pbdoc"); + + m.def("lcs2", &lcs_string_length, R"pbdoc(Longest common substring)pbdoc"); + m.def("lcs_string_length", &lcs_string_length, R"pbdoc(Longest common substring)pbdoc"); + m.def("lcs_string_idx", &lcs_string_idx, R"pbdoc(Longest common substring indices mapping from str to ref)pbdoc"); + m.def("lcs2_of_list", &lcs_string_of_list, R"pbdoc(Longest common substring of list)pbdoc"); + m.def("lcs_string_of_list", &lcs_string_of_list, R"pbdoc(Longest common substring of list)pbdoc"); + + m.def("levenshtein_distance", &levenshtein_distance, R"pbdoc(Levenshtein Distance of Two Strings)pbdoc"); + m.def("edit_distance", &levenshtein_distance, R"pbdoc(Same As levenshtein_distance(): Levenshtein Distance of Two Strings)pbdoc"); + m.def("levenshtein_distance_of_list", &levenshtein_distance_of_list, R"pbdoc(Levenshtein Distance of one string to a list of strings)pbdoc"); + m.def("edit_distance_of_list", &levenshtein_distance_of_list, R"pbdoc(Levenshtein Distance of one string to a list of strings)pbdoc"); } diff --git a/tests/test_pylcs.py b/tests/test_pylcs.py index 132bf27..665c765 100644 --- a/tests/test_pylcs.py +++ b/tests/test_pylcs.py @@ -3,27 +3,55 @@ def test_lcs(): + assert pylcs.lcs("aaa", "") == 0 + assert pylcs.lcs("", "bbb") == 0 assert pylcs.lcs("aaa", "bbb") == 0 - assert pylcs.lcs("aaa", "aabbbaa") == 3 assert pylcs.lcs("你好", "中国") == 0 - assert pylcs.lcs("aaa你好", "你好呀") == 2 + assert pylcs.lcs_sequence_length("aaa", "aabbbaa") == 3 + assert pylcs.lcs_sequence_length("aaa你好", "你好呀") == 2 def test_lcs_of_list(): assert pylcs.lcs_of_list("aaa", ["aabbbaa"] * 10) == [3] * 10 assert pylcs.lcs_of_list("aaa你好", ["你好呀"] * 10) == [2] * 10 + assert pylcs.lcs_sequence_of_list("aaa", ["aabbbaa"] * 10) == [3] * 10 + assert pylcs.lcs_sequence_of_list("aaa你好", ["你好呀"] * 10) == [2] * 10 + + +def test_lcs_sequence_idx(): + assert pylcs.lcs_sequence_idx("", "bbb") == [] + assert pylcs.lcs_sequence_idx("aaa", "") == [-1, -1, -1] + assert pylcs.lcs_sequence_idx("aaa", "bbb") == [-1, -1, -1] + assert pylcs.lcs_sequence_idx("你好", "中国") == [-1, -1] + res = pylcs.lcs_sequence_idx("aaa", "aabbbaa") + assert all([x in [0, 1, 5, 6] for x in res]) and res == sorted(res) + assert pylcs.lcs_sequence_idx("aaa你好", "你好呀") == [-1, -1, -1, 0, 1] def test_lcs2(): + assert pylcs.lcs2("aaa", "") == 0 + assert pylcs.lcs2("", "bbb") == 0 assert pylcs.lcs2("aaa", "bbb") == 0 - assert pylcs.lcs2("aaa", "aabbbaa") == 2 assert pylcs.lcs2("你好", "中国") == 0 - assert pylcs.lcs2("aaa你好", "好呀你") == 1 + assert pylcs.lcs_string_length("aaa", "aabbbaa") == 2 + assert pylcs.lcs_string_length("aaa你好", "好呀你") == 1 def test_lcs2_of_list(): assert pylcs.lcs2_of_list("aaa", ["aabbbaa"] * 10) == [2] * 10 assert pylcs.lcs2_of_list("aaa你好", ["好呀你"] * 10) == [1] * 10 + assert pylcs.lcs_string_of_list("aaa", ["aabbbaa"] * 10) == [2] * 10 + assert pylcs.lcs_string_of_list("aaa你好", ["好呀你"] * 10) == [1] * 10 + + +def test_lcs_string_idx(): + assert pylcs.lcs_string_idx("", "bbb") == [] + assert pylcs.lcs_string_idx("aaa", "") == [-1, -1, -1] + assert pylcs.lcs_string_idx("aaa", "bbb") == [-1, -1, -1] + assert pylcs.lcs_string_idx("你好", "中国") == [-1, -1] + assert pylcs.lcs_string_idx("aaa", "aabbbaa") in ([0, 1, -1], [-1, 0, 1], [5, 6, -1], [-1, 5, 6]) + assert pylcs.lcs_string_idx("aaa", "aabbbaaa") == [5, 6, 7] + assert pylcs.lcs_string_idx("aaa你好", "你好呀") == [-1, -1, -1, 0, 1] def test_edit_distance(): @@ -37,3 +65,14 @@ def test_edit_distance_of_list(): assert pylcs.edit_distance_of_list("aaa", ["bbb"] * 10) == [3] * 10 assert pylcs.edit_distance_of_list("aaa你好", ["你好呀"] * 10) == [4] * 10 assert pylcs.edit_distance_of_list("aaa你好", ["bbb", "你好呀"] * 10) == [5, 4] * 10 + + +test_lcs() +test_lcs_of_list() +test_lcs_sequence_idx() +test_lcs_string_idx() +test_lcs2() +test_lcs2() +test_lcs2_of_list() +test_edit_distance() +test_edit_distance_of_list() From 660388eba38389c4c3babe1f9687a7160481f0c3 Mon Sep 17 00:00:00 2001 From: kzh <1432245553@qq.com> Date: Fri, 29 Oct 2021 15:44:45 +0800 Subject: [PATCH 02/12] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D=E4=BA=86=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E8=B7=9D=E7=A6=BB=E5=9C=A8=E8=BE=93=E5=85=A5=E7=A9=BA?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E6=97=B6=E8=AE=A1=E7=AE=97=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84bug=EF=BC=8C=E5=B9=B6=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E4=BA=86=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=202.=E4=B8=BA?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E8=B7=9D=E7=A6=BB=E6=8F=90=E4=BE=9B=E4=BA=86?= =?UTF-8?q?weight=E5=8F=82=E6=95=B0=EF=BC=8C=E6=8F=90=E4=BE=9B=E5=B8=A6?= =?UTF-8?q?=E6=9D=83=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.cpp | 37 +++++++++++++++++++++++++++++++++++-- tests/test_pylcs.py | 24 ++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 3eeacec..9297e27 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -201,8 +201,6 @@ vector lcs_string_of_list(const string &str1, vector &str_list){ // 编辑距离 int levenshtein_distance(const string &str1, const string &str2) { - if (str1 == "" || str2 == "") - return 0; vector s1 = utf8_split(str1); vector s2 = utf8_split(str2); int m = s1.size(); @@ -229,6 +227,39 @@ int levenshtein_distance(const string &str1, const string &str2) { } +bool inline __contains(map> m, string k1, string k2) { + return m.find(k1) != m.end() && m[k1].find(k2) != m[k1].end(); +} + +float levenshtein_distance_weighted(const string &str1, const string &str2, map> &weight) { + vector s1 = utf8_split(str1); + vector s2 = utf8_split(str2); + string __(""); + int m = s1.size(); + int n = s2.size(); + vector> dp(m + 1, vector(n + 1)); + int i, j; + float si, sj, sij; + + dp[0][0] = 0; + for (i = 1; i <= m; i++) { + dp[i][0] = dp[i-1][0] + (__contains(weight, s1[i-1], __) ? weight[s1[i-1]][__] : 1); + } + for (j = 1; j <= n; j++) { + dp[0][j] = dp[0][j-1] + (__contains(weight, __, s2[j-1]) ? weight[__][s2[j-1]] : 1); + } + for (i = 1; i <= m; i++) { + for (j = 1; j <= n; j++) { + si = __contains(weight, s1[i-1], __) ? weight[s1[i-1]][__] : 1; + sj = __contains(weight, __, s2[j-1]) ? weight[__][s2[j-1]] : 1; + sij = __contains(weight, s1[i-1], s2[j-1]) ? weight[s1[i-1]][s2[j-1]] : (s1[i-1] == s2[j-1] ? 0 : 1); + dp[i][j] = min({dp[i-1][j] + si, dp[i][j-1] + sj, dp[i-1][j-1] + sij}); + } + } + return dp[m][n]; +} + + vector levenshtein_distance_of_list(const string &str1, vector &str_list){ int size = str_list.size(); vector ls(size); @@ -257,7 +288,9 @@ PYBIND11_MODULE(pylcs, m) { m.def("lcs_string_of_list", &lcs_string_of_list, R"pbdoc(Longest common substring of list)pbdoc"); m.def("levenshtein_distance", &levenshtein_distance, R"pbdoc(Levenshtein Distance of Two Strings)pbdoc"); + m.def("levenshtein_distance", &levenshtein_distance_weighted, R"pbdoc(Levenshtein Distance of Two Strings. A weight dict> can be used.)pbdoc"); m.def("edit_distance", &levenshtein_distance, R"pbdoc(Same As levenshtein_distance(): Levenshtein Distance of Two Strings)pbdoc"); + m.def("edit_distance", &levenshtein_distance_weighted, R"pbdoc(Same As levenshtein_distance(): Levenshtein Distance of Two Strings)pbdoc"); m.def("levenshtein_distance_of_list", &levenshtein_distance_of_list, R"pbdoc(Levenshtein Distance of one string to a list of strings)pbdoc"); m.def("edit_distance_of_list", &levenshtein_distance_of_list, R"pbdoc(Levenshtein Distance of one string to a list of strings)pbdoc"); } diff --git a/tests/test_pylcs.py b/tests/test_pylcs.py index 665c765..149a5f0 100644 --- a/tests/test_pylcs.py +++ b/tests/test_pylcs.py @@ -55,12 +55,35 @@ def test_lcs_string_idx(): def test_edit_distance(): + assert pylcs.edit_distance("", "bbb") == 3 + assert pylcs.edit_distance("aaa", "") == 3 + assert pylcs.edit_distance("aaa", "aaa") == 0 assert pylcs.edit_distance("aaa", "bbb") == 3 assert pylcs.edit_distance("aaa", "aabbbaa") == 4 assert pylcs.edit_distance("你好", "中国") == 2 assert pylcs.edit_distance("aaa你好", "你好呀") == 4 +def test_edit_distance_weighted(): + assert pylcs.edit_distance("", "bbb", {}) == 3 + assert pylcs.edit_distance("", "bbb", {'': {'b': 2}}) == 6 + assert pylcs.edit_distance("", "bbb", {'b': {'': 2}}) == 3 + assert pylcs.edit_distance("aaa", "", {}) == 3 + assert pylcs.edit_distance("aaa", "", {'': {'a': 2}}) == 3 + assert pylcs.edit_distance("aaa", "", {'a': {'': 2}}) == 6 + assert pylcs.edit_distance("aaa", "bbb", {'a': {'b': 2}}) == 6 + assert pylcs.edit_distance("aaa", "aaa", {'a': {'a': 1}}) == 3 + assert pylcs.edit_distance("aa", "aababb", {'a': {'a': 0.5, 'b': 2}}) == 5 + assert pylcs.edit_distance("x你好", "你好呀", {'你': {'你': -1}}) == 1 + assert pylcs.edit_distance("x你好", "你好呀", {'你好': {'你好': -1}}) == 2 + weight = {'A': {'A': -2, 'C': 7, 'G': 5, 'T': 7, '': 5}, + 'C': {'A': 7, 'C': -2, 'G': 7, 'T': 5, '': 5}, + 'G': {'A': 5, 'C': 7, 'G': -2, 'T': 7, '': 5}, + 'T': {'A': 7, 'C': 5, 'G': 7, 'T': -2, '': 5}, + '': {'A': 5, 'C': 5, 'G': 5, 'T': 5, '': 0}} + assert pylcs.edit_distance("GCT", "CTT", weight) == 6 + + def test_edit_distance_of_list(): assert pylcs.edit_distance_of_list("aaa", ["bbb"] * 10) == [3] * 10 assert pylcs.edit_distance_of_list("aaa你好", ["你好呀"] * 10) == [4] * 10 @@ -75,4 +98,5 @@ def test_edit_distance_of_list(): test_lcs2() test_lcs2_of_list() test_edit_distance() +test_edit_distance_weighted() test_edit_distance_of_list() From 9d2dc6685c22c57bcca70db5b521668e505b9044 Mon Sep 17 00:00:00 2001 From: kzh <1432245553@qq.com> Date: Fri, 29 Oct 2021 16:43:57 +0800 Subject: [PATCH 03/12] update README and unittests --- README.md | 54 ++++++++++++++++++++++++++++++++++++++------- src/main.cpp | 6 +++-- tests/test_pylcs.py | 21 +++++++++--------- 3 files changed, 61 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 94946d4..72e0a92 100644 --- a/README.md +++ b/README.md @@ -25,36 +25,74 @@ import pylcs # finding the longest common subsequence length of string A and string B A = 'We are shannonai' B = 'We like shannonai' -pylcs.lcs(A, B) +pylcs.lcs_sequence_length(A, B) """ ->>> pylcs.lcs(A, B) +>>> pylcs.lcs_sequence_length(A, B) 14 """ +# finding alignment from string A to B +A = 'We are shannonai' +B = 'We like shannonai' +res = pylcs.lcs_sequence_idx(A, B) +''.join([B[i] for i in res if i != -1]) +""" +>>> res +[0, 1, 2, -1, -1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] +>>> ''.join([B[i] for i in res if i != -1]) +'We e shannonai' +""" + # finding the longest common subsequence length of string A and a list of string B A = 'We are shannonai' B = ['We like shannonai', 'We work in shannonai', 'We are not shannonai'] -pylcs.lcs_of_list(A, B) +pylcs.lcs_sequence_of_list(A, B) """ ->>> pylcs.lcs_of_list(A, B) +>>> pylcs.lcs_sequence_of_list(A, B) [14, 14, 16] """ # finding the longest common substring length of string A and string B A = 'We are shannonai' B = 'We like shannonai' -pylcs.lcs2(A, B) +pylcs.lcs_string_length(A, B) """ ->>> pylcs.lcs2(A, B) +>>> pylcs.lcs_string_length(A, B) 11 """ +# finding alignment from string A to B +A = 'We are shannonai' +B = 'We like shannonai' +res = pylcs.lcs_string_idx(A, B) +''.join([B[i] for i in res if i != -1]) +""" +>>> res +[-1, -1, -1, -1, -1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] +>>> ''.join([B[i] for i in res if i != -1]) +'e shannonai' +""" + # finding the longest common substring length of string A and a list of string B A = 'We are shannonai' B = ['We like shannonai', 'We work in shannonai', 'We are not shannonai'] -pylcs.lcs2_of_list(A, B) +pylcs.lcs_string_of_list(A, B) """ ->>> pylcs.lcs2_of_list(A, B) +>>> pylcs.lcs_string_of_list(A, B) [11, 10, 10] """ +# finding the weighted edit distance from string A to B +pylcs.edit_distance("aaa", "aba") +pylcs.edit_distance("aaa", "aba", {'a': {'b': 2.0}}) +pylcs.edit_distance("", "aa", {'': {'a': 0.5}}) +# weight['']['a'] means inserting a char 'a' costs 0.5 +# similarly, weight['a'][''] means the score of deleting a char 'a' +""" +>>> pylcs.edit_distance("aaa", "aba") +1 +>>> pylcs.edit_distance("aaa", "aba", {'a': {'b': 2.0}}) +2.0 +>>> pylcs.edit_distance("", "aa", {'': {'a': 0.5}}) +1.0 +""" diff --git a/src/main.cpp b/src/main.cpp index 9297e27..8392236 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -277,13 +277,15 @@ namespace py = pybind11; PYBIND11_MODULE(pylcs, m) { m.def("lcs", &lcs_sequence_length, R"pbdoc(Longest common subsequence)pbdoc"); m.def("lcs_sequence_length", &lcs_sequence_length, R"pbdoc(Longest common subsequence)pbdoc"); - m.def("lcs_sequence_idx", &lcs_sequence_idx, R"pbdoc(Longest common subsequence indices mapping from str to ref)pbdoc"); + m.def("lcs_sequence_idx", &lcs_sequence_idx, R"pbdoc(Longest common subsequence indices mapping from str to ref)pbdoc", + py::arg("s"), py::arg("ref")); m.def("lcs_of_list", &lcs_sequence_of_list, R"pbdoc(Longest common subsequence of list)pbdoc"); m.def("lcs_sequence_of_list", &lcs_sequence_of_list, R"pbdoc(Longest common subsequence of list)pbdoc"); m.def("lcs2", &lcs_string_length, R"pbdoc(Longest common substring)pbdoc"); m.def("lcs_string_length", &lcs_string_length, R"pbdoc(Longest common substring)pbdoc"); - m.def("lcs_string_idx", &lcs_string_idx, R"pbdoc(Longest common substring indices mapping from str to ref)pbdoc"); + m.def("lcs_string_idx", &lcs_string_idx, R"pbdoc(Longest common substring indices mapping from str to ref)pbdoc", + py::arg("s"), py::arg("ref")); m.def("lcs2_of_list", &lcs_string_of_list, R"pbdoc(Longest common substring of list)pbdoc"); m.def("lcs_string_of_list", &lcs_string_of_list, R"pbdoc(Longest common substring of list)pbdoc"); diff --git a/tests/test_pylcs.py b/tests/test_pylcs.py index 149a5f0..d3a6dc2 100644 --- a/tests/test_pylcs.py +++ b/tests/test_pylcs.py @@ -2,7 +2,7 @@ import pylcs -def test_lcs(): +def test_lcs_sequence(): assert pylcs.lcs("aaa", "") == 0 assert pylcs.lcs("", "bbb") == 0 assert pylcs.lcs("aaa", "bbb") == 0 @@ -11,7 +11,7 @@ def test_lcs(): assert pylcs.lcs_sequence_length("aaa你好", "你好呀") == 2 -def test_lcs_of_list(): +def test_lcs_sequence_of_list(): assert pylcs.lcs_of_list("aaa", ["aabbbaa"] * 10) == [3] * 10 assert pylcs.lcs_of_list("aaa你好", ["你好呀"] * 10) == [2] * 10 assert pylcs.lcs_sequence_of_list("aaa", ["aabbbaa"] * 10) == [3] * 10 @@ -28,7 +28,7 @@ def test_lcs_sequence_idx(): assert pylcs.lcs_sequence_idx("aaa你好", "你好呀") == [-1, -1, -1, 0, 1] -def test_lcs2(): +def test_lcs_string(): assert pylcs.lcs2("aaa", "") == 0 assert pylcs.lcs2("", "bbb") == 0 assert pylcs.lcs2("aaa", "bbb") == 0 @@ -37,7 +37,7 @@ def test_lcs2(): assert pylcs.lcs_string_length("aaa你好", "好呀你") == 1 -def test_lcs2_of_list(): +def test_lcs_string_of_list(): assert pylcs.lcs2_of_list("aaa", ["aabbbaa"] * 10) == [2] * 10 assert pylcs.lcs2_of_list("aaa你好", ["好呀你"] * 10) == [1] * 10 assert pylcs.lcs_string_of_list("aaa", ["aabbbaa"] * 10) == [2] * 10 @@ -55,6 +55,7 @@ def test_lcs_string_idx(): def test_edit_distance(): + assert pylcs.edit_distance("", "") == 0 assert pylcs.edit_distance("", "bbb") == 3 assert pylcs.edit_distance("aaa", "") == 3 assert pylcs.edit_distance("aaa", "aaa") == 0 @@ -71,7 +72,8 @@ def test_edit_distance_weighted(): assert pylcs.edit_distance("aaa", "", {}) == 3 assert pylcs.edit_distance("aaa", "", {'': {'a': 2}}) == 3 assert pylcs.edit_distance("aaa", "", {'a': {'': 2}}) == 6 - assert pylcs.edit_distance("aaa", "bbb", {'a': {'b': 2}}) == 6 + assert pylcs.edit_distance("aaa", "aba", {'a': {'b': 2}}) == 2 + assert pylcs.edit_distance("aaa", "aba", {'a': {'b': 3}}) == 2 assert pylcs.edit_distance("aaa", "aaa", {'a': {'a': 1}}) == 3 assert pylcs.edit_distance("aa", "aababb", {'a': {'a': 0.5, 'b': 2}}) == 5 assert pylcs.edit_distance("x你好", "你好呀", {'你': {'你': -1}}) == 1 @@ -90,13 +92,12 @@ def test_edit_distance_of_list(): assert pylcs.edit_distance_of_list("aaa你好", ["bbb", "你好呀"] * 10) == [5, 4] * 10 -test_lcs() -test_lcs_of_list() +test_lcs_sequence() +test_lcs_sequence_of_list() test_lcs_sequence_idx() +test_lcs_string() +test_lcs_string_of_list() test_lcs_string_idx() -test_lcs2() -test_lcs2() -test_lcs2_of_list() test_edit_distance() test_edit_distance_weighted() test_edit_distance_of_list() From 0a8edfb439bf10c83406440fb88f385241a54717 Mon Sep 17 00:00:00 2001 From: kzh <1432245553@qq.com> Date: Fri, 29 Oct 2021 17:27:43 +0800 Subject: [PATCH 04/12] add edit distance indices alignment --- README.md | 13 ++++++++++ src/main.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++-- tests/test_pylcs.py | 9 +++++++ 3 files changed, 83 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 72e0a92..e08294a 100644 --- a/README.md +++ b/README.md @@ -96,3 +96,16 @@ pylcs.edit_distance("", "aa", {'': {'a': 0.5}}) >>> pylcs.edit_distance("", "aa", {'': {'a': 0.5}}) 1.0 """ + +# finding edit distance alignment from string A to B +pylcs.edit_distance_idx("aaa", "aba") +pylcs.edit_distance_idx("aaa", "aba", {'a': {'b': 3}}) +pylcs.edit_distance_idx("aa", "aabb", {'a': {'a': 2, 'b': 0}}) +""" +>>> pylcs.edit_distance_idx("aaa", "aba") +[0, 1, 2] +>>> pylcs.edit_distance_idx("aaa", "aba", {'a': {'b': 3}}) +[0, -1, 2] +>>> pylcs.edit_distance_idx("aa", "aabb", {'a': {'a': 2, 'b': 0}}) +[2, 3] +""" diff --git a/src/main.cpp b/src/main.cpp index 8392236..10e1a70 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -260,6 +260,59 @@ float levenshtein_distance_weighted(const string &str1, const string &str2, map< } +vector levenshtein_distance_idx_weighted(const string &str, const string &ref, map> &weight) { + vector s1 = utf8_split(str); + vector s2 = utf8_split(ref); + string __(""); + int m = s1.size(); + int n = s2.size(); + vector> dp(m + 1, vector(n + 1)); + vector> direct(m + 1, vector(n + 1)); + vector res(m, -1); + int i, j; + float si, sj, sij; + + dp[0][0] = 0; + for (i = 1; i <= m; i++) { + dp[i][0] = dp[i-1][0] + (__contains(weight, s1[i-1], __) ? weight[s1[i-1]][__] : 1); + direct[i][0] = 's'; + } + for (j = 1; j <= n; j++) { + dp[0][j] = dp[0][j-1] + (__contains(weight, __, s2[j-1]) ? weight[__][s2[j-1]] : 1); + direct[0][j] = 'r'; + } + for (i = 1; i <= m; i++) { + for (j = 1; j <= n; j++) { + si = __contains(weight, s1[i-1], __) ? weight[s1[i-1]][__] : 1; + sj = __contains(weight, __, s2[j-1]) ? weight[__][s2[j-1]] : 1; + sij = __contains(weight, s1[i-1], s2[j-1]) ? weight[s1[i-1]][s2[j-1]] : (s1[i-1] == s2[j-1] ? 0 : 1); + if (dp[i-1][j-1] + sij <= dp[i-1][j] + si && dp[i-1][j-1] + sij <= dp[i][j-1] + sj) { + dp[i][j] = dp[i-1][j-1] + sij; + direct[i][j] = 'm'; + } + else if (dp[i-1][j] + si <= dp[i][j-1] + sj) { + dp[i][j] = dp[i-1][j] + si; + direct[i][j] = 's'; + } + else { + dp[i][j] = dp[i][j-1] + sj; + direct[i][j] = 'r'; + } + } + } + + for (i = m, j = n; i > 0 && j > 0; ){ + if (direct[i][j] == 'm') { + res[i-1] = j-1; + i--; j--; + } + else if (direct[i][j] == 's') i--; + else if (direct[i][j] == 'r') j--; + } + return res; +} + + vector levenshtein_distance_of_list(const string &str1, vector &str_list){ int size = str_list.size(); vector ls(size); @@ -290,9 +343,15 @@ PYBIND11_MODULE(pylcs, m) { m.def("lcs_string_of_list", &lcs_string_of_list, R"pbdoc(Longest common substring of list)pbdoc"); m.def("levenshtein_distance", &levenshtein_distance, R"pbdoc(Levenshtein Distance of Two Strings)pbdoc"); - m.def("levenshtein_distance", &levenshtein_distance_weighted, R"pbdoc(Levenshtein Distance of Two Strings. A weight dict> can be used.)pbdoc"); + m.def("levenshtein_distance", &levenshtein_distance_weighted, R"pbdoc(Levenshtein Distance of Two Strings. A weight dict> can be used.)pbdoc", + py::arg("str1"), py::arg("str2"), py::arg("weight")); + m.def("levenshtein_distance_idx", &levenshtein_distance_idx_weighted, R"pbdoc(Levenshtein Distance indices mapping from str to ref)pbdoc", + py::arg("s"), py::arg("ref"), py::arg("weight")=map>()); m.def("edit_distance", &levenshtein_distance, R"pbdoc(Same As levenshtein_distance(): Levenshtein Distance of Two Strings)pbdoc"); - m.def("edit_distance", &levenshtein_distance_weighted, R"pbdoc(Same As levenshtein_distance(): Levenshtein Distance of Two Strings)pbdoc"); + m.def("edit_distance", &levenshtein_distance_weighted, R"pbdoc(Same As levenshtein_distance(): Levenshtein Distance of Two Strings)pbdoc", + py::arg("str1"), py::arg("str2"), py::arg("weight")); + m.def("edit_distance_idx", &levenshtein_distance_idx_weighted, R"pbdoc(Edit Distance indices mapping from str to ref)pbdoc", + py::arg("s"), py::arg("ref"), py::arg("weight")=map>()); m.def("levenshtein_distance_of_list", &levenshtein_distance_of_list, R"pbdoc(Levenshtein Distance of one string to a list of strings)pbdoc"); m.def("edit_distance_of_list", &levenshtein_distance_of_list, R"pbdoc(Levenshtein Distance of one string to a list of strings)pbdoc"); } diff --git a/tests/test_pylcs.py b/tests/test_pylcs.py index d3a6dc2..5b19ecf 100644 --- a/tests/test_pylcs.py +++ b/tests/test_pylcs.py @@ -86,6 +86,14 @@ def test_edit_distance_weighted(): assert pylcs.edit_distance("GCT", "CTT", weight) == 6 +def test_edit_distance_idx(): + assert pylcs.edit_distance_idx("aaa", "") == [-1, -1, -1] + assert pylcs.edit_distance_idx("", "bbb") == [] + assert pylcs.edit_distance_idx("aaa", "aba", {'a': {'b': 1}}) == [0, 1, 2] + assert pylcs.edit_distance_idx("aaa", "aba", {'a': {'b': 3}}) == [0, -1, 2] + assert pylcs.edit_distance_idx("aa", "aabb", {'a': {'a': 2, 'b': 0}}) == [2, 3] + + def test_edit_distance_of_list(): assert pylcs.edit_distance_of_list("aaa", ["bbb"] * 10) == [3] * 10 assert pylcs.edit_distance_of_list("aaa你好", ["你好呀"] * 10) == [4] * 10 @@ -100,4 +108,5 @@ def test_edit_distance_of_list(): test_lcs_string_idx() test_edit_distance() test_edit_distance_weighted() +test_edit_distance_idx() test_edit_distance_of_list() From e0d89777c375e022f55f14d33f693ffa3f4dc2bc Mon Sep 17 00:00:00 2001 From: kzh <1432245553@qq.com> Date: Thu, 2 Jun 2022 13:00:54 +0800 Subject: [PATCH 05/12] 0.0.7 --- README.md | 3 +++ pyproject.toml | 3 +++ setup.py | 8 ++++---- 3 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 pyproject.toml diff --git a/README.md b/README.md index e08294a..523787c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # pylcs + +**The [original repository](https://github.com/Meteorix/pylcs) stop maintenance. This is a transfer version** + **pylcs** is a super fast c++ library which adopts dynamic programming(DP) algorithm to solve two classic LCS problems as below . [The longest common subsequence](https://en.wikipedia.org/wiki/Longest_common_subsequence_problem) problem is the problem of finding the longest subsequence common to all sequences in a set of sequences (often just two sequences). diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..83a7f7a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools>=42", "pybind11>=2.2"] +build-backend = "setuptools.build_meta" diff --git a/setup.py b/setup.py index bc70efe..885411f 100644 --- a/setup.py +++ b/setup.py @@ -90,10 +90,10 @@ def build_extensions(self): setup( name='pylcs', - version='0.0.6', - author='Meteorix', - author_email='lxhustauto@gmail.com', - url='https://github.com/Meteorix/pylcs', + version='0.0.7', + author='kuangzh', + author_email='kuangzh@smail.nju.edu.cn', + url='https://github.com/kuangkzh/pylcs', description='super fast cpp implementation of longest common subsequence', long_description=long_description, long_description_content_type="text/markdown", From 730fdc51aa803f5b2e254c4fef94f3a226e2268d Mon Sep 17 00:00:00 2001 From: JamesScript Date: Mon, 18 Jul 2022 10:27:34 +0100 Subject: [PATCH 06/12] explicitly imported algorithm into main.cpp, as this will fix installation errors on Windows 10 --- src/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.cpp b/src/main.cpp index 10e1a70..b26ecb1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,7 @@ #include #include #include +#include using namespace std; From 68954ac01bedc7cc0b4fd9f76a7bbfeea4e863c5 Mon Sep 17 00:00:00 2001 From: kuangkzh <1432245553@qq.com> Date: Sat, 11 Feb 2023 17:01:31 +0800 Subject: [PATCH 07/12] 0.0.8 --- build.sh | 21 +++++++++++++++++++++ setup.py | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 build.sh diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..8e37b60 --- /dev/null +++ b/build.sh @@ -0,0 +1,21 @@ +conda activate py35 +python -m pip install --upgrade build +python -m build -w +conda activate py36 +python -m pip install --upgrade build +python -m build -w +conda activate py37 +python -m pip install --upgrade build +python -m build -w +conda activate py38 +python -m pip install --upgrade build +python -m build -w +conda activate py39 +python -m pip install --upgrade build +python -m build -w +conda activate py310 +python -m pip install --upgrade build +python -m build -w +python -m build -s + +py -m twine upload --repository pypi dist/* diff --git a/setup.py b/setup.py index 885411f..10f9999 100644 --- a/setup.py +++ b/setup.py @@ -90,7 +90,7 @@ def build_extensions(self): setup( name='pylcs', - version='0.0.7', + version='0.0.8', author='kuangzh', author_email='kuangzh@smail.nju.edu.cn', url='https://github.com/kuangkzh/pylcs', From 45c265066de451dd2971ccfd1388887b7451e5eb Mon Sep 17 00:00:00 2001 From: kzh <1432245553@qq.com> Date: Mon, 4 Sep 2023 00:50:13 +0800 Subject: [PATCH 08/12] 0.1.0 Add colorful visualization for string comparison --- README.md | 18 +++++++++++++ build.sh | 11 ++++++++ pylcs/__init__.py | 61 +++++++++++++++++++++++++++++++++++++++++++++ setup.py | 5 ++-- src/main.cpp | 2 +- tests/test_pylcs.py | 15 +++++++++++ 6 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 pylcs/__init__.py diff --git a/README.md b/README.md index 523787c..cd0c18c 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ We also support Chinese(or any UTF-8) string. +Colorful Visualization: After 0.1.0, you can visualize the lcs result with colorful output. + Install ------- @@ -112,3 +114,19 @@ pylcs.edit_distance_idx("aa", "aabb", {'a': {'a': 2, 'b': 0}}) >>> pylcs.edit_distance_idx("aa", "aabb", {'a': {'a': 2, 'b': 0}}) [2, 3] """ +``` + +After 0.1.0, you can make a visualized comparison with colorful output. Using `coloring_match_sequence` to color the s1 and s2 by a match list like: +```python +s1, s2 = "abcdefghijklmnopq", "-c-fgh-kl-nop-q" +match_list = pylcs.lcs_sequence_idx(s1, s2) +colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 1, 1, "#FFEEAA", "#FFEEAA", t=1) +print(colored_s1, colored_s2) +colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 1, 1, "#FFEEAA", "#FFEEAA", t=2) +print(colored_s1, colored_s2) +colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 1, 1, "#FFEEAA", "#FFEEAA", t=3) +print(colored_s1, colored_s2) +``` +Note that the colorful output uses ANSI escape codes. Referring to https://en.wikipedia.org/wiki/ANSI_escape_code. + +The ANSI codes may not work in win32 command line. diff --git a/build.sh b/build.sh index 8e37b60..1a1fb45 100644 --- a/build.sh +++ b/build.sh @@ -1,3 +1,11 @@ +#conda create -y -n py35 python=3.5 pybind11 +#conda create -y -n py36 python=3.6 pybind11 +#conda create -y -n py37 python=3.7 pybind11 +#conda create -y -n py38 python=3.8 pybind11 +#conda create -y -n py39 python=3.9 pybind11 +#conda create -y -n py310 python=3.10 pybind11 +#conda create -y -n py311 python=3.11 pybind11 + conda activate py35 python -m pip install --upgrade build python -m build -w @@ -16,6 +24,9 @@ python -m build -w conda activate py310 python -m pip install --upgrade build python -m build -w +conda activate py311 +python -m pip install --upgrade build +python -m build -w python -m build -s py -m twine upload --repository pypi dist/* diff --git a/pylcs/__init__.py b/pylcs/__init__.py new file mode 100644 index 0000000..ecda6b1 --- /dev/null +++ b/pylcs/__init__.py @@ -0,0 +1,61 @@ +import re +from _pylcs import * + + +def color_to_ansi_escape_code(color, is_front=True): + if color is None: + return "" + color_mode = 38 if is_front else 48 + if isinstance(color, int): + return f"\033[{color_mode};5;{color}m" + if isinstance(color, str): + color = color.strip("#") + return f"\033[{color_mode};2;{int(color[0:2], 16)};{int(color[2:4], 16)};{int(color[4:6], 16)}m" + return color + + +def coloring_match_sequence(match_list, s1, s2, c1=None, c2=None, b1=None, b2=None, t=5): + """ + Coloring the s1 and s2 by match results in match_list. Returned the colored s1 and s2 using ANSI escape codes. + Referring to https://en.wikipedia.org/wiki/ANSI_escape_code. + The ANSI codes may not work in win32. In this time you can try colorama.init first(maybe useless): + >>> import colorama + >>> colorama.init(autoreset=True) + :param match_list: An array of match results with the same length as s1. Each element indicates the match index in + s2. Not match for -1. + :param s1: string1 + :param s2: string2 + :param c1: Option[int, str], Default None. Forefront color for s1. + Int color index in https://en.wikipedia.org/wiki/ANSI_escape_code#Colors. + Hex color string like "#FFFFFF" is also supported. + :param c2: Option[int, str], Default None. Forefront color for s2. + :param b1: Option[int, str], Default None. Background color for s1. + :param b2: Option[int, str], Default None. Background color for s2. + :param t: A continuous length threshold for coloring. + :return: (colored_s1, colored_s2) + """ + def _coloring(s, color, back_color): + color = color_to_ansi_escape_code(color, is_front=True) + back_color = color_to_ansi_escape_code(back_color, is_front=False) + + def _color_repl(re_obj): + _slice = s[re_obj.start(): re_obj.end()] + if re.match("1+", re_obj.group(0)): + return color + back_color + _slice + "\033[0m" + return _slice + + return _color_repl + + mask = ''.join(['1' if i != -1 else '0' for i in match_list]) + mask = re.sub("1+", lambda s: s.group(0).replace("1", "0" if len(s.group(0)) < t else "1"), mask) + + cs1 = re.sub("0+|1+", _coloring(s1, c1, b1), mask) + + mask = set(match_list) + mask = ''.join(['1' if i in mask else '0' for i in range(len(s2))]) + mask = re.sub("1+", lambda s: s.group(0).replace("1", "0" if len(s.group(0)) < t else "1"), mask) + + cs2 = re.sub("0+|1+", _coloring(s2, c2, b2), mask) + + return cs1, cs2 + diff --git a/setup.py b/setup.py index 10f9999..ac49c34 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ def __str__(self): ext_modules = [ Extension( - 'pylcs', + '_pylcs', ['src/main.cpp'], include_dirs=[ # Path to pybind11 headers @@ -90,13 +90,14 @@ def build_extensions(self): setup( name='pylcs', - version='0.0.8', + version='0.1.0', author='kuangzh', author_email='kuangzh@smail.nju.edu.cn', url='https://github.com/kuangkzh/pylcs', description='super fast cpp implementation of longest common subsequence', long_description=long_description, long_description_content_type="text/markdown", + packages=["pylcs"], ext_modules=ext_modules, install_requires=['pybind11>=2.2'], cmdclass={'build_ext': BuildExt}, diff --git a/src/main.cpp b/src/main.cpp index b26ecb1..b15b18e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -328,7 +328,7 @@ vector levenshtein_distance_of_list(const string &str1, vector &str namespace py = pybind11; -PYBIND11_MODULE(pylcs, m) { +PYBIND11_MODULE(_pylcs, m) { m.def("lcs", &lcs_sequence_length, R"pbdoc(Longest common subsequence)pbdoc"); m.def("lcs_sequence_length", &lcs_sequence_length, R"pbdoc(Longest common subsequence)pbdoc"); m.def("lcs_sequence_idx", &lcs_sequence_idx, R"pbdoc(Longest common subsequence indices mapping from str to ref)pbdoc", diff --git a/tests/test_pylcs.py b/tests/test_pylcs.py index 5b19ecf..fc02dd3 100644 --- a/tests/test_pylcs.py +++ b/tests/test_pylcs.py @@ -1,5 +1,6 @@ # encoding=utf-8 import pylcs +import colorama def test_lcs_sequence(): @@ -100,6 +101,17 @@ def test_edit_distance_of_list(): assert pylcs.edit_distance_of_list("aaa你好", ["bbb", "你好呀"] * 10) == [5, 4] * 10 +def test_coloring_match_sequence(): + s1, s2 = "abcdefghijklmnopq", "-c-fgh-kl-nop-q" + match_list = pylcs.lcs_sequence_idx(s1, s2) + colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 1, 1, "#FFEEAA", "#FFEEAA", t=1) + print(colored_s1, colored_s2) + colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 1, 1, "#FFEEAA", "#FFEEAA", t=2) + print(colored_s1, colored_s2) + colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 1, 1, "#FFEEAA", "#FFEEAA", t=3) + print(colored_s1, colored_s2) + + test_lcs_sequence() test_lcs_sequence_of_list() test_lcs_sequence_idx() @@ -110,3 +122,6 @@ def test_edit_distance_of_list(): test_edit_distance_weighted() test_edit_distance_idx() test_edit_distance_of_list() + +colorama.init(autoreset=True) +test_coloring_match_sequence() From 201d47db45d3e49c2251e6e7f21796c9543c850c Mon Sep 17 00:00:00 2001 From: kzh <1432245553@qq.com> Date: Tue, 5 Sep 2023 00:48:10 +0800 Subject: [PATCH 09/12] Add 2 example pictures --- README.md | 12 +++++++++--- tests/coloring_match_sequence.jpg | Bin 0 -> 101487 bytes tests/coloring_match_sequence_2.jpg | Bin 0 -> 54186 bytes tests/test_pylcs.py | 6 +++--- 4 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 tests/coloring_match_sequence.jpg create mode 100644 tests/coloring_match_sequence_2.jpg diff --git a/README.md b/README.md index cd0c18c..74ac9a1 100644 --- a/README.md +++ b/README.md @@ -120,13 +120,19 @@ After 0.1.0, you can make a visualized comparison with colorful output. Using `c ```python s1, s2 = "abcdefghijklmnopq", "-c-fgh-kl-nop-q" match_list = pylcs.lcs_sequence_idx(s1, s2) -colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 1, 1, "#FFEEAA", "#FFEEAA", t=1) +colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 11, 11, "#2266ff", "#2266ff", t=1) print(colored_s1, colored_s2) -colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 1, 1, "#FFEEAA", "#FFEEAA", t=2) +colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 11, 11, "#2266ff", "#2266ff", t=2) print(colored_s1, colored_s2) -colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 1, 1, "#FFEEAA", "#FFEEAA", t=3) +colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 11, 11, "#2266ff", "#2266ff", t=3) print(colored_s1, colored_s2) ``` +```python +s1, s2 = "How does this string edit to s2?", "How similar is this string to s1?" +match_list = pylcs.edit_distance_idx(s1, s2) +colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 4, 4, 230, 230, t=2) +print(colored_s1, colored_s2, sep='\n') +``` Note that the colorful output uses ANSI escape codes. Referring to https://en.wikipedia.org/wiki/ANSI_escape_code. The ANSI codes may not work in win32 command line. diff --git a/tests/coloring_match_sequence.jpg b/tests/coloring_match_sequence.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a773ccd692aec77d66c9a3312da6d26d2aed0eb6 GIT binary patch literal 101487 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 th$9t8lIzjD1{0;KE~F16{zG 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 Rb!lH$(OA^QFqrZGn*dy0#o+(| literal 0 HcmV?d00001 diff --git a/tests/test_pylcs.py b/tests/test_pylcs.py index fc02dd3..9f6a03c 100644 --- a/tests/test_pylcs.py +++ b/tests/test_pylcs.py @@ -104,11 +104,11 @@ def test_edit_distance_of_list(): def test_coloring_match_sequence(): s1, s2 = "abcdefghijklmnopq", "-c-fgh-kl-nop-q" match_list = pylcs.lcs_sequence_idx(s1, s2) - colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 1, 1, "#FFEEAA", "#FFEEAA", t=1) + colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 11, 11, "#2266ff", "#2266ff", t=1) print(colored_s1, colored_s2) - colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 1, 1, "#FFEEAA", "#FFEEAA", t=2) + colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 11, 11, "#2266ff", "#2266ff", t=2) print(colored_s1, colored_s2) - colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 1, 1, "#FFEEAA", "#FFEEAA", t=3) + colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 11, 11, "#2266ff", "#2266ff", t=3) print(colored_s1, colored_s2) From ddb669866b2d457bb3ece3648601e9a891516c21 Mon Sep 17 00:00:00 2001 From: kzh <1432245553@qq.com> Date: Tue, 5 Sep 2023 00:54:32 +0800 Subject: [PATCH 10/12] Add 2 example pictures to README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 74ac9a1..497903f 100644 --- a/README.md +++ b/README.md @@ -127,12 +127,15 @@ print(colored_s1, colored_s2) colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 11, 11, "#2266ff", "#2266ff", t=3) print(colored_s1, colored_s2) ``` +![](https://github.com/kuangkzh/pylcs/blob/master/tests/coloring_match_sequence.jpg) ```python s1, s2 = "How does this string edit to s2?", "How similar is this string to s1?" match_list = pylcs.edit_distance_idx(s1, s2) colored_s1, colored_s2 = pylcs.coloring_match_sequence(match_list, s1, s2, 4, 4, 230, 230, t=2) print(colored_s1, colored_s2, sep='\n') ``` +![](https://github.com/kuangkzh/pylcs/blob/master/tests/coloring_match_sequence_2.jpg) + Note that the colorful output uses ANSI escape codes. Referring to https://en.wikipedia.org/wiki/ANSI_escape_code. The ANSI codes may not work in win32 command line. From 5711d9bab3491919c8ac79707b1303de0992bfd2 Mon Sep 17 00:00:00 2001 From: Prateek Singh Date: Thu, 5 Oct 2023 13:55:29 -0400 Subject: [PATCH 11/12] Added Apache2.0 license --- LICENSE | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b826fbb --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2023 Liu Xin + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From 5eee78a655fbe34ef24c8240304646f7cd07543b Mon Sep 17 00:00:00 2001 From: kzh <1432245553@qq.com> Date: Wed, 25 Oct 2023 08:09:12 +0800 Subject: [PATCH 12/12] Add License --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ac49c34..56f2b89 100644 --- a/setup.py +++ b/setup.py @@ -90,7 +90,7 @@ def build_extensions(self): setup( name='pylcs', - version='0.1.0', + version='0.1.1', author='kuangzh', author_email='kuangzh@smail.nju.edu.cn', url='https://github.com/kuangkzh/pylcs', @@ -102,4 +102,5 @@ def build_extensions(self): install_requires=['pybind11>=2.2'], cmdclass={'build_ext': BuildExt}, zip_safe=False, + license='Apache 2.0' )