process-improve 1.97.0__tar.gz → 1.97.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 (238) hide show
  1. {process_improve-1.97.0 → process_improve-1.97.2}/PKG-INFO +2 -2
  2. {process_improve-1.97.0 → process_improve-1.97.2}/pyproject.toml +3 -3
  3. {process_improve-1.97.0 → process_improve-1.97.2}/pyproject.toml.orig +3 -3
  4. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/_extras.py +34 -18
  5. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/bivariate/_elbow_peak.py +18 -3
  6. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/config.py +4 -2
  7. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_tools/evaluate_design.py +10 -0
  8. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/augment.py +49 -12
  9. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs.py +4 -2
  10. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs_constrained.py +622 -54
  11. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs_omars_ilp.py +563 -49
  12. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs_optimal.py +11 -4
  13. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs_response_surface.py +6 -2
  14. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs_utils.py +57 -0
  15. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/evaluate.py +71 -9
  16. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/omars_trade_off.py +55 -37
  17. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/monitoring/control_charts.py +247 -79
  18. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_limits.py +9 -5
  19. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_mbpls.py +3 -2
  20. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_pca.py +9 -6
  21. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_pls.py +1 -1
  22. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_tpls.py +7 -4
  23. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/regression/_robust_regression.py +2 -1
  24. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/sensory/analysis.py +7 -1
  25. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/univariate/metrics.py +2 -2
  26. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/themes.py +3 -1
  27. {process_improve-1.97.0 → process_improve-1.97.2}/README.md +0 -0
  28. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/__init__.py +0 -0
  29. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/_linalg.py +0 -0
  30. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/_random.py +0 -0
  31. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/_remote_data.py +0 -0
  32. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/__init__.py +0 -0
  33. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/_batch_monitor.py +0 -0
  34. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/_batch_pca.py +0 -0
  35. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/_batch_plots.py +0 -0
  36. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/_batch_pls.py +0 -0
  37. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/_common.py +0 -0
  38. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/_gaps.py +0 -0
  39. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/_online.py +0 -0
  40. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/alignment_helpers.py +0 -0
  41. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/control.py +0 -0
  42. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/data_input.py +0 -0
  43. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/datasets.py +0 -0
  44. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/features.py +0 -0
  45. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/plotting.py +0 -0
  46. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/preprocessing.py +0 -0
  47. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/batch/tools.py +0 -0
  48. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/bivariate/__init__.py +0 -0
  49. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/bivariate/methods.py +0 -0
  50. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/bivariate/tools.py +0 -0
  51. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/chemistry/__init__.py +0 -0
  52. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/chemistry/preprocessing.py +0 -0
  53. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/batch/batch-fake-data.csv +0 -0
  54. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/batch/details.txt +0 -0
  55. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/batch/dryer.csv +0 -0
  56. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/batch/nylon.csv +0 -0
  57. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/experiments/boilingpot.csv +0 -0
  58. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/experiments/golf.csv +0 -0
  59. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/experiments/pollutant.csv +0 -0
  60. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/experiments/solar.csv +0 -0
  61. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/experiments/test_doe1.csv +0 -0
  62. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/monitoring/batch-yield-and-purity.csv +0 -0
  63. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/monitoring/rubber-colour.csv +0 -0
  64. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/LDPE/C.csv +0 -0
  65. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/LDPE/Hotellings_T2_A3.csv +0 -0
  66. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/LDPE/Hotellings_T2_A6.csv +0 -0
  67. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/LDPE/LDPE.csv +0 -0
  68. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/LDPE/P.csv +0 -0
  69. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/LDPE/R.csv +0 -0
  70. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/LDPE/T.csv +0 -0
  71. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/LDPE/U.csv +0 -0
  72. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/LDPE/W.csv +0 -0
  73. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/LDPE/Yhat_A6.csv +0 -0
  74. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/cheddar-cheese.csv +0 -0
  75. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/dtu-pectin/NOTICE +0 -0
  76. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/dtu-pectin/extraction1.csv +0 -0
  77. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/dtu-pectin/extraction2.csv +0 -0
  78. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/dtu-pectin/extraction3.csv +0 -0
  79. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/dtu-pectin/ftir1.csv +0 -0
  80. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/dtu-pectin/ftir2.csv +0 -0
  81. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/dtu-pectin/ftir3.csv +0 -0
  82. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/kamyr.csv +0 -0
  83. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/solvents.csv +0 -0
  84. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tablet-spectra.csv +0 -0
  85. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/SOURCE +0 -0
  86. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group1.csv +0 -0
  87. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group2.csv +0 -0
  88. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group3.csv +0 -0
  89. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group4.csv +0 -0
  90. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/formulas_Group5.csv +0 -0
  91. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/process_conditions.csv +0 -0
  92. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/properties_Group1.csv +0 -0
  93. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/properties_Group2.csv +0 -0
  94. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/properties_Group3.csv +0 -0
  95. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/properties_Group4.csv +0 -0
  96. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/properties_Group5.csv +0 -0
  97. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/datasets/multivariate/tpls-pyphi/quality_indicators.csv +0 -0
  98. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/__init__.py +0 -0
  99. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/__init__.py +0 -0
  100. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/_shared.py +0 -0
  101. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/aliasing.py +0 -0
  102. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/box_cox.py +0 -0
  103. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/curvature.py +0 -0
  104. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/diagnostics.py +0 -0
  105. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/lack_of_fit.py +0 -0
  106. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/lenth.py +0 -0
  107. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/mixture.py +0 -0
  108. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/model_selection.py +0 -0
  109. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/ols_extractors.py +0 -0
  110. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/prediction.py +0 -0
  111. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_analyses/transforms.py +0 -0
  112. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_blocking.py +0 -0
  113. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_desirability.py +0 -0
  114. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_finite_fields.py +0 -0
  115. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_lm.py +0 -0
  116. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_moment_aberration.py +0 -0
  117. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_tools/__init__.py +0 -0
  118. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_tools/analyze_experiment.py +0 -0
  119. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_tools/augment_design.py +0 -0
  120. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_tools/create_factorial_design.py +0 -0
  121. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_tools/doe_knowledge.py +0 -0
  122. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_tools/fit_linear_model.py +0 -0
  123. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_tools/generate_design.py +0 -0
  124. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_tools/optimize_responses.py +0 -0
  125. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_tools/recommend_strategy.py +0 -0
  126. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_tools/trade_off_table.py +0 -0
  127. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_tools/visualize_doe.py +0 -0
  128. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/_uniform_sampling.py +0 -0
  129. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/analysis.py +0 -0
  130. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/datasets.py +0 -0
  131. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs_factorial.py +0 -0
  132. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs_mixture.py +0 -0
  133. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs_mixture_constrained.py +0 -0
  134. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs_omars.py +0 -0
  135. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs_screening.py +0 -0
  136. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs_space_filling.py +0 -0
  137. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/designs_supersaturated.py +0 -0
  138. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/factor.py +0 -0
  139. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/knowledge/__init__.py +0 -0
  140. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/knowledge/api.py +0 -0
  141. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/knowledge/data/concepts.yaml +0 -0
  142. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/knowledge/data/decision_rules.yaml +0 -0
  143. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/knowledge/data/design_types.yaml +0 -0
  144. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/knowledge/data/diagnostics.yaml +0 -0
  145. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/knowledge/engine.py +0 -0
  146. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/knowledge/models.py +0 -0
  147. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/models.py +0 -0
  148. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/omars.py +0 -0
  149. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/optimal.py +0 -0
  150. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/optimization.py +0 -0
  151. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/region.py +0 -0
  152. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/simulations.py +0 -0
  153. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/strategy/__init__.py +0 -0
  154. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/strategy/budget.py +0 -0
  155. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/strategy/domain_templates.py +0 -0
  156. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/strategy/engine.py +0 -0
  157. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/strategy/models.py +0 -0
  158. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/structures.py +0 -0
  159. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/tools.py +0 -0
  160. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/trade_off.py +0 -0
  161. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/visualization/__init__.py +0 -0
  162. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/visualization/api.py +0 -0
  163. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/visualization/plots/__init__.py +0 -0
  164. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/visualization/plots/cube_plot.py +0 -0
  165. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/visualization/plots/design_quality.py +0 -0
  166. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/visualization/plots/diagnostics.py +0 -0
  167. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/visualization/plots/effects.py +0 -0
  168. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/visualization/plots/optimization_plots.py +0 -0
  169. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/visualization/plots/registry.py +0 -0
  170. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/visualization/plots/significance.py +0 -0
  171. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/visualization/plots/square_plot.py +0 -0
  172. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/experiments/visualization/plots/surfaces.py +0 -0
  173. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/interactions.py +0 -0
  174. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/mcp_server.py +0 -0
  175. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/monitoring/__init__.py +0 -0
  176. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/monitoring/metrics.py +0 -0
  177. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/monitoring/tools.py +0 -0
  178. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/__init__.py +0 -0
  179. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_adaptive.py +0 -0
  180. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_asca.py +0 -0
  181. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_base.py +0 -0
  182. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_categorical.py +0 -0
  183. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_common.py +0 -0
  184. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_cv_criteria.py +0 -0
  185. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_diagnostics.py +0 -0
  186. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_impute.py +0 -0
  187. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_mbpca.py +0 -0
  188. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_nipals.py +0 -0
  189. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_null.py +0 -0
  190. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_opls.py +0 -0
  191. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_pca_pls.py +0 -0
  192. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_plsda.py +0 -0
  193. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_preprocessing.py +0 -0
  194. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_prm.py +0 -0
  195. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_procrustes.py +0 -0
  196. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_projection.py +0 -0
  197. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_resampling.py +0 -0
  198. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/_robust.py +0 -0
  199. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/methods.py +0 -0
  200. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/plots.py +0 -0
  201. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/multivariate/tools.py +0 -0
  202. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/py.typed +0 -0
  203. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/recipes.py +0 -0
  204. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/regression/__init__.py +0 -0
  205. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/regression/methods.py +0 -0
  206. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/regression/tools.py +0 -0
  207. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/sensory/__init__.py +0 -0
  208. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/sensory/designed.py +0 -0
  209. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/sensory/diagnostics.py +0 -0
  210. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/sensory/ingest.py +0 -0
  211. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/sensory/mam.py +0 -0
  212. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/sensory/panel.py +0 -0
  213. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/sensory/recipes.py +0 -0
  214. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/sensory/tools.py +0 -0
  215. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/sensory/validation.py +0 -0
  216. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/simulation/__init__.py +0 -0
  217. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/simulation/batch.py +0 -0
  218. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/simulation/context.py +0 -0
  219. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/simulation/latent.py +0 -0
  220. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/simulation/model.py +0 -0
  221. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/simulation/recipes.py +0 -0
  222. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/simulation/tools.py +0 -0
  223. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/tool_safety.py +0 -0
  224. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/tool_spec.py +0 -0
  225. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/univariate/__init__.py +0 -0
  226. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/univariate/tools.py +0 -0
  227. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/__init__.py +0 -0
  228. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/adapters/__init__.py +0 -0
  229. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/adapters/base.py +0 -0
  230. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/adapters/echarts_adapter.py +0 -0
  231. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/adapters/plotly_adapter.py +0 -0
  232. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/charts/__init__.py +0 -0
  233. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/charts/boxplot.py +0 -0
  234. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/colors.py +0 -0
  235. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/raincloud.py +0 -0
  236. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/spec.py +0 -0
  237. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/tools.py +0 -0
  238. {process_improve-1.97.0 → process_improve-1.97.2}/src/process_improve/visualization/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: process-improve
