Source code for elliot.dataset.samplers.pointwise_pos_neg_sampler

"""
Module description:

"""

__version__ = '0.3.1'
__author__ = 'Vito Walter Anelli, Claudio Pomo'
__email__ = 'vitowalter.anelli@poliba.it, claudio.pomo@poliba.it'

import random
import numpy as np


[docs]class Sampler: def __init__(self, indexed_ratings): np.random.seed(42) random.seed(42) self._indexed_ratings = indexed_ratings self._users = list(self._indexed_ratings.keys()) self._nusers = len(self._users) self._items = list({k for a in self._indexed_ratings.values() for k in a.keys()}) self._nitems = len(self._items) self._ui_dict = {u: list(set(indexed_ratings[u])) for u in indexed_ratings} self._lui_dict = {u: len(v) for u, v in self._ui_dict.items()}
[docs] def step(self, events: int, batch_size: int): r_int = np.random.randint n_users = self._nusers n_items = self._nitems ui_dict = self._ui_dict lui_dict = self._lui_dict def sample(): u = r_int(n_users) ui = ui_dict[u] lui = lui_dict[u] if lui == n_items: sample() b = random.getrandbits(1) if b: i = ui[r_int(lui)] else: i = r_int(n_items) while i in ui: i = r_int(n_items) return u, i, b for batch_start in range(0, events, batch_size): u, i, b = map(np.array, zip(*[sample() for _ in range(batch_start, min(batch_start + batch_size, events))])) yield u, i, b