nextrec 0.4.16__py3-none-any.whl → 0.4.18__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 (37) hide show
  1. nextrec/__version__.py +1 -1
  2. nextrec/basic/heads.py +99 -0
  3. nextrec/basic/loggers.py +5 -5
  4. nextrec/basic/model.py +217 -88
  5. nextrec/cli.py +1 -1
  6. nextrec/data/dataloader.py +93 -95
  7. nextrec/data/preprocessor.py +108 -46
  8. nextrec/loss/grad_norm.py +13 -13
  9. nextrec/models/multi_task/esmm.py +10 -11
  10. nextrec/models/multi_task/mmoe.py +20 -19
  11. nextrec/models/multi_task/ple.py +35 -34
  12. nextrec/models/multi_task/poso.py +23 -21
  13. nextrec/models/multi_task/share_bottom.py +18 -17
  14. nextrec/models/ranking/afm.py +4 -3
  15. nextrec/models/ranking/autoint.py +4 -3
  16. nextrec/models/ranking/dcn.py +4 -3
  17. nextrec/models/ranking/dcn_v2.py +4 -3
  18. nextrec/models/ranking/deepfm.py +4 -3
  19. nextrec/models/ranking/dien.py +2 -2
  20. nextrec/models/ranking/din.py +2 -2
  21. nextrec/models/ranking/eulernet.py +4 -3
  22. nextrec/models/ranking/ffm.py +4 -3
  23. nextrec/models/ranking/fibinet.py +2 -2
  24. nextrec/models/ranking/fm.py +4 -3
  25. nextrec/models/ranking/lr.py +4 -3
  26. nextrec/models/ranking/masknet.py +4 -5
  27. nextrec/models/ranking/pnn.py +5 -4
  28. nextrec/models/ranking/widedeep.py +8 -8
  29. nextrec/models/ranking/xdeepfm.py +5 -4
  30. nextrec/utils/console.py +20 -6
  31. nextrec/utils/data.py +154 -32
  32. nextrec/utils/model.py +86 -1
  33. {nextrec-0.4.16.dist-info → nextrec-0.4.18.dist-info}/METADATA +5 -6
  34. {nextrec-0.4.16.dist-info → nextrec-0.4.18.dist-info}/RECORD +37 -36
  35. {nextrec-0.4.16.dist-info → nextrec-0.4.18.dist-info}/WHEEL +0 -0
  36. {nextrec-0.4.16.dist-info → nextrec-0.4.18.dist-info}/entry_points.txt +0 -0
  37. {nextrec-0.4.16.dist-info → nextrec-0.4.18.dist-info}/licenses/LICENSE +0 -0
nextrec/utils/data.py CHANGED
@@ -4,7 +4,7 @@ Data utilities for NextRec.
4
4
  This module provides file I/O helpers and synthetic data generation.
5
5
 
6
6
  Date: create on 19/12/2025
7
- Checkpoint: edit on 19/12/2025
7
+ Checkpoint: edit on 24/12/2025
8
8
  Author: Yang Zhou, zyaztec@gmail.com
9
9
  """
10
10
 
@@ -19,6 +19,46 @@ import pyarrow.parquet as pq
19
19
  import torch
20
20
  import yaml
21
21
 
22
+ FILE_FORMAT_CONFIG = {
23
+ "csv": {
24
+ "extension": [".csv", ".txt"],
25
+ "streaming": True,
26
+ },
27
+ "parquet": {
28
+ "extension": [".parquet"],
29
+ "streaming": True,
30
+ },
31
+ "feather": {
32
+ "extension": [".feather", ".ftr"],
33
+ "streaming": False,
34
+ },
35
+ "excel": {
36
+ "extension": [".xlsx", ".xls"],
37
+ "streaming": False,
38
+ },
39
+ "hdf5": {
40
+ "extension": [".h5", ".hdf5"],
41
+ "streaming": False,
42
+ },
43
+ }
44
+
45
+
46
+ def get_file_format_from_extension(ext: str) -> str | None:
47
+ """Get file format from extension."""
48
+ return {
49
+ ext.lstrip("."): fmt
50
+ for fmt, config in FILE_FORMAT_CONFIG.items()
51
+ for ext in config["extension"]
52
+ }.get(ext.lower().lstrip("."))
53
+
54
+
55
+ def check_streaming_support(file_format: str) -> bool:
56
+ """Check if a format supports streaming."""
57
+ file_format = file_format.lower()
58
+ if file_format not in FILE_FORMAT_CONFIG:
59
+ return False
60
+ return FILE_FORMAT_CONFIG[file_format].get("streaming", False)
61
+
22
62
 
23
63
  def resolve_file_paths(path: str) -> tuple[list[str], str]:
24
64
  """
