replay-rec 0.19.0rc0__py3-none-any.whl → 0.20.0__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.
Files changed (108) hide show
  1. replay/__init__.py +6 -2
  2. replay/data/dataset.py +9 -9
  3. replay/data/nn/__init__.py +6 -6
  4. replay/data/nn/sequence_tokenizer.py +44 -38
  5. replay/data/nn/sequential_dataset.py +13 -8
  6. replay/data/nn/torch_sequential_dataset.py +14 -13
  7. replay/data/nn/utils.py +1 -1
  8. replay/metrics/base_metric.py +1 -1
  9. replay/metrics/coverage.py +7 -11
  10. replay/metrics/experiment.py +3 -3
  11. replay/metrics/offline_metrics.py +2 -2
  12. replay/models/__init__.py +19 -0
  13. replay/models/association_rules.py +1 -4
  14. replay/models/base_neighbour_rec.py +6 -9
  15. replay/models/base_rec.py +44 -293
  16. replay/models/cat_pop_rec.py +2 -1
  17. replay/models/common.py +69 -0
  18. replay/models/extensions/ann/ann_mixin.py +30 -25
  19. replay/models/extensions/ann/index_builders/driver_hnswlib_index_builder.py +1 -1
  20. replay/models/extensions/ann/utils.py +4 -3
  21. replay/models/knn.py +18 -17
  22. replay/models/nn/sequential/bert4rec/dataset.py +1 -1
  23. replay/models/nn/sequential/callbacks/prediction_callbacks.py +2 -2
  24. replay/models/nn/sequential/compiled/__init__.py +10 -0
  25. replay/models/nn/sequential/compiled/base_compiled_model.py +3 -1
  26. replay/models/nn/sequential/compiled/bert4rec_compiled.py +11 -2
  27. replay/models/nn/sequential/compiled/sasrec_compiled.py +5 -1
  28. replay/models/nn/sequential/sasrec/dataset.py +1 -1
  29. replay/models/nn/sequential/sasrec/model.py +1 -1
  30. replay/models/optimization/__init__.py +14 -0
  31. replay/models/optimization/optuna_mixin.py +279 -0
  32. replay/{optimization → models/optimization}/optuna_objective.py +13 -15
  33. replay/models/slim.py +2 -4
  34. replay/models/word2vec.py +7 -12
  35. replay/preprocessing/discretizer.py +1 -2
  36. replay/preprocessing/history_based_fp.py +1 -1
  37. replay/preprocessing/label_encoder.py +1 -1
  38. replay/splitters/cold_user_random_splitter.py +13 -7
  39. replay/splitters/last_n_splitter.py +17 -10
  40. replay/utils/__init__.py +6 -2
  41. replay/utils/common.py +4 -2
  42. replay/utils/model_handler.py +11 -31
  43. replay/utils/session_handler.py +2 -2
  44. replay/utils/spark_utils.py +2 -2
  45. replay/utils/types.py +28 -18
  46. replay/utils/warnings.py +26 -0
  47. {replay_rec-0.19.0rc0.dist-info → replay_rec-0.20.0.dist-info}/METADATA +56 -40
  48. replay_rec-0.20.0.dist-info/RECORD +139 -0
  49. {replay_rec-0.19.0rc0.dist-info → replay_rec-0.20.0.dist-info}/WHEEL +1 -1
  50. replay/experimental/__init__.py +0 -0
  51. replay/experimental/metrics/__init__.py +0 -62
  52. replay/experimental/metrics/base_metric.py +0 -602
  53. replay/experimental/metrics/coverage.py +0 -97
  54. replay/experimental/metrics/experiment.py +0 -175
  55. replay/experimental/metrics/hitrate.py +0 -26
  56. replay/experimental/metrics/map.py +0 -30
  57. replay/experimental/metrics/mrr.py +0 -18
  58. replay/experimental/metrics/ncis_precision.py +0 -31
  59. replay/experimental/metrics/ndcg.py +0 -49
  60. replay/experimental/metrics/precision.py +0 -22
  61. replay/experimental/metrics/recall.py +0 -25
  62. replay/experimental/metrics/rocauc.py +0 -49
  63. replay/experimental/metrics/surprisal.py +0 -90
  64. replay/experimental/metrics/unexpectedness.py +0 -76
  65. replay/experimental/models/__init__.py +0 -13
  66. replay/experimental/models/admm_slim.py +0 -205
  67. replay/experimental/models/base_neighbour_rec.py +0 -204
  68. replay/experimental/models/base_rec.py +0 -1340
  69. replay/experimental/models/base_torch_rec.py +0 -234
  70. replay/experimental/models/cql.py +0 -454
  71. replay/experimental/models/ddpg.py +0 -923
  72. replay/experimental/models/dt4rec/__init__.py +0 -0
  73. replay/experimental/models/dt4rec/dt4rec.py +0 -189
  74. replay/experimental/models/dt4rec/gpt1.py +0 -401
  75. replay/experimental/models/dt4rec/trainer.py +0 -127
  76. replay/experimental/models/dt4rec/utils.py +0 -265
  77. replay/experimental/models/extensions/spark_custom_models/__init__.py +0 -0
  78. replay/experimental/models/extensions/spark_custom_models/als_extension.py +0 -792
  79. replay/experimental/models/hierarchical_recommender.py +0 -331
  80. replay/experimental/models/implicit_wrap.py +0 -131
  81. replay/experimental/models/lightfm_wrap.py +0 -302
  82. replay/experimental/models/mult_vae.py +0 -332
  83. replay/experimental/models/neural_ts.py +0 -986
  84. replay/experimental/models/neuromf.py +0 -406
  85. replay/experimental/models/scala_als.py +0 -296
  86. replay/experimental/models/u_lin_ucb.py +0 -115
  87. replay/experimental/nn/data/__init__.py +0 -1
  88. replay/experimental/nn/data/schema_builder.py +0 -102
  89. replay/experimental/preprocessing/__init__.py +0 -3
  90. replay/experimental/preprocessing/data_preparator.py +0 -839
  91. replay/experimental/preprocessing/padder.py +0 -229
  92. replay/experimental/preprocessing/sequence_generator.py +0 -208
  93. replay/experimental/scenarios/__init__.py +0 -1
  94. replay/experimental/scenarios/obp_wrapper/__init__.py +0 -8
  95. replay/experimental/scenarios/obp_wrapper/obp_optuna_objective.py +0 -74
  96. replay/experimental/scenarios/obp_wrapper/replay_offline.py +0 -261
  97. replay/experimental/scenarios/obp_wrapper/utils.py +0 -87
  98. replay/experimental/scenarios/two_stages/__init__.py +0 -0
  99. replay/experimental/scenarios/two_stages/reranker.py +0 -117
  100. replay/experimental/scenarios/two_stages/two_stages_scenario.py +0 -757
  101. replay/experimental/utils/__init__.py +0 -0
  102. replay/experimental/utils/logger.py +0 -24
  103. replay/experimental/utils/model_handler.py +0 -186
  104. replay/experimental/utils/session_handler.py +0 -44
  105. replay/optimization/__init__.py +0 -5
  106. replay_rec-0.19.0rc0.dist-info/RECORD +0 -191
  107. {replay_rec-0.19.0rc0.dist-info → replay_rec-0.20.0.dist-info/licenses}/LICENSE +0 -0
  108. {replay_rec-0.19.0rc0.dist-info → replay_rec-0.20.0.dist-info/licenses}/NOTICE +0 -0
File without changes
@@ -1,24 +0,0 @@
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
@@ -1,186 +0,0 @@
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
@@ -1,44 +0,0 @@
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, MissingImportType
7
-
8
- if PYSPARK_AVAILABLE:
9
- from pyspark.sql import SparkSession
10
- else:
11
- SparkSession = MissingImportType
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,5 +0,0 @@
1
- """
2
- Hyperparameter optimization of models
3
- """
4
-
5
- from .optuna_objective import ItemKNNObjective, MainObjective, SplitData
@@ -1,191 +0,0 @@
1
- replay/__init__.py,sha256=U6En2f4FR_XpdIg7fKqAAzDV1HLa70xZvrt6qVQk6-U,55
2
- replay/data/__init__.py,sha256=g5bKRyF76QL_BqlED-31RnS8pBdcyj9loMsx5vAG_0E,301
3
- replay/data/dataset.py,sha256=wIIezbAWP7yzYAHei0gD0z45Uk6quaWRKsQo2pcjj8A,30749
4
- replay/data/dataset_utils/__init__.py,sha256=9wUvG8ZwGUvuzLU4zQI5FDcH0WVVo5YLN2ey3DterP0,55
5
- replay/data/dataset_utils/dataset_label_encoder.py,sha256=6Pd6LYXLL_9xwvV5hbJvL88Um-KSIeVeYTa3RopuHP0,9807
6
- replay/data/nn/__init__.py,sha256=WxLsi4rgOuuvGYHN49xBPxP2Srhqf3NYgfBDVH-ZvBo,1122
7
- replay/data/nn/schema.py,sha256=0I3fdMYuMElcAhVfY44eFDGq1tVYRUMvZBspdVUqyfI,17112
8
- replay/data/nn/sequence_tokenizer.py,sha256=0IBPkVwxgimLmuSGqQheVyy9dbo5kDvNutoRBRCipEA,37051
9
- replay/data/nn/sequential_dataset.py,sha256=jCWxC0Pm1eQ5p8Y6_Bmg4fSEvPaecLrqz1iaWzaICdI,11014
10
- replay/data/nn/torch_sequential_dataset.py,sha256=NCNYLuhiRJj7x0_E6Z2UkF0h2YdumbWzJSG6GCb3muA,11501
11
- replay/data/nn/utils.py,sha256=fQiEZyc0YuCSDi9Rfp9KRtXGjedH1Lc_4QWd3-rTFjs,3272
12
- replay/data/schema.py,sha256=iQormeeiLbbxyADdV6Dv_KENe-tIaRiqlhixkQlC2aw,15952
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=mWbkRGdHTF3ZHq9WSqTGGAX2XJtOSzwcefjSu1Mdl0Y,22649
17
- replay/experimental/metrics/coverage.py,sha256=3kVBAUhIEOuD8aJ6DShH2xh_1F61dcLZb001VCkmeJk,3154
18
- replay/experimental/metrics/experiment.py,sha256=Bd_XB9zbngcAwf5JLZKVPsFWQoz9pEGlPEUbkiR_MDc,7343
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=7k_KigXnXmdnAnP3uf9DJR_GChG--jGUxPov05UVBgs,791
30
- replay/experimental/models/admm_slim.py,sha256=Oz-x0aQAnGFN9z7PB7MiKfduBasc4KQrBT0JwtYdwLY,6581
31
- replay/experimental/models/base_neighbour_rec.py,sha256=pRcffr0cdRNZRVpzWb2Qv-UIsLkhbs7K1GRAmrSqPSM,7506
32
- replay/experimental/models/base_rec.py,sha256=0u_kAUelLyIO6VSu6Un5zFZpzSjKYR7l384BY_79EWY,52108
33
- replay/experimental/models/base_torch_rec.py,sha256=oDkCxVFQjIHSWKlCns6mU3ECWbQW3mQZWvBHBxJQdwc,8111
34
- replay/experimental/models/cql.py,sha256=3IBQEqWfyHmvGxCvWtIbLgjuRWfd_8mySg8bVaI4KHQ,19630
35
- replay/experimental/models/ddpg.py,sha256=uqWk235-YZ2na-NPN4TxUM9ZhogpLZEjivt1oSC2rtI,32080
36
- replay/experimental/models/dt4rec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- replay/experimental/models/dt4rec/dt4rec.py,sha256=ZIHYonDubStN7Gb703csy86R7Q3_1fZc4zJf98HYFe4,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=jbCx2Xc85VtjQx-caYhJFfVuj1Wf866OAiSoZlR4q48,8201
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=dKSVCMXWRB7IUnpEK_QNhSEuUSVcG793E8MT_AGXneY,25890
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=8nuTpiBuddKlMFFpbUpRt5k_JiBGRjPpF_hNbKdLP4Q,11327
46
- replay/experimental/models/mult_vae.py,sha256=BnnlUHPlNuvh7EFA8bjITRW_m8JQANRD6zvsNQ1SUXM,11608
47
- replay/experimental/models/neural_ts.py,sha256=zviSSY43Pmr4WJXD4I7UobBby5fU1To4SM1Mfz-wae0,42506
48
- replay/experimental/models/neuromf.py,sha256=Hr9qEKv1shkwAqCVCxfews1Pk3F6yni2WIZUGS2tNCE,14392
49
- replay/experimental/models/scala_als.py,sha256=-sMZ8P_XbmVi-hApuS46MpaosVIXRED05cgsOI3ojvQ,10975
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=cG1IOXr28QMa39ZuKroC6wyniX-wuyxRgrw1cfhDclE,3313
53
- replay/experimental/preprocessing/__init__.py,sha256=uMyeyQ_GKqjLhVGwhrEk3NLhhzS0DKi5xGo3VF4WkiA,130
54
- replay/experimental/preprocessing/data_preparator.py,sha256=SLyk4HWurLmUHuev5L_GmI3oVU-58lCflOExHJ7zCGw,35964
55
- replay/experimental/preprocessing/padder.py,sha256=ROKnGA0136C9W9Qkky-1V5klcMxvwos5KL4_jMLOgwY,9564
56
- replay/experimental/preprocessing/sequence_generator.py,sha256=E1_0uZJLv8V_n6YzRlgUWtcrHIdjNwPeBN-BMbz0e-A,9053
57
- replay/experimental/scenarios/__init__.py,sha256=gWFLCkLyOmOppvbRMK7C3UMlMpcbIgiGVolSH6LPgWA,91
58
- replay/experimental/scenarios/obp_wrapper/__init__.py,sha256=rsRyfsTnVNp20LkTEugwoBrV9XWbIhR8tOqec_Au6dY,450
59
- replay/experimental/scenarios/obp_wrapper/obp_optuna_objective.py,sha256=vmLANYB5i1UR3uY7e-T0IBEYwPxOYHtKqhkmUvMUYhU,2548
60
- replay/experimental/scenarios/obp_wrapper/replay_offline.py,sha256=3NYjmsaQlQrrhSySIAzZmOfzjDepnHXlLWRfUSyCHYg,9634
61
- replay/experimental/scenarios/obp_wrapper/utils.py,sha256=-ioWTb73NmHWxVxw4BdSolctqeeGIyjKtydwc45nrrk,3271
62
- replay/experimental/scenarios/two_stages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
- replay/experimental/scenarios/two_stages/reranker.py,sha256=tJtWhbHRNV4sJZ9RZzqIfylTplKh9QVwTIBhEGGnXq8,4244
64
- replay/experimental/scenarios/two_stages/two_stages_scenario.py,sha256=frwsST85YGMGEZPf4DZFp3kPKPEcVgaxOCEdtZywpkw,29841
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=076TLpTOcnh13BznNTtJW6Zhrqvm9Ee1mlpP5YMD4No,1313
69
- replay/metrics/__init__.py,sha256=j0PGvUehaPEZMNo9SQwJsnvzrS4bam9eHrRMQFLnMjY,2813
70
- replay/metrics/base_metric.py,sha256=uleW5vLrdA3iRx72tFyW0cxe6ne_ugQ1XaY_ZTcnAOo,15960
71
- replay/metrics/categorical_diversity.py,sha256=OYsF-Ng-WrF9CC-sKgQKngrA779NO8MtgRvvAyC8MXM,10781
72
- replay/metrics/coverage.py,sha256=wE1Y_TgKOzf_9ixeas-vsxANAHeHSGPuGrzKk8DklaY,8843
73
- replay/metrics/descriptors.py,sha256=BHORyGKfJgPeUjgLO0u2urSTe16UQbb-HHh8soqnwDE,3893
74
- replay/metrics/experiment.py,sha256=Ab43e-eyoy8RM_OgAcm0toqFNDaWkh5Gbq_XVxbmqB0,8142
75
- replay/metrics/hitrate.py,sha256=G0_GufGc1RIQ_RntCIvDn0piJIVyT3W35bTN-Un9-Ug,2339
76
- replay/metrics/map.py,sha256=qUPFkyrvRf7gEyxosBApHOxpAVZJ3Yksqe4vsbzTukE,2597
77
- replay/metrics/mrr.py,sha256=AkfRdvL21Ri1zE4Cmib2twJaEaeBO5wze87eZ4lkYlc,2188
78
- replay/metrics/ndcg.py,sha256=wzdFFf9rmG6yH7klK5V9ab1wNdI6CHXezvYasxO9_ZU,3134
79
- replay/metrics/novelty.py,sha256=4S6PsdOl8lqweBlemWJh2fVqMiN8jfj3cIU-9TxZXLY,5500
80
- replay/metrics/offline_metrics.py,sha256=LWofpuzvqc92jSnmMWvW-ffTGEgHxAgZO_yuSSVY1gs,20473
81
- replay/metrics/precision.py,sha256=8hfz9bLZt7wUfyJtJPiIoDEOP_bweZSpCS6Z1Cm9IGE,2281
82
- replay/metrics/recall.py,sha256=ATN5OIeFKMG7-nqpPCBPLItrUhGRucLCELWnzRyCRoo,2472
83
- replay/metrics/rocauc.py,sha256=gybFcyIyVDpwoR9K38nOSxlAjIYbFqXUzABuckxqHps,3307
84
- replay/metrics/surprisal.py,sha256=mcGOQTvlNcGz4vNi-U-qe-CJqlYICKMRny5KtJVMKAc,7538
85
- replay/metrics/torch_metrics_builder.py,sha256=2gcCcb0A-TVpYcBIYGhXrggyFX-M_T7Q1pQUiMpxEZE,13845
86
- replay/metrics/unexpectedness.py,sha256=cfDnkpK6nPeawwHDVNQAkUtsW0SvAttI84k4M5ttkyo,6888
87
- replay/models/__init__.py,sha256=A1xEE3CbCrhCPkh94U_yYs9jzoP8IEyPukKj7DyY7bs,836
88
- replay/models/als.py,sha256=eGiMok_zu5ZUKXU9i9feCP4RGMqSnlIGHjks6MqKzHw,6227
89
- replay/models/association_rules.py,sha256=cp4myXvMqro6zLMjJzJMb0DZ5DQFQEZvhqf5OBgBw8Y,14659
90
- replay/models/base_neighbour_rec.py,sha256=zMORSm4uMQSNj12v0n_6w8fVHgSYjeiqyYE9rrWgSfU,7887
91
- replay/models/base_rec.py,sha256=W28_8w5QpeNVluSjKI0mKeDljvyac3_-kqDCNidCf1U,66229
92
- replay/models/cat_pop_rec.py,sha256=tzI1UMlC3kEOrtDZ1UPpCP13tX8CeDJP7PHwQKl9Mmo,11922
93
- replay/models/cluster.py,sha256=9JcpGnbfgFa4UsyxPAa4WMuJFa3rsuAxiKoy-s_UfyE,4970
94
- replay/models/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
- replay/models/extensions/ann/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
- replay/models/extensions/ann/ann_mixin.py,sha256=30YTIGnRhGJYOnxo2bM6dQFgDq9i5UH4t8Ln8zCW8TM,7288
97
- replay/models/extensions/ann/entities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
- replay/models/extensions/ann/entities/base_hnsw_param.py,sha256=5GRdcQj4-zhNXfJ7ko2WHGHgRuXCzSHCRcRxljl1V4c,776
99
- replay/models/extensions/ann/entities/hnswlib_param.py,sha256=j3V4JXM_yfR6s2TjYakIXMg-zS1-MrP6an930DEIWGM,2104
100
- replay/models/extensions/ann/entities/nmslib_hnsw_param.py,sha256=WeEhRR4jKqgvWK_zDK8fx6kEqc2e_bc0kubvqK3iV8c,2162
101
- replay/models/extensions/ann/index_builders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
- replay/models/extensions/ann/index_builders/base_index_builder.py,sha256=Ul25G0FaNLOXUjrDXxZDTg7tLXlv1N6wR8kWjWICtZ0,2110
103
- replay/models/extensions/ann/index_builders/driver_hnswlib_index_builder.py,sha256=bUoDwelKL9OK4z0IABzDm16t8wQ4QzH3wQ5NP32S_IE,1588
104
- replay/models/extensions/ann/index_builders/driver_nmslib_index_builder.py,sha256=1NLWyAJGYgp46uUBhUYQyd0stmG6DhLh7U4JEne5TFw,1308
105
- replay/models/extensions/ann/index_builders/executor_hnswlib_index_builder.py,sha256=_JZfewcLsU3sRR95_FPlgLfn9vez0JXMxer_024UHK4,2449
106
- replay/models/extensions/ann/index_builders/executor_nmslib_index_builder.py,sha256=_TClG_czFb50dXyUjjXL4HE5j_i4BH011wjzDGba2U8,2591
107
- replay/models/extensions/ann/index_builders/nmslib_index_builder_mixin.py,sha256=AIkVnobesnTM5lrBSWf9gd0CySwFQ0vH_DjemfLS4Cs,1925
108
- replay/models/extensions/ann/index_inferers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
- replay/models/extensions/ann/index_inferers/base_inferer.py,sha256=I39aqEc2somfndrCd-KC3XYZnYSrJ2hGpR9y6wO93NA,2524
110
- replay/models/extensions/ann/index_inferers/hnswlib_filter_index_inferer.py,sha256=JjT4l_XAjzUOsTAE7OS88zAgPd_h_O44oUnn2kVr8E0,2477
111
- replay/models/extensions/ann/index_inferers/hnswlib_index_inferer.py,sha256=CoY_oMfdcwnh87ceuSpHXu4Czle9xxeMisO8XJUuJLE,1717
112
- replay/models/extensions/ann/index_inferers/nmslib_filter_index_inferer.py,sha256=tjuqbkztWBU4K6qp5LPFU_GOGJf2f4oXneExtUEVUzw,3128
113
- replay/models/extensions/ann/index_inferers/nmslib_index_inferer.py,sha256=S5eCBZlTXxEAeX6yeZGC7j56gOcJ7lMNb4Cs_5PEj9E,2203
114
- replay/models/extensions/ann/index_inferers/utils.py,sha256=6IST2FPSY3nuYu5KqzRpd4FgdaV3GnQRQlxp9LN_yyA,641
115
- replay/models/extensions/ann/index_stores/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
- replay/models/extensions/ann/index_stores/base_index_store.py,sha256=u4l2ybAXX92ZMGK7NqqosbKF75QgFqhAMVadd5ePj6Y,910
117
- replay/models/extensions/ann/index_stores/hdfs_index_store.py,sha256=0zDq9PdDOiD6HvtZlfjTbuJHfeTOWBTQ_HiuqZmoxtA,3090
118
- replay/models/extensions/ann/index_stores/shared_disk_index_store.py,sha256=thl4T1uYU4Gtk4nBao_qK8CbFBdX1xmXNishxgfCd-I,2030
119
- replay/models/extensions/ann/index_stores/spark_files_index_store.py,sha256=QP_8mE7EIBbePIe0AB-IWuJLRA5MR3wswCEt8oHzn-0,3617
120
- replay/models/extensions/ann/index_stores/utils.py,sha256=6r2GP_EFCaCguolW857pb4lRS8rh6_Nv_Edso9_j5no,3756
121
- replay/models/extensions/ann/utils.py,sha256=qLeT0wHzbzBU5J6SE3xbbT3vYrLrFcEEQNJCtElvP_U,1213
122
- replay/models/kl_ucb.py,sha256=L6vC2KsTBTTx4ckmGhWybOiLa5Wt54N7cgl7jS2FQRg,6731
123
- replay/models/knn.py,sha256=ujJRiRJ9Nfs_m7eTvk0fDTYiR95aKnDO4e2Tf2q2AQI,9109
124
- replay/models/lin_ucb.py,sha256=Je1FfW-bRFSBE45XIXxQvzJr8sZQuMzIkCs-pb_D8po,16922
125
- replay/models/nn/__init__.py,sha256=AT3o1qXaxUq4_QIGlcGuSs54ZpueOo-SbpZwuGI-6os,41
126
- replay/models/nn/loss/__init__.py,sha256=s3iO9QTZvLz_ony2b5K0hEmDmitrXQnAe9j6BRxLpR4,53
127
- replay/models/nn/loss/sce.py,sha256=p6LFtoYSY4j2pQh6Z7i6cEADCmRnvTgnb8EJXseRKKg,5637
128
- replay/models/nn/optimizer_utils/__init__.py,sha256=8MHln7CW54oACVUFKdZLjAf4bY83GcOMXpmL87gTnhI,178
129
- replay/models/nn/optimizer_utils/optimizer_factory.py,sha256=EXqS_2ZxT7K_kFzcjgFpNhmzUoSftf_CwZIIHNHZBgU,2842
130
- replay/models/nn/sequential/__init__.py,sha256=CI2n0cxs_amqJrwBMq6n0Z_uBOu7CGXfagqvE4Jlmjw,128
131
- replay/models/nn/sequential/bert4rec/__init__.py,sha256=JfZqHOGxcvOkICl5cWmZbZhaKXpkIvua-Wj57VWWEhw,399
132
- replay/models/nn/sequential/bert4rec/dataset.py,sha256=cJp1fol4FiGSRhyy7RaBh7plMVEFteJ1pCbbGBZyZHI,11014
133
- replay/models/nn/sequential/bert4rec/lightning.py,sha256=g3LSJiIzTnl9nfCEJKRdP2NhLP25b5AnivfSrOeqceU,26559
134
- replay/models/nn/sequential/bert4rec/model.py,sha256=WSo0l2TVDqlB3_qOfrDWXS7KNOzHgJ6myPv5vazHTlU,17394
135
- replay/models/nn/sequential/callbacks/__init__.py,sha256=Q7mSZ_RB6iyD7QZaBL_NJ0uh8cRfgxq7gtPHbkSyhoo,282
136
- replay/models/nn/sequential/callbacks/prediction_callbacks.py,sha256=iCPO1G09X-22CTrMVx5HYVxrzT1xmtb-6qGczkbYQ58,9317
137
- replay/models/nn/sequential/callbacks/validation_callback.py,sha256=6TNl3NN9oahK1J7DT44461xqBuUCblCsLzUi2svlhF4,5825
138
- replay/models/nn/sequential/compiled/__init__.py,sha256=1UrFY_w-rTuQhMokVra5Bl8YYfSVGMuUIycMMeJYGfM,168
139
- replay/models/nn/sequential/compiled/base_compiled_model.py,sha256=rPQYztpcskHo-jaGlKJukJ7KfI6XvRUnBJuwj5ahxFU,10235
140
- replay/models/nn/sequential/compiled/bert4rec_compiled.py,sha256=PArIF1l-xVUNhJ55MUGF6srpFdhmZ1Hl33hKwdhefd0,6258
141
- replay/models/nn/sequential/compiled/sasrec_compiled.py,sha256=Xe3znMMtBVWvZViPwhm94Cd17FKHxsgt9MWLuzXvs_4,5793
142
- replay/models/nn/sequential/postprocessors/__init__.py,sha256=89LGzkNHukcuC2-rfpiz7vmv1zyk6MNY-8zaXrvtn0M,164
143
- replay/models/nn/sequential/postprocessors/_base.py,sha256=Z-HuXM4WBQtrq9IeCL00jtdb_UopksInxVVK8lxD_hA,1136
144
- replay/models/nn/sequential/postprocessors/postprocessors.py,sha256=t96EkNVaG560m5BA5FejJKudpUMcfZWc4KrOD12GME4,7820
145
- replay/models/nn/sequential/sasrec/__init__.py,sha256=c6130lRpPkcbuGgkM7slagBIgH7Uk5zUtSzFDEwAsik,250
146
- replay/models/nn/sequential/sasrec/dataset.py,sha256=dbuhoU5mCf2MS01QpTd7ud5dFEqQE24jurwgfC3t3aE,7782
147
- replay/models/nn/sequential/sasrec/lightning.py,sha256=1FeadX68S-61Zb4OHP4u8CfMdAKAL49P66gjsChJSTY,25073
148
- replay/models/nn/sequential/sasrec/model.py,sha256=CWlJec2fbz42vnkUQ5AMux31F-JQRw7NiYXnftU35jA,27669
149
- replay/models/pop_rec.py,sha256=Ju9y2rU2vW_jFU9-W15fbbr5_ZzYGihSjSxsqKsAf0Q,4964
150
- replay/models/query_pop_rec.py,sha256=UNsHtf3eQpJom73ZmEO5us4guI4SnCLJYTfuUpRgqes,4086
151
- replay/models/random_rec.py,sha256=9SC012_X3sNzrAjDG1CPGhjisZb6gnv4VCW7yIMSNpk,8066
152
- replay/models/slim.py,sha256=LHQl91PAsiCA8wLYzyapW1DVmqzGaCwtydBvZKC5yo0,4723
153
- replay/models/thompson_sampling.py,sha256=gcjlVl1mPiEVt70y8frA762O-eCZzd3SVg1lnDRCEHk,1939
154
- replay/models/ucb.py,sha256=X98ulD8L3gWR3VA7rbQkXFqQyzWc-Nt12lp_gbLTfLQ,6964
155
- replay/models/wilson.py,sha256=o7aUWjq3648dAfgGBoWD5Gu-HzdyobPMaH2lzCLijiA,4558
156
- replay/models/word2vec.py,sha256=MgoRIS5vqW9cH1HKAGa2xsLLnTH6XC1EXk4Dzvn5lXA,9171
157
- replay/optimization/__init__.py,sha256=az6U10rF7X6rPRUUPwLyiM1WFNJ_6kl0imA5xLVWFLs,120
158
- replay/optimization/optuna_objective.py,sha256=OUYlC3wQj4GmrSbE_z5IPPS6OEEPUoeRCWFJnIR1Na8,7654
159
- replay/preprocessing/__init__.py,sha256=c6wFPAc6lATyp0lE-ZDjHMsXyEMPKX7Usuqylv6H5XQ,597
160
- replay/preprocessing/converter.py,sha256=JQ-4u5x0eXtswl1iH-bZITBXQov1nebnZ6XcvpD8Twk,4417
161
- replay/preprocessing/discretizer.py,sha256=Z3xnJpAQeXOU49PVpRSVXXbDemlAHEWWwFSNX_VirHA,27047
162
- replay/preprocessing/filters.py,sha256=o-XWUTv4NsciGLwOoYKjVrGrBuOgxTk0c0aY1_tuzcw,45852
163
- replay/preprocessing/history_based_fp.py,sha256=Wb2DXHawE2dYghm1ARr05_5opd_TLfthZ7h5e0zbDjY,18726
164
- replay/preprocessing/label_encoder.py,sha256=uOt7i3tNc3SMjr65tZpvFAJOFD_xiy5rHhd4llwBw2g,41392
165
- replay/preprocessing/sessionizer.py,sha256=G6i0K3FwqtweRxvcSYraJ-tBWAT2HnV-bWHHlIZJF-s,12217
166
- replay/scenarios/__init__.py,sha256=XXAKEQPTLlve-0O6NPwFgahFrb4oGcIq3HaYaaGxG2E,94
167
- replay/scenarios/fallback.py,sha256=EeBmIR-5igzKR2m55bQRFyhxTkpJez6ZkCW449n8hWs,7130
168
- replay/splitters/__init__.py,sha256=DnqVMelrzLwR8fGQgcWN_8FipGs8T4XGSPOMW-L_x2g,454
169
- replay/splitters/base_splitter.py,sha256=hj9_GYDWllzv3XnxN6WHu1JKRRVjXo77vZEOLbF9v-s,7761
170
- replay/splitters/cold_user_random_splitter.py,sha256=ruiMtgpzpsJqZ7oE0oLH-exqcFhRXAUc-y6cE1GqjoE,4155
171
- replay/splitters/k_folds.py,sha256=WH02_DP18A2ae893ysonmfLPB56_i1ETllTAwaCYekg,6218
172
- replay/splitters/last_n_splitter.py,sha256=ITq8yzd7PrbAi3yp5XJlBehq0E0boiPyTEn72sXZEOA,15347
173
- replay/splitters/new_users_splitter.py,sha256=bv_QCPkL7KFxJIovAXQbP3Rlty3My48YNTqrj-2ucFQ,9167
174
- replay/splitters/random_splitter.py,sha256=mbOcxeF0B9WQ9OSxK8CHkPtO8UzKCZJt3rRyFhn-hyQ,2996
175
- replay/splitters/ratio_splitter.py,sha256=8zvuCn16Icc4ntQPKXJ5ArAWuJzCZ9NHZtgWctKyBVY,17519
176
- replay/splitters/time_splitter.py,sha256=tsoK3Qg_pcYHDxBlv2xC8ohAikoIqac3fRGBvCb-QRo,9026
177
- replay/splitters/two_stage_splitter.py,sha256=U90l1wfJnMAAW1j4YpJSd8zWvWB-LDUKFCifnanXraU,17830
178
- replay/utils/__init__.py,sha256=NglSepjA-vlwDH2uiIXRQ8EnJLuEQkiOufYlm9yjNiU,277
179
- replay/utils/common.py,sha256=HI8f42W4pVYjqkjDNv4yjErjXiLWs_exWNcTPPwMyqA,5361
180
- replay/utils/dataframe_bucketizer.py,sha256=LipmBBQkdkLGroZpbP9i7qvTombLdMxo2dUUys1m5OY,3748
181
- replay/utils/distributions.py,sha256=UuhaC9HI6HnUXW97fEd-TsyDk4JT8t7k1T_6l5FpOMs,1203
182
- replay/utils/model_handler.py,sha256=V-mHDh8_UexjVSsMBBRA9yrjS_5MPHwYOwv_UrI-Zfs,6466
183
- replay/utils/session_handler.py,sha256=BACedTDu-K1ANCB88M8JEBgJ318Hxv-yxaPUNNJKZ9U,5152
184
- replay/utils/spark_utils.py,sha256=lxzaQGxp3PZdcW-mrj1402x0U8AUQkKimZpWlwhKcJQ,27405
185
- replay/utils/time.py,sha256=J8asoQBytPcNw-BLGADYIsKeWhIoN1H5hKiX9t2AMqo,9376
186
- replay/utils/types.py,sha256=RHGkY71JkGUAMCWbHNgB11Z1F64Lqj0xxRr4Z07qxsY,814
187
- replay_rec-0.19.0rc0.dist-info/LICENSE,sha256=rPmcA7UrHxBChEAAlJyE24qUWKKl9yLQXxFsKeg_LX4,11344
188
- replay_rec-0.19.0rc0.dist-info/METADATA,sha256=Kic87qPbl1bL_CLFp5EzyKDvE46oqOFS2y1nHZFDnUw,13444
189
- replay_rec-0.19.0rc0.dist-info/NOTICE,sha256=k0bo4KHiHLRax5K3XKTTrf2Fi8V91mJ-R3FMdh6Reg0,2002
190
- replay_rec-0.19.0rc0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
191
- replay_rec-0.19.0rc0.dist-info/RECORD,,