mostlyai-engine 1.5.0__tar.gz → 1.5.2__tar.gz

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 (51) hide show
  1. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/PKG-INFO +1 -1
  2. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/__init__.py +1 -1
  3. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_tabular/argn.py +22 -10
  4. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_tabular/generation.py +4 -7
  5. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/pyproject.toml +1 -1
  6. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/.gitignore +0 -0
  7. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/LICENSE +0 -0
  8. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/README.md +0 -0
  9. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_common.py +0 -0
  10. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_dtypes.py +0 -0
  11. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/__init__.py +0 -0
  12. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/language/__init__.py +0 -0
  13. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/language/categorical.py +0 -0
  14. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/language/datetime.py +0 -0
  15. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/language/numeric.py +0 -0
  16. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/language/text.py +0 -0
  17. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/tabular/__init__.py +0 -0
  18. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/tabular/categorical.py +0 -0
  19. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/tabular/character.py +0 -0
  20. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/tabular/datetime.py +0 -0
  21. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/tabular/itt.py +0 -0
  22. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/tabular/lat_long.py +0 -0
  23. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_encoding_types/tabular/numeric.py +0 -0
  24. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_language/__init__.py +0 -0
  25. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_language/common.py +0 -0
  26. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_language/encoding.py +0 -0
  27. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_language/engine/__init__.py +0 -0
  28. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_language/engine/base.py +0 -0
  29. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_language/engine/hf_engine.py +0 -0
  30. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_language/engine/vllm_engine.py +0 -0
  31. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_language/generation.py +0 -0
  32. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_language/lstm.py +0 -0
  33. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_language/tokenizer_utils.py +0 -0
  34. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_language/training.py +0 -0
  35. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_language/xgrammar_utils.py +0 -0
  36. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_memory.py +0 -0
  37. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_tabular/__init__.py +0 -0
  38. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_tabular/common.py +0 -0
  39. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_tabular/encoding.py +0 -0
  40. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_tabular/fairness.py +0 -0
  41. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_tabular/training.py +0 -0
  42. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_training_utils.py +0 -0
  43. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/_workspace.py +0 -0
  44. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/analysis.py +0 -0
  45. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/domain.py +0 -0
  46. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/encoding.py +0 -0
  47. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/generation.py +0 -0
  48. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/logging.py +0 -0
  49. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/random_state.py +0 -0
  50. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/splitting.py +0 -0
  51. {mostlyai_engine-1.5.0 → mostlyai_engine-1.5.2}/mostlyai/engine/training.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyai-engine
3
- Version: 1.5.0
3
+ Version: 1.5.2
4
4
  Summary: Synthetic Data Engine
5
5
  Project-URL: homepage, https://github.com/mostly-ai/mostlyai-engine
6
6
  Project-URL: repository, https://github.com/mostly-ai/mostlyai-engine
@@ -22,7 +22,7 @@ from mostlyai.engine.splitting import split
22
22
  from mostlyai.engine.training import train
23
23
 
24
24
  __all__ = ["split", "analyze", "encode", "train", "generate", "init_logging", "set_random_state"]
25
- __version__ = "1.5.0"
25
+ __version__ = "1.5.2"
26
26
 
27
27
  # suppress specific warning related to os.fork() in multi-threaded processes
28
28
  warnings.filterwarnings("ignore", category=DeprecationWarning, message=".*multi-threaded.*fork.*")
@@ -216,8 +216,15 @@ class Embedders(nn.Module):
216
216
  self.embedders = nn.ModuleDict()
217
217
 
218
218
  # embedding layers for each sub column defined in cardinalities
219
+ has_ridx = any(sub_col.startswith(RIDX_SUB_COLUMN_PREFIX) for sub_col in self.cardinalities)
219
220
  last_slen_sub_col = next(
220
- (sub_col for sub_col in reversed(self.cardinalities) if sub_col.startswith(SLEN_SUB_COLUMN_PREFIX)), None
221
+ (
222
+ sub_col
223
+ for sub_col in reversed(self.cardinalities)
224
+ if sub_col.startswith(SLEN_SUB_COLUMN_PREFIX)
225
+ if has_ridx # last SLEN sub column is dangling for model with RIDX only
226
+ ),
227
+ None,
221
228
  )
