clean up and refactor half-baked development commits and squash them into a new version.
Changes: * support for multiple GTFS feeds as input in filtering, read default global and local configuration files * be a bit more memory conservative * make caching optional * dont delete orphan edge if it would transform a degree 3 node with a possible full turn into a degree 2 node eligible for contraction * dedicated filters for funicular and gondola * make max snap level option more intuitive * allow filter rules for level 0 * additional fallback for station snapping * dont try to route for MOT unequal to trip in -T mode, force-snap to orphaned OSM station if not snap was possible * write bounds to filtered osm * remove unused surrounding heuristic * use bus lanes info * be a bit more tolerant for bus oneway streets * create missing directories * error if no cfg is present, clean up evaluation Makefile
This commit is contained in:
parent
2cc2d2dc23
commit
63f0b61ea1
60 changed files with 4532 additions and 1576 deletions
|
|
@ -142,6 +142,39 @@ inline size_t editDist(const std::string& s1, const std::string& s2) {
|
|||
return prev[len2];
|
||||
}
|
||||
|
||||
// _____________________________________________________________________________
|
||||
inline size_t prefixEditDist(const std::string& prefix, const std::string& s,
|
||||
size_t deltaMax) {
|
||||
// https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#C++
|
||||
size_t len1 = prefix.size();
|
||||
size_t len2 = std::min(s.size(), prefix.size() + deltaMax + 1);
|
||||
std::vector<size_t> d((len1 + 1) * (len2 + 1));
|
||||
|
||||
d[0] = 0;
|
||||
for (size_t i = 1; i <= len1; ++i) d[i * (len2 + 1)] = i;
|
||||
for (size_t i = 1; i <= len2; ++i) d[ i] = i;
|
||||
|
||||
for (size_t i = 1; i <= len1; i++) {
|
||||
for (size_t j = 1; j <= len2; j++) {
|
||||
d[i * (len2 + 1) + j] = std::min(std::min(d[(i - 1) * (len2 + 1) + j] + 1, d[i * (len2 + 1) + j - 1] + 1),
|
||||
d[(i - 1) * (len2 + 1) + j - 1] + (prefix[i - 1] == s[j - 1] ? 0 : 1));
|
||||
}
|
||||
}
|
||||
|
||||
// take min of last row
|
||||
size_t deltaMin = std::max(std::max(deltaMax + 1, prefix.size()), s.size());
|
||||
for (size_t i = 0; i <= len2; i++) {
|
||||
if (d[len1 * (len2 + 1) + i] < deltaMin) deltaMin = d[len1 * (len2 + 1) + i];
|
||||
}
|
||||
|
||||
return deltaMin;
|
||||
}
|
||||
|
||||
// _____________________________________________________________________________
|
||||
inline size_t prefixEditDist(const std::string& prefix, const std::string& s) {
|
||||
return prefixEditDist(prefix, s, s.size());
|
||||
}
|
||||
|
||||
// _____________________________________________________________________________
|
||||
template <class Iter>
|
||||
inline std::string implode(Iter begin, const Iter& end, const char* del) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue