From 8c58537894b26fa8dd33762bf96aadde32156c74 Mon Sep 17 00:00:00 2001 From: palatej Date: Wed, 10 Jul 2024 11:17:15 +0200 Subject: [PATCH 1/6] Code cleanup --- .../main/java/jdplus/x13/base/core/x13/X13Kernel.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x13/X13Kernel.java b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x13/X13Kernel.java index f35d7894..1920a7e6 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x13/X13Kernel.java +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x13/X13Kernel.java @@ -26,18 +26,15 @@ import jdplus.toolkit.base.api.timeseries.TsPeriod; import jdplus.toolkit.base.api.timeseries.regression.ModellingContext; import jdplus.toolkit.base.api.timeseries.regression.ModellingUtility; -import jdplus.toolkit.base.api.timeseries.regression.TrendConstant; -import jdplus.toolkit.base.api.timeseries.regression.Variable; import jdplus.x13.base.api.x11.X11Spec; import jdplus.x13.base.api.x13.X13Spec; -import java.util.Arrays; -import java.util.Optional; import jdplus.toolkit.base.core.regsarima.regular.RegSarimaModel; import jdplus.sa.base.core.CholetteProcessor; import jdplus.sa.base.core.PreliminaryChecks; import jdplus.sa.base.core.SaBenchmarkingResults; import jdplus.sa.base.core.modelling.RegArimaDecomposer; import jdplus.sa.base.core.modelling.SaVariablesMapping; +import jdplus.toolkit.base.api.modelling.TransformationType; import jdplus.toolkit.base.core.sarima.SarimaModel; import jdplus.toolkit.base.core.ssf.arima.ExactArimaForecasts; import jdplus.x13.base.core.x11.X11Kernel; @@ -73,6 +70,10 @@ private static PreliminaryChecks.Tool of(X13Spec spec) { public static X13Kernel of(X13Spec spec, ModellingContext context) { PreliminaryChecks.Tool check = of(spec); boolean blPreprop = spec.getRegArima().getBasic().isPreprocessing(); +// boolean blPreprop = +// spec.getRegArima().getBasic().isPreprocessing() && +// (spec.getRegArima().getTransform().getFunction() != TransformationType.None || +// spec.getRegArima().getOutliers().isUsed() || spec.getRegArima().getRegression().isUsed()); RegArimaKernel regarima = RegArimaKernel.of(spec.getRegArima(), context); SaVariablesMapping mapping = new SaVariablesMapping(); // TO DO: fill maping with existing information in TramoSpec (section Regression) From 917441b5affb2dd8581470f1a74a84e4d9531374 Mon Sep 17 00:00:00 2001 From: palatej Date: Wed, 10 Jul 2024 11:17:43 +0200 Subject: [PATCH 2/6] New layout of the summary --- .../desktop/plugin/tramoseats/ui/JTramoSeatsSummary.java | 8 ++++---- .../jdplus/x13/desktop/plugin/x13/ui/JX13Summary.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/jdplus-main-desktop/jdplus-tramoseats-desktop-plugin/src/main/java/jdplus/tramoseats/desktop/plugin/tramoseats/ui/JTramoSeatsSummary.java b/jdplus-main-desktop/jdplus-tramoseats-desktop-plugin/src/main/java/jdplus/tramoseats/desktop/plugin/tramoseats/ui/JTramoSeatsSummary.java index a80f9b0b..03185d48 100644 --- a/jdplus-main-desktop/jdplus-tramoseats-desktop-plugin/src/main/java/jdplus/tramoseats/desktop/plugin/tramoseats/ui/JTramoSeatsSummary.java +++ b/jdplus-main-desktop/jdplus-tramoseats-desktop-plugin/src/main/java/jdplus/tramoseats/desktop/plugin/tramoseats/ui/JTramoSeatsSummary.java @@ -83,15 +83,15 @@ public JTramoSeatsSummary() { chart_.setTsUpdateMode(TsUpdateMode.None); siPanel_ = new JSIView(); - JSplitPane split1 = NbComponents.newJSplitPane(JSplitPane.HORIZONTAL_SPLIT, chart_, siPanel_); - split1.setDividerLocation(0.6); + JSplitPane split1 = NbComponents.newJSplitPane(JSplitPane.VERTICAL_SPLIT, chart_, siPanel_); + split1.setDividerLocation(0.5); split1.setResizeWeight(.5); document_ = Box.createHorizontalBox(); - JSplitPane split2 = NbComponents.newJSplitPane(JSplitPane.VERTICAL_SPLIT, document_, split1); + JSplitPane split2 = NbComponents.newJSplitPane(JSplitPane.HORIZONTAL_SPLIT, document_, split1); split2.setDividerLocation(0.5); - split2.setResizeWeight(.5); + split2.setResizeWeight(.4); add(split2, BorderLayout.CENTER); } diff --git a/jdplus-main-desktop/jdplus-x13-desktop-plugin/src/main/java/jdplus/x13/desktop/plugin/x13/ui/JX13Summary.java b/jdplus-main-desktop/jdplus-x13-desktop-plugin/src/main/java/jdplus/x13/desktop/plugin/x13/ui/JX13Summary.java index 0651c8e5..11d2b247 100644 --- a/jdplus-main-desktop/jdplus-x13-desktop-plugin/src/main/java/jdplus/x13/desktop/plugin/x13/ui/JX13Summary.java +++ b/jdplus-main-desktop/jdplus-x13-desktop-plugin/src/main/java/jdplus/x13/desktop/plugin/x13/ui/JX13Summary.java @@ -51,15 +51,15 @@ public JX13Summary() { chart.setTsUpdateMode(TsUpdateMode.None); this.siPanel = new JSIView(); - JSplitPane split1 = NbComponents.newJSplitPane(JSplitPane.HORIZONTAL_SPLIT, chart, siPanel); - split1.setDividerLocation(0.6); + JSplitPane split1 = NbComponents.newJSplitPane(JSplitPane.VERTICAL_SPLIT, chart, siPanel); + split1.setDividerLocation(0.5); split1.setResizeWeight(.5); this.document = Box.createHorizontalBox(); - JSplitPane split2 = NbComponents.newJSplitPane(JSplitPane.VERTICAL_SPLIT, document, split1); + JSplitPane split2 = NbComponents.newJSplitPane(JSplitPane.HORIZONTAL_SPLIT, document, split1); split2.setDividerLocation(0.5); - split2.setResizeWeight(.5); + split2.setResizeWeight(.4); add(split2, BorderLayout.CENTER); } From 98a0ac74d2955c01548d5cb7064cb0a8482afe42 Mon Sep 17 00:00:00 2001 From: palatej Date: Wed, 10 Jul 2024 11:18:32 +0200 Subject: [PATCH 3/6] Metadata in variable integrated in "equals" method --- .../toolkit/base/api/timeseries/regression/Variable.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-api/src/main/java/jdplus/toolkit/base/api/timeseries/regression/Variable.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-api/src/main/java/jdplus/toolkit/base/api/timeseries/regression/Variable.java index 65dadf97..18786960 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-api/src/main/java/jdplus/toolkit/base/api/timeseries/regression/Variable.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-api/src/main/java/jdplus/toolkit/base/api/timeseries/regression/Variable.java @@ -31,7 +31,8 @@ */ @Development(status = Development.Status.Release) @lombok.Value -@lombok.EqualsAndHashCode(exclude = {"attributes"}) +//@lombok.EqualsAndHashCode(exclude = {"attributes"}) +/* Some attributes could change the behaviour of some algorithms. So, they can't be excluded */ @lombok.Builder(toBuilder = true) public class Variable { From 9497567b85000ab9b8563f908028aee57a77ff4f Mon Sep 17 00:00:00 2001 From: palatej Date: Wed, 10 Jul 2024 11:19:08 +0200 Subject: [PATCH 4/6] New treatment of the decomposition mode in X11 spec box --- .../regarima/descriptors/BasicSpecUI.java | 30 ++-- .../plugin/x13/descriptors/X11SpecUI.java | 129 ++++++++++++++++-- 2 files changed, 135 insertions(+), 24 deletions(-) diff --git a/jdplus-main-desktop/jdplus-x13-desktop-plugin/src/main/java/jdplus/x13/desktop/plugin/regarima/descriptors/BasicSpecUI.java b/jdplus-main-desktop/jdplus-x13-desktop-plugin/src/main/java/jdplus/x13/desktop/plugin/regarima/descriptors/BasicSpecUI.java index deb85f72..61905c72 100644 --- a/jdplus-main-desktop/jdplus-x13-desktop-plugin/src/main/java/jdplus/x13/desktop/plugin/regarima/descriptors/BasicSpecUI.java +++ b/jdplus-main-desktop/jdplus-x13-desktop-plugin/src/main/java/jdplus/x13/desktop/plugin/regarima/descriptors/BasicSpecUI.java @@ -26,10 +26,10 @@ public BasicSpecUI(RegArimaSpecRoot root) { } public DateSelectorUI getSpan() { - return new DateSelectorUI(core().getBasic().getSpan(), UserInterfaceContext.INSTANCE.getDomain(), isRo(), selector->updateSpan(selector)); + return new DateSelectorUI(core().getBasic().getSpan(), UserInterfaceContext.INSTANCE.getDomain(), isRo(), selector -> updateSpan(selector)); } - - public void updateSpan(TimeSelector span){ + + public void updateSpan(TimeSelector span) { update(core().getBasic().toBuilder().span(span).build()); } @@ -37,6 +37,13 @@ public boolean isPreprocessing() { return core().getBasic().isPreprocessing(); } + public void setPreprocessing(boolean pc) { + if (pc != isPreprocessing()) { + update(core().getBasic().toBuilder() + .preprocessing(pc).build()); + } + } + public boolean isPreliminaryCheck() { return core().getBasic().isPreliminaryCheck(); } @@ -58,10 +65,11 @@ public List getProperties() { if (desc != null) { descs.add(desc); } - desc = automdlDesc(); - if (desc != null) { - descs.add(desc); - } +// excluded for the moment. That could change in the future +// desc = preprocessingDesc(); +// if (desc != null) { +// descs.add(desc); +// } return descs; } @@ -92,12 +100,12 @@ private EnhancedPropertyDescriptor spanDesc() { } @Messages({ - "basicSpecUI.automdlDesc.name=auto modelling", - "basicSpecUI.automdlDesc.desc=Allows automatic model identification" + "basicSpecUI.automdlDesc.name=Preprocessing", + "basicSpecUI.automdlDesc.desc=Preprocessing" }) - private EnhancedPropertyDescriptor automdlDesc() { + private EnhancedPropertyDescriptor preprocessingDesc() { try { - PropertyDescriptor desc = new PropertyDescriptor("autoMdl", this.getClass()); + PropertyDescriptor desc = new PropertyDescriptor("preprocessing", this.getClass()); EnhancedPropertyDescriptor edesc = new EnhancedPropertyDescriptor(desc, AUTOMDL_ID); desc.setDisplayName(Bundle.basicSpecUI_automdlDesc_name()); desc.setShortDescription(Bundle.basicSpecUI_automdlDesc_desc()); diff --git a/jdplus-main-desktop/jdplus-x13-desktop-plugin/src/main/java/jdplus/x13/desktop/plugin/x13/descriptors/X11SpecUI.java b/jdplus-main-desktop/jdplus-x13-desktop-plugin/src/main/java/jdplus/x13/desktop/plugin/x13/descriptors/X11SpecUI.java index 8ee2a609..182d0d15 100644 --- a/jdplus-main-desktop/jdplus-x13-desktop-plugin/src/main/java/jdplus/x13/desktop/plugin/x13/descriptors/X11SpecUI.java +++ b/jdplus-main-desktop/jdplus-x13-desktop-plugin/src/main/java/jdplus/x13/desktop/plugin/x13/descriptors/X11SpecUI.java @@ -15,6 +15,7 @@ import java.beans.PropertyDescriptor; import java.util.ArrayList; import java.util.List; +import jdplus.toolkit.base.api.modelling.TransformationType; /** * @@ -22,6 +23,64 @@ */ public class X11SpecUI extends BaseX13SpecUI { + public static enum X11Mode { + Additive, + Multiplicative, + LogAdditive, + PseudoAdditive; + + static X11Mode of(DecompositionMode mode) { + return switch (mode) { + case Multiplicative -> + X11Mode.Multiplicative; + case LogAdditive -> + X11Mode.LogAdditive; + case PseudoAdditive -> + X11Mode.PseudoAdditive; + default -> + X11Mode.Additive; + }; + } + + static DecompositionMode of(X11Mode mode) { + return switch (mode) { + case Multiplicative -> + DecompositionMode.Multiplicative; + case LogAdditive -> + DecompositionMode.LogAdditive; + case PseudoAdditive -> + DecompositionMode.PseudoAdditive; + default -> + DecompositionMode.Additive; + }; + } + } + + public static enum MultiplicativeMode { + Multiplicative, + LogAdditive; + + static MultiplicativeMode of(DecompositionMode mode) { + return switch (mode) { + case LogAdditive -> + LogAdditive; + default -> + Multiplicative; + }; + } + + static DecompositionMode of(MultiplicativeMode mode) { + return switch (mode) { + case Multiplicative -> + DecompositionMode.Multiplicative; + case LogAdditive -> + DecompositionMode.LogAdditive; + default -> + DecompositionMode.Multiplicative; + }; + } + } + X11SpecUI(X13SpecRoot root) { super(root); } @@ -42,6 +101,11 @@ public List getProperties() { EnhancedPropertyDescriptor desc = modeDesc(); if (desc != null) { descs.add(desc); + } else { + desc = multiplicativeModeDesc(); + if (desc != null) { + descs.add(desc); + } } desc = seasDesc(); if (desc != null) { @@ -105,12 +169,20 @@ public String getDisplayName() { return Bundle.x11SpecUI_getDisplayName(); } - public DecompositionMode getMode() { - return x11().getMode(); + public X11Mode getMode() { + return X11Mode.of(x11().getMode()); + } + + public void setMode(X11Mode value) { + update(x11().toBuilder().mode(X11Mode.of(value)).build()); + } + + public MultiplicativeMode getMultiplicativeMode() { + return MultiplicativeMode.of(x11().getMode()); } - public void setMode(DecompositionMode value) { - update(x11().toBuilder().mode(value).build()); + public void setMultiplicativeMode(MultiplicativeMode value) { + update(x11().toBuilder().mode(MultiplicativeMode.of(value)).build()); } // public boolean isUseForecast() { @@ -254,17 +326,17 @@ public void setExcludefcst(boolean value) { public boolean isExcludefcst() { return x11().isExcludeForecast(); } - - public BiasCorrection getBiasCorrection(){ + + public BiasCorrection getBiasCorrection() { return x11().getBias(); } - - public void setBiasCorrection(BiasCorrection bias){ + + public void setBiasCorrection(BiasCorrection bias) { update(x11().toBuilder().bias(bias).build()); } private static final int MODE_ID = 0, SEAS_ID = 1, FORECAST_ID = 2, BACKCAST_ID = 12, LSIGMA_ID = 3, USIGMA_ID = 4, AUTOTREND_ID = 5, - TREND_ID = 6, SEASONMA_ID = 7, FULLSEASONMA_ID = 8, CALENDARSIGMA_ID = 9, SIGMAVEC_ID = 10, EXCLUDEFCST_ID = 11, BIAS_ID=12; + TREND_ID = 6, SEASONMA_ID = 7, FULLSEASONMA_ID = 8, CALENDARSIGMA_ID = 9, SIGMAVEC_ID = 10, EXCLUDEFCST_ID = 11, BIAS_ID = 12; @Messages({ "x11SpecUI.calendarsigmaDesc.name=Calendarsigma", @@ -328,10 +400,18 @@ private EnhancedPropertyDescriptor sigmavecDesc() { @Messages({ "x11SpecUI.modeDesc.name=Mode", - "x11SpecUI.modeDesc.desc=[mode] Decomposition mode. Could be changed by the program, if needed." + "x11SpecUI.modeDesc.desc=[mode] Decomposition mode." }) private EnhancedPropertyDescriptor modeDesc() { try { +// if (regarima().getTransform().getFunction() != TransformationType.None || +// regarima().getOutliers().isUsed() || +// regarima().getRegression().isUsed() ) { +// return null; +// } + if (isPreprocessing()) { + return null; + } PropertyDescriptor desc = new PropertyDescriptor("Mode", this.getClass()); EnhancedPropertyDescriptor edesc = new EnhancedPropertyDescriptor(desc, MODE_ID); edesc.setRefreshMode(EnhancedPropertyDescriptor.Refresh.All); @@ -344,6 +424,28 @@ private EnhancedPropertyDescriptor modeDesc() { } } + @Messages({ + "x11SpecUI.multiplicativeModeDesc.name=Mode", + "x11SpecUI.multiplicativeModeDesc.desc=[mode] Decomposition mode." + }) + private EnhancedPropertyDescriptor multiplicativeModeDesc() { + try { + // only in the case of log transformation + if (regarima().getTransform().getFunction() != TransformationType.Log) { + return null; + } + PropertyDescriptor desc = new PropertyDescriptor("MultiplicativeMode", this.getClass()); + EnhancedPropertyDescriptor edesc = new EnhancedPropertyDescriptor(desc, MODE_ID); + edesc.setRefreshMode(EnhancedPropertyDescriptor.Refresh.All); + desc.setDisplayName(Bundle.x11SpecUI_modeDesc_name()); + desc.setShortDescription(Bundle.x11SpecUI_modeDesc_desc()); + edesc.setReadOnly(isRo()); + return edesc; + } catch (IntrospectionException ex) { + return null; + } + } + @Messages({ "x11SpecUI.seasDesc.name=Seasonal component", "x11SpecUI.seasDesc.desc=Computes a seasonal component (true) or set it to 0 (additive decomposition) or 1 (multiplicative decomposition) (false)" @@ -529,14 +631,15 @@ private EnhancedPropertyDescriptor trendmaDesc() { return null; } } - - @Messages({ + + @Messages({ "x11SpecUI.biasDesc.name=Bias correction", "x11SpecUI.biasDesc.desc=Bias correction for log-additive decomposition" }) private EnhancedPropertyDescriptor biasDesc() { - if (x11().getMode() != DecompositionMode.LogAdditive) + if (x11().getMode() != DecompositionMode.LogAdditive) { return null; + } try { PropertyDescriptor desc = new PropertyDescriptor("biasCorrection", this.getClass()); EnhancedPropertyDescriptor edesc = new EnhancedPropertyDescriptor(desc, BIAS_ID); From 284ac24ec119f034d2ffb6ab580654b62717f51d Mon Sep 17 00:00:00 2001 From: palatej Date: Wed, 10 Jul 2024 11:27:31 +0200 Subject: [PATCH 5/6] Small change in Multi-processing UI --- .../jdplus/sa/desktop/plugin/multiprocessing/ui/SaBatchUI.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdplus-main-desktop/jdplus-sa-desktop-plugin/src/main/java/jdplus/sa/desktop/plugin/multiprocessing/ui/SaBatchUI.java b/jdplus-main-desktop/jdplus-sa-desktop-plugin/src/main/java/jdplus/sa/desktop/plugin/multiprocessing/ui/SaBatchUI.java index 8d27abad..f6e9312d 100644 --- a/jdplus-main-desktop/jdplus-sa-desktop-plugin/src/main/java/jdplus/sa/desktop/plugin/multiprocessing/ui/SaBatchUI.java +++ b/jdplus-main-desktop/jdplus-sa-desktop-plugin/src/main/java/jdplus/sa/desktop/plugin/multiprocessing/ui/SaBatchUI.java @@ -280,7 +280,7 @@ public void actionPerformed(ActionEvent e) { detail.addPropertyChangeListener(DefaultProcessingViewer.SPEC_SAVED, evt -> save((TsDocument) detail.getDocument())); detail.addPropertyChangeListener(DefaultProcessingViewer.SPEC_CHANGED, evt -> detail.onDocumentChanged()); visualRepresentation = NbComponents.newJSplitPane(JSplitPane.VERTICAL_SPLIT, NbComponents.newJScrollPane(master), detail); - visualRepresentation.setResizeWeight(.60d); + visualRepresentation.setResizeWeight(.40d); visualRepresentation.setOneTouchExpandable(true); setLayout(new BorderLayout()); From 82547302020ea88f799e7e9fc9de4038383f855b Mon Sep 17 00:00:00 2001 From: palatej Date: Wed, 10 Jul 2024 11:52:43 +0200 Subject: [PATCH 6/6] Update of the changelog --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a3756b3..9d961906 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Added - ![UI] Add link to online help documentation [#217](https://github.com/jdemetra/jdplus-main/issues/217) +- ![UI] Add additional output in TramoSeats/X13 [#217](https://github.com/jdemetra/jdplus-main/issues/217) +- ![UI] Add benchmarking results in TramoSeats/X13 output [#289](https://github.com/jdemetra/jdplus-main/issues/289) ### Fixed @@ -26,10 +28,18 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ![UI] Fix "Copy spec. to workspace" button [#228](https://github.com/jdemetra/jdplus-main/issues/228) - ![UI] Fix NPE in SaBatchUI renderer [#326](https://github.com/jdemetra/jdplus-main/issues/326) - ![UI] Fix GUI Excel output [#303](https://github.com/jdemetra/jdplus-main/issues/303) +- ![UI] Fix some problems in saving regression effects [#295](https://github.com/jdemetra/jdplus-main/issues/295) +- ![UI] Fix typos in spec dialog boxes +- ![UI] Fix handling of regression variables with lags [#323](https://github.com/jdemetra/jdplus-main/issues/323) +- ![UI] Fix numerical issues in canonical decomposition [#301](https://github.com/jdemetra/jdplus-main/issues/301) +- ![UI] Fix a bug in protobuf translation of TramoSeats results ### Changed - ![UI] Replace splash screen with AI-generated image by [@jadoull](https://github.com/jadoull) +- ![UI] Change the layout of SA summaries (TramoSeats/X13) [#262](https://github.com/jdemetra/jdplus-main/issues/262) +- ![UI] Change the handling of the decomposition mode in X11 spec box + ## [3.2.2] - 2024-03-14