@@ -30,29 +70,39 @@ def resolve_file_paths(path: str) -> tuple[list[str], str]:
30
70
  path_obj = Path(path)
31
71
 
32
72
  if path_obj.is_file():
33
- file_type = path_obj.suffix.lower().lstrip(".")
34
- assert file_type in [
35
- "csv",
36
- "parquet",
37
- ], f"Unsupported file extension: {file_type}"
38
- return [str(path_obj)], file_type
73
+ file_format = get_file_format_from_extension(path_obj.suffix)
74
+ if file_format is None:
75
+ raise ValueError(
76
+ f"Unsupported file extension: {path_obj.suffix}. "
77
+ f"Supported formats: {', '.join(FILE_FORMAT_CONFIG.keys())}"
78
+ )
79
+ return [str(path_obj)], file_format
39
80
 
40
81
  if path_obj.is_dir():
41
82
  collected_files = [p for p in path_obj.iterdir() if p.is_file()]
42
- csv_files = [str(p) for p in collected_files if p.suffix.lower() == ".csv"]
43
- parquet_files = [
44
- str(p) for p in collected_files if p.suffix.lower() == ".parquet"
45
- ]
83
+ # Group files by format
84
+ format_groups: Dict[str, List[str]] = {}
85
+ for file in collected_files:
86
+ file_format = get_file_format_from_extension(file.suffix)
87
+ if file_format:
88
+ format_groups.setdefault(file_format, []).append(str(file))
89
+
90
+ if len(format_groups) > 1:
91
+ formats = ", ".join(format_groups.keys())
92
+ raise ValueError(
93
+ f"Directory contains mixed file formats: {formats}. "
94
+ "Please keep a single format per directory."
95
+ )
46
96
 
47
- if csv_files and parquet_files:
97
+ if not format_groups:
48
98
  raise ValueError(
49
- "Directory contains both CSV and Parquet files. Please keep a single format."
99
+ f"No supported data files found in directory: {path}. "
100
+ f"Supported formats: {', '.join(FILE_FORMAT_CONFIG.keys())}"
50
101
  )
51
- file_paths = csv_files if csv_files else parquet_files
52
- if not file_paths:
53
- raise ValueError(f"No CSV or Parquet files found in directory: {path}")
102
+
103
+ file_type = list(format_groups.keys())[0]
104
+ file_paths = format_groups[file_type]
54
105
  file_paths.sort()
55
- file_type = "csv" if csv_files else "parquet"
56
106
  return file_paths, file_type
57
107
 
58
108
  raise ValueError(f"Invalid path: {path}")
@@ -60,15 +110,55 @@ def resolve_file_paths(path: str) -> tuple[list[str], str]:
60
110
 
61
111
  def read_table(path: str | Path, data_format: str | None = None) -> pd.DataFrame:
62
112
  data_path = Path(path)
63
- fmt = data_format.lower() if data_format else data_path.suffix.lower().lstrip(".")
64
- if data_path.is_dir() and not fmt:
65
- fmt = "parquet"
66
- if fmt in {"parquet", ""}:
67
- return pd.read_parquet(data_path)
68
- if fmt in {"csv", "txt"}:
69
- # Use low_memory=False to avoid mixed-type DtypeWarning on wide CSVs
70
- return pd.read_csv(data_path, low_memory=False)
71
- raise ValueError(f"Unsupported data format: {data_path}")
113
+
114
+ # Determine format
115
+ if data_format:
116
+ fmt = data_format.lower()
117
+ elif data_path.is_dir():
118
+ _, fmt = resolve_file_paths(str(data_path))
119
+ else:
120
+ fmt = get_file_format_from_extension(data_path.suffix)
121
+ if fmt is None:
122
+ raise ValueError(
123
+ f"Cannot determine format for {data_path}. "
124
+ f"Please specify data_format parameter."
125
+ )
126
+
127
+ if data_path.is_dir():
128
+ file_paths, _ = resolve_file_paths(str(data_path))
129
+ dataframes = [read_table(fp, fmt) for fp in file_paths]
130
+ if not dataframes:
131
+ raise ValueError(f"No supported data files found in directory: {data_path}")
132
+ if len(dataframes) == 1:
133
+ return dataframes[0]
134
+ return pd.concat(dataframes, ignore_index=True)
135
+
136
+ # Read based on format
137
+ try:
138
+ if fmt == "hdf5":
139
+ # HDF5 requires a key; use the first available key
140
+ with pd.HDFStore(data_path, mode="r") as store:
141
+ if len(store.keys()) == 0:
142
+ raise ValueError(f"HDF5 file {data_path} contains no datasets")
143
+ return pd.read_hdf(data_path, key=store.keys()[0])
144
+ reader = {
145
+ "parquet": pd.read_parquet,
146
+ "csv": lambda p: pd.read_csv(p, low_memory=False),
147
+ "feather": pd.read_feather,
148
+ "excel": pd.read_excel,
149
+ }.get(fmt)
150
+ if reader:
151
+ return reader(data_path)
152
+ raise ValueError(
153
+ f"Unsupported format: {fmt}. "
154
+ f"Supported: {', '.join(FILE_FORMAT_CONFIG.keys())}"
155
+ )
156
+ except ImportError as e:
157
+ raise ImportError(
158
+ f"Format '{fmt}' requires additional dependencies. "
159
+ f"Install with: pip install pandas[{fmt}] or check documentation. "
160
+ f"Original error: {e}"
161
+ ) from e
72
162
 
