rustima 0.2.0__tar.gz → 0.3.0__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.
- rustima-0.3.0/CHANGELOG.md +112 -0
- {rustima-0.2.0 → rustima-0.3.0}/Cargo.lock +1 -1
- {rustima-0.2.0 → rustima-0.3.0}/Cargo.toml +1 -1
- {rustima-0.2.0 → rustima-0.3.0}/PKG-INFO +1 -1
- {rustima-0.2.0 → rustima-0.3.0}/benches/bench_fit.rs +0 -3
- {rustima-0.2.0 → rustima-0.3.0}/benches/bench_kalman.rs +0 -2
- {rustima-0.2.0 → rustima-0.3.0}/examples/high_order_bench.rs +0 -1
- {rustima-0.2.0 → rustima-0.3.0}/lbfgsb_c/lbfgsb.c +39 -39
- {rustima-0.2.0 → rustima-0.3.0}/lbfgsb_c/lbfgsb.h +12 -2
- {rustima-0.2.0 → rustima-0.3.0}/lbfgsb_c/linesearch.c +11 -11
- {rustima-0.2.0 → rustima-0.3.0}/lbfgsb_c/linpack.c +5 -5
- {rustima-0.2.0 → rustima-0.3.0}/lbfgsb_c/miniCBLAS.c +6 -6
- {rustima-0.2.0 → rustima-0.3.0}/lbfgsb_c/print.c +4 -4
- {rustima-0.2.0 → rustima-0.3.0}/lbfgsb_c/subalgorithms.c +45 -45
- {rustima-0.2.0 → rustima-0.3.0}/pyproject.toml +1 -1
- {rustima-0.2.0 → rustima-0.3.0}/python/rustima/__init__.py +2 -2
- {rustima-0.2.0 → rustima-0.3.0}/python/rustima/auto.py +27 -102
- {rustima-0.2.0 → rustima-0.3.0}/python/rustima/model.py +68 -183
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_auto.py +7 -1
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_forecast.py +1 -1
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_inference.py +27 -29
- rustima-0.3.0/python_tests/test_init_correctness.py +112 -0
- rustima-0.3.0/python_tests/test_matrix_cells.py +92 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_profile_trust_region.py +26 -11
- rustima-0.3.0/python_tests/test_robustness.py +99 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_safety_guards.py +3 -1
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_simple_diff.py +67 -0
- {rustima-0.2.0 → rustima-0.3.0}/src/batch.rs +85 -22
- {rustima-0.2.0 → rustima-0.3.0}/src/forecast.rs +34 -10
- {rustima-0.2.0 → rustima-0.3.0}/src/inference.rs +14 -2
- {rustima-0.2.0 → rustima-0.3.0}/src/initialization.rs +64 -40
- {rustima-0.2.0 → rustima-0.3.0}/src/kalman.rs +12 -30
- {rustima-0.2.0 → rustima-0.3.0}/src/lbfgsb_ffi.rs +0 -5
- {rustima-0.2.0 → rustima-0.3.0}/src/lib.rs +126 -102
- rustima-0.3.0/src/optimizer/mod.rs +835 -0
- rustima-0.3.0/src/optimizer/multistart.rs +726 -0
- rustima-0.3.0/src/optimizer/objective.rs +566 -0
- rustima-0.3.0/src/optimizer/runners.rs +405 -0
- rustima-0.3.0/src/optimizer/tests.rs +689 -0
- rustima-0.3.0/src/optimizer/transforms.rs +147 -0
- rustima-0.3.0/src/optimizer/trust_region.rs +868 -0
- {rustima-0.2.0 → rustima-0.3.0}/src/params.rs +1 -1
- {rustima-0.2.0 → rustima-0.3.0}/src/pipeline.rs +0 -1
- {rustima-0.2.0 → rustima-0.3.0}/src/score.rs +227 -374
- {rustima-0.2.0 → rustima-0.3.0}/src/start_params.rs +60 -335
- {rustima-0.2.0 → rustima-0.3.0}/src/state_space.rs +1 -13
- {rustima-0.2.0 → rustima-0.3.0}/src/types.rs +37 -3
- {rustima-0.2.0 → rustima-0.3.0}/uv.lock +1 -1
- rustima-0.2.0/src/optimizer.rs +0 -4070
- {rustima-0.2.0 → rustima-0.3.0}/.env.example +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/.gitignore +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/LICENSE +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/README.md +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/build.rs +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/docs/PERF_DIAGNOSIS.md +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/docs/SUPPORTED_COMBINATIONS.md +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/docs/api_reference.md +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/docs/error_codes.md +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/docs/migration_guide.md +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/docs/profiled_kalman_gls_plan.md +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/docs/statsmodels_compat.md +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/docs/ver5_convergence_improvement.md +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/examples/bench_comprehensive.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/examples/bench_vs_statsmodels.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/examples/sarimax_exog_demo.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/examples/sarimax_hourly_s24.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/lbfgsb_c/License.txt +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/lbfgsb_c/timer.c +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/conftest.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/generate_fixtures.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/generate_matrix_fixtures.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_batch.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_exog.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_extend.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_fit.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_high_order_accuracy.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_input_validation.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_matrix_tier_a.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_multi_order_accuracy.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_polars.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_prediction_quality.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_rolling.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_smoke.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_trend.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/python_tests/test_variance_parity.py +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/src/css.rs +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/src/error.rs +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/src/lbfgsb_wrapper.rs +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/src/polynomial.rs +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/src/test_helpers.rs +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/tests/fixtures/.gitkeep +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/tests/fixtures/matrix_tier_a.json +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/tests/fixtures/matrix_tier_b.json +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/tests/fixtures/statsmodels_fit_reference.json +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/tests/fixtures/statsmodels_forecast_reference.json +0 -0
- {rustima-0.2.0 → rustima-0.3.0}/tests/fixtures/statsmodels_reference.json +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to rustima are documented here.
|
|
4
|
+
Versions follow `0.MINOR.PATCH`, where breaking changes bump MINOR.
|
|
5
|
+
|
|
6
|
+
## 0.3.0 — 2026-07-25
|
|
7
|
+
|
|
8
|
+
A diagnosis sweep of the engine (~1,800 adversarial inputs, 9 numerical
|
|
9
|
+
regimes against statsmodels, and a structural audit) found and fixed four
|
|
10
|
+
defects that returned **wrong numbers without raising**. Full report:
|
|
11
|
+
`planner/ver9/DIAGNOSIS_V9.md`.
|
|
12
|
+
|
|
13
|
+
> **Results from 0.2.x are not comparable to 0.3.0.** The log-likelihood,
|
|
14
|
+
> AIC and BIC of every model **without differencing** (`d=0, D=0`) were
|
|
15
|
+
> biased, and `inference="hessian"` standard errors were inflated. If you
|
|
16
|
+
> have published or stored numbers from 0.2.x, re-run them.
|
|
17
|
+
|
|
18
|
+
### Breaking — corrected numerical results
|
|
19
|
+
|
|
20
|
+
- **Initial state covariance for non-differenced models.** `P₀` for the
|
|
21
|
+
stationary ARMA block used the DARE fixed point (the steady-state
|
|
22
|
+
*filtering* covariance) instead of the unconditional *Lyapunov*
|
|
23
|
+
covariance. For AR(1) this used `σ²` where the correct prior is
|
|
24
|
+
`σ²/(1-φ²)`. The error grows like `1/(1-φ²)` and does not vanish with
|
|
25
|
+
sample size: `Δloglike` ≈ −0.1 at φ=0.5, −62 at φ=0.995, and `ΔAIC`
|
|
26
|
+
+156 for a seasonal SAR=0.99 model. Fixed-parameter log-likelihoods now
|
|
27
|
+
match statsmodels to 1e-10. Models with `d≥1` were always correct.
|
|
28
|
+
- **Standard errors from `inference="hessian"`.** The Hessian was mapped
|
|
29
|
+
from unconstrained to constrained space with the Jacobian instead of its
|
|
30
|
+
inverse, applying the transform twice and inflating AR/MA standard
|
|
31
|
+
errors by up to 6.6×. Now matches statsmodels `cov_params_approx` to
|
|
32
|
+
five decimals. `inference="opg"` was unaffected.
|
|
33
|
+
- **False convergence with trend terms.** A deterministic trend made the
|
|
34
|
+
CSS/Burg start-parameter estimator see near-integration, saturating the
|
|
35
|
+
AR start on the constraint boundary where L-BFGS-B stalls and reports
|
|
36
|
+
`converged=True` with a gradient of order 100 — up to 192 nats below the
|
|
37
|
+
optimum. Start parameters are now detrended, and out-of-box estimates
|
|
38
|
+
fall back to zeros instead of clamping.
|
|
39
|
+
- **Near-cancellation detection.** AR and MA roots were compared against
|
|
40
|
+
the sign-flipped MA polynomial, so genuine cancellation (`θ = −φ`) was
|
|
41
|
+
never detected — the warning and the multi-start restart filter both ran
|
|
42
|
+
on the wrong condition.
|
|
43
|
+
- **Post-estimation ran a differently-initialized filter.** `forecast`,
|
|
44
|
+
`rolling_forecast`, `residuals`, `batch_forecast` and `diagnostics`
|
|
45
|
+
ignored the model's enforcement flags and silently used an approximate
|
|
46
|
+
diffuse initialization, so `res.llf` and `res.resid` / `res.diagnostics()`
|
|
47
|
+
described different models — Ljung-Box tested residuals the likelihood
|
|
48
|
+
never saw.
|
|
49
|
+
|
|
50
|
+
### Breaking — stricter inputs and API
|
|
51
|
+
|
|
52
|
+
- Masked arrays are rejected by `SARIMAXModel` and `auto_arima` (previously
|
|
53
|
+
the mask was silently dropped and masked entries used as data).
|
|
54
|
+
- `sarimax_inference` validates the parameter-vector length instead of
|
|
55
|
+
returning empty arrays.
|
|
56
|
+
- `SARIMAXResult.param_names` raises if the Rust layout and the Python
|
|
57
|
+
naming disagree, instead of padding with `param_N` and printing values
|
|
58
|
+
under the wrong names.
|
|
59
|
+
- `sarimax_rolling_forecast` refuses configurations whose origin snapshots
|
|
60
|
+
would exceed 2 GiB (previously unbounded — 4.4 GB measured at n=1000,
|
|
61
|
+
s=365, and an allocation failure aborts the process).
|
|
62
|
+
- `sarimax_residuals` returns an additional `prediction_variances` key.
|
|
63
|
+
Code asserting an exact key set must be updated.
|
|
64
|
+
- Rust: the never-supported `SarimaxConfig.measurement_error` field is
|
|
65
|
+
removed.
|
|
66
|
+
|
|
67
|
+
### Added
|
|
68
|
+
|
|
69
|
+
- `PredictionResult.conf_int(alpha=...)` and `.se_mean` —
|
|
70
|
+
`get_prediction()` now produces intervals across the whole range, not
|
|
71
|
+
only the out-of-sample tail.
|
|
72
|
+
- `sarimax_residuals` returns `prediction_variances` (one-step-ahead
|
|
73
|
+
prediction variance).
|
|
74
|
+
- `sarimax_forecast`, `sarimax_rolling_forecast`, `sarimax_residuals`,
|
|
75
|
+
`sarimax_batch_forecast` and `sarimax_diagnostics` accept
|
|
76
|
+
`enforce_stationarity` / `enforce_invertibility` (appended to the
|
|
77
|
+
signature; positional calls are unaffected).
|
|
78
|
+
|
|
79
|
+
### Fixed
|
|
80
|
+
|
|
81
|
+
- **Deadlock in forked processes.** Rayon's global pool is not fork-safe:
|
|
82
|
+
any batch or grid call in a `fork()`ed child hung forever with no error
|
|
83
|
+
(reachable through `multiprocessing`'s fork context after a single
|
|
84
|
+
earlier batch call). Parallel entry points now fail fast with a clear
|
|
85
|
+
message, and the optimizer's internal parallel sections fall back to
|
|
86
|
+
sequential execution.
|
|
87
|
+
- Batch workers isolate panics per series, so the documented per-series
|
|
88
|
+
error isolation holds even if a worker panics.
|
|
89
|
+
- The analytical gradient no longer disappears near unit roots: the score
|
|
90
|
+
pass now shares the likelihood pass's `F_t ≤ 0` fallback and
|
|
91
|
+
steady-state adoption guard, keeping the gradient finite wherever the
|
|
92
|
+
log-likelihood is.
|
|
93
|
+
- The analytical score accounts for `∂P₀/∂θ` when the initialization
|
|
94
|
+
depends on the parameters.
|
|
95
|
+
|
|
96
|
+
### Internal
|
|
97
|
+
|
|
98
|
+
- Single-sourced the trend basis, the flat-parameter count, and
|
|
99
|
+
single-series input validation (the last was duplicated into
|
|
100
|
+
`sarimax_grid_search`, the `auto_arima` hot path). Model flags moved from
|
|
101
|
+
adjacent positional booleans into a named struct.
|
|
102
|
+
- Removed dead code: `auto_arima`'s unused evaluation path, the
|
|
103
|
+
`measurement_error` plumbing, and the redundant Python numerical-Hessian
|
|
104
|
+
implementation.
|
|
105
|
+
- Python test suite 407 → 429, including regression tests for every defect
|
|
106
|
+
above and eight previously uncovered option-matrix combinations. CI is
|
|
107
|
+
green for the first time since 2026-05-23.
|
|
108
|
+
|
|
109
|
+
## 0.2.0
|
|
110
|
+
|
|
111
|
+
Initial tagged release with the SARIMAX engine, `auto_arima`, batch
|
|
112
|
+
processing and the statsmodels-compatible Python API.
|
|
@@ -26,7 +26,6 @@ fn bench_fit_ar1(c: &mut Criterion) {
|
|
|
26
26
|
enforce_invertibility: true,
|
|
27
27
|
concentrate_scale: true,
|
|
28
28
|
simple_differencing: false,
|
|
29
|
-
measurement_error: false,
|
|
30
29
|
};
|
|
31
30
|
|
|
32
31
|
c.bench_function("fit_ar1_n500", |b| {
|
|
@@ -44,7 +43,6 @@ fn bench_fit_arima111(c: &mut Criterion) {
|
|
|
44
43
|
enforce_invertibility: true,
|
|
45
44
|
concentrate_scale: true,
|
|
46
45
|
simple_differencing: false,
|
|
47
|
-
measurement_error: false,
|
|
48
46
|
};
|
|
49
47
|
|
|
50
48
|
c.bench_function("fit_arima111_n500", |b| {
|
|
@@ -66,7 +64,6 @@ fn bench_fit_sarima_111_111_12(c: &mut Criterion) {
|
|
|
66
64
|
enforce_invertibility: false,
|
|
67
65
|
concentrate_scale: true,
|
|
68
66
|
simple_differencing: false,
|
|
69
|
-
measurement_error: false,
|
|
70
67
|
};
|
|
71
68
|
|
|
72
69
|
c.bench_function("fit_sarima111_111_12_n500", |b| {
|
|
@@ -30,7 +30,6 @@ fn bench_kalman_ar1(c: &mut Criterion) {
|
|
|
30
30
|
enforce_invertibility: false,
|
|
31
31
|
concentrate_scale: true,
|
|
32
32
|
simple_differencing: false,
|
|
33
|
-
measurement_error: false,
|
|
34
33
|
};
|
|
35
34
|
let params = SarimaxParams {
|
|
36
35
|
trend_coeffs: vec![],
|
|
@@ -60,7 +59,6 @@ fn bench_kalman_arima111(c: &mut Criterion) {
|
|
|
60
59
|
enforce_invertibility: false,
|
|
61
60
|
concentrate_scale: true,
|
|
62
61
|
simple_differencing: false,
|
|
63
|
-
measurement_error: false,
|
|
64
62
|
};
|
|
65
63
|
let params = SarimaxParams {
|
|
66
64
|
trend_coeffs: vec![],
|
|
@@ -60,7 +60,7 @@ static integer c__1 = 1;
|
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
/* Local variables */
|
|
63
|
-
_Thread_local
|
|
63
|
+
static _Thread_local integer ld, lr, lt, lz, lwa, lwn, lss, lxp, lws, lwt, lsy, lwy,
|
|
64
64
|
lsnd;
|
|
65
65
|
|
|
66
66
|
/* -jlm-jn */
|
|
@@ -343,45 +343,45 @@ static double c_b7 = 0.;
|
|
|
343
343
|
fileType o__1=NULL;
|
|
344
344
|
|
|
345
345
|
/* Local variables */
|
|
346
|
-
_Thread_local
|
|
347
|
-
_Thread_local
|
|
348
|
-
_Thread_local
|
|
349
|
-
_Thread_local
|
|
350
|
-
_Thread_local
|
|
351
|
-
_Thread_local
|
|
352
|
-
_Thread_local
|
|
353
|
-
_Thread_local
|
|
354
|
-
_Thread_local
|
|
355
|
-
_Thread_local
|
|
356
|
-
_Thread_local
|
|
357
|
-
_Thread_local
|
|
358
|
-
_Thread_local
|
|
359
|
-
_Thread_local
|
|
360
|
-
_Thread_local
|
|
346
|
+
static _Thread_local integer i__, k;
|
|
347
|
+
static _Thread_local double gd, dr, rr, dtd;
|
|
348
|
+
static _Thread_local integer col;
|
|
349
|
+
static _Thread_local double tol;
|
|
350
|
+
static _Thread_local logical wrk;
|
|
351
|
+
static _Thread_local double stp, cpu1, cpu2;
|
|
352
|
+
static _Thread_local integer head;
|
|
353
|
+
static _Thread_local double fold;
|
|
354
|
+
static _Thread_local integer nact;
|
|
355
|
+
static _Thread_local double ddum;
|
|
356
|
+
static _Thread_local integer info, nseg;
|
|
357
|
+
static _Thread_local double time;
|
|
358
|
+
static _Thread_local integer nfgv, ifun, iter;
|
|
359
|
+
static _Thread_local integer wordTemp;
|
|
360
|
+
static _Thread_local integer *word;
|
|
361
361
|
word = &wordTemp;
|
|
362
|
-
_Thread_local
|
|
363
|
-
_Thread_local
|
|
364
|
-
_Thread_local
|
|
365
|
-
_Thread_local
|
|
366
|
-
_Thread_local
|
|
367
|
-
_Thread_local
|
|
368
|
-
_Thread_local
|
|
369
|
-
_Thread_local
|
|
370
|
-
_Thread_local
|
|
371
|
-
_Thread_local
|
|
372
|
-
_Thread_local
|
|
373
|
-
_Thread_local
|
|
374
|
-
_Thread_local
|
|
375
|
-
_Thread_local
|
|
376
|
-
_Thread_local
|
|
377
|
-
_Thread_local
|
|
378
|
-
_Thread_local
|
|
379
|
-
_Thread_local
|
|
380
|
-
_Thread_local
|
|
381
|
-
_Thread_local
|
|
382
|
-
_Thread_local
|
|
383
|
-
_Thread_local
|
|
384
|
-
_Thread_local
|
|
362
|
+
static _Thread_local double time1, time2;
|
|
363
|
+
static _Thread_local integer iback;
|
|
364
|
+
static _Thread_local double gdold;
|
|
365
|
+
static _Thread_local integer nfree;
|
|
366
|
+
static _Thread_local logical boxed;
|
|
367
|
+
static _Thread_local integer itail;
|
|
368
|
+
static _Thread_local double theta;
|
|
369
|
+
static _Thread_local double dnorm;
|
|
370
|
+
static _Thread_local integer nskip, iword;
|
|
371
|
+
static _Thread_local double xstep, stpmx;
|
|
372
|
+
static _Thread_local integer ileave;
|
|
373
|
+
static _Thread_local double cachyt;
|
|
374
|
+
static _Thread_local integer itfile;
|
|
375
|
+
static _Thread_local double epsmch;
|
|
376
|
+
static _Thread_local logical updatd;
|
|
377
|
+
static _Thread_local double sbtime;
|
|
378
|
+
static _Thread_local logical prjctd;
|
|
379
|
+
static _Thread_local integer iupdat;
|
|
380
|
+
static _Thread_local double sbgnrm;
|
|
381
|
+
static _Thread_local logical cnstnd;
|
|
382
|
+
static _Thread_local integer nenter;
|
|
383
|
+
static _Thread_local double lnscht;
|
|
384
|
+
static _Thread_local integer nintol;
|
|
385
385
|
|
|
386
386
|
/* -jlm-jn */
|
|
387
387
|
/* ************ */
|
|
@@ -5,10 +5,20 @@
|
|
|
5
5
|
#ifndef lbfgsb_h
|
|
6
6
|
#define lbfgsb_h
|
|
7
7
|
|
|
8
|
-
/*
|
|
9
|
-
*
|
|
8
|
+
/* Portable thread-local shim. The C11 _Thread_local keyword is missing on:
|
|
9
|
+
* - MSVC C mode -> __declspec(thread)
|
|
10
|
+
* - gcc < 4.9 (manylinux2014 aarch64
|
|
11
|
+
* cross toolchain is gcc 4.8; it even
|
|
12
|
+
* accepts -std=c11 without the keyword) -> GNU __thread
|
|
13
|
+
* - any pre-C11 mode -> GNU __thread
|
|
14
|
+
* Modern clang/gcc with C11 keep the native keyword. */
|
|
10
15
|
#if defined(_MSC_VER) && !defined(__clang__)
|
|
11
16
|
#define _Thread_local __declspec(thread)
|
|
17
|
+
#elif defined(__GNUC__) && !defined(__clang__) && \
|
|
18
|
+
(__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 9))
|
|
19
|
+
#define _Thread_local __thread
|
|
20
|
+
#elif !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 201112L)
|
|
21
|
+
#define _Thread_local __thread
|
|
12
22
|
#endif
|
|
13
23
|
|
|
14
24
|
|
|
@@ -43,18 +43,18 @@ static integer c__1 = 1;
|
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
/* Table of constant values */
|
|
46
|
-
_Thread_local
|
|
47
|
-
_Thread_local
|
|
48
|
-
_Thread_local
|
|
49
|
-
_Thread_local
|
|
46
|
+
static _Thread_local double c_b14 = FTOL;
|
|
47
|
+
static _Thread_local double c_b15 = GTOL;
|
|
48
|
+
static _Thread_local double c_b16 = XTOL;
|
|
49
|
+
static _Thread_local double c_b17 = STEPMIN;
|
|
50
50
|
/* System generated locals */
|
|
51
51
|
integer i__1;
|
|
52
52
|
double d__1;
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
/* Local variables */
|
|
56
|
-
_Thread_local
|
|
57
|
-
_Thread_local
|
|
56
|
+
static _Thread_local integer i__;
|
|
57
|
+
static _Thread_local double a1, a2;
|
|
58
58
|
|
|
59
59
|
/* Parameter adjustments */
|
|
60
60
|
--z__;
|
|
@@ -170,10 +170,10 @@ int dcsrch(double *f, double *g, double *stp,
|
|
|
170
170
|
|
|
171
171
|
|
|
172
172
|
/* Local variables */
|
|
173
|
-
_Thread_local
|
|
174
|
-
_Thread_local
|
|
175
|
-
_Thread_local
|
|
176
|
-
_Thread_local
|
|
173
|
+
static _Thread_local double fm, gm, fx, fy, gx, gy, fxm, fym, gxm, gym, stx, sty;
|
|
174
|
+
static _Thread_local integer stage;
|
|
175
|
+
static _Thread_local double finit, ginit, width, ftest, gtest, stmin, stmax, width1;
|
|
176
|
+
static _Thread_local logical brackt;
|
|
177
177
|
|
|
178
178
|
/*
|
|
179
179
|
**********
|
|
@@ -496,7 +496,7 @@ L1000:
|
|
|
496
496
|
double sqrt(double);
|
|
497
497
|
|
|
498
498
|
/* Local variables */
|
|
499
|
-
_Thread_local
|
|
499
|
+
static _Thread_local double p, q, r__, s, sgnd, stpc, stpf, stpq, gamma, theta;
|
|
500
500
|
|
|
501
501
|
/*
|
|
502
502
|
**********
|
|
@@ -18,9 +18,9 @@ int dpofa(double *a, integer *lda, integer *n, integer *
|
|
|
18
18
|
double sqrt(double);
|
|
19
19
|
|
|
20
20
|
/* Local variables */
|
|
21
|
-
_Thread_local
|
|
22
|
-
_Thread_local
|
|
23
|
-
_Thread_local
|
|
21
|
+
static _Thread_local integer j, k;
|
|
22
|
+
static _Thread_local double s, t;
|
|
23
|
+
static _Thread_local integer jm1;
|
|
24
24
|
|
|
25
25
|
/*
|
|
26
26
|
dpofa factors a double precision symmetric positive definite
|
|
@@ -115,8 +115,8 @@ int dtrsl(double *t, integer *ldt, integer *n,
|
|
|
115
115
|
integer t_dim1, t_offset, i__1, i__2;
|
|
116
116
|
|
|
117
117
|
/* Local variables */
|
|
118
|
-
_Thread_local
|
|
119
|
-
_Thread_local
|
|
118
|
+
static _Thread_local integer j, jj, case__;
|
|
119
|
+
static _Thread_local double temp;
|
|
120
120
|
/*
|
|
121
121
|
extern double ddot(integer *, double *, integer *, double *,
|
|
122
122
|
integer *);
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
integer i__1;
|
|
53
53
|
|
|
54
54
|
/* Local variables */
|
|
55
|
-
_Thread_local
|
|
55
|
+
static _Thread_local integer i, m, ix, iy, mp1;
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
/* constant times a vector plus a vector.
|
|
@@ -139,7 +139,7 @@ L40:
|
|
|
139
139
|
integer i__1;
|
|
140
140
|
|
|
141
141
|
/* Local variables */
|
|
142
|
-
_Thread_local
|
|
142
|
+
static _Thread_local integer i, m, ix, iy, mp1;
|
|
143
143
|
|
|
144
144
|
|
|
145
145
|
/* copies a vector, x, to a vector, y.
|
|
@@ -226,9 +226,9 @@ double ddotRef(integer *n, double *dx, integer *incx, double *dy,
|
|
|
226
226
|
double ret_val;
|
|
227
227
|
|
|
228
228
|
/* Local variables */
|
|
229
|
-
_Thread_local
|
|
230
|
-
_Thread_local
|
|
231
|
-
_Thread_local
|
|
229
|
+
static _Thread_local integer i, m;
|
|
230
|
+
static _Thread_local double dtemp;
|
|
231
|
+
static _Thread_local integer ix, iy, mp1;
|
|
232
232
|
|
|
233
233
|
|
|
234
234
|
/* forms the dot product of two vectors.
|
|
@@ -314,7 +314,7 @@ L60:
|
|
|
314
314
|
integer i__1, i__2;
|
|
315
315
|
|
|
316
316
|
/* Local variables */
|
|
317
|
-
_Thread_local
|
|
317
|
+
static _Thread_local integer i, m, nincx, mp1;
|
|
318
318
|
|
|
319
319
|
|
|
320
320
|
/* scales a vector by a constant.
|
|
@@ -30,7 +30,7 @@ int prn1lb(integer *n, integer *m, double *l,
|
|
|
30
30
|
integer i__1;
|
|
31
31
|
|
|
32
32
|
/* Local variables */
|
|
33
|
-
_Thread_local
|
|
33
|
+
static _Thread_local integer i__;
|
|
34
34
|
|
|
35
35
|
/* Parameter adjustments */
|
|
36
36
|
--x;
|
|
@@ -103,7 +103,7 @@ int prn1lb(integer *n, integer *m, double *l,
|
|
|
103
103
|
integer i__1;
|
|
104
104
|
|
|
105
105
|
/* Local variables */
|
|
106
|
-
_Thread_local
|
|
106
|
+
static _Thread_local integer i__, imod;
|
|
107
107
|
|
|
108
108
|
/* Parameter adjustments */
|
|
109
109
|
--g;
|
|
@@ -186,7 +186,7 @@ int prn3lb(integer *n, double *x, double *f, integer *
|
|
|
186
186
|
integer i__1;
|
|
187
187
|
|
|
188
188
|
/* Local variables */
|
|
189
|
-
_Thread_local
|
|
189
|
+
static _Thread_local integer i__;
|
|
190
190
|
/* Parameter adjustments */
|
|
191
191
|
--x;
|
|
192
192
|
|
|
@@ -304,7 +304,7 @@ int errclb(integer *n, integer *m, double *factr,
|
|
|
304
304
|
integer i__1;
|
|
305
305
|
|
|
306
306
|
/* Local variables */
|
|
307
|
-
_Thread_local
|
|
307
|
+
static _Thread_local integer i__;
|
|
308
308
|
|
|
309
309
|
/* Parameter adjustments */
|
|
310
310
|
--nbd;
|
|
@@ -12,7 +12,7 @@ static integer c__11 = 11;
|
|
|
12
12
|
integer i__1;
|
|
13
13
|
|
|
14
14
|
/* Local variables */
|
|
15
|
-
_Thread_local
|
|
15
|
+
static _Thread_local integer i__, nbdd;
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
/* ************ */
|
|
@@ -127,8 +127,8 @@ static integer c__11 = 11;
|
|
|
127
127
|
double sqrt(double);
|
|
128
128
|
|
|
129
129
|
/* Local variables */
|
|
130
|
-
_Thread_local
|
|
131
|
-
_Thread_local
|
|
130
|
+
static _Thread_local integer i__, k, i2;
|
|
131
|
+
static _Thread_local double sum;
|
|
132
132
|
|
|
133
133
|
/* ************ */
|
|
134
134
|
|
|
@@ -275,28 +275,28 @@ static integer c__11 = 11;
|
|
|
275
275
|
|
|
276
276
|
|
|
277
277
|
/* Local variables */
|
|
278
|
-
_Thread_local
|
|
279
|
-
_Thread_local
|
|
280
|
-
_Thread_local
|
|
281
|
-
_Thread_local
|
|
278
|
+
static _Thread_local integer i__, j;
|
|
279
|
+
static _Thread_local double f1, f2, dt, tj, tl, tu, tj0;
|
|
280
|
+
static _Thread_local integer ibp;
|
|
281
|
+
static _Thread_local double dtm;
|
|
282
282
|
extern /* Subroutine */ int bmv(integer *, double *, double *,
|
|
283
283
|
integer *, double *, double *, integer *);
|
|
284
|
-
_Thread_local
|
|
285
|
-
_Thread_local
|
|
286
|
-
_Thread_local
|
|
287
|
-
_Thread_local
|
|
288
|
-
_Thread_local
|
|
289
|
-
_Thread_local
|
|
290
|
-
_Thread_local
|
|
291
|
-
_Thread_local
|
|
292
|
-
_Thread_local
|
|
293
|
-
_Thread_local
|
|
294
|
-
_Thread_local
|
|
295
|
-
_Thread_local
|
|
284
|
+
static _Thread_local double wmc, wmp, wmw;
|
|
285
|
+
static _Thread_local integer col2;
|
|
286
|
+
static _Thread_local double dibp;
|
|
287
|
+
static _Thread_local integer iter;
|
|
288
|
+
static _Thread_local double zibp, tsum, dibp2;
|
|
289
|
+
static _Thread_local logical bnded;
|
|
290
|
+
static _Thread_local double neggi;
|
|
291
|
+
static _Thread_local integer nfree;
|
|
292
|
+
static _Thread_local double bkmin;
|
|
293
|
+
static _Thread_local integer nleft;
|
|
294
|
+
static _Thread_local double f2_org__;
|
|
295
|
+
static _Thread_local integer nbreak, ibkmin;
|
|
296
296
|
extern /* Subroutine */ int hpsolb(integer *, double *, integer *,
|
|
297
297
|
integer *);
|
|
298
|
-
_Thread_local
|
|
299
|
-
_Thread_local
|
|
298
|
+
static _Thread_local integer pointr;
|
|
299
|
+
static _Thread_local logical xlower, xupper;
|
|
300
300
|
|
|
301
301
|
/* ************ */
|
|
302
302
|
|
|
@@ -828,11 +828,11 @@ L999:
|
|
|
828
828
|
wt_dim1, wt_offset, i__1, i__2;
|
|
829
829
|
|
|
830
830
|
/* Local variables */
|
|
831
|
-
_Thread_local
|
|
832
|
-
_Thread_local
|
|
831
|
+
static _Thread_local integer i__, j, k;
|
|
832
|
+
static _Thread_local double a1, a2;
|
|
833
833
|
extern /* Subroutine */ int bmv(integer *, double *, double *,
|
|
834
834
|
integer *, double *, double *, integer *);
|
|
835
|
-
_Thread_local
|
|
835
|
+
static _Thread_local integer pointr;
|
|
836
836
|
|
|
837
837
|
/* ************ */
|
|
838
838
|
|
|
@@ -928,10 +928,10 @@ L999:
|
|
|
928
928
|
wy_dim1, wy_offset, sy_dim1, sy_offset, i__1, i__2, i__3;
|
|
929
929
|
|
|
930
930
|
/* Local variables */
|
|
931
|
-
_Thread_local
|
|
932
|
-
_Thread_local
|
|
933
|
-
_Thread_local
|
|
934
|
-
_Thread_local
|
|
931
|
+
static _Thread_local integer i__, k, k1, m2, is, js, iy, jy, is1, js1, col2, dend, pend;
|
|
932
|
+
static _Thread_local integer upcl;
|
|
933
|
+
static _Thread_local double temp1, temp2, temp3, temp4;
|
|
934
|
+
static _Thread_local integer ipntr, jpntr, dbegin, pbegin;
|
|
935
935
|
|
|
936
936
|
/* ************ */
|
|
937
937
|
|
|
@@ -1310,8 +1310,8 @@ L999:
|
|
|
1310
1310
|
i__2, i__3;
|
|
1311
1311
|
|
|
1312
1312
|
/* Local variables */
|
|
1313
|
-
_Thread_local
|
|
1314
|
-
_Thread_local
|
|
1313
|
+
static _Thread_local integer i__, j, k, k1;
|
|
1314
|
+
static _Thread_local double ddum;
|
|
1315
1315
|
|
|
1316
1316
|
/* ************ */
|
|
1317
1317
|
|
|
@@ -1399,7 +1399,7 @@ L999:
|
|
|
1399
1399
|
integer i__1;
|
|
1400
1400
|
|
|
1401
1401
|
/* Local variables */
|
|
1402
|
-
_Thread_local
|
|
1402
|
+
static _Thread_local integer i__, k, iact;
|
|
1403
1403
|
|
|
1404
1404
|
|
|
1405
1405
|
/* ************ */
|
|
@@ -1517,9 +1517,9 @@ L999:
|
|
|
1517
1517
|
integer i__1;
|
|
1518
1518
|
|
|
1519
1519
|
/* Local variables */
|
|
1520
|
-
_Thread_local
|
|
1521
|
-
_Thread_local
|
|
1522
|
-
_Thread_local
|
|
1520
|
+
static _Thread_local integer i__, j, k;
|
|
1521
|
+
static _Thread_local double out, ddum;
|
|
1522
|
+
static _Thread_local integer indxin, indxou;
|
|
1523
1523
|
|
|
1524
1524
|
/* ************ */
|
|
1525
1525
|
|
|
@@ -1639,8 +1639,8 @@ L30:
|
|
|
1639
1639
|
ss_dim1, ss_offset, i__1, i__2;
|
|
1640
1640
|
|
|
1641
1641
|
/* Local variables */
|
|
1642
|
-
_Thread_local
|
|
1643
|
-
_Thread_local
|
|
1642
|
+
static _Thread_local integer j;
|
|
1643
|
+
static _Thread_local integer pointr;
|
|
1644
1644
|
|
|
1645
1645
|
/* ************ */
|
|
1646
1646
|
|
|
@@ -1746,8 +1746,8 @@ L30:
|
|
|
1746
1746
|
double d__1, d__2;
|
|
1747
1747
|
|
|
1748
1748
|
/* Local variables */
|
|
1749
|
-
_Thread_local
|
|
1750
|
-
_Thread_local
|
|
1749
|
+
static _Thread_local integer i__;
|
|
1750
|
+
static _Thread_local double gi;
|
|
1751
1751
|
|
|
1752
1752
|
/* ************ */
|
|
1753
1753
|
|
|
@@ -1827,13 +1827,13 @@ L30:
|
|
|
1827
1827
|
double d__1, d__2;
|
|
1828
1828
|
|
|
1829
1829
|
/* Local variables */
|
|
1830
|
-
_Thread_local
|
|
1831
|
-
_Thread_local
|
|
1832
|
-
_Thread_local
|
|
1833
|
-
_Thread_local
|
|
1834
|
-
_Thread_local
|
|
1835
|
-
_Thread_local
|
|
1836
|
-
_Thread_local
|
|
1830
|
+
static _Thread_local integer i__, j, k, m2;
|
|
1831
|
+
static _Thread_local double dk;
|
|
1832
|
+
static _Thread_local integer js, jy;
|
|
1833
|
+
static _Thread_local double xk;
|
|
1834
|
+
static _Thread_local integer ibd, col2;
|
|
1835
|
+
static _Thread_local double dd_p__, temp1, temp2, alpha;
|
|
1836
|
+
static _Thread_local integer pointr;
|
|
1837
1837
|
|
|
1838
1838
|
/* ********************************************************************** */
|
|
1839
1839
|
|
|
@@ -4,7 +4,7 @@ build-backend = "maturin"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "rustima"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.3.0"
|
|
8
8
|
requires-python = ">=3.10"
|
|
9
9
|
description = "High-performance SARIMAX (Seasonal ARIMA with eXogenous regressors) engine in Rust with statsmodels-compatible Python API"
|
|
10
10
|
readme = "README.md"
|
|
@@ -14,15 +14,15 @@ import os as _os
|
|
|
14
14
|
if "RAYON_NUM_THREADS" not in _os.environ:
|
|
15
15
|
import sys as _sys
|
|
16
16
|
if _sys.platform == "darwin":
|
|
17
|
+
import subprocess as _sp
|
|
17
18
|
try:
|
|
18
|
-
import subprocess as _sp
|
|
19
19
|
_n = _sp.check_output(
|
|
20
20
|
["sysctl", "-n", "hw.perflevel0.physicalcpu"],
|
|
21
21
|
stderr=_sp.DEVNULL, timeout=2,
|
|
22
22
|
).decode().strip()
|
|
23
23
|
if _n.isdigit() and int(_n) > 0:
|
|
24
24
|
_os.environ["RAYON_NUM_THREADS"] = _n
|
|
25
|
-
except
|
|
25
|
+
except (OSError, _sp.SubprocessError, UnicodeDecodeError):
|
|
26
26
|
pass
|
|
27
27
|
|
|
28
28
|
# Native extension module — maturin places the .so here automatically.
|