views-frames 1.1.0__tar.gz → 1.1.1__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 (32) hide show
  1. {views_frames-1.1.0 → views_frames-1.1.1}/PKG-INFO +18 -3
  2. {views_frames-1.1.0 → views_frames-1.1.1}/README.md +17 -2
  3. {views_frames-1.1.0 → views_frames-1.1.1}/pyproject.toml +1 -1
  4. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames_summarize/tower.py +5 -4
  5. {views_frames-1.1.0 → views_frames-1.1.1}/.gitignore +0 -0
  6. {views_frames-1.1.0 → views_frames-1.1.1}/LICENSE +0 -0
  7. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/__init__.py +0 -0
  8. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/_typing.py +0 -0
  9. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/_validation.py +0 -0
  10. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/conformance/__init__.py +0 -0
  11. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/feature_frame.py +0 -0
  12. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/index.py +0 -0
  13. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/io/__init__.py +0 -0
  14. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/io/arrow.py +0 -0
  15. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/io/npz.py +0 -0
  16. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/metadata.py +0 -0
  17. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/prediction_frame.py +0 -0
  18. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/protocols.py +0 -0
  19. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/py.typed +0 -0
  20. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/spatial_level.py +0 -0
  21. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames/target_frame.py +0 -0
  22. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames_summarize/__init__.py +0 -0
  23. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames_summarize/_common.py +0 -0
  24. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames_summarize/aggregate.py +0 -0
  25. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames_summarize/bimodality.py +0 -0
  26. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames_summarize/collapse.py +0 -0
  27. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames_summarize/conformance.py +0 -0
  28. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames_summarize/interval.py +0 -0
  29. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames_summarize/point.py +0 -0
  30. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames_summarize/py.typed +0 -0
  31. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames_summarize/summarize_tower.py +0 -0
  32. {views_frames-1.1.0 → views_frames-1.1.1}/src/views_frames_summarize/tower_point.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: views-frames
3
- Version: 1.1.0
3
+ Version: 1.1.1
4
4
  Summary: The VIEWS platform data-contract layer: immutable array+identifier frames (numpy only, root of the dependency DAG).
5
5
  Project-URL: Homepage, https://github.com/views-platform/views-frames
6
6
  Project-URL: Repository, https://github.com/views-platform/views-frames
@@ -30,8 +30,8 @@ Description-Content-Type: text/markdown
30
30
  > containers (`FeatureFrame`, `PredictionFrame`, and their anticipated siblings)
31
31
  > that every other repo depends on and that depends on nothing internal.
32
32
  >
33
- > **Status:** **v1.1.0 — frozen API** (frozen since v1.0.0, ADR-018; the v1.1.0 surface
34
- > is purely additive — the coherent posterior summary, ADR-019). This README is the design
33
+ > **Status:** **v1.1.1 — frozen API** (frozen since v1.0.0, ADR-018; the v1.1.0 surface
34
+ > is purely additive — the coherent posterior summary, ADR-019; v1.1.1 is a docs patch). This README is the design
35
35
  > bible; the contract it specifies is realised in `src/views_frames/` (index, frames,
36
36
  > io, conformance suite) plus the `src/views_frames_summarize/` sibling package