73
163
 
74
164
  def load_dataframes(file_paths: list[str], file_type: str) -> list[pd.DataFrame]:
@@ -78,12 +168,44 @@ def load_dataframes(file_paths: list[str], file_type: str) -> list[pd.DataFrame]
78
168
  def iter_file_chunks(
79
169
  file_path: str, file_type: str, chunk_size: int
80
170
  ) -> Generator[pd.DataFrame, None, None]:
81
- if file_type == "csv":
82
- yield from pd.read_csv(file_path, chunksize=chunk_size)
83
- return
84
- parquet_file = pq.ParquetFile(file_path)
85
- for batch in parquet_file.iter_batches(batch_size=chunk_size):
86
- yield batch.to_pandas()
171
+ """Iterate over file in chunks for streaming reading.
172
+
173
+ Args:
174
+ file_path: Path to the file
175
+ file_type: Format type (csv, parquet)
176
+ chunk_size: Number of rows per chunk
177
+
178
+ Yields:
179
+ DataFrame chunks
180
+
181
+ Raises:
182
+ ValueError: If format doesn't support streaming
183
+ """
184
+ file_type = file_type.lower()
185
+ if not check_streaming_support(file_type):
186
+ raise ValueError(
187
+ f"Format '{file_type}' does not support streaming reads. "
188
+ "Formats with streaming support: csv, parquet"
189
+ )
190
+
191
+ try:
192
+ if file_type == "csv":
193
+ yield from pd.read_csv(file_path, chunksize=chunk_size)
194
+ elif file_type == "parquet":
195
+ parquet_file = pq.ParquetFile(file_path)
196
+ for batch in parquet_file.iter_batches(batch_size=chunk_size):
197
+ yield batch.to_pandas()
198
+ else:
199
+ raise ValueError(
200
+ f"Format '{file_type}' does not support streaming. "
201
+ f"Use read_table() to load the entire file into memory."
202
+ )
203
+ except ImportError as e:
204
+ raise ImportError(
205
+ f"Streaming format '{file_type}' requires additional dependencies. "
206
+ f"Install with: pip install pandas[{file_type}] pyarrow. "
207
+ f"Original error: {e}"
208
+ ) from e
87
209
 
88
210
 
89
211
  def default_output_dir(path: str) -> Path:
nextrec/utils/model.py CHANGED
@@ -2,6 +2,7 @@
2
2
  Model-related utilities for NextRec
3
3
 
4
4
  Date: create on 03/12/2025
5
+ Checkpoint: edit on 24/12/2025
5
6
  Author: Yang Zhou, zyaztec@gmail.com
