tiergraph 0.2.2__tar.gz → 0.2.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 (156) hide show
  1. {tiergraph-0.2.2 → tiergraph-0.2.3}/CHANGELOG.md +35 -1
  2. {tiergraph-0.2.2 → tiergraph-0.2.3}/PKG-INFO +4 -5
  3. {tiergraph-0.2.2 → tiergraph-0.2.3}/README.md +3 -4
  4. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/concepts.md +2 -2
  5. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/manifest.json +4 -0
  6. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/reference/api.md +126 -7
  7. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/reference/cli.md +1 -1
  8. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/__init__.py +29 -1
  9. tiergraph-0.2.3/src/tiergraph/pathoutput.py +521 -0
  10. tiergraph-0.2.3/tests/test_pathoutput.py +864 -0
  11. {tiergraph-0.2.2 → tiergraph-0.2.3}/.github/workflows/ci.yml +0 -0
  12. {tiergraph-0.2.2 → tiergraph-0.2.3}/.github/workflows/publish.yml +0 -0
  13. {tiergraph-0.2.2 → tiergraph-0.2.3}/.gitignore +0 -0
  14. {tiergraph-0.2.2 → tiergraph-0.2.3}/.pre-commit-config.yaml +0 -0
  15. {tiergraph-0.2.2 → tiergraph-0.2.3}/CONTRIBUTING.md +0 -0
  16. {tiergraph-0.2.2 → tiergraph-0.2.3}/LICENSE +0 -0
  17. {tiergraph-0.2.2 → tiergraph-0.2.3}/Makefile +0 -0
  18. {tiergraph-0.2.2 → tiergraph-0.2.3}/RELEASING.md +0 -0
  19. {tiergraph-0.2.2 → tiergraph-0.2.3}/SECURITY.md +0 -0
  20. {tiergraph-0.2.2 → tiergraph-0.2.3}/corpus/accepted-documents.jsonl +0 -0
  21. {tiergraph-0.2.2 → tiergraph-0.2.3}/denied-name-digests.txt +0 -0
  22. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/README.md +0 -0
  23. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/contributing-docs.md +0 -0
  24. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/format.md +0 -0
  25. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/getting-started.md +0 -0
  26. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/guide/construction.md +0 -0
  27. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/guide/folding.md +0 -0
  28. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/guide/profiles.md +0 -0
  29. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/guide/recognize-and-act.md +0 -0
  30. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/guide/selection-and-traversal.md +0 -0
  31. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/guide/serialization.md +0 -0
  32. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/guide/span-views.md +0 -0
  33. {tiergraph-0.2.2 → tiergraph-0.2.3}/docs/guide/timing.md +0 -0
  34. {tiergraph-0.2.2 → tiergraph-0.2.3}/examples/__init__.py +0 -0
  35. {tiergraph-0.2.2 → tiergraph-0.2.3}/examples/caption_alignment.py +0 -0
  36. {tiergraph-0.2.2 → tiergraph-0.2.3}/examples/critical_path.py +0 -0
  37. {tiergraph-0.2.2 → tiergraph-0.2.3}/examples/json_document.py +0 -0
  38. {tiergraph-0.2.2 → tiergraph-0.2.3}/examples/mix_paths.py +0 -0
  39. {tiergraph-0.2.2 → tiergraph-0.2.3}/examples/mixing.py +0 -0
  40. {tiergraph-0.2.2 → tiergraph-0.2.3}/examples/text_segmentation.py +0 -0
  41. {tiergraph-0.2.2 → tiergraph-0.2.3}/pyproject.toml +0 -0
  42. {tiergraph-0.2.2 → tiergraph-0.2.3}/schema/tiergraph.schema.json +0 -0
  43. {tiergraph-0.2.2 → tiergraph-0.2.3}/schema/tiergraph.schema.sha256 +0 -0
  44. {tiergraph-0.2.2 → tiergraph-0.2.3}/scripts/__init__.py +0 -0
  45. {tiergraph-0.2.2 → tiergraph-0.2.3}/scripts/capture_corpus.py +0 -0
  46. {tiergraph-0.2.2 → tiergraph-0.2.3}/scripts/check_changelog_claims.py +0 -0
  47. {tiergraph-0.2.2 → tiergraph-0.2.3}/scripts/check_documented.py +0 -0
  48. {tiergraph-0.2.2 → tiergraph-0.2.3}/scripts/check_format_growth.py +0 -0
  49. {tiergraph-0.2.2 → tiergraph-0.2.3}/scripts/check_format_semantics.py +0 -0
  50. {tiergraph-0.2.2 → tiergraph-0.2.3}/scripts/check_reservations.py +0 -0
  51. {tiergraph-0.2.2 → tiergraph-0.2.3}/scripts/check_tracked_clean.py +0 -0
  52. {tiergraph-0.2.2 → tiergraph-0.2.3}/scripts/generate_docs.py +0 -0
  53. {tiergraph-0.2.2 → tiergraph-0.2.3}/scripts/generate_schema.py +0 -0
  54. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/__main__.py +0 -0
  55. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/action.py +0 -0
  56. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/build.py +0 -0
  57. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/cli/__init__.py +0 -0
  58. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/clock.py +0 -0
  59. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/core.py +0 -0
  60. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/fold.py +0 -0
  61. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/grammar.py +0 -0
  62. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/inspect.py +0 -0
  63. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/machine.py +0 -0
  64. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/machine_codec.py +0 -0
  65. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/path.py +0 -0
  66. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/pathplan.py +0 -0
  67. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/profile.py +0 -0
  68. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/py.typed +0 -0
  69. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/rewrite.py +0 -0
  70. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/root.py +0 -0
  71. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/schema.py +0 -0
  72. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/selection.py +0 -0
  73. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/semiring.py +0 -0
  74. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/spanview.py +0 -0
  75. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/textgrid.py +0 -0
  76. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/traversal.py +0 -0
  77. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/value.py +0 -0
  78. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph/wire.py +0 -0
  79. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph_dot/__init__.py +0 -0
  80. {tiergraph-0.2.2 → tiergraph-0.2.3}/src/tiergraph_dot/py.typed +0 -0
  81. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/__init__.py +0 -0
  82. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/conformance/__init__.py +0 -0
  83. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/conformance/action.py +0 -0
  84. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/conformance/declared_schema_codec_divergences.py +0 -0
  85. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/conformance/fold.py +0 -0
  86. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/conformance/kernel.py +0 -0
  87. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/conformance/machine.py +0 -0
  88. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/conformance/recognition.py +0 -0
  89. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/conformance/schema.py +0 -0
  90. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/conformance/schema_codec.py +0 -0
  91. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/conformance/selection.py +0 -0
  92. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/conformance/traversal.py +0 -0
  93. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/conformance/wire.py +0 -0
  94. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/fixtures/textgrid/integer-long.TextGrid +0 -0
  95. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/fixtures/textgrid/reference-long.TextGrid +0 -0
  96. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/fixtures/textgrid/reference-short.TextGrid +0 -0
  97. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/semiring_laws.py +0 -0
  98. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_action.py +0 -0
  99. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_alignment_witness.py +0 -0
  100. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_alternation_witness.py +0 -0
  101. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_boundary_witness.py +0 -0
  102. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_build.py +0 -0
  103. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_canonical_properties.py +0 -0
  104. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_capture_corpus.py +0 -0
  105. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_changelog_claims.py +0 -0
  106. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_cli.py +0 -0
  107. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_cli_envelope.py +0 -0
  108. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_clock.py +0 -0
  109. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_core.py +0 -0
  110. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_displacement.py +0 -0
  111. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_docs.py +0 -0
  112. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_dot.py +0 -0
  113. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_edit.py +0 -0
  114. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_examples.py +0 -0
  115. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_external_reference_witness.py +0 -0
  116. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_fold.py +0 -0
  117. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_fold_exactness.py +0 -0
  118. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_fold_witness.py +0 -0
  119. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_format_growth.py +0 -0
  120. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_format_semantics.py +0 -0
  121. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_gate_environment.py +0 -0
  122. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_grammar.py +0 -0
  123. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_inspect.py +0 -0
  124. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_machine.py +0 -0
  125. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_machine_codec.py +0 -0
  126. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_machine_decoders.py +0 -0
  127. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_mix_paths.py +0 -0
  128. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_mix_paths_render.py +0 -0
  129. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_ordered_containment.py +0 -0
  130. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_ordered_polyadic_traversal.py +0 -0
  131. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_package.py +0 -0
  132. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_path.py +0 -0
  133. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_path_alternation.py +0 -0
  134. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_pathplan.py +0 -0
  135. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_polyadic_relations.py +0 -0
  136. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_polyadic_view_reachability.py +0 -0
  137. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_profile.py +0 -0
  138. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_publishability_guards.py +0 -0
  139. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_refusal_order.py +0 -0
  140. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_reservation_register.py +0 -0
  141. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_rewrite.py +0 -0
  142. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_root.py +0 -0
  143. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_schema.py +0 -0
  144. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_schema_codec_conformance.py +0 -0
  145. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_selection.py +0 -0
  146. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_selection_semiring.py +0 -0
  147. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_semiring.py +0 -0
  148. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_semiring_law_discrimination.py +0 -0
  149. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_shipped_surface.py +0 -0
  150. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_spanview.py +0 -0
  151. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_text_domain.py +0 -0
  152. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_textgrid.py +0 -0
  153. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_traversal.py +0 -0
  154. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_value.py +0 -0
  155. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_value_embedding.py +0 -0
  156. {tiergraph-0.2.2 → tiergraph-0.2.3}/tests/test_wire.py +0 -0
