def test__combine_rec_similarity__get_similarity(): record_caesar = 'caesar' record_brutus = 'brutus' sims = [] fake_sim1 = AbstractRecordSimilarity() fake_sim1.get_similarity = mock.Mock( side_effect=lambda f, t: sims[0]) fake_sim2 = AbstractRecordSimilarity() fake_sim2.get_similarity = mock.Mock( side_effect=lambda f, t: sims[1]) sut = CombinedRecordSimilarity(fake_sim1, fake_sim2, weight=0.25) sims = [0.8, 1.0] assert sut.get_similarity(record_caesar, record_brutus) == 0.95 sims = [0.0, 1.0] assert sut.get_similarity(record_caesar, record_brutus) == 0.75 sims = [float('nan'), 1.0] assert sut.get_similarity(record_caesar, record_brutus) == 0.75 sims = [1.0, float('nan')] assert sut.get_similarity(record_caesar, record_brutus) == 0.25 sims = [float('nan'), float('nan')] assert math.isnan(sut.get_similarity(record_caesar, record_brutus))
def test__combine_rec_similarity__get_similarity(): record_caesar = 'caesar' record_brutus = 'brutus' sims = [] fake_sim1 = AbstractRecordSimilarity() fake_sim1.get_similarity = mock.Mock(side_effect=lambda f, t: sims[0]) fake_sim2 = AbstractRecordSimilarity() fake_sim2.get_similarity = mock.Mock(side_effect=lambda f, t: sims[1]) sut = CombinedRecordSimilarity(fake_sim1, fake_sim2, weight=0.25) sims = [0.8, 1.0] assert sut.get_similarity(record_caesar, record_brutus) == 0.95 sims = [0.0, 1.0] assert sut.get_similarity(record_caesar, record_brutus) == 0.75 sims = [float('nan'), 1.0] assert sut.get_similarity(record_caesar, record_brutus) == 0.75 sims = [1.0, float('nan')] assert sut.get_similarity(record_caesar, record_brutus) == 0.25 sims = [float('nan'), float('nan')] assert math.isnan(sut.get_similarity(record_caesar, record_brutus))
def test__combine_rec_similarity__get_similarity__underlying_sims_are_called(): record_caesar = 'caesar' record_brutus = 'brutus' fake_sim1 = AbstractRecordSimilarity() fake_sim1.get_similarity = mock.Mock(return_value=0.8) fake_sim2 = AbstractRecordSimilarity() fake_sim2.get_similarity = mock.Mock(return_value=1.0) sut = CombinedRecordSimilarity(fake_sim1, fake_sim2, weight=0.25) sut.get_similarity(record_caesar, record_brutus) fake_sim1.get_similarity.assert_called_with(record_caesar, record_brutus) fake_sim2.get_similarity.assert_called_with(record_caesar, record_brutus)
def test__in_mem_knn__refresh__underlying_data_model_and_similarity_is_refreshed( ): fake_model = AbstractRecordDataModel() fake_model.get_records = mock.Mock(return_value=[]) fake_model.refresh = mock.Mock() fake_sim = AbstractRecordSimilarity() fake_sim.get_similarity = mock.Mock(return_value=1.0) fake_sim.refresh = mock.Mock() fake_nhood = AbstractRecordNeighbourhood() fake_nhood.get_neighbours = mock.Mock(return_value=[]) sut = InMemoryRecordNeighbourhood( fake_model, fake_sim, 50, nhood_factory=lambda dm, sim, num_nh: fake_nhood) sut = InMemoryRecordNeighbourhood(fake_model, fake_sim, 50) refreshed_components = set() sut.refresh(refreshed_components) assert fake_model in refreshed_components assert fake_sim in refreshed_components assert sut in refreshed_components assert fake_model.refresh.call_count == 1 assert fake_sim.refresh.call_count == 1
def create_k_nearest_neighbourhood(k, doc_sims, docs): fake_model = AbstractRecordDataModel() fake_model.get_records = mock.Mock( return_value=docs) record_sim = AbstractRecordSimilarity() record_sim.get_similarity = mock.Mock( side_effect=lambda from_id, to_id: doc_sims[to_id]) return KNearestRecordNeighbourhood( k=k, data_model=fake_model, record_sim=record_sim)
def create_k_nearest_neighbourhood(k, doc_sims, docs): fake_model = AbstractRecordDataModel() fake_model.get_records = mock.Mock(return_value=docs) record_sim = AbstractRecordSimilarity() record_sim.get_similarity = mock.Mock( side_effect=lambda from_id, to_id: doc_sims[to_id]) return KNearestRecordNeighbourhood(k=k, data_model=fake_model, record_sim=record_sim)
def test__in_mem_knn__get_nbours(): record_caesar = 'caesar' record_brutus = 'brutus' record_napoleon = 'napoleon' nbours = { record_caesar: [ record_brutus ], record_brutus: [ record_caesar ], record_napoleon: [] } sims = { record_caesar: { record_brutus: 0.9 }, record_brutus: { record_caesar: 0.8 }, record_napoleon: {} } fake_model = AbstractRecordDataModel() fake_model.get_records = mock.Mock(return_value=nbours.keys()) fake_sim = AbstractRecordSimilarity() fake_sim.get_similarity = mock.Mock( side_effect=lambda from_r, to_r: sims[from_r][to_r]) fake_nhood = AbstractRecordNeighbourhood() fake_nhood.get_neighbours = mock.Mock( side_effect=lambda r: nbours[r]) sut = InMemoryRecordNeighbourhood( fake_model, fake_sim, 50, nhood_factory=lambda dm, sim, num_nh: fake_nhood) assert sut.get_neighbours(record_caesar) == nbours[record_caesar] assert sut.get_neighbours(record_brutus) == nbours[record_brutus] assert sut.get_neighbours(record_napoleon) == nbours[record_napoleon] assert sut.get_neighbours('unknown') == [] assert sut.get_similarity(record_caesar, record_brutus) ==\ sims[record_caesar][record_brutus] assert sut.get_similarity(record_brutus, record_caesar) ==\ sims[record_brutus][record_caesar] assert math.isnan(sut.get_similarity(record_caesar, record_napoleon)) assert math.isnan(sut.get_similarity(record_napoleon, record_caesar)) assert math.isnan(sut.get_similarity('unknown', record_napoleon)) assert math.isnan(sut.get_similarity(record_caesar, 'unknown'))
def create_recommender(preferences=default_prefs, doc_sims=doc_sims): data_model = AbstractRecordDataModel() data_model.get_preferences_of_session = mock.Mock( side_effect=lambda s_id: preferences) record_sim = AbstractRecordSimilarity() record_sim.get_similarity = mock.Mock( side_effect=lambda from_id, to_id: doc_sims[from_id][to_id]) record_nhood = AbstractRecordNeighbourhood() record_nhood.get_neighbours = mock.Mock( side_effect=lambda doc_id: doc_sims[doc_id].keys()) return RecordBasedRecommender( data_model, record_nhood, record_sim)
def test__in_mem_knn__get_nbours(): record_caesar = 'caesar' record_brutus = 'brutus' record_napoleon = 'napoleon' nbours = { record_caesar: [record_brutus], record_brutus: [record_caesar], record_napoleon: [] } sims = { record_caesar: { record_brutus: 0.9 }, record_brutus: { record_caesar: 0.8 }, record_napoleon: {} } fake_model = AbstractRecordDataModel() fake_model.get_records = mock.Mock(return_value=nbours.keys()) fake_sim = AbstractRecordSimilarity() fake_sim.get_similarity = mock.Mock( side_effect=lambda from_r, to_r: sims[from_r][to_r]) fake_nhood = AbstractRecordNeighbourhood() fake_nhood.get_neighbours = mock.Mock(side_effect=lambda r: nbours[r]) sut = InMemoryRecordNeighbourhood( fake_model, fake_sim, 50, nhood_factory=lambda dm, sim, num_nh: fake_nhood) assert sut.get_neighbours(record_caesar) == nbours[record_caesar] assert sut.get_neighbours(record_brutus) == nbours[record_brutus] assert sut.get_neighbours(record_napoleon) == nbours[record_napoleon] assert sut.get_neighbours('unknown') == [] assert sut.get_similarity(record_caesar, record_brutus) ==\ sims[record_caesar][record_brutus] assert sut.get_similarity(record_brutus, record_caesar) ==\ sims[record_brutus][record_caesar] assert math.isnan(sut.get_similarity(record_caesar, record_napoleon)) assert math.isnan(sut.get_similarity(record_napoleon, record_caesar)) assert math.isnan(sut.get_similarity('unknown', record_napoleon)) assert math.isnan(sut.get_similarity(record_caesar, 'unknown'))
def test__in_mem_knn__refresh__data_is_reloaded(): record_caesar = 'caesar' record_brutus = 'brutus' nbours = { } sims = { } fake_model = AbstractRecordDataModel() fake_model.get_records = mock.Mock( side_effect=lambda: nbours.keys()) fake_model.refresh = mock.Mock() fake_sim = AbstractRecordSimilarity() fake_sim.get_similarity = mock.Mock( side_effect=lambda from_r, to_r: sims[from_r][to_r]) fake_sim.refresh = mock.Mock() fake_nhood = AbstractRecordNeighbourhood() fake_nhood.get_neighbours = mock.Mock( side_effect=lambda r: nbours[r]) sut = InMemoryRecordNeighbourhood( fake_model, fake_sim, 50, nhood_factory=lambda dm, sim, num_nh: fake_nhood) assert sut.get_neighbours(record_caesar) == [] assert math.isnan(sut.get_similarity(record_caesar, record_brutus)) nbours[record_caesar] = [record_brutus] nbours[record_brutus] = [record_caesar] sims[record_caesar] = {record_brutus: 0.9} sims[record_brutus] = {record_caesar: 0.8} sut.refresh(set()) assert sut.get_neighbours(record_caesar) == nbours[record_caesar] assert sut.get_similarity(record_caesar, record_brutus) ==\ sims[record_caesar][record_brutus]
def test__in_mem_knn__refresh__underlying_data_model_and_similarity_is_refreshed(): fake_model = AbstractRecordDataModel() fake_model.get_records = mock.Mock(return_value=[]) fake_model.refresh = mock.Mock() fake_sim = AbstractRecordSimilarity() fake_sim.get_similarity = mock.Mock(return_value=1.0) fake_sim.refresh = mock.Mock() fake_nhood = AbstractRecordNeighbourhood() fake_nhood.get_neighbours = mock.Mock(return_value=[]) sut = InMemoryRecordNeighbourhood( fake_model, fake_sim, 50, nhood_factory=lambda dm, sim, num_nh: fake_nhood) sut = InMemoryRecordNeighbourhood(fake_model, fake_sim, 50) refreshed_components = set() sut.refresh(refreshed_components) assert fake_model in refreshed_components assert fake_sim in refreshed_components assert sut in refreshed_components assert fake_model.refresh.call_count == 1 assert fake_sim.refresh.call_count == 1
def test__in_mem_knn__refresh__data_is_reloaded(): record_caesar = 'caesar' record_brutus = 'brutus' nbours = {} sims = {} fake_model = AbstractRecordDataModel() fake_model.get_records = mock.Mock(side_effect=lambda: nbours.keys()) fake_model.refresh = mock.Mock() fake_sim = AbstractRecordSimilarity() fake_sim.get_similarity = mock.Mock( side_effect=lambda from_r, to_r: sims[from_r][to_r]) fake_sim.refresh = mock.Mock() fake_nhood = AbstractRecordNeighbourhood() fake_nhood.get_neighbours = mock.Mock(side_effect=lambda r: nbours[r]) sut = InMemoryRecordNeighbourhood( fake_model, fake_sim, 50, nhood_factory=lambda dm, sim, num_nh: fake_nhood) assert sut.get_neighbours(record_caesar) == [] assert math.isnan(sut.get_similarity(record_caesar, record_brutus)) nbours[record_caesar] = [record_brutus] nbours[record_brutus] = [record_caesar] sims[record_caesar] = {record_brutus: 0.9} sims[record_brutus] = {record_caesar: 0.8} sut.refresh(set()) assert sut.get_neighbours(record_caesar) == nbours[record_caesar] assert sut.get_similarity(record_caesar, record_brutus) ==\ sims[record_caesar][record_brutus]