bossanova 0.1.0.dev10__tar.gz → 0.1.0.dev11__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 (230) hide show
  1. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/PKG-INFO +1 -1
  2. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/data.py +4 -4
  3. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/display.py +9 -9
  4. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/explore.py +3 -3
  5. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/formula.py +2 -2
  6. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/specs.py +2 -2
  7. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/state.py +32 -21
  8. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/design/reference.py +40 -8
  9. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/profile.py +4 -2
  10. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/__init__.py +12 -0
  11. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/compute.py +227 -33
  12. bossanova-0.1.0.dev11/bossanova/internal/operations/marginal/conditions.py +225 -0
  13. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/contrasts.py +148 -0
  14. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/emm.py +18 -1
  15. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/design.py +20 -11
  16. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/pyproject.toml +1 -1
  17. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/.gitignore +0 -0
  18. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/LICENSE +0 -0
  19. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/README.md +0 -0
  20. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/__init__.py +0 -0
  21. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/README.md +0 -0
  22. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/__init__.py +0 -0
  23. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/advertising.csv +0 -0
  24. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/cake.csv +0 -0
  25. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/chickweight.csv +0 -0
  26. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/credit.csv +0 -0
  27. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/gammas.csv +0 -0
  28. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/mtcars.csv +0 -0
  29. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/penguins.csv +0 -0
  30. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/poker.csv +0 -0
  31. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/sleep.csv +0 -0
  32. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/titanic.csv +0 -0
  33. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/titanic_test.csv +0 -0
  34. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/data/titanic_train.csv +0 -0
  35. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/distributions/__init__.py +0 -0
  36. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/distributions/continuous.py +0 -0
  37. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/distributions/discrete.py +0 -0
  38. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/distributions/varying.py +0 -0
  39. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/expressions.py +0 -0
  40. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/__init__.py +0 -0
  41. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/__init__.py +0 -0
  42. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/builders/__init__.py +0 -0
  43. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/builders/data.py +0 -0
  44. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/builders/dataframes.py +0 -0
  45. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/builders/results.py +0 -0
  46. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/builders/specs.py +0 -0
  47. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/builders/state.py +0 -0
  48. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/schemas.py +0 -0
  49. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/structs/__init__.py +0 -0
  50. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/containers/validators.py +0 -0
  51. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/__init__.py +0 -0
  52. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/backend/__init__.py +0 -0
  53. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/backend/dispatch.py +0 -0
  54. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/backend/jax.py +0 -0
  55. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/backend/numpy.py +0 -0
  56. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/backend/protocol.py +0 -0
  57. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/batching.py +0 -0
  58. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/config.py +0 -0
  59. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/convergence.py +0 -0
  60. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/design/__init__.py +0 -0
  61. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/design/coding.py +0 -0
  62. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/design/names.py +0 -0
  63. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/design/z_matrix.py +0 -0
  64. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/differentiation.py +0 -0
  65. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/__init__.py +0 -0
  66. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/algebra.py +0 -0
  67. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/base.py +0 -0
  68. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/core.py +0 -0
  69. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/derived.py +0 -0
  70. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/factories.py +0 -0
  71. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/plotting.py +0 -0
  72. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/distributions/probability.py +0 -0
  73. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/__init__.py +0 -0
  74. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/binomial.py +0 -0
  75. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/create.py +0 -0
  76. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/gamma.py +0 -0
  77. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/gaussian.py +0 -0
  78. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/links.py +0 -0
  79. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/poisson.py +0 -0
  80. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/response.py +0 -0
  81. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/schema.py +0 -0
  82. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/family/tdist.py +0 -0
  83. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/__init__.py +0 -0
  84. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/contrasts.py +0 -0
  85. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/diagnostics.py +0 -0
  86. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/estimation.py +0 -0
  87. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/hypothesis.py +0 -0
  88. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/information_criteria.py +0 -0
  89. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/profile.py +0 -0
  90. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/sandwich.py +0 -0
  91. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/satterthwaite.py +0 -0
  92. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/wald_variance.py +0 -0
  93. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/inference/welch.py +0 -0
  94. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/linalg/__init__.py +0 -0
  95. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/linalg/qr.py +0 -0
  96. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/linalg/sparse.py +0 -0
  97. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/linalg/svd.py +0 -0
  98. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/predict.py +0 -0
  99. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/rng.py +0 -0
  100. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/__init__.py +0 -0
  101. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/glm.py +0 -0
  102. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/glmer.py +0 -0
  103. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/heuristics.py +0 -0
  104. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/initialization.py +0 -0
  105. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/lambda_builder.py +0 -0
  106. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/lambda_sparse.py +0 -0
  107. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/lambda_template.py +0 -0
  108. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/lmer.py +0 -0
  109. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/optimize.py +0 -0
  110. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/pirls_sparse.py +0 -0
  111. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/solvers/quadrature.py +0 -0
  112. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/tolerances.py +0 -0
  113. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/transforms.py +0 -0
  114. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/variance.py +0 -0
  115. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/maths/weights.py +0 -0
  116. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/__init__.py +0 -0
  117. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/bundle.py +0 -0
  118. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/common/__init__.py +0 -0
  119. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/common/classify.py +0 -0
  120. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/common/factors.py +0 -0
  121. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/common/formula_utils.py +0 -0
  122. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/__init__.py +0 -0
  123. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/compare.py +0 -0
  124. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/cv.py +0 -0
  125. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/deviance.py +0 -0
  126. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/f_test.py +0 -0
  127. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/helpers.py +0 -0
  128. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/lrt.py +0 -0
  129. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/lrt_compare.py +0 -0
  130. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/compare/refit.py +0 -0
  131. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/contrasts.py +0 -0
  132. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/convergence.py +0 -0
  133. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/diagnostics.py +0 -0
  134. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/__init__.py +0 -0
  135. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/dispatch.py +0 -0
  136. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/glm.py +0 -0
  137. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/glmer.py +0 -0
  138. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/lmer.py +0 -0
  139. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/ols.py +0 -0
  140. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/fit/rank.py +0 -0
  141. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/__init__.py +0 -0
  142. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/design.py +0 -0
  143. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/encoding.py +0 -0
  144. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/evaluate.py +0 -0
  145. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/evaluate_newdata.py +0 -0
  146. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/evaluate_transforms.py +0 -0
  147. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/helpers.py +0 -0
  148. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/parse.py +0 -0
  149. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/parser/__init__.py +0 -0
  150. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/parser/expr.py +0 -0
  151. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/parser/parser.py +0 -0
  152. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/parser/scanner.py +0 -0
  153. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/parser/token.py +0 -0
  154. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/formula/random_effects.py +0 -0
  155. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/__init__.py +0 -0
  156. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/asymptotic.py +0 -0
  157. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/bootstrap.py +0 -0
  158. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/cv.py +0 -0
  159. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/mee.py +0 -0
  160. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/permutation.py +0 -0
  161. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/prediction.py +0 -0
  162. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/resample_bundle.py +0 -0
  163. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/satterthwaite_emm.py +0 -0
  164. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/infer/simulation.py +0 -0
  165. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/explore.py +0 -0
  166. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/grid.py +0 -0
  167. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/inference.py +0 -0
  168. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/joint_tests.py +0 -0
  169. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/slopes.py +0 -0
  170. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/marginal/validation.py +0 -0
  171. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/predict.py +0 -0
  172. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/profile.py +0 -0
  173. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/rendering/__init__.py +0 -0
  174. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/rendering/latex.py +0 -0
  175. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/__init__.py +0 -0
  176. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/common.py +0 -0
  177. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/core.py +0 -0
  178. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/glm.py +0 -0
  179. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/glmer.py +0 -0
  180. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/lm.py +0 -0
  181. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/lm_bca.py +0 -0
  182. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/lm_operators.py +0 -0
  183. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/lmer.py +0 -0
  184. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/mixed.py +0 -0
  185. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/results.py +0 -0
  186. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/resample/utils.py +0 -0
  187. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/__init__.py +0 -0
  188. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/dgp/__init__.py +0 -0
  189. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/dgp/generate.py +0 -0
  190. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/dgp/glm.py +0 -0
  191. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/dgp/glmer.py +0 -0
  192. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/dgp/lm.py +0 -0
  193. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/dgp/lmer.py +0 -0
  194. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/harness.py +0 -0
  195. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/metrics.py +0 -0
  196. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/simulation/model_sim.py +0 -0
  197. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/transforms.py +0 -0
  198. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/operations/varying.py +0 -0
  199. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/README.md +0 -0
  200. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/__init__.py +0 -0
  201. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/cognition.py +0 -0
  202. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/compare.py +0 -0
  203. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/core.py +0 -0
  204. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/core_data.py +0 -0
  205. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/core_protocols.py +0 -0
  206. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/core_sizing.py +0 -0
  207. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/core_viz.py +0 -0
  208. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/dag.py +0 -0
  209. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/fit.py +0 -0
  210. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/fit_builders.py +0 -0
  211. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/fit_layers.py +0 -0
  212. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/helpers.py +0 -0
  213. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/lattice.py +0 -0
  214. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/layout.py +0 -0
  215. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/mem.py +0 -0
  216. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/params.py +0 -0
  217. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/predict.py +0 -0
  218. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/profile.py +0 -0
  219. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/ranef.py +0 -0
  220. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/relationships.py +0 -0
  221. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/resamples.py +0 -0
  222. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/resid.py +0 -0
  223. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/internal/viz/vif.py +0 -0
  224. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/model/__init__.py +0 -0
  225. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/model/core.py +0 -0
  226. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/model/summary.py +0 -0
  227. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/bossanova/py.typed +0 -0
  228. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/tests/bossanova_benchmarks/bootstrap/data/README.md +0 -0
  229. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/tests/bossanova_benchmarks/insteval/data/README.md +0 -0
  230. {bossanova-0.1.0.dev10 → bossanova-0.1.0.dev11}/tests/bossanova_tests/hypothesis/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bossanova