@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.2.3] - 2026-09-15
11
+
12
+ ### Added
13
+
14
+ - Added `Emissions` and `OutputPlan`, which pool the mass of complete paths by
15
+ the output string their items emit, over candidates the caller supplies, beside
16
+ `PathPlan` and without changing it. `OutputPlan.masses` returns `OutputMasses`:
17
+ each candidate's mass and the residual mass of every other output, computed in
18
+ the base algebra by one marginal pass rather than by subtraction, with the zero
19
+ mass reported rather than a distribution fabricated. Its `decided` and `tied`
20
+ certificates are available only under `LOG_PROBABILITY` and `COUNTING`; under
21
+ `LOG_PROBABILITY`, `tied` compares computed values, which an approximate
22
+ algebra can split for equal real masses. `conditioned` restricts the plan to
23
+ paths accepted as one candidate, refused only when no such path exists, and
24
+ `item_marginals` pools those conditioned marginals back to the base plan's
25
+ items as `OutputItemMarginals`. Declared roots and relation-instance
26
+ multiplicity carry into the derived plan. Duplicate or empty candidate sets,
27
+ invalid emissions, and noncommutative multiplication are refused. The pooled
28
+ best output over all strings is intractable in general, so the plan scores the
29
+ candidates it is given and reports the residual that bounds every other (#190).
30
+
31
+ ### Changed
32
+
33
+ - `FORMAT_VERSION` stays `"0.2.0"`: nothing in this line touches the wire
34
+ format, and `make format-growth` reports no break.
35
+
36
+ ### Documentation
37
+
38
+ - The lineage now credits Sue Hertz for the Delta representation, which the
39
+ README and the concepts guide had attributed to Paul Hertz, and spells out
40
+ Heterogeneous Relation Graphs (HRGs) (#189). The README no longer claims that no
41
+ view can disagree with the store.
42
+
10
43
  ## [0.2.2] - 2026-09-14
11
44
 
12
45
  ### Added
@@ -962,7 +995,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
962
995
  - TG-PATH canonical addressing for structural and durable items and boundaries, profile-owned alternatives, kind checks, and typed refusals with offender details.
963
996
  - Canonical selection, bounded bipartite walks, ordered polyadic traversal, and ordered containment queries that preserve declared incidence and child order where applicable.
964
997
 
965
- [Unreleased]: https://github.com/lenzo-ka/tiergraph/compare/v0.2.2...HEAD
998
+ [Unreleased]: https://github.com/lenzo-ka/tiergraph/compare/v0.2.3...HEAD
999
+ [0.2.3]: https://github.com/lenzo-ka/tiergraph/compare/v0.2.2...v0.2.3
966
1000
  [0.2.2]: https://github.com/lenzo-ka/tiergraph/compare/v0.2.1...v0.2.2
967
1001
  [0.2.1]: https://github.com/lenzo-ka/tiergraph/compare/v0.2.0...v0.2.1
968
1002
  [0.2.0]: https://github.com/lenzo-ka/tiergraph/compare/v0.1.0...v0.2.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: tiergraph
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Ordered tiers, declared relations, and an algebra over them
5
5
  Project-URL: Homepage, https://github.com/lenzo-ka/tiergraph
6
6
  Project-URL: Repository, https://github.com/lenzo-ka/tiergraph
@@ -38,8 +38,7 @@ Description-Content-Type: text/markdown
38
38
 
39
39
  tiergraph holds parallel ordered sequences and the declared links between them
40
40
  as one immutable graph, checked when it is built. Every view — selection,
41
- traversal, containment, timing, folds — is computed from that one graph, so no
42
- view can disagree with the store.
41
+ traversal, containment, timing, folds — is computed from that one graph.
43
42
 
44
43
  The shape is the track view of an audio or video editor: rows of items, ordered
45
44
  within a row, aligned across rows, with links between rows. Aligned annotations
@@ -110,8 +109,8 @@ The complete runnable example keeps the displayed phone labels separate from
110
109
  their durable ids and prints `['K', 'AE', 'T']`; see
111
110
  [`examples/caption_alignment.py`](examples/caption_alignment.py).
112
111
 
113
- The model learned from Paul Hertz's Delta representation and the heterogeneous
114
- relation graphs (HRGs) of the Festival Speech Synthesis System. tiergraph keeps
112
+ The model is informed by Sue Hertz's Delta representation and the Heterogeneous
113
+ Relation Graphs (HRGs) of the Festival Speech Synthesis System. tiergraph keeps
115
114
  their emphasis on explicit tiered structure while defining a typed, immutable
116
115
  model and a versioned interchange format.
117
116
 
@@ -4,8 +4,7 @@
4
4
 
5
5
  tiergraph holds parallel ordered sequences and the declared links between them
6
6
  as one immutable graph, checked when it is built. Every view — selection,
7
- traversal, containment, timing, folds — is computed from that one graph, so no
8
- view can disagree with the store.
7
+ traversal, containment, timing, folds — is computed from that one graph.
9
8
 
10
9
  The shape is the track view of an audio or video editor: rows of items, ordered
11
10
  within a row, aligned across rows, with links between rows. Aligned annotations
@@ -76,8 +75,8 @@ The complete runnable example keeps the displayed phone labels separate from
76
75
  their durable ids and prints `['K', 'AE', 'T']`; see
77
76
  [`examples/caption_alignment.py`](examples/caption_alignment.py).
78
77
 
79
- The model learned from Paul Hertz's Delta representation and the heterogeneous
80
- relation graphs (HRGs) of the Festival Speech Synthesis System. tiergraph keeps
78
+ The model is informed by Sue Hertz's Delta representation and the Heterogeneous
79
+ Relation Graphs (HRGs) of the Festival Speech Synthesis System. tiergraph keeps
81
80
  their emphasis on explicit tiered structure while defining a typed, immutable
82
81
  model and a versioned interchange format.
83
82
 
@@ -266,8 +266,8 @@ declarations that interpretation needs and refuses a graph that cannot carry it.
266
266
 
267
267
  ## Lineage
268
268
 
269
- The model learned from Paul Hertz's Delta representation and the heterogeneous
270
- relation graphs of the Festival Speech Synthesis System. tiergraph keeps their
269
+ The model is informed by Sue Hertz's Delta representation and the Heterogeneous
270
+ Relation Graphs (HRGs) of the Festival Speech Synthesis System. tiergraph keeps their
271
271
  emphasis on explicit tiered structure and defines its own typed, immutable
272
272
  model with a versioned interchange format. Phonetics is one application; the
273
273
  graph and format assign no phonetic meaning to any tier or attribute.
@@ -49,6 +49,10 @@
49
49
  "FoldHomomorphism",
50
50
  "FoldResult",
51
51
  "FoldTransition",
52
+ "Emissions",
53
+ "OutputItemMarginals",
54
+ "OutputMasses",
55
+ "OutputPlan",
52
56
  "PathMarginals",
53
57
  "PathPlan",
54
58
  "PathPosteriors",
@@ -1,7 +1,7 @@
1
1
  # API reference
2
2
 
3
3
  This page is generated from the shipped objects and the documentation manifest.
4
- It covers 202 top-level `tiergraph` exports exactly once.
4
+ It covers 206 top-level `tiergraph` exports exactly once.
5
5
 
6
6
  ## Action
7
7
 
@@ -1337,6 +1337,125 @@ FoldTransition(relation: 'QualifiedName', combination: 'ChildCombination') -> No
1337
1337
 
1338
1338
  Give one dependency relation its local AND/OR incidence meaning.
1339
1339
 
1340
+ ### `Emissions`
1341
+
1342
+ ```text
1343
+ Emissions(plan: 'PathPlan[Value]', per_item: 'tuple[tuple[str, ...], ...]') -> None
1344
+ ```
1345
+
1346
+ Per-item token tuples bound to one path plan's label inventory.
1347
+
1348
+ #### `Emissions.bind`
1349
+
1350
+ Class method.
1351
+
1352
+ ```text
1353
+ Emissions.bind(cls, plan: 'PathPlan[Value]', by_label: 'Mapping[str, Sequence[str]]') -> 'Emissions[Value]'
1354
+ ```
1355
+
1356
+ Bind emissions by item label, leaving unlisted items non-emitting.
1357
+
1358
+ ### `OutputItemMarginals`
1359
+
1360
+ ```text
1361
+ OutputItemMarginals(total: 'Value', zero_mass: 'bool', values: 'tuple[Value, ...] | None', cost: 'FoldCost') -> None
1362
+ ```
1363
+
1364
+ Conditioned marginals pooled into the base plan's item order.
1365
+
1366
+ #### `OutputItemMarginals.to_data`
1367
+
1368
+ Method.
1369
+
1370
+ ```text
1371
+ OutputItemMarginals.to_data(self, semiring: 'Semiring[Value]') -> 'dict[str, object]'
1372
+ ```
1373
+
1374
+ Return deterministic strict-JSON data using the carrier encoding.
1375
+
1376
+ ### `OutputMasses`
1377
+
1378
+ ```text
1379
+ OutputMasses(total: 'Value', per_candidate: 'tuple[Value, ...]', residual: 'Value', zero_mass: 'bool', decided: 'bool | None', tied: 'tuple[int, ...] | None', cost: 'FoldCost') -> None
1380
+ ```
1381
+
1382
+ Candidate and residual masses from one product-plan marginal pass.
1383
+
1384
+ ``decided`` and ``tied`` are available only for ``LOG_PROBABILITY`` and
1385
+ ``COUNTING`` because their numeric order gives the certificate its meaning;
1386
+ both are ``None`` under other algebras. Counting ties use exact integer
1387
+ equality. Log-probability ties use equality of the computed doubles, so an
1388
+ approximate addition can split equal real masses and ``tied`` is not a tie
1389
+ certificate for the underlying real values.
1390
+
1391
+ #### `OutputMasses.to_data`
1392
+
1393
+ Method.
1394
+
1395
+ ```text
1396
+ OutputMasses.to_data(self, semiring: 'Semiring[Value]') -> 'dict[str, object]'
1397
+ ```
1398
+
1399
+ Return deterministic strict-JSON data using the carrier encoding.
1400
+
1401
+ ### `OutputPlan`
1402
+
1403
+ ```text
1404
+ OutputPlan(base: 'PathPlan[Value]', emissions: 'Emissions[Value]', candidates: 'tuple[tuple[str, ...], ...]', plan: 'PathPlan[Value]', base_index: 'Mapping[ItemRef, ItemRef]', accepted: 'tuple[bool, ...]', _product_base: 'tuple[int | None, ...]', _accept_indices: 'tuple[int, ...]', _residual_index: 'int', _conditioned_cache: 'dict[int, tuple[PathPlan[Value], tuple[int, ...]]]' = <factory>) -> None
1405
+ ```
1406
+
1407
+ A cached product plan for complete output candidates and their residual.
1408
+
1409
+ #### `OutputPlan.prepare`
1410
+
1411
+ Class method.
1412
+
1413
+ ```text
1414
+ OutputPlan.prepare(cls, base: 'PathPlan[Value]', emissions: 'Emissions[Value]', candidates: 'Sequence[Sequence[str]]') -> 'OutputPlan[Value]'
1415
+ ```
1416
+
1417
+ Build the reachable product with the candidates' trie and a residual.
1418
+
1419
+ #### `OutputPlan.values`
1420
+
1421
+ Method.
1422
+
1423
+ ```text
1424
+ OutputPlan.values(self, base_values: 'Sequence[Value] | None' = None) -> 'tuple[Value, ...]'
1425
+ ```
1426
+
1427
+ Gather base values into the product plan's canonical item order.
1428
+
1429
+ #### `OutputPlan.masses`
1430
+
1431
+ Method.
1432
+
1433
+ ```text
1434
+ OutputPlan.masses(self, base_values: 'Sequence[Value] | None' = None) -> 'OutputMasses[Value]'
1435
+ ```
1436
+
1437
+ Evaluate masses, with certificates only for log probability or counting.
1438
+
1439
+ #### `OutputPlan.conditioned`
1440
+
1441
+ Method.
1442
+
1443
+ ```text
1444
+ OutputPlan.conditioned(self, candidate: 'int') -> 'PathPlan[Value]'
1445
+ ```
1446
+
1447
+ Return the product restricted to paths accepting one candidate.
1448
+
1449
+ #### `OutputPlan.item_marginals`
1450
+
1451
+ Method.
1452
+
1453
+ ```text
1454
+ OutputPlan.item_marginals(self, candidate: 'int', base_values: 'Sequence[Value] | None' = None) -> 'OutputItemMarginals[Value]'
1455
+ ```
1456
+
1457
+ Pool one candidate's conditioned product copies onto base items.
1458
+
1340
1459
  ### `PathMarginals`
1341
1460
 
1342
1461
  ```text
@@ -2845,7 +2964,7 @@ Canonical complete-boundary grammar value. Current value: `AttributeValue(name=Q
2845
2964
 
2846
2965
  ### `__version__`
2847
2966
 
2848
- Installed distribution version. Current value: `0.2.2`.
2967
+ Installed distribution version. Current value: `0.2.3`.
2849
2968
 
2850
2969
  ## Paths
2851
2970
 
@@ -4782,7 +4901,7 @@ Return strict-JSON traversal data in canonical node order.
4782
4901
 
4783
4902
  ### `tiergraph.build`
4784
4903
 
4785
- This module is importable and usable, but carries no API-stability promise at version 0.2.2.
4904
+ This module is importable and usable, but carries no API-stability promise at version 0.2.3.
4786
4905
 
4787
4906
  Builder notation errors raise the directly importable `tiergraph.build.BuilderError`, a `ValueError` subclass. It is not part of the module's star-exported surface.
4788
4907
 
@@ -6274,7 +6393,7 @@ that they hold, which is why a caller that needs the stronger fact has to
6274
6393
  check the laws at values rather than read this tuple.
6275
6394
  ### `tiergraph.schema`
6276
6395
 
6277
- This module is importable and usable, but carries no API-stability promise at version 0.2.2.
6396
+ This module is importable and usable, but carries no API-stability promise at version 0.2.3.
6278
6397
 
6279
6398
  ### `Refusal`
6280
6399
 
@@ -6389,7 +6508,7 @@ shape_hash() -> 'str'
6389
6508
  Hash the declaration independently of JSON Schema presentation.
6390
6509
  ### `tiergraph.cli`
6391
6510
 
6392
- This module is importable and usable, but carries no API-stability promise at version 0.2.2.
6511
+ This module is importable and usable, but carries no API-stability promise at version 0.2.3.
6393
6512
 
6394
6513
  ### `build_parser`
6395
6514
 
@@ -6408,7 +6527,7 @@ main(argv: 'Sequence[str] | None' = None) -> 'int'
6408
6527
  Run the command line. Returns the process exit status.
6409
6528
  ### `tiergraph.spanview`
6410
6529
 
6411
- This module is importable and usable, but carries no API-stability promise at version 0.2.2.
6530
+ This module is importable and usable, but carries no API-stability promise at version 0.2.3.
6412
6531
 
6413
6532
  ### `SPANVIEW_FORMAT_VERSION`
6414
6533
 
@@ -6526,7 +6645,7 @@ to_text(view: 'SpanView', *, alternatives: 'bool' = False) -> 'str'
6526
6645
  Return a deterministic ruler and aligned plain-text span table.
6527
6646
  ### `tiergraph.textgrid`
6528
6647
 
6529
- This module is importable and usable, but carries no API-stability promise at version 0.2.2.
6648
+ This module is importable and usable, but carries no API-stability promise at version 0.2.3.
6530
6649
 
6531
6650
  ### `TextGridReadResult`
6532
6651
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  The `tiergraph` command prints help when called without arguments. `--version` prints one JSON object and exits successfully.
4
4
 
5
- `tiergraph.cli.build_parser()` is importable and usable, but carries no API-stability promise at version 0.2.2.
5
+ `tiergraph.cli.build_parser()` is importable and usable, but carries no API-stability promise at version 0.2.3.
6
6
 
7
7
  ## Contracts
8
8
 
@@ -1,5 +1,8 @@
1
1
  """tiergraph: ordered tiers, declared relations, and typed values."""
2
2
 
3
+ import importlib
4
+ from typing import TYPE_CHECKING, cast
5
+
3
6
  from tiergraph.action import (
4
7
  ActionDeclaration,
5
8
  DistributionWitness,
@@ -138,6 +141,14 @@ from tiergraph.path import (
138
141
  resolve_path,
139
142
  )
140
143
  from tiergraph.pathplan import AlgebraOrder, PathMarginals, PathPlan, PathPosteriors
144
+
145
+ if TYPE_CHECKING:
146
+ from tiergraph.pathoutput import (
147
+ Emissions,
148
+ OutputItemMarginals,
149
+ OutputMasses,
150
+ OutputPlan,
151
+ )
141
152
  from tiergraph.profile import (
142
153
  PROFILES,
143
154
  GraphProfile,
@@ -220,7 +231,20 @@ from tiergraph.wire import (
220
231
  to_data,
221
232
  )
222
233
 
223
- __version__ = "0.2.2"
234
+ __version__ = "0.2.3"
235
+
236
+ _PATHOUTPUT_EXPORTS = frozenset(
237
+ {"Emissions", "OutputItemMarginals", "OutputMasses", "OutputPlan"}
238
+ )
239
+
240
+
241
+ def __getattr__(name: str) -> object:
242
+ """Load path-output composition only when its public names are requested."""
243
+ if name in _PATHOUTPUT_EXPORTS:
244
+ pathoutput = importlib.import_module("tiergraph.pathoutput")
245
+ return cast(object, getattr(pathoutput, name))
246
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
247
+
224
248
 
225
249
  __all__ = [
226
250
  "ARCTIC",
@@ -280,6 +304,7 @@ __all__ = [
280
304
  "DurablePolyadicRef",
281
305
  "DurableRelationRef",
282
306
  "EffectRefusal",
307
+ "Emissions",
283
308
  "ExactnessRefusal",
284
309
  "ExecutionError",
285
310
  "FoldCertificate",
@@ -323,6 +348,9 @@ __all__ = [
323
348
  "OrderedPolyadicTraversal",
324
349
  "OrderedRootsProfile",
325
350
  "OrphanedSubject",
351
+ "OutputItemMarginals",
352
+ "OutputMasses",
353
+ "OutputPlan",
326
354
  "ParseForest",
327
355
  "PathBinding",
328
356
  "PathKind",