3
- Version: 1.97.0
3
+ Version: 1.97.2
4
4
  Summary: Designed Experiments; Latent Variables (PCA, PLS, multivariate methods with missing data); Process Monitoring; Batch data analysis.
5
5
  Keywords: Designed Experiments,Latent Variables,PCA,PLS,Multivariate Data Analysis,Batch data analysis
6
6
  Author: Kevin Dunn
@@ -42,7 +42,7 @@ Requires-Dist: osqp>=1.0 ; extra == 'control'
42
42
  Requires-Dist: coverage>=7.13.1 ; extra == 'dev'
43
43
  Requires-Dist: hypothesis>=6.100 ; extra == 'dev'
44
44
  Requires-Dist: matplotlib-stubs>=0.3.11 ; extra == 'dev'
45
- Requires-Dist: mypy>=1.19.1,<2.4 ; extra == 'dev'
45
+ Requires-Dist: mypy>=1.19.1,<2.5 ; extra == 'dev'
46
46
  Requires-Dist: pandas-stubs>=2.3.3.260113 ; extra == 'dev'
47
47
  Requires-Dist: plotly-stubs>=0.0.6 ; extra == 'dev'
48
48
  Requires-Dist: pre-commit>=4.5.1 ; extra == 'dev'
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "process-improve"
3
- version = "1.97.0"
3
+ version = "1.97.2"
4
4
  description = "Designed Experiments; Latent Variables (PCA, PLS, multivariate methods with missing data); Process Monitoring; Batch data analysis."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -74,7 +74,7 @@ dev = [
74
74
  "coverage>=7.13.1",
75
75
  "hypothesis>=6.100",
76
76
  "matplotlib-stubs>=0.3.11",
77
- "mypy>=1.19.1,<2.4",
77
+ "mypy>=1.19.1,<2.5",
78
78
  "pandas-stubs>=2.3.3.260113",
79
79
  "plotly-stubs>=0.0.6",
80
80
  "pre-commit>=4.5.1",
@@ -108,7 +108,7 @@ dev = [
108
108
  "coverage>=7.13.1",
109
109
  "hypothesis>=6.100",
110
110
  "matplotlib-stubs>=0.3.11",
111
- "mypy>=1.19.1,<2.4",
111
+ "mypy>=1.19.1,<2.5",
112
112
  "pandas-stubs>=2.3.3.260113",
113
113
  "plotly-stubs>=0.0.6",
114
114
  "pre-commit>=4.5.1",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "process-improve"
3
- version = "1.97.0"
3
+ version = "1.97.2"
4
4
  description = 'Designed Experiments; Latent Variables (PCA, PLS, multivariate methods with missing data); Process Monitoring; Batch data analysis.'
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -122,7 +122,7 @@ dev = [
122
122
  "coverage>=7.13.1",
123
123
  "hypothesis>=6.100",
124
124
  "matplotlib-stubs>=0.3.11",
125
- "mypy>=1.19.1,<2.4",
125
+ "mypy>=1.19.1,<2.5",
126
126
  "pandas-stubs>=2.3.3.260113",
127
127
  "plotly-stubs>=0.0.6",
128
128
  "pre-commit>=4.5.1",
@@ -157,7 +157,7 @@ dev = [
157
157
  "coverage>=7.13.1",
158
158
  "hypothesis>=6.100",
159
159
  "matplotlib-stubs>=0.3.11",
160
- "mypy>=1.19.1,<2.4",
160
+ "mypy>=1.19.1,<2.5",
161
161
  "pandas-stubs>=2.3.3.260113",
162
162
  "plotly-stubs>=0.0.6",
163
163
  "pre-commit>=4.5.1",
@@ -58,11 +58,16 @@ def require_extra(missing: str, extra: str) -> ImportError:
58
58
  class _MissingExtra:
59
59
  """Stand-in for an optional module that was not installed.
60
60
 
61
- Attribute access raises :class:`AttributeError` (Python's special-method
62
- convention -- ``hasattr(stub, 'Figure')`` returns ``False``) with the
63
- canonical "install the extra" remediation message in the body. Direct
64
- *calls* on the stub raise :class:`ImportError` because that is the
65
- natural error class for "you need to install this dependency".
61
+ Using the stub in any way that needs the real package raises
62
+ :class:`ImportError` with the canonical "install the extra" message, so a
63
+ missing ``plotting`` extra fails the same way as a missing ``expt`` extra.
64
+ Attribute access returns a child stub that remembers the dotted path, so
65
+ ``go.Figure(...)`` and ``go.layout.Template(...)`` raise ``ImportError`` at
66
+ the call, and indexing (``pio.templates[name]``) raises it too.
67
+
68
+ Dunder lookups (``__array__``, ``__deepcopy__``, ...) raise
69
+ :class:`AttributeError` instead, so protocol probes such as ``copy``,
70
+ ``pickle`` and numpy see a missing attribute, per the Python data model.
66
71
 
67
72
  Lets a module top-level write::
68
73
 
@@ -75,21 +80,32 @@ class _MissingExtra:
75
80
  who never touch the optional surface.
76
81
  """
77
82
 
78
- __slots__ = ("_extra", "_missing")
83
+ __slots__ = ("_extra", "_missing", "_path")
79
84
 
80
- def __init__(self, missing: str, extra: str) -> None:
85
+ def __init__(self, missing: str, extra: str, path: str = "") -> None:
81
86
  self._missing = missing
82
87
  self._extra = extra
83
-
84
- def __getattr__(self, name: str) -> object:
85
- # __getattr__ must raise AttributeError so ``hasattr`` and friends
86
- # behave per the Python data model (CodeQL py/non-standard-exception
87
- # -raised-in-special-method). The install-hint message is preserved
88
- # in the exception text.
89
- raise AttributeError(f"{_extra_message(self._missing, self._extra)}\n(Attempted attribute access: {name!r}.)")
88
+ self._path = path
89
+
90
+ def _error(self) -> ImportError:
91
+ hint = f"\n(Attempted to use {self._path!r}.)" if self._path else ""
92
+ return ImportError(f"{_extra_message(self._missing, self._extra)}{hint}")
93
+
94
+ def __getattr__(self, name: str) -> _MissingExtra:
95
+ if name.startswith("__") and name.endswith("__"):
96
+ # __getattr__ must raise AttributeError for protocol lookups so
97
+ # ``hasattr`` and friends behave per the data model (CodeQL
98
+ # py/non-standard-exception-raised-in-special-method).
99
+ raise AttributeError(
100
+ f"{_extra_message(self._missing, self._extra)}\n(Attempted attribute access: {name!r}.)"
101
+ )
102
+ return _MissingExtra(self._missing, self._extra, f"{self._path}.{name}" if self._path else name)
90
103
 
91
104
  def __call__(self, *_args: object, **_kwargs: object) -> object:
92
- # __call__ has no equivalent convention; raise ImportError here
93
- # because callers that try to use the stub directly are asking
94
- # for the missing package.
95
- raise require_extra(self._missing, self._extra)
105
+ raise self._error()
106
+
107
+ def __getitem__(self, _key: object) -> object:
108
+ raise self._error()
109
+
110
+ def __setitem__(self, _key: object, _value: object) -> None:
111
+ raise self._error()
@@ -15,9 +15,6 @@ def find_elbow_point(x: np.ndarray, y: np.ndarray, max_iter: int = 41) -> int |
15
15
  """
16
16
  Find the elbow point when plotting numeric entries in `x` vs numeric values in list `y`.
17
17
 
18
- Return the index into the vectors `x` and `y` [the vectors must have the same length], where
19
- the elbow point occurs.
20
-
21
18
  Using a robust linear fit, sorts the samples in X (independent variable)
22
19
  and takes the first 5 samples from the left, and the last 5 from the right,
23
20
  then fits two linear regressions and computes the intersection of the two
@@ -32,6 +29,18 @@ def find_elbow_point(x: np.ndarray, y: np.ndarray, max_iter: int = 41) -> int |
32
29
  Will probably not work well on few data points. If so, try fitting a spline
33
30
  to the raw data and then repeat with the interpolated data.
34
31
 
32
+ Parameters
33
+ ----------
34
+ x : np.ndarray
35
+ Independent-variable values. Must have the same length as `y`. NaN
36
+ entries are dropped pairwise with `y` before fitting; more than 10
37
+ finite pairs must remain.
38
+ y : np.ndarray
39
+ Dependent-variable values. Must have the same length as `x`.
40
+ max_iter : int, optional
41
+ Number of evenly spaced window sizes to sweep when accumulating
42
+ intersection points. Default is 41.
43
+
35
44
  Returns
36
45
  -------
37
46
  int or float
@@ -40,6 +49,12 @@ def find_elbow_point(x: np.ndarray, y: np.ndarray, max_iter: int = 41) -> int |
40
49
  Returns ``np.nan`` when the intersection sweep produced only
41
50
  NaNs (for example, when every candidate line pair was
42
51
  near-parallel), so no consensus intersection could be formed.
52
+
53
+ Raises
54
+ ------
55
+ ValueError
56
+ If `x` and `y` have different lengths, or if 10 or fewer finite
57
+ pairs remain after NaN entries are dropped.
43
58
  """
44
59
  start = 5
45
60
  # assert divmod(max_iter, 2)[1] # must be odd number; to ensure we calculate the median later
@@ -167,8 +167,10 @@ class Settings:
167
167
  """Single-instance configuration store.
168
168
 
169
169
  Every attribute is a knob; reads are cached after the first access.
170
- Call :meth:`reload` after mutating ``os.environ`` (typically inside a
171
- test fixture); call :meth:`override` to set a single knob from code.
170
+ To set a single knob from code, assign to its property (each knob has a
171
+ setter, e.g. ``settings.tool_timeout = 30.0``). Call :meth:`reload` after
172
+ mutating ``os.environ`` (typically inside a test fixture); call
173
+ :meth:`as_dict` for a snapshot of every knob's current value.
172
174
  """
173
175
 
174
176
  __slots__ = ("_cache",)
@@ -83,6 +83,15 @@ class EvaluateDesignInput(BaseModel):
83
83
  ge=0,
84
84
  description="Seed for the region sampler (default: 42).",
85
85
  )
86
+ categorical_coding: Literal["effect", "treatment"] = Field(
87
+ "effect",
88
+ description=(
89
+ "How a categorical (label) factor is coded. 'effect' (default): sum-to-zero effect coding, the "
90
+ "usual convention in DoE software and the coding generate_design's optimal designs use. "
91
+ "'treatment': 0/1 dummy coding against the first level. A-, E-optimality, VIF, condition number, "
92
+ "power and the alias matrix depend on the coding; prediction variance and D rankings do not."
93
+ ),
94
+ )
86
95
 
87
96
 
88
97
  @tool_spec(
@@ -139,6 +148,7 @@ def evaluate_design_tool(spec: EvaluateDesignInput) -> dict[str, Any]:
139
148
  sigma=spec.sigma,
140
149
  region=region,
141
150
  random_state=spec.random_state,
151
+ categorical_coding=spec.categorical_coding,
142
152
  )
143
153
  return clean(result)
144
154
  except _TOOL_EXPECTED_EXCEPTIONS as e:
@@ -24,7 +24,7 @@ import logging
24
24
  import warnings
25
25
  from collections.abc import Callable
26
26
  from dataclasses import dataclass
27
- from typing import Any
27
+ from typing import TYPE_CHECKING, Any
28
28
 
29
29
  import numpy as np
30
30
  import pandas as pd
@@ -41,6 +41,9 @@ from process_improve.experiments.evaluate import (
41
41
  )
42
42
  from process_improve.experiments.models import validate_formula_is_safe, validate_identifier_is_safe
43
43
 
44
+ if TYPE_CHECKING:
45
+ from process_improve.experiments.designs_constrained import _Region
46
+
44
47
  logger = logging.getLogger(__name__)
45
48
 
46
49
  # ---------------------------------------------------------------------------
@@ -557,23 +560,51 @@ def _model_rows(rhs: str, factor_names: list[str], existing: pd.DataFrame, candi
557
560
  return rows[: len(existing)], rows[len(existing) :]
558
561
 
559
562
 
563
+ #: Target models whose columns ``designs_constrained.model_matrix`` builds directly, without patsy.
564
+ _NAMED_MODELS = ("main_effects", "interactions", "quadratic")
565
+
566
+
567
+ def _exchange_rows(
568
+ region: _Region, model: str, rhs: str, factor_names: list[str], existing: pd.DataFrame
569
+ ) -> tuple[np.ndarray, Callable[[np.ndarray, np.ndarray], np.ndarray]]:
570
+ """Return the existing runs' model rows, and a function giving the model rows of coded candidate points.
571
+
572
+ A named model is expanded with numpy (the same columns as its patsy formula, in
573
+ another order, which no criterion depends on), which keeps the exchange's polish
574
+ cheap; a custom formula goes through patsy, built together with the existing runs
575
+ so stateful transforms share their scale.
576
+ """
577
+ from process_improve.experiments.designs_constrained import model_matrix # noqa: PLC0415
578
+
579
+ if model in _NAMED_MODELS:
580
+ coded = existing[factor_names].to_numpy(dtype=float)
581
+ fixed = model_matrix(region, coded, np.empty((len(coded), 0), dtype=int), model)
582
+ return fixed, lambda points, cats: model_matrix(region, points, cats, model)
583
+ fixed = _model_rows(rhs, factor_names, existing, np.empty((0, len(factor_names))))[0]
584
+ return fixed, lambda points, _cats: _model_rows(rhs, factor_names, existing, points)[1]
585
+
586
+
560
587
  def _augment_add_runs_optimal(ctx: _AugmentContext) -> dict[str, Any]:
561
588
  """Add D-optimal runs to the existing design, which stays fixed.
562
589
 
563
590
  The runs come from a Fedorov exchange over a candidate grid in coded units, with
564
- the existing runs as fixed rows. Unlike a one-run-at-a-time greedy search, the
565
- exchange can start from a design that cannot yet estimate the target model, as
566
- every screening design aimed at a quadratic model is. When the requested runs
567
- cannot supply the rank the existing runs lack, more are added, and the
568
- explanation says so. Candidates may repeat, which replicates a run where the
569
- criterion wants it.
591
+ the existing runs as fixed rows. For a quadratic model on a 3-level or sampled grid,
592
+ a coordinate exchange on a 5-level lattice then polishes the design from each start
593
+ (see ``select_runs``). Unlike a one-run-at-a-time greedy search, the exchange can
594
+ start from a design that cannot yet estimate the target model, as every screening
595
+ design aimed at a quadratic model is. When the requested runs cannot supply the
596
+ rank the existing runs lack, more are added, and the explanation says so.
597
+ Candidates may repeat, which replicates a run where the criterion wants it.
570
598
  """
571
599
  from process_improve.experiments.designs_constrained import ( # noqa: PLC0415
600
+ CandidatePool,
572
601
  Criterion,
602
+ PolishLattice,
573
603
  _budget_for_fixed_runs,
574
604
  _Region,
575
605
  build_candidates,
576
- fedorov_exchange,
606
+ polish_levels,
607
+ select_runs,
577
608
  )
578
609
  from process_improve.experiments.factor import Factor # noqa: PLC0415
579
610
 
@@ -586,16 +617,22 @@ def _augment_add_runs_optimal(ctx: _AugmentContext) -> dict[str, Any]:
586
617
 
587
618
  region = _Region([Factor(name=n, low=-1, high=1) for n in ctx.factor_names], [], [])
588
619
  grid_model = model if model in ("main_effects", "interactions") else "quadratic"
589
- coded, _cats, _counts = build_candidates(region, None, grid_model)
590
- f_fixed, f_cand = _model_rows(rhs, ctx.factor_names, df, coded)
620
+ coded, cats, counts = build_candidates(region, None, grid_model)
621
+ f_fixed, rows_of = _exchange_rows(region, model, rhs, ctx.factor_names, df)
622
+ f_cand = rows_of(coded, cats)
591
623
  n_parameters = f_cand.shape[1]
592
624
  if np.linalg.matrix_rank(np.vstack([f_fixed, f_cand])) < n_parameters:
593
625
  raise ValueError(f"The candidate grid cannot support the {model!r} model; use a simpler target_model.")
594
626
 
595
627
  total = _budget_for_fixed_runs(f_fixed, n_parameters, len(df) + ctx.n_additional_runs)
596
628
  n_new = total - len(df)
597
- rows, _value = fedorov_exchange(f_cand, n_new, f_fixed, check_random_state(ctx.random_state), Criterion.d())
598
- new_runs_df = pd.DataFrame(coded[rows], columns=ctx.factor_names)
629
+ levels = polish_levels(counts)
630
+ lattice = PolishLattice(levels, rows_of) if grid_model == "quadratic" and levels is not None else None
631
+ pool = CandidatePool(coded, cats, f_cand, lattice)
632
+ _rows, new_coded, _cats, _value = select_runs(
633
+ pool, n_new, f_fixed, check_random_state(ctx.random_state), Criterion.d()
634
+ )
635
+ new_runs_df = pd.DataFrame(new_coded, columns=ctx.factor_names)
599
636
  augmented = pd.concat([df, new_runs_df], ignore_index=True)
600
637
 
601
638
  notes = [
@@ -678,7 +678,8 @@ def generate_design( # noqa: PLR0913
678
678
  ``Constraint(expression="3*T + 5*D <= 600")``; a dict of ``Constraint`` fields or
679
679
  a bare expression string is accepted too. Honoured by the optimal
680
680
  families (``"d_optimal"``, chosen automatically when constraints are given,
681
- ``"i_optimal"``, ``"a_optimal"`` and ``"e_optimal"``), whose runs are selected
681
+ ``"i_optimal"``, ``"a_optimal"``, ``"e_optimal"``, ``"g_optimal"`` and
682
+ ``"k_optimal"``), whose runs are selected
682
683
  from a candidate set of feasible points; by ``"mixture"`` (linear constraints
683
684
  in the proportions); and by the ``"sobol"``, ``"halton"``, ``"maximin"`` and
684
685
  ``"maxpro"`` space-filling designs. Other design types do not enforce them and set
@@ -695,7 +696,8 @@ def generate_design( # noqa: PLR0913
695
696
  Ignored by the classical (non-optimal) design families.
696
697
  fixed_runs : pandas.DataFrame or None
697
698
  Runs to hold fixed while the optimizer fills the rest (design augmentation), for the
698
- optimal families only (``"d_optimal"``, ``"i_optimal"``, ``"a_optimal"``, ``"e_optimal"``). One row per
699
+ optimal families only (``"d_optimal"``, ``"i_optimal"``, ``"a_optimal"``, ``"e_optimal"``,
700
+ ``"g_optimal"``, ``"k_optimal"``). One row per
699
701
  fixed run, one column per factor, in the same coding as the returned design: continuous
700
702
  factors in coded ``[-1, 1]`` units, categorical factors as level labels.
701
703
  The fixed runs occupy the first rows of the result and ``budget`` counts them, so