Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(408)

Side by Side Diff: appengine/findit/crash/scorers/min_distance.py

Issue 2157433002: [Findit] Pass changed files info to Fracas, 2 face design. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Address comments. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2016 The Chromium Authors. All rights reserved. 1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """MinDistance scorer applies to MatchResult objects. 5 """MinDistance scorer applies to MatchResult objects.
6 6
7 It represents a heuristic rule: 7 It represents a heuristic rule:
8 1. Highest score if the result changed the crashed lines. 8 1. Highest score if the result changed the crashed lines.
9 2. 0 score if changed lines are too far away from crashed lines. 9 2. 0 score if changed lines are too far away from crashed lines.
10 """ 10 """
11 11
12 import logging 12 import logging
13 13
14 from crash.scorers.scorer import Scorer 14 from crash.scorers.scorer import Scorer
15 15
16 _MAX_DISTANCE = 50 16 _MAX_DISTANCE = 50
17 17
18 18
19 class MinDistance(Scorer): 19 class MinDistance(Scorer):
20 20
21 def __init__(self, max_distance=_MAX_DISTANCE): 21 def __init__(self, max_distance=_MAX_DISTANCE):
22 self.max_distance = max_distance 22 self.max_distance = max_distance
23 23
24 def GetMetric(self, result): 24 def GetMetric(self, result):
25 if not hasattr(result, 'min_distance'): 25 min_distance = float('inf')
26 logging.warning('Scorer %s only applies to MatchResult', self.name) 26 for _, analysis_info in result.file_to_analysis_info.iteritems():
lijeffrey 2016/07/19 18:31:30 since the key is not used, why not use itervalues(
Sharu Jiang 2016/07/21 03:30:24 Done.
27 return None 27 min_distance = min(min_distance, analysis_info['min_distance'])
28 28
29 return result.min_distance 29 return min_distance
30 30
31 def Score(self, min_distance): 31 def Score(self, min_distance):
32 if min_distance > self.max_distance: 32 if min_distance > self.max_distance:
33 return 0 33 return 0
34 34
35 if min_distance == 0: 35 if min_distance == 0:
36 return 1 36 return 1
37 37
38 # TODO(katesonia): This number is randomly picked from a reasonable range, 38 # TODO(katesonia): This number is randomly picked from a reasonable range,
39 # best value to use still needs be experimented out. 39 # best value to use still needs be experimented out.
40 return 0.8 40 return 0.8
41 41
42 def Reason(self, min_distance, score): 42 def Reason(self, min_distance, score):
43 if score == 0: 43 if score == 0:
44 return '' 44 return None
45 45
46 return 'Modification distance (LOC) is %d' % min_distance 46 return self.name, score, 'Minimum distance is %d' % min_distance
47
48 def ChangedFiles(self, result):
49 index_to_changed_files = {}
50 for file_path, analysis_info in result.file_to_analysis_info.iteritems():
51 file_name = file_path.split('/')[-1]
52 frame = analysis_info['min_distance_frame']
53 index_to_changed_files[frame.index] = {
54 'file': file_name,
55 'blame_url': frame.BlameUrl(result.changelog.revision),
56 'info': 'Minimum distance (LOC) %d, frame #%d' % (
57 analysis_info['min_distance'], frame.index)
58 }
59
60 # Sort changed file by frame index.
61 _, changed_files = zip(*sorted(index_to_changed_files.items(),
62 key=lambda x: x[0]))
63
64 return list(changed_files)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698