def __init__(self, name, mask, config=DEFAULT_CONFIG): """Create a new session: :param name: The name of the session. Used to load it again from disk. :param mask: The mask. See :term:`Mask` :param config: A dictionary with config values. See :class:`DefaultConfig` for available keys. """ self._config = config self._name = name # Publicly readable attribute. self.mapping = {} # Make access to the mask more efficient self._mask = copy(mask) self._attribute_list = sorted(mask) self._listidx_to_key = {k: i for i, k in enumerate(self._attribute_list)} # Lookup tables for those attributes (fast access is crucial here) def make_index(idx, default_func): index = {} for key, descr in self._mask.items(): if descr[idx] is not None: index[key] = descr[idx] else: index[key] = default_func(key) return index # Import this locally, since we might get circular import otherway: from munin.distance import DistanceFunction from munin.provider import Provider # Build indices and set default values: self._key_to_providers = make_index(0, lambda key: Provider() ) self._key_to_distfuncs = make_index(1, lambda key: DistanceFunction(self._key_to_providers[key]) ) self._key_to_weighting = make_index(2, lambda key: 1.0 ) # Sum of the individual weights, pre-calculated once. self._weight_sum = sum((descr[2] for descr in mask.values())) # Create the associated database. self._database = Database(self) # Filtering related: self._filtering_enabled = config['recom_history_sieving'] self._recom_history = RecommendationHistory( penalty_map=config['recom_history_penalty'] ) # Publicly readable attribute. self.mapping = bidict()
def test_process(self): from munin.provider import Provider from munin.provider.genre import GenreTreeProvider one = GenreTreeProvider() two = Provider() prv = one | two a = prv.process('metalcore') self.assertEqual(a, one.process('metalcore'))
def test_apply(self): provider = Provider(compress=True) dist = DistanceFunction(provider=provider) a = provider.process('Akrea') b = provider.process('Berta') c = provider.process('akrea'.capitalize()) self.assertEqual(a, (1, )) self.assertEqual(b, (2, )) self.assertEqual(c, (1, )) self.assertAlmostEqual(dist.compute(a, b), 1.0) self.assertAlmostEqual(dist.compute(a, c), 0.0) self.assertAlmostEqual(dist.compute([], []), 1.0) self.assertAlmostEqual(dist.compute(a + b, c), 0.5)