Skip to content

Commit 9dd590f

Browse files
committed
ops: add specific + more complete tests for operations
1 parent a1d044c commit 9dd590f

2 files changed

Lines changed: 45 additions & 2 deletions

File tree

src/lenskit/operations.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def recommend(
5454
if items is not None and not isinstance(items, ItemList):
5555
items = ItemList(items)
5656
res = pipeline.run(node, query=query, n=n, items=items, _profile=profiler)
57-
if not isinstance(res, ItemList):
57+
if not isinstance(res, ItemList): # pragma: nocover
5858
raise TypeError("recommender pipeline did not return an item list")
5959

6060
return res
@@ -93,7 +93,7 @@ def score(
9393
if items is not None and not isinstance(items, ItemList):
9494
items = ItemList(items)
9595
res = pipeline.run(node, query=query, items=items, _profile=profiler)
96-
if not isinstance(res, ItemList):
96+
if not isinstance(res, ItemList): # pragma: nocover
9797
raise TypeError("scorer pipeline did not return an item list")
9898

9999
return res

tests/test_operations.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import numpy as np
2+
3+
from pytest import fixture
4+
5+
from lenskit import Pipeline, predict, recommend, score, topn_pipeline
6+
from lenskit.data import Dataset
7+
from lenskit.knn import ItemKNNScorer
8+
9+
10+
@fixture(scope="module")
11+
def pipeline(ml_ds: Dataset):
12+
pipe = topn_pipeline(ItemKNNScorer(max_nbrs=20), predicts_ratings=True)
13+
pipe.train(ml_ds)
14+
yield pipe
15+
16+
17+
def test_simple_recommend(pipeline: Pipeline):
18+
recs = recommend(pipeline, 10, n=10)
19+
assert len(recs) == 10
20+
21+
22+
def test_simple_recommend_items(ml_ds: Dataset, pipeline: Pipeline):
23+
items = ml_ds.items.ids()
24+
recs = recommend(pipeline, 10, n=10, items=items)
25+
assert len(recs) == 10
26+
27+
28+
def test_simple_score(ml_ds: Dataset, pipeline: Pipeline, rng: np.random.Generator):
29+
items = rng.choice(ml_ds.items.ids(), 50, replace=False)
30+
preds = score(pipeline, 10, items)
31+
assert len(preds) == 50
32+
scores = preds.scores()
33+
assert scores is not None
34+
assert np.any(np.isfinite(scores))
35+
36+
37+
def test_simple_predict(ml_ds: Dataset, pipeline: Pipeline, rng: np.random.Generator):
38+
items = rng.choice(ml_ds.items.ids(), 50, replace=False)
39+
preds = predict(pipeline, 10, items)
40+
assert len(preds) == 50
41+
scores = preds.scores()
42+
assert scores is not None
43+
assert np.all(np.isfinite(scores))

0 commit comments

Comments
 (0)