@sipemu/anofox-forecast 0.4.5 → 0.4.7

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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @sipemu/anofox-forecast
2
2
 
3
- WebAssembly bindings for [anofox-forecast](https://crates.io/crates/anofox-forecast), a comprehensive time series forecasting library with 40+ models, automatic model selection, probabilistic postprocessing, and more.
3
+ WebAssembly bindings for [anofox-forecast](https://crates.io/crates/anofox-forecast), a comprehensive time series forecasting library with 50+ models, automatic model selection, probabilistic postprocessing, and more.
4
4
 
5
5
  ## Installation
6
6
 
@@ -281,8 +281,7 @@ const forecast = model.predict(10);
281
281
  ## Limitations
282
282
 
283
283
  - The `parallel` feature from the Rust crate is not available in WASM
284
- - Postprocessing features (conformal prediction, IDR) are not yet exposed
285
- - Cross-validation utilities are not yet exposed
284
+ - IDR (Isotonic Distributional Regression) and QRA are not yet exposed in WASM
286
285
 
287
286
  ## License
288
287
 
@@ -123,6 +123,51 @@ export class AutoEnsembleForecaster {
123
123
  readonly name: string;
124
124
  }
125
125
 
126
+ export class AutoForecastBuilder {
127
+ free(): void;
128
+ [Symbol.dispose](): void;
129
+ /**
130
+ * Include or exclude AutoETS from the candidate set.
131
+ *
132
+ * @param include - Whether to include AutoETS (default: true)
133
+ */
134
+ includeEts(include: boolean): AutoForecastBuilder;
135
+ /**
136
+ * Include or exclude AutoARIMA from the candidate set.
137
+ *
138
+ * @param include - Whether to include AutoARIMA (default: true)
139
+ */
140
+ includeArima(include: boolean): AutoForecastBuilder;
141
+ /**
142
+ * Include or exclude AutoTheta from the candidate set.
143
+ *
144
+ * @param include - Whether to include AutoTheta (default: true)
145
+ */
146
+ includeTheta(include: boolean): AutoForecastBuilder;
147
+ /**
148
+ * Set the seasonal period.
149
+ *
150
+ * @param period - Seasonal period (e.g., 12 for monthly data)
151
+ */
152
+ seasonalPeriod(period: number): AutoForecastBuilder;
153
+ /**
154
+ * Use cross-validation instead of in-sample MSE for model selection.
155
+ *
156
+ * @param useCv - Whether to use cross-validation (default: false)
157
+ */
158
+ useCrossValidation(use_cv: boolean): AutoForecastBuilder;
159
+ /**
160
+ * Create a new builder with all defaults enabled.
161
+ */
162
+ constructor();
163
+ /**
164
+ * Build the AutoForecaster with the configured parameters.
165
+ *
166
+ * @returns A new AutoForecaster ready to fit
167
+ */
168
+ build(): AutoForecaster;
169
+ }
170
+
126
171
  export class AutoForecaster {
127
172
  free(): void;
128
173
  [Symbol.dispose](): void;
@@ -390,6 +435,15 @@ export class EnsembleForecaster {
390
435
  * Set the combination method to median.
391
436
  */
392
437
  setMedian(): void;
438
+ /**
439
+ * Set the combination method by name string.
440
+ *
441
+ * Supported values: "mean", "median", "weighted_mse", "inverse_aic",
442
+ * "stacking", "horizon_adaptive".
443
+ *
444
+ * @param method - Combination method name
445
+ */
446
+ setMethod(method: string): void;
393
447
  /**
394
448
  * Get the number of models in the ensemble.
395
449
  */
@@ -402,10 +456,31 @@ export class EnsembleForecaster {
402
456
  * @param weights - Array of combination weights
403
457
  */
404
458
  setWeights(weights: Float64Array): void;
459
+ /**
460
+ * Set the combination method to stacking (projected gradient descent).
461
+ *
462
+ * Trains non-negative weights that sum to one on validation data.
463
+ *
464
+ * @param folds - Number of folds (default: 5)
465
+ */
466
+ setStacking(folds?: number | null): void;
467
+ /**
468
+ * Set the combination method to inverse AIC weighting.
469
+ *
470
+ * Computes Akaike weights from in-sample residuals.
471
+ */
472
+ setInverseAic(): void;
405
473
  /**
406
474
  * Set the combination method to weighted MSE.
407
475
  */
408
476
  setWeightedMse(): void;
477
+ /**
478
+ * Set the combination method to per-horizon adaptive weighting.
479
+ *
480
+ * Computes separate weight vectors for each forecast horizon step
481
+ * based on rolling-origin evaluation.
482
+ */
483
+ setHorizonAdaptive(): void;
409
484
  /**
410
485
  * Predict with prediction intervals.
411
486
  *
@@ -446,6 +521,22 @@ export class Forecast {
446
521
  private constructor();
447
522
  free(): void;
448
523
  [Symbol.dispose](): void;
524
+ /**
525
+ * Return a new forecast with all values clamped to be non-negative.
526
+ */
527
+ nonNegative(): Forecast;
528
+ /**
529
+ * Return a new forecast with point values rounded to the nearest integer,
530
+ * lower intervals floored, and upper intervals ceiled.
531
+ */
532
+ roundToInteger(): Forecast;
533
+ /**
534
+ * Return a new forecast with all values clamped to `[lower, upper]`.
535
+ *
536
+ * @param lower - Lower bound
537
+ * @param upper - Upper bound
538
+ */
539
+ clamp(lower: number, upper: number): Forecast;
449
540
  /**
450
541
  * Check if lower prediction interval is available.
451
542
  */
@@ -692,6 +783,63 @@ export class JsHistoricalSimulator {
692
783
  simulate(forecasts: Float64Array, actuals: Float64Array): JsHistoricalSimResult;
693
784
  }
694
785
 
786
+ export class JsModelDiagnostics {
787
+ private constructor();
788
+ free(): void;
789
+ [Symbol.dispose](): void;
790
+ /**
791
+ * Create diagnostics from an array of residuals.
792
+ *
793
+ * @param residuals - Array of model residuals
794
+ * @param significance - Significance level for tests (e.g., 0.05)
795
+ */
796
+ static fromResiduals(residuals: Float64Array, significance: number): JsModelDiagnostics;
797
+ /**
798
+ * Get a human-readable summary of the diagnostics.
799
+ */
800
+ summary(): string;
801
+ /**
802
+ * Whether all diagnostic tests pass at the configured significance level.
803
+ */
804
+ readonly passesAll: boolean;
805
+ /**
806
+ * Autocorrelation function of the residuals.
807
+ */
808
+ readonly residualAcf: Float64Array;
809
+ /**
810
+ * Standard deviation of the residuals.
811
+ */
812
+ readonly residualStd: number;
813
+ /**
814
+ * Mean of the residuals.
815
+ */
816
+ readonly residualMean: number;
817
+ /**
818
+ * Partial autocorrelation function of the residuals.
819
+ */
820
+ readonly residualPacf: Float64Array;
821
+ /**
822
+ * Number of lags used in the Ljung-Box test.
823
+ */
824
+ readonly ljungBoxLags: number;
825
+ /**
826
+ * Ljung-Box test p-value for autocorrelation.
827
+ */
828
+ readonly ljungBoxPvalue: number;
829
+ /**
830
+ * Jarque-Bera test p-value.
831
+ */
832
+ readonly jarqueBeraPvalue: number;
833
+ /**
834
+ * Jarque-Bera test statistic for normality.
835
+ */
836
+ readonly jarqueBeraStatistic: number;
837
+ /**
838
+ * Breusch-Pagan heteroscedasticity test p-value.
839
+ */
840
+ readonly heteroscedasticityPvalue: number;
841
+ }
842
+
695
843
  export class JsNormalPredictor {
696
844
  free(): void;
697
845
  [Symbol.dispose](): void;
@@ -832,6 +980,59 @@ export class JsTrainedModel {
832
980
  [Symbol.dispose](): void;
833
981
  }
834
982
 
983
+ export class KalmanForecaster {
984
+ private constructor();
985
+ free(): void;
986
+ [Symbol.dispose](): void;
987
+ /**
988
+ * Create a local level (random walk plus noise) model.
989
+ *
990
+ * @param obs_noise - Observation noise variance
991
+ * @param state_noise - State (level) noise variance
992
+ */
993
+ static localLevel(obs_noise: number, state_noise: number): KalmanForecaster;
994
+ /**
995
+ * Create a local linear trend model.
996
+ *
997
+ * @param obs_noise - Observation noise variance
998
+ * @param level_noise - Level noise variance
999
+ * @param trend_noise - Trend noise variance
1000
+ */
1001
+ static localLinearTrend(obs_noise: number, level_noise: number, trend_noise: number): KalmanForecaster;
1002
+ /**
1003
+ * Predict with prediction intervals.
1004
+ *
1005
+ * @param horizon - Number of steps to forecast
1006
+ * @param level - Confidence level (e.g., 0.95 for 95% intervals)
1007
+ * @returns Forecast with predictions and intervals
1008
+ */
1009
+ predictWithIntervals(horizon: number, level: number): Forecast;
1010
+ /**
1011
+ * Fit the Kalman filter to a time series.
1012
+ *
1013
+ * @param series - TimeSeries to fit
1014
+ */
1015
+ fit(series: TimeSeries): void;
1016
+ /**
1017
+ * Apply the Kalman smoother (RTS smoother) and return smoothed observations.
1018
+ *
1019
+ * @param series - TimeSeries to smooth
1020
+ * @returns Array of smoothed observation values
1021
+ */
1022
+ smooth(series: TimeSeries): Float64Array;
1023
+ /**
1024
+ * Predict future values.
1025
+ *
1026
+ * @param horizon - Number of steps to forecast
1027
+ * @returns Forecast with point predictions
1028
+ */
1029
+ predict(horizon: number): Forecast;
1030
+ /**
1031
+ * Get the model name.
1032
+ */
1033
+ readonly name: string;
1034
+ }
1035
+
835
1036
  export class MFLESForecaster {
836
1037
  free(): void;
837
1038
  [Symbol.dispose](): void;
@@ -1111,6 +1312,48 @@ export class TimeSeries {
1111
1312
  readonly values: Float64Array;
1112
1313
  }
1113
1314
 
1315
+ export class VARForecaster {
1316
+ free(): void;
1317
+ [Symbol.dispose](): void;
1318
+ /**
1319
+ * Fit the VAR model to multivariate time series data.
1320
+ *
1321
+ * @param data - Array of Float64Arrays, one per variable. All must have the same length.
1322
+ */
1323
+ fitMultivariate(data: Array<any>): void;
1324
+ /**
1325
+ * Predict future values for all variables.
1326
+ *
1327
+ * @param horizon - Number of steps to forecast
1328
+ * @returns Array of Float64Arrays, one per variable
1329
+ */
1330
+ predictMultivariate(horizon: number): Array<any>;
1331
+ /**
1332
+ * Perform a Granger causality test.
1333
+ *
1334
+ * Tests whether variable `cause` Granger-causes variable `effect`.
1335
+ *
1336
+ * @param cause - Index of the potentially causal variable (0-based)
1337
+ * @param effect - Index of the effect variable (0-based)
1338
+ * @returns F-statistic. Higher values indicate stronger evidence of causality.
1339
+ */
1340
+ grangerCausalityTest(cause: number, effect: number): number;
1341
+ /**
1342
+ * Create a new VAR forecaster with the given lag order.
1343
+ *
1344
+ * @param order - Number of lags (p). Must be at least 1.
1345
+ */
1346
+ constructor(order: number);
1347
+ /**
1348
+ * Get the model name.
1349
+ */
1350
+ readonly name: string;
1351
+ /**
1352
+ * Get the lag order.
1353
+ */
1354
+ readonly order: number;
1355
+ }
1356
+
1114
1357
  export class WindowAverageForecaster {
1115
1358
  free(): void;
1116
1359
  [Symbol.dispose](): void;
@@ -1399,6 +1642,7 @@ export interface InitOutput {
1399
1642
  readonly __wbg_autoarimaforecaster_free: (a: number, b: number) => void;
1400
1643
  readonly __wbg_autoensembleforecaster_free: (a: number, b: number) => void;
1401
1644
  readonly __wbg_autoetsforecaster_free: (a: number, b: number) => void;
1645
+ readonly __wbg_autoforecastbuilder_free: (a: number, b: number) => void;
1402
1646
  readonly __wbg_autoforecaster_free: (a: number, b: number) => void;
1403
1647
  readonly __wbg_autotbatsforecaster_free: (a: number, b: number) => void;
1404
1648
  readonly __wbg_autothetaforecaster_free: (a: number, b: number) => void;
@@ -1418,12 +1662,14 @@ export interface InitOutput {
1418
1662
  readonly __wbg_jsconformalresult_free: (a: number, b: number) => void;
1419
1663
  readonly __wbg_jshistoricalsimresult_free: (a: number, b: number) => void;
1420
1664
  readonly __wbg_jshistoricalsimulator_free: (a: number, b: number) => void;
1665
+ readonly __wbg_jsmodeldiagnostics_free: (a: number, b: number) => void;
1421
1666
  readonly __wbg_jsnormalpredictor_free: (a: number, b: number) => void;
1422
1667
  readonly __wbg_jsnormalresult_free: (a: number, b: number) => void;
1423
1668
  readonly __wbg_jspointforecasts_free: (a: number, b: number) => void;
1424
1669
  readonly __wbg_jspostprocessor_free: (a: number, b: number) => void;
1425
1670
  readonly __wbg_jspredictionintervals_free: (a: number, b: number) => void;
1426
1671
  readonly __wbg_jstrainedmodel_free: (a: number, b: number) => void;
1672
+ readonly __wbg_kalmanforecaster_free: (a: number, b: number) => void;
1427
1673
  readonly __wbg_meanforecaster_free: (a: number, b: number) => void;
1428
1674
  readonly __wbg_mflesforecaster_free: (a: number, b: number) => void;
1429
1675
  readonly __wbg_mstlforecasterwrapper_free: (a: number, b: number) => void;
@@ -1435,10 +1681,10 @@ export interface InitOutput {
1435
1681
  readonly __wbg_seasonalnaiveforecaster_free: (a: number, b: number) => void;
1436
1682
  readonly __wbg_seasonalwindowaverageforecaster_free: (a: number, b: number) => void;
1437
1683
  readonly __wbg_sesforecaster_free: (a: number, b: number) => void;
1438
- readonly __wbg_smaforecaster_free: (a: number, b: number) => void;
1439
1684
  readonly __wbg_tbatsforecaster_free: (a: number, b: number) => void;
1440
1685
  readonly __wbg_thetaforecaster_free: (a: number, b: number) => void;
1441
1686
  readonly __wbg_timeseries_free: (a: number, b: number) => void;
1687
+ readonly __wbg_varforecaster_free: (a: number, b: number) => void;
1442
1688
  readonly adfTest: (a: number, b: number, c: number) => [number, number, number];
1443
1689
  readonly adidaforecaster_fit: (a: number, b: number) => [number, number];
1444
1690
  readonly adidaforecaster_name: (a: number) => [number, number];
@@ -1473,6 +1719,13 @@ export interface InitOutput {
1473
1719
  readonly autoetsforecaster_predict: (a: number, b: number) => [number, number, number];
1474
1720
  readonly autoetsforecaster_withConfig: (a: number, b: number, c: number, d: number) => number;
1475
1721
  readonly autoetsforecaster_withPeriod: (a: number) => number;
1722
+ readonly autoforecastbuilder_build: (a: number) => number;
1723
+ readonly autoforecastbuilder_includeArima: (a: number, b: number) => number;
1724
+ readonly autoforecastbuilder_includeEts: (a: number, b: number) => number;
1725
+ readonly autoforecastbuilder_includeTheta: (a: number, b: number) => number;
1726
+ readonly autoforecastbuilder_new: () => number;
1727
+ readonly autoforecastbuilder_seasonalPeriod: (a: number, b: number) => number;
1728
+ readonly autoforecastbuilder_useCrossValidation: (a: number, b: number) => number;
1476
1729
  readonly autoforecaster_allScores: (a: number) => [number, number, number];
1477
1730
  readonly autoforecaster_fit: (a: number, b: number) => [number, number];
1478
1731
  readonly autoforecaster_name: (a: number) => [number, number];
@@ -1530,7 +1783,11 @@ export interface InitOutput {
1530
1783
  readonly ensembleforecaster_new: (a: number, b: number) => [number, number, number];
1531
1784
  readonly ensembleforecaster_predict: (a: number, b: number) => [number, number, number];
1532
1785
  readonly ensembleforecaster_predictWithIntervals: (a: number, b: number, c: number) => [number, number, number];
1786
+ readonly ensembleforecaster_setHorizonAdaptive: (a: number) => void;
1787
+ readonly ensembleforecaster_setInverseAic: (a: number) => void;
1533
1788
  readonly ensembleforecaster_setMedian: (a: number) => void;
1789
+ readonly ensembleforecaster_setMethod: (a: number, b: number, c: number) => [number, number];
1790
+ readonly ensembleforecaster_setStacking: (a: number, b: number) => void;
1534
1791
  readonly ensembleforecaster_setWeightedMse: (a: number) => void;
1535
1792
  readonly ensembleforecaster_setWeights: (a: number, b: number, c: number) => void;
1536
1793
  readonly etsforecaster_fit: (a: number, b: number) => [number, number];
@@ -1539,10 +1796,13 @@ export interface InitOutput {
1539
1796
  readonly etsforecaster_name: (a: number) => [number, number];
1540
1797
  readonly etsforecaster_new: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number];
1541
1798
  readonly etsforecaster_predict: (a: number, b: number) => [number, number, number];
1799
+ readonly forecast_clamp: (a: number, b: number, c: number) => number;
1542
1800
  readonly forecast_hasLower: (a: number) => number;
1543
1801
  readonly forecast_hasUpper: (a: number) => number;
1544
1802
  readonly forecast_horizon: (a: number) => number;
1545
1803
  readonly forecast_lower: (a: number) => [number, number];
1804
+ readonly forecast_nonNegative: (a: number) => number;
1805
+ readonly forecast_roundToInteger: (a: number) => number;
1546
1806
  readonly forecast_upper: (a: number) => [number, number];
1547
1807
  readonly forecast_values: (a: number) => [number, number];
1548
1808
  readonly garchforecaster_fit: (a: number, b: number) => [number, number];
@@ -1592,11 +1852,19 @@ export interface InitOutput {
1592
1852
  readonly jshistoricalsimulator_predictIntervals: (a: number, b: number, c: number, d: number) => [number, number, number];
1593
1853
  readonly jshistoricalsimulator_simulate: (a: number, b: number, c: number, d: number, e: number) => [number, number, number];
1594
1854
  readonly jshistoricalsimulator_withWindow: (a: number, b: number, c: number) => number;
1855
+ readonly jsmodeldiagnostics_fromResiduals: (a: number, b: number, c: number) => number;
1856
+ readonly jsmodeldiagnostics_jarqueBeraStatistic: (a: number) => number;
1857
+ readonly jsmodeldiagnostics_ljungBoxLags: (a: number) => number;
1858
+ readonly jsmodeldiagnostics_ljungBoxPvalue: (a: number) => number;
1859
+ readonly jsmodeldiagnostics_passesAll: (a: number) => number;
1860
+ readonly jsmodeldiagnostics_residualAcf: (a: number) => [number, number];
1861
+ readonly jsmodeldiagnostics_residualMean: (a: number) => number;
1862
+ readonly jsmodeldiagnostics_residualPacf: (a: number) => [number, number];
1863
+ readonly jsmodeldiagnostics_residualStd: (a: number) => number;
1864
+ readonly jsmodeldiagnostics_summary: (a: number) => [number, number];
1595
1865
  readonly jsnormalpredictor_fit: (a: number, b: number, c: number, d: number, e: number) => [number, number, number];
1596
1866
  readonly jsnormalpredictor_new: (a: number, b: number) => number;
1597
1867
  readonly jsnormalpredictor_predictIntervals: (a: number, b: number, c: number, d: number) => [number, number, number];
1598
- readonly jsnormalresult_mean: (a: number) => number;
1599
- readonly jsnormalresult_stdDev: (a: number) => number;
1600
1868
  readonly jspointforecasts_isEmpty: (a: number) => number;
1601
1869
  readonly jspointforecasts_length: (a: number) => number;
1602
1870
  readonly jspointforecasts_new: (a: number, b: number) => number;
@@ -1612,6 +1880,13 @@ export interface InitOutput {
1612
1880
  readonly jspredictionintervals_midpoints: (a: number) => [number, number];
1613
1881
  readonly jspredictionintervals_upper: (a: number) => [number, number];
1614
1882
  readonly jspredictionintervals_widths: (a: number) => [number, number];
1883
+ readonly kalmanforecaster_fit: (a: number, b: number) => [number, number];
1884
+ readonly kalmanforecaster_localLevel: (a: number, b: number) => number;
1885
+ readonly kalmanforecaster_localLinearTrend: (a: number, b: number, c: number) => number;
1886
+ readonly kalmanforecaster_name: (a: number) => [number, number];
1887
+ readonly kalmanforecaster_predict: (a: number, b: number) => [number, number, number];
1888
+ readonly kalmanforecaster_predictWithIntervals: (a: number, b: number, c: number) => [number, number, number];
1889
+ readonly kalmanforecaster_smooth: (a: number, b: number) => [number, number, number, number];
1615
1890
  readonly kpssTest: (a: number, b: number, c: number) => [number, number, number];
1616
1891
  readonly kurtosis: (a: number, b: number) => number;
1617
1892
  readonly ljungBox: (a: number, b: number, c: number, d: number) => [number, number, number];
@@ -1706,6 +1981,12 @@ export interface InitOutput {
1706
1981
  readonly tsbforecaster_new: () => number;
1707
1982
  readonly tsbforecaster_predict: (a: number, b: number) => [number, number, number];
1708
1983
  readonly tsbforecaster_predictWithIntervals: (a: number, b: number, c: number) => [number, number, number];
1984
+ readonly varforecaster_fitMultivariate: (a: number, b: any) => [number, number];
1985
+ readonly varforecaster_grangerCausalityTest: (a: number, b: number, c: number) => [number, number, number];
1986
+ readonly varforecaster_name: (a: number) => [number, number];
1987
+ readonly varforecaster_new: (a: number) => number;
1988
+ readonly varforecaster_order: (a: number) => number;
1989
+ readonly varforecaster_predictMultivariate: (a: number, b: number) => [number, number, number];
1709
1990
  readonly variance: (a: number, b: number) => number;
1710
1991
  readonly version: () => [number, number];
1711
1992
  readonly windowaverageforecaster_fit: (a: number, b: number) => [number, number];
@@ -1713,8 +1994,13 @@ export interface InitOutput {
1713
1994
  readonly windowaverageforecaster_new: (a: number) => number;
1714
1995
  readonly windowaverageforecaster_predict: (a: number, b: number) => [number, number, number];
1715
1996
  readonly tbatsforecaster_withSeasonalPeriods: (a: number, b: number) => number;
1997
+ readonly __wbg_smaforecaster_free: (a: number, b: number) => void;
1716
1998
  readonly __wbg_tsbforecaster_free: (a: number, b: number) => void;
1717
1999
  readonly __wbg_windowaverageforecaster_free: (a: number, b: number) => void;
2000
+ readonly jsmodeldiagnostics_heteroscedasticityPvalue: (a: number) => number;
2001
+ readonly jsmodeldiagnostics_jarqueBeraPvalue: (a: number) => number;
2002
+ readonly jsnormalresult_mean: (a: number) => number;
2003
+ readonly jsnormalresult_stdDev: (a: number) => number;
1718
2004
  readonly jspredictionintervals_coverage: (a: number) => number;
1719
2005
  readonly __wbindgen_malloc: (a: number, b: number) => number;
1720
2006
  readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
@@ -188,6 +188,10 @@ const AutoEnsembleForecasterFinalization = (typeof FinalizationRegistry === 'und
188
188
  ? { register: () => {}, unregister: () => {} }
189
189
  : new FinalizationRegistry(ptr => wasm.__wbg_autoensembleforecaster_free(ptr >>> 0, 1));
190
190
 
191
+ const AutoForecastBuilderFinalization = (typeof FinalizationRegistry === 'undefined')
192
+ ? { register: () => {}, unregister: () => {} }
193
+ : new FinalizationRegistry(ptr => wasm.__wbg_autoforecastbuilder_free(ptr >>> 0, 1));
194
+
191
195
  const AutoForecasterFinalization = (typeof FinalizationRegistry === 'undefined')
192
196
  ? { register: () => {}, unregister: () => {} }
193
197
  : new FinalizationRegistry(ptr => wasm.__wbg_autoforecaster_free(ptr >>> 0, 1));
@@ -264,6 +268,10 @@ const JsHistoricalSimulatorFinalization = (typeof FinalizationRegistry === 'unde
264
268
  ? { register: () => {}, unregister: () => {} }
265
269
  : new FinalizationRegistry(ptr => wasm.__wbg_jshistoricalsimulator_free(ptr >>> 0, 1));
266
270
 
271
+ const JsModelDiagnosticsFinalization = (typeof FinalizationRegistry === 'undefined')
272
+ ? { register: () => {}, unregister: () => {} }
273
+ : new FinalizationRegistry(ptr => wasm.__wbg_jsmodeldiagnostics_free(ptr >>> 0, 1));
274
+
267
275
  const JsNormalPredictorFinalization = (typeof FinalizationRegistry === 'undefined')
268
276
  ? { register: () => {}, unregister: () => {} }
269
277
  : new FinalizationRegistry(ptr => wasm.__wbg_jsnormalpredictor_free(ptr >>> 0, 1));
@@ -288,6 +296,10 @@ const JsTrainedModelFinalization = (typeof FinalizationRegistry === 'undefined')
288
296
  ? { register: () => {}, unregister: () => {} }
289
297
  : new FinalizationRegistry(ptr => wasm.__wbg_jstrainedmodel_free(ptr >>> 0, 1));
290
298
 
299
+ const KalmanForecasterFinalization = (typeof FinalizationRegistry === 'undefined')
300
+ ? { register: () => {}, unregister: () => {} }
301
+ : new FinalizationRegistry(ptr => wasm.__wbg_kalmanforecaster_free(ptr >>> 0, 1));
302
+
291
303
  const MFLESForecasterFinalization = (typeof FinalizationRegistry === 'undefined')
292
304
  ? { register: () => {}, unregister: () => {} }
293
305
  : new FinalizationRegistry(ptr => wasm.__wbg_mflesforecaster_free(ptr >>> 0, 1));
@@ -352,6 +364,10 @@ const TimeSeriesFinalization = (typeof FinalizationRegistry === 'undefined')
352
364
  ? { register: () => {}, unregister: () => {} }
353
365
  : new FinalizationRegistry(ptr => wasm.__wbg_timeseries_free(ptr >>> 0, 1));
354
366
 
367
+ const VARForecasterFinalization = (typeof FinalizationRegistry === 'undefined')
368
+ ? { register: () => {}, unregister: () => {} }
369
+ : new FinalizationRegistry(ptr => wasm.__wbg_varforecaster_free(ptr >>> 0, 1));
370
+
355
371
  const WindowAverageForecasterFinalization = (typeof FinalizationRegistry === 'undefined')
356
372
  ? { register: () => {}, unregister: () => {} }
357
373
  : new FinalizationRegistry(ptr => wasm.__wbg_windowaverageforecaster_free(ptr >>> 0, 1));
@@ -825,6 +841,113 @@ export class AutoEnsembleForecaster {
825
841
  }
826
842
  if (Symbol.dispose) AutoEnsembleForecaster.prototype[Symbol.dispose] = AutoEnsembleForecaster.prototype.free;
827
843
 
844
+ /**
845
+ * Builder for constructing an AutoForecaster with custom parameters.
846
+ *
847
+ * Uses a fluent API: chain setter methods and call `build()` to produce
848
+ * an `AutoForecaster`.
849
+ */
850
+ export class AutoForecastBuilder {
851
+ static __wrap(ptr) {
852
+ ptr = ptr >>> 0;
853
+ const obj = Object.create(AutoForecastBuilder.prototype);
854
+ obj.__wbg_ptr = ptr;
855
+ AutoForecastBuilderFinalization.register(obj, obj.__wbg_ptr, obj);
856
+ return obj;
857
+ }
858
+ __destroy_into_raw() {
859
+ const ptr = this.__wbg_ptr;
860
+ this.__wbg_ptr = 0;
861
+ AutoForecastBuilderFinalization.unregister(this);
862
+ return ptr;
863
+ }
864
+ free() {
865
+ const ptr = this.__destroy_into_raw();
866
+ wasm.__wbg_autoforecastbuilder_free(ptr, 0);
867
+ }
868
+ /**
869
+ * Include or exclude AutoETS from the candidate set.
870
+ *
871
+ * @param include - Whether to include AutoETS (default: true)
872
+ * @param {boolean} include
873
+ * @returns {AutoForecastBuilder}
874
+ */
875
+ includeEts(include) {
876
+ const ptr = this.__destroy_into_raw();
877
+ const ret = wasm.autoforecastbuilder_includeEts(ptr, include);
878
+ return AutoForecastBuilder.__wrap(ret);
879
+ }
880
+ /**
881
+ * Include or exclude AutoARIMA from the candidate set.
882
+ *
883
+ * @param include - Whether to include AutoARIMA (default: true)
884
+ * @param {boolean} include
885
+ * @returns {AutoForecastBuilder}
886
+ */
887
+ includeArima(include) {
888
+ const ptr = this.__destroy_into_raw();
889
+ const ret = wasm.autoforecastbuilder_includeArima(ptr, include);
890
+ return AutoForecastBuilder.__wrap(ret);
891
+ }
892
+ /**
893
+ * Include or exclude AutoTheta from the candidate set.
894
+ *
895
+ * @param include - Whether to include AutoTheta (default: true)
896
+ * @param {boolean} include
897
+ * @returns {AutoForecastBuilder}
898
+ */
899
+ includeTheta(include) {
900
+ const ptr = this.__destroy_into_raw();
901
+ const ret = wasm.autoforecastbuilder_includeTheta(ptr, include);
902
+ return AutoForecastBuilder.__wrap(ret);
903
+ }
904
+ /**
905
+ * Set the seasonal period.
906
+ *
907
+ * @param period - Seasonal period (e.g., 12 for monthly data)
908
+ * @param {number} period
909
+ * @returns {AutoForecastBuilder}
910
+ */
911
+ seasonalPeriod(period) {
912
+ const ptr = this.__destroy_into_raw();
913
+ const ret = wasm.autoforecastbuilder_seasonalPeriod(ptr, period);
914
+ return AutoForecastBuilder.__wrap(ret);
915
+ }
916
+ /**
917
+ * Use cross-validation instead of in-sample MSE for model selection.
918
+ *
919
+ * @param useCv - Whether to use cross-validation (default: false)
920
+ * @param {boolean} use_cv
921
+ * @returns {AutoForecastBuilder}
922
+ */
923
+ useCrossValidation(use_cv) {
924
+ const ptr = this.__destroy_into_raw();
925
+ const ret = wasm.autoforecastbuilder_useCrossValidation(ptr, use_cv);
926
+ return AutoForecastBuilder.__wrap(ret);
927
+ }
928
+ /**
929
+ * Create a new builder with all defaults enabled.
930
+ */
931
+ constructor() {
932
+ const ret = wasm.autoforecastbuilder_new();
933
+ this.__wbg_ptr = ret >>> 0;
934
+ AutoForecastBuilderFinalization.register(this, this.__wbg_ptr, this);
935
+ return this;
936
+ }
937
+ /**
938
+ * Build the AutoForecaster with the configured parameters.
939
+ *
940
+ * @returns A new AutoForecaster ready to fit
941
+ * @returns {AutoForecaster}
942
+ */
943
+ build() {
944
+ const ptr = this.__destroy_into_raw();
945
+ const ret = wasm.autoforecastbuilder_build(ptr);
946
+ return AutoForecaster.__wrap(ret);
947
+ }
948
+ }
949
+ if (Symbol.dispose) AutoForecastBuilder.prototype[Symbol.dispose] = AutoForecastBuilder.prototype.free;
950
+
828
951
  /**
829
952
  * Automatic model selection across ARIMA, ETS, and Theta families.
830
953
  *
@@ -1688,6 +1811,23 @@ export class EnsembleForecaster {
1688
1811
  setMedian() {
1689
1812
  wasm.ensembleforecaster_setMedian(this.__wbg_ptr);
1690
1813
  }
1814
+ /**
1815
+ * Set the combination method by name string.
1816
+ *
1817
+ * Supported values: "mean", "median", "weighted_mse", "inverse_aic",
1818
+ * "stacking", "horizon_adaptive".
1819
+ *
1820
+ * @param method - Combination method name
1821
+ * @param {string} method
1822
+ */
1823
+ setMethod(method) {
1824
+ const ptr0 = passStringToWasm0(method, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1825
+ const len0 = WASM_VECTOR_LEN;
1826
+ const ret = wasm.ensembleforecaster_setMethod(this.__wbg_ptr, ptr0, len0);
1827
+ if (ret[1]) {
1828
+ throw takeFromExternrefTable0(ret[0]);
1829
+ }
1830
+ }
1691
1831
  /**
1692
1832
  * Get the number of models in the ensemble.
1693
1833
  * @returns {number}
@@ -1709,12 +1849,40 @@ export class EnsembleForecaster {
1709
1849
  const len0 = WASM_VECTOR_LEN;
1710
1850
  wasm.ensembleforecaster_setWeights(this.__wbg_ptr, ptr0, len0);
1711
1851
  }
1852
+ /**
1853
+ * Set the combination method to stacking (projected gradient descent).
1854
+ *
1855
+ * Trains non-negative weights that sum to one on validation data.
1856
+ *
1857
+ * @param folds - Number of folds (default: 5)
1858
+ * @param {number | null} [folds]
1859
+ */
1860
+ setStacking(folds) {
1861
+ wasm.ensembleforecaster_setStacking(this.__wbg_ptr, isLikeNone(folds) ? 0x100000001 : (folds) >>> 0);
1862
+ }
1863
+ /**
1864
+ * Set the combination method to inverse AIC weighting.
1865
+ *
1866
+ * Computes Akaike weights from in-sample residuals.
1867
+ */
1868
+ setInverseAic() {
1869
+ wasm.ensembleforecaster_setInverseAic(this.__wbg_ptr);
1870
+ }
1712
1871
  /**
1713
1872
  * Set the combination method to weighted MSE.
1714
1873
  */
1715
1874
  setWeightedMse() {
1716
1875
  wasm.ensembleforecaster_setWeightedMse(this.__wbg_ptr);
1717
1876
  }
1877
+ /**
1878
+ * Set the combination method to per-horizon adaptive weighting.
1879
+ *
1880
+ * Computes separate weight vectors for each forecast horizon step
1881
+ * based on rolling-origin evaluation.
1882
+ */
1883
+ setHorizonAdaptive() {
1884
+ wasm.ensembleforecaster_setHorizonAdaptive(this.__wbg_ptr);
1885
+ }
1718
1886
  /**
1719
1887
  * Predict with prediction intervals.
1720
1888
  *
@@ -1822,6 +1990,36 @@ export class Forecast {
1822
1990
  const ptr = this.__destroy_into_raw();
1823
1991
  wasm.__wbg_forecast_free(ptr, 0);
1824
1992
  }
1993
+ /**
1994
+ * Return a new forecast with all values clamped to be non-negative.
1995
+ * @returns {Forecast}
1996
+ */
1997
+ nonNegative() {
1998
+ const ret = wasm.forecast_nonNegative(this.__wbg_ptr);
1999
+ return Forecast.__wrap(ret);
2000
+ }
2001
+ /**
2002
+ * Return a new forecast with point values rounded to the nearest integer,
2003
+ * lower intervals floored, and upper intervals ceiled.
2004
+ * @returns {Forecast}
2005
+ */
2006
+ roundToInteger() {
2007
+ const ret = wasm.forecast_roundToInteger(this.__wbg_ptr);
2008
+ return Forecast.__wrap(ret);
2009
+ }
2010
+ /**
2011
+ * Return a new forecast with all values clamped to `[lower, upper]`.
2012
+ *
2013
+ * @param lower - Lower bound
2014
+ * @param upper - Upper bound
2015
+ * @param {number} lower
2016
+ * @param {number} upper
2017
+ * @returns {Forecast}
2018
+ */
2019
+ clamp(lower, upper) {
2020
+ const ret = wasm.forecast_clamp(this.__wbg_ptr, lower, upper);
2021
+ return Forecast.__wrap(ret);
2022
+ }
1825
2023
  /**
1826
2024
  * Get lower prediction interval bounds.
1827
2025
  *
@@ -2649,6 +2847,148 @@ export class JsHistoricalSimulator {
2649
2847
  }
2650
2848
  if (Symbol.dispose) JsHistoricalSimulator.prototype[Symbol.dispose] = JsHistoricalSimulator.prototype.free;
2651
2849
 
2850
+ /**
2851
+ * Complete model diagnostics report.
2852
+ *
2853
+ * Includes Ljung-Box, Jarque-Bera, and Breusch-Pagan tests, plus
2854
+ * residual ACF/PACF and summary statistics.
2855
+ */
2856
+ export class JsModelDiagnostics {
2857
+ static __wrap(ptr) {
2858
+ ptr = ptr >>> 0;
2859
+ const obj = Object.create(JsModelDiagnostics.prototype);
2860
+ obj.__wbg_ptr = ptr;
2861
+ JsModelDiagnosticsFinalization.register(obj, obj.__wbg_ptr, obj);
2862
+ return obj;
2863
+ }
2864
+ __destroy_into_raw() {
2865
+ const ptr = this.__wbg_ptr;
2866
+ this.__wbg_ptr = 0;
2867
+ JsModelDiagnosticsFinalization.unregister(this);
2868
+ return ptr;
2869
+ }
2870
+ free() {
2871
+ const ptr = this.__destroy_into_raw();
2872
+ wasm.__wbg_jsmodeldiagnostics_free(ptr, 0);
2873
+ }
2874
+ /**
2875
+ * Whether all diagnostic tests pass at the configured significance level.
2876
+ * @returns {boolean}
2877
+ */
2878
+ get passesAll() {
2879
+ const ret = wasm.jsmodeldiagnostics_passesAll(this.__wbg_ptr);
2880
+ return ret !== 0;
2881
+ }
2882
+ /**
2883
+ * Autocorrelation function of the residuals.
2884
+ * @returns {Float64Array}
2885
+ */
2886
+ get residualAcf() {
2887
+ const ret = wasm.jsmodeldiagnostics_residualAcf(this.__wbg_ptr);
2888
+ var v1 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
2889
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
2890
+ return v1;
2891
+ }
2892
+ /**
2893
+ * Standard deviation of the residuals.
2894
+ * @returns {number}
2895
+ */
2896
+ get residualStd() {
2897
+ const ret = wasm.jsmodeldiagnostics_residualStd(this.__wbg_ptr);
2898
+ return ret;
2899
+ }
2900
+ /**
2901
+ * Mean of the residuals.
2902
+ * @returns {number}
2903
+ */
2904
+ get residualMean() {
2905
+ const ret = wasm.jsmodeldiagnostics_residualMean(this.__wbg_ptr);
2906
+ return ret;
2907
+ }
2908
+ /**
2909
+ * Partial autocorrelation function of the residuals.
2910
+ * @returns {Float64Array}
2911
+ */
2912
+ get residualPacf() {
2913
+ const ret = wasm.jsmodeldiagnostics_residualPacf(this.__wbg_ptr);
2914
+ var v1 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
2915
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
2916
+ return v1;
2917
+ }
2918
+ /**
2919
+ * Create diagnostics from an array of residuals.
2920
+ *
2921
+ * @param residuals - Array of model residuals
2922
+ * @param significance - Significance level for tests (e.g., 0.05)
2923
+ * @param {Float64Array} residuals
2924
+ * @param {number} significance
2925
+ * @returns {JsModelDiagnostics}
2926
+ */
2927
+ static fromResiduals(residuals, significance) {
2928
+ const ptr0 = passArrayF64ToWasm0(residuals, wasm.__wbindgen_malloc);
2929
+ const len0 = WASM_VECTOR_LEN;
2930
+ const ret = wasm.jsmodeldiagnostics_fromResiduals(ptr0, len0, significance);
2931
+ return JsModelDiagnostics.__wrap(ret);
2932
+ }
2933
+ /**
2934
+ * Number of lags used in the Ljung-Box test.
2935
+ * @returns {number}
2936
+ */
2937
+ get ljungBoxLags() {
2938
+ const ret = wasm.jsmodeldiagnostics_ljungBoxLags(this.__wbg_ptr);
2939
+ return ret >>> 0;
2940
+ }
2941
+ /**
2942
+ * Ljung-Box test p-value for autocorrelation.
2943
+ * @returns {number}
2944
+ */
2945
+ get ljungBoxPvalue() {
2946
+ const ret = wasm.jsmodeldiagnostics_ljungBoxPvalue(this.__wbg_ptr);
2947
+ return ret;
2948
+ }
2949
+ /**
2950
+ * Jarque-Bera test p-value.
2951
+ * @returns {number}
2952
+ */
2953
+ get jarqueBeraPvalue() {
2954
+ const ret = wasm.jsconformalresult_quantileValue(this.__wbg_ptr);
2955
+ return ret;
2956
+ }
2957
+ /**
2958
+ * Jarque-Bera test statistic for normality.
2959
+ * @returns {number}
2960
+ */
2961
+ get jarqueBeraStatistic() {
2962
+ const ret = wasm.jsmodeldiagnostics_jarqueBeraStatistic(this.__wbg_ptr);
2963
+ return ret;
2964
+ }
2965
+ /**
2966
+ * Breusch-Pagan heteroscedasticity test p-value.
2967
+ * @returns {number}
2968
+ */
2969
+ get heteroscedasticityPvalue() {
2970
+ const ret = wasm.jsconformalresult_coverage(this.__wbg_ptr);
2971
+ return ret;
2972
+ }
2973
+ /**
2974
+ * Get a human-readable summary of the diagnostics.
2975
+ * @returns {string}
2976
+ */
2977
+ summary() {
2978
+ let deferred1_0;
2979
+ let deferred1_1;
2980
+ try {
2981
+ const ret = wasm.jsmodeldiagnostics_summary(this.__wbg_ptr);
2982
+ deferred1_0 = ret[0];
2983
+ deferred1_1 = ret[1];
2984
+ return getStringFromWasm0(ret[0], ret[1]);
2985
+ } finally {
2986
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
2987
+ }
2988
+ }
2989
+ }
2990
+ if (Symbol.dispose) JsModelDiagnostics.prototype[Symbol.dispose] = JsModelDiagnostics.prototype.free;
2991
+
2652
2992
  /**
2653
2993
  * Normal predictor — assumes Gaussian forecast errors.
2654
2994
  *
@@ -2750,7 +3090,7 @@ export class JsNormalResult {
2750
3090
  * @returns {number}
2751
3091
  */
2752
3092
  get mean() {
2753
- const ret = wasm.jsnormalresult_mean(this.__wbg_ptr);
3093
+ const ret = wasm.jsmodeldiagnostics_ljungBoxPvalue(this.__wbg_ptr);
2754
3094
  return ret;
2755
3095
  }
2756
3096
  /**
@@ -2758,7 +3098,7 @@ export class JsNormalResult {
2758
3098
  * @returns {number}
2759
3099
  */
2760
3100
  stdDev() {
2761
- const ret = wasm.jsnormalresult_stdDev(this.__wbg_ptr);
3101
+ const ret = wasm.jsmodeldiagnostics_jarqueBeraStatistic(this.__wbg_ptr);
2762
3102
  return ret;
2763
3103
  }
2764
3104
  }
@@ -2995,7 +3335,7 @@ export class JsPredictionIntervals {
2995
3335
  * @returns {number}
2996
3336
  */
2997
3337
  get coverage() {
2998
- const ret = wasm.jsnormalresult_mean(this.__wbg_ptr);
3338
+ const ret = wasm.jsmodeldiagnostics_ljungBoxPvalue(this.__wbg_ptr);
2999
3339
  return ret;
3000
3340
  }
3001
3341
  /**
@@ -3037,6 +3377,139 @@ export class JsTrainedModel {
3037
3377
  }
3038
3378
  if (Symbol.dispose) JsTrainedModel.prototype[Symbol.dispose] = JsTrainedModel.prototype.free;
3039
3379
 
3380
+ /**
3381
+ * Kalman filter forecaster for state-space models.
3382
+ *
3383
+ * Supports local level and local linear trend models out of the box.
3384
+ */
3385
+ export class KalmanForecaster {
3386
+ static __wrap(ptr) {
3387
+ ptr = ptr >>> 0;
3388
+ const obj = Object.create(KalmanForecaster.prototype);
3389
+ obj.__wbg_ptr = ptr;
3390
+ KalmanForecasterFinalization.register(obj, obj.__wbg_ptr, obj);
3391
+ return obj;
3392
+ }
3393
+ __destroy_into_raw() {
3394
+ const ptr = this.__wbg_ptr;
3395
+ this.__wbg_ptr = 0;
3396
+ KalmanForecasterFinalization.unregister(this);
3397
+ return ptr;
3398
+ }
3399
+ free() {
3400
+ const ptr = this.__destroy_into_raw();
3401
+ wasm.__wbg_kalmanforecaster_free(ptr, 0);
3402
+ }
3403
+ /**
3404
+ * Create a local level (random walk plus noise) model.
3405
+ *
3406
+ * @param obs_noise - Observation noise variance
3407
+ * @param state_noise - State (level) noise variance
3408
+ * @param {number} obs_noise
3409
+ * @param {number} state_noise
3410
+ * @returns {KalmanForecaster}
3411
+ */
3412
+ static localLevel(obs_noise, state_noise) {
3413
+ const ret = wasm.kalmanforecaster_localLevel(obs_noise, state_noise);
3414
+ return KalmanForecaster.__wrap(ret);
3415
+ }
3416
+ /**
3417
+ * Create a local linear trend model.
3418
+ *
3419
+ * @param obs_noise - Observation noise variance
3420
+ * @param level_noise - Level noise variance
3421
+ * @param trend_noise - Trend noise variance
3422
+ * @param {number} obs_noise
3423
+ * @param {number} level_noise
3424
+ * @param {number} trend_noise
3425
+ * @returns {KalmanForecaster}
3426
+ */
3427
+ static localLinearTrend(obs_noise, level_noise, trend_noise) {
3428
+ const ret = wasm.kalmanforecaster_localLinearTrend(obs_noise, level_noise, trend_noise);
3429
+ return KalmanForecaster.__wrap(ret);
3430
+ }
3431
+ /**
3432
+ * Predict with prediction intervals.
3433
+ *
3434
+ * @param horizon - Number of steps to forecast
3435
+ * @param level - Confidence level (e.g., 0.95 for 95% intervals)
3436
+ * @returns Forecast with predictions and intervals
3437
+ * @param {number} horizon
3438
+ * @param {number} level
3439
+ * @returns {Forecast}
3440
+ */
3441
+ predictWithIntervals(horizon, level) {
3442
+ const ret = wasm.kalmanforecaster_predictWithIntervals(this.__wbg_ptr, horizon, level);
3443
+ if (ret[2]) {
3444
+ throw takeFromExternrefTable0(ret[1]);
3445
+ }
3446
+ return Forecast.__wrap(ret[0]);
3447
+ }
3448
+ /**
3449
+ * Fit the Kalman filter to a time series.
3450
+ *
3451
+ * @param series - TimeSeries to fit
3452
+ * @param {TimeSeries} series
3453
+ */
3454
+ fit(series) {
3455
+ _assertClass(series, TimeSeries);
3456
+ const ret = wasm.kalmanforecaster_fit(this.__wbg_ptr, series.__wbg_ptr);
3457
+ if (ret[1]) {
3458
+ throw takeFromExternrefTable0(ret[0]);
3459
+ }
3460
+ }
3461
+ /**
3462
+ * Get the model name.
3463
+ * @returns {string}
3464
+ */
3465
+ get name() {
3466
+ let deferred1_0;
3467
+ let deferred1_1;
3468
+ try {
3469
+ const ret = wasm.kalmanforecaster_name(this.__wbg_ptr);
3470
+ deferred1_0 = ret[0];
3471
+ deferred1_1 = ret[1];
3472
+ return getStringFromWasm0(ret[0], ret[1]);
3473
+ } finally {
3474
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
3475
+ }
3476
+ }
3477
+ /**
3478
+ * Apply the Kalman smoother (RTS smoother) and return smoothed observations.
3479
+ *
3480
+ * @param series - TimeSeries to smooth
3481
+ * @returns Array of smoothed observation values
3482
+ * @param {TimeSeries} series
3483
+ * @returns {Float64Array}
3484
+ */
3485
+ smooth(series) {
3486
+ _assertClass(series, TimeSeries);
3487
+ const ret = wasm.kalmanforecaster_smooth(this.__wbg_ptr, series.__wbg_ptr);
3488
+ if (ret[3]) {
3489
+ throw takeFromExternrefTable0(ret[2]);
3490
+ }
3491
+ var v1 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
3492
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
3493
+ return v1;
3494
+ }
3495
+ /**
3496
+ * Predict future values.
3497
+ *
3498
+ * @param horizon - Number of steps to forecast
3499
+ * @returns Forecast with point predictions
3500
+ * @param {number} horizon
3501
+ * @returns {Forecast}
3502
+ */
3503
+ predict(horizon) {
3504
+ const ret = wasm.kalmanforecaster_predict(this.__wbg_ptr, horizon);
3505
+ if (ret[2]) {
3506
+ throw takeFromExternrefTable0(ret[1]);
3507
+ }
3508
+ return Forecast.__wrap(ret[0]);
3509
+ }
3510
+ }
3511
+ if (Symbol.dispose) KalmanForecaster.prototype[Symbol.dispose] = KalmanForecaster.prototype.free;
3512
+
3040
3513
  /**
3041
3514
  * MFLES - Multiple Frequency Locally Estimated Scatterplot Smoothing.
3042
3515
  */
@@ -4319,6 +4792,108 @@ export class TimeSeries {
4319
4792
  }
4320
4793
  if (Symbol.dispose) TimeSeries.prototype[Symbol.dispose] = TimeSeries.prototype.free;
4321
4794
 
4795
+ /**
4796
+ * Vector Autoregression forecaster for multivariate time series.
4797
+ *
4798
+ * Models multiple time series jointly where each variable at time t is a
4799
+ * linear function of the p most recent lags of all variables.
4800
+ */
4801
+ export class VARForecaster {
4802
+ __destroy_into_raw() {
4803
+ const ptr = this.__wbg_ptr;
4804
+ this.__wbg_ptr = 0;
4805
+ VARForecasterFinalization.unregister(this);
4806
+ return ptr;
4807
+ }
4808
+ free() {
4809
+ const ptr = this.__destroy_into_raw();
4810
+ wasm.__wbg_varforecaster_free(ptr, 0);
4811
+ }
4812
+ /**
4813
+ * Fit the VAR model to multivariate time series data.
4814
+ *
4815
+ * @param data - Array of Float64Arrays, one per variable. All must have the same length.
4816
+ * @param {Array<any>} data
4817
+ */
4818
+ fitMultivariate(data) {
4819
+ const ret = wasm.varforecaster_fitMultivariate(this.__wbg_ptr, data);
4820
+ if (ret[1]) {
4821
+ throw takeFromExternrefTable0(ret[0]);
4822
+ }
4823
+ }
4824
+ /**
4825
+ * Predict future values for all variables.
4826
+ *
4827
+ * @param horizon - Number of steps to forecast
4828
+ * @returns Array of Float64Arrays, one per variable
4829
+ * @param {number} horizon
4830
+ * @returns {Array<any>}
4831
+ */
4832
+ predictMultivariate(horizon) {
4833
+ const ret = wasm.varforecaster_predictMultivariate(this.__wbg_ptr, horizon);
4834
+ if (ret[2]) {
4835
+ throw takeFromExternrefTable0(ret[1]);
4836
+ }
4837
+ return takeFromExternrefTable0(ret[0]);
4838
+ }
4839
+ /**
4840
+ * Perform a Granger causality test.
4841
+ *
4842
+ * Tests whether variable `cause` Granger-causes variable `effect`.
4843
+ *
4844
+ * @param cause - Index of the potentially causal variable (0-based)
4845
+ * @param effect - Index of the effect variable (0-based)
4846
+ * @returns F-statistic. Higher values indicate stronger evidence of causality.
4847
+ * @param {number} cause
4848
+ * @param {number} effect
4849
+ * @returns {number}
4850
+ */
4851
+ grangerCausalityTest(cause, effect) {
4852
+ const ret = wasm.varforecaster_grangerCausalityTest(this.__wbg_ptr, cause, effect);
4853
+ if (ret[2]) {
4854
+ throw takeFromExternrefTable0(ret[1]);
4855
+ }
4856
+ return ret[0];
4857
+ }
4858
+ /**
4859
+ * Create a new VAR forecaster with the given lag order.
4860
+ *
4861
+ * @param order - Number of lags (p). Must be at least 1.
4862
+ * @param {number} order
4863
+ */
4864
+ constructor(order) {
4865
+ const ret = wasm.varforecaster_new(order);
4866
+ this.__wbg_ptr = ret >>> 0;
4867
+ VARForecasterFinalization.register(this, this.__wbg_ptr, this);
4868
+ return this;
4869
+ }
4870
+ /**
4871
+ * Get the model name.
4872
+ * @returns {string}
4873
+ */
4874
+ get name() {
4875
+ let deferred1_0;
4876
+ let deferred1_1;
4877
+ try {
4878
+ const ret = wasm.varforecaster_name(this.__wbg_ptr);
4879
+ deferred1_0 = ret[0];
4880
+ deferred1_1 = ret[1];
4881
+ return getStringFromWasm0(ret[0], ret[1]);
4882
+ } finally {
4883
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
4884
+ }
4885
+ }
4886
+ /**
4887
+ * Get the lag order.
4888
+ * @returns {number}
4889
+ */
4890
+ get order() {
4891
+ const ret = wasm.varforecaster_order(this.__wbg_ptr);
4892
+ return ret >>> 0;
4893
+ }
4894
+ }
4895
+ if (Symbol.dispose) VARForecaster.prototype[Symbol.dispose] = VARForecaster.prototype.free;
4896
+
4322
4897
  /**
4323
4898
  * Window Average forecaster - uses the last N observations.
4324
4899
  */
@@ -4990,10 +5565,32 @@ function __wbg_get_imports() {
4990
5565
  const ret = arg0.getTime();
4991
5566
  return ret;
4992
5567
  };
5568
+ imports.wbg.__wbg_get_6b7bd52aca3f9671 = function(arg0, arg1) {
5569
+ const ret = arg0[arg1 >>> 0];
5570
+ return ret;
5571
+ };
5572
+ imports.wbg.__wbg_instanceof_Float64Array_9fefccd7bfa2fefe = function(arg0) {
5573
+ let result;
5574
+ try {
5575
+ result = arg0 instanceof Float64Array;
5576
+ } catch (_) {
5577
+ result = false;
5578
+ }
5579
+ const ret = result;
5580
+ return ret;
5581
+ };
4993
5582
  imports.wbg.__wbg_length_22ac23eaec9d8053 = function(arg0) {
4994
5583
  const ret = arg0.length;
4995
5584
  return ret;
4996
5585
  };
5586
+ imports.wbg.__wbg_length_406f6daaaa453057 = function(arg0) {
5587
+ const ret = arg0.length;
5588
+ return ret;
5589
+ };
5590
+ imports.wbg.__wbg_length_d45040a40c570362 = function(arg0) {
5591
+ const ret = arg0.length;
5592
+ return ret;
5593
+ };
4997
5594
  imports.wbg.__wbg_msCrypto_a61aeb35a24c1329 = function(arg0) {
4998
5595
  const ret = arg0.msCrypto;
4999
5596
  return ret;
@@ -5014,6 +5611,14 @@ function __wbg_get_imports() {
5014
5611
  const ret = new Function(getStringFromWasm0(arg0, arg1));
5015
5612
  return ret;
5016
5613
  };
5614
+ imports.wbg.__wbg_new_with_length_12c6de4fac33117a = function(arg0) {
5615
+ const ret = new Array(arg0 >>> 0);
5616
+ return ret;
5617
+ };
5618
+ imports.wbg.__wbg_new_with_length_806b9e5b8290af7c = function(arg0) {
5619
+ const ret = new Float64Array(arg0 >>> 0);
5620
+ return ret;
5621
+ };
5017
5622
  imports.wbg.__wbg_new_with_length_aa5eaf41d35235e5 = function(arg0) {
5018
5623
  const ret = new Uint8Array(arg0 >>> 0);
5019
5624
  return ret;
@@ -5026,6 +5631,9 @@ function __wbg_get_imports() {
5026
5631
  const ret = arg0.process;
5027
5632
  return ret;
5028
5633
  };
5634
+ imports.wbg.__wbg_prototypesetcall_d3c4edbb4ef96ca1 = function(arg0, arg1, arg2) {
5635
+ Float64Array.prototype.set.call(getArrayF64FromWasm0(arg0, arg1), arg2);
5636
+ };
5029
5637
  imports.wbg.__wbg_prototypesetcall_dfe9b766cdc1f1fd = function(arg0, arg1, arg2) {
5030
5638
  Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), arg2);
5031
5639
  };
@@ -5036,6 +5644,9 @@ function __wbg_get_imports() {
5036
5644
  const ret = module.require;
5037
5645
  return ret;
5038
5646
  }, arguments) };
5647
+ imports.wbg.__wbg_set_22933af9286a43df = function(arg0, arg1, arg2) {
5648
+ arg0.set(getArrayF64FromWasm0(arg1, arg2));
5649
+ };
5039
5650
  imports.wbg.__wbg_set_3f1d0b984ed272ed = function(arg0, arg1, arg2) {
5040
5651
  arg0[arg1] = arg2;
5041
5652
  };
Binary file
@@ -6,6 +6,7 @@ export const __wbg_arimaforecaster_free: (a: number, b: number) => void;
6
6
  export const __wbg_autoarimaforecaster_free: (a: number, b: number) => void;
7
7
  export const __wbg_autoensembleforecaster_free: (a: number, b: number) => void;
8
8
  export const __wbg_autoetsforecaster_free: (a: number, b: number) => void;
9
+ export const __wbg_autoforecastbuilder_free: (a: number, b: number) => void;
9
10
  export const __wbg_autoforecaster_free: (a: number, b: number) => void;
10
11
  export const __wbg_autotbatsforecaster_free: (a: number, b: number) => void;
11
12
  export const __wbg_autothetaforecaster_free: (a: number, b: number) => void;
@@ -25,12 +26,14 @@ export const __wbg_jsconformalpredictor_free: (a: number, b: number) => void;
25
26
  export const __wbg_jsconformalresult_free: (a: number, b: number) => void;
26
27
  export const __wbg_jshistoricalsimresult_free: (a: number, b: number) => void;
27
28
  export const __wbg_jshistoricalsimulator_free: (a: number, b: number) => void;
29
+ export const __wbg_jsmodeldiagnostics_free: (a: number, b: number) => void;
28
30
  export const __wbg_jsnormalpredictor_free: (a: number, b: number) => void;
29
31
  export const __wbg_jsnormalresult_free: (a: number, b: number) => void;
30
32
  export const __wbg_jspointforecasts_free: (a: number, b: number) => void;
31
33
  export const __wbg_jspostprocessor_free: (a: number, b: number) => void;
32
34
  export const __wbg_jspredictionintervals_free: (a: number, b: number) => void;
33
35
  export const __wbg_jstrainedmodel_free: (a: number, b: number) => void;
36
+ export const __wbg_kalmanforecaster_free: (a: number, b: number) => void;
34
37
  export const __wbg_meanforecaster_free: (a: number, b: number) => void;
35
38
  export const __wbg_mflesforecaster_free: (a: number, b: number) => void;
36
39
  export const __wbg_mstlforecasterwrapper_free: (a: number, b: number) => void;
@@ -42,10 +45,10 @@ export const __wbg_seasonalesforecaster_free: (a: number, b: number) => void;
42
45
  export const __wbg_seasonalnaiveforecaster_free: (a: number, b: number) => void;
43
46
  export const __wbg_seasonalwindowaverageforecaster_free: (a: number, b: number) => void;
44
47
  export const __wbg_sesforecaster_free: (a: number, b: number) => void;
45
- export const __wbg_smaforecaster_free: (a: number, b: number) => void;
46
48
  export const __wbg_tbatsforecaster_free: (a: number, b: number) => void;
47
49
  export const __wbg_thetaforecaster_free: (a: number, b: number) => void;
48
50
  export const __wbg_timeseries_free: (a: number, b: number) => void;
51
+ export const __wbg_varforecaster_free: (a: number, b: number) => void;
49
52
  export const adfTest: (a: number, b: number, c: number) => [number, number, number];
50
53
  export const adidaforecaster_fit: (a: number, b: number) => [number, number];
51
54
  export const adidaforecaster_name: (a: number) => [number, number];
@@ -80,6 +83,13 @@ export const autoetsforecaster_new: () => number;
80
83
  export const autoetsforecaster_predict: (a: number, b: number) => [number, number, number];
81
84
  export const autoetsforecaster_withConfig: (a: number, b: number, c: number, d: number) => number;
82
85
  export const autoetsforecaster_withPeriod: (a: number) => number;
86
+ export const autoforecastbuilder_build: (a: number) => number;
87
+ export const autoforecastbuilder_includeArima: (a: number, b: number) => number;
88
+ export const autoforecastbuilder_includeEts: (a: number, b: number) => number;
89
+ export const autoforecastbuilder_includeTheta: (a: number, b: number) => number;
90
+ export const autoforecastbuilder_new: () => number;
91
+ export const autoforecastbuilder_seasonalPeriod: (a: number, b: number) => number;
92
+ export const autoforecastbuilder_useCrossValidation: (a: number, b: number) => number;
83
93
  export const autoforecaster_allScores: (a: number) => [number, number, number];
84
94
  export const autoforecaster_fit: (a: number, b: number) => [number, number];
85
95
  export const autoforecaster_name: (a: number) => [number, number];
@@ -137,7 +147,11 @@ export const ensembleforecaster_name: (a: number) => [number, number];
137
147
  export const ensembleforecaster_new: (a: number, b: number) => [number, number, number];
138
148
  export const ensembleforecaster_predict: (a: number, b: number) => [number, number, number];
139
149
  export const ensembleforecaster_predictWithIntervals: (a: number, b: number, c: number) => [number, number, number];
150
+ export const ensembleforecaster_setHorizonAdaptive: (a: number) => void;
151
+ export const ensembleforecaster_setInverseAic: (a: number) => void;
140
152
  export const ensembleforecaster_setMedian: (a: number) => void;
153
+ export const ensembleforecaster_setMethod: (a: number, b: number, c: number) => [number, number];
154
+ export const ensembleforecaster_setStacking: (a: number, b: number) => void;
141
155
  export const ensembleforecaster_setWeightedMse: (a: number) => void;
142
156
  export const ensembleforecaster_setWeights: (a: number, b: number, c: number) => void;
143
157
  export const etsforecaster_fit: (a: number, b: number) => [number, number];
@@ -146,10 +160,13 @@ export const etsforecaster_isValidSpec: (a: number, b: number, c: number, d: num
146
160
  export const etsforecaster_name: (a: number) => [number, number];
147
161
  export const etsforecaster_new: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number];
148
162
  export const etsforecaster_predict: (a: number, b: number) => [number, number, number];
163
+ export const forecast_clamp: (a: number, b: number, c: number) => number;
149
164
  export const forecast_hasLower: (a: number) => number;
150
165
  export const forecast_hasUpper: (a: number) => number;
151
166
  export const forecast_horizon: (a: number) => number;
152
167
  export const forecast_lower: (a: number) => [number, number];
168
+ export const forecast_nonNegative: (a: number) => number;
169
+ export const forecast_roundToInteger: (a: number) => number;
153
170
  export const forecast_upper: (a: number) => [number, number];
154
171
  export const forecast_values: (a: number) => [number, number];
155
172
  export const garchforecaster_fit: (a: number, b: number) => [number, number];
@@ -199,11 +216,19 @@ export const jshistoricalsimulator_new: (a: number, b: number) => number;
199
216
  export const jshistoricalsimulator_predictIntervals: (a: number, b: number, c: number, d: number) => [number, number, number];
200
217
  export const jshistoricalsimulator_simulate: (a: number, b: number, c: number, d: number, e: number) => [number, number, number];
201
218
  export const jshistoricalsimulator_withWindow: (a: number, b: number, c: number) => number;
219
+ export const jsmodeldiagnostics_fromResiduals: (a: number, b: number, c: number) => number;
220
+ export const jsmodeldiagnostics_jarqueBeraStatistic: (a: number) => number;
221
+ export const jsmodeldiagnostics_ljungBoxLags: (a: number) => number;
222
+ export const jsmodeldiagnostics_ljungBoxPvalue: (a: number) => number;
223
+ export const jsmodeldiagnostics_passesAll: (a: number) => number;
224
+ export const jsmodeldiagnostics_residualAcf: (a: number) => [number, number];
225
+ export const jsmodeldiagnostics_residualMean: (a: number) => number;
226
+ export const jsmodeldiagnostics_residualPacf: (a: number) => [number, number];
227
+ export const jsmodeldiagnostics_residualStd: (a: number) => number;
228
+ export const jsmodeldiagnostics_summary: (a: number) => [number, number];
202
229
  export const jsnormalpredictor_fit: (a: number, b: number, c: number, d: number, e: number) => [number, number, number];
203
230
  export const jsnormalpredictor_new: (a: number, b: number) => number;
204
231
  export const jsnormalpredictor_predictIntervals: (a: number, b: number, c: number, d: number) => [number, number, number];
205
- export const jsnormalresult_mean: (a: number) => number;
206
- export const jsnormalresult_stdDev: (a: number) => number;
207
232
  export const jspointforecasts_isEmpty: (a: number) => number;
208
233
  export const jspointforecasts_length: (a: number) => number;
209
234
  export const jspointforecasts_new: (a: number, b: number) => number;
@@ -219,6 +244,13 @@ export const jspredictionintervals_lower: (a: number) => [number, number];
219
244
  export const jspredictionintervals_midpoints: (a: number) => [number, number];
220
245
  export const jspredictionintervals_upper: (a: number) => [number, number];
221
246
  export const jspredictionintervals_widths: (a: number) => [number, number];
247
+ export const kalmanforecaster_fit: (a: number, b: number) => [number, number];
248
+ export const kalmanforecaster_localLevel: (a: number, b: number) => number;
249
+ export const kalmanforecaster_localLinearTrend: (a: number, b: number, c: number) => number;
250
+ export const kalmanforecaster_name: (a: number) => [number, number];
251
+ export const kalmanforecaster_predict: (a: number, b: number) => [number, number, number];
252
+ export const kalmanforecaster_predictWithIntervals: (a: number, b: number, c: number) => [number, number, number];
253
+ export const kalmanforecaster_smooth: (a: number, b: number) => [number, number, number, number];
222
254
  export const kpssTest: (a: number, b: number, c: number) => [number, number, number];
223
255
  export const kurtosis: (a: number, b: number) => number;
224
256
  export const ljungBox: (a: number, b: number, c: number, d: number) => [number, number, number];
@@ -313,6 +345,12 @@ export const tsbforecaster_name: (a: number) => [number, number];
313
345
  export const tsbforecaster_new: () => number;
314
346
  export const tsbforecaster_predict: (a: number, b: number) => [number, number, number];
315
347
  export const tsbforecaster_predictWithIntervals: (a: number, b: number, c: number) => [number, number, number];
348
+ export const varforecaster_fitMultivariate: (a: number, b: any) => [number, number];
349
+ export const varforecaster_grangerCausalityTest: (a: number, b: number, c: number) => [number, number, number];
350
+ export const varforecaster_name: (a: number) => [number, number];
351
+ export const varforecaster_new: (a: number) => number;
352
+ export const varforecaster_order: (a: number) => number;
353
+ export const varforecaster_predictMultivariate: (a: number, b: number) => [number, number, number];
316
354
  export const variance: (a: number, b: number) => number;
317
355
  export const version: () => [number, number];
318
356
  export const windowaverageforecaster_fit: (a: number, b: number) => [number, number];
@@ -320,8 +358,13 @@ export const windowaverageforecaster_name: (a: number) => [number, number];
320
358
  export const windowaverageforecaster_new: (a: number) => number;
321
359
  export const windowaverageforecaster_predict: (a: number, b: number) => [number, number, number];
322
360
  export const tbatsforecaster_withSeasonalPeriods: (a: number, b: number) => number;
361
+ export const __wbg_smaforecaster_free: (a: number, b: number) => void;
323
362
  export const __wbg_tsbforecaster_free: (a: number, b: number) => void;
324
363
  export const __wbg_windowaverageforecaster_free: (a: number, b: number) => void;
364
+ export const jsmodeldiagnostics_heteroscedasticityPvalue: (a: number) => number;
365
+ export const jsmodeldiagnostics_jarqueBeraPvalue: (a: number) => number;
366
+ export const jsnormalresult_mean: (a: number) => number;
367
+ export const jsnormalresult_stdDev: (a: number) => number;
325
368
  export const jspredictionintervals_coverage: (a: number) => number;
326
369
  export const __wbindgen_malloc: (a: number, b: number) => number;
327
370
  export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sipemu/anofox-forecast",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
4
4
  "description": "Time series forecasting library - WebAssembly bindings for anofox-forecast",
5
5
  "type": "module",
6
6
  "main": "anofox_forecast_js.js",