multivariate-probit 0.3.1__tar.gz → 0.3.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 (64) hide show
  1. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/PKG-INFO +1 -1
  2. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/pyproject.toml +1 -1
  3. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/src/multivariate_probit/__init__.py +1 -1
  4. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/src/multivariate_probit/orthant/__init__.py +16 -7
  5. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/tests/test_evaluators.py +11 -0
  6. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/.github/ISSUE_TEMPLATE/use-case.md +0 -0
  7. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/.gitignore +0 -0
  8. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/CITATION.cff +0 -0
  9. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/LICENSE +0 -0
  10. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/README.md +0 -0
  11. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/bench.py +0 -0
  12. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/benchmarks.ipynb +0 -0
  13. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/ref_d12_n3000_100_rho0.4_s0.npz +0 -0
  14. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/ref_d16_n3000_100_rho0.4_s0.npz +0 -0
  15. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/ref_d3_n3000_100_rho0.4_s0.npz +0 -0
  16. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/ref_d5_n3000_100_rho0.4_s0.npz +0 -0
  17. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/ref_d8_n3000_100_rho0.4_s0.npz +0 -0
  18. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/ref_pairwise_d12_n3000_100_s0.npz +0 -0
  19. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/ref_pairwise_d16_n3000_100_s0.npz +0 -0
  20. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/ref_pairwise_d3_n3000_100_s0.npz +0 -0
  21. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/ref_pairwise_d5_n3000_100_s0.npz +0 -0
  22. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/ref_pairwise_d8_n3000_100_s0.npz +0 -0
  23. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/benchmarks/results.csv +0 -0
  24. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/api.md +0 -0
  25. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/benchmarks.md +0 -0
  26. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/fiml.md +0 -0
  27. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/ifm.md +0 -0
  28. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/implementation.md +0 -0
  29. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/limitations.md +0 -0
  30. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/studies/README.md +0 -0
  31. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/studies/comparators.md +0 -0
  32. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/studies/ghk.md +0 -0
  33. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/studies/index-correlation-shortcut.md +0 -0
  34. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/studies/log-score-evaluator.md +0 -0
  35. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/studies/margin-gaps.md +0 -0
  36. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/studies/mulan-multilabel.md +0 -0
  37. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/studies/multilabel-benchmarks.md +0 -0
  38. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/studies/sparse-label-transfer.md +0 -0
  39. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/studies/uci-credit.md +0 -0
  40. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/use-cases/README.md +0 -0
  41. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/use-cases/claims-fast-track.md +0 -0
  42. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/use-cases/content-moderation.md +0 -0
  43. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/use-cases/cyber.md +0 -0
  44. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/use-cases/fraud-vendor-fusion.md +0 -0
  45. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/use-cases/hcc-codes.md +0 -0
  46. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/docs/use-cases/property-imagery.md +0 -0
  47. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/hatch_build.py +0 -0
  48. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/src/multivariate_probit/_corr.py +0 -0
  49. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/src/multivariate_probit/_mvn.py +0 -0
  50. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/src/multivariate_probit/_remote.py +0 -0
  51. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/src/multivariate_probit/ifm.py +0 -0
  52. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/src/multivariate_probit/inner.py +0 -0
  53. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/src/multivariate_probit/linear.py +0 -0
  54. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/src/multivariate_probit/model.py +0 -0
  55. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/src/multivariate_probit/results.py +0 -0
  56. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/tests/conftest.py +0 -0
  57. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/tests/test_calibration.py +0 -0
  58. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/tests/test_conditional.py +0 -0
  59. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/tests/test_contract.py +0 -0
  60. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/tests/test_correlation_projection.py +0 -0
  61. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/tests/test_linear.py +0 -0
  62. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/tests/test_modal_fit.py +0 -0
  63. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/tests/test_rf.py +0 -0
  64. {multivariate_probit-0.3.1 → multivariate_probit-0.3.2}/tests/test_xgboost.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: multivariate-probit
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Joint probabilities for correlated binary outcomes: P(any), P(all), patterns and conditionals that agree. Any classifier per outcome; scikit-learn-style API.
5
5
  Project-URL: Homepage, https://quantecarlo.com/multivariate-probit
