diff --git a/beets/autotag/match.py b/beets/autotag/match.py index d6eab98d5..a5d5fce14 100644 --- a/beets/autotag/match.py +++ b/beets/autotag/match.py @@ -308,14 +308,11 @@ class Distance(object): @property def distance(self): - """Returns an overall weighted distance across all penalties. + """Returns a weighted and normalised distance across all penalties. """ - dist = 0.0 - for key, penalty in self._penalties.iteritems(): - dist += sum(penalty) * weights[key].as_number() dist_max = self.max_distance if dist_max: - return dist / dist_max + return self.raw_distance / self.max_distance return 0.0 @property @@ -327,6 +324,15 @@ class Distance(object): dist_max += len(penalty) * weights[key].as_number() return dist_max + @property + def raw_distance(self): + """Returns the raw (denormalised) distance. + """ + dist_raw = 0.0 + for key, penalty in self._penalties.iteritems(): + dist_raw += sum(penalty) * weights[key].as_number() + return dist_raw + @property def sorted(self): """Returns a list of (dist, key) pairs, with `dist` being the weighted diff --git a/test/test_autotag.py b/test/test_autotag.py index b257f62c9..f2dcbbc28 100644 --- a/test/test_autotag.py +++ b/test/test_autotag.py @@ -200,6 +200,14 @@ class DistanceTest(unittest.TestCase): self.dist.add('medium', 0.0) self.assertEqual(self.dist.max_distance, 5.0) + def test_raw_distance(self): + config['match']['distance_weights']['album'] = 3.0 + config['match']['distance_weights']['medium'] = 1.0 + self.dist.add('album', 0.5) + self.dist.add('medium', 0.25) + self.dist.add('medium', 0.5) + self.assertEqual(self.dist.raw_distance, 2.25) + def test_sorted(self): config['match']['distance_weights']['album'] = 4.0 config['match']['distance_weights']['medium'] = 2.0