bossanova 0.1.0.dev19__tar.gz → 0.1.0.dev20__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. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/.gitignore +2 -1
  2. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/PKG-INFO +1 -1
  3. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/fit/dispatch.py +4 -4
  4. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/fit/glmer.py +18 -21
  5. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/slopes.py +15 -0
  6. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/model/core.py +1 -1
  7. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/pyproject.toml +5 -1
  8. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/LICENSE +0 -0
  9. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/README.md +0 -0
  10. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/__init__.py +0 -0
  11. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/README.md +0 -0
  12. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/__init__.py +0 -0
  13. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/advertising.csv +0 -0
  14. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/cake.csv +0 -0
  15. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/chickweight.csv +0 -0
  16. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/credit.csv +0 -0
  17. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/gammas.csv +0 -0
  18. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/mtcars.csv +0 -0
  19. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/penguins.csv +0 -0
  20. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/poker.csv +0 -0
  21. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/sleep.csv +0 -0
  22. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/titanic.csv +0 -0
  23. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/titanic_test.csv +0 -0
  24. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/data/titanic_train.csv +0 -0
  25. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/distributions/__init__.py +0 -0
  26. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/distributions/continuous.py +0 -0
  27. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/distributions/discrete.py +0 -0
  28. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/distributions/varying.py +0 -0
  29. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/expressions.py +0 -0
  30. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/__init__.py +0 -0
  31. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/compare/__init__.py +0 -0
  32. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/compare/compare.py +0 -0
  33. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/compare/cv.py +0 -0
  34. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/compare/deviance.py +0 -0
  35. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/compare/f_test.py +0 -0
  36. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/compare/helpers.py +0 -0
  37. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/compare/ic.py +0 -0
  38. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/compare/lrt.py +0 -0
  39. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/compare/lrt_compare.py +0 -0
  40. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/compare/refit.py +0 -0
  41. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/__init__.py +0 -0
  42. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/builders/__init__.py +0 -0
  43. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/builders/dataframes.py +0 -0
  44. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/builders/resamples.py +0 -0
  45. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/builders/results.py +0 -0
  46. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/builders/specs.py +0 -0
  47. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/builders/state.py +0 -0
  48. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/schemas.py +0 -0
  49. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/structs/__init__.py +0 -0
  50. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/structs/data.py +0 -0
  51. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/structs/display.py +0 -0
  52. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/structs/explore.py +0 -0
  53. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/structs/formula.py +0 -0
  54. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/structs/specs.py +0 -0
  55. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/structs/state.py +0 -0
  56. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/containers/validators.py +0 -0
  57. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/design/__init__.py +0 -0
  58. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/design/coding.py +0 -0
  59. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/design/names.py +0 -0
  60. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/design/reference.py +0 -0
  61. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/design/z_matrix.py +0 -0
  62. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/fit/__init__.py +0 -0
  63. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/fit/convergence.py +0 -0
  64. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/fit/diagnostics.py +0 -0
  65. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/fit/glm.py +0 -0
  66. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/fit/lmer.py +0 -0
  67. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/fit/ols.py +0 -0
  68. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/fit/predict.py +0 -0
  69. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/fit/rank.py +0 -0
  70. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/fit/varying.py +0 -0
  71. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/__init__.py +0 -0
  72. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/bundle.py +0 -0
  73. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/contrast_registry.py +0 -0
  74. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/contrast_specs.py +0 -0
  75. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/design.py +0 -0
  76. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/encoding.py +0 -0
  77. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/evaluate.py +0 -0
  78. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/evaluate_contrast.py +0 -0
  79. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/evaluate_newdata.py +0 -0
  80. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/evaluate_transforms.py +0 -0
  81. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/helpers.py +0 -0
  82. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/parse.py +0 -0
  83. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/parser/__init__.py +0 -0
  84. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/parser/expr.py +0 -0
  85. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/parser/parser.py +0 -0
  86. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/parser/scanner.py +0 -0
  87. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/parser/token.py +0 -0
  88. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/formula/random_effects.py +0 -0
  89. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/__init__.py +0 -0
  90. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/asymptotic.py +0 -0
  91. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/bootstrap.py +0 -0
  92. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/cv.py +0 -0
  93. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/dispatch.py +0 -0
  94. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/formula_utils.py +0 -0
  95. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/mee.py +0 -0
  96. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/params.py +0 -0
  97. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/permutation.py +0 -0
  98. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/prediction.py +0 -0
  99. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/profile.py +0 -0
  100. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/resample/__init__.py +0 -0
  101. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/resample/common.py +0 -0
  102. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/resample/core.py +0 -0
  103. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/resample/glmer.py +0 -0
  104. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/resample/lm_operators.py +0 -0
  105. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/resample/lmer.py +0 -0
  106. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/resample/results.py +0 -0
  107. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/resample/simulate.py +0 -0
  108. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/resample_bundle.py +0 -0
  109. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/satterthwaite_emm.py +0 -0
  110. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/infer/simulation.py +0 -0
  111. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/__init__.py +0 -0
  112. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/bracket_contrasts.py +0 -0
  113. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/compute.py +0 -0
  114. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/conditions.py +0 -0
  115. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/contrasts.py +0 -0
  116. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/emm.py +0 -0
  117. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/explore.py +0 -0
  118. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/explore_parser.py +0 -0
  119. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/explore_scanner.py +0 -0
  120. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/factors.py +0 -0
  121. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/grid.py +0 -0
  122. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/inference.py +0 -0
  123. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/joint_tests.py +0 -0
  124. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/matrices.py +0 -0
  125. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/transforms.py +0 -0
  126. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/marginal/validation.py +0 -0
  127. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/__init__.py +0 -0
  128. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/backend/__init__.py +0 -0
  129. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/backend/dispatch.py +0 -0
  130. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/backend/jax.py +0 -0
  131. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/backend/numpy.py +0 -0
  132. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/backend/protocol.py +0 -0
  133. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/batching.py +0 -0
  134. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/config.py +0 -0
  135. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/convergence.py +0 -0
  136. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/differentiation.py +0 -0
  137. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/distributions/__init__.py +0 -0
  138. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/distributions/algebra.py +0 -0
  139. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/distributions/base.py +0 -0
  140. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/distributions/core.py +0 -0
  141. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/distributions/derived.py +0 -0
  142. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/distributions/factories.py +0 -0
  143. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/distributions/plotting.py +0 -0
  144. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/distributions/probability.py +0 -0
  145. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/family/__init__.py +0 -0
  146. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/family/binomial.py +0 -0
  147. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/family/create.py +0 -0
  148. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/family/gamma.py +0 -0
  149. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/family/gaussian.py +0 -0
  150. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/family/links.py +0 -0
  151. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/family/poisson.py +0 -0
  152. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/family/response.py +0 -0
  153. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/family/schema.py +0 -0
  154. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/family/tdist.py +0 -0
  155. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/inference/__init__.py +0 -0
  156. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/inference/diagnostics.py +0 -0
  157. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/inference/estimation.py +0 -0
  158. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/inference/hypothesis.py +0 -0
  159. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/inference/information_criteria.py +0 -0
  160. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/inference/multiplicity.py +0 -0
  161. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/inference/profile.py +0 -0
  162. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/inference/sandwich.py +0 -0
  163. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/inference/satterthwaite.py +0 -0
  164. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/inference/wald_variance.py +0 -0
  165. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/inference/welch.py +0 -0
  166. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/linalg/__init__.py +0 -0
  167. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/linalg/qr.py +0 -0
  168. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/linalg/schur.py +0 -0
  169. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/linalg/sparse.py +0 -0
  170. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/linalg/svd.py +0 -0
  171. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/predict.py +0 -0
  172. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/rng.py +0 -0
  173. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/rounding.py +0 -0
  174. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/solvers/__init__.py +0 -0
  175. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/solvers/glm.py +0 -0
  176. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/solvers/glmer.py +0 -0
  177. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/solvers/heuristics.py +0 -0
  178. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/solvers/initialization.py +0 -0
  179. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/solvers/lambda_builder.py +0 -0
  180. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/solvers/lambda_sparse.py +0 -0
  181. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/solvers/lambda_template.py +0 -0
  182. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/solvers/lmer.py +0 -0
  183. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/solvers/optimize.py +0 -0
  184. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/solvers/pirls_sparse.py +0 -0
  185. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/solvers/quadrature.py +0 -0
  186. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/tolerances.py +0 -0
  187. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/transforms.py +0 -0
  188. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/variance.py +0 -0
  189. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/maths/weights.py +0 -0
  190. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/rendering/__init__.py +0 -0
  191. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/rendering/latex.py +0 -0
  192. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/rendering/markdown.py +0 -0
  193. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/simulation/__init__.py +0 -0
  194. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/simulation/dgp/__init__.py +0 -0
  195. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/simulation/dgp/generate.py +0 -0
  196. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/simulation/dgp/glm.py +0 -0
  197. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/simulation/dgp/glmer.py +0 -0
  198. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/simulation/dgp/lm.py +0 -0
  199. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/simulation/dgp/lmer.py +0 -0
  200. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/simulation/harness.py +0 -0
  201. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/simulation/metrics.py +0 -0
  202. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/simulation/model_sim.py +0 -0
  203. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/simulation/power.py +0 -0
  204. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/README.md +0 -0
  205. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/__init__.py +0 -0
  206. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/cognition.py +0 -0
  207. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/compare.py +0 -0
  208. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/core.py +0 -0
  209. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/core_data.py +0 -0
  210. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/core_protocols.py +0 -0
  211. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/core_sizing.py +0 -0
  212. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/core_viz.py +0 -0
  213. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/dag.py +0 -0
  214. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/design.py +0 -0
  215. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/fit.py +0 -0
  216. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/fit_builders.py +0 -0
  217. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/fit_layers.py +0 -0
  218. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/helpers.py +0 -0
  219. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/lattice.py +0 -0
  220. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/layout.py +0 -0
  221. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/mem.py +0 -0
  222. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/mem_forest.py +0 -0
  223. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/params.py +0 -0
  224. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/predict.py +0 -0
  225. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/profile.py +0 -0
  226. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/ranef.py +0 -0
  227. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/relationships.py +0 -0
  228. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/resamples.py +0 -0
  229. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/resid.py +0 -0
  230. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/internal/viz/vif.py +0 -0
  231. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/model/__init__.py +0 -0
  232. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/model/guards.py +0 -0
  233. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/model/result.py +0 -0
  234. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/model/summary.py +0 -0
  235. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/bossanova/py.typed +0 -0
  236. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/tests/bossanova_benchmarks/bootstrap/data/README.md +0 -0
  237. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/tests/bossanova_benchmarks/insteval/data/README.md +0 -0
  238. {bossanova-0.1.0.dev19 → bossanova-0.1.0.dev20}/tests/bossanova_tests/hypothesis/README.md +0 -0
