From 8d2eb64cebfaa123c678c367a5efffc9965b052d Mon Sep 17 00:00:00 2001 From: palatej Date: Mon, 8 Jul 2024 09:48:10 +0200 Subject: [PATCH 1/2] Providing default atomic ssf blocks. --- .../sts/base/core/msts/ArInterpreter.java | 4 + .../sts/base/core/msts/AtomicModels.java | 4 +- .../msts/BoundedParameterInterpreter.java | 4 + .../sts/base/core/msts/SarimaInterpreter.java | 5 + .../msts/StablePolynomialInterpreter.java | 4 + .../core/msts/internal/AggregationItem.java | 33 ++++--- .../sts/base/core/msts/internal/ArItem.java | 12 ++- .../sts/base/core/msts/internal/ArItem2.java | 30 +++--- .../base/core/msts/internal/ArimaItem.java | 60 +++++++----- .../sts/base/core/msts/internal/ArmaItem.java | 68 +++++++------ .../base/core/msts/internal/CycleItem.java | 4 + .../core/msts/internal/LocalLevelItem.java | 4 + .../msts/internal/LocalLinearTrendItem.java | 16 +-- .../sts/base/core/msts/internal/MsaeItem.java | 59 ++++++----- .../base/core/msts/internal/MsaeItem2.java | 47 ++++++--- .../base/core/msts/internal/MsaeItem3.java | 67 ++++++++----- .../base/core/msts/internal/NoiseItem.java | 16 +-- .../base/core/msts/internal/PeriodicItem.java | 32 +++--- .../core/msts/internal/RegressionItem.java | 49 ++++++---- .../sts/base/core/msts/internal/SaeItem.java | 18 ++-- .../base/core/msts/internal/SarimaItem.java | 5 +- .../msts/internal/SeasonalComponentItem.java | 2 +- .../base/core/msts/internal/SplineItem.java | 2 +- .../core/msts/internal/TdRegressionItem.java | 4 +- .../core/msts/internal/VarLocalLevelItem.java | 2 +- .../internal/VarLocalLinearTrendItem.java | 18 ++-- .../base/core/msts/internal/VarNoiseItem.java | 4 +- .../core/msts/internal/VarRegressionItem.java | 4 +- .../internal/VarSeasonalComponentItem.java | 2 +- .../base/core/msts/internal/ArmaItemTest.java | 2 +- .../main/java/jdplus/sts/base/r/SsfTools.java | 97 ++++++++++++++++++- 31 files changed, 453 insertions(+), 225 deletions(-) diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/ArInterpreter.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/ArInterpreter.java index b2b5fb0..1498109 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/ArInterpreter.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/ArInterpreter.java @@ -53,6 +53,10 @@ public ArInterpreter(final String name, int degree, double defValue) { this.domain = new Domain(degree); } + public DoubleSeq values(){ + return DoubleSeq.of(values); + } + @Override public int dim(){ return values.length; diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/AtomicModels.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/AtomicModels.java index c0b7675..168498f 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/AtomicModels.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/AtomicModels.java @@ -53,8 +53,8 @@ @lombok.experimental.UtilityClass public class AtomicModels { - public StateItem arma(final String name, double[] ar, double[] ma, double var, boolean fixed) { - return new ArmaItem(name, ar, ma, var, fixed); + public StateItem arma(final String name, double[] ar, boolean fixedar, double[] ma, boolean fixedma, double var, boolean fixedvar) { + return new ArmaItem(name, ar, fixedar, ma, fixedma, var, fixedvar); } public StateItem sarima(final String name, int period, int[] orders, int[] seasonal, double[] parameters, boolean fixed, double var, boolean fixedvar) { diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/BoundedParameterInterpreter.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/BoundedParameterInterpreter.java index 9ec0b57..0eddb99 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/BoundedParameterInterpreter.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/BoundedParameterInterpreter.java @@ -75,6 +75,10 @@ private BoundedParameterInterpreter(final String name, double value, boolean fix this.fixed = fixed; this.range = new ParametersRange(lbound, ubound, open); } + + public double value(){ + return value; + } @Override public BoundedParameterInterpreter duplicate() { diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/SarimaInterpreter.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/SarimaInterpreter.java index 20a18d8..a096ba2 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/SarimaInterpreter.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/SarimaInterpreter.java @@ -20,6 +20,7 @@ import jdplus.toolkit.base.api.data.DoubleSeqCursor; import jdplus.toolkit.base.core.sarima.estimation.SarimaMapping; import jdplus.toolkit.base.api.arima.SarimaOrders; +import jdplus.toolkit.base.api.data.DoubleSeq; /** * @@ -40,6 +41,10 @@ public SarimaInterpreter(final String name, final SarimaOrders spec, final doubl this.np = spec.getParametersCount(); this.fixed = fixed; } + + public DoubleSeq values(){ + return DoubleSeq.of(values); + } @Override public SarimaInterpreter duplicate(){ diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/StablePolynomialInterpreter.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/StablePolynomialInterpreter.java index bde6180..95d2176 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/StablePolynomialInterpreter.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/StablePolynomialInterpreter.java @@ -42,6 +42,10 @@ public StablePolynomialInterpreter(final String name, @NonNull double[] values, this.fixed = fixed; this.domain = new Domain(values.length); } + + public DoubleSeq values(){ + return DoubleSeq.of(values); + } @Override public StablePolynomialInterpreter duplicate() { diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/AggregationItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/AggregationItem.java index 69e03b1..2aef424 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/AggregationItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/AggregationItem.java @@ -38,25 +38,34 @@ public AggregationItem(String name, StateItem[] cmps) { super(name); this.cmps = cmps; } - + @Override - public AggregationItem duplicate(){ - StateItem[] citems=new StateItem[cmps.length]; - for (int i=0; i parameters() { @Override public StateComponent build(DoubleSeq p) { - int n = ar.getDomain().getDim(); - double[] par = p.extract(0, n).toArray(); - double w = p.get(n); - return SsfAr.of(par, w, nlags, zeroinit); + if (p == null) { + return SsfAr.of(ar.values().toArray(), v.variance(), nlags, zeroinit); + } else { + int n = ar.getDomain().getDim(); + double[] par = p.extract(0, n).toArray(); + double w = p.get(n); + return SsfAr.of(par, w, nlags, zeroinit); + } } @Override diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/ArItem2.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/ArItem2.java index 8e6dd5f..07c774e 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/ArItem2.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/ArItem2.java @@ -45,17 +45,17 @@ public ArItem2(String name, double[] ar, boolean fixedar, double var, boolean fi this.ar = new ArInterpreter(name + ".ar", ar, fixedar); this.v = new VarianceInterpreter(name + ".var", var, fixedvar, true); } - - private ArItem2(ArItem2 item){ + + private ArItem2(ArItem2 item) { super(item.name); - this.ar=item.ar.duplicate(); - this.v=item.v.duplicate(); - this.nlags=item.nlags; - this.nfcasts=item.nfcasts; + this.ar = item.ar.duplicate(); + this.v = item.v.duplicate(); + this.nlags = item.nlags; + this.nfcasts = item.nfcasts; } - + @Override - public ArItem2 duplicate(){ + public ArItem2 duplicate() { return new ArItem2(this); } @@ -80,10 +80,14 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { - int n = ar.getDomain().getDim(); - double[] par = p.extract(0, n).toArray(); - double w = p.get(n); - return SsfAr2.of(par, w, nlags, nfcasts); + if (p == null) { + return SsfAr2.of(ar.values().toArray(), v.variance(), nlags, nfcasts); + } else { + int n = ar.getDomain().getDim(); + double[] par = p.extract(0, n).toArray(); + double w = p.get(n); + return SsfAr2.of(par, w, nlags, nfcasts); + } } @Override @@ -105,7 +109,7 @@ public int defaultLoadingCount() { public int stateDim() { int n = ar.getDomain().getDim(); if (nfcasts >= n) { - n = nfcasts+1; + n = nfcasts + 1; } return n + nlags; } diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/ArimaItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/ArimaItem.java index 7af28c6..83c43f5 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/ArimaItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/ArimaItem.java @@ -61,17 +61,17 @@ public ArimaItem(String name, double[] ar, boolean fixedar, double[] diff, doubl bdiff = BackFilter.ONE; } } - - private ArimaItem(ArimaItem item){ + + private ArimaItem(ArimaItem item) { super(item.name); - this.par=item.par == null ? null : item.par.duplicate(); - this.pma=item.pma == null ? null : item.pma.duplicate(); - this.v=item.v.duplicate(); - this.bdiff=item.bdiff; + this.par = item.par == null ? null : item.par.duplicate(); + this.pma = item.pma == null ? null : item.pma.duplicate(); + this.v = item.v.duplicate(); + this.bdiff = item.bdiff; } - + @Override - public ArimaItem duplicate(){ + public ArimaItem duplicate() { return new ArimaItem(this); } @@ -123,22 +123,36 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { BackFilter bar = BackFilter.ONE, bma = BackFilter.ONE; - int pos = 0; - if (par != null) { - int nar = par.getDomain().getDim(); - Polynomial ar = Polynomial.valueOf(1, p.extract(0, nar).toArray()); - bar = new BackFilter(ar); - pos += nar; - } - if (pma != null) { - int nma = pma.getDomain().getDim(); - Polynomial ma = Polynomial.valueOf(1, p.extract(0, nma).toArray()); - bma = new BackFilter(ma); - pos += nma; + if (p == null) { + if (par != null) { + Polynomial ar = Polynomial.valueOf(1, par.values().toArray()); + bar = new BackFilter(ar); + } + if (pma != null) { + Polynomial ma = Polynomial.valueOf(1, pma.values().toArray()); + bma = new BackFilter(ma); + } + double var = v.variance(); + ArimaModel arima = new ArimaModel(bar, bdiff, bma, var); + return SsfArima.stateComponent(arima); + } else { + int pos = 0; + if (par != null) { + int nar = par.getDomain().getDim(); + Polynomial ar = Polynomial.valueOf(1, p.extract(0, nar).toArray()); + bar = new BackFilter(ar); + pos += nar; + } + if (pma != null) { + int nma = pma.getDomain().getDim(); + Polynomial ma = Polynomial.valueOf(1, p.extract(0, nma).toArray()); + bma = new BackFilter(ma); + pos += nma; + } + double var = p.get(pos++); + ArimaModel arima = new ArimaModel(bar, bdiff, bma, var); + return SsfArima.stateComponent(arima); } - double var = p.get(pos++); - ArimaModel arima = new ArimaModel(bar, bdiff, bma, var); - return SsfArima.stateComponent(arima); } @Override diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/ArmaItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/ArmaItem.java index 324d1a6..05b140c 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/ArmaItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/ArmaItem.java @@ -40,31 +40,31 @@ public class ArmaItem extends StateItem { private final StablePolynomialInterpreter par, pma; private final VarianceInterpreter v; - public ArmaItem(final String name, double[] ar, double[] ma, double var, boolean fixed) { + public ArmaItem(final String name, double[] ar, boolean fixedar, double[] ma, boolean fixedma, double var, boolean fixedvar) { super(name); int nar = ar == null ? 0 : ar.length, nma = ma == null ? 0 : ma.length; if (nar > 0) { - par = new StablePolynomialInterpreter(name + ".ar", ar, fixed); + par = new StablePolynomialInterpreter(name + ".ar", ar, fixedar); } else { par = null; } if (nma > 0) { - pma = new StablePolynomialInterpreter(name + ".ma", ma, fixed); + pma = new StablePolynomialInterpreter(name + ".ma", ma, fixedma); } else { pma = null; } - v = new VarianceInterpreter(name + ".var", var, true, true); + v = new VarianceInterpreter(name + ".var", var, fixedvar, true); } - private ArmaItem(ArmaItem item){ + private ArmaItem(ArmaItem item) { super(item.name); - this.par=item.par == null ? null : item.par.duplicate(); - this.pma=item.pma == null ? null : item.pma.duplicate(); - this.v=item.v.duplicate(); - } - + this.par = item.par == null ? null : item.par.duplicate(); + this.pma = item.pma == null ? null : item.pma.duplicate(); + this.v = item.v.duplicate(); + } + @Override - public ArmaItem duplicate(){ + public ArmaItem duplicate() { return new ArmaItem(this); } @@ -108,22 +108,36 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { BackFilter bar = BackFilter.ONE, bma = BackFilter.ONE; - int pos = 0; - if (par != null) { - int nar = par.getDomain().getDim(); - Polynomial ar = Polynomial.valueOf(1, p.extract(0, nar).toArray()); - bar = new BackFilter(ar); - pos += nar; - } - if (pma != null) { - int nma = pma.getDomain().getDim(); - Polynomial ma = Polynomial.valueOf(1, p.extract(0, nma).toArray()); - bma = new BackFilter(ma); - pos += nma; + if (p == null) { + if (par != null) { + Polynomial ar = Polynomial.valueOf(1, par.values().toArray()); + bar = new BackFilter(ar); + } + if (pma != null) { + Polynomial ma = Polynomial.valueOf(1, pma.values().toArray()); + bma = new BackFilter(ma); + } + ArimaModel arima = new ArimaModel(bar, BackFilter.ONE, bma, v.variance()); + return SsfArima.stateComponent(arima); + + } else { + int pos = 0; + if (par != null) { + int nar = par.getDomain().getDim(); + Polynomial ar = Polynomial.valueOf(1, p.extract(0, nar).toArray()); + bar = new BackFilter(ar); + pos += nar; + } + if (pma != null) { + int nma = pma.getDomain().getDim(); + Polynomial ma = Polynomial.valueOf(1, p.extract(0, nma).toArray()); + bma = new BackFilter(ma); + pos += nma; + } + double n = p.get(pos++); + ArimaModel arima = new ArimaModel(bar, BackFilter.ONE, bma, n); + return SsfArima.stateComponent(arima); } - double n = p.get(pos++); - ArimaModel arima = new ArimaModel(bar, BackFilter.ONE, bma, n); - return SsfArima.stateComponent(arima); } @Override @@ -149,7 +163,7 @@ public ISsfLoading defaultLoading(int m) { public int defaultLoadingCount() { return 1; } - + @Override public int stateDim() { int p = 0; diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/CycleItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/CycleItem.java index ec1b92f..8927e17 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/CycleItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/CycleItem.java @@ -83,8 +83,12 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { + if (p == null){ + return CyclicalComponent.stateComponent(factor.value(), period.value(), v.variance()); + }else{ double f = p.get(0), l = p.get(1), var = p.get(2); return CyclicalComponent.stateComponent(f, l, var); + } } @Override diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/LocalLevelItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/LocalLevelItem.java index 9c432bf..fb91ca0 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/LocalLevelItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/LocalLevelItem.java @@ -71,8 +71,12 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { + if (p == null){ + return LocalLevel.stateComponent(v.variance(), initial); + }else{ double e = p.get(0); return LocalLevel.stateComponent(e, initial); + } } @Override diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/LocalLinearTrendItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/LocalLinearTrendItem.java index 3b01dae..d84a5aa 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/LocalLinearTrendItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/LocalLinearTrendItem.java @@ -45,7 +45,7 @@ private LocalLinearTrendItem(LocalLinearTrendItem item) { super(item.name); this.lv = item.lv.duplicate(); this.sv = item.sv.duplicate(); - } + } @Override public LocalLinearTrendItem duplicate() { @@ -72,9 +72,13 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { - double e1 = p.get(0); - double e2 = p.get(1); - return LocalLinearTrend.stateComponent(e1, e2); + if (p == null) { + return LocalLinearTrend.stateComponent(lv.variance(), sv.variance()); + } else { + double e1 = p.get(0); + double e2 = p.get(1); + return LocalLinearTrend.stateComponent(e1, e2); + } } @Override @@ -96,9 +100,9 @@ public int defaultLoadingCount() { public int stateDim() { return 2; } - + @Override public boolean isScalable() { - return !lv.isFixed() && ! sv.isFixed(); + return !lv.isFixed() && !sv.isFixed(); } } diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/MsaeItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/MsaeItem.java index 956f565..dc02344 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/MsaeItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/MsaeItem.java @@ -60,16 +60,17 @@ public MsaeItem(String name, int nwaves, Matrix ar, boolean fixedar, int lag) { par[i] = new ArInterpreter(name + ".wae" + (i + 1), car, fixedar); } } - - private MsaeItem(MsaeItem item) { + + private MsaeItem(MsaeItem item) { super(item.name); - this.nwaves=item.nwaves; - this.lag=item.lag; - this.lar=item.lar; - this.par=new ArInterpreter[item.par.length]; - for (int i=0; i parameters() { @Override public StateComponent build(DoubleSeq p) { - double[][] w = new double[nwaves][]; - w[0] = DoubleSeq.EMPTYARRAY; - int pos = 0; - int nar = lar.length; - for (int i = 0; i < nar; ++i) { - w[i + 1] = p.extract(pos, lar[i]).toArray(); - pos += lar[i]; - } - // same coefficients for the last waves, if any - for (int i = nar + 1; i < nwaves; ++i) { - w[i] = w[i - 1]; + if (p == null) { + double[][] w = new double[nwaves][]; + w[0] = DoubleSeq.EMPTYARRAY; + int nar = lar.length; + for (int i = 0; i < nar; ++i) { + w[i + 1] = par[i].values().toArray(); + } + // same coefficients for the last waves, if any + for (int i = nar + 1; i < nwaves; ++i) { + w[i] = w[i - 1]; + } + return WaveSpecificSurveyErrors.of(w, lag); + } else { + double[][] w = new double[nwaves][]; + w[0] = DoubleSeq.EMPTYARRAY; + int pos = 0; + int nar = lar.length; + for (int i = 0; i < nar; ++i) { + w[i + 1] = p.extract(pos, lar[i]).toArray(); + pos += lar[i]; + } + // same coefficients for the last waves, if any + for (int i = nar + 1; i < nwaves; ++i) { + w[i] = w[i - 1]; + } + return WaveSpecificSurveyErrors.of(w, lag); } - return WaveSpecificSurveyErrors.of(w, lag); } @Override @@ -148,6 +163,6 @@ public int defaultLoadingCount() { @Override public int stateDim() { - return 2*nwaves; + return 2 * nwaves; } } diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/MsaeItem2.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/MsaeItem2.java index 38933fc..752a799 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/MsaeItem2.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/MsaeItem2.java @@ -136,22 +136,39 @@ public List parameters() { public StateComponent build(DoubleSeq p) { int nwaves = v.length; double[] var = new double[nwaves]; - int pos = 0; - for (int i = 0; i < nwaves; ++i) { - var[i] = p.get(pos++); - } - double[][] w = new double[nwaves][]; - w[0] = DoubleSeq.EMPTYARRAY; - int nar = lar.length; - for (int i = 0; i < nar; ++i) { - w[i + 1] = p.extract(pos, lar[i]).toArray(); - pos += lar[i]; - } - // same coefficients for the last waves, if any - for (int i = nar + 1; i < nwaves; ++i) { - w[i] = w[i - 1]; + if (p == null) { + for (int i = 0; i < nwaves; ++i) { + var[i] = v[i].variance(); + } + double[][] w = new double[nwaves][]; + w[0] = DoubleSeq.EMPTYARRAY; + int nar = lar.length; + for (int i = 0; i < nar; ++i) { + w[i + 1] = par[i].values().toArray(); + } + // same coefficients for the last waves, if any + for (int i = nar + 1; i < nwaves; ++i) { + w[i] = w[i - 1]; + } + return WaveSpecificSurveyErrors2.of(var, w, lag); + } else { + int pos = 0; + for (int i = 0; i < nwaves; ++i) { + var[i] = p.get(pos++); + } + double[][] w = new double[nwaves][]; + w[0] = DoubleSeq.EMPTYARRAY; + int nar = lar.length; + for (int i = 0; i < nar; ++i) { + w[i + 1] = p.extract(pos, lar[i]).toArray(); + pos += lar[i]; + } + // same coefficients for the last waves, if any + for (int i = nar + 1; i < nwaves; ++i) { + w[i] = w[i - 1]; + } + return WaveSpecificSurveyErrors2.of(var, w, lag); } - return WaveSpecificSurveyErrors2.of(var, w, lag); } @Override diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/MsaeItem3.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/MsaeItem3.java index 6cc5ad3..75c12cc 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/MsaeItem3.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/MsaeItem3.java @@ -35,12 +35,12 @@ * @author palatej */ public class MsaeItem3 extends StateItem { - + private final VarianceInterpreter[] v; private final Matrix k; private final int lag; private final ArInterpreter[] par; - + public MsaeItem3(String name, double[] v, boolean fixedVar, double[] ar, boolean fixedar, Matrix k, int lag) { super(name); int nwaves = v.length; @@ -56,11 +56,11 @@ public MsaeItem3(String name, double[] v, boolean fixedVar, double[] ar, boolean par[i] = new ArInterpreter(name + ".wae" + (i + 1), new double[]{ar[i]}, fixedar); } } - - private MsaeItem3(MsaeItem3 item) { + + private MsaeItem3(MsaeItem3 item) { super(item.name); this.lag = item.lag; - this.k=item.k; + this.k = item.k; this.v = new VarianceInterpreter[item.v.length]; for (int i = 0; i < v.length; ++i) { v[i] = item.v[i].duplicate(); @@ -70,12 +70,12 @@ private MsaeItem3(MsaeItem3 item) { par[i] = item.par[i].duplicate(); } } - + @Override public MsaeItem3 duplicate() { return new MsaeItem3(this); } - + @Override public void addTo(MstsMapping mapping) { for (int i = 0; i < v.length; ++i) { @@ -104,7 +104,7 @@ public void addTo(MstsMapping mapping) { return pos; }); } - + @Override public List parameters() { List all = new ArrayList<>(); @@ -116,43 +116,58 @@ public List parameters() { } return all; } - + @Override public StateComponent build(DoubleSeq p) { int nwaves = v.length; double[] var = new double[nwaves]; - int pos = 0; - for (int i = 0; i < nwaves; ++i) { - var[i] = p.get(pos++); - } - double[] ar = new double[nwaves - 1]; - for (int i = 0; i < par.length; ++i) { - ar[i] = p.get(pos++); - } - // same coefficients for the last waves, if any - for (int i = par.length + 1; i < ar.length; ++i) { - ar[i] = ar[i - 1]; + if (p == null) { + for (int i = 0; i < nwaves; ++i) { + var[i] = v[i].variance(); + } + double[] ar = new double[nwaves - 1]; + for (int i = 0; i < par.length; ++i) { + ar[i] = par[i].values().get(0); + } + // same coefficients for the last waves, if any + for (int i = par.length + 1; i < ar.length; ++i) { + ar[i] = ar[i - 1]; + } + return WaveSpecificSurveyErrors3.of(var, ar, k, lag); + } else { + int pos = 0; + for (int i = 0; i < nwaves; ++i) { + var[i] = p.get(pos++); + } + double[] ar = new double[nwaves - 1]; + for (int i = 0; i < par.length; ++i) { + ar[i] = p.get(pos++); + } + // same coefficients for the last waves, if any + for (int i = par.length + 1; i < ar.length; ++i) { + ar[i] = ar[i - 1]; + } + return WaveSpecificSurveyErrors3.of(var, ar, k, lag); } - return WaveSpecificSurveyErrors3.of(var, ar, k, lag); } - + @Override public int parametersCount() { return v.length + par.length; } - + @Override public ISsfLoading defaultLoading(int m) { return m > v.length ? null : Loading.fromPosition(m * lag); } - + @Override public int defaultLoadingCount() { return v.length; } - + @Override public int stateDim() { - return v.length*lag; + return v.length * lag; } } diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/NoiseItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/NoiseItem.java index 3612321..b0f6e69 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/NoiseItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/NoiseItem.java @@ -39,14 +39,14 @@ public NoiseItem(String name, double var, boolean fixed) { super(name); this.v = new VarianceInterpreter(name + ".var", var, fixed, true); } - - private NoiseItem(NoiseItem item){ + + private NoiseItem(NoiseItem item) { super(item.name); - v=item.v.duplicate(); + v = item.v.duplicate(); } - + @Override - public NoiseItem duplicate(){ + public NoiseItem duplicate() { return new NoiseItem(this); } @@ -68,8 +68,12 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { + if (p == null) { + return Noise.of(v.variance()); + } else { double e = p.get(0); return Noise.of(e); + } } @Override @@ -92,7 +96,7 @@ public int defaultLoadingCount() { } @Override - public int stateDim(){ + public int stateDim() { return 1; } diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/PeriodicItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/PeriodicItem.java index c6a3852..fc3fa47 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/PeriodicItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/PeriodicItem.java @@ -40,19 +40,19 @@ public class PeriodicItem extends StateItem { public PeriodicItem(String name, double period, int[] k, double cvar, boolean fixedvar) { super(name); v = new VarianceInterpreter(name + ".var", cvar, fixedvar, true); - this.period=period; - this.k=k; + this.period = period; + this.k = k; } - - private PeriodicItem(PeriodicItem item){ + + private PeriodicItem(PeriodicItem item) { super(item.name); - this.period=item.period; - this.k=item.k; - v=item.v.duplicate(); + this.period = item.period; + this.k = item.k; + v = item.v.duplicate(); } - + @Override - public PeriodicItem duplicate(){ + public PeriodicItem duplicate() { return new PeriodicItem(this); } @@ -73,8 +73,12 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { - double var = p.get(0); - return PeriodicComponent.stateComponent(period, k, var); + if (p == null) { + return PeriodicComponent.stateComponent(period, k, v.variance()); + } else { + double var = p.get(0); + return PeriodicComponent.stateComponent(period, k, var); + } } @Override @@ -97,12 +101,12 @@ public int defaultLoadingCount() { @Override public int stateDim() { - return 2*k.length; + return 2 * k.length; } - + @Override public boolean isScalable() { return !v.isFixed(); } - + } diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/RegressionItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/RegressionItem.java index ed6878f..aeb84c0 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/RegressionItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/RegressionItem.java @@ -56,22 +56,22 @@ public RegressionItem(String name, Matrix x, final double[] vars, final boolean } } } - - private RegressionItem(RegressionItem item){ + + private RegressionItem(RegressionItem item) { super(item.name); - this.x=item.x; - if (item.v == null) - v=null; - else{ - v=new VarianceInterpreter[item.v.length]; - for (int i=0; i { - StateComponent cmp = Coefficients.timeVaryingCoefficients(DoubleSeq.onMapping(x.getColumnsCount(), j->p.get(0))); + StateComponent cmp = Coefficients.timeVaryingCoefficients(DoubleSeq.onMapping(x.getColumnsCount(), j -> p.get(0))); builder.add(name, cmp, Loading.regression(x)); return 1; }); @@ -117,10 +117,22 @@ public List parameters() { public StateComponent build(DoubleSeq p) { if (v == null) { return Coefficients.fixedCoefficients(x.getColumnsCount()); - } else if (v.length == 1){ - return Coefficients.timeVaryingCoefficients(DoubleSeq.onMapping(x.getColumnsCount(), j->p.get(0))); - } else{ - return Coefficients.timeVaryingCoefficients(p.extract(0, v.length)); + } else if (v.length == 1) { + if (p == null) { + return Coefficients.timeVaryingCoefficients(DoubleSeq.onMapping(x.getColumnsCount(), j -> v[0].variance())); + } else { + return Coefficients.timeVaryingCoefficients(DoubleSeq.onMapping(x.getColumnsCount(), j -> p.get(0))); + } + } else { + if (p == null) { + double[] vars = new double[v.length]; + for (int i = 0; i < vars.length; ++i) { + vars[i] = v[i].variance(); + } + return Coefficients.timeVaryingCoefficients(DoubleSeq.of(vars)); + } else { + return Coefficients.timeVaryingCoefficients(p.extract(0, v.length)); + } } } @@ -142,11 +154,10 @@ public ISsfLoading defaultLoading(int m) { public int defaultLoadingCount() { return 1; } - + @Override - public int stateDim(){ + public int stateDim() { return x.getColumnsCount(); } - } diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SaeItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SaeItem.java index 4963b4d..748b354 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SaeItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SaeItem.java @@ -46,12 +46,12 @@ public SaeItem(String name, double[] ar, boolean fixedar, int lag, boolean zeroi this.zeroinit = zeroinit; } - private SaeItem(SaeItem item) { + private SaeItem(SaeItem item) { super(item.name); - this.ar=item.ar.duplicate(); - this.lag=item.lag; - this.zeroinit=item.zeroinit; - } + this.ar = item.ar.duplicate(); + this.lag = item.lag; + this.zeroinit = item.zeroinit; + } @Override public SaeItem duplicate() { @@ -78,9 +78,9 @@ public void addTo(MstsMapping mapping) { return nar; }); } - + @Override - public boolean isScalable(){ + public boolean isScalable() { return false; } @@ -92,7 +92,7 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { int nar = ar.getDomain().getDim(); - double[] par = p.extract(0, nar).toArray(); + double[] par = p == null ? ar.values().toArray() : p.extract(0, nar).toArray(); // compute the "normalized" covariance double[] car = new double[par.length + 1]; double[] lpar = new double[par.length * lag]; @@ -122,7 +122,7 @@ public int defaultLoadingCount() { @Override public int stateDim() { - return ar.getDomain().getDim()*lag; + return ar.getDomain().getDim() * lag; } } diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SarimaItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SarimaItem.java index 6debe07..3a50c15 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SarimaItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SarimaItem.java @@ -97,10 +97,11 @@ public List parameters() { @Override public StateComponent build(DoubleSeq x) { SarimaOrders spec = p.getDomain().getSpec(); - double var = x.get(0); + double var = x == null ? v.variance() : x.get(0); int np = spec.getParametersCount(); + DoubleSeq z = x == null ? p.values() : x.extract(1, np); SarimaModel sarima = SarimaModel.builder(spec) - .parameters(x.extract(1, np)) + .parameters(z) .build(); StateComponent cmp; if (var == 1) { diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SeasonalComponentItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SeasonalComponentItem.java index 4c904ee..13cc3fc 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SeasonalComponentItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SeasonalComponentItem.java @@ -75,7 +75,7 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { - double e = p.get(0); + double e = p == null ? v.variance() : p.get(0); return SeasonalComponent.of(model, period, e); } diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SplineItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SplineItem.java index 8be8987..910277a 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SplineItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/SplineItem.java @@ -74,7 +74,7 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { - double var = p.get(0); + double var = p == null ? v.variance() : p.get(0); return SplineComponent.stateComponent(data, var, startpos); } diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/TdRegressionItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/TdRegressionItem.java index 778995c..c2030d2 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/TdRegressionItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/TdRegressionItem.java @@ -129,8 +129,8 @@ public static FastMatrix generateVar(DayClustering dc, boolean contrasts) { @Override public StateComponent build(DoubleSeq p) { - double pvar = p.get(0); - if (mvar == null) { + double pvar = p == null ? v.variance() : p.get(0); + if (mvar == null) { return Coefficients.fixedCoefficients(x.getColumnsCount()); } else { FastMatrix xvar = mvar.deepClone(); diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarLocalLevelItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarLocalLevelItem.java index 9e66d15..fec5772 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarLocalLevelItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarLocalLevelItem.java @@ -75,7 +75,7 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { - double e = p.get(0); + double e = p == null ? scale.scale() : p.get(0); return VarLocalLevel.of(stde, e, initial); } diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarLocalLinearTrendItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarLocalLinearTrendItem.java index a66ce00..540a930 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarLocalLinearTrendItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarLocalLinearTrendItem.java @@ -38,8 +38,8 @@ public class VarLocalLinearTrendItem extends StateItem { public VarLocalLinearTrendItem(final String name, double[] lstd, double[] sstd, double lscale, double sscale, boolean lfixed, boolean sfixed) { super(name); - this.lstd=lstd; - this.sstd=sstd; + this.lstd = lstd; + this.sstd = sstd; this.lscale = new ScaleInterpreter(name + ".lvar", lscale, lfixed, true); this.sscale = new ScaleInterpreter(name + ".svar", sscale, sfixed, true); } @@ -48,9 +48,9 @@ private VarLocalLinearTrendItem(VarLocalLinearTrendItem item) { super(item.name); this.lscale = item.lscale.duplicate(); this.sscale = item.sscale.duplicate(); - this.lstd=item.lstd; - this.sstd=item.sstd; - } + this.lstd = item.lstd; + this.sstd = item.sstd; + } @Override public VarLocalLinearTrendItem duplicate() { @@ -77,10 +77,10 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { - double e1 = p.get(0); - double e2 = p.get(1); + double e1 = p == null ? lscale.scale() : p.get(0); + double e2 = p == null ? sscale.scale() : p.get(1); return VarLocalLinearTrend.of(lstd, sstd, e1, e2); - } + } @Override public int parametersCount() { @@ -101,7 +101,7 @@ public int defaultLoadingCount() { public int stateDim() { return 2; } - + @Override public boolean isScalable() { return !lscale.isFixed() && !lscale.isFixed(); diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarNoiseItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarNoiseItem.java index 9b086b8..fa2c507 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarNoiseItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarNoiseItem.java @@ -71,8 +71,8 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { - double e = p.get(0); - return VarNoise.of(std, e); + double e = p == null ? scale.scale() : p.get(0); + return VarNoise.of(std, e); } @Override diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarRegressionItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarRegressionItem.java index 0649331..bdc306f 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarRegressionItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarRegressionItem.java @@ -76,8 +76,8 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { - double e = p.get(0); - return Coefficients.timeVaryingCoefficient(std, e); + double e = p == null ? scale.scale() : p.get(0); + return Coefficients.timeVaryingCoefficient(std, e); } @Override diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarSeasonalComponentItem.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarSeasonalComponentItem.java index a3c1209..921254f 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarSeasonalComponentItem.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/main/java/jdplus/sts/base/core/msts/internal/VarSeasonalComponentItem.java @@ -78,7 +78,7 @@ public List parameters() { @Override public StateComponent build(DoubleSeq p) { - double e = p.get(0); + double e = p == null ? scale.scale() : p.get(0); return VarSeasonalComponent.of(model, period, std, e); } diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/test/java/jdplus/sts/base/core/msts/internal/ArmaItemTest.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/test/java/jdplus/sts/base/core/msts/internal/ArmaItemTest.java index 553047d..2c1cc38 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/test/java/jdplus/sts/base/core/msts/internal/ArmaItemTest.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-core/src/test/java/jdplus/sts/base/core/msts/internal/ArmaItemTest.java @@ -21,7 +21,7 @@ public ArmaItemTest() { @Test public void testDim() { - ArmaItem item = new ArmaItem("", new double[]{.1, .1, .1}, new double[]{.1, .1, .1}, 1, true); + ArmaItem item = new ArmaItem("", new double[]{.1, .1, .1}, false, new double[]{.1, .1, .1}, false, 1, true); int np = item.parametersCount(); DataBlock p = DataBlock.make(np); p.set(i->.011*i); diff --git a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-r/src/main/java/jdplus/sts/base/r/SsfTools.java b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-r/src/main/java/jdplus/sts/base/r/SsfTools.java index 0b54a13..262bb4f 100644 --- a/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-r/src/main/java/jdplus/sts/base/r/SsfTools.java +++ b/jdplus-incubator-base/jdplus-sts-base-parent/jdplus-sts-base-r/src/main/java/jdplus/sts/base/r/SsfTools.java @@ -5,8 +5,12 @@ */ package jdplus.sts.base.r; +import jdplus.sts.base.core.msts.StateItem; +import jdplus.toolkit.base.api.math.matrices.Matrix; import jdplus.toolkit.base.core.data.DataBlock; import jdplus.toolkit.base.core.math.matrices.FastMatrix; +import jdplus.toolkit.base.core.ssf.ISsfLoading; +import jdplus.toolkit.base.core.ssf.StateComponent; import jdplus.toolkit.base.core.ssf.univariate.ISsf; import jdplus.toolkit.base.core.ssf.univariate.ISsfError; @@ -17,18 +21,30 @@ @lombok.experimental.UtilityClass public class SsfTools { - public FastMatrix transitionMatrix(ISsf ssf, int pos) { + public Matrix transitionMatrix(ISsf ssf, int pos) { FastMatrix m = FastMatrix.square(ssf.getStateDim()); ssf.dynamics().T(pos, m); return m; } - public FastMatrix innovationMatrix(ISsf ssf, int pos) { + public Matrix innovationMatrix(ISsf ssf, int pos) { FastMatrix m = FastMatrix.square(ssf.getStateDim()); ssf.dynamics().V(pos, m); return m; } + public Matrix transitionMatrix(StateComponent cmp, int pos) { + FastMatrix m = FastMatrix.square(cmp.dim()); + cmp.dynamics().T(pos, m); + return m; + } + + public Matrix innovationMatrix(StateComponent cmp, int pos) { + FastMatrix m = FastMatrix.square(cmp.dim()); + cmp.dynamics().V(pos, m); + return m; + } + public double[] loading(ISsf ssf, int pos) { DataBlock m = DataBlock.make(ssf.getStateDim()); ssf.loading().Z(pos, m); @@ -40,19 +56,25 @@ public double measurementError(ISsf ssf, int pos) { return e == null ? 0 : e.at(pos); } + public double[] loading(ISsfLoading l, int dim, int pos) { + DataBlock m = DataBlock.make(dim); + l.Z(pos, m); + return m.getStorage(); + } + public double[] initialState(ISsf ssf) { DataBlock m = DataBlock.make(ssf.getStateDim()); ssf.initialization().a0(m); return m.getStorage(); } - public FastMatrix stationaryInitialVariance(ISsf ssf) { + public Matrix stationaryInitialVariance(ISsf ssf) { FastMatrix m = FastMatrix.square(ssf.getStateDim()); ssf.initialization().Pf0(m); return m; } - public FastMatrix diffuseInitialConstraint(ISsf ssf) { + public Matrix diffuseInitialConstraint(ISsf ssf) { if (!ssf.initialization().isDiffuse()) { return null; } @@ -61,7 +83,7 @@ public FastMatrix diffuseInitialConstraint(ISsf ssf) { return m; } - public FastMatrix diffuseInitialVariance(ISsf ssf) { + public Matrix diffuseInitialVariance(ISsf ssf) { if (!ssf.initialization().isDiffuse()) { return null; } @@ -69,4 +91,69 @@ public FastMatrix diffuseInitialVariance(ISsf ssf) { ssf.initialization().Pi0(m); return m; } + + public double[] initialState(StateComponent cmp) { + DataBlock m = DataBlock.make(cmp.dim()); + cmp.initialization().a0(m); + return m.getStorage(); + } + + public Matrix stationaryInitialVariance(StateComponent cmp) { + FastMatrix m = FastMatrix.square(cmp.dim()); + cmp.initialization().Pf0(m); + return m; + } + + public Matrix diffuseInitialConstraint(StateComponent cmp) { + if (!cmp.initialization().isDiffuse()) { + return null; + } + FastMatrix m = FastMatrix.make(cmp.dim(), cmp.initialization().getDiffuseDim()); + cmp.initialization().diffuseConstraints(m); + return m; + } + + public Matrix diffuseInitialVariance(StateComponent cmp) { + if (!cmp.initialization().isDiffuse()) { + return null; + } + FastMatrix m = FastMatrix.square(cmp.dim()); + cmp.initialization().Pi0(m); + return m; + } + + public double[] loading(StateItem item, int pos) { + DataBlock m = DataBlock.make(item.stateDim()); + item.defaultLoading(0).Z(pos, m); + return m.getStorage(); + } + + public double[] initialState(StateItem cmp) { + return initialState(cmp.build(null)); + } + + public Matrix stationaryInitialVariance(StateItem cmp) { + return stationaryInitialVariance(cmp.build(null)); + } + + public Matrix diffuseInitialConstraint(StateItem cmp) { + return diffuseInitialConstraint(cmp.build(null)); + } + + public Matrix diffuseInitialVariance(StateItem cmp) { + return diffuseInitialVariance(cmp.build(null)); + } + + public Matrix transitionMatrix(StateItem item, int pos) { + return transitionMatrix(item.build(null), pos); + } + + public Matrix innovationMatrix(StateItem item, int pos) { + return innovationMatrix(item.build(null), pos); + } + + public StateComponent defaultComponent(StateItem item){ + return item.build(null); + } + } From d976e5d5fc8868201070b9e2522c2e87f1be0a54 Mon Sep 17 00:00:00 2001 From: palatej Date: Wed, 10 Jul 2024 12:05:00 +0200 Subject: [PATCH 2/2] Update of the changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bfaa6e..daff1a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,16 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added + +- ![STAT] Add default matrices for the different state blocks +- ![OTHER] Add methods for an easier access to the state blocks from R + ### Fixed - ![OTHER] Fix category of advancedsa plugin - ![OTHER] Fix invalid OpenIDE-Module-Install in jdplus-advancedsa-desktop-plugin [#154](https://github.com/jdemetra/jdplus-incubator/issues/154) +- ![UI] Fix the names of periodic components in high-frequency ## [2.1.0] - 2024-04-15