1 #include "caffe2/utils/string_utils.h" 9 std::vector<std::string> split(
char separator,
const std::string&
string) {
10 std::vector<std::string> pieces;
11 std::stringstream ss(
string);
13 while (getline(ss, item, separator)) {
14 pieces.push_back(std::move(item));
20 const std::string& s1,
const std::string& s2,
size_t max_distance)
22 std::vector<size_t> current(s1.length() + 1);
23 std::vector<size_t> previous(s1.length() + 1);
24 std::vector<size_t> previous1(s1.length() + 1);
26 return editDistanceHelper(
37 #define NEXT_UNSAFE(s, i, c) { \ 38 (c)=(uint8_t)(s)[(i)++]; \ 41 int32_t editDistanceHelper(
const char* s1,
45 std::vector<size_t> ¤t,
46 std::vector<size_t> &previous,
47 std::vector<size_t> &previous1,
48 size_t max_distance) {
50 if (std::max(s1_len, s2_len) - std::min(s1_len, s2_len) > max_distance) {
51 return max_distance+1;
55 for (
size_t j = 0; j <= s1_len; ++j) {
59 int32_t str2_offset = 0;
61 for (
size_t i = 1; i <= s2_len; ++i) {
62 swap(previous1, previous);
63 swap(current, previous);
66 char c2 = s2[str2_offset];
68 int32_t str1_offset = 0;
70 NEXT_UNSAFE(s2, str2_offset, c2);
72 size_t current_min = s1_len;
73 for (
size_t j = 1; j <= s1_len; ++j) {
74 size_t insertion = previous[j] + 1;
75 size_t deletion = current[j - 1] + 1;
76 size_t substitution = previous[j - 1];
77 size_t transposition = insertion;
78 char c1 = s1[str1_offset];
80 NEXT_UNSAFE(s1, str1_offset, c1);
87 if (prev1 == c2 && prev2 == c1 && j > 1 && i > 1) {
88 transposition = previous1[j - 2] + 1;
92 current[j] = std::min(std::min(insertion, deletion),
93 std::min(substitution, transposition));
94 current_min = std::min(current_min, current[j]);
98 if (max_distance != 0 && current_min > max_distance) {
99 return max_distance+1;
105 return current[s1_len];
A global dictionary that holds information about what Caffe2 modules have been loaded in the current ...