replay-rec 0.20.2__py3-none-any.whl → 0.20.3rc0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- replay/__init__.py +1 -1
- replay/data/nn/sequential_dataset.py +8 -2
- replay/experimental/__init__.py +0 -0
- replay/experimental/metrics/__init__.py +62 -0
- replay/experimental/metrics/base_metric.py +603 -0
- replay/experimental/metrics/coverage.py +97 -0
- replay/experimental/metrics/experiment.py +175 -0
- replay/experimental/metrics/hitrate.py +26 -0
- replay/experimental/metrics/map.py +30 -0
- replay/experimental/metrics/mrr.py +18 -0
- replay/experimental/metrics/ncis_precision.py +31 -0
- replay/experimental/metrics/ndcg.py +49 -0
- replay/experimental/metrics/precision.py +22 -0
- replay/experimental/metrics/recall.py +25 -0
- replay/experimental/metrics/rocauc.py +49 -0
- replay/experimental/metrics/surprisal.py +90 -0
- replay/experimental/metrics/unexpectedness.py +76 -0
- replay/experimental/models/__init__.py +50 -0
- replay/experimental/models/admm_slim.py +257 -0
- replay/experimental/models/base_neighbour_rec.py +200 -0
- replay/experimental/models/base_rec.py +1386 -0
- replay/experimental/models/base_torch_rec.py +234 -0
- replay/experimental/models/cql.py +454 -0
- replay/experimental/models/ddpg.py +932 -0
- replay/experimental/models/dt4rec/__init__.py +0 -0
- replay/experimental/models/dt4rec/dt4rec.py +189 -0
- replay/experimental/models/dt4rec/gpt1.py +401 -0
- replay/experimental/models/dt4rec/trainer.py +127 -0
- replay/experimental/models/dt4rec/utils.py +264 -0
- replay/experimental/models/extensions/spark_custom_models/__init__.py +0 -0
- replay/experimental/models/extensions/spark_custom_models/als_extension.py +792 -0
- replay/experimental/models/hierarchical_recommender.py +331 -0
- replay/experimental/models/implicit_wrap.py +131 -0
- replay/experimental/models/lightfm_wrap.py +303 -0
- replay/experimental/models/mult_vae.py +332 -0
- replay/experimental/models/neural_ts.py +986 -0
- replay/experimental/models/neuromf.py +406 -0
- replay/experimental/models/scala_als.py +293 -0
- replay/experimental/models/u_lin_ucb.py +115 -0
- replay/experimental/nn/data/__init__.py +1 -0
- replay/experimental/nn/data/schema_builder.py +102 -0
- replay/experimental/preprocessing/__init__.py +3 -0
- replay/experimental/preprocessing/data_preparator.py +839 -0
- replay/experimental/preprocessing/padder.py +229 -0
- replay/experimental/preprocessing/sequence_generator.py +208 -0
- replay/experimental/scenarios/__init__.py +1 -0
- replay/experimental/scenarios/obp_wrapper/__init__.py +8 -0
- replay/experimental/scenarios/obp_wrapper/obp_optuna_objective.py +74 -0
- replay/experimental/scenarios/obp_wrapper/replay_offline.py +261 -0
- replay/experimental/scenarios/obp_wrapper/utils.py +85 -0
- replay/experimental/scenarios/two_stages/__init__.py +0 -0
- replay/experimental/scenarios/two_stages/reranker.py +117 -0
- replay/experimental/scenarios/two_stages/two_stages_scenario.py +757 -0
- replay/experimental/utils/__init__.py +0 -0
- replay/experimental/utils/logger.py +24 -0
- replay/experimental/utils/model_handler.py +186 -0
- replay/experimental/utils/session_handler.py +44 -0
- {replay_rec-0.20.2.dist-info → replay_rec-0.20.3rc0.dist-info}/METADATA +11 -17
- {replay_rec-0.20.2.dist-info → replay_rec-0.20.3rc0.dist-info}/RECORD +62 -7
- {replay_rec-0.20.2.dist-info → replay_rec-0.20.3rc0.dist-info}/WHEEL +0 -0
- {replay_rec-0.20.2.dist-info → replay_rec-0.20.3rc0.dist-info}/licenses/LICENSE +0 -0
- {replay_rec-0.20.2.dist-info → replay_rec-0.20.3rc0.dist-info}/licenses/NOTICE +0 -0
|
File without changes
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def get_logger(
|
|
5
|
+
name,
|
|
6
|
+
level=logging.INFO,
|
|
7
|
+
format_str="%(asctime)s [%(pathname)s:%(lineno)s - %(levelname)s ] %(message)s",
|
|
8
|
+
date_format="%Y-%m-%d %H:%M:%S",
|
|
9
|
+
file=False,
|
|
10
|
+
):
|
|
11
|
+
"""
|
|
12
|
+
Get python logger instance
|
|
13
|
+
"""
|
|
14
|
+
logger = logging.getLogger(name)
|
|
15
|
+
logger.setLevel(level)
|
|
16
|
+
|
|
17
|
+
if not logger.hasHandlers():
|
|
18
|
+
handler = logging.StreamHandler() if not file else logging.FileHandler(name)
|
|
19
|
+
handler.setLevel(level)
|
|
20
|
+
formatter = logging.Formatter(fmt=format_str, datefmt=date_format)
|
|
21
|
+
handler.setFormatter(formatter)
|
|
22
|
+
logger.addHandler(handler)
|
|
23
|
+
|
|
24
|
+
return logger
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from inspect import getfullargspec
|
|
3
|
+
from os.path import join
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Union
|
|
6
|
+
|
|
7
|
+
from replay.experimental.models.base_rec import BaseRecommender
|
|
8
|
+
from replay.experimental.preprocessing import Indexer
|
|
9
|
+
from replay.utils import PYSPARK_AVAILABLE
|
|
10
|
+
from replay.utils.session_handler import State
|
|
11
|
+
from replay.utils.spark_utils import load_pickled_from_parquet, save_picklable_to_parquet
|
|
12
|
+
|
|
13
|
+
if PYSPARK_AVAILABLE:
|
|
14
|
+
import pyspark.sql.types as st
|
|
15
|
+
from pyspark.ml.feature import IndexToString, StringIndexerModel
|
|
16
|
+
from pyspark.sql import SparkSession
|
|
17
|
+
|
|
18
|
+
from replay.utils.model_handler import get_fs
|
|
19
|
+
|
|
20
|
+
def get_list_of_paths(spark: SparkSession, dir_path: str):
|
|
21
|
+
"""
|
|
22
|
+
Returns list of paths to files in the `dir_path`
|
|
23
|
+
|
|
24
|
+
:param spark: spark session
|
|
25
|
+
:param dir_path: path to dir in hdfs or local disk
|
|
26
|
+
:return: list of paths to files
|
|
27
|
+
"""
|
|
28
|
+
fs = get_fs(spark)
|
|
29
|
+
statuses = fs.listStatus(spark._jvm.org.apache.hadoop.fs.Path(dir_path))
|
|
30
|
+
return [str(f.getPath()) for f in statuses]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def save(model: BaseRecommender, path: Union[str, Path], overwrite: bool = False):
|
|
34
|
+
"""
|
|
35
|
+
Save fitted model to disk as a folder
|
|
36
|
+
|
|
37
|
+
:param model: Trained recommender
|
|
38
|
+
:param path: destination where model files will be stored
|
|
39
|
+
:return:
|
|
40
|
+
"""
|
|
41
|
+
if isinstance(path, Path):
|
|
42
|
+
path = str(path)
|
|
43
|
+
|
|
44
|
+
spark = State().session
|
|
45
|
+
|
|
46
|
+
fs = get_fs(spark)
|
|
47
|
+
if not overwrite:
|
|
48
|
+
is_exists = fs.exists(spark._jvm.org.apache.hadoop.fs.Path(path))
|
|
49
|
+
if is_exists:
|
|
50
|
+
msg = f"Path '{path}' already exists. Mode is 'overwrite = False'."
|
|
51
|
+
raise FileExistsError(msg)
|
|
52
|
+
|
|
53
|
+
fs.mkdirs(spark._jvm.org.apache.hadoop.fs.Path(path))
|
|
54
|
+
model._save_model(join(path, "model"))
|
|
55
|
+
|
|
56
|
+
init_args = model._init_args
|
|
57
|
+
init_args["_model_name"] = str(model)
|
|
58
|
+
sc = spark.sparkContext
|
|
59
|
+
df = spark.read.json(sc.parallelize([json.dumps(init_args)]))
|
|
60
|
+
df.coalesce(1).write.mode("overwrite").option("ignoreNullFields", "false").json(join(path, "init_args.json"))
|
|
61
|
+
|
|
62
|
+
dataframes = model._dataframes
|
|
63
|
+
df_path = join(path, "dataframes")
|
|
64
|
+
for name, df in dataframes.items():
|
|
65
|
+
if df is not None:
|
|
66
|
+
df.write.mode("overwrite").parquet(join(df_path, name))
|
|
67
|
+
|
|
68
|
+
if hasattr(model, "fit_users"):
|
|
69
|
+
model.fit_users.write.mode("overwrite").parquet(join(df_path, "fit_users"))
|
|
70
|
+
if hasattr(model, "fit_items"):
|
|
71
|
+
model.fit_items.write.mode("overwrite").parquet(join(df_path, "fit_items"))
|
|
72
|
+
if hasattr(model, "study"):
|
|
73
|
+
save_picklable_to_parquet(model.study, join(path, "study"))
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def load(path: str, model_type=None) -> BaseRecommender:
|
|
77
|
+
"""
|
|
78
|
+
Load saved model from disk
|
|
79
|
+
|
|
80
|
+
:param path: path to model folder
|
|
81
|
+
:return: Restored trained model
|
|
82
|
+
"""
|
|
83
|
+
spark = State().session
|
|
84
|
+
args = spark.read.json(join(path, "init_args.json")).first().asDict(recursive=True)
|
|
85
|
+
name = args["_model_name"]
|
|
86
|
+
del args["_model_name"]
|
|
87
|
+
|
|
88
|
+
model_class = model_type if model_type is not None else globals()[name]
|
|
89
|
+
if name == "CQL":
|
|
90
|
+
for a in args:
|
|
91
|
+
if isinstance(args[a], dict) and "type" in args[a] and args[a]["type"] == "none":
|
|
92
|
+
args[a]["params"] = {}
|
|
93
|
+
init_args = getfullargspec(model_class.__init__).args
|
|
94
|
+
init_args.remove("self")
|
|
95
|
+
extra_args = set(args) - set(init_args)
|
|
96
|
+
if len(extra_args) > 0:
|
|
97
|
+
extra_args = {key: args[key] for key in args}
|
|
98
|
+
init_args = {key: args[key] for key in init_args}
|
|
99
|
+
else:
|
|
100
|
+
init_args = args
|
|
101
|
+
extra_args = {}
|
|
102
|
+
|
|
103
|
+
model = model_class(**init_args)
|
|
104
|
+
for arg in extra_args:
|
|
105
|
+
model.arg = extra_args[arg]
|
|
106
|
+
|
|
107
|
+
dataframes_paths = get_list_of_paths(spark, join(path, "dataframes"))
|
|
108
|
+
for dataframe_path in dataframes_paths:
|
|
109
|
+
df = spark.read.parquet(dataframe_path)
|
|
110
|
+
attr_name = dataframe_path.split("/")[-1]
|
|
111
|
+
setattr(model, attr_name, df)
|
|
112
|
+
|
|
113
|
+
model._load_model(join(path, "model"))
|
|
114
|
+
fs = get_fs(spark)
|
|
115
|
+
model.study = (
|
|
116
|
+
load_pickled_from_parquet(join(path, "study"))
|
|
117
|
+
if fs.exists(spark._jvm.org.apache.hadoop.fs.Path(join(path, "study")))
|
|
118
|
+
else None
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
return model
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def save_indexer(indexer: Indexer, path: Union[str, Path], overwrite: bool = False):
|
|
125
|
+
"""
|
|
126
|
+
Save fitted indexer to disk as a folder
|
|
127
|
+
|
|
128
|
+
:param indexer: Trained indexer
|
|
129
|
+
:param path: destination where indexer files will be stored
|
|
130
|
+
"""
|
|
131
|
+
if isinstance(path, Path):
|
|
132
|
+
path = str(path)
|
|
133
|
+
|
|
134
|
+
spark = State().session
|
|
135
|
+
|
|
136
|
+
if not overwrite:
|
|
137
|
+
fs = get_fs(spark)
|
|
138
|
+
is_exists = fs.exists(spark._jvm.org.apache.hadoop.fs.Path(path))
|
|
139
|
+
if is_exists:
|
|
140
|
+
msg = f"Path '{path}' already exists. Mode is 'overwrite = False'."
|
|
141
|
+
raise FileExistsError(msg)
|
|
142
|
+
|
|
143
|
+
init_args = indexer._init_args
|
|
144
|
+
init_args["user_type"] = str(indexer.user_type)
|
|
145
|
+
init_args["item_type"] = str(indexer.item_type)
|
|
146
|
+
sc = spark.sparkContext
|
|
147
|
+
df = spark.read.json(sc.parallelize([json.dumps(init_args)]))
|
|
148
|
+
df.coalesce(1).write.mode("overwrite").json(join(path, "init_args.json"))
|
|
149
|
+
|
|
150
|
+
indexer.user_indexer.write().overwrite().save(join(path, "user_indexer"))
|
|
151
|
+
indexer.item_indexer.write().overwrite().save(join(path, "item_indexer"))
|
|
152
|
+
indexer.inv_user_indexer.write().overwrite().save(join(path, "inv_user_indexer"))
|
|
153
|
+
indexer.inv_item_indexer.write().overwrite().save(join(path, "inv_item_indexer"))
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def load_indexer(path: str) -> Indexer:
|
|
157
|
+
"""
|
|
158
|
+
Load saved indexer from disk
|
|
159
|
+
|
|
160
|
+
:param path: path to folder
|
|
161
|
+
:return: restored Indexer
|
|
162
|
+
"""
|
|
163
|
+
spark = State().session
|
|
164
|
+
args = spark.read.json(join(path, "init_args.json")).first().asDict()
|
|
165
|
+
|
|
166
|
+
user_type = args["user_type"]
|
|
167
|
+
del args["user_type"]
|
|
168
|
+
item_type = args["item_type"]
|
|
169
|
+
del args["item_type"]
|
|
170
|
+
|
|
171
|
+
indexer = Indexer(**args)
|
|
172
|
+
|
|
173
|
+
if user_type.endswith("()"):
|
|
174
|
+
user_type = user_type[:-2]
|
|
175
|
+
item_type = item_type[:-2]
|
|
176
|
+
user_type = getattr(st, user_type)
|
|
177
|
+
item_type = getattr(st, item_type)
|
|
178
|
+
indexer.user_type = user_type()
|
|
179
|
+
indexer.item_type = item_type()
|
|
180
|
+
|
|
181
|
+
indexer.user_indexer = StringIndexerModel.load(join(path, "user_indexer"))
|
|
182
|
+
indexer.item_indexer = StringIndexerModel.load(join(path, "item_indexer"))
|
|
183
|
+
indexer.inv_user_indexer = IndexToString.load(join(path, "inv_user_indexer"))
|
|
184
|
+
indexer.inv_item_indexer = IndexToString.load(join(path, "inv_item_indexer"))
|
|
185
|
+
|
|
186
|
+
return indexer
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
import torch
|
|
4
|
+
|
|
5
|
+
from replay.utils.session_handler import Borg, get_spark_session, logger_with_settings
|
|
6
|
+
from replay.utils.types import PYSPARK_AVAILABLE, MissingImport
|
|
7
|
+
|
|
8
|
+
if PYSPARK_AVAILABLE:
|
|
9
|
+
from pyspark.sql import SparkSession
|
|
10
|
+
else:
|
|
11
|
+
SparkSession = MissingImport
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class State(Borg):
|
|
15
|
+
"""
|
|
16
|
+
All modules look for Spark session via this class. You can put your own session here.
|
|
17
|
+
|
|
18
|
+
Other parameters are stored here too: ``default device`` for ``pytorch`` (CPU/CUDA)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
session: Optional[SparkSession] = None,
|
|
24
|
+
device: Optional[torch.device] = None,
|
|
25
|
+
):
|
|
26
|
+
Borg.__init__(self)
|
|
27
|
+
if not hasattr(self, "logger_set"):
|
|
28
|
+
self.logger = logger_with_settings()
|
|
29
|
+
self.logger_set = True
|
|
30
|
+
|
|
31
|
+
if session is None:
|
|
32
|
+
if not hasattr(self, "session"):
|
|
33
|
+
self.session = get_spark_session()
|
|
34
|
+
else:
|
|
35
|
+
self.session = session
|
|
36
|
+
|
|
37
|
+
if device is None:
|
|
38
|
+
if not hasattr(self, "device"):
|
|
39
|
+
if torch.cuda.is_available():
|
|
40
|
+
self.device = torch.device(f"cuda:{torch.cuda.current_device()}")
|
|
41
|
+
else:
|
|
42
|
+
self.device = torch.device("cpu")
|
|
43
|
+
else:
|
|
44
|
+
self.device = device
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: replay-rec
|
|
3
|
-
Version: 0.20.
|
|
3
|
+
Version: 0.20.3rc0
|
|
4
4
|
Summary: RecSys Library
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
@@ -14,29 +14,23 @@ Classifier: Intended Audience :: Developers
|
|
|
14
14
|
Classifier: Intended Audience :: Science/Research
|
|
15
15
|
Classifier: Natural Language :: English
|
|
16
16
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Requires-Dist: lightning (
|
|
21
|
-
Requires-Dist:
|
|
22
|
-
Requires-Dist: lightning ; extra == "torch-cpu"
|
|
17
|
+
Requires-Dist: d3rlpy (>=2.8.1,<2.9)
|
|
18
|
+
Requires-Dist: implicit (>=0.7.2,<0.8)
|
|
19
|
+
Requires-Dist: lightautoml (>=0.4.1,<0.5)
|
|
20
|
+
Requires-Dist: lightning (>=2.0.2,<=2.4.0)
|
|
21
|
+
Requires-Dist: numba (>=0.50,<1)
|
|
23
22
|
Requires-Dist: numpy (>=1.20.0,<2)
|
|
24
23
|
Requires-Dist: pandas (>=1.3.5,<2.4.0)
|
|
25
24
|
Requires-Dist: polars (<2.0)
|
|
26
|
-
Requires-Dist: psutil (<=7.0.0)
|
|
27
|
-
Requires-Dist: psutil ; extra == "spark"
|
|
25
|
+
Requires-Dist: psutil (<=7.0.0)
|
|
28
26
|
Requires-Dist: pyarrow (<22.0)
|
|
29
|
-
Requires-Dist: pyspark (>=3.0,<3.5)
|
|
30
|
-
Requires-Dist:
|
|
31
|
-
Requires-Dist:
|
|
32
|
-
Requires-Dist: pytorch-optimizer ; extra == "torch"
|
|
33
|
-
Requires-Dist: pytorch-optimizer ; extra == "torch-cpu"
|
|
27
|
+
Requires-Dist: pyspark (>=3.0,<3.5)
|
|
28
|
+
Requires-Dist: pytorch-optimizer (>=3.8.0,<4)
|
|
29
|
+
Requires-Dist: sb-obp (>=0.5.10,<0.6)
|
|
34
30
|
Requires-Dist: scikit-learn (>=1.6.1,<1.7.0)
|
|
35
31
|
Requires-Dist: scipy (>=1.8.1,<2.0.0)
|
|
36
32
|
Requires-Dist: setuptools
|
|
37
|
-
Requires-Dist: torch (>=1.8,<2.9.0)
|
|
38
|
-
Requires-Dist: torch ; extra == "torch"
|
|
39
|
-
Requires-Dist: torch ; extra == "torch-cpu"
|
|
33
|
+
Requires-Dist: torch (>=1.8,<2.9.0)
|
|
40
34
|
Requires-Dist: tqdm (>=4.67,<5)
|
|
41
35
|
Project-URL: Homepage, https://sb-ai-lab.github.io/RePlay/
|
|
42
36
|
Project-URL: Repository, https://github.com/sb-ai-lab/RePlay
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
replay/__init__.py,sha256=
|
|
1
|
+
replay/__init__.py,sha256=UO9-zAzQ0Zw6zeU2AwtbXyTUIsneXgvNK-oTutQNSEc,233
|
|
2
2
|
replay/data/__init__.py,sha256=g5bKRyF76QL_BqlED-31RnS8pBdcyj9loMsx5vAG_0E,301
|
|
3
3
|
replay/data/dataset.py,sha256=yQDc8lfphQYfHpm_T1MhnG8_GyM4ONyxJoFc1rUgdJ8,30755
|
|
4
4
|
replay/data/dataset_utils/__init__.py,sha256=9wUvG8ZwGUvuzLU4zQI5FDcH0WVVo5YLN2ey3DterP0,55
|
|
@@ -6,11 +6,66 @@ replay/data/dataset_utils/dataset_label_encoder.py,sha256=bxuJPhShFZBok7bQZYGNMV
|
|
|
6
6
|
replay/data/nn/__init__.py,sha256=nj2Ep-tduuQkc-TnBkvN8-rDnFbcWO2oZrfcXl9M3C8,1122
|
|
7
7
|
replay/data/nn/schema.py,sha256=h1KgaNV-hgN9Vpt24c92EmeMpm_8W0s9a2M0wLxJHYk,17101
|
|
8
8
|
replay/data/nn/sequence_tokenizer.py,sha256=_9fBF-84jdn8Pa3pFKIr6prUjNYCc6BVzwRl9VSleKQ,37419
|
|
9
|
-
replay/data/nn/sequential_dataset.py,sha256=
|
|
9
|
+
replay/data/nn/sequential_dataset.py,sha256=JNmPjVrrBhModj-yrkExl28oCm1gbdU8z4nMfB5PQko,11565
|
|
10
10
|
replay/data/nn/torch_sequential_dataset.py,sha256=QSh4IM2vzAF095_ZMC1gMqZj9slHXos9gfx_R_DlpGM,11545
|
|
11
11
|
replay/data/nn/utils.py,sha256=Ic3G4yZRIzBYXLmwP1VstlZXPNR7AYGCc5EyZAERp5c,3297
|
|
12
12
|
replay/data/schema.py,sha256=JmYLCrNgBS5oq4O_PT724Gr1pDurHEykcqV8Xaj0XTw,15922
|
|
13
13
|
replay/data/spark_schema.py,sha256=4o0Kn_fjwz2-9dBY3q46F9PL0F3E7jdVpIlX7SG3OZI,1111
|
|
14
|
+
replay/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
+
replay/experimental/metrics/__init__.py,sha256=bdQogGbEDVAeH7Ejbb6vpw7bP6CYhftTu_DQuoFRuCA,2861
|
|
16
|
+
replay/experimental/metrics/base_metric.py,sha256=0ro9VoSnPtPAximnlcgmQaMNg9zoUN2AHAH_2WgfZiQ,22663
|
|
17
|
+
replay/experimental/metrics/coverage.py,sha256=UqYm-WtAlBFZ3kqv8PyLo4qqKiIXmR_CQFAl6H_YdqA,3150
|
|
18
|
+
replay/experimental/metrics/experiment.py,sha256=pD2Dyyg4PM1HjbrNrhAspZJP3B-i2So205qBChRGwwc,7337
|
|
19
|
+
replay/experimental/metrics/hitrate.py,sha256=TfWJrUyZXabdMr4tn8zqUPGDcYy2yphVCzXmLSHCxY0,675
|
|
20
|
+
replay/experimental/metrics/map.py,sha256=S4dKiMpYR0_pu0bqioGMT0kIC1s2aojFP4rddBqMPtM,921
|
|
21
|
+
replay/experimental/metrics/mrr.py,sha256=q6I1Cndlwr716mMuYtTMu0lN8Rrp9khxhb49OM2IpV8,530
|
|
22
|
+
replay/experimental/metrics/ncis_precision.py,sha256=yrErOhBZvZdNpQPx_AXyktDJatqdWRIHNMyei0QDJtQ,1088
|
|
23
|
+
replay/experimental/metrics/ndcg.py,sha256=q3KTsyZCrfvcpEjEnR_kWVB9ZaTFRxnoNRAr2WD0TrU,1538
|
|
24
|
+
replay/experimental/metrics/precision.py,sha256=U9pD9yRGeT8uH32BTyQ-W5qsAnbFWu-pqy4XfkcXfCM,664
|
|
25
|
+
replay/experimental/metrics/recall.py,sha256=5xRPGxfbVoDFEI5E6dVlZpT4RvnDlWzaktyoqh3a8mc,774
|
|
26
|
+
replay/experimental/metrics/rocauc.py,sha256=yq4vW2_bXO8HCjREBZVrHMKeZ054LYvjJmLJTXWPfQA,1675
|
|
27
|
+
replay/experimental/metrics/surprisal.py,sha256=CK4_zed2bSMDwC7ZBCS8d8RwGEqt8bh3w3fTpjKiK6Y,3052
|
|
28
|
+
replay/experimental/metrics/unexpectedness.py,sha256=JQQXEYHtQM8nqp7X2He4E9ZYwbpdENaK8oQG7sUQT3s,2621
|
|
29
|
+
replay/experimental/models/__init__.py,sha256=yeu0PAkqWNqNLDnUYpg0_vpkWT8tG8KmRMybodVFkZ4,1709
|
|
30
|
+
replay/experimental/models/admm_slim.py,sha256=dDg2c_5Lk8acykirtsv38Jg1l6kgAoBhRvPHPv5Vfis,8654
|
|
31
|
+
replay/experimental/models/base_neighbour_rec.py,sha256=Q2C4rle9FeVIncqgMuhLV6qZbPj2Bz8W_Ao8iQu31TU,7387
|
|
32
|
+
replay/experimental/models/base_rec.py,sha256=AmN6-PgIaNzD-sMIndMuRA3TJ0WZBbowCjaSTTgiYrY,54150
|
|
33
|
+
replay/experimental/models/base_torch_rec.py,sha256=mwbbsR-sQuQAFC1d8X2k0zP3iJeEP-X5nAaR3IV7Sqg,8105
|
|
34
|
+
replay/experimental/models/cql.py,sha256=ItTukqhH3V-PItVPawET9zO9tG4D8R4xKzz3tqKMjSc,19619
|
|
35
|
+
replay/experimental/models/ddpg.py,sha256=bzX4KvkuIecYA4bkFB1BnLKE3zqteujhpvsxAXEnKoM,32266
|
|
36
|
+
replay/experimental/models/dt4rec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
|
+
replay/experimental/models/dt4rec/dt4rec.py,sha256=zcxn2MjrJg8eYqfGwfK80UjH2-uwNDg4PBbmQZz7Le0,5895
|
|
38
|
+
replay/experimental/models/dt4rec/gpt1.py,sha256=T3buFtYyF6Fh6sW6f9dUZFcFEnQdljItbRa22CiKb0w,14044
|
|
39
|
+
replay/experimental/models/dt4rec/trainer.py,sha256=YeaJ8mnoYZqnPwm1P9qOYb8GzgFC5At-JeSDcvG2V2o,3859
|
|
40
|
+
replay/experimental/models/dt4rec/utils.py,sha256=UF--cukjFB3uwzqaVHdCS3ik2qTtw97tzbSFGPkDfE8,8153
|
|
41
|
+
replay/experimental/models/extensions/spark_custom_models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
|
+
replay/experimental/models/extensions/spark_custom_models/als_extension.py,sha256=R9Xj5Yew5eH3dMJ9qfIyhBg4NeMv-wXVEISgzCwFQz0,25846
|
|
43
|
+
replay/experimental/models/hierarchical_recommender.py,sha256=BqnEFBppKawt8Xx5lzBWk6qnmdCrZ7c2hpKj3mi1GvU,11441
|
|
44
|
+
replay/experimental/models/implicit_wrap.py,sha256=8F-f-CaStmlNHwphu-yu8o4Aft08NKDD_SqqH0zp1Uo,4655
|
|
45
|
+
replay/experimental/models/lightfm_wrap.py,sha256=rA9T2vGjrbt_GJV1XccYYsrs9qtgDtqVJCWBHFYrm4k,11329
|
|
46
|
+
replay/experimental/models/mult_vae.py,sha256=l-6g-2fIs80vxBl9VGY4FrJannAXrzsQOyGNuHU8tDs,11601
|
|
47
|
+
replay/experimental/models/neural_ts.py,sha256=oCqStgGg5CpGFAv1dC-3ODmK9nI05evzJ3XKBDQhgAo,42535
|
|
48
|
+
replay/experimental/models/neuromf.py,sha256=acC50kxYlctriNGqyOEkq57Iu4icUvZasyWFeRUJans,14386
|
|
49
|
+
replay/experimental/models/scala_als.py,sha256=6aMl8hUFR2J_nI5U8Z_-5BxfeATiWnC8zdj1C0AFbm4,10751
|
|
50
|
+
replay/experimental/models/u_lin_ucb.py,sha256=-gu6meOYeSwP6N8ILtwasWYj4Mbs6EJEFQXUHE8N_lY,3750
|
|
51
|
+
replay/experimental/nn/data/__init__.py,sha256=5EAF-FNd7xhkUpTq_5MyVcPXBD81mJCwYrcbhdGOWjE,48
|
|
52
|
+
replay/experimental/nn/data/schema_builder.py,sha256=nfE0-bVgYUwzyhNTTcXUWhfNBAZQLHWenM6-zEglqps,3301
|
|
53
|
+
replay/experimental/preprocessing/__init__.py,sha256=uMyeyQ_GKqjLhVGwhrEk3NLhhzS0DKi5xGo3VF4WkiA,130
|
|
54
|
+
replay/experimental/preprocessing/data_preparator.py,sha256=-yqWZT06iEYsY7rCSGRAgLcp6o7jvlsU431HspHQ2o4,35940
|
|
55
|
+
replay/experimental/preprocessing/padder.py,sha256=uxE6WlmYNd9kbACMEidxG1L19G5Rk0gQbvpN_TosMZ4,9558
|
|
56
|
+
replay/experimental/preprocessing/sequence_generator.py,sha256=vFtLkq9MuLGThPsa67103qlcMLYLfnAkR_HI1FXPwjw,9047
|
|
57
|
+
replay/experimental/scenarios/__init__.py,sha256=gWFLCkLyOmOppvbRMK7C3UMlMpcbIgiGVolSH6LPgWA,91
|
|
58
|
+
replay/experimental/scenarios/obp_wrapper/__init__.py,sha256=ZOJgpjRsmhXTpzGumk3AALKmstNBachtu_hOXUIPY5s,434
|
|
59
|
+
replay/experimental/scenarios/obp_wrapper/obp_optuna_objective.py,sha256=swwcot05a8GzIVhEKpfmjG16CuciItVuddPaOjCKo9o,2543
|
|
60
|
+
replay/experimental/scenarios/obp_wrapper/replay_offline.py,sha256=9ZP17steBiTh_KO37NnXWyN5LuPpABPhL_QG4JJHf7I,9622
|
|
61
|
+
replay/experimental/scenarios/obp_wrapper/utils.py,sha256=Uv_fqyJDt69vIdrw-Y9orLLzyHG0ko8svza0Hs_a87Q,3233
|
|
62
|
+
replay/experimental/scenarios/two_stages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
63
|
+
replay/experimental/scenarios/two_stages/reranker.py,sha256=NQhooA3OXLAh_PwydBNU2DGRRGPq2j2R0SSHtDM7hlg,4238
|
|
64
|
+
replay/experimental/scenarios/two_stages/two_stages_scenario.py,sha256=u41ymdhx0MS1I08VDjJ2UhXpSqsfTA1x9Hbz1tOaWLY,29822
|
|
65
|
+
replay/experimental/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
66
|
+
replay/experimental/utils/logger.py,sha256=UwLowaeOG17sDEe32LiZel8MnjSTzeW7J3uLG1iwLuA,639
|
|
67
|
+
replay/experimental/utils/model_handler.py,sha256=Rfj57E1R_XMEEigHNZa9a-rzEsyLWSDsgKfXoRzWWdg,6426
|
|
68
|
+
replay/experimental/utils/session_handler.py,sha256=H0C-Q2pqrs_5aDvoAkRMZuS5qu07uhu6g5FEL3NJiic,1305
|
|
14
69
|
replay/metrics/__init__.py,sha256=j0PGvUehaPEZMNo9SQwJsnvzrS4bam9eHrRMQFLnMjY,2813
|
|
15
70
|
replay/metrics/base_metric.py,sha256=ejtwFHktN4J8Fi1HIM3w0zlMAd8nO7-XpFi2D1iHXUQ,16010
|
|
16
71
|
replay/metrics/categorical_diversity.py,sha256=3tp8n457Ob4gjM-UTB5N19u9WAF7fLDkWKk-Mth-Vzc,10769
|
|
@@ -131,8 +186,8 @@ replay/utils/session_handler.py,sha256=fQo2wseow8yuzKnEXT-aYAXcQIgRbTTXp0v7g1VVi
|
|
|
131
186
|
replay/utils/spark_utils.py,sha256=GbRp-MuUoO3Pc4chFvlmo9FskSlRLeNlC3Go5pEJ6Ok,27411
|
|
132
187
|
replay/utils/time.py,sha256=J8asoQBytPcNw-BLGADYIsKeWhIoN1H5hKiX9t2AMqo,9376
|
|
133
188
|
replay/utils/types.py,sha256=rD9q9CqEXgF4yy512Hv2nXclvwcnfodOnhBZ1HSUI4c,1260
|
|
134
|
-
replay_rec-0.20.
|
|
135
|
-
replay_rec-0.20.
|
|
136
|
-
replay_rec-0.20.
|
|
137
|
-
replay_rec-0.20.
|
|
138
|
-
replay_rec-0.20.
|
|
189
|
+
replay_rec-0.20.3rc0.dist-info/METADATA,sha256=LCtP5r4PZP-jTKxRCFkk1mYq6qqUNS4rgjcDfmF3by8,13155
|
|
190
|
+
replay_rec-0.20.3rc0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
191
|
+
replay_rec-0.20.3rc0.dist-info/licenses/LICENSE,sha256=rPmcA7UrHxBChEAAlJyE24qUWKKl9yLQXxFsKeg_LX4,11344
|
|
192
|
+
replay_rec-0.20.3rc0.dist-info/licenses/NOTICE,sha256=k0bo4KHiHLRax5K3XKTTrf2Fi8V91mJ-R3FMdh6Reg0,2002
|
|
193
|
+
replay_rec-0.20.3rc0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|