stmmlib 0.2.0__tar.gz → 0.2.5__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 (114) hide show
  1. stmmlib-0.2.5/CHANGELOG.md +232 -0
  2. {stmmlib-0.2.0 → stmmlib-0.2.5}/LICENSE +21 -21
  3. stmmlib-0.2.5/MANIFEST.in +2 -0
  4. {stmmlib-0.2.0/stmmlib.egg-info → stmmlib-0.2.5}/PKG-INFO +229 -215
  5. {stmmlib-0.2.0 → stmmlib-0.2.5}/README.md +194 -180
  6. stmmlib-0.2.5/docs/API.md +154 -0
  7. {stmmlib-0.2.0 → stmmlib-0.2.5}/pyproject.toml +54 -52
  8. {stmmlib-0.2.0 → stmmlib-0.2.5}/setup.cfg +4 -4
  9. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/__init__.py +30 -30
  10. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/_backend.py +153 -153
  11. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/_utils.py +197 -175
  12. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/__init__.py +17 -17
  13. stmmlib-0.2.5/stmmlib/beta/beta_nll.py +138 -0
  14. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/config.py +108 -108
  15. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/criteria.py +187 -247
  16. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/design.py +222 -222
  17. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/diagnose.py +168 -168
  18. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/diagnostics.py +94 -94
  19. stmmlib-0.2.5/stmmlib/beta/engine/__init__.py +19 -0
  20. stmmlib-0.2.5/stmmlib/beta/engine/finalize.py +289 -0
  21. stmmlib-0.2.5/stmmlib/beta/engine/gradient.py +188 -0
  22. stmmlib-0.2.5/stmmlib/beta/engine/hessian.py +70 -0
  23. stmmlib-0.2.5/stmmlib/beta/engine/hooks.py +132 -0
  24. stmmlib-0.2.5/stmmlib/beta/engine/likelihood.py +165 -0
  25. stmmlib-0.2.5/stmmlib/beta/engine/optimize.py +296 -0
  26. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/fit.py +599 -598
  27. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/gpu_solvers.py +169 -169
  28. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/inference.py +340 -403
  29. stmmlib-0.2.5/stmmlib/beta/laplace.py +70 -0
  30. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/lrt_fixed.py +551 -551
  31. stmmlib-0.2.5/stmmlib/beta/mode.py +263 -0
  32. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/moran_panel.py +733 -733
  33. stmmlib-0.2.5/stmmlib/beta/numerics.py +123 -0
  34. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/plot_data.py +252 -252
  35. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/precision.py +98 -98
  36. stmmlib-0.2.5/stmmlib/beta/prior.py +182 -0
  37. stmmlib-0.2.5/stmmlib/beta/regression.py +102 -0
  38. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/report.py +373 -373
  39. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/result.py +712 -696
  40. stmmlib-0.2.5/stmmlib/beta/schur.py +90 -0
  41. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/simulation.py +344 -343
  42. stmmlib-0.2.5/stmmlib/beta/solvers.py +365 -0
  43. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/structure.py +56 -56
  44. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/diagnostics_suite.py +663 -663
  45. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/__init__.py +1 -1
  46. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/blup.py +241 -252
  47. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/covariance.py +607 -599
  48. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/design.py +312 -312
  49. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/diagnostics.py +308 -308
  50. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/gls.py +285 -285
  51. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/hessian.py +200 -197
  52. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/lrt_fixed.py +289 -289
  53. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/models.py +535 -528
  54. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/optimization.py +361 -361
  55. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/simulation.py +186 -186
  56. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/summary.py +277 -277
  57. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/transforms.py +417 -419
  58. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/variance_decomp.py +191 -191
  59. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/lrt.py +74 -74
  60. stmmlib-0.2.5/stmmlib/mse/__init__.py +11 -0
  61. stmmlib-0.2.5/stmmlib/mse/_beta.py +92 -0
  62. stmmlib-0.2.5/stmmlib/mse/_common.py +76 -0
  63. stmmlib-0.2.5/stmmlib/mse/_gaussian.py +73 -0
  64. stmmlib-0.2.5/stmmlib/mse/bootstrap.py +159 -0
  65. stmmlib-0.2.5/stmmlib/mse_bootstrap.py +17 -0
  66. stmmlib-0.2.5/stmmlib/output_format.py +18 -0
  67. stmmlib-0.2.5/stmmlib/output_format_beta.py +14 -0
  68. stmmlib-0.2.5/stmmlib/output_format_normal.py +12 -0
  69. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/registry.py +326 -326
  70. stmmlib-0.2.5/stmmlib/reporting/__init__.py +23 -0
  71. stmmlib-0.2.0/stmmlib/output_format.py → stmmlib-0.2.5/stmmlib/reporting/_common.py +148 -148
  72. stmmlib-0.2.0/stmmlib/output_format_beta.py → stmmlib-0.2.5/stmmlib/reporting/beta.py +299 -299
  73. stmmlib-0.2.0/stmmlib/output_format_normal.py → stmmlib-0.2.5/stmmlib/reporting/normal.py +118 -118
  74. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/stmm.py +282 -265
  75. {stmmlib-0.2.0 → stmmlib-0.2.5/stmmlib.egg-info}/PKG-INFO +229 -215
  76. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib.egg-info/SOURCES.txt +35 -0
  77. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib.egg-info/requires.txt +0 -1
  78. stmmlib-0.2.5/tests/test_ar1_global_variance.py +84 -0
  79. stmmlib-0.2.5/tests/test_architecture.py +87 -0
  80. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_all.py +152 -152
  81. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_config.py +80 -80
  82. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_criteria.py +44 -44
  83. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_ebp.py +80 -80
  84. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_input_guards.py +65 -65
  85. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_lrt_fixed.py +539 -539
  86. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_penalty.py +46 -46
  87. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_regression.py +39 -39
  88. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_report_certificate.py +73 -73
  89. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_bugfix_b1_b4.py +51 -51
  90. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_coverage_gaps.py +50 -50
  91. stmmlib-0.2.5/tests/test_custom_columns_gaussian.py +60 -0
  92. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_diagnostics_suite.py +57 -57
  93. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_fixed_effects_diag.py +45 -45
  94. stmmlib-0.2.5/tests/test_formula_guard.py +48 -0
  95. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_gaussian_all.py +96 -85
  96. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_gaussian_lrt.py +157 -157
  97. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_gaussian_m5_eblup.py +60 -60
  98. stmmlib-0.2.5/tests/test_golden.py +130 -0
  99. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_grad_analytic.py +82 -82
  100. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_lrt.py +54 -54
  101. stmmlib-0.2.5/tests/test_mse_bootstrap.py +104 -0
  102. stmmlib-0.2.5/tests/test_mustfix_audit.py +261 -0
  103. stmmlib-0.2.5/tests/test_nested_time_variance.py +54 -0
  104. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_predict_interval.py +46 -46
  105. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_random_effects_diag.py +70 -70
  106. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_registry_equation.py +34 -34
  107. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_universal.py +25 -25
  108. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_universal_api.py +35 -35
  109. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_validate_assumptions.py +49 -49
  110. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_variance_ci.py +41 -41
  111. {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_w_edge_cases.py +112 -112
  112. stmmlib-0.2.0/stmmlib/beta/solvers.py +0 -2021
  113. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib.egg-info/dependency_links.txt +0 -0
  114. {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib.egg-info/top_level.txt +0 -0
@@ -0,0 +1,232 @@
1
+ # Changelog
2
+
3
+ All notable changes to `stmmlib`. Format follows Keep-a-Changelog; versions
4
+ follow Semantic Versioning.
5
+
6
+ ## [0.2.5] - 2026-11-15
7
+
8
+ ### Fixed
9
+
10
+ - Gaussian flat and SEBLUP models forward `prov_col`/`kab_col` to the fitting
11
+ core. Custom-named grouping columns are now excluded from the fixed-effect
12
+ design; before, only the literal names `prov`/`kab` were skipped, so a frame
13
+ carrying e.g. `provinsi`/`kabupaten` leaked those text columns into `X`
14
+ (numpy dtype error, or a silently wrong design).
15
+ - A non-numeric response or predictor in a Gaussian fit raises `ValueError`
16
+ naming the offending column, matching the Beta path, instead of numpy's
17
+ "could not convert string to float".
18
+
19
+ ### Changed
20
+
21
+ - `seblup_rao_yu_it` accepts `prov_col`/`kab_col` (default `None`); existing
22
+ positional calls are unchanged.
23
+
24
+ ### Notes
25
+
26
+ - Beta fits can differ by roughly `1e-4` in log-likelihood when the caller
27
+ permutes rows: the standardisation means are summed in frame order, and the
28
+ auto-prior refit is a threshold branch that can flip near its boundary.
29
+ Sort the frame before fitting when a bit-stable reproduction matters.
30
+
31
+ ## [0.2.4] - 2026-11-14
32
+
33
+ ### Changed
34
+
35
+ - Packaging layout only, no behavior change. Output formatting moved into
36
+ `stmmlib.reporting` (`_common`, `beta`, `normal`) and the MSE bootstrap into
37
+ `stmmlib.mse` (`_common`, `_beta`, `_gaussian`, `bootstrap`). The flat
38
+ `stmmlib.output_format*` modules and `stmmlib.mse_bootstrap` remain as
39
+ compatibility shims, so existing imports keep working. Stale `__pycache__`
40
+ directories were removed from the source tree.
41
+ - The Beta Laplace engine was split into single-purpose modules under
42
+ `stmmlib.beta.engine` (likelihood, gradient, hooks, optimize, finalize,
43
+ hessian, numerics). `stmmlib.beta.solvers` re-exports every previous name,
44
+ so existing imports keep working. Point estimates and likelihoods are
45
+ unchanged by the split.
46
+
47
+ ### Fixed
48
+
49
+ - Gaussian fits are invariant to input row order: `y` and `X` are sorted with
50
+ the prepared design before fitting instead of keeping caller order.
51
+ - `build_V` uses the time design for `time_scope="global"`. The area-major
52
+ time block was used for both scopes, so a global AR(1) fit silently ignored
53
+ the shared time factor.
54
+ - The Gaussian Hessian uses the correct sign and backend, so `se_theta` is
55
+ available and finite for the IID model.
56
+ - Gaussian, Beta, and Beta-simulation spatial interaction covariances are
57
+ area-major (`kron(qa, I_T)`). The transposed Kronecker order disagreed with
58
+ the design matrix.
59
+ - Beta cAIC and `df_hat` use the same precision builder as the fit engine
60
+ (`build_beta_Q`), so criteria cannot drift from the fitted prior.
61
+ - `predict_interval` on a Beta fit raises `ValueError` when `vcov` is missing
62
+ instead of returning a point interval that looked like an interval.
63
+ - The fixed-effect intercept SE uses the full delta method, including the
64
+ covariance between the intercept and the other fixed effects.
65
+ - Gaussian IID BLUP uses `G Z' V^{-1} e` instead of the scaled residual, which
66
+ is only equivalent for a diagonal `G`.
67
+
68
+ ## [0.2.3] - 2026-11-13
69
+
70
+ ### Changed
71
+
72
+ - `formula` is now rejected with `NotImplementedError` at the public entry
73
+ points. It was accepted and silently ignored, so a caller could believe the
74
+ design matrix matched the formula while it contained every non-skipped
75
+ column.
76
+
77
+ ### Fixed
78
+
79
+ - AR(1) models with `time_scope="global"` (M4, M11) exposed `sigma2_u` in the
80
+ parameter layout while `build_V` and `build_G_time` only read `sigma2_eta`.
81
+ The likelihood was invariant to the reported variance. The layout now always
82
+ uses `sigma2_eta` for AR(1), matching `stlmm5lib`. Results for M4 and M11
83
+ change.
84
+ - M6 and M13 now estimate a separate IID time variance (`sigma2_time`). The
85
+ time block used to reuse `sigma2_kab`, so the fitted model had one parameter
86
+ fewer than the registry declares. This matches `stlmm5lib` in R. Results for
87
+ M6 and M13 change.
88
+
89
+ ### Added
90
+
91
+ - Parametric bootstrap MSE of the area-level predictor: `mse_ebp(fit)` for
92
+ Beta and `mse_eblup(fit)` for Gaussian, in `stmmlib/mse_bootstrap.py`.
93
+ Single layer by design: beta and theta are fixed while generating, the
94
+ refit re-estimates them, and the target is the realized area mean of the
95
+ drawn random effects. No second-order bias correction (see the design doc
96
+ and the thesis method section). Flat models only in v1.
97
+ - CI matrix for Python 3.10 to 3.14 on Linux plus Windows 3.12, and a build
98
+ job that runs `python -m build` and `twine check`.
99
+ - Golden numeric tests for Beta IID+AR(1), Gaussian SAR+IID, and Gaussian
100
+ IID+AR(1), captured from 0.2.2.
101
+ - Architecture tests: a file-size ratchet and a ban on cross-family imports.
102
+
103
+ ## [0.2.2] - 2026-11-13
104
+
105
+ ### Fixed
106
+
107
+ - README claims now match the code:
108
+ - M7/M14 area effect is nested IID, not nested SAR. The Beta path says so
109
+ explicitly, and the Gaussian nested covariance does not use `W`.
110
+ - GPU acceleration is PyTorch-only and applies to the Beta inner solves;
111
+ the Gaussian path stays on CPU.
112
+ - Removed the spatial block cross-validation claim: the package does not
113
+ implement it.
114
+ - Holdout prediction is Beta-only (`ebp_newdata`), and that method rejects
115
+ nested and interaction models.
116
+ - The quick-start report call uses `summary(strict=True)` and describes the
117
+ certificate warning accurately.
118
+ - Citation version and LICENSE link now point at the current release and
119
+ absolute GitHub URLs, so they work on PyPI.
120
+
121
+ ### Changed
122
+
123
+ - The `gpu` extra no longer pulls `cupy-cuda12x`; only the PyTorch path is
124
+ used for acceleration.
125
+ - The sdist now ships `CHANGELOG.md` and `docs/API.md` through `MANIFEST.in`,
126
+ because the README references the API reference.
127
+ - Added Documentation and Changelog project URLs to the package metadata.
128
+ - The package docstring now describes the actual GPU path (PyTorch/CUDA for
129
+ the Beta inner solves).
130
+ - License metadata now uses the SPDX expression `MIT` with
131
+ `setuptools>=77` and no deprecated license classifier.
132
+
133
+ ## [0.2.1] - 2026-11-12
134
+
135
+ ### Fixed
136
+
137
+ - The Gaussian optimiser's default iteration cap went from 200 to 500. On
138
+ scipy 1.11 the AR(1) profile likelihood needs 223 iterations (scipy 1.18
139
+ needs 196), so the old default reported not-converged for a fit that does
140
+ converge. An explicit `max_iter` is still honoured exactly: the fit then
141
+ reports not-converged rather than running past the cap.
142
+
143
+ ### Changed
144
+
145
+ - Installation section now states that `pip install stmmlib` pulls NumPy,
146
+ SciPy and pandas automatically, notes that the `dev` extra needs a source
147
+ checkout because the tests are not part of the wheel, and gives a
148
+ one-line verification command.
149
+ - Version moved to 0.2.1 so a rebuild from this branch cannot collide with
150
+ the published 0.2.0 filenames on PyPI.
151
+
152
+ ## [0.2.0] - 2026-11-11
153
+
154
+ ### Added
155
+
156
+ - Fixed-effect inference in both families. Wald is the default; a
157
+ restricted-refit likelihood ratio test is available with
158
+ `inference="lrt"` and `lrt_terms=[...]`.
159
+ - Beta: `stmm(..., family="beta", inference="lrt")` or the universal
160
+ entry point `stmmlib.beta.lrt_fixed.lrt_fixed_effects(fit, data, terms=...)`;
161
+ supports `lrt_deadline_s` and `method="refine"` (Newton ascent on the
162
+ restricted model) or `method="plain"` (re-runs the solver's own
163
+ optimiser). A refit that does not reach the restricted maximum does not
164
+ report a p-value.
165
+ - Gaussian: same API. Likelihoods are compared with ML (REML
166
+ likelihoods are not comparable across fixed-effects designs); the
167
+ caller's REML fit is untouched. The certificate is the likelihood:
168
+ two independent starts must agree, and the restricted likelihood may
169
+ not exceed the full one. The fixed-effects table shows variable
170
+ names (not `beta_0`) and, in LRT mode, p (LRT) with the Wald p-value
171
+ kept at `fit["inference"]["pvalue_wald"]`.
172
+ - Gaussian fits now carry `coef_names` (real predictor names), `x_cols`,
173
+ `X`, `y`, `model`, `lrt_family` — the Gaussian tables are readable.
174
+ - Convergence certificate for the Beta family: `fit.certificate`
175
+ (`valid`, `optimum_valid`, `grad_norm`, `hessian_pd`, `near_pd_applied`).
176
+ `fit.summary(strict=True)` hides Wald inference when the certificate is
177
+ not inference-grade.
178
+ - Input guards: Beta response outside (0,1) or NaN predictors raise at the
179
+ door; unbalanced panels warn; non-contiguous area/time codes raise; W
180
+ ordering is warned about.
181
+ - Suite doubles to 150+ tests (inference switch, LRT both families, input
182
+ guards, universal API, Satterthwaite honesty).
183
+
184
+ ### Fixed
185
+
186
+ - The restricted refit could not find the restricted maximum on the thesis
187
+ panel (step dominated by bound-active coordinates, then clipped to an
188
+ empty move). The Newton ascent is now projected onto the KKT active
189
+ set and the Armijo test uses the realised displacement; all six terms
190
+ certify `ok` and D agrees with the Wald z\u00b2 statistic.
191
+ - A silently wrong Gaussian model: the seblup and nested paths skipped
192
+ the literal `"y"` while the response is read from `response_col`, so any
193
+ other response name made the response a predictor of itself. The skip
194
+ list now comes from the names actually in use.
195
+ - A predictor literally named `prov` or `kab` was silently dropped by the
196
+ grouping-column convention in both families; the paths now warn and say
197
+ how to rename it.
198
+ - The Beta summary printed "efek-waktu 11 level" in every report (a
199
+ literal from one panel). It now prints the fitted number of periods.
200
+ - `df_method="satterthwaite"` is honest: it warns that it uses residual
201
+ degrees of freedom and documents the `df_method="normal"` alternative.
202
+ - A predictor named `y` now raises a clear collision error instead of a
203
+ misleading "response must be in (0,1)" message.
204
+
205
+ ### Changed
206
+
207
+ - `stmm()` validates the family against the model registry:
208
+ `beta_regression` cannot be fitted as if it were a Gaussian model, and
209
+ unknown `area`/`time` types raise instead of producing
210
+ `logLik=nan` / `status=invalid` silently.
211
+ - The registry's `time_scope` is honored by the Gaussian family
212
+ (previously re-derived from sar+ar1); the seblup and nested families
213
+ carry it too.
214
+ - Nested Beta models print cAIC / R\u00b2 as `n/a` with the reason
215
+ (conditional criteria are flat-model only), not a bare `nan`.
216
+ - Comments and docstrings no longer quote thesis measurements; `stmmlib/
217
+ note/` moved to `docs/notes/`; the package builds clean sdist/wheel.
218
+ - Default LRT behaviour: the untested terms carry NaN p-values under
219
+ the LRT header; Wald p-values stay available.
220
+ - `beta/__init__.py` documents the actual modules; README is a general
221
+ reference (not a thesis-bound note), lists both families' LRT and the
222
+ test-suite workflow.
223
+
224
+ ## [0.1.0] - 2026-11-10
225
+
226
+ Initial public reference implementation: Gaussian and Beta families, one
227
+ API, 14 model structures (m1-m14) + `beta_regression`, spatial (IID, SAR,
228
+ nested, SEBLUP Rao-Yu) and temporal (IID, AR(1)) random effects, optional
229
+ interactions, Gaussian ML/REML, Beta Laplace-approximated ML, EBLUP/EBP
230
+ prediction, GPU backend via CuPy/PyTorch.
231
+
232
+ [0.1.0]: initial public reference implementation (2026-11-10).
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Ghardapaty Ghiffary
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ghardapaty Ghiffary
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ include CHANGELOG.md
2
+ include docs/API.md