@@ -17,7 +17,7 @@ docs/_build/
17
17
  docs/performance/
18
18
  profile_*.py
19
19
  benchmarks/
20
- !bossanova-docs/engineering/benchmarks/
20
+ !bossanova-docs/benchmarking/
21
21
  examples/
22
22
  papers/
23
23
  paper-summaries/
@@ -84,3 +84,4 @@ bossanova-docs/wip/
84
84
  research.md
85
85
  201b-ghct-05-models/
86
86
  emmeans/
87
+ walkthrough.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bossanova
3
- Version: 0.1.0.dev19
3
+ Version: 0.1.0.dev20
4
4
  Summary: Bridging statistical cultures with some jazz
5
5
  Author: Eshin Jolly
6
6
  License-Expression: MIT
@@ -105,7 +105,7 @@ def dispatch_solver(
105
105
  tol: float | None = None,
106
106
  verbose: bool = False,
107
107
  nAGQ: int = 1,
108
- use_hessian: bool = True,
108
+ use_hessian: bool = False,
109
109
  ) -> FitState:
110
110
  """Dispatch to the concrete solver implementation.
111
111
 
@@ -121,7 +121,7 @@ def dispatch_solver(
121
121
  tol: Convergence tolerance (solver-specific defaults if None).
122
122
  verbose: Print optimization progress (default: False).
123
123
  nAGQ: Quadrature points for GLMER (default: 1).
124
- use_hessian: Use Hessian-based vcov for GLMER (default: True).
124
+ use_hessian: Use Hessian-based vcov for GLMER (default: False).
125
125
 
126
126
  Returns:
127
127
  FitState from the selected solver.
@@ -172,7 +172,7 @@ def fit_model(
172
172
  tol: float | None = None,
173
173
  verbose: bool = False,
174
174
  nAGQ: int = 1,
175
- use_hessian: bool = True,
175
+ use_hessian: bool = False,
176
176
  ) -> FitState:
177
177
  """Dispatch to appropriate fitter based on model specification.