6
7
  """
7
8
 
@@ -9,6 +10,16 @@ from collections import OrderedDict
9
10
 
10
11
  import torch
11
12
 
13
+ from nextrec.loss import (
14
+ ApproxNDCGLoss,
15
+ BPRLoss,
16
+ HingeLoss,
17
+ ListMLELoss,
18
+ ListNetLoss,
19
+ SampledSoftmaxLoss,
20
+ TripletLoss,
21
+ )
22
+
12
23
 
13
24
  def merge_features(primary, secondary) -> list:
14
25
  merged: OrderedDict[str, object] = OrderedDict()
@@ -53,6 +64,80 @@ def compute_pair_scores(model, data, batch_size: int = 512):
53
64
  user_tensor = torch.as_tensor(user_emb, device=model.device)
54
65
  item_tensor = torch.as_tensor(item_emb, device=model.device)
55
66
  scores = model.compute_similarity(user_tensor, item_tensor)
56
- if model.training_mode == "pointwise":
67
+ mode = model.training_mode
68
+ if isinstance(mode, list):
69
+ mode = mode[0] if mode else "pointwise"
70
+ if mode == "pointwise":
57
71
  scores = torch.sigmoid(scores)
58
72
  return scores.detach().cpu().numpy()
73
+
74
+
75
+ def prepare_ranking_targets(
76
+ y_pred: torch.Tensor, y_true: torch.Tensor
77
+ ) -> tuple[torch.Tensor, torch.Tensor]:
78
+ if y_pred.dim() == 1:
79
+ y_pred = y_pred.view(-1, 1)
80
+ if y_true.dim() == 1:
81
+ y_true = y_true.view(-1, 1)
82
+ if y_pred.shape != y_true.shape:
83
+ raise ValueError(f"Shape mismatch: {y_pred.shape} vs {y_true.shape}")
84
+ return y_pred, y_true
85
+
86
+
87
+ def split_pos_neg_scores(
88
+ scores: torch.Tensor, labels: torch.Tensor
89
+ ) -> tuple[torch.Tensor, torch.Tensor]:
90
+ if scores.dim() != 2 or labels.dim() != 2:
91
+ raise ValueError(
92
+ "[Ranking Error] pairwise/listwise training requires 2D scores and labels."
93
+ )
94
+ list_size = scores.size(1)
95
+ if list_size < 2:
96
+ raise ValueError(
97
+ "[Ranking Error] pairwise/listwise training requires list_size >= 2."
98
+ )
99
+ pos_mask = labels > 0
100
+ pos_counts = pos_mask.sum(dim=1)
101
+ neg_counts = list_size - pos_counts
102
+ if not torch.all(pos_counts == 1).item():
103
+ raise ValueError(
104
+ "[Ranking Error] pairwise/listwise with pos/neg split requires exactly one positive per row."
105
+ )
106
+ if not torch.all(neg_counts == list_size - 1).item():
107
+ raise ValueError(
108
+ "[Ranking Error] pairwise/listwise with pos/neg split requires at least one negative per row."
109
+ )
110
+ pos_scores = scores[pos_mask].view(-1)
111
+ neg_scores = scores[~pos_mask].view(scores.size(0), list_size - 1)
112
+ return pos_scores, neg_scores
113
+
114
+
115
+ def compute_ranking_loss(
116
+ training_mode: str,
117
+ loss_fn: torch.nn.Module,
118
+ y_pred: torch.Tensor,
119
+ y_true: torch.Tensor,
120
+ ) -> torch.Tensor:
121
+ y_pred, y_true = prepare_ranking_targets(y_pred, y_true)
122
+ if training_mode == "pairwise":
123
+ pos_scores, neg_scores = split_pos_neg_scores(y_pred, y_true)
124
+ if isinstance(loss_fn, (BPRLoss, HingeLoss, SampledSoftmaxLoss)):
125
+ loss = loss_fn(pos_scores, neg_scores)
126
+ elif isinstance(loss_fn, TripletLoss):
127
+ raise ValueError(
128
+ "[Ranking Error] TripletLoss expects embeddings, not scalar scores."
129
+ )
130
+ else:
131
+ loss = loss_fn(pos_scores, neg_scores)
132
+ elif training_mode == "listwise":
133
+ if isinstance(loss_fn, (ListNetLoss, ListMLELoss, ApproxNDCGLoss)):
134
+ loss = loss_fn(y_pred, y_true)
135
+ elif isinstance(loss_fn, SampledSoftmaxLoss):
136
+ pos_scores, neg_scores = split_pos_neg_scores(y_pred, y_true)
137
+ loss = loss_fn(pos_scores, neg_scores)
138
+ else:
139
+ loss = loss_fn(y_pred, y_true)
140
+ else:
141
+ raise ValueError(f"[Ranking Error] Unknown training mode: {training_mode}")
142
+
143
+ return loss
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nextrec
3
- Version: 0.4.16
3
+ Version: 0.4.18
4
4
  Summary: A comprehensive recommendation library with match, ranking, and multi-task learning models
5
5
  Project-URL: Homepage, https://github.com/zerolovesea/NextRec
6
6
  Project-URL: Repository, https://github.com/zerolovesea/NextRec
@@ -63,12 +63,11 @@ Description-Content-Type: text/markdown
63
63
 
64
64
  <div align="center">
65
65
 
66
- [![PyPI Downloads](https://static.pepy.tech/personalized-badge/nextrec?period=total&units=NONE&left_color=BLACK&right_color=GREEN&left_text=PyPI-downloads)](https://pepy.tech/projects/nextrec)
66
+ [![PyPI Downloads](https://static.pepy.tech/personalized-badge/nextrec?period=total&units=NONE&left_color=BLACK&right_color=GREEN&left_text=PyPI-downloads)](https://pypistats.org/packages/nextrec)
67
67
  ![Python](https://img.shields.io/badge/Python-3.10+-blue.svg)
68
68
  ![PyTorch](https://img.shields.io/badge/PyTorch-1.10+-ee4c2c.svg)
69
-
70
69
  ![License](https://img.shields.io/badge/License-Apache%202.0-green.svg)
71
- ![Version](https://img.shields.io/badge/Version-0.4.16-orange.svg)
70
+ ![Version](https://img.shields.io/badge/Version-0.4.18-orange.svg)
72
71
 
73
72
 
74
73
  中文文档 | [English Version](README_en.md)
@@ -244,11 +243,11 @@ nextrec --mode=train --train_config=path/to/train_config.yaml
244
243
  nextrec --mode=predict --predict_config=path/to/predict_config.yaml
245
244
  ```
246
245
 
247
- > 截止当前版本0.4.16,NextRec CLI支持单机训练,分布式训练相关功能尚在开发中。
246
+ > 截止当前版本0.4.18,NextRec CLI支持单机训练,分布式训练相关功能尚在开发中。
248
247
 
249
248
  ## 兼容平台
250
249
 
251
- 当前最新版本为0.4.16,所有模型和测试代码均已在以下平台通过验证,如果开发者在使用中遇到兼容问题,请在issue区提出错误报告及系统版本:
250
+ 当前最新版本为0.4.18,所有模型和测试代码均已在以下平台通过验证,如果开发者在使用中遇到兼容问题,请在issue区提出错误报告及系统版本:
252
251
 
253
252
  | 平台 | 配置 |
254
253
  |------|------|
@@ -1,23 +1,24 @@
1
1
  nextrec/__init__.py,sha256=_M3oUqyuvQ5k8Th_3wId6hQ_caclh7M5ad51XN09m98,235
2
- nextrec/__version__.py,sha256=Qgm7I6hoEastyorRf_J_YW-gsesKcI737L731iY3jes,23
3
- nextrec/cli.py,sha256=JUprwpoVbT4tXsGgMpj9Y_5yYByQXYMliMdWd38ReKo,24441
2
+ nextrec/__version__.py,sha256=my_eRKQWrGqOjGcYUQ3l4O21n-LMG22J283Pb5L90kw,23
3
+ nextrec/cli.py,sha256=xeVkW1rMLExu8AZ66jqOe4dNIh22pNz2Cbj-dtpG0_A,24445
4
4
  nextrec/basic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  nextrec/basic/activation.py,sha256=uzTWfCOtBSkbu_Gk9XBNTj8__s241CaYLJk6l8nGX9I,2885
6
6
  nextrec/basic/callback.py,sha256=nn1f8FG9c52vJ-gvwteqPbk3-1QuNS1vmhBlkENdb0I,14636
7
7
  nextrec/basic/features.py,sha256=GyCUzGPuizUofrZSSOdqHK84YhnX4MGTdu7Cx2OGhUA,4654
8
+ nextrec/basic/heads.py,sha256=UcAfD6Tw3o-HVBHSqutvJSa56xX7ZIY_Fx2SNBCkb9E,3280
8
9
  nextrec/basic/layers.py,sha256=ZM3Nka3e2cit3e3peL0ukJCMgKZK1ovNFfAWvVOwlos,28556
9
- nextrec/basic/loggers.py,sha256=Zh1A5DVAFqlGglyaQ4_IMgvFbWAcXX5H3aHbCWA82nE,6524
10
+ nextrec/basic/loggers.py,sha256=kZsvWnKl45bIcGid59M6m-khTxb_2P6gvWAg4wohaO4,6509
10
11
  nextrec/basic/metrics.py,sha256=1r6efTc9TpARNBt5X9ISoppTZflej6EdFkjPYHV-YZI,23162
11
- nextrec/basic/model.py,sha256=eC4qV6wLHsIiYr2HZ4dOpliiD4mjTJhr4XdiezMO690,103767
12
+ nextrec/basic/model.py,sha256=xueGxwl0A7XwdzgIqMuHavWon4glEsFKfu4e4QbGBWc,109348
12
13
  nextrec/basic/session.py,sha256=UOG_-EgCOxvqZwCkiEd8sgNV2G1sm_HbzKYVQw8yYDI,4483
13
14
  nextrec/data/__init__.py,sha256=YZQjpty1pDCM7q_YNmiA2sa5kbujUw26ObLHWjMPjKY,1194
14
15
  nextrec/data/batch_utils.py,sha256=0bYGVX7RlhnHv_ZBaUngjDIpBNw-igCk98DgOsF7T6o,2879
15
16
  nextrec/data/data_processing.py,sha256=lKXDBszrO5fJMAQetgSPr2mSQuzOluuz1eHV4jp0TDU,5538
16
17
  nextrec/data/data_utils.py,sha256=0Ls1cnG9lBz0ovtyedw5vwp7WegGK_iF-F8e_3DEddo,880
17
- nextrec/data/dataloader.py,sha256=0JYoQk5MXCwtbj-h8X38SOsb4YPJQawASCatuPNgTw4,19561
18
- nextrec/data/preprocessor.py,sha256=K-cUP-YdlQx1VJ2m1CXuprncpjDJe2ERVO5xCSoxHKI,44470
18
+ nextrec/data/dataloader.py,sha256=8kGZIrt88UnGFDOCNiMpCW5tn2H9D38GzfSaWHk-oqI,18943
19
+ nextrec/data/preprocessor.py,sha256=sIkuGNOpDTjtGy6gIlxxro3ktcUWOjIEqeWd2FN9s2g,47253
19
20
  nextrec/loss/__init__.py,sha256=ZCgsfyR5YAecv6MdOsnUjkfacvZg2coQVjuKAfPvmRo,923
20
- nextrec/loss/grad_norm.py,sha256=91Grspx95Xu_639TkL_WZRX1xt5QOTZCzBeJWbUGPiE,8385
21
+ nextrec/loss/grad_norm.py,sha256=1BU1uHh6CuNRc_M_bPP2mrVKOnUGQWv_tR_8-ETOJlg,8385
21
22
  nextrec/loss/listwise.py,sha256=UT9vJCOTOQLogVwaeTV7Z5uxIYnngGdxk-p9e97MGkU,5744
22
23
  nextrec/loss/loss_utils.py,sha256=xMmT_tWcKah_xcU3FzVMmSEzyZfxiMKZWUbwkAspcDg,4579
23
24
  nextrec/loss/pairwise.py,sha256=X9yg-8pcPt2IWU0AiUhWAt3_4W_3wIF0uSdDYTdoPFY,3398
@@ -25,28 +26,28 @@ nextrec/loss/pointwise.py,sha256=o9J3OznY0hlbDsUXqn3k-BBzYiuUH5dopz8QBFqS_kQ,734
25
26
  nextrec/models/generative/__init__.py,sha256=0MV3P-_ainPaTxmRBGWKUVCEt14KJvuvEHmRB3OQ1Fs,176
26
27
  nextrec/models/generative/tiger.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
28
  nextrec/models/multi_task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- nextrec/models/multi_task/esmm.py,sha256=AqesBZ4tOFNm7POCrHZ90h1zWWSViZAYfydUVOh2dEU,6545
29
- nextrec/models/multi_task/mmoe.py,sha256=aaQKcx4PL_mAanW3tkjAR886KmMCHTdBuu4p9EIKQJo,8657
30
- nextrec/models/multi_task/ple.py,sha256=fqkujPFGxxQOO_6nBZEz_UcxLEUoX_vCJsk0YOpxTg4,13084
31
- nextrec/models/multi_task/poso.py,sha256=J_Btxhm9JpFJMdQQHNNf9mMRHOgO7j1ts6VN5o4qJnk,19193
32
- nextrec/models/multi_task/share_bottom.py,sha256=DTWm6fpLCLiXimD-qk_0YIKT_9THMFDrnx4GDViXc_g,6583
29
+ nextrec/models/multi_task/esmm.py,sha256=WoqRtXZnAQaWHkPMGrV1PCY-BOn6tcx_B8okung84Ec,6540
30
+ nextrec/models/multi_task/mmoe.py,sha256=e6i1wG42LOrOWO602zEH7NJCXUiICcEK1xa_u5ZCQlI,8674
31
+ nextrec/models/multi_task/ple.py,sha256=KjhYR4hT91Q8XGesOp1hHw-2933sIZmJLBkI5QlrZ0s,13101
32
+ nextrec/models/multi_task/poso.py,sha256=cwLZeoFnC2Kiq7K9hxTuhVOlCTCN5RmK-7KKd9JIO_s,19241
33
+ nextrec/models/multi_task/share_bottom.py,sha256=QJrKvhq21dhV41m4MtbhCUTLUBf1uUFhDA8d4dacu9k,6600
33
34
  nextrec/models/ranking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
- nextrec/models/ranking/afm.py,sha256=96jGUPL4yTWobMIVBjHpOxl9AtAzCAGR8yw7Sy2JmdQ,10125
35
- nextrec/models/ranking/autoint.py,sha256=S6Cxnp1q2OErSYqmIix5P-b4qLWR-0dY6TMStuU6WLg,8109
36
- nextrec/models/ranking/dcn.py,sha256=whkjiKEuadl6oSP-NJdSOCOqvWZGX4EsId9oqlfVpa8,7299
37
- nextrec/models/ranking/dcn_v2.py,sha256=QnqQbJsrtQp4mtvnBXFUVefKyr4dw-gHNWrCbO26oHw,11163
38
- nextrec/models/ranking/deepfm.py,sha256=aXoK59e2KaaPe5vfyFW4YiHbX4E2iG3gxFCxmWo8RHk,5200
39
- nextrec/models/ranking/dien.py,sha256=c7Zs85vxhOgKHg5s0QcSLCn1xXCCSD177TMERgM_v8g,18958
40
- nextrec/models/ranking/din.py,sha256=gdUhuKiKXBNOALbK8fGhlbSeuDT8agcEdNSrC_wveHc,9422
41
- nextrec/models/ranking/eulernet.py,sha256=SQr7M_6GI1u09jpxzRasQLFAPLXcmqff69waER6fiD8,12201
42
- nextrec/models/ranking/ffm.py,sha256=9t685SViSU1J0ESz-lrYSXhf4d4BWLNYZXReeVEk3e8,11262
43
- nextrec/models/ranking/fibinet.py,sha256=_eroddVHooJcaGT8MqS4mUrtv5j4pnTmfI3FoAKOZhs,7919
44
- nextrec/models/ranking/fm.py,sha256=SsrSKK3y4xg5Lv-t3JLnZan55Hzze2AxAiVPuscy0bk,4536
45
- nextrec/models/ranking/lr.py,sha256=MUonlKyA77_bfshTupFjOhY5tiuSJxApFM-_yOk4Nwk,4008
46
- nextrec/models/ranking/masknet.py,sha256=tY1y2lO0iq82oylPN0SBnL5Bikc8weinFXpURyVT1hE,12373
47
- nextrec/models/ranking/pnn.py,sha256=FcNIFAw5J0ORGSR6L8ZK7NeXlJPpojwe_SpsxMQqCFw,8174
48
- nextrec/models/ranking/widedeep.py,sha256=-ghKfe_0puvlI9fBQr8lK3gXkfVvslGwP40AJTGqc7w,5077
49
- nextrec/models/ranking/xdeepfm.py,sha256=FMtl_zYO1Ty_2d9VWRsz6Jo-Xjw8vikpIQPZCDVavVY,8156
35
+ nextrec/models/ranking/afm.py,sha256=lhHTyDh51yIEhEbNyxlRaJKSPleIrhcgeE2H6tvy5UA,10142
36
+ nextrec/models/ranking/autoint.py,sha256=FbKfhXq31mUpv9pQYv7b34d_HPxDrzAiiIgcUbi-Qow,8126
37
+ nextrec/models/ranking/dcn.py,sha256=u9Wvfjom7Aqy3TyyNJevJawrI7h-MB2DOgfj2j7keZE,7316
38
+ nextrec/models/ranking/dcn_v2.py,sha256=sx0W6JaU3ZTR2DNMz2vaqVeRhwwzzCFxmyGWBkas5P0,11180
39
+ nextrec/models/ranking/deepfm.py,sha256=RN9Kjgzl0ZZwlu3gHJQtyNs5-Qv7s2eNjsO1VZMf2hk,5217
40
+ nextrec/models/ranking/dien.py,sha256=URKWeOPeRD5OIWNsAxgVvbetOSrBHoq2eO5rR5UJ0jU,18971
41
+ nextrec/models/ranking/din.py,sha256=Y8v0gONRt1OZORmn0hqMuzMfkvX0Nz1gByJ94jo3MUw,9435
42
+ nextrec/models/ranking/eulernet.py,sha256=UPTTbuog9d4kjrOPSwBiLhiBUMlXvkJm75qNzkbYG3U,12218
43
+ nextrec/models/ranking/ffm.py,sha256=8jgaCD2DLdxJ2qdm5DEOJ6ACKjopjIuOQvKYWWwgqOg,11279
44
+ nextrec/models/ranking/fibinet.py,sha256=VP0gNoQwoLKxniv2HmHzxlnR3YlrnQJt6--CwmAgsW4,7932
45
+ nextrec/models/ranking/fm.py,sha256=rNLF6Rs3AUc2H9elMsjQjHgvEsOe69Apb_T2j_CBmKg,4553
46
+ nextrec/models/ranking/lr.py,sha256=rPqDyRrJNamWE44419fwCSX0ad7MNSy8_EUKCyTnHDg,4025
47
+ nextrec/models/ranking/masknet.py,sha256=hvqe8FrU-IcPiXWFpvBzcRZc8Z8D6pMvpDola5uJGb0,12356
48
+ nextrec/models/ranking/pnn.py,sha256=wtej_QcEifQk3WFNKUl5_YZAD5yTLQoPDwCEkf9G1pg,8219
49
+ nextrec/models/ranking/widedeep.py,sha256=WAskeJbMA68_Qlxpl3vZc7KyrGVVyNQG_6LOH8VuxI4,5071
50
+ nextrec/models/ranking/xdeepfm.py,sha256=_Ng4q18IGNuHf_M1RpoAk4ypm4zLNvx3tw9uBwpAnc8,8205
50
51
  nextrec/models/representation/__init__.py,sha256=O3QHMMXBszwM-mTl7bA3wawNZvDGet-QIv6Ys5GHGJ8,190
51
52
  nextrec/models/representation/autorec.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
53
  nextrec/models/representation/bpr.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -65,14 +66,14 @@ nextrec/models/sequential/hstu.py,sha256=P2Kl7HEL3afwiCApGKQ6UbUNO9eNXXrB10H7iiF
65
66
  nextrec/models/sequential/sasrec.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
67
  nextrec/utils/__init__.py,sha256=C-1l-suSsN_MlPlj_5LApyCRQLOao5l7bO0SccwKHw4,2598
67
68
  nextrec/utils/config.py,sha256=VgCh5fto8HGodwXPJacenqjxre3Aw6tw-mntW9n3OYA,20044
68
- nextrec/utils/console.py,sha256=u-hq_VcA62B0HPok12pnLOf9aI8B3Hjyg0ysMrOBOxI,13220
69
- nextrec/utils/data.py,sha256=alruiWZFbmwy3kO12q42VXmtHmXFFjVULpHa43fx_mI,21098
69
+ nextrec/utils/console.py,sha256=jlZLCOopPHcspOx7ymWNcz3i77EgzP6v8bqZaiiBbuM,13597
70
+ nextrec/utils/data.py,sha256=pSL96mWjWfW_RKE-qlUSs9vfiYnFZAaRirzA6r7DB6s,24994
70
71
  nextrec/utils/embedding.py,sha256=akAEc062MG2cD7VIOllHaqtwzAirQR2gq5iW7oKpGAU,1449
71
72
  nextrec/utils/feature.py,sha256=rsUAv3ELyDpehVw8nPEEsLCCIjuKGTJJZuFaWB_wrPk,633
72
- nextrec/utils/model.py,sha256=3B85a0IJCggI26dxv25IX8R_5yQPo7wXI0JIAns6bkQ,1727
73
+ nextrec/utils/model.py,sha256=fHvFciUuMOVcM1oWiRva4LcArRdZ1R5Uzml-COSqqvM,4688
73
74
  nextrec/utils/torch_utils.py,sha256=AKfYbSOJjEw874xsDB5IO3Ote4X7vnqzt_E0jJny0o8,13468
74
- nextrec-0.4.16.dist-info/METADATA,sha256=21yLJcEh_Y70_gsTysLVt6X8l-YN15x9AX99x0wVB-o,21298
75
- nextrec-0.4.16.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
76
- nextrec-0.4.16.dist-info/entry_points.txt,sha256=NN-dNSdfMRTv86bNXM7d3ZEPW2BQC6bRi7QP7i9cIps,45
77
- nextrec-0.4.16.dist-info/licenses/LICENSE,sha256=2fQfVKeafywkni7MYHyClC6RGGC3laLTXCNBx-ubtp0,1064
78
- nextrec-0.4.16.dist-info/RECORD,,
75
+ nextrec-0.4.18.dist-info/METADATA,sha256=5UMrAXqxBzwFPR1SwEMh_9sSOnUA9FnUQj1hF9PTt5w,21301
76
+ nextrec-0.4.18.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
77
+ nextrec-0.4.18.dist-info/entry_points.txt,sha256=NN-dNSdfMRTv86bNXM7d3ZEPW2BQC6bRi7QP7i9cIps,45
78
+ nextrec-0.4.18.dist-info/licenses/LICENSE,sha256=2fQfVKeafywkni7MYHyClC6RGGC3laLTXCNBx-ubtp0,1064
79
+ nextrec-0.4.18.dist-info/RECORD,,