37
37
  > (sample-axis summarization — `collapse`/MAP/HDI/quantiles, the coherent-tower estimators
@@ -95,6 +95,21 @@ Both are numpy-only. For the subtler cm↔pgm surface — a time-varying
95
95
  `aggregate_distributions` (`HDI(sum) ≠ sum(HDI)`) — see
96
96
  [`examples/cross_level.py`](examples/cross_level.py).
97
97
 
98
+ **Which estimator? (two coherent paths, v1.1.0).** Each frozen estimator has a
99
+ coherent-tower sibling (ADR-019): `map_estimate` ↔ `tower_point` (an unbinned
100
+ median-of-the-narrowest-floor point, free of `map_estimate`'s histogram tie-break bias),
101
+ and `hdi`/`quantiles` ↔ `hdi_tower(masses=…)` (HDIs nested **by construction** and
102
+ reproducible — a mass's interval is identical regardless of which others you request),
103
+ with `summarize_tower` returning all three in one pass. Use the **frozen** estimators for
104
+ parity with existing pipelines; use the **tower** path when you need coherent, reproducible
105
+ bands plus a matching point.
106
+
107
+ **Reading the `bimodality` flag.** It is a *deliberately conservative* heuristic, **not** a
108
+ formal multimodality test — tuned for **zero false positives** at the cost of recall on
109
+ overlapping / unequal mixtures. A `1` means "clearly-separated modes detected"; a `0` means
110
+ **"no clear bimodality detected," not "proven unimodal."** (Full caveat: the `bimodality`
111
+ module docstring; register C-34.)
112
+
98
113
  ---
99
114
 
100
115
  ## 1. Why this package exists (the problems it kills)
@@ -4,8 +4,8 @@
4
4
  > containers (`FeatureFrame`, `PredictionFrame`, and their anticipated siblings)
5
5
  > that every other repo depends on and that depends on nothing internal.
6
6
  >
7
- > **Status:** **v1.1.0 — frozen API** (frozen since v1.0.0, ADR-018; the v1.1.0 surface
8
- > is purely additive — the coherent posterior summary, ADR-019). This README is the design
7
+ > **Status:** **v1.1.1 — frozen API** (frozen since v1.0.0, ADR-018; the v1.1.0 surface
8
+ > is purely additive — the coherent posterior summary, ADR-019; v1.1.1 is a docs patch). This README is the design
9
9
  > bible; the contract it specifies is realised in `src/views_frames/` (index, frames,
10
10
  > io, conformance suite) plus the `src/views_frames_summarize/` sibling package
11
11
  > (sample-axis summarization — `collapse`/MAP/HDI/quantiles, the coherent-tower estimators
@@ -69,6 +69,21 @@ Both are numpy-only. For the subtler cm↔pgm surface — a time-varying
69
69
  `aggregate_distributions` (`HDI(sum) ≠ sum(HDI)`) — see
70
70
  [`examples/cross_level.py`](examples/cross_level.py).
71
71
 
72
+ **Which estimator? (two coherent paths, v1.1.0).** Each frozen estimator has a
73
+ coherent-tower sibling (ADR-019): `map_estimate` ↔ `tower_point` (an unbinned
74
+ median-of-the-narrowest-floor point, free of `map_estimate`'s histogram tie-break bias),
75
+ and `hdi`/`quantiles` ↔ `hdi_tower(masses=…)` (HDIs nested **by construction** and
76
+ reproducible — a mass's interval is identical regardless of which others you request),
77
+ with `summarize_tower` returning all three in one pass. Use the **frozen** estimators for
78
+ parity with existing pipelines; use the **tower** path when you need coherent, reproducible
79
+ bands plus a matching point.
80
+
81
+ **Reading the `bimodality` flag.** It is a *deliberately conservative* heuristic, **not** a
82
+ formal multimodality test — tuned for **zero false positives** at the cost of recall on
83
+ overlapping / unequal mixtures. A `1` means "clearly-separated modes detected"; a `0` means
84
+ **"no clear bimodality detected," not "proven unimodal."** (Full caveat: the `bimodality`
85
+ module docstring; register C-34.)
86
+
72
87
  ---
73
88
 
74
89
  ## 1. Why this package exists (the problems it kills)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "views-frames"
7
- version = "1.1.0"
7
+ version = "1.1.1"
8
8
  description = "The VIEWS platform data-contract layer: immutable array+identifier frames (numpy only, root of the dependency DAG)."
9
9
  authors = [
10
10
  { name = "Simon Polichinel von der Maase", email = "simmaa@prio.org" },
@@ -53,10 +53,11 @@ def _ks(sample_count: int) -> NDArray[np.intp]:
53
53
  def _pin(masses: Sequence[float]) -> NDArray[np.intp]:
54
54
  """Index of the nearest canonical floor for each requested mass.
55
55
 
56
- Deterministic (``argmin`` of the distance); the fixed grid produces no exact
57
- distance ties, so the choice is unambiguous and reproducible. Fails loud
58
- (ADR-008) on a mass outside ``(0, 1)`` rather than silently pinning a nonsense
59
- value to the nearest floor and returning a plausible-looking interval.
56
+ Deterministic: ``argmin`` of the distance, breaking ties on the lowest index. A
57
+ mass at the midpoint between two floors (e.g. ``0.075`` between ``0.05`` and
58
+ ``0.10``) therefore pins **down** to the lower floor unambiguous and
59
+ reproducible. Fails loud (ADR-008) on a mass outside ``(0, 1)`` rather than silently
60
+ pinning a nonsense value to the nearest floor and returning a plausible interval.
60
61
  """
61
62
  m = np.asarray(masses, dtype=np.float64)
62
63
  if m.size == 0 or not np.all((m > 0.0) & (m < 1.0)):
File without changes
File without changes