Caffe2 - C++ API
A deep learning, cross platform ML framework
string_utils.cc
1 #include "caffe2/utils/string_utils.h"
2 
3 #include <algorithm>
4 #include <sstream>
5 #include <vector>
6 
7 namespace caffe2 {
8 
9 std::vector<std::string> split(char separator, const std::string& string) {
10  std::vector<std::string> pieces;
11  std::stringstream ss(string);
12  std::string item;
13  while (getline(ss, item, separator)) {
14  pieces.push_back(std::move(item));
15  }
16  return pieces;
17 }
18 
19 size_t editDistance(
20  const std::string& s1, const std::string& s2, size_t max_distance)
21  {
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);
25 
26  return editDistanceHelper(
27  s1.c_str(),
28  s1.length(),
29  s2.c_str(),
30  s2.length(),
31  current,
32  previous,
33  previous1,
34  max_distance
35  );
36  }
37  #define NEXT_UNSAFE(s, i, c) { \
38  (c)=(uint8_t)(s)[(i)++]; \
39  }
40 
41 int32_t editDistanceHelper(const char* s1,
42  size_t s1_len,
43  const char* s2,
44  size_t s2_len,
45  std::vector<size_t> &current,
46  std::vector<size_t> &previous,
47  std::vector<size_t> &previous1,
48  size_t max_distance) {
49  if (max_distance) {
50  if (std::max(s1_len, s2_len) - std::min(s1_len, s2_len) > max_distance) {
51  return max_distance+1;
52  }
53  }
54 
55  for (size_t j = 0; j <= s1_len; ++j) {
56  current[j] = j;
57  }
58 
59  int32_t str2_offset = 0;
60  char prev2 = 0;
61  for (size_t i = 1; i <= s2_len; ++i) {
62  swap(previous1, previous);
63  swap(current, previous);
64  current[0] = i;
65 
66  char c2 = s2[str2_offset];
67  char prev1 = 0;
68  int32_t str1_offset = 0;
69 
70  NEXT_UNSAFE(s2, str2_offset, c2);
71 
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];
79 
80  NEXT_UNSAFE(s1, str1_offset, c1);
81 
82  if (c1 != c2) {
83  substitution += 1;
84  }
85 
86 
87  if (prev1 == c2 && prev2 == c1 && j > 1 && i > 1) {
88  transposition = previous1[j - 2] + 1;
89  }
90  prev1 = c1;
91 
92  current[j] = std::min(std::min(insertion, deletion),
93  std::min(substitution, transposition));
94  current_min = std::min(current_min, current[j]);
95  }
96 
97 
98  if (max_distance != 0 && current_min > max_distance) {
99  return max_distance+1;
100  }
101 
102  prev2 = c2;
103  }
104 
105  return current[s1_len];
106  }
107 
108 } // namespace caffe2
A global dictionary that holds information about what Caffe2 modules have been loaded in the current ...