Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorSergey Magidovich <mgsergio@mapswithme.com>2018-02-07 13:03:23 +0300
committerburivuh <burivuh@maps.me>2018-02-15 12:51:16 +0300
commitdeeedb5eb0fc1d56faa58d161f7a99ff69c75505 (patch)
tree83c4bd7bbd5904f4897e1fa5cf3f28e74f4ed0aa /tools
parent03acd28207aba829c301dbbfc65106d52ef7c8d0 (diff)
[OpenLR] Fix matching evaluation tool.
Diffstat (limited to 'tools')
-rwxr-xr-xtools/python/openlr/quality.py57
1 files changed, 34 insertions, 23 deletions
diff --git a/tools/python/openlr/quality.py b/tools/python/openlr/quality.py
index f4cdd63c98..7edea177c6 100755
--- a/tools/python/openlr/quality.py
+++ b/tools/python/openlr/quality.py
@@ -97,20 +97,28 @@ def almost_equal(s1, s2, eps=1e-5):
)
def common_part(l1, l2):
+ assert l1, 'left hand side argument should not be empty'
+ if not l2:
+ return 0.0
common, diff = lcs(l1, l2, eq=almost_equal)
common_len = sum(distance(*x) for x in common)
diff_len = sum(distance(*x) for x in diff)
- assert (not common) or common_len
- assert (not diff) or diff_len
+ assert common_len + diff_len
return common_len / (common_len + diff_len)
class Segment:
- def __init__(self, segment_id, matched_route, golden_route):
- #TODO(mgsergio): Remove this when deal with auto golden routes.
- assert golden_route
+ class NoGoldenPathError(ValueError):
+ pass
+
+ def __init__(self, segment_id, golden_route, matched_route):
+ if not golden_route:
+ raise NoGoldenPathError(
+ "segment {} does not have a golden route"
+ .format(segment_id)
+ )
self.segment_id = segment_id
+ self.golden_route = golden_route
self.matched_route = matched_route or []
- self.golden_route = golden_route or None
def __repr__(self):
return 'Segment({})'.format(self.segment_id)
@@ -143,33 +151,36 @@ def parse_segments(tree, limit):
# within limit are considered accurate, so golden path should be equal
# matched path.
golden_route = parse_route(s.find('GoldenRoute')) or matched_route
- if not matched_route and not golden_route:
- raise ValueError('At least one of golden route or matched route should be present')
- try:
- yield Segment(segment_id, matched_route, golden_route)
- except:
- print('Broken segment is {}'.format(segment_id))
- raise
+ yield Segment(segment_id, golden_route, matched_route)
def calculate(tree):
- return {
- s.segment_id: common_part(s.golden_route, s.matched_route)
- for s in parse_segments(tree, args.limit)
- }
+ result = {}
+ for s in parse_segments(tree, args.limit):
+ try:
+ result[s.segment_id] = common_part(s.golden_route, s.matched_route)
+ except AssertionError:
+ print('Something is wrong with segment {}'.format(s))
+ raise
+ except Segment.NoGoldenPathError:
+ raise
+ return result
def merge(src, dst):
+ # If segment was ignored it does not have a golden route.
+ # We should mark the corresponding route in dst as ignored too.
golden_routes = {
- int(s.find('.//ReportSegmentID').text) : s.find('GoldenRoute')
+ int(s.find('.//ReportSegmentID').text): s.find('GoldenRoute')
for s in src.findall('Segment')
}
for s in dst.findall('Segment'):
assert not s.find('GoldenRoute')
- try:
- golden_route = golden_routes[int(s.find('.//ReportSegmentID').text)]
- if golden_route:
- s.append(golden_route)
- except KeyError:
+ golden_route = golden_routes[int(s.find('.//ReportSegmentID').text)]
+ if not golden_route:
+ elem = ET.Element('Ignored')
+ elem.text = 'true'
+ s.append(elem)
continue
+ s.append(golden_route)
if __name__ == '__main__':
import argparse