3
- Version: 0.1.0.dev10
3
+ Version: 0.1.0.dev11
4
4
  Summary: Bridging statistical cultures with some jazz
5
5
  Author: Eshin Jolly
6
6
  License-Expression: MIT
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  from typing import TYPE_CHECKING
6
6
 
7
7
  import numpy as np
8
- from attrs import field, frozen
8
+ from attrs import field, frozen, validators
9
9
 
10
10
  from bossanova.internal.containers.validators import (
11
11
  is_ndarray,
@@ -112,8 +112,8 @@ class RankInfo:
112
112
  True
113
113
  """
114
114
 
115
- rank: int
116
- p: int
115
+ rank: int = field(validator=validators.instance_of(int))
116
+ p: int = field(validator=validators.instance_of(int))
117
117
  kept_indices: NDArray[np.intp] = field(validator=is_ndarray)
118
118
  dropped_indices: tuple[int, ...] = field(converter=tuple)
119
119
  dropped_names: tuple[str, ...] = field(converter=tuple)
@@ -174,7 +174,7 @@ class DataBundle:
174
174
  y_name: str
175
175
 
176
176
  valid_mask: NDArray[np.bool_] = field(validator=is_ndarray)
177
- n_total: int
177
+ n_total: int = field(validator=validators.instance_of(int))
178
178
 
179
179
  # Optional fields
180
180
  Z: sp.csc_matrix | None = field(default=None, validator=is_optional_sparse_csc)
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from attrs import field, frozen
5
+ from attrs import field, frozen, validators
6
6
 
7
7
  __all__ = [
8
8
  "MathDisplay",
@@ -24,12 +24,12 @@ class TermInfo:
24
24
  explanation: Human-readable explanation string.
25
25
  """
26
26
 
27
- name: str
28
- term_type: str
29
- base_var: str
30
- symbol: str
31
- latex: str
32
- explanation: str
27
+ name: str = field(validator=validators.instance_of(str))
28
+ term_type: str = field(validator=validators.instance_of(str))
29
+ base_var: str = field(validator=validators.instance_of(str))
30
+ symbol: str = field(validator=validators.instance_of(str))
31
+ latex: str = field(validator=validators.instance_of(str))
32
+ explanation: str = field(validator=validators.instance_of(str))
33
33
 
34
34
 
35
35
  @frozen
@@ -50,9 +50,9 @@ class MathDisplay:
50
50
  >>> display # renders in Jupyter
51
51
  """
52
52
 
53
- equation: str
53
+ equation: str = field(validator=validators.instance_of(str))
54
54
  explanations: tuple[str, ...] = field(factory=tuple)
55
- model_info: str = ""
55
+ model_info: str = field(default="", validator=validators.instance_of(str))
56
56
 
57
57
  def _repr_latex_(self) -> str:
58
58
  """LaTeX representation for Jupyter rendering."""
@@ -1,6 +1,6 @@
1
1
  """Parsing result containers for explore formulas."""
2
2
 
3
- from attrs import field, frozen
3
+ from attrs import field, frozen, validators
4
4
 
5
5
  __all__ = [
6
6
  "Condition",
@@ -23,7 +23,7 @@ class Condition:
23
23
  at_quantile: Number of quantile values to use.
24
24
  """
25
25
 
26
- var: str
26
+ var: str = field(validator=validators.instance_of(str))
27
27
  at_values: tuple | None = field(default=None)
28
28
  at_range: int | None = field(default=None)
29
29
  at_quantile: int | None = field(default=None)
@@ -47,7 +47,7 @@ class ExploreFormula:
47
47
  (e.g., from ``Days[0, 3, 6, 9]`` syntax). None means use all levels.
48
48
  """
49
49
 
50
- focal_var: str
50
+ focal_var: str = field(validator=validators.instance_of(str))
51
51
  contrast_type: str | None = field(default=None)
52
52
  contrast_degree: int | None = field(default=None)
53
53
  conditions: tuple[Condition, ...] = field(factory=tuple, converter=tuple)
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  from typing import TYPE_CHECKING
6
6
 
7
- from attrs import field, frozen
7
+ from attrs import field, frozen, validators
8
8
 
9
9
  from bossanova.internal.containers.validators import (
10
10
  to_factor_dict,
@@ -53,7 +53,7 @@ class FormulaSpec:
53
53
  """
54
54
 
55
55
  # --- Parsing results (from formula string) ---
56
- formula: str
56
+ formula: str = field(validator=validators.instance_of(str))
57
57
  response_var: str | None = field(default=None)
58
58
  response_transform: tuple[str, ...] | None = field(default=None)
59
59
  has_intercept: bool = field(default=True)
@@ -79,8 +79,8 @@ class ModelSpec:
79
79
  """
80
80
 
81
81
  # Required fields
82
- formula: str
83
- response_var: str
82
+ formula: str = field(validator=validators.instance_of(str))
83
+ response_var: str = field(validator=validators.instance_of(str))
84
84
  fixed_terms: tuple[str, ...] = field(converter=to_tuple)
85
85
 
86
86
  # Optional fields with defaults and validation
@@ -7,7 +7,7 @@ CVState, SimulationInferenceState, VaryingState, VaryingSpreadState).
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
- from typing import TYPE_CHECKING
10
+ from typing import TYPE_CHECKING, Any
11
11
 
12
12
  import numpy as np
13
13
  from attrs import field, frozen, validators
@@ -15,6 +15,7 @@ from attrs import field, frozen, validators
15
15
  from bossanova.internal.containers.validators import (
16
16
  is_ndarray,
17
17
  is_optional_ndarray,
18
+ to_tuple,
18
19
  )
19
20
 
20
21
  if TYPE_CHECKING:
@@ -240,9 +241,9 @@ class MeeState:
240
241
  grid: "pl.DataFrame" = field(repr=False)
241
242
  estimate: np.ndarray = field(validator=is_ndarray)
242
243
 
243
- explore_formula: str
244
- focal_var: str
245
- type: str # "means", "slopes", "contrasts"
244
+ explore_formula: str = field(validator=validators.instance_of(str))
245
+ focal_var: str = field(validator=validators.instance_of(str))
246
+ type: str = field(validator=validators.in_(("means", "slopes", "contrasts")))
246
247
  units: str = field(default="link", validator=validators.in_(("link", "data")))
247
248
 
248
249
  # Design matrix for delta method inference (optional)
@@ -313,7 +314,7 @@ class JointTestState:
313
314
  """
314
315
 
315
316
  # Required fields
316
- terms: tuple[str, ...]
317
+ terms: tuple[str, ...] = field(converter=to_tuple)
317
318
  df1: np.ndarray = field(validator=is_ndarray) # Numerator df per term
318
319
  statistic: np.ndarray = field(validator=is_ndarray) # F or chi2 values
319
320
  p_value: np.ndarray = field(validator=is_ndarray)
@@ -545,8 +546,8 @@ class SimulationInferenceState:
545
546
  >>> m.sim_inference.power["x"] # Proportion of sims where p < 0.05
546
547
  """
547
548
 
548
- sim_type: str # "post_fit" or "power_analysis"
549
- n_sims: int
549
+ sim_type: str = field(validator=validators.in_(("post_fit", "power_analysis")))
550
+ n_sims: int = field(validator=validators.instance_of(int))
550
551
 
551
552
  # Post-fit simulation summaries (per observation)
552
553
  sim_mean: np.ndarray | None = field(default=None)
@@ -601,9 +602,9 @@ class VaryingState:
601
602
 
602
603
  # Required fields
603
604
  grid: "pl.DataFrame" = field(repr=False)
604
- effects: dict[str, np.ndarray]
605
- grouping_var: str
606
- n_groups: int
605
+ effects: dict[str, np.ndarray] = field(validator=validators.instance_of(dict))
606
+ grouping_var: str = field(validator=validators.instance_of(str))
607
+ n_groups: int = field(validator=validators.instance_of(int))
607
608
 
608
609
  # Inference (optional, added by .infer())
609
610
  # These are dicts: effect_name -> array of interval bounds
@@ -667,8 +668,8 @@ class VaryingSpreadState:
667
668
 
668
669
  # Required fields
669
670
  components: "pl.DataFrame" = field(repr=False)
670
- sigma2: float
671
- tau2: dict[str, float]
671
+ sigma2: float = field(validator=validators.instance_of((int, float)))
672
+ tau2: dict[str, float] = field(validator=validators.instance_of(dict))
672
673
 
673
674
  # Optional fields
674
675
  rho: dict[str, float] = field(factory=dict) # "effect1_effect2" -> correlation
@@ -727,15 +728,25 @@ class ProfileState:
727
728
  """
728
729
 
729
730
  table: "pl.DataFrame" = field(repr=False)
730
- spline_forward: dict = field(repr=False)
731
- spline_reverse: dict = field(repr=False)
732
- ci_theta: dict[str, tuple[float, float]]
733
- ci_sd: dict[str, tuple[float, float]]
734
- ci_lower_sd: "NDArray[np.floating]" = field(repr=False)
735
- ci_upper_sd: "NDArray[np.floating]" = field(repr=False)
736
- conf_level: float
737
- dev_opt: float
738
- threshold: float = 4.0
731
+ spline_forward: dict[str, Any] = field(
732
+ repr=False, validator=validators.instance_of(dict)
733
+ )
734
+ spline_reverse: dict[str, Any] = field(
735
+ repr=False, validator=validators.instance_of(dict)
736
+ )
737
+ ci_theta: dict[str, tuple[float, float]] = field(
738
+ validator=validators.instance_of(dict)
739
+ )
740
+ ci_sd: dict[str, tuple[float, float]] = field(
741
+ validator=validators.instance_of(dict)
742
+ )
743
+ ci_lower_sd: NDArray[np.floating] = field(repr=False, validator=is_ndarray)
744
+ ci_upper_sd: NDArray[np.floating] = field(repr=False, validator=is_ndarray)
745
+ conf_level: float = field(validator=validators.instance_of((int, float)))
746
+ dev_opt: float = field(validator=validators.instance_of((int, float)))
747
+ threshold: float = field(
748
+ default=4.0, validator=validators.instance_of((int, float))
749
+ )
739
750
 
740
751
 
741
752
  # =============================================================================
@@ -19,6 +19,8 @@ def build_reference_design_matrix(
19
19
  focal_var: str,
20
20
  levels: list[str],
21
21
  X_means: np.ndarray,
22
+ *,
23
+ set_categoricals: dict[str, str] | None = None,
22
24
  ) -> np.ndarray:
23
25
  """Build design matrix for reference grid points.
24
26
 
@@ -38,6 +40,10 @@ def build_reference_design_matrix(
38
40
  levels: List of levels for the focal variable, defining row order.
39
41
  X_means: Column means of the original design matrix, shape (p,).
40
42
  Used for continuous covariate reference values.
43
+ set_categoricals: Optional dict mapping non-focal categorical variable
44
+ names to specific levels to pin them at (instead of marginalizing
45
+ at X_means). E.g. ``{"Ethnicity": "Asian"}`` sets the Ethnicity
46
+ dummies to indicator values for "Asian".
41
47
 
42
48
  Returns:
43
49
  Reference design matrix X_ref, shape (n_levels, p).
@@ -64,7 +70,9 @@ def build_reference_design_matrix(
64
70
  X_ref = np.zeros((n_levels, p), dtype=np.float64)
65
71
 
66
72
  for i, level in enumerate(levels):
67
- X_ref[i] = build_reference_row(X_names, focal_var, level, X_means)
73
+ X_ref[i] = build_reference_row(
74
+ X_names, focal_var, level, X_means, set_categoricals=set_categoricals
75
+ )
68
76
 
69
77
  return X_ref
70
78
 
@@ -74,6 +82,8 @@ def build_reference_row(
74
82
  focal_var: str,
75
83
  focal_level: str,
76
84
  X_means: np.ndarray,
85
+ *,
86
+ set_categoricals: dict[str, str] | None = None,
77
87
  ) -> np.ndarray:
78
88
  """Build a single row of the reference design matrix.
79
89
 
@@ -90,6 +100,11 @@ def build_reference_row(
90
100
  focal_var: Name of the focal categorical variable.
91
101
  focal_level: Level value to set for the focal variable.
92
102
  X_means: Column means for continuous covariate reference values.
103
+ set_categoricals: Optional dict mapping non-focal categorical variable
104
+ names to specific levels for indicator encoding. When a non-focal
105
+ categorical's ``base_term`` matches a key, the dummy is set to
106
+ ``1.0`` if the level matches, ``0.0`` otherwise (instead of using
107
+ the column mean for marginalization).
93
108
 
94
109
  Returns:
95
110
  Reference row, shape (p,).
@@ -110,10 +125,13 @@ def build_reference_row(
110
125
  X_means,
111
126
  focal_var=focal_var,
112
127
  focal_level=focal_level,
128
+ set_categoricals=set_categoricals,
113
129
  )
114
130
  elif info.column_type == "categorical":
115
131
  if info.base_term == focal_var:
116
132
  row[j] = 1.0 if info.level == focal_level else 0.0
133
+ elif set_categoricals and info.base_term in set_categoricals:
134
+ row[j] = 1.0 if info.level == set_categoricals[info.base_term] else 0.0
117
135
  else:
118
136
  row[j] = X_means[j]
119
137
  else:
@@ -243,12 +261,13 @@ def _resolve_interaction_value(
243
261
  *,
244
262
  focal_level: str | None = None,
245
263
  focal_value: float | None = None,
264
+ set_categoricals: dict[str, str] | None = None,
246
265
  ) -> float:
247
266
  """Compute reference value for an interaction column.
248
267
 
249
- If the interaction involves the focal variable, computes the product
250
- of component values (focal dummy/value times non-focal means). Otherwise,
251
- returns the empirical column mean for marginalization.
268
+ If the interaction involves the focal variable or a pinned categorical,
269
+ computes the product of component values. Otherwise, returns the
270
+ empirical column mean for marginalization.
252
271
 
253
272
  Args:
254
273
  col_name: Interaction column name (e.g., ``"Income:Student[Yes]"``).
@@ -259,22 +278,28 @@ def _resolve_interaction_value(
259
278
  ``focal_value``).
260
279
  focal_value: Value for continuous focal (mutually exclusive with
261
280
  ``focal_level``).
281
+ set_categoricals: Dict mapping non-focal categorical names to
282
+ pinned levels. When an interaction part's base_term matches,
283
+ the indicator value is used instead of the column mean.
262
284
 
263
285
  Returns:
264
286
  Computed reference value for the interaction column.
265
287
  """
266
288
  parts = col_name.split(":")
267
289
 
268
- # Check if any part of the interaction involves the focal variable
290
+ # Check if any part involves the focal variable or a pinned categorical
269
291
  involves_focal = any(
270
292
  parse_design_column_name(p).base_term == focal_var for p in parts
271
293
  )
294
+ involves_pinned = set_categoricals is not None and any(
295
+ parse_design_column_name(p).base_term in set_categoricals for p in parts
296
+ )
272
297
 
273
- if not involves_focal:
274
- # Non-focal interaction: use empirical column mean (marginalize)
298
+ if not involves_focal and not involves_pinned:
299
+ # Non-focal, non-pinned interaction: use empirical column mean
275
300
  return float(X_means[X_names_list.index(col_name)])
276
301
 
277
- # Focal interaction: compute product of component values
302
+ # Decompose and compute product of component values
278
303
  product = 1.0
279
304
  for part in parts:
280
305
  pinfo = parse_design_column_name(part)
@@ -286,6 +311,13 @@ def _resolve_interaction_value(
286
311
  product *= focal_value
287
312
  elif part in X_names_list:
288
313
  product *= float(X_means[X_names_list.index(part)])
314
+ elif (
315
+ set_categoricals
316
+ and pinfo.column_type == "categorical"
317
+ and pinfo.base_term in set_categoricals
318
+ ):
319
+ # Pinned categorical component: use indicator
320
+ product *= 1.0 if pinfo.level == set_categoricals[pinfo.base_term] else 0.0
289
321
  elif part in X_names_list:
290
322
  # Non-focal component: use its column mean
291
323
  product *= float(X_means[X_names_list.index(part)])
@@ -118,8 +118,10 @@ def compute_profile_inference(
118
118
  from bossanova.internal.containers.structs.state import ProfileState
119
119
  from bossanova.internal.maths.inference.profile import profile_likelihood
120
120
  from bossanova.internal.maths.solvers.lambda_builder import build_lambda_template
121
- from bossanova.internal.maths.solvers.lmm_deviance import lmm_deviance_sparse
122
- from bossanova.internal.maths.solvers.pls import compute_pls_invariants
121
+ from bossanova.internal.maths.solvers.lmer import (
122
+ compute_pls_invariants,
123
+ lmm_deviance_sparse,
124
+ )
123
125
  from bossanova.internal.operations.varying import per_factor_re_info
124
126
 
125
127
  re_meta = bundle.re_metadata
@@ -36,8 +36,15 @@ from bossanova.internal.operations.marginal.slopes import (
36
36
  from bossanova.internal.operations.marginal.compute import (
37
37
  dispatch_marginal_computation,
38
38
  )
39
+ from bossanova.internal.operations.marginal.conditions import (
40
+ ResolvedConditions,
41
+ combine_resolved,
42
+ merge_at_kwarg,
43
+ resolve_conditions,
44
+ )
39
45
  from bossanova.internal.operations.marginal.contrasts import (
40
46
  apply_contrasts,
47
+ apply_contrasts_grouped,
41
48
  compute_contrasts,
42
49
  pairwise_contrasts,
43
50
  poly_contrasts,
@@ -56,8 +63,11 @@ __all__ = [
56
63
  "Condition",
57
64
  "ExploreFormula",
58
65
  "ExploreFormulaError",
66
+ "ResolvedConditions",
59
67
  "apply_contrasts",
68
+ "apply_contrasts_grouped",
60
69
  "build_reference_grid",
70
+ "combine_resolved",
61
71
  "compute_conditional_emm",
62
72
  "compute_conditional_slopes",
63
73
  "compute_contrasts",
@@ -69,8 +79,10 @@ __all__ = [
69
79
  "compute_slopes",
70
80
  "compute_slopes_finite_diff",
71
81
  "dispatch_marginal_computation",
82
+ "merge_at_kwarg",
72
83
  "pairwise_contrasts",
73
84
  "parse_explore_formula",
74
85
  "poly_contrasts",
86
+ "resolve_conditions",
75
87
  "sequential_contrasts",
76
88
  ]