ins-pricing 0.3.2__tar.gz → 0.3.3__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 (133) hide show
  1. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/PKG-INFO +1 -1
  2. ins_pricing-0.3.3/ins_pricing/cli/BayesOpt_entry.py +56 -0
  3. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/utils/import_resolver.py +29 -3
  4. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/utils/notebook_utils.py +3 -2
  5. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/__init__.py +4 -0
  6. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/models/model_ft_components.py +38 -12
  7. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/setup.py +1 -1
  8. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/utils/torch_compat.py +40 -0
  9. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing.egg-info/PKG-INFO +1 -1
  10. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/pyproject.toml +1 -1
  11. ins_pricing-0.3.2/ins_pricing/cli/BayesOpt_entry.py +0 -24
  12. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/MANIFEST.in +0 -0
  13. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/README.md +0 -0
  14. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/CHANGELOG.md +0 -0
  15. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/README.md +0 -0
  16. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/RELEASE_NOTES_0.2.8.md +0 -0
  17. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/__init__.py +0 -0
  18. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/BayesOpt_incremental.py +0 -0
  19. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/Explain_Run.py +0 -0
  20. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/Explain_entry.py +0 -0
  21. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/Pricing_Run.py +0 -0
  22. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/__init__.py +0 -0
  23. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/bayesopt_entry_runner.py +0 -0
  24. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/utils/__init__.py +0 -0
  25. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/utils/cli_common.py +0 -0
  26. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/utils/cli_config.py +0 -0
  27. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/utils/evaluation_context.py +0 -0
  28. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/utils/run_logging.py +0 -0
  29. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/cli/watchdog_run.py +0 -0
  30. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/docs/modelling/BayesOpt_USAGE.md +0 -0
  31. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/docs/modelling/README.md +0 -0
  32. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/exceptions.py +0 -0
  33. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/governance/README.md +0 -0
  34. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/governance/__init__.py +0 -0
  35. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/governance/approval.py +0 -0
  36. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/governance/audit.py +0 -0
  37. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/governance/registry.py +0 -0
  38. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/governance/release.py +0 -0
  39. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/__init__.py +0 -0
  40. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/BayesOpt.py +0 -0
  41. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/__init__.py +0 -0
  42. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/PHASE2_REFACTORING_SUMMARY.md +0 -0
  43. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/PHASE3_REFACTORING_SUMMARY.md +0 -0
  44. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/REFACTORING_SUMMARY.md +0 -0
  45. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/config_components.py +0 -0
  46. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/config_preprocess.py +0 -0
  47. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/core.py +0 -0
  48. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/model_explain_mixin.py +0 -0
  49. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/model_plotting_mixin.py +0 -0
  50. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/models/__init__.py +0 -0
  51. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/models/model_ft_trainer.py +0 -0
  52. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/models/model_gnn.py +0 -0
  53. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/models/model_resn.py +0 -0
  54. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/trainers/__init__.py +0 -0
  55. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/trainers/trainer_base.py +0 -0
  56. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/trainers/trainer_ft.py +0 -0
  57. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/trainers/trainer_glm.py +0 -0
  58. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/trainers/trainer_gnn.py +0 -0
  59. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/trainers/trainer_resn.py +0 -0
  60. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/trainers/trainer_xgb.py +0 -0
  61. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/utils/__init__.py +0 -0
  62. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/utils/constants.py +0 -0
  63. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/utils/distributed_utils.py +0 -0
  64. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/utils/io_utils.py +0 -0
  65. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/utils/metrics_and_devices.py +0 -0
  66. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/utils/torch_trainer_mixin.py +0 -0
  67. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/utils.py +0 -0
  68. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/bayesopt/utils_backup.py +0 -0
  69. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/core/evaluation.py +0 -0
  70. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/explain/__init__.py +0 -0
  71. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/explain/gradients.py +0 -0
  72. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/explain/metrics.py +0 -0
  73. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/explain/permutation.py +0 -0
  74. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/explain/shap_utils.py +0 -0
  75. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/plotting/__init__.py +0 -0
  76. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/plotting/common.py +0 -0
  77. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/plotting/curves.py +0 -0
  78. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/plotting/diagnostics.py +0 -0
  79. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/plotting/geo.py +0 -0
  80. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/modelling/plotting/importance.py +0 -0
  81. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/pricing/README.md +0 -0
  82. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/pricing/__init__.py +0 -0
  83. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/pricing/calibration.py +0 -0
  84. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/pricing/data_quality.py +0 -0
  85. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/pricing/exposure.py +0 -0
  86. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/pricing/factors.py +0 -0
  87. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/pricing/monitoring.py +0 -0
  88. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/pricing/rate_table.py +0 -0
  89. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/production/__init__.py +0 -0
  90. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/production/drift.py +0 -0
  91. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/production/monitoring.py +0 -0
  92. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/production/predict.py +0 -0
  93. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/production/preprocess.py +0 -0
  94. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/production/scoring.py +0 -0
  95. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/reporting/README.md +0 -0
  96. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/reporting/__init__.py +0 -0
  97. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/reporting/report_builder.py +0 -0
  98. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/reporting/scheduler.py +0 -0
  99. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/governance/__init__.py +0 -0
  100. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/governance/test_audit.py +0 -0
  101. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/governance/test_registry.py +0 -0
  102. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/governance/test_release.py +0 -0
  103. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/modelling/conftest.py +0 -0
  104. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/modelling/test_cross_val_generic.py +0 -0
  105. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/modelling/test_distributed_utils.py +0 -0
  106. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/modelling/test_explain.py +0 -0
  107. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/modelling/test_geo_tokens_split.py +0 -0
  108. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/modelling/test_graph_cache.py +0 -0
  109. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/modelling/test_plotting.py +0 -0
  110. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/modelling/test_plotting_library.py +0 -0
  111. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/modelling/test_preprocessor.py +0 -0
  112. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/pricing/__init__.py +0 -0
  113. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/pricing/test_calibration.py +0 -0
  114. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/pricing/test_exposure.py +0 -0
  115. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/pricing/test_factors.py +0 -0
  116. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/pricing/test_rate_table.py +0 -0
  117. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/production/__init__.py +0 -0
  118. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/production/test_monitoring.py +0 -0
  119. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/production/test_predict.py +0 -0
  120. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/production/test_preprocess.py +0 -0
  121. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/tests/production/test_scoring.py +0 -0
  122. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/utils/__init__.py +0 -0
  123. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/utils/device.py +0 -0
  124. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/utils/logging.py +0 -0
  125. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/utils/metrics.py +0 -0
  126. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/utils/paths.py +0 -0
  127. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/utils/profiling.py +0 -0
  128. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing/utils/validation.py +0 -0
  129. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing.egg-info/SOURCES.txt +0 -0
  130. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing.egg-info/dependency_links.txt +0 -0
  131. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing.egg-info/requires.txt +0 -0
  132. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/ins_pricing.egg-info/top_level.txt +0 -0
  133. {ins_pricing-0.3.2 → ins_pricing-0.3.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ins_pricing
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Reusable modelling, pricing, governance, and reporting utilities.
5
5
  Author: meishi125478
6
6
  License: Proprietary
@@ -0,0 +1,56 @@
1
+ """Thin wrapper for the BayesOpt CLI entry point.
2
+
3
+ The main implementation lives in bayesopt_entry_runner.py.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from pathlib import Path
9
+ import json
10
+ import os
11
+ import sys
12
+
13
+ if __package__ in {None, ""}:
14
+ repo_root = Path(__file__).resolve().parents[2]
15
+ if str(repo_root) not in sys.path:
16
+ sys.path.insert(0, str(repo_root))
17
+
18
+ def _apply_env_from_config(argv: list[str]) -> None:
19
+ if "--config-json" not in argv:
20
+ return
21
+ idx = argv.index("--config-json")
22
+ if idx + 1 >= len(argv):
23
+ return
24
+ raw_path = argv[idx + 1]
25
+ try:
26
+ cfg_path = Path(raw_path).expanduser()
27
+ if not cfg_path.is_absolute():
28
+ cfg_path = cfg_path.resolve()
29
+ if not cfg_path.exists():
30
+ script_dir = Path(__file__).resolve().parents[1]
31
+ candidate = (script_dir / raw_path).resolve()
32
+ if candidate.exists():
33
+ cfg_path = candidate
34
+ if not cfg_path.exists():
35
+ return
36
+ cfg = json.loads(cfg_path.read_text(encoding="utf-8", errors="replace"))
37
+ env = cfg.get("env", {})
38
+ if isinstance(env, dict):
39
+ for key, value in env.items():
40
+ if key is None:
41
+ continue
42
+ os.environ.setdefault(str(key), str(value))
43
+ except Exception:
44
+ return
45
+
46
+ _apply_env_from_config(sys.argv)
47
+
48
+ try:
49
+ from .bayesopt_entry_runner import main
50
+ except Exception: # pragma: no cover
51
+ from ins_pricing.cli.bayesopt_entry_runner import main
52
+
53
+ __all__ = ["main"]
54
+
55
+ if __name__ == "__main__":
56
+ main()
@@ -13,6 +13,7 @@ Usage:
13
13
  from __future__ import annotations
14
14
 
15
15
  import importlib
16
+ import os
16
17
  import sys
17
18
  from dataclasses import dataclass, field
18
19
  from pathlib import Path
@@ -70,14 +71,39 @@ class ResolvedImports:
70
71
  plot_loss_curve: Optional[Callable] = None
71
72
 
72
73
 
74
+ def _debug_imports_enabled() -> bool:
75
+ value = os.environ.get("BAYESOPT_DEBUG_IMPORTS")
76
+ if value is None:
77
+ return False
78
+ return str(value).strip().lower() in {"1", "true", "yes", "y", "on"}
79
+
80
+
73
81
  def _try_import(module_path: str, attr_name: Optional[str] = None) -> Optional[Any]:
74
82
  """Attempt to import a module or attribute, returning None on failure."""
75
83
  try:
76
84
  module = importlib.import_module(module_path)
77
85
  if attr_name:
78
- return getattr(module, attr_name, None)
79
- return module
80
- except Exception:
86
+ result = getattr(module, attr_name, None)
87
+ else:
88
+ result = module
89
+ if _debug_imports_enabled():
90
+ origin = getattr(module, "__file__", None)
91
+ origin = origin or getattr(module, "__path__", None)
92
+ print(
93
+ f"[BAYESOPT_DEBUG_IMPORTS] imported {module_path}"
94
+ f"{'::' + attr_name if attr_name else ''} from {origin}",
95
+ file=sys.stderr,
96
+ flush=True,
97
+ )
98
+ return result
99
+ except Exception as exc:
100
+ if _debug_imports_enabled():
101
+ print(
102
+ f"[BAYESOPT_DEBUG_IMPORTS] failed import {module_path}"
103
+ f"{'::' + attr_name if attr_name else ''}: {exc.__class__.__name__}: {exc}",
104
+ file=sys.stderr,
105
+ flush=True,
106
+ )
81
107
  return None
82
108
 
83
109
 
@@ -8,9 +8,9 @@ from pathlib import Path
8
8
  from typing import Iterable, List, Optional, Sequence, cast
9
9
 
10
10
  try:
11
- from .cli_config import add_config_json_arg # type: ignore
11
+ from .cli_config import add_config_json_arg, set_env # type: ignore
12
12
  except Exception: # pragma: no cover
13
- from cli_config import add_config_json_arg # type: ignore
13
+ from cli_config import add_config_json_arg, set_env # type: ignore
14
14
 
15
15
 
16
16
  def _find_ins_pricing_dir(cwd: Optional[Path] = None) -> Path:
@@ -261,6 +261,7 @@ def run_from_config(config_json: str | Path) -> subprocess.CompletedProcess:
261
261
  if not config_path.is_absolute():
262
262
  config_path = (pkg_dir / config_path).resolve() if (pkg_dir / config_path).exists() else config_path.resolve()
263
263
  raw = json.loads(config_path.read_text(encoding="utf-8", errors="replace"))
264
+ set_env(raw.get("env", {}))
264
265
  runner = cast(dict, raw.get("runner") or {})
265
266
 
266
267
  mode = str(runner.get("mode") or "entry").strip().lower()
@@ -4,6 +4,10 @@ from __future__ import annotations
4
4
 
5
5
  import torch
6
6
 
7
+ from ins_pricing.utils.torch_compat import disable_torch_dynamo_if_requested
8
+
9
+ disable_torch_dynamo_if_requested()
10
+
7
11
  from .config_preprocess import (
8
12
  BayesOptConfig,
9
13
  DatasetPreprocessor,
@@ -106,31 +106,58 @@ class ScaledTransformerEncoderLayer(nn.Module):
106
106
  self.res_scale_attn = residual_scale_attn
107
107
  self.res_scale_ffn = residual_scale_ffn
108
108
 
109
- def forward(self, src, src_mask=None, src_key_padding_mask=None):
109
+ def forward(self, src, src_mask=None, src_key_padding_mask=None, is_causal: Optional[bool] = None, **_kwargs):
110
110
  # Input tensor shape: (batch, seq_len, d_model).
111
111
  x = src
112
112
 
113
113
  if self.norm_first:
114
114
  # Pre-norm before attention.
115
- x = x + self._sa_block(self.norm1(x), src_mask,
116
- src_key_padding_mask)
115
+ x = x + self._sa_block(
116
+ self.norm1(x),
117
+ src_mask,
118
+ src_key_padding_mask,
119
+ is_causal=is_causal,
120
+ )
117
121
  x = x + self._ff_block(self.norm2(x))
118
122
  else:
119
123
  # Post-norm (usually disabled).
120
124
  x = self.norm1(
121
- x + self._sa_block(x, src_mask, src_key_padding_mask))
125
+ x + self._sa_block(
126
+ x,
127
+ src_mask,
128
+ src_key_padding_mask,
129
+ is_causal=is_causal,
130
+ )
131
+ )
122
132
  x = self.norm2(x + self._ff_block(x))
123
133
 
124
134
  return x
125
135
 
126
- def _sa_block(self, x, attn_mask, key_padding_mask):
136
+ def _sa_block(self, x, attn_mask, key_padding_mask, *, is_causal: Optional[bool] = None):
127
137
  # Self-attention with residual scaling.
128
- attn_out, _ = self.self_attn(
129
- x, x, x,
130
- attn_mask=attn_mask,
131
- key_padding_mask=key_padding_mask,
132
- need_weights=False
133
- )
138
+ if is_causal is None:
139
+ attn_out, _ = self.self_attn(
140
+ x, x, x,
141
+ attn_mask=attn_mask,
142
+ key_padding_mask=key_padding_mask,
143
+ need_weights=False,
144
+ )
145
+ else:
146
+ try:
147
+ attn_out, _ = self.self_attn(
148
+ x, x, x,
149
+ attn_mask=attn_mask,
150
+ key_padding_mask=key_padding_mask,
151
+ need_weights=False,
152
+ is_causal=is_causal,
153
+ )
154
+ except TypeError:
155
+ attn_out, _ = self.self_attn(
156
+ x, x, x,
157
+ attn_mask=attn_mask,
158
+ key_padding_mask=key_padding_mask,
159
+ need_weights=False,
160
+ )
134
161
  return self.res_scale_attn * self.dropout1(attn_out)
135
162
 
136
163
  def _ff_block(self, x):
@@ -313,4 +340,3 @@ class MaskedTabularDataset(Dataset):
313
340
  None if self.X_cat_true is None else self.X_cat_true[idx],
314
341
  None if self.cat_mask is None else self.cat_mask[idx],
315
342
  )
316
-
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages
3
3
 
4
4
  setup(
5
5
  name="ins_pricing",
6
- version="0.3.2",
6
+ version="0.3.3",
7
7
  description="Reusable modelling, pricing, governance, and reporting utilities.",
8
8
  author="meishi125478",
9
9
  license="Proprietary",
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import inspect
6
+ import os
6
7
  from typing import Any, Optional
7
8
 
8
9
  try:
@@ -14,6 +15,7 @@ except ImportError: # pragma: no cover - handled by callers
14
15
  torch = None
15
16
 
16
17
  _SUPPORTS_WEIGHTS_ONLY: Optional[bool] = None
18
+ _DYNAMO_PATCHED = False
17
19
 
18
20
 
19
21
  def _supports_weights_only() -> bool:
@@ -43,3 +45,41 @@ def torch_load(
43
45
  if weights_only is not None and _supports_weights_only():
44
46
  return torch.load(path, *args, weights_only=weights_only, **kwargs)
45
47
  return torch.load(path, *args, **kwargs)
48
+
49
+
50
+ def _env_truthy(key: str) -> bool:
51
+ value = os.environ.get(key)
52
+ if value is None:
53
+ return False
54
+ return str(value).strip().lower() in {"1", "true", "yes", "y", "on"}
55
+
56
+
57
+ def disable_torch_dynamo_if_requested() -> None:
58
+ """Disable torch._dynamo wrappers when compile is explicitly disabled."""
59
+ global _DYNAMO_PATCHED
60
+ if _DYNAMO_PATCHED or not TORCH_AVAILABLE:
61
+ return
62
+
63
+ if not any(
64
+ _env_truthy(k)
65
+ for k in (
66
+ "TORCHDYNAMO_DISABLE",
67
+ "TORCH_DISABLE_DYNAMO",
68
+ "TORCH_COMPILE_DISABLE",
69
+ "TORCHINDUCTOR_DISABLE",
70
+ )
71
+ ):
72
+ return
73
+
74
+ try:
75
+ import torch.optim.optimizer as optim_mod
76
+ except Exception:
77
+ return
78
+
79
+ for name in ("state_dict", "load_state_dict", "zero_grad", "add_param_group"):
80
+ fn = getattr(optim_mod.Optimizer, name, None)
81
+ wrapped = getattr(fn, "__wrapped__", None)
82
+ if wrapped is not None:
83
+ setattr(optim_mod.Optimizer, name, wrapped)
84
+
85
+ _DYNAMO_PATCHED = True
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ins_pricing
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Reusable modelling, pricing, governance, and reporting utilities.
5
5
  Author: meishi125478
6
6
  License: Proprietary
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ins_pricing"
7
- version = "0.3.2"
7
+ version = "0.3.3"
8
8
  description = "Reusable modelling, pricing, governance, and reporting utilities."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,24 +0,0 @@
1
- """Thin wrapper for the BayesOpt CLI entry point.
2
-
3
- The main implementation lives in bayesopt_entry_runner.py.
4
- """
5
-
6
- from __future__ import annotations
7
-
8
- from pathlib import Path
9
- import sys
10
-
11
- if __package__ in {None, ""}:
12
- repo_root = Path(__file__).resolve().parents[2]
13
- if str(repo_root) not in sys.path:
14
- sys.path.insert(0, str(repo_root))
15
-
16
- try:
17
- from .bayesopt_entry_runner import main
18
- except Exception: # pragma: no cover
19
- from ins_pricing.cli.bayesopt_entry_runner import main
20
-
21
- __all__ = ["main"]
22
-
23
- if __name__ == "__main__":
24
- main()
File without changes
File without changes
File without changes