lme-python 0.2.3__tar.gz → 0.2.4__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 (374) hide show
  1. lme_python-0.2.4/AGENTS.md +148 -0
  2. {lme_python-0.2.3 → lme_python-0.2.4}/CHANGELOG.md +53 -4
  3. {lme_python-0.2.3 → lme_python-0.2.4}/CONTRIBUTING.md +9 -0
  4. {lme_python-0.2.3 → lme_python-0.2.4}/Cargo.lock +1 -1
  5. {lme_python-0.2.3 → lme_python-0.2.4}/Cargo.toml +4 -1
  6. {lme_python-0.2.3 → lme_python-0.2.4}/GUIDE.md +1 -1
  7. {lme_python-0.2.3 → lme_python-0.2.4}/PKG-INFO +1 -1
  8. {lme_python-0.2.3 → lme_python-0.2.4}/README.md +1 -1
  9. {lme_python-0.2.3 → lme_python-0.2.4}/REPO_COMPLETION_BY_AREA.md +1 -1
  10. {lme_python-0.2.3 → lme_python-0.2.4}/Taskfile.yml +5 -0
  11. lme_python-0.2.4/docs/rustdoc.css +157 -0
  12. lme_python-0.2.4/docs/rustdoc.md +131 -0
  13. {lme_python-0.2.3 → lme_python-0.2.4}/python/Cargo.lock +2 -2
  14. {lme_python-0.2.3 → lme_python-0.2.4}/python/Cargo.toml +1 -1
  15. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/lme_ci.py +2 -1
  16. {lme_python-0.2.3 → lme_python-0.2.4}/src/bootstrap.rs +1 -1
  17. {lme_python-0.2.3 → lme_python-0.2.4}/src/contrast.rs +79 -2
  18. {lme_python-0.2.3 → lme_python-0.2.4}/src/cv.rs +1 -1
  19. {lme_python-0.2.3 → lme_python-0.2.4}/src/ddf.rs +1 -1
  20. {lme_python-0.2.3 → lme_python-0.2.4}/src/emmeans.rs +6 -18
  21. {lme_python-0.2.3 → lme_python-0.2.4}/src/intercept_blocked.rs +125 -9
  22. {lme_python-0.2.3 → lme_python-0.2.4}/src/kr_modcomp.rs +48 -32
  23. {lme_python-0.2.3 → lme_python-0.2.4}/src/lib.rs +39 -83
  24. {lme_python-0.2.3 → lme_python-0.2.4}/src/mcp.rs +31 -5
  25. {lme_python-0.2.3 → lme_python-0.2.4}/src/perf_diag.rs +1 -1
  26. {lme_python-0.2.3 → lme_python-0.2.4}/src/predict.rs +11 -6
  27. {lme_python-0.2.3 → lme_python-0.2.4}/src/robust.rs +1 -1
  28. {lme_python-0.2.3 → lme_python-0.2.4}/src/satterthwaite.rs +1 -1
  29. {lme_python-0.2.3 → lme_python-0.2.4}/src/simulate.rs +29 -5
  30. {lme_python-0.2.3 → lme_python-0.2.4}/src/studentized_range.rs +15 -0
  31. {lme_python-0.2.3 → lme_python-0.2.4}/tests/ci_consolidated.rs +4 -0
  32. lme_python-0.2.4/tests/test_bug_hunt_edges.rs +255 -0
  33. lme_python-0.2.4/tests/test_inference_guards.rs +187 -0
  34. lme_python-0.2.3/AGENTS.md +0 -113
  35. {lme_python-0.2.3 → lme_python-0.2.4}/.JuliaFormatter.toml +0 -0
  36. {lme_python-0.2.3 → lme_python-0.2.4}/.github/FUNDING.yml +0 -0
  37. {lme_python-0.2.3 → lme_python-0.2.4}/.github/dependabot.yml +0 -0
  38. {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/audit.yml +0 -0
  39. {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/benchmarks.yml +0 -0
  40. {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/cache-prime.yml +0 -0
  41. {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/ci.yml +0 -0
  42. {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/crate-publish-dry-run.yml +0 -0
  43. {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/fuzz-smoke.yml +0 -0
  44. {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/pages.yml +0 -0
  45. {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/python-release.yml +0 -0
  46. {lme_python-0.2.3 → lme_python-0.2.4}/.github/workflows/repo-metadata.yml +0 -0
  47. {lme_python-0.2.3 → lme_python-0.2.4}/.gitignore +0 -0
  48. {lme_python-0.2.3 → lme_python-0.2.4}/BENCHMARKS.md +0 -0
  49. {lme_python-0.2.3 → lme_python-0.2.4}/BENCHMARK_COVERAGE.md +0 -0
  50. {lme_python-0.2.3 → lme_python-0.2.4}/CI_PERFORMANCE.md +0 -0
  51. {lme_python-0.2.3 → lme_python-0.2.4}/LICENSE +0 -0
  52. {lme_python-0.2.3 → lme_python-0.2.4}/LICENSES/Apache-2.0.txt +0 -0
  53. {lme_python-0.2.3 → lme_python-0.2.4}/LICENSES/BSD-3-Clause-OpenBLAS.txt +0 -0
  54. {lme_python-0.2.3 → lme_python-0.2.4}/LICENSES/GPL-2.0-or-later.txt +0 -0
  55. {lme_python-0.2.3 → lme_python-0.2.4}/LICENSES/Intel-Simplified-Software-License.txt +0 -0
  56. {lme_python-0.2.3 → lme_python-0.2.4}/LICENSES/LGPL-2.1-only.txt +0 -0
  57. {lme_python-0.2.3 → lme_python-0.2.4}/OPTIMIZATION.md +0 -0
  58. {lme_python-0.2.3 → lme_python-0.2.4}/RELEASING.md +0 -0
  59. {lme_python-0.2.3 → lme_python-0.2.4}/RELINKING.md +0 -0
  60. {lme_python-0.2.3 → lme_python-0.2.4}/THIRD_PARTY_NOTICES.md +0 -0
  61. {lme_python-0.2.3 → lme_python-0.2.4}/USABILITY.md +0 -0
  62. {lme_python-0.2.3 → lme_python-0.2.4}/benches/bench_load_production.rs +0 -0
  63. {lme_python-0.2.3 → lme_python-0.2.4}/benches/bench_math.rs +0 -0
  64. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/external-nlmm-inference-python-timings-2026-08-14.json +0 -0
  65. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-04.json +0 -0
  66. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-06.json +0 -0
  67. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-08.json +0 -0
  68. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-direct-intercept-gram.json +0 -0
  69. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-full-lmm.json +0 -0
  70. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-glmm.json +0 -0
  71. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-large-intercept-setup.json +0 -0
  72. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-large-slopes-linear-cache.json +0 -0
  73. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-large-slopes.json +0 -0
  74. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09-sleepstudy-slopes.json +0 -0
  75. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-09.json +0 -0
  76. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-10-cold-setup-followup.json +0 -0
  77. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-16-cold-fit-lt1.json +0 -0
  78. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-07-22-full-tier-a.json +0 -0
  79. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/fair-rust-julia-reference-2026-09-09-refactor.json +0 -0
  80. {lme_python-0.2.3 → lme_python-0.2.4}/benchmarks/refactor-2026-09-09.json +0 -0
  81. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/COMPARISONS.md +0 -0
  82. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/bench_external_timings.R +0 -0
  83. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/bench_fair_julia_perf.jl +0 -0
  84. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/bench_fair_julia_timing.jl +0 -0
  85. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/bench_fair_rust_julia.rs +0 -0
  86. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/bench_perf_breakdown.rs +0 -0
  87. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/categorical_anova.R +0 -0
  88. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/categorical_anova.jl +0 -0
  89. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/categorical_anova.py +0 -0
  90. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/categorical_anova.rs +0 -0
  91. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/comparison_chart.png +0 -0
  92. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_cbpp.R +0 -0
  93. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_cbpp.jl +0 -0
  94. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_cbpp.py +0 -0
  95. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_cbpp.rs +0 -0
  96. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_gaussian.R +0 -0
  97. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_gaussian.jl +0 -0
  98. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_gaussian.py +0 -0
  99. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_gaussian.rs +0 -0
  100. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_grouseticks.R +0 -0
  101. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_grouseticks.jl +0 -0
  102. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_grouseticks.py +0 -0
  103. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/glmm_grouseticks.rs +0 -0
  104. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmer_weighted.R +0 -0
  105. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmer_weighted.jl +0 -0
  106. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmer_weighted.py +0 -0
  107. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmer_weighted.rs +0 -0
  108. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_dyestuff.R +0 -0
  109. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_dyestuff.jl +0 -0
  110. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_dyestuff.py +0 -0
  111. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_dyestuff.rs +0 -0
  112. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_pastes.R +0 -0
  113. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_pastes.jl +0 -0
  114. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_pastes.py +0 -0
  115. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_pastes.rs +0 -0
  116. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_penicillin.R +0 -0
  117. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_penicillin.jl +0 -0
  118. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_penicillin.py +0 -0
  119. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/lmm_penicillin.rs +0 -0
  120. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/nlmm_sspower.R +0 -0
  121. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/glmm_offset.R +0 -0
  122. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/glmm_offset.jl +0 -0
  123. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/glmm_probit.R +0 -0
  124. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/glmm_probit.jl +0 -0
  125. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/glmm_weighted.R +0 -0
  126. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/glmm_weighted.jl +0 -0
  127. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/parity_r_setup.R +0 -0
  128. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/sleepstudy_offset.R +0 -0
  129. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity/sleepstudy_offset.jl +0 -0
  130. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/parity_export.rs +0 -0
  131. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/pastes_emmeans.R +0 -0
  132. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/pastes_glht.R +0 -0
  133. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/r_setup.R +0 -0
  134. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy.R +0 -0
  135. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy.jl +0 -0
  136. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy.py +0 -0
  137. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy.rs +0 -0
  138. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy_confint_profile.R +0 -0
  139. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy_ml.R +0 -0
  140. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy_ml.jl +0 -0
  141. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy_ml.py +0 -0
  142. {lme_python-0.2.3 → lme_python-0.2.4}/comparisons/sleepstudy_ml.rs +0 -0
  143. {lme_python-0.2.3 → lme_python-0.2.4}/completion_manifest.json +0 -0
  144. {lme_python-0.2.3 → lme_python-0.2.4}/docs/CALO_CALIBRATION.md +0 -0
  145. {lme_python-0.2.3 → lme_python-0.2.4}/docs/EXAMPLES.md +0 -0
  146. {lme_python-0.2.3 → lme_python-0.2.4}/docs/README.md +0 -0
  147. {lme_python-0.2.3 → lme_python-0.2.4}/docs/TROUBLESHOOTING.md +0 -0
  148. {lme_python-0.2.3 → lme_python-0.2.4}/docs/benchmarks/app.js +0 -0
  149. {lme_python-0.2.3 → lme_python-0.2.4}/docs/benchmarks/data/latest.json +0 -0
  150. {lme_python-0.2.3 → lme_python-0.2.4}/docs/benchmarks/index.html +0 -0
  151. {lme_python-0.2.3 → lme_python-0.2.4}/docs/benchmarks/styles.css +0 -0
  152. {lme_python-0.2.3 → lme_python-0.2.4}/docs/index.html +0 -0
  153. {lme_python-0.2.3 → lme_python-0.2.4}/examples/batch_sspower_cpu.rs +0 -0
  154. {lme_python-0.2.3 → lme_python-0.2.4}/examples/bench_external_timings.rs +0 -0
  155. {lme_python-0.2.3 → lme_python-0.2.4}/examples/dump_cascade_fixtures.rs +0 -0
  156. {lme_python-0.2.3 → lme_python-0.2.4}/examples/explore_formula_ast.rs +0 -0
  157. {lme_python-0.2.3 → lme_python-0.2.4}/examples/explore_mcp_adjust.rs +0 -0
  158. {lme_python-0.2.3 → lme_python-0.2.4}/examples/explore_theta_grid.rs +0 -0
  159. {lme_python-0.2.3 → lme_python-0.2.4}/examples/nlmm_fixture_dump.rs +0 -0
  160. {lme_python-0.2.3 → lme_python-0.2.4}/lefthook.yml +0 -0
  161. {lme_python-0.2.3 → lme_python-0.2.4}/legal/dependency-license-exceptions.json +0 -0
  162. {lme_python-0.2.3 → lme_python-0.2.4}/legal/fixture-provenance.json +0 -0
  163. {lme_python-0.2.3 → lme_python-0.2.4}/lme-rs-icon.png +0 -0
  164. {lme_python-0.2.3 → lme_python-0.2.4}/lme-rs.png +0 -0
  165. {lme_python-0.2.3 → lme_python-0.2.4}/mise.toml +0 -0
  166. {lme_python-0.2.3 → lme_python-0.2.4}/pyproject.toml +0 -0
  167. {lme_python-0.2.3 → lme_python-0.2.4}/python/PYTHON_GUIDE.md +0 -0
  168. {lme_python-0.2.3 → lme_python-0.2.4}/python/README.md +0 -0
  169. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/glmer_cbpp.py +0 -0
  170. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/glmer_grouseticks.py +0 -0
  171. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/lm_basics.py +0 -0
  172. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/lmer_sleepstudy.py +0 -0
  173. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/model_comparison.py +0 -0
  174. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/.gitignore +0 -0
  175. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/README.md +0 -0
  176. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/compare_plots.py +0 -0
  177. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/figure_specs.py +0 -0
  178. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/find_rscript.py +0 -0
  179. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/numeric_overlay.py +0 -0
  180. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/paths.py +0 -0
  181. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/plot_demo.py +0 -0
  182. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/plot_r.R +0 -0
  183. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/plotting_demo/run_all.py +0 -0
  184. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/verification_project/README.md +0 -0
  185. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/verification_project/conftest.py +0 -0
  186. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/verification_project/parity.py +0 -0
  187. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/verification_project/paths.py +0 -0
  188. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/verification_project/run.py +0 -0
  189. {lme_python-0.2.3 → lme_python-0.2.4}/python/examples/verification_project/test_parity.py +0 -0
  190. {lme_python-0.2.3 → lme_python-0.2.4}/python/lme_python.pyi +0 -0
  191. {lme_python-0.2.3 → lme_python-0.2.4}/python/src/controls.rs +0 -0
  192. {lme_python-0.2.3 → lme_python-0.2.4}/python/src/fitting.rs +0 -0
  193. {lme_python-0.2.3 → lme_python-0.2.4}/python/src/input.rs +0 -0
  194. {lme_python-0.2.3 → lme_python-0.2.4}/python/src/lib.rs +0 -0
  195. {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_api_parity.py +0 -0
  196. {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_basic.py +0 -0
  197. {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_cv.py +0 -0
  198. {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_dataframe_inputs.py +0 -0
  199. {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_golden_parity.py +0 -0
  200. {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_model_contracts.py +0 -0
  201. {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_nlmer_custom_mean.py +0 -0
  202. {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_simulate_scale.py +0 -0
  203. {lme_python-0.2.3 → lme_python-0.2.4}/python/tests/test_wheel_notices.py +0 -0
  204. {lme_python-0.2.3 → lme_python-0.2.4}/python/uv.lock +0 -0
  205. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/build_benchmark_site.py +0 -0
  206. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/README.md +0 -0
  207. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/check_completion_score.py +0 -0
  208. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/check_legal_compliance.py +0 -0
  209. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/julia_format.jl +0 -0
  210. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/package_wheel_notices.py +0 -0
  211. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/r_format.R +0 -0
  212. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/ci/run.sh +0 -0
  213. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/dump_dyestuff.R +0 -0
  214. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/dump_pastes.R +0 -0
  215. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/explorations/README.md +0 -0
  216. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/local_ci.ps1 +0 -0
  217. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/local_ci.sh +0 -0
  218. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/make_penicillin_csv.py +0 -0
  219. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/plot_comparisons.py +0 -0
  220. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/run_cross_language_benchmarks.py +0 -0
  221. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/run_external_timings.py +0 -0
  222. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/run_fair_rust_julia_benchmark.py +0 -0
  223. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/run_perf_breakdown.py +0 -0
  224. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/sync_github_repo_metadata.py +0 -0
  225. {lme_python-0.2.3 → lme_python-0.2.4}/scripts/verify_cross_language_parity.py +0 -0
  226. {lme_python-0.2.3 → lme_python-0.2.4}/src/anova.rs +0 -0
  227. {lme_python-0.2.3 → lme_python-0.2.4}/src/anova_contrasts.rs +0 -0
  228. {lme_python-0.2.3 → lme_python-0.2.4}/src/basis.rs +0 -0
  229. {lme_python-0.2.3 → lme_python-0.2.4}/src/display.rs +0 -0
  230. {lme_python-0.2.3 → lme_python-0.2.4}/src/execution.rs +0 -0
  231. {lme_python-0.2.3 → lme_python-0.2.4}/src/family.rs +0 -0
  232. {lme_python-0.2.3 → lme_python-0.2.4}/src/formula.rs +0 -0
  233. {lme_python-0.2.3 → lme_python-0.2.4}/src/glmm_math.rs +0 -0
  234. {lme_python-0.2.3 → lme_python-0.2.4}/src/kenward_roger.rs +0 -0
  235. {lme_python-0.2.3 → lme_python-0.2.4}/src/kr_vcov_adj.rs +0 -0
  236. {lme_python-0.2.3 → lme_python-0.2.4}/src/math.rs +0 -0
  237. {lme_python-0.2.3 → lme_python-0.2.4}/src/model.rs +0 -0
  238. {lme_python-0.2.3 → lme_python-0.2.4}/src/model_matrix.rs +0 -0
  239. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/block_solve.rs +0 -0
  240. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/fit.rs +0 -0
  241. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/formula.rs +0 -0
  242. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/mean.rs +0 -0
  243. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/mean_fn.rs +0 -0
  244. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/mod.rs +0 -0
  245. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/predict.rs +0 -0
  246. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/re_cov.rs +0 -0
  247. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/self_start.rs +0 -0
  248. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssasymp.rs +0 -0
  249. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssasympoff.rs +0 -0
  250. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssasymporig.rs +0 -0
  251. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssbiexp.rs +0 -0
  252. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssfpl.rs +0 -0
  253. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssgompertz.rs +0 -0
  254. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/sslogis.rs +0 -0
  255. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssmicmen.rs +0 -0
  256. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/sspower.rs +0 -0
  257. {lme_python-0.2.3 → lme_python-0.2.4}/src/nlmm/ssweibull.rs +0 -0
  258. {lme_python-0.2.3 → lme_python-0.2.4}/src/ols.rs +0 -0
  259. {lme_python-0.2.3 → lme_python-0.2.4}/src/optimizer.rs +0 -0
  260. {lme_python-0.2.3 → lme_python-0.2.4}/src/prepared.rs +0 -0
  261. {lme_python-0.2.3 → lme_python-0.2.4}/src/profile_ci.rs +0 -0
  262. {lme_python-0.2.3 → lme_python-0.2.4}/src/quadrature.rs +0 -0
  263. {lme_python-0.2.3 → lme_python-0.2.4}/tests/categorical_anova_test.rs +0 -0
  264. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/cbpp_binary.csv +0 -0
  265. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/cbpp_binary_weighted.csv +0 -0
  266. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/dyestuff.csv +0 -0
  267. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/dyestuff_intercept_reml.json +0 -0
  268. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_binomial.json +0 -0
  269. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_binomial_agq.json +0 -0
  270. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_binomial_cloglog.json +0 -0
  271. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_binomial_probit.json +0 -0
  272. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_binomial_weighted.json +0 -0
  273. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_gamma_dyestuff.json +0 -0
  274. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_poisson.json +0 -0
  275. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/glmm_poisson_offset.json +0 -0
  276. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/golden_parity_manifest.json +0 -0
  277. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/grouseticks.csv +0 -0
  278. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/intercept_only.json +0 -0
  279. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/mock_crossed.json +0 -0
  280. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/mock_ml.json +0 -0
  281. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/orange.csv +0 -0
  282. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/orange_nlmer.json +0 -0
  283. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/pastes.csv +0 -0
  284. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/pastes_cask_reml.json +0 -0
  285. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/pastes_emmeans.json +0 -0
  286. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/pastes_glht_tukey.json +0 -0
  287. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/penicillin.csv +0 -0
  288. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/penicillin.json +0 -0
  289. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/r_edge_case_matrix.json +0 -0
  290. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/random_slopes.json +0 -0
  291. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/sleepstudy.csv +0 -0
  292. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/sleepstudy_confint_profile.json +0 -0
  293. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/sleepstudy_confint_profile_vc.json +0 -0
  294. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/sleepstudy_offset_reml.json +0 -0
  295. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssasymp_synthetic.csv +0 -0
  296. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssasympoff_nlmer.json +0 -0
  297. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssasympoff_synthetic.csv +0 -0
  298. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssasymporig_nlmer.json +0 -0
  299. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssasymporig_synthetic.csv +0 -0
  300. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssbiexp_nlmer.json +0 -0
  301. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssbiexp_synthetic.csv +0 -0
  302. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssfol_nlmer.json +0 -0
  303. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssfpl_nlmer.json +0 -0
  304. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssfpl_synthetic.csv +0 -0
  305. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssgompertz_nlmer.json +0 -0
  306. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssgompertz_synthetic.csv +0 -0
  307. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssmicmen_nlmer.json +0 -0
  308. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssmicmen_synthetic.csv +0 -0
  309. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/sspower_nlmer.json +0 -0
  310. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/sspower_synthetic.csv +0 -0
  311. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssweibull_nlmer.json +0 -0
  312. {lme_python-0.2.3 → lme_python-0.2.4}/tests/data/ssweibull_synthetic.csv +0 -0
  313. {lme_python-0.2.3 → lme_python-0.2.4}/tests/gen_nlmm_extras.R +0 -0
  314. {lme_python-0.2.3 → lme_python-0.2.4}/tests/generate_mock_data.py +0 -0
  315. {lme_python-0.2.3 → lme_python-0.2.4}/tests/generate_nlmm_fixtures.R +0 -0
  316. {lme_python-0.2.3 → lme_python-0.2.4}/tests/generate_r_edge_case_matrix.R +0 -0
  317. {lme_python-0.2.3 → lme_python-0.2.4}/tests/generate_test_data.R +0 -0
  318. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_anova.rs +0 -0
  319. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_anova_types.rs +0 -0
  320. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_bootstrap.rs +0 -0
  321. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_bug_hunt.rs +0 -0
  322. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_bug_hunt_more.rs +0 -0
  323. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_bug_hunt_numerics.rs +0 -0
  324. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_conditional_real.rs +0 -0
  325. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_confint_profile.rs +0 -0
  326. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_confint_simulate.rs +0 -0
  327. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_contrast.rs +0 -0
  328. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_coverage_edge_cases.rs +0 -0
  329. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_coverage_gaps.rs +0 -0
  330. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_crossed_mock.rs +0 -0
  331. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_cv.rs +0 -0
  332. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_e2e_lmer.rs +0 -0
  333. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_edge_cases.rs +0 -0
  334. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_emmeans.rs +0 -0
  335. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_errors.rs +0 -0
  336. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_explorations.rs +0 -0
  337. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_external_timings_artifact.rs +0 -0
  338. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_failure_modes.rs +0 -0
  339. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_formula.rs +0 -0
  340. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_formula_stress.rs +0 -0
  341. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_gaps.rs +0 -0
  342. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_glmm.rs +0 -0
  343. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_glmm_links.rs +0 -0
  344. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_glmm_offset_grouseticks.rs +0 -0
  345. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_glmm_weighted.rs +0 -0
  346. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_golden_parity.rs +0 -0
  347. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_intercept_only.rs +0 -0
  348. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_kenward_roger.rs +0 -0
  349. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_kr_modcomp_pastes.rs +0 -0
  350. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_mcp.rs +0 -0
  351. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_ml_optimization.rs +0 -0
  352. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_model_contracts.rs +0 -0
  353. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_agq.rs +0 -0
  354. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_bounds.rs +0 -0
  355. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_custom_mean.rs +0 -0
  356. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_orange.rs +0 -0
  357. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_orange_multi_re.rs +0 -0
  358. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_self_start.rs +0 -0
  359. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_ss_new_means.rs +0 -0
  360. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_ssasymp.rs +0 -0
  361. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_ssasymp_off_orig.rs +0 -0
  362. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_ssfol.rs +0 -0
  363. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_ssmicmen.rs +0 -0
  364. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_nlmm_sspower.rs +0 -0
  365. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_no_intercept.rs +0 -0
  366. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_numerical_parity.rs +0 -0
  367. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_predict.rs +0 -0
  368. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_production_load.rs +0 -0
  369. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_r_edge_case_matrix.rs +0 -0
  370. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_random_slopes.rs +0 -0
  371. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_robust.rs +0 -0
  372. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_sandwich_math.R +0 -0
  373. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_satterthwaite.rs +0 -0
  374. {lme_python-0.2.3 → lme_python-0.2.4}/tests/test_statistical_identities.rs +0 -0
@@ -0,0 +1,148 @@
1
+ # Agent guide
2
+
3
+ This is a Rust statistical library (`lme-rs`) with PyO3/maturin Python bindings
4
+ (`lme_python`). There is no application server to start. Run commands from the
5
+ repository root unless stated otherwise.
6
+
7
+ ## Start here
8
+
9
+ 1. Inspect `git status --short --branch` and the relevant diff. Preserve unrelated
10
+ changes; do not reset, stash, switch branches, or update dependencies as routine setup.
11
+ 2. Use `rg` and the map below to find the implementation and existing tests. Read
12
+ relevant guides rather than scanning the whole repository before a focused fix.
13
+ 3. Choose required checks before editing. Reproduce bugs with focused tests, fix
14
+ the cause, and verify both the regression and affected behavior.
15
+ 4. Update [CHANGELOG.md](CHANGELOG.md) under `Unreleased` for user-visible fixes,
16
+ features, and compatibility changes. Instruction-only edits need no entry.
17
+ 5. Review the final diff. Report changes, validation, and failures/skips/limitations;
18
+ do not claim unrun checks.
19
+
20
+ ## Code map
21
+
22
+ | Area | Start with |
23
+ |---|---|
24
+ | Public API, contracts, reusable fits | `src/lib.rs`, `src/model.rs`, `src/prepared.rs` |
25
+ | Formulas and design matrices | `src/formula.rs`, `src/model_matrix.rs`, `src/basis.rs` |
26
+ | LMM / GLMM / nonlinear fitting | `src/math.rs`, `src/optimizer.rs`, `src/intercept_blocked.rs` / `src/glmm_math.rs`, `src/family.rs` / `src/nlmm/` |
27
+ | Inference and post-fit behavior | `src/contrast.rs`, `src/ddf.rs`, `src/satterthwaite.rs`, `src/kenward_roger.rs`, `src/kr_modcomp.rs`; named modules such as `predict.rs`, `simulate.rs`, `emmeans.rs`, `mcp.rs`, `robust.rs` |
28
+ | Python API and tests | `python/src/lib.rs`, `python/tests/` |
29
+ | Regression tests and reference evidence | `tests/`, `tests/data/`, `comparisons/` |
30
+ | Checks, aliases, hooks, tool versions | [scripts/ci/lme_ci.py](scripts/ci/lme_ci.py), [Taskfile.yml](Taskfile.yml), [lefthook.yml](lefthook.yml), [mise.toml](mise.toml) |
31
+
32
+ ## Required validation
33
+
34
+ Use the smallest tier covering the change. Requirements from multiple rows combine;
35
+ a successful broader check can satisfy its component checks.
36
+
37
+ | Change | Minimum checks and escalation |
38
+ |---|---|
39
+ | Rust code | `task lint`, `task test:fast`, and affected integration tests; use `task rust` for cross-module or public-API changes |
40
+ | Python bindings | `task lint:python`, `task python` |
41
+ | CI, manifests, release tooling | `task preflight`; use `task ci` before a release or broad refactor |
42
+ | R / Julia comparison scripts | `task lint:comparisons`; use `task lint:comparisons:required` when formatters are installed |
43
+ | Documentation (including this file) or portable examples | `task docs:check`; add `task consumer:smoke` when install or example behavior changes |
44
+ | LMM throughput paths (`src/math.rs`, `src/optimizer.rs`, related caches/solvers) | Read [OPTIMIZATION.md](OPTIMIZATION.md) and run applicable fair-harness cases in addition to Rust checks |
45
+ | `README.md`, `REPO_COMPLETION_BY_AREA.md`, `completion_manifest.json`, `scripts/ci/check_completion_score.py` | `task completion:check` |
46
+
47
+ ### Avoid redundant work
48
+
49
+ - Start with `cargo test --locked --test <test_target> <test_filter>` or
50
+ `cargo test --locked --lib <test_filter>`. Selecting zero tests proves nothing.
51
+ - `task rust` includes Rust lint, all-target compilation, unit/integration tests,
52
+ doctests, and documentation generation. Add `task lint:python` for the Ruff part
53
+ of `task lint`; do not separately repeat `task test:fast`.
54
+ - `task test` runs the full Rust suite. On Windows/macOS, `task test:consolidated`
55
+ runs unit and integration tests with one integration executable, checks examples,
56
+ and runs doctests. It can replace `task test` when linking is costly. An equivalent
57
+ Rust validation slice is `task lint:rust`, `task check`, `task test:consolidated`,
58
+ and `python scripts/ci/lme_ci.py doc`.
59
+ - `task ci` includes Rust, bindings, portable examples, lint, compilation, legal,
60
+ documentation, and completion checks. It does not replace audits/metadata in
61
+ `task preflight`, R/Julia checks, or performance harnesses. `task ci:fast` skips
62
+ the isolated-wheel pass; report that limitation.
63
+ - Reuse passing results for unchanged files/dependencies in the same task. Rerun
64
+ affected checks after edits; broaden when scope or evidence requires it.
65
+ Keep hooks enabled even when they repeat earlier checks.
66
+ - Serialize Cargo commands sharing a target directory. Capture verbose logs and
67
+ inspect exit status and summaries. A timeout or compilation in progress is not a failed test.
68
+
69
+ ## Correctness and evidence
70
+
71
+ - Add regression coverage for bug fixes. Prefer statistical identities, explicit
72
+ expected behavior, and independent fixtures over duplicating the implementation.
73
+ - Register new integration test files in [tests/ci_consolidated.rs](tests/ci_consolidated.rs).
74
+ - For R/Julia parity, match rows, formula, family/link, weights, offsets, and ML/REML.
75
+ Explain tolerances; do not loosen them just to make a failure pass.
76
+ - Tie benchmark claims to the revision, environment, and measured cases. Follow
77
+ [BENCHMARKS.md](BENCHMARKS.md) and [OPTIMIZATION.md](OPTIMIZATION.md); a focused
78
+ speedup does not establish general parity or completion.
79
+
80
+ ### Completion scores are generated claims
81
+
82
+ [completion_manifest.json](completion_manifest.json) governs the README headline
83
+ and all percentages in [REPO_COMPLETION_BY_AREA.md](REPO_COMPLETION_BY_AREA.md).
84
+ It declares weighted binary commitments, locked `scope` strings, evidence paths,
85
+ and a `gap` for every incomplete criterion.
86
+
87
+ - Complete an item only when its locked scope is met and evidence is current.
88
+ Partial, stale, or substituted evidence earns zero; an API or focused benchmark is insufficient.
89
+ - Do not narrow/replace `scope` to earn credit or edit generated percentages by hand.
90
+ Update the manifest and supporting evidence together.
91
+ - `task completion:check` validates schema version 2, names/scopes/gaps, evidence
92
+ paths, arithmetic, report rows, and the README headline. `task ci` includes it.
93
+
94
+ ## Setup and recovery
95
+
96
+ - [mise.toml](mise.toml) configures Rust stable, Python 3.11, uv, Task, and Lefthook.
97
+ Use `task setup` for tools and hooks; run `mise install` first if Task is missing.
98
+ With tools already installed, use `task hooks:install`. Pre-push audits also
99
+ require `cargo-audit` (`cargo install cargo-audit`).
100
+ - For missing PATH entries, use `mise exec -- task <name>`. Locate installed tools
101
+ before reinstalling. Verify subprocess discovery in the actual environment with
102
+ `python -c "import shutil; print(shutil.which('uv'))"` when necessary.
103
+ - Without Task, use `python scripts/ci/lme_ci.py <subcommand>` (`python3` where
104
+ appropriate). Mappings are in [Taskfile.yml](Taskfile.yml): `test:fast` → `test-fast`,
105
+ `rust` → `rust-all`, `lint:python` → `ruff-lint`, `docs:check` → `docs-check`.
106
+ Use `--help` for all commands. Implement new checks in this runner, not duplicate shell logic.
107
+ - For Git dubious ownership, use `git -c safe.directory=C:/path/to/lme-rs <command>`
108
+ with this checkout's absolute forward-slash path; do not trust all directories globally.
109
+ - x86_64 builds link static Intel MKL via `ndarray-linalg`; first builds can be slow.
110
+ Run numerical examples with `--release`, e.g. `cargo run --release --locked --example sleepstudy`.
111
+ Leave the CI runner's own build profiles unchanged.
112
+ - Windows linker errors `LNK1318`/`LNK1106` can indicate disk exhaustion. Check space
113
+ and active builds first. Before cleaning, verify the target belongs to this checkout
114
+ and no build uses it; avoid broad cache deletion.
115
+ - `uv sync` can uninstall the editable Python extension. Restore it from `python/`
116
+ with `uv run --no-sync maturin develop --release`, or rerun `task python`.
117
+ Run Python examples there with `uv run --no-sync python examples/<name>.py`.
118
+
119
+ ## Git, hooks, and release boundaries
120
+
121
+ - Follow the user's commit/push scope; commit authorization alone does not authorize
122
+ pushing. When already authorized, complete validation and delivery without asking again.
123
+ - For requested updates, fetch before comparing branches; fast-forward only when
124
+ ancestry and local changes permit it. After pushing, verify HEAD, the tracking ref,
125
+ and live remote branch SHA agree, and report remaining local changes.
126
+ - Lefthook checks matching staged files: Rust format/Clippy, Python Ruff, comparison
127
+ formatting, manifests, benchmarks/dashboard, and metadata. Hooks may auto-stage
128
+ formatting; inspect the result. They do not run full Rust/bindings suites or `pip-audit`.
129
+ - Pre-push runs `task preflight`: lint, all-target compilation, Cargo audits,
130
+ legal/provenance, and metadata validation. Use `--no-verify` only when explicitly
131
+ necessary; report the bypass and omitted checks.
132
+ - Hosted validation runs on PRs, `v*` tags, and manual dispatch, not ordinary branch
133
+ pushes. Cache-prime is not validation. Hosted coverage adds the OS/Python matrix,
134
+ production-load gates, and `pip-audit`; PRs skip the four heavy ignored cases.
135
+ - Inspect the exact failing CI job/log before changing code. Do not merge with a
136
+ failing security audit. For metadata authentication, use `REPO_ADMIN_TOKEN` with
137
+ `task repo-metadata`; a hosted `401` requires checking/rotating the Actions secret.
138
+ - Preserve full-SHA action pins and readable version comments. After BLAS target-table
139
+ or release-workflow changes, run `task ci` or manually dispatch CI before tagging;
140
+ Windows/Linux cannot validate macOS Apple Silicon BLAS.
141
+ - Tag CI gates crates.io publishing and dispatches PyPI only after validation succeeds.
142
+ Keep PyPI top-level for Trusted Publishing attestations; publishing workflows must
143
+ not independently listen to tags. Read [RELEASING.md](RELEASING.md) before releases.
144
+ - R/Julia benchmark workflow coverage belongs in tag/manual runs. `task benchmarks:preflight`
145
+ includes Rust smoke and R smoke when R/lme4 is installed. Optional tool skips are not passes.
146
+
147
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for extended guidance and
148
+ [Taskfile.yml](Taskfile.yml) for less common commands.
@@ -5,14 +5,65 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ## [0.2.4] - 2026-09-10
11
+
12
+ ### Changed
13
+
14
+ - Rework the Rust API documentation landing page with model-specific entry points,
15
+ prediction and inference guidance, and explicit published/development version
16
+ boundaries. Add responsive styling for rustdoc's light, dark, and Ayu themes,
17
+ shared by docs.rs builds and the local documentation checks.
18
+
19
+ ### Fixed
20
+
21
+ - Reject likelihood-ratio comparisons that mix ML and REML, use differing or
22
+ unavailable REML fixed-effects designs, or contain nonfinite deviances. Refit
23
+ models with ML when comparing different fixed effects; comparisons of REML
24
+ random-effects structures with identical fixed-effects designs remain supported.
25
+ - Keep coefficient and marginal-mean confidence intervals finite at confidence
26
+ levels just below one. Reject unavailable/invalid denominator degrees of freedom
27
+ instead of replacing them with one, and honor valid positive fractional values.
28
+ - Preserve unavailable p-values through Bonferroni, Holm, and Tukey adjustments;
29
+ Holm retains the original comparison-family size while excluding missing values
30
+ from its ordering. Invalid Tukey statistics or degrees of freedom remain unavailable.
31
+ - Preserve very small asymptotic p-values in marginal-mean comparisons, multiple
32
+ comparisons, and robust coefficient tests, and small chi-squared p-values in
33
+ likelihood-ratio model comparisons.
34
+ - Retain small nonzero contrast weights in Satterthwaite tests instead of treating
35
+ them as zero when selecting cached single-coefficient results.
36
+ - Make the blocked LMM optimizer objective agree with the final deviance for
37
+ nested random effects such as `(1 | batch/cask)`. Correct the sparse cross-block
38
+ transpose and dense Schur subtraction; regression coverage includes ML, REML,
39
+ zero-variance boundaries, and the converged fit
40
+ ([#25](https://github.com/x4g4p3x/lme-rs/issues/25)).
41
+ - Keep Satterthwaite and Kenward-Roger contrast tests invariant to very small,
42
+ very large, or negative rescalings of the same hypothesis.
43
+ - Reduce redundant Kenward-Roger contrast rows to an independent basis so
44
+ duplicate restrictions and differing row units do not cause singular solves
45
+ or change the test's degrees of freedom. Reject all-zero contrast matrices.
46
+ - Preserve very small Satterthwaite coefficient and contrast p-values by
47
+ evaluating upper-tail probabilities directly instead of subtracting from one.
48
+ - Respect observation precision weights in Gamma simulation, with variance
49
+ proportional to dispersion divided by the observation weight.
50
+ - Reject Gaussian and Gamma simulation when residual variance or dispersion is
51
+ missing, nonfinite, or invalid, including saturated OLS fits with no estimated
52
+ residual variance. Zero Gaussian residual variance remains valid and produces
53
+ noiseless draws; Gamma dispersion must be positive. Apply the same checks to
54
+ sequential and parallel simulation.
55
+ - Return an error for overflowing simulation index ranges instead of panicking
56
+ or wrapping indices; the last representable single index remains valid.
57
+
8
58
  ## [0.2.3] - 2026-09-09
9
59
 
10
60
  ### Fixed
11
61
 
12
62
  - Preserve offsets and observation weights throughout Satterthwaite and Kenward-Roger inference.
13
63
  - Use one Kenward-Roger covariance adjustment for marginal and joint tests, confidence
14
- intervals, estimated marginal means, and multiple comparisons; retain precision
15
- for very small p-values and reject nonfinite contrast inputs.
64
+ intervals, estimated marginal means, multiple comparisons, and printed model
65
+ summaries; retain precision for very small p-values and reject nonfinite
66
+ contrast inputs.
16
67
  - Respect precision weights in observation-level and cluster-robust standard errors.
17
68
  - Keep nested grouping labels distinct when components contain underscores or backslashes.
18
69
  - Honor requested grouped cross-validation fold counts, accept supported numeric
@@ -20,8 +71,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
20
71
  - Preserve predictors and responses named `intercept` in formula models.
21
72
  - Reject nonfinite confidence levels and mismatched or missing robust-inference data.
22
73
  - Leave uncertainty unavailable when an OLS fit has no residual degrees of freedom.
23
-
24
-
25
74
  - Preserve formula offsets in population/conditional predictions and OLS fitting.
26
75
  - Preserve precision weights in Gaussian simulation and bootstrap refits; weighted
27
76
  residual resampling uses standardized residuals.
@@ -133,6 +133,15 @@ matching scripts. The tag/manual benchmark workflow requires the formatters.
133
133
 
134
134
  Use [the documentation index](docs/README.md) as the navigation map.
135
135
 
136
+ The Rust API landing page comes from [docs/rustdoc.md](docs/rustdoc.md), included
137
+ by [src/lib.rs](src/lib.rs). Its theme extension is
138
+ [docs/rustdoc.css](docs/rustdoc.css). Run `task doc` to build the styled preview
139
+ at `target/doc/lme_rs/index.html`; `task docs:check` also tests its Rust examples
140
+ and intra-doc links. Keep the stylesheet arguments in `Cargo.toml` and the
141
+ shared CI runner aligned. Check light, dark, and Ayu themes and a narrow viewport
142
+ after styling changes. docs.rs builds the published crate, so repository edits
143
+ reach that site with a new release, following [RELEASING.md](RELEASING.md).
144
+
136
145
  | Content | Canonical location |
137
146
  |:--------|:-------------------|
138
147
  | Introduction and first successful fit | [README.md](README.md) |
@@ -1508,7 +1508,7 @@ checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
1508
1508
 
1509
1509
  [[package]]
1510
1510
  name = "lme-rs"
1511
- version = "0.2.3"
1511
+ version = "0.2.4"
1512
1512
  dependencies = [
1513
1513
  "ahash",
1514
1514
  "anyhow",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "lme-rs"
3
- version = "0.2.3"
3
+ version = "0.2.4"
4
4
  edition = "2021"
5
5
  authors = ["Martin Huck <x4g4p3x@users.noreply.github.com>"]
6
6
  description = "Rust port of R's lme4: linear, generalized, and nonlinear mixed-effects models"
@@ -11,6 +11,9 @@ readme = "README.md"
11
11
  keywords = ["statistics", "lme4", "mixed-effects", "glmm", "regression"]
12
12
  categories = ["science", "mathematics"]
13
13
 
14
+ [package.metadata.docs.rs]
15
+ rustdoc-args = ["--extend-css", "docs/rustdoc.css"]
16
+
14
17
  [features]
15
18
  # Enables `bench_load_production` (large synthetic workloads; not run by default `cargo bench`).
16
19
  slow-production-benches = []
@@ -30,7 +30,7 @@ dependencies to its `Cargo.toml`:
30
30
 
31
31
  ```toml
32
32
  [dependencies]
33
- lme-rs = "0.2.3"
33
+ lme-rs = "0.2.4"
34
34
  polars = { version = "0.46", features = ["csv"] }
35
35
  anyhow = "1"
36
36
  ```
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lme_python
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -52,7 +52,7 @@ Add these dependencies to your application's `Cargo.toml`:
52
52
 
53
53
  ```toml
54
54
  [dependencies]
55
- lme-rs = "0.2.3"
55
+ lme-rs = "0.2.4"
56
56
  polars = { version = "0.46", features = ["csv"] }
57
57
  anyhow = "1"
58
58
  ```
@@ -6,7 +6,7 @@ This file gives an **evidence-weighted implementation-coverage score** for major
6
6
 
7
7
  **Last assessed:** 2026-09-09 (full post-refactor Rust/Julia run records current strict-throughput gaps).
8
8
 
9
- **Versions checked:** `lme-rs` **0.2.3** (root [`Cargo.toml`](Cargo.toml)); Python extension **`lme_python` 0.2.3** ([`python/Cargo.toml`](python/Cargo.toml)).
9
+ **Versions checked:** `lme-rs` **0.2.4-dev.0** (root [`Cargo.toml`](Cargo.toml)); Python extension **`lme_python` 0.2.4-dev.0** ([`python/Cargo.toml`](python/Cargo.toml)).
10
10
 
11
11
  Repository completion is judged on **three** axes, not features alone:
12
12
 
@@ -50,6 +50,11 @@ tasks:
50
50
  cmds:
51
51
  - '{{.RUN}} completion-check'
52
52
 
53
+ doc:
54
+ desc: Build the styled Rust API documentation for local preview
55
+ cmds:
56
+ - '{{.RUN}} doc'
57
+
53
58
  docs:check:
54
59
  desc: Validate Markdown links, Rust examples/doctests, and generated docs
55
60
  cmds:
@@ -0,0 +1,157 @@
1
+ /* Shared by docs.rs and `task doc` / `task docs:check`.
2
+ * Extend the built-in rustdoc themes without replacing navigation or search.
3
+ * Keep all fonts and assets local to rustdoc; no remote dependencies.
4
+ */
5
+ :root {
6
+ --lme-accent: #08756c;
7
+ --lme-tint: #f0f8f6;
8
+ --lme-muted: #536662;
9
+ }
10
+
11
+ :root[data-theme="dark"] {
12
+ --lme-accent: #80d9c6;
13
+ --lme-tint: #253532;
14
+ --lme-muted: #b4c7c2;
15
+ }
16
+
17
+ :root[data-theme="ayu"] {
18
+ --lme-accent: #80ddd2;
19
+ --lme-tint: #192b2c;
20
+ --lme-muted: #b0c5c7;
21
+ }
22
+
23
+ body.rustdoc main .docblock {
24
+ font-family: "Fira Sans", system-ui, sans-serif;
25
+ line-height: 1.7;
26
+ }
27
+
28
+ body.rustdoc main .docblock a {
29
+ color: var(--lme-accent);
30
+ text-underline-offset: 0.18em;
31
+ }
32
+
33
+ body.rustdoc main .docblock a:hover {
34
+ text-decoration: underline;
35
+ }
36
+
37
+ body.rustdoc main .docblock h2 {
38
+ margin-top: 2.2rem;
39
+ padding-bottom: 0.5rem;
40
+ }
41
+
42
+ body.rustdoc main .docblock pre {
43
+ border: 1px solid var(--border-color);
44
+ border-radius: 8px;
45
+ padding: 1.1rem;
46
+ line-height: 1.55;
47
+ }
48
+
49
+ body.rustdoc main .docblock table {
50
+ width: 100%;
51
+ margin: 1rem 0;
52
+ font-size: 0.95em;
53
+ }
54
+
55
+ body.rustdoc main .docblock th,
56
+ body.rustdoc main .docblock td {
57
+ padding: 0.85rem 1rem;
58
+ vertical-align: top;
59
+ }
60
+
61
+ .lme-hero {
62
+ margin: 1.5rem 0 2rem;
63
+ padding: 1.75rem 2rem;
64
+ background: var(--lme-tint);
65
+ border: 1px solid var(--border-color);
66
+ border-left: 4px solid var(--lme-accent);
67
+ border-radius: 4px 12px 12px 4px;
68
+ }
69
+
70
+ .lme-hero .lme-eyebrow {
71
+ margin: 0 0 0.65rem;
72
+ color: var(--lme-muted);
73
+ font-size: 0.75rem;
74
+ font-weight: 500;
75
+ letter-spacing: 0.1em;
76
+ text-transform: uppercase;
77
+ }
78
+
79
+ .lme-hero .lme-title {
80
+ margin: 0;
81
+ font-size: clamp(1.6rem, 3vw, 2.35rem);
82
+ font-weight: 500;
83
+ line-height: 1.2;
84
+ letter-spacing: -0.035em;
85
+ }
86
+
87
+ .lme-jump {
88
+ display: flex;
89
+ flex-wrap: wrap;
90
+ gap: 0.6rem;
91
+ margin-top: 1.35rem;
92
+ }
93
+
94
+ .lme-jump a {
95
+ padding: 0.35rem 0.85rem;
96
+ border: 1px solid var(--lme-accent);
97
+ border-radius: 6px;
98
+ font-size: 0.85rem;
99
+ font-weight: 500;
100
+ }
101
+
102
+ .lme-pathways {
103
+ display: grid;
104
+ grid-template-columns: repeat(2, minmax(0, 1fr));
105
+ gap: 0.9rem;
106
+ margin-top: 1rem;
107
+ }
108
+
109
+ .lme-path {
110
+ min-width: 0;
111
+ padding: 1rem 1.2rem;
112
+ border: 1px solid var(--border-color);
113
+ border-radius: 8px;
114
+ }
115
+
116
+ .lme-path p:first-child {
117
+ margin-top: 0;
118
+ font-size: 1.1rem;
119
+ }
120
+
121
+ .lme-path p:last-child {
122
+ margin-bottom: 0;
123
+ }
124
+
125
+ .lme-note {
126
+ margin: 1.25rem 0;
127
+ padding: 0.1rem 1.25rem;
128
+ background: var(--lme-tint);
129
+ border-left: 3px solid var(--lme-accent);
130
+ border-radius: 0 6px 6px 0;
131
+ }
132
+
133
+ @media (max-width: 700px) {
134
+ .lme-hero {
135
+ padding: 1.25rem;
136
+ }
137
+
138
+ .lme-pathways {
139
+ grid-template-columns: 1fr;
140
+ }
141
+
142
+ body.rustdoc main .docblock th,
143
+ body.rustdoc main .docblock td {
144
+ padding: 0.65rem;
145
+ }
146
+ }
147
+
148
+ @media print {
149
+ .lme-hero,
150
+ .lme-note {
151
+ background: transparent;
152
+ }
153
+
154
+ .lme-path {
155
+ break-inside: avoid;
156
+ }
157
+ }
@@ -0,0 +1,131 @@
1
+ Linear, generalized linear, and nonlinear mixed-effects models with
2
+ `lme4`-style formulas and Polars DataFrames.
3
+
4
+ <div class="lme-hero">
5
+ <p class="lme-eyebrow">lme-rs · Rust API reference</p>
6
+ <p class="lme-title">From formula to fitted model.</p>
7
+ <p>Fit a model, inspect its numerical diagnostics, and choose the prediction or
8
+ inference method that matches your question.</p>
9
+ <nav class="lme-jump" aria-label="Getting started">
10
+ <a href="#choose-a-model">Choose a model</a>
11
+ <a href="#first-fit">First fit</a>
12
+ <a href="#use-the-result">Use the result</a>
13
+ </nav>
14
+ </div>
15
+
16
+ # Choose a model
17
+
18
+ <div class="lme-pathways">
19
+ <div class="lme-path">
20
+
21
+ **Linear regression**
22
+
23
+ [`lm_df`] fits ordinary least squares from a formula. Use [`lm`] when you already
24
+ have response and design arrays.
25
+
26
+ </div>
27
+ <div class="lme-path">
28
+
29
+ **Linear mixed models**
30
+
31
+ [`lmer`] fits Gaussian mixed models using REML or maximum likelihood.
32
+ [`lmer_weighted`] adds observation precision weights.
33
+
34
+ </div>
35
+ <div class="lme-path">
36
+
37
+ **Generalized mixed models**
38
+
39
+ [`glmer`] fits a selected [`family::Family`]. [`glmer_with_link`] selects the link;
40
+ [`FitDiagnostics`] records the quadrature order actually used.
41
+
42
+ </div>
43
+ <div class="lme-path">
44
+
45
+ **Nonlinear mixed models**
46
+
47
+ [`nlmer`] fits built-in nonlinear mean functions. [`nlmer_with_mean`] accepts a
48
+ custom mean; [`NlmerOptions`] configures fitting.
49
+
50
+ </div>
51
+ </div>
52
+
53
+ # First fit
54
+
55
+ This small example fits a random intercept for each group. The final `true`
56
+ selects REML; use `false` for maximum likelihood.
57
+
58
+ ```
59
+ use lme_rs::lmer;
60
+ use polars::prelude::*;
61
+
62
+ # fn main() -> anyhow::Result<()> {
63
+ let data = df!(
64
+ "y" => [
65
+ 10.0, 12.0, 13.0, 15.0,
66
+ 9.0, 11.0, 14.0, 17.0,
67
+ 8.0, 10.0, 12.0, 14.0,
68
+ ],
69
+ "x" => [0.0, 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 3.0,
70
+ 0.0, 1.0, 2.0, 3.0],
71
+ "group" => ["a", "a", "a", "a", "b", "b", "b", "b",
72
+ "c", "c", "c", "c"],
73
+ )?;
74
+
75
+ let fit = lmer("y ~ x + (1 | group)", &data, true)?;
76
+ let population_predictions = fit.predict(&data)?;
77
+ assert_eq!(population_predictions.len(), data.height());
78
+ # Ok(())
79
+ # }
80
+ ```
81
+
82
+ The result is an [`LmeFit`]. Inspect its coefficients, variance estimates, and
83
+ `diagnostics` before interpreting a fit. With [`FitControl`], you can set iteration
84
+ limits, supply starting values, and require numerical convergence through
85
+ [`fit_prepared_with_control`] or [`fit_prepared_glmer_with_control`].
86
+
87
+ # Use the result
88
+
89
+ | Your question | API and interpretation |
90
+ | --- | --- |
91
+ | Predictions from fixed effects? | [`LmeFit::predict`] omits group effects. For GLMMs it returns the linear predictor, including any offset. |
92
+ | Predictions for known groups? | [`LmeFit::predict_conditional`] includes stored group effects. Its `allow_new_levels` option controls the fallback for unseen groups. |
93
+ | GLMM response means? | [`LmeFit::predict_response`] and [`LmeFit::predict_conditional_response`] apply the inverse link, with group effects omitted or included respectively. |
94
+ | Confidence intervals? | [`LmeFit::confint`] gives Wald intervals. [`profile_ci`] provides profile-likelihood alternatives and documents supported parameters. |
95
+ | Fixed-effect hypotheses? | [`contrast`] provides Wald F-tests; [`emmeans`] provides reference-grid marginal means and pairwise comparisons. |
96
+ | Compare nested LMMs? | [`anova()`] compares likelihoods. Use the same observations and fit with ML when fixed effects differ; REML comparisons require identical fixed-effects designs. |
97
+ | Assess predictions on held-out groups? | [`cv_grouped`] and [`cv_grouped_glmer`] preserve grouping structure when splitting folds. |
98
+ | Simulate or bootstrap? | [`LmeFit::simulate`] draws responses from fitted conditional means. [`boot_lmer`] and [`boot_glmer`] perform bootstrap refits. |
99
+
100
+ # Reuse a design
101
+
102
+ For repeated fits with the same design, start with [`prepare_lmer`] or
103
+ [`prepare_glmer`]. The resulting [`LmerPrepared`] and [`GlmerPrepared`] objects
104
+ retain the design and model metadata. Fit with [`fit_prepared`] or
105
+ [`fit_prepared_glmer`], or replace only the response with
106
+ [`fit_prepared_with_response`] or [`fit_prepared_glmer_with_response`].
107
+ [`LmerWorkspace`] provides reusable buffers for repeated LMM responses.
108
+
109
+ # Scope and versions
110
+
111
+ <div class="lme-note">
112
+
113
+ **Read the documentation for the version you use.**
114
+
115
+ On docs.rs, the version selector identifies the published crate documented on
116
+ this page. Changes on the repository's development branch appear here only after
117
+ a new crate release. The [development changelog](https://github.com/x4g4p3x/lme-rs/blob/master/CHANGELOG.md)
118
+ separates **Unreleased** changes from published releases.
119
+
120
+ </div>
121
+
122
+ Numerical compatibility is established for tested models and reference fixtures.
123
+ Formula syntax, quadrature, and post-fit inference cover a subset of R's mixed-model
124
+ ecosystem; support varies by model and method. See each API's documented limits
125
+ and check fit diagnostics, including approximation warnings.
126
+
127
+ Continue with the [Rust guide](https://github.com/x4g4p3x/lme-rs/blob/master/GUIDE.md),
128
+ [documentation index](https://github.com/x4g4p3x/lme-rs/blob/master/docs/README.md), or
129
+ [workflow assessment](https://github.com/x4g4p3x/lme-rs/blob/master/USABILITY.md).
130
+ These repository links follow `master`; select the matching release tag when
131
+ reading about a published version. The API index below belongs to this build.
@@ -1262,7 +1262,7 @@ checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
1262
1262
 
1263
1263
  [[package]]
1264
1264
  name = "lme-rs"
1265
- version = "0.2.3"
1265
+ version = "0.2.4"
1266
1266
  dependencies = [
1267
1267
  "ahash",
1268
1268
  "anyhow",
@@ -1286,7 +1286,7 @@ dependencies = [
1286
1286
 
1287
1287
  [[package]]
1288
1288
  name = "lme_python"
1289
- version = "0.2.3"
1289
+ version = "0.2.4"
1290
1290
  dependencies = [
1291
1291
  "lme-rs",
1292
1292
  "ndarray 0.16.1",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "lme_python"
3
- version = "0.2.3"
3
+ version = "0.2.4"
4
4
  edition = "2021"
5
5
  authors = ["Martin Huck <x4g4p3x@users.noreply.github.com>"]
6
6
  description = "Python bindings for lme-rs"
@@ -220,7 +220,8 @@ def cargo_doctest() -> None:
220
220
  def cargo_doc() -> None:
221
221
  run(
222
222
  ["cargo", "doc", "--no-deps", "--verbose", "--locked"],
223
- env={"RUSTDOCFLAGS": "-D warnings"},
223
+ # Match the stylesheet in package.metadata.docs.rs for local previews.
224
+ env={"RUSTDOCFLAGS": "-D warnings --extend-css docs/rustdoc.css"},
224
225
  )
225
226
 
226
227
 
@@ -1,4 +1,4 @@
1
- //! Parametric and residual bootstrap refits for linear mixed models.
1
+ //! Parametric and residual bootstrap refits for LMMs, and parametric refits for GLMMs.
2
2
  //!
3
3
  //! Mirrors R's `lme4::bootMer` workflow: simulate or resample responses, refit,
4
4
  //! and summarize bootstrap draws. Uses [`crate::prepare_lmer`] + [`crate::fit_prepared_with_response`]