178
178
 
@@ -205,7 +205,7 @@ def fit_model(
205
205
  tol: Convergence tolerance (solver-specific defaults if None).
206
206
  verbose: Print optimization progress (default: False).
207
207
  nAGQ: Quadrature points for GLMER (default: 1).
208
- use_hessian: Use Hessian-based vcov for GLMER (default: True).
208
+ use_hessian: Use Hessian-based vcov for GLMER (default: False).
209
209
 
210
210
  Returns:
211
211
  FitState containing all fitting results.
@@ -29,7 +29,7 @@ def fit_glmer_pirls(
29
29
  tol: float = 1e-7,
30
30
  verbose: bool = False,
31
31
  nAGQ: int = 1,
32
- use_hessian: bool = True,
32
+ use_hessian: bool = False,
33
33
  ) -> FitState:
34
34
  """Fit generalized linear mixed model using Penalized IRLS.
35
35
 
@@ -70,7 +70,10 @@ def fit_glmer_pirls(
70
70
  tol: PIRLS convergence tolerance (default: 1e-7).
71
71
  verbose: Print optimization progress (default: False).
72
72
  nAGQ: Quadrature points (0 or 1, default: 1).
73
- use_hessian: Use Hessian-based vcov (default: True).
73
+ use_hessian: Use Hessian-based vcov (default: False). The default
74
+ Schur complement approach matches lme4's ``vcov()`` with
75
+ ``use.hessian=FALSE`` and avoids expensive numerical
76
+ differentiation. Set to True for observed-information vcov.
74
77
 
75
78
  Returns:
76
79
  FitState containing:
@@ -91,7 +94,6 @@ def fit_glmer_pirls(
91
94
  - bossanova.internal.maths.solvers.glmer: Underlying PIRLS implementation
92
95
  """
93
96
  from bossanova.internal.maths.solvers.glmer import (
94
- compute_hessian_vcov,
95
97
  compute_irls_quantities,
96
98
  fit_glmm_pirls,
97
99
  )
@@ -177,9 +179,17 @@ def fit_glmer_pirls(
177
179
  converged = fit_result["converged"]
178
180
  n_iter = fit_result["n_func_evals"]
179
181
 
182
+ # Compute IRLS weights once (needed by both vcov paths and for XtWX_inv)
183
+ working_weights, _ = compute_irls_quantities(y, eta, family)
184
+ if weights is not None:
185
+ total_weights = weights * working_weights
186
+ else:
187
+ total_weights = working_weights
188
+
180
189
  # Compute variance-covariance matrix of beta
181
190
  if use_hessian:
182
- # Hessian-based vcov (matches lme4 default)
191
+ from bossanova.internal.maths.solvers.glmer import compute_hessian_vcov
192
+
183
193
  vcov, _ = compute_hessian_vcov(
184
194
  theta=theta,
185
195
  beta=beta,
@@ -196,15 +206,7 @@ def fit_glmer_pirls(
196
206
  eta_init=eta, # Use optimal eta as starting point
197
207
  )
198
208
  else:
199
- # Schur complement-based vcov (faster)
200
- working_weights, _ = compute_irls_quantities(y, eta, family)
201
-
202
- if weights is not None:
203
- total_weights = weights * working_weights
204
- else:
205
- total_weights = working_weights
206
-
207
- # Build Lambda for Schur complement
209
+ # Schur complement-based vcov (analytical, matches lme4 vcov(use.hessian=FALSE))
208
210
  Lambda = build_lambda_sparse(theta, n_groups_list, re_structure, metadata)
209
211
  vcov = compute_vcov_schur_sparse(X, Z, Lambda, weights=total_weights)
210
212
 
@@ -218,13 +220,8 @@ def fit_glmer_pirls(
218
220
  # Degrees of freedom
219
221
  df_resid = float(n - p)
220
222
 
221
- # Compute final IRLS weights and XtWX_inv for cluster-robust SEs
222
- final_working_weights, _ = compute_irls_quantities(y, eta, family)
223
- if weights is not None:
224
- final_irls_weights = weights * final_working_weights
225
- else:
226
- final_irls_weights = final_working_weights
227
- XtWX = X.T @ (X * final_irls_weights[:, np.newaxis])
223
+ # XtWX_inv for sandwich/cluster-robust SEs (reuse total_weights)
224
+ XtWX = X.T @ (X * total_weights[:, np.newaxis])
228
225
  XtWX_inv = np.linalg.inv(XtWX)
229
226
 
230
227
  return build_fit_state(
@@ -240,6 +237,6 @@ def fit_glmer_pirls(
240
237
  u=u,
241
238
  converged=converged,
242
239
  n_iter=n_iter,
243
- irls_weights=final_irls_weights,
240
+ irls_weights=total_weights,
244
241
  XtWX_inv=XtWX_inv,
245
242
  )
@@ -312,6 +312,15 @@ def compute_slopes_finite_diff(
312
312
 
313
313
  validate_focal_var(bundle, focal_var)
314
314
 
315
+ # --- drop rows with missing values in model variables -----------------
316
+ # The caller may pass raw data that includes rows dropped during fitting.
317
+ # Null/NaN values propagate through matrix multiplication and corrupt the
318
+ # AME estimate, so filter to complete cases on the model's columns.
319
+ model_cols = [c for c in bundle.X_names if c in data.columns]
320
+ if bundle.y_name in data.columns:
321
+ model_cols.append(bundle.y_name)
322
+ data = data.drop_nulls(subset=model_cols)
323
+
315
324
  # --- step size --------------------------------------------------------
316
325
  focal_col = data[focal_var].cast(pl.Float64).to_numpy()
317
326
  var_range = float(focal_col.max() - focal_col.min())
@@ -443,6 +452,12 @@ def compute_slopes_crossed(
443
452
  "(needed by evaluate_newdata)."
444
453
  )
445
454
 
455
+ # --- drop rows with missing values in model variables -----------------
456
+ model_cols = [c for c in bundle.X_names if c in data.columns]
457
+ if bundle.y_name in data.columns:
458
+ model_cols.append(bundle.y_name)
459
+ data = data.drop_nulls(subset=model_cols)
460
+
446
461
  # --- step size --------------------------------------------------------
447
462
  focal_col = data[focal_var].cast(pl.Float64).to_numpy()
448
463
  var_range = float(focal_col.max() - focal_col.min())
@@ -1028,7 +1028,7 @@ class model:
1028
1028
  "tol": kwargs.pop("tol", None),
1029
1029
  "verbose": bool(kwargs.pop("verbose", False)),
1030
1030
  "nAGQ": int(kwargs.pop("nAGQ", 1)),
1031
- "use_hessian": bool(kwargs.pop("use_hessian", True)),
1031
+ "use_hessian": bool(kwargs.pop("use_hessian", False)),
1032
1032
  }
1033
1033
  if fit_kwargs["max_iter"] is not None:
1034
1034
  fit_kwargs["max_iter"] = int(fit_kwargs["max_iter"])
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "bossanova"
3
3
  requires-python = ">=3.11"
4
- version = "0.1.0.dev19"
4
+ version = "0.1.0.dev20"
5
5
  authors = [
6
6
  {name = "Eshin Jolly"},
7
7
  ]
@@ -167,6 +167,10 @@ setup-kernel = { cmd = "python -m ipykernel install --user --name=\"$(basename $
167
167
  _tutorials-export = { cmd = "bash scripts/tutorials_export.sh", description = "Convert marimo notebooks to MyST markdown" }
168
168
  _tutorials-import = { cmd = "bash scripts/tutorials_import.sh", description = "Convert MyST markdown to marimo notebooks" }
169
169
 
170
+ # === Benchmarks ===
171
+ # `pixi run benchmark lm`, `pixi run benchmark glm`, etc. Runs --all-backends by default.
172
+ benchmark = { cmd = "bash scripts/run-logged.sh benchmark-{{ model }} python benchmarking/benchmark_{{ model }}_methods.py --all-backends", args = [{ arg = "model", choices = ["lm", "glm", "lmer", "glmer"] }], description = "Run model benchmarks (writes markdown to docs)" }
173
+
170
174
  # === Build & Release ===
171
175
  _build = { cmd = "uv build --clear", description = "Build sdist + wheel (clears old artifacts)" }
172
176
  release = { cmd = "python scripts/release.py {{ target }}", args = [{ arg = "target", choices = ["pypi", "testpypi"], default = "pypi" }], description = "Full release: review logs, bump version, build, test, publish" }
File without changes