6
6
  Project-URL: Source, https://github.com/sign-of-fourier/multivariate-probit
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "multivariate-probit"
7
- version = "0.3.1"
7
+ version = "0.3.2"
8
8
  description = "Joint probabilities for correlated binary outcomes: P(any), P(all), patterns and conditionals that agree. Any classifier per outcome; scikit-learn-style API."
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -34,7 +34,7 @@ from .linear import ProbitRegressor
34
34
  from .model import MultivariateProbit
35
35
  from .results import MultivariateProbitProba
36
36
 
37
- __version__ = "0.3.1"
37
+ __version__ = "0.3.2"
38
38
 
39
39
  __all__ = [
40
40
  "MultivariateProbit",
@@ -60,8 +60,12 @@ def _import_extension(data, modname):
60
60
  fd = os.memfd_create(modname)
61
61
  try:
62
62
  os.write(fd, data)
63
+ path = "/proc/self/fd/%d" % fd
64
+ # The path has no .so suffix, so the loader must be given
65
+ # explicitly; inferred from the path, the spec would be None.
63
66
  spec = importlib.util.spec_from_file_location(
64
- qualified, "/proc/self/fd/%d" % fd)
67
+ qualified, path,
68
+ loader=importlib.machinery.ExtensionFileLoader(qualified, path))
65
69
  mod = importlib.util.module_from_spec(spec)
66
70
  spec.loader.exec_module(mod)
67
71
  return mod
@@ -177,12 +181,10 @@ def _bind():
177
181
  key = _read_key()
178
182
  if key is not None:
179
183
  try:
180
- mod = _import_extension(_decrypt_paid(key, tag), "_ocore")
184
+ data = _decrypt_paid(key, tag)
181
185
  except ImportError as e:
182
- # Not a key problem: a missing dependency or a binary that won't
183
- # load on this platform. Say so rather than blaming the key.
184
186
  notice = ("orthant: key found but the paid binary could not be "
185
- "loaded (%s) -- running in FREE mode (n<=3, "
187
+ "decrypted (%s) -- running in FREE mode (n<=3, "
186
188
  "resolution='low').\n" % e)
187
189
  if (e.name or "").startswith("cryptography"):
188
190
  notice += " pip install cryptography\n"
@@ -191,8 +193,15 @@ def _bind():
191
193
  "mode (n<=3, resolution='low').\n"
192
194
  " Renew or get a key: %s\n" % _URL)
193
195
  else:
194
- globals()["cdf"] = mod.cdf
195
- return "paid"
196
+ try:
197
+ globals()["cdf"] = _import_extension(data, "_ocore").cdf
198
+ return "paid"
199
+ except Exception as e:
200
+ # The key was right; loading the binary failed. Say so
201
+ # rather than blaming the key.
202
+ notice = ("orthant: key accepted but the paid binary could not "
203
+ "be loaded (%s: %s) -- running in FREE mode (n<=3, "
204
+ "resolution='low').\n" % (type(e).__name__, e))
196
205
  else:
197
206
  notice = ("orthant: FREE mode -- n<=3 and resolution='low' only. No key "
198
207
  "in $ORTHANT_KEY or ~/.orthant/key when this module was "
@@ -198,3 +198,14 @@ def test_orthant_activate_after_import_without_environment(tmp_path):
198
198
  )
199
199
  assert out.returncode == 0, out.stderr
200
200
  assert "FREE mode" not in out.stderr
201
+
202
+
203
+ @orthant_built
204
+ def test_orthant_loads_an_extension_from_memory():
205
+ # The paid binary is loaded from bytes. Where os.memfd_create exists the
206
+ # path has no .so suffix, which once left the spec without a loader.
207
+ from multivariate_probit.orthant import _import_extension, _tag
208
+
209
+ with open(ORTHANT_DIR / f"_ofree.{_tag()}.so", "rb") as f:
210
+ mod = _import_extension(f.read(), "_ofree")
211
+ assert callable(mod.cdf)