222
229
  last_ridx_sub_col = next(
223
230
  (sub_col for sub_col in reversed(self.cardinalities) if sub_col.startswith(RIDX_SUB_COLUMN_PREFIX)), None
@@ -1249,21 +1256,26 @@ class SequentialModel(nn.Module):
1249
1256
  if context is None:
1250
1257
  context = self.context_compressor(x)
1251
1258
 
1259
+ # SLEN is only masked for models with RIDX
1260
+ has_ridx = any(sub_col.startswith(RIDX_SUB_COLUMN_PREFIX) for sub_col in self.tgt_cardinalities)
1261
+ masked_positional_columns = (
1262
+ (SLEN_SUB_COLUMN_PREFIX, RIDX_SUB_COLUMN_PREFIX) if has_ridx else (RIDX_SUB_COLUMN_PREFIX,)
1263
+ )
1264
+
1252
1265
  outputs = {}
1253
1266
  if mode == "trn":
1254
1267
  # forward pass through sub column embedders
1255
1268
  tgt_embeds = self.embedders(x)
1256
- tgt_embeds_slen_ridx_masked = {
1257
- k: torch.zeros_like(v) if k.startswith((RIDX_SUB_COLUMN_PREFIX, SLEN_SUB_COLUMN_PREFIX)) else v
1258
- for k, v in tgt_embeds.items()
1269
+ tgt_embeds_positional_masked = {
1270
+ k: torch.zeros_like(v) if k.startswith(masked_positional_columns) else v for k, v in tgt_embeds.items()
1259
1271
  }
1260
1272
 
1261
1273
  # forward pass through column embedders
1262
- tgt_col_embeds = self.column_embedders(tgt_embeds_slen_ridx_masked)
1274
+ tgt_col_embeds = self.column_embedders(tgt_embeds_positional_masked)
1263
1275
 
1264
1276
  # history
1265
1277
  # time shift: remove last time step; add zeros for first time step; add randoms for all others
1266
- embeddings = torch.cat(list(tgt_embeds_slen_ridx_masked.values()), dim=-1)
1278
+ embeddings = torch.cat(list(tgt_embeds_positional_masked.values()), dim=-1)
1267
1279
  history_in = embeddings[:, :-1, :]
1268
1280
  history_in = nn.ConstantPad2d((0, 0, 1, 0), 0)(history_in)
1269
1281
  history, _ = self.history_compressor(history_in)
@@ -1393,20 +1405,20 @@ class SequentialModel(nn.Module):
1393
1405
 
1394
1406
  # update current sub column embedding
1395
1407
  tgt_embeds[sub_col] = self.embedders.get(sub_col)(out)
1396
- tgt_embeds_slen_ridx_masked = {
1397
- k: torch.zeros_like(v) if k.startswith((SLEN_SUB_COLUMN_PREFIX, RIDX_SUB_COLUMN_PREFIX)) else v
1408
+ tgt_embeds_positional_masked = {
1409
+ k: torch.zeros_like(v) if k.startswith(masked_positional_columns) else v
1398
1410
  for k, v in tgt_embeds.items()
1399
1411
  }
1400
1412
 
1401
1413
  # update current column embedding
1402
1414
  if sub_col in self.tgt_last_sub_cols:
1403
1415
  col_sub_cols = self.tgt_column_sub_columns[lookup.col_name]
1404
- col_embed_in = torch.cat([tgt_embeds_slen_ridx_masked[sc] for sc in col_sub_cols], dim=-1)
1416
+ col_embed_in = torch.cat([tgt_embeds_positional_masked[sc] for sc in col_sub_cols], dim=-1)
1405
1417
  tgt_col_embeds[lookup.col_name] = self.column_embedders.get(lookup.col_name)(col_embed_in)
1406
1418
  col_embeddings = torch.cat(list(tgt_col_embeds.values()), dim=-1)
1407
1419
 
1408
1420
  # update history and hidden state
1409
- history_in = torch.cat([v for v in tgt_embeds_slen_ridx_masked.values()], dim=-1)
1421
+ history_in = torch.cat([v for v in tgt_embeds_positional_masked.values()], dim=-1)
1410
1422
  history, history_state = self.history_compressor(history_in, history_state=history_state)
1411
1423
 
1412
1424
  # order outputs according to tgt_sub_columns
@@ -814,13 +814,10 @@ def generate(
814
814
  )
815
815
 
816
816
  # trim sequences in seed_data to seq_len_max for sequential generation
817
- if is_sequential:
818
- _LOG.warning(f"limiting user-provided seed sequences to a maximum length of `{seq_len_max}`")
819
- seed_data = (
820
- seed_data.groupby(tgt_context_key, group_keys=False)
821
- .apply(lambda x: x.iloc[:seq_len_max])
822
- .reset_index(drop=True)
823
- )
817
+ seed_data_grouped = seed_data.groupby(tgt_context_key, group_keys=False)
818
+ if is_sequential and (seed_seq_len_max := seed_data_grouped.size().max()) > seq_len_max:
819
+ _LOG.warning(f"truncating seed sequences: max allowed = `{seq_len_max}`, found = `{seed_seq_len_max}`")
820
+ seed_data = seed_data_grouped.apply(lambda x: x.iloc[:seq_len_max]).reset_index(drop=True)
824
821
 
825
822
  # ensure valid columns in seed_data
826
823
  tgt_columns = (
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mostlyai-engine"
3
- version = "1.5.0"
3
+ version = "1.5.2"
4
4
  description = "Synthetic Data Engine"
5
5
  authors = [{ name = "MOSTLY AI", email = "dev@mostly.ai" }]
6
6
  requires-python = ">=3.10"
File without changes