processbehavior 0.3.2__tar.gz → 0.4.0__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 (228) hide show
  1. {processbehavior-0.3.2 → processbehavior-0.4.0}/CHANGELOG.md +188 -1
  2. {processbehavior-0.3.2 → processbehavior-0.4.0}/CITATION.cff +4 -4
  3. {processbehavior-0.3.2 → processbehavior-0.4.0}/CONTRIBUTING.md +16 -4
  4. {processbehavior-0.3.2 → processbehavior-0.4.0}/PKG-INFO +10 -11
  5. {processbehavior-0.3.2 → processbehavior-0.4.0}/README.md +9 -10
  6. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/__init__.py +2 -2
  7. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/analysis.py +196 -172
  8. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/analysis_dataset.py +49 -21
  9. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/analysis_result.py +4 -0
  10. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/capability.py +51 -10
  11. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/datasets/synthetic.py +3 -4
  12. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/effects_calculator.py +1 -1
  13. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/focused_result.py +5 -3
  14. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/loss_function.py +54 -24
  15. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/maximum_information.py +12 -12
  16. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/capability_chart.py +24 -15
  17. processbehavior-0.4.0/processbehavior/plotting/lane_boundaries.py +94 -0
  18. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/renderers.py +1 -1
  19. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/residual_calculator.py +120 -54
  20. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/result_signals.py +2 -0
  21. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/sds_detector.py +19 -19
  22. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/signals/detector.py +31 -2
  23. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/signals/detectors.py +3 -0
  24. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/spc_constants.py +85 -49
  25. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/study.py +35 -6
  26. processbehavior-0.4.0/tests/fixtures/bishop_analyses/aco_medicare.json +948 -0
  27. processbehavior-0.4.0/tests/fixtures/bishop_analyses/known_effects_sds_1.json +683 -0
  28. processbehavior-0.4.0/tests/fixtures/bishop_analyses/pm_inert_sds_1.json +683 -0
  29. processbehavior-0.3.2/tests/fixtures/bishop_analyses/vassds3analysis.json → processbehavior-0.4.0/tests/fixtures/bishop_analyses/pm_inert_sds_2.json +208 -178
  30. processbehavior-0.4.0/tests/fixtures/bishop_analyses/pm_inert_sds_3.json +1093 -0
  31. processbehavior-0.4.0/tests/fixtures/bishop_analyses/pm_inert_sds_4.json +1100 -0
  32. processbehavior-0.4.0/tests/fixtures/bishop_analyses/pm_inert_sds_5.json +786 -0
  33. processbehavior-0.4.0/tests/fixtures/bishop_analyses/pm_inert_sds_6.json +1111 -0
  34. processbehavior-0.3.2/tests/fixtures/bishop_analyses/vassds1analysis.json → processbehavior-0.4.0/tests/fixtures/bishop_analyses/pm_sds_1.json +32 -2
  35. processbehavior-0.3.2/tests/fixtures/bishop_analyses/vassds2analysis.json → processbehavior-0.4.0/tests/fixtures/bishop_analyses/pm_sds_2.json +58 -28
  36. processbehavior-0.4.0/tests/fixtures/bishop_analyses/pm_sds_3.json +1089 -0
  37. processbehavior-0.4.0/tests/fixtures/bishop_analyses/pm_sds_4.json +1093 -0
  38. processbehavior-0.4.0/tests/fixtures/bishop_analyses/pm_sds_5.json +785 -0
  39. processbehavior-0.4.0/tests/fixtures/bishop_analyses/pm_sds_6.json +1111 -0
  40. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/coffee_capability_full_baseline.json +1 -0
  41. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/missing_values/X_data.parquet +0 -0
  42. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/missing_values/mR_data.parquet +0 -0
  43. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/missing_values/mR_statistics.json +1 -1
  44. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/paired_xbar_s/Xbar_data.parquet +0 -0
  45. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/paired_xmr_r/X_data.parquet +0 -0
  46. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/paired_xmr_r/X_statistics.json +1 -1
  47. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/paired_xmr_r/mR_data.parquet +0 -0
  48. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/pathological_ordering/X_data.parquet +0 -0
  49. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/pathological_ordering/X_statistics.json +1 -1
  50. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/pathological_ordering/mR_data.parquet +0 -0
  51. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/pathological_ordering/mR_statistics.json +1 -1
  52. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/single_obs_strata/X_data.parquet +0 -0
  53. processbehavior-0.4.0/tests/fixtures/golden_masters/single_obs_strata/X_statistics.json +6 -0
  54. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/single_obs_strata/mR_data.parquet +0 -0
  55. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/single_obs_strata/mR_statistics.json +1 -1
  56. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/stratified_uneven/Xbar_data.parquet +0 -0
  57. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/unstratified_small/X_data.parquet +0 -0
  58. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/unstratified_small/X_statistics.json +1 -1
  59. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/unstratified_small/mR_data.parquet +0 -0
  60. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/unstratified_small/mR_statistics.json +1 -1
  61. processbehavior-0.4.0/tests/test_ads3_charts.py +61 -0
  62. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_bishop_reference.py +5 -5
  63. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_capability.py +74 -3
  64. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_execute_validation.py +51 -0
  65. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_loss_function.py +60 -25
  66. processbehavior-0.4.0/tests/test_manual_citations.py +49 -0
  67. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_maximum_information.py +26 -0
  68. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_performance.py +8 -0
  69. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_phased_limits.py +74 -0
  70. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_plotting_decorations.py +42 -1
  71. processbehavior-0.4.0/tests/test_r2_unavailable.py +56 -0
  72. processbehavior-0.4.0/tests/test_r6_effect.py +43 -0
  73. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_recentered_mr_fix.py +10 -10
  74. processbehavior-0.4.0/tests/test_recentering.py +55 -0
  75. processbehavior-0.4.0/tests/test_reference_integrity.py +108 -0
  76. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_residual_calculator.py +121 -186
  77. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_sds.py +5 -15
  78. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_sds_detector.py +1 -1
  79. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_spc_constants.py +36 -4
  80. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_stratified_insufficiency.py +25 -0
  81. processbehavior-0.4.0/tests/test_unequal_subgroups.py +100 -0
  82. processbehavior-0.4.0/tests/test_vas_chart_constants.py +124 -0
  83. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_xbar_residual_center.py +5 -6
  84. processbehavior-0.3.2/processbehavior/plotting/lane_boundaries.py +0 -78
  85. processbehavior-0.3.2/tests/fixtures/golden_masters/single_obs_strata/X_statistics.json +0 -6
  86. processbehavior-0.3.2/tests/test_reference_integrity.py +0 -56
  87. {processbehavior-0.3.2 → processbehavior-0.4.0}/.gitignore +0 -0
  88. {processbehavior-0.3.2 → processbehavior-0.4.0}/CODE_OF_CONDUCT.md +0 -0
  89. {processbehavior-0.3.2 → processbehavior-0.4.0}/LICENSE +0 -0
  90. {processbehavior-0.3.2 → processbehavior-0.4.0}/SECURITY.md +0 -0
  91. {processbehavior-0.3.2 → processbehavior-0.4.0}/examples/README.md +0 -0
  92. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/calibration.py +0 -0
  93. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/data_preparation.py +0 -0
  94. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/datasets/__init__.py +0 -0
  95. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/datasets/data/coffee_shop_demo_long.csv +0 -0
  96. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/datasets/loaders.py +0 -0
  97. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/derivations.py +0 -0
  98. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/exceptions.py +0 -0
  99. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/exporters/__init__.py +0 -0
  100. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/exporters/excel_exporter.py +0 -0
  101. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/formulation_spec.py +0 -0
  102. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/__init__.py +0 -0
  103. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/_math.py +0 -0
  104. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/contracts.py +0 -0
  105. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/control_chart.py +0 -0
  106. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/effects_charts.py +0 -0
  107. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/limits.py +0 -0
  108. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/maximum_information_chart.py +0 -0
  109. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/plotter.py +0 -0
  110. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/report.py +0 -0
  111. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/residuals.py +0 -0
  112. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/run_rules_viz.py +0 -0
  113. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/stats_box.py +0 -0
  114. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/themes.py +0 -0
  115. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/x_axis_layout.py +0 -0
  116. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/plotting/zones.py +0 -0
  117. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/process_behavior.py +0 -0
  118. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/py.typed +0 -0
  119. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/result_tabular.py +0 -0
  120. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/series_length.py +0 -0
  121. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/signals/__init__.py +0 -0
  122. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/signals/config.py +0 -0
  123. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/signals/result.py +0 -0
  124. {processbehavior-0.3.2 → processbehavior-0.4.0}/processbehavior/types.py +0 -0
  125. {processbehavior-0.3.2 → processbehavior-0.4.0}/pyproject.toml +0 -0
  126. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/__init__.py +0 -0
  127. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/conftest.py +0 -0
  128. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/data/FILLWEIGHTDATA_800.csv +0 -0
  129. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/data/coffee_shop_demo_long.csv +0 -0
  130. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/missing_values/X_metadata.json +0 -0
  131. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/missing_values/X_statistics.json +0 -0
  132. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/missing_values/mR_metadata.json +0 -0
  133. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/paired_xbar_s/S_data.parquet +0 -0
  134. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/paired_xbar_s/S_metadata.json +0 -0
  135. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/paired_xbar_s/S_statistics.json +0 -0
  136. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/paired_xbar_s/Xbar_metadata.json +0 -0
  137. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/paired_xbar_s/Xbar_statistics.json +0 -0
  138. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/paired_xmr_r/X_metadata.json +0 -0
  139. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/paired_xmr_r/mR_metadata.json +0 -0
  140. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/paired_xmr_r/mR_statistics.json +0 -0
  141. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/pathological_ordering/X_metadata.json +0 -0
  142. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/pathological_ordering/mR_metadata.json +0 -0
  143. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/residual_chart/S_data.parquet +0 -0
  144. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/residual_chart/S_metadata.json +0 -0
  145. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/residual_chart/S_statistics.json +0 -0
  146. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/single_obs_strata/X_metadata.json +0 -0
  147. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/single_obs_strata/mR_metadata.json +0 -0
  148. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/stratified_balanced/S_data.parquet +0 -0
  149. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/stratified_balanced/S_metadata.json +0 -0
  150. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/stratified_balanced/S_statistics.json +0 -0
  151. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/stratified_balanced/Xbar_data.parquet +0 -0
  152. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/stratified_balanced/Xbar_metadata.json +0 -0
  153. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/stratified_balanced/Xbar_statistics.json +0 -0
  154. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/stratified_uneven/S_data.parquet +0 -0
  155. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/stratified_uneven/S_metadata.json +0 -0
  156. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/stratified_uneven/S_statistics.json +0 -0
  157. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/stratified_uneven/Xbar_metadata.json +0 -0
  158. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/stratified_uneven/Xbar_statistics.json +0 -0
  159. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/unstratified_small/X_metadata.json +0 -0
  160. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/fixtures/golden_masters/unstratified_small/mR_metadata.json +0 -0
  161. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_analysis_bugs.py +0 -0
  162. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_analysis_dataset.py +0 -0
  163. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_analysis_golden_master.py +0 -0
  164. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_analysis_result_contract.py +0 -0
  165. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_analysis_specifications.py +0 -0
  166. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_api_reference.py +0 -0
  167. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_beyond_limits_vectorized.py +0 -0
  168. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_bin_extremes.py +0 -0
  169. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_by_parameter.py +0 -0
  170. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_by_permutations.py +0 -0
  171. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_calibration.py +0 -0
  172. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_capability_chart.py +0 -0
  173. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_capability_window.py +0 -0
  174. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_chart_availability.py +0 -0
  175. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_chart_column_contract.py +0 -0
  176. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_chart_parsing.py +0 -0
  177. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_control_chart_figure.py +0 -0
  178. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_data_preparation.py +0 -0
  179. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_datasets.py +0 -0
  180. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_derivations.py +0 -0
  181. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_derivations_robustness.py +0 -0
  182. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_design_state_lineage.py +0 -0
  183. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_documented_rule_coverage.py +0 -0
  184. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_edge_cases.py +0 -0
  185. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_effects_calculator.py +0 -0
  186. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_effects_plotting.py +0 -0
  187. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_encode_rsg_vectorized.py +0 -0
  188. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_excel_export.py +0 -0
  189. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_focus.py +0 -0
  190. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_garbage_character_handling.py +0 -0
  191. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_init_cleaning.py +0 -0
  192. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_lane_boundaries.py +0 -0
  193. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_lane_connectors.py +0 -0
  194. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_limits_vectorized.py +0 -0
  195. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_na_in_factor_columns.py +0 -0
  196. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_notebook_ergonomics.py +0 -0
  197. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_p0_p2_regressions.py +0 -0
  198. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_plotting.py +0 -0
  199. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_plotting_hardening.py +0 -0
  200. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_plotting_xaxis.py +0 -0
  201. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_process_behavior.py +0 -0
  202. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_release_gate_0_1_0_checklist.py +0 -0
  203. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_residual_aliases.py +0 -0
  204. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_residual_labels.py +0 -0
  205. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_residual_scope.py +0 -0
  206. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_resolve_by_grouping.py +0 -0
  207. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_result_signals.py +0 -0
  208. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_result_tabular.py +0 -0
  209. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_sampling_plan.py +0 -0
  210. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_series_length.py +0 -0
  211. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_signal_detectors.py +0 -0
  212. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_signal_result_surface.py +0 -0
  213. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_signals.py +0 -0
  214. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_single_detection.py +0 -0
  215. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_solo_mr_residuals.py +0 -0
  216. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_srp_refactor.py +0 -0
  217. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_strata_companion.py +0 -0
  218. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_strata_sufficiency.py +0 -0
  219. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_supports_calibration.py +0 -0
  220. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_synthetic.py +0 -0
  221. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_types.py +0 -0
  222. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_validate_by_parameter.py +0 -0
  223. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_weco_integration.py +0 -0
  224. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_why_not.py +0 -0
  225. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_x_axis_layout.py +0 -0
  226. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_xbar_s_options.py +0 -0
  227. {processbehavior-0.3.2 → processbehavior-0.4.0}/tests/test_xbar_stratified.py +0 -0
  228. {processbehavior-0.3.2 → processbehavior-0.4.0}/validation/PBTESTDATABASE_T100.csv +0 -0
@@ -7,6 +7,191 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.0] - 2026-10-14
11
+
12
+ This release aligns the library with Bishop's VAS documentation manual dated 10-12-2026 and
13
+ reproduces his VAS runs of October 2026 (PM SDS, PM INERT, known-effects and Medicare decks).
14
+ Equation numbers below are that manual's.
15
+
16
+ ### Changed
17
+ - **R6's factor-level effect is the average of the condition effects over the level.** R6 = α_i + R2
18
+ with α_i the condition effects ρ̂_k = R5 - R2 averaged over the level (was the level's mean of R5,
19
+ Eq 14-24, "≈ α_i"). The two differ by the level's average R2, which Dr. Bishop notes is always
20
+ near 0; in ADS 1 it is 0 (R2 averages to zero in each cell). On ADS 2/3 it shows when levels are
21
+ small: Tom's Medicare run centres the organisation-effects chart at 10831.1 (PB was 10829.8, now
22
+ 10831.1).
23
+ - **R2 for designs with a one-observation subgroup (ADS 2 and 3) follows the manual.**
24
+ The data are first stripped of the process mean and the condition and period effects
25
+ (Z = Y − Ȳ_k − Ȳ_t + Ȳ, Eq 14-4 / 14-9), Z is differenced along the condition-then-time
26
+ sequence, and the difference is divided by twice the R2 scale factor
27
+ c(K, M) = √((K − 1)/(2K) · (1 − K/(M − 1))), computed from the layout (Eqs 14-5..14-13).
28
+ Previously R2 was half the difference of consecutive raw values, so every step from one
29
+ condition's last period to the next condition's first carried the level difference between
30
+ them, a common trend was read as noise, and the result sat on a smaller scale than σ. R3–R6,
31
+ the effects, maximum information and potential capability follow. PM SDS 2 R2 chart limits
32
+ ±1.94 → ±2.76, PM SDS 3 ±2.47 → ±3.70, potential Cp on PM SDS 2 (specs 232/242)
33
+ 2.51 → 1.78; on the Medicare ACO file the R2 σ falls from about 1,023 to 300 and the
34
+ organisation chart (recentred R5 by ACO) flags 19 of 24 organisations instead of 8. ADS 1
35
+ R2 (within-cell deviation, Eq 14-3) is unchanged. `calculate_r2` now dispatches on
36
+ `r2_method` and takes `n_conditions`; its `n_per_cell` argument is gone.
37
+ - **Taguchi loss follows the manual.** ADS 1 unexplained loss is the average cell
38
+ variance (1/KT)·ΣS²_kt, without dividing each S_kt by c4 (Eq 15-16). ADS 2/3 unexplained
39
+ loss is the sample variance of R2 (Eq 15-17; the 1/0.7 correction is gone), and the
40
+ interaction is what the other parts leave of the total loss (Ȳ − T)² + S², set to 0 when
41
+ negative (Eqs 15-18..15-20), so the parts add to the total. PM SDS 1 at target 237:
42
+ unexplained 23.0% → 20.9%, interaction 43.3% → 44.5%; PM SDS 2: interaction 42.5% → 25.6%,
43
+ unexplained 23.6% → 30.0%; pure noise (PM INERT) now shows 0% interaction in ADS 2/3.
44
+ - **Re-centred residuals are the residual plus the process mean, the mean of the cell means
45
+ (Eq 14-26).** RCR3, RCR4 and
46
+ RCR5 were "reconstructed Y" (each algebraically Ȳ_kt + R2), so a recentred interaction
47
+ chart plotted close to the raw cell means. They now plot the effect plus R2 on the
48
+ measurement scale, as VAS does; RCR2 is unchanged. Xbar means by condition (RCR5) or
49
+ period (RCR4) are unchanged on complete designs; period effects are charted from R4.
50
+ - **ADS 3 recommends the Xbar chart** (was X): Xbar/S is VAS's default for SDS 3 and 6.
51
+ - **Capability is centred on the process mean as VAS computes it**: the unweighted mean of the
52
+ (factor × time) cell means, the same centre as the Xbar chart and the loss function, instead
53
+ of the plain average of the readings. `CapabilityResult.y_bar`, current PPL/PPU and the
54
+ potential centre (ȳ + mean(R2)) move when cells have different sizes (SDS 3, 4, 6); balanced
55
+ designs are unchanged. PM SDS 6 now reads PROCESS MEAN 237.86 and PPL 1.102 / PPU 0.78, as
56
+ Tom's VAS run does (was 237.834, 1.098 / 0.784).
57
+ - **Validation gate re-referenced to Tom's 3 October 2026 VAS run**
58
+ (`validation/e2e_bishop_report.py`, `tests/fixtures/bishop_analyses/`). PM SDS 3 is checked
59
+ as Xbar/S, as VAS now draws it; its limits vary with subgroup size and are not printed on the
60
+ slides, so they carry no reference yet. The gate now reports 254 assertions passing and 61
61
+ with no reference value (was 280 / 35); PB's side is compared at full precision.
62
+ - **The validation gate covers every VAS run on hand** (14 runs, 1155 assertions, was 3 runs and
63
+ 254): PM SDS 1-6, PM INERT SDS 1-6 (the pure-noise column with each design state's missing-data
64
+ pattern), Tom's known-effects data (`validation/PBTESTKNOWNEFFECTS_T100.csv`, SDS 1) and the
65
+ Medicare ACO data (`validation/aco_per_capita_expenditure.csv`, 24 organisations x 4 years). Each
66
+ run's reference values, spec limits and target are in its own file,
67
+ `tests/fixtures/bishop_analyses/<run>.json` (the `vassds{1,2,3}analysis.json` references are
68
+ now `pm_sds_{1,2,3}.json`). All six PM runs use target 237; PM SDS 5's loss shares come from
69
+ Tom's rerun at 237 (8 October 2026), because his 10/3 run used the process mean.
70
+ - **Limits VAS prints as "UNEQUAL" are checked against the lines it draws.** Where subgroup sizes
71
+ differ, VAS steps the limits per subgroup and prints no value; the gate now reads every
72
+ subgroup's LBL/UBL from the red limit lines in the VAS chart drawing (scaled by the y-axis ticks,
73
+ good to about one drawing unit) and compares PB subgroup by subgroup, to 1.5 drawing units. 186
74
+ charts in SDS 3-6; the gate reports 1475 assertions passing, 0 failing, and 79 with no
75
+ reference (was 1155 / 0 / 399).
76
+ - **The R6 S charts are checked wherever VAS computed them correctly.** VAS's α<sub>N</sub>
77
+ (Eq 10-11) used Minitab's GAMMA function, which overflows above N = 343; the 10/3 VAS runs held
78
+ α<sub>N</sub> at 0.9995 from there on, so their S limits followed N = 500 whatever the subgroup size.
79
+ Dr. Bishop confirmed it (8 October 2026) and is replacing it with a table; PB computes α<sub>N</sub>
80
+ with log-gamma for any N. The gate now checks the R6 S charts whose subgroups are under 343 (all
81
+ match), the factor S charts' centerlines (one subgroup per factor level, as Dr. Bishop confirmed),
82
+ and PM SDS 5's loss shares from his rerun at 237; only the limits for subgroups of 343 or more
83
+ wait for his rerun. The references' notes now give that cause.
84
+ - **Every R6 S chart in the PM runs is checked, against Dr. Bishop's reruns of 13 October 2026.**
85
+ His reruns of PM SDS 1-6 and PM INERT SDS 1-6 compute α<sub>N</sub> for every N. Against the
86
+ 10/3 runs they change only the R6 S charts (pages 21, 25 and 27) and potential capability in
87
+ PM SDS 3 and 4. The limits for subgroups of 343 or more, pending until now, all match PB within
88
+ the gate's tolerances (36 assertions). The rerun's potential capability is now PB's value
89
+ to the digit it prints: PM SDS 3 Cp 1.58 and CPL 1.84 (PB 1.5751 and 1.8356; the 10/3 run
90
+ printed 1.57 and 1.83), and PM SDS 4 CPL 2.66 (PB 2.6555; was 2.65). The gate no longer lists
91
+ the per-factor loss shares (F1, F2, PDC Int) for a one-factor run such as Medicare, where they
92
+ don't exist. It reports 1547 assertions passing, 0 failing and 4 with no reference (was 1511 /
93
+ 0 / 43): the known-effects factor S limits, whose 6 October run predates the fix.
94
+
95
+ ### Added
96
+ - **R2 is reported unavailable, with the reason, when the R2 scale factor is undefined**
97
+ (fewer than two process design conditions, or M < K + 2 observations). `formulate()` warns;
98
+ R2–R6 are not offered; `execute()` and `why_not()` give the reason; `loss_function()` and
99
+ `maximum_information()` raise `ValidationError`; `capability()` reports potential capability
100
+ unavailable. Previously these layouts produced half-differences of the raw data.
101
+ - **`CapabilityResult.potential_center`**: the centre of the potential values, ȳ + mean(R2).
102
+ Potential CPL/CPU and the potential chart's centre line use it, as VAS does (Medicare potential
103
+ PPU 5.74; ȳ alone gives 5.73). It equals ȳ in ADS 1.
104
+
105
+ ### Fixed
106
+ - **Stratified charts take time in proportion to the data, however many strata there are.**
107
+ The stratified X/mR path looked each stratum up with a scan of the whole table, so its cost
108
+ grew with strata × rows. With every row its own condition, an X/mR pair took 48 s at 30,165
109
+ rows, and an estimated 80 minutes at 307,683 (a gene-expression study, 6,033 genes × 51
110
+ subjects). It now takes 0.2 s and 1.9 s. The same scan sat in the stratified Xbar/S loops and
111
+ the lane-boundary loop, the per-stratum limits were computed one `pd.Series` at a time, and
112
+ two lists of strata were searched as lists. Results are unchanged: every chart, statistic,
113
+ lane boundary and stratum list was compared before and after on the reference data and a
114
+ 30,165-row gene-effects file. `scripts/benchmark.py` adds a one-row-strata scenario, and
115
+ `tests/test_performance.py` checks that it scales linearly. Stratified Xbar/S still costs
116
+ about 2.5 ms per stratum (15 s at 6,033): linear, but not yet vectorised.
117
+ - **Charts with many lanes draw in a fraction of a second.** Each lane divider was added to the
118
+ figure with its own `add_shape` call, and plotly re-validates every shape already there, so the
119
+ cost grew with the square of the number of lanes: 800 dividers took 27 s, and an X chart of a
120
+ 6,033-gene study (one lane per gene) would have taken about 25 minutes. They are now added in
121
+ one assignment, which builds the same figure (0.03 s for 800). Above 1,000
122
+ (`plotting.lane_boundaries.MAX_LANE_DIVIDERS`) none are drawn: the dividers would merge into a
123
+ solid band at any chart width.
124
+ - **`detect_signals()` works on phased charts.** It raised `TypeError` on every `phased=True`
125
+ chart: each phase has its own centre, so the statistics carry `center=None`, and the zone
126
+ calculation read that scalar. The chart already marks run rules not applicable, but only the
127
+ plot read the flag. Phased charts now get Rule 1 by default, judged against each phase's
128
+ limits, with the same points the chart flags; an explicit rule list runs as given, against each
129
+ row's own centre. The limits and the flagged points on the chart were always correct.
130
+ - **`value='response'` charts the response**, as the `execute()` signature and docstring say.
131
+ Every chart refused it ("Valid charts for RESPONSE: None"): residuals are told apart by a leading
132
+ `R`, which `RESPONSE` also has. `execute()`, `supports_calibration()` and `why_not()` now treat
133
+ it, in any case, exactly as `value=None`.
134
+ - **Xbar and S charts with subgroups of unequal size follow the manual (Eqs 11-5, 11-16,
135
+ 11-17).** sigma-hat is the average of each subgroup's S_r / c4(N_r) (was S-bar / c4(N_r)), and each
136
+ subgroup's limits use its own N_r, so they step with subgroup size, as VAS draws them. N_r now
137
+ counts the values the chart is drawn from (was the response's count): on ADS 2 and 3 residual
138
+ charts, R2's blank first value leaves one subgroup one smaller. Equal-size charts are unchanged.
139
+ Found on Tom's Medicare run (slides 52-53): ACO-001 has 3 R6 values, and its limits are wider by
140
+ sqrt(4/3) on the Xbar chart and use B4(3) on the S chart.
141
+ - **Xbar charts include one-reading subgroups, as VAS draws them.** A subgroup with one value has
142
+ no S, so it takes no part in sigma-hat, but it is charted with limits centre ± 3 sigma-hat
143
+ (Eqs 11-16/17 with N_r = 1); it was left off the chart. The companion S chart still leaves it
144
+ out. On PM SDS 3 the Xbar chart now has all 800 subgroups (was 783) and on PM SDS 6 all 772
145
+ (was 642), matching the limit lines in Tom's VAS run subgroup by subgroup; on PM SDS 6's
146
+ interaction chart the one cell whose single reading has no R2 stays off, as in VAS. Designs
147
+ without one-reading subgroups (ADS 1) are unchanged.
148
+ - **Per-stratum Xbar centre lines count one-observation subgroups.** The centre is Bishop's
149
+ unweighted mean of every subgroup mean; subgroups with n = 1 were dropped before it was
150
+ taken, which moved four of the eight PM SDS 3 per-condition centres by 0.01–0.04.
151
+ - **Code and docs cite the manual's Chapters 10 and 12.** The X/mR limits and constants
152
+ (Eqs 12-1..12-11), c4 and the S-chart factors (Eqs 10-11, 10-12, 10-14), the cell and marginal
153
+ means (Eqs 10-7, 10-9) and the model the residuals estimate (Eq 10-3) now cite the manual where
154
+ the code computes exactly those equations, and every citation names the 10-12 edition (its
155
+ Chapter 10 drops the 10-1 edition's Eq 10-4, so Eqs 10-5..10-16 became 10-4..10-15); dotted
156
+ citations ("Eq 12.4") and an older manual's numbering in a test are gone.
157
+ `tests/test_manual_citations.py` keeps one citation form, and CONTRIBUTING.md describes it. The
158
+ residuals guide now says Ȳ is the mean of the cell means.
159
+ - **Bishop's methodology is called the Variation Analysis System**, as his VAS documentation
160
+ manual names it (was "Variance Analysis System" in the README, docs, CITATION.cff, docstrings and
161
+ the design report's VAS line). The synthetic-data module no longer credits the design states to
162
+ Wheeler.
163
+ - **Docs:** the three note blocks in the chart-types and design-state guides now render on the
164
+ MyST site (they used mkdocs syntax); the DS 4–6 chart tables and the no-factors branch of the
165
+ decision tree match what the library offers (a time-only study is DS 1, 2 or 3 by the number
166
+ of observations per time point, not DS 6); the R1 note no longer claims the residuals sum to
167
+ zero on unbalanced data (their cell means average to zero); R1 is cited as Eq 14-2, and the
168
+ design states are attributed to Bishop. The README's Validation section describes the gate as
169
+ it is (14 VAS runs, 1,547 assertions, SDS 4–6 included); it still described 3 runs and 254.
170
+
171
+ ## [0.3.3] - 2026-09-29
172
+
173
+ ### Changed
174
+ - **Individuals and moving-range limits now use the constants exactly as Bishop's VAS manual
175
+ defines them.** The individuals-chart multiplier is 3/1.128 = 2.659574 (previously the
176
+ rounded 2.66) and the moving-range upper limit is 1 + 3(0.8525)/1.128 = 3.267287 (previously
177
+ 3.268), built from the manual's d₂ = 1.128 and d₃ = 0.8525 (Eq 12.4, 12.5, 12.10, 12.11). The
178
+ manual prints the rounded values; Bishop's VAS software computes them without rounding, and PB's
179
+ X and mR limits now match it digit for digit (Medicare first chart: ±3838.32 and 4715.38).
180
+ Limits move by 0.016% and 0.02%, so a signal changes only for a point within that distance of a
181
+ limit. The d₂ used on the calibration path and by the maximum-information chart is now exactly
182
+ 1.128 (it was 3/2.66 = 1.1278), and `MR_SIGMA_INTERVAL_80` was regenerated: five entries move
183
+ by 0.001. New constant `D3_N2` in `processbehavior.spc_constants`.
184
+
185
+ ### Added
186
+ - Docs: the chart-types guide now explains the three views of a study with factors and
187
+ time (the combined ``by=[]`` chart, the ``phased=True`` view, and full stratification),
188
+ how to read a signal at a subgroup boundary on the combined chart (evidence about the
189
+ traversal, kept in the calculation deliberately because it reproduces Bishop's reference
190
+ limits), and which claims survive reordering the lanes, with the R5 chart's limits
191
+ caveat for DS 2 and 3. The ``phased`` view is documented in the user guide for the first
192
+ time. From the #114 discussion with @rabujamra, whose permutation check is
193
+ ``validation/mr_permutation_invariance.py``.
194
+
10
195
  ## [0.3.2] - 2026-09-15
11
196
 
12
197
  ### Fixed
@@ -929,7 +1114,9 @@ and may change between minor versions until 1.0.
929
1114
  - `natsort >= 8.0`
930
1115
  - `plotly >= 5.18, < 7`
931
1116
 
932
- [Unreleased]: https://github.com/cnicholas/processbehavior/compare/v0.3.2...HEAD
1117
+ [Unreleased]: https://github.com/cnicholas/processbehavior/compare/v0.4.0...HEAD
1118
+ [0.4.0]: https://github.com/cnicholas/processbehavior/compare/v0.3.3...v0.4.0
1119
+ [0.3.3]: https://github.com/cnicholas/processbehavior/compare/v0.3.2...v0.3.3
933
1120
  [0.3.2]: https://github.com/cnicholas/processbehavior/compare/v0.3.1...v0.3.2
934
1121
  [0.3.1]: https://github.com/cnicholas/processbehavior/compare/v0.3.0...v0.3.1
935
1122
  [0.3.0]: https://github.com/cnicholas/processbehavior/compare/v0.2.1...v0.3.0
@@ -1,8 +1,8 @@
1
1
  cff-version: 1.2.0
2
2
  message: "If you use processbehavior in your research, please cite it as below."
3
- title: "processbehavior: Process Behavior Charts and Variance Analysis for Python"
3
+ title: "processbehavior: Process Behavior Charts and Variation Analysis for Python"
4
4
  abstract: >-
5
- A Python implementation of Thomas A. Bishop's Variance Analysis System (VAS):
5
+ A Python implementation of Thomas A. Bishop's Variation Analysis System (VAS):
6
6
  three-state design-state lineage detection (planned / observed / analytical),
7
7
  process behavior charts, R1-R6 residual variance decomposition, capability
8
8
  indices, and Taguchi loss functions. Analytical outputs are validated
@@ -21,7 +21,7 @@ version: 0.2.0
21
21
  keywords:
22
22
  - statistical process control
23
23
  - process behavior charts
24
- - variance analysis
24
+ - variation analysis
25
25
  - control charts
26
26
  - quality control
27
27
  - shewhart
@@ -31,7 +31,7 @@ references:
31
31
  - type: book
32
32
  title: "The Scientific Basis for Modern Analytic Practice"
33
33
  abstract: >-
34
- The methodological foundation for the Variance Analysis System this
34
+ The methodological foundation for the Variation Analysis System this
35
35
  package implements: applied-research foundations, scientific methodology,
36
36
  Shewhart's inductive analytic approach and process behavior charts,
37
37
  operational definitions and research protocols, and case studies.
@@ -1,7 +1,7 @@
1
1
  # Contributing to processbehavior
2
2
 
3
3
  Thanks for your interest. processbehavior is an implementation of Thomas A.
4
- Bishop's Variance Analysis System (VAS); methodology fidelity is more
4
+ Bishop's Variation Analysis System (VAS); methodology fidelity is more
5
5
  important than feature volume. Smaller, well-validated changes are preferred.
6
6
 
7
7
  ## What this library is, and what it is not
@@ -77,12 +77,12 @@ residuals (R1–R5), DS detection, limit calculations, or variance
77
77
  decomposition must keep the relevant Bishop-reference tests green:
78
78
 
79
79
  ```bash
80
- pytest tests/test_bishop_reference.py -v
80
+ pytest tests/test_bishop_reference.py -v # skips unless Bishop's residual workbooks are present
81
81
  ```
82
82
 
83
83
  There is also a full end-to-end check that compares every chart center, control
84
- limit, capability index and loss component against Bishop's published Minitab
85
- results — 280 assertions across ADS 1–3:
84
+ limit, capability index and loss component against Bishop's VAS runs for the
85
+ 10-12-2026 manual (PM SDS 1–6, PM INERT, his known-effects data and the Medicare data):
86
86
 
87
87
  ```bash
88
88
  python validation/e2e_bishop_report.py
@@ -97,6 +97,18 @@ summary.
97
97
  If a Bishop check fails after your change, the change is wrong — not the
98
98
  reference.
99
99
 
100
+ ## Citing the methodology
101
+
102
+ Code and docs cite Bishop's VAS documentation manual by edition and equation number:
103
+ `(10-12 manual Eq 14-8)`, `Eqs 14-4..14-13`, `Eqs 11-16/17`. Name the edition once per file and use
104
+ the chapter-number form; `tests/test_manual_citations.py` checks both. The citations are read
105
+ against the manual itself, so a new edition reports every place in the library whose equation
106
+ changed or moved.
107
+
108
+ Cite an equation only where the code computes exactly that equation. Where it computes something
109
+ close (a different weighting, an approximation, a different sequence), say how it differs instead
110
+ of citing it.
111
+
100
112
  ## Docs versioning
101
113
 
102
114
  The docs have one live version, deliberately, until 1.0:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: processbehavior
3
- Version: 0.3.2
3
+ Version: 0.4.0
4
4
  Summary: Python-native Process Behavior & Control Charts (spec-driven SPC with tidy outputs)
5
5
  Project-URL: Homepage, https://github.com/cnicholas/processbehavior
6
6
  Project-URL: Repository, https://github.com/cnicholas/processbehavior
@@ -89,7 +89,7 @@ Description-Content-Type: text/markdown
89
89
  [![codecov](https://codecov.io/gh/cnicholas/processbehavior/graph/badge.svg)](https://codecov.io/gh/cnicholas/processbehavior)
90
90
  [![License](https://img.shields.io/pypi/l/processbehavior.svg)](https://github.com/cnicholas/processbehavior/blob/main/LICENSE)
91
91
 
92
- A Python library for **Process Behavior Analysis** following Thomas A. Bishop's Variance Analysis System (VAS) methodology.
92
+ A Python library for **Process Behavior Analysis** following Thomas A. Bishop's Variation Analysis System (VAS) methodology.
93
93
 
94
94
  Unlike traditional SPC packages, processbehavior faithfully implements Bishop's VAS equation-by-equation: automatic detection of the three-state design lineage (PDS / ODS / ADS), variance decomposition via R1-R6 residuals, and chart selection routed by the data your study can actually analyze.
95
95
 
@@ -231,17 +231,16 @@ for stratum in result.strata:
231
231
 
232
232
  ## Validation
233
233
 
234
- processbehavior's analytical outputs are continuously verified against Dr. Thomas A. Bishop's Minitab reference results. The validator at `validation/e2e_bishop_report.py` runs **280 numerical assertions** through the full formulate → execute → capability / loss / maximum-information pipeline:
234
+ processbehavior's analytical outputs are verified against Dr. Thomas A. Bishop's VAS (Minitab-based) reference results on every push. The validator at `validation/e2e_bishop_report.py` runs **1,547 numerical assertions** through the full formulate → execute → capability / loss pipeline, across 14 of his VAS runs:
235
235
 
236
- | Analytical Design State | Datasets validated | Assertions | Status |
237
- |---|---|---|---|
238
- | ADS 1 (full replication) | `PM SDS 1` from `PBTESTDATABASE_T100.csv` | 102 | ✅ all pass |
239
- | ADS 2 (no replication) | `PM SDS 2` | 89 | ✅ all pass |
240
- | ADS 3 (partial replication) | `PM SDS 3` | 89 | ✅ all pass |
236
+ | VAS runs | Data | Analytical design states | Assertions | Status |
237
+ |---|---|---|---|---|
238
+ | `PM SDS 1`–`6` | `PBTESTDATABASE_T100.csv` | ADS 1, 2, 3 | 630 | ✅ all pass |
239
+ | `PM INERT SDS 1`–`6` (pure noise) | `PBTESTDATABASE_T100.csv` | ADS 1, 2, 3 | 630 | ✅ all pass |
240
+ | `PM SDS 1 KNOWN` (known effects) | `PBTESTKNOWNEFFECTS_T100.csv` | ADS 1 | 101 | ✅ all pass |
241
+ | `Medicare ACO (PCE)` | `aco_per_capita_expenditure.csv` | ADS 2 | 186 | ✅ all pass |
241
242
 
242
- Reference data is Bishop's published Minitab golden output. The library matches every chart center, control limit, signal classification, capability index, and loss-function value to within the precision Bishop reports.
243
-
244
- ODS 4–6 (incomplete-grid scenarios) are detected and routed correctly but their end-to-end Bishop-reference coverage is pending. The synthetic generators in `make_design(state=4|5|6)` produce data with the structural shape Bishop's Table 1 specifies; full numerical validation against Bishop's incomplete-grid Minitab output is on the roadmap (issue #109).
243
+ Reference data is Bishop's VAS output for the 10-12-2026 manual (his runs of October 2026). The library matches every chart center, control limit, capability index and loss-function value that output prints, to within the precision Bishop reports. Where subgroup sizes differ, VAS prints "UNEQUAL" instead of a limit; there every subgroup's limits are read from the limit lines VAS draws and compared one by one. SDS 4–6 are incomplete grids (ODS 4–6), checked as the complete design that survives tidying (ADS 1–3). Four values, the factor S-chart limits of the known-effects run, wait for a VAS rerun. The per-run table is in `docs/reference/validation.md`.
245
244
 
246
245
  The full report renders to `validation/e2e_bishop_report.html`.
247
246
 
@@ -6,7 +6,7 @@
6
6
  [![codecov](https://codecov.io/gh/cnicholas/processbehavior/graph/badge.svg)](https://codecov.io/gh/cnicholas/processbehavior)
7
7
  [![License](https://img.shields.io/pypi/l/processbehavior.svg)](https://github.com/cnicholas/processbehavior/blob/main/LICENSE)
8
8
 
9
- A Python library for **Process Behavior Analysis** following Thomas A. Bishop's Variance Analysis System (VAS) methodology.
9
+ A Python library for **Process Behavior Analysis** following Thomas A. Bishop's Variation Analysis System (VAS) methodology.
10
10
 
11
11
  Unlike traditional SPC packages, processbehavior faithfully implements Bishop's VAS equation-by-equation: automatic detection of the three-state design lineage (PDS / ODS / ADS), variance decomposition via R1-R6 residuals, and chart selection routed by the data your study can actually analyze.
12
12
 
@@ -148,17 +148,16 @@ for stratum in result.strata:
148
148
 
149
149
  ## Validation
150
150
 
151
- processbehavior's analytical outputs are continuously verified against Dr. Thomas A. Bishop's Minitab reference results. The validator at `validation/e2e_bishop_report.py` runs **280 numerical assertions** through the full formulate → execute → capability / loss / maximum-information pipeline:
151
+ processbehavior's analytical outputs are verified against Dr. Thomas A. Bishop's VAS (Minitab-based) reference results on every push. The validator at `validation/e2e_bishop_report.py` runs **1,547 numerical assertions** through the full formulate → execute → capability / loss pipeline, across 14 of his VAS runs:
152
152
 
153
- | Analytical Design State | Datasets validated | Assertions | Status |
154
- |---|---|---|---|
155
- | ADS 1 (full replication) | `PM SDS 1` from `PBTESTDATABASE_T100.csv` | 102 | ✅ all pass |
156
- | ADS 2 (no replication) | `PM SDS 2` | 89 | ✅ all pass |
157
- | ADS 3 (partial replication) | `PM SDS 3` | 89 | ✅ all pass |
153
+ | VAS runs | Data | Analytical design states | Assertions | Status |
154
+ |---|---|---|---|---|
155
+ | `PM SDS 1`–`6` | `PBTESTDATABASE_T100.csv` | ADS 1, 2, 3 | 630 | ✅ all pass |
156
+ | `PM INERT SDS 1`–`6` (pure noise) | `PBTESTDATABASE_T100.csv` | ADS 1, 2, 3 | 630 | ✅ all pass |
157
+ | `PM SDS 1 KNOWN` (known effects) | `PBTESTKNOWNEFFECTS_T100.csv` | ADS 1 | 101 | ✅ all pass |
158
+ | `Medicare ACO (PCE)` | `aco_per_capita_expenditure.csv` | ADS 2 | 186 | ✅ all pass |
158
159
 
159
- Reference data is Bishop's published Minitab golden output. The library matches every chart center, control limit, signal classification, capability index, and loss-function value to within the precision Bishop reports.
160
-
161
- ODS 4–6 (incomplete-grid scenarios) are detected and routed correctly but their end-to-end Bishop-reference coverage is pending. The synthetic generators in `make_design(state=4|5|6)` produce data with the structural shape Bishop's Table 1 specifies; full numerical validation against Bishop's incomplete-grid Minitab output is on the roadmap (issue #109).
160
+ Reference data is Bishop's VAS output for the 10-12-2026 manual (his runs of October 2026). The library matches every chart center, control limit, capability index and loss-function value that output prints, to within the precision Bishop reports. Where subgroup sizes differ, VAS prints "UNEQUAL" instead of a limit; there every subgroup's limits are read from the limit lines VAS draws and compared one by one. SDS 4–6 are incomplete grids (ODS 4–6), checked as the complete design that survives tidying (ADS 1–3). Four values, the factor S-chart limits of the known-effects run, wait for a VAS rerun. The per-run table is in `docs/reference/validation.md`.
162
161
 
163
162
  The full report renders to `validation/e2e_bishop_report.html`.
164
163
 
@@ -2,7 +2,7 @@
2
2
  ProcessBehavior - Statistical Process Control for Python
3
3
 
4
4
  A Pythonic library for process behavior analysis following Bishop's
5
- Variance Analysis System (VAS). The library models the data lifecycle
5
+ Variation Analysis System (VAS). The library models the data lifecycle
6
6
  through three design states and routes analysis by what your data
7
7
  actually supports:
8
8
 
@@ -47,7 +47,7 @@ its ``.sds`` field. Internally some modules still use the legacy "SDS"
47
47
  prefix (e.g. ``sds_detector.py``); the model itself is three-state.
48
48
  """
49
49
 
50
- __version__ = '0.3.2'
50
+ __version__ = '0.4.0'
51
51
 
52
52
  # Result object
53
53
  from processbehavior.analysis_result import AnalysisResult