diff --git a/.github/workflows/java-ea-maven.yml b/.github/workflows/java-ea-maven.yml new file mode 100644 index 00000000..6ec751ac --- /dev/null +++ b/.github/workflows/java-ea-maven.yml @@ -0,0 +1,37 @@ +name: Java-EA with Maven + +on: + push: + branches: + - develop + workflow_dispatch: + +jobs: + build-and-test-job: + strategy: + fail-fast: false + matrix: + java: [ '-ea' ] + os: [ ubuntu-latest ] + + name: JDK${{ matrix.java }} on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout source code + uses: actions/checkout@v3 + with: + submodules: true + fetch-depth: 0 + + - name: Setup Java + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: ${{ matrix.java }} + cache: 'maven' + + - name: Build and (headless) test with Maven + uses: smithki/xvfb-action@v1.1.2 + with: + run: mvn -U -B -ntp package diff --git a/.github/workflows/java-maven.yml b/.github/workflows/java-maven.yml index 1e17259d..96ea2107 100644 --- a/.github/workflows/java-maven.yml +++ b/.github/workflows/java-maven.yml @@ -29,7 +29,7 @@ jobs: cache: 'maven' - name: Build and (headless) test with Maven - uses: GabrielBB/xvfb-action@v1 + uses: smithki/xvfb-action@v1.1.2 with: run: mvn -U -B -ntp package @@ -59,7 +59,7 @@ jobs: cache: 'maven' - name: Deploy snapshot with Maven if settings defined - run: test ! -f ci.settings.xml || mvn -B -ntp deploy -DskipTests=true -s ci.settings.xml -P base-deploy,snapshot-deploy,!non-deployable-modules + run: test ! -f ci.settings.xml || mvn -B -ntp deploy -DskipTests -s ci.settings.xml -P base-deploy,snapshot-deploy,!non-deployable-modules env: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} @@ -67,13 +67,22 @@ jobs: SIGN_KEY_PASS: ${{ secrets.MAVEN_GPG_PASSPHRASE }} - name: Dryrun release assets with Maven - run: mvn -B -ntp install -DskipTests=true -P full-release -Djreleaser.dry.run=true + run: mvn -B -ntp install -DskipTests -P full-release -Djreleaser.output.directory=$PWD/out/jreleaser -Djreleaser.dry.run env: JRELEASER_GITHUB_TOKEN: ${{ secrets.JRELEASER_GITHUB_TOKEN }} JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.MAVEN_GPG_PUBLIC_KEY }} JRELEASER_GPG_SECRET_KEY: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} JRELEASER_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} + - name: Upload JReleaser output + if: always() + uses: actions/upload-artifact@v3 + with: + name: assets-snapshot-log + path: | + out/jreleaser/trace.log + out/jreleaser/output.properties + release-job: needs: build-and-test-job if: startsWith(github.repository, 'jdemetra/') && startsWith(github.ref, 'refs/tags/v') @@ -100,7 +109,7 @@ jobs: cache: 'maven' - name: Deploy with Maven if settings defined - run: test ! -f ci.settings.xml || mvn -B -ntp deploy -DskipTests=true -s ci.settings.xml -P base-deploy,release-deploy,!non-deployable-modules + run: test ! -f ci.settings.xml || mvn -B -ntp deploy -DskipTests -s ci.settings.xml -P base-deploy,release-deploy,!non-deployable-modules env: OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} @@ -110,9 +119,18 @@ jobs: MAVEN_OPTS: "--add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.desktop/java.awt.font=ALL-UNNAMED" - name: Release assets with Maven - run: mvn -B -ntp install -DskipTests=true -P full-release + run: mvn -B -ntp install -DskipTests -P full-release -Djreleaser.output.directory=$PWD/out/jreleaser env: JRELEASER_GITHUB_TOKEN: ${{ secrets.JRELEASER_GITHUB_TOKEN }} JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.MAVEN_GPG_PUBLIC_KEY }} JRELEASER_GPG_SECRET_KEY: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} JRELEASER_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} + + - name: Upload JReleaser output + if: always() + uses: actions/upload-artifact@v3 + with: + name: assets-release-log + path: | + out/jreleaser/trace.log + out/jreleaser/output.properties diff --git a/CHANGELOG.md b/CHANGELOG.md index 79cfce50..c0cbe4a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,20 +7,44 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [3.0.2] - 2023-06-14 + +### Changed + +- ![OTHER] DeepSelect instead of Select to read MetaData with "." in key +- ![UI] Change DataSourceProviderBuddy signature to broaden use + +### Fixed + +- ![STAT] Correct forecasts/backcasts in the Burman algorithm (SEATS) +- ![STAT] Implement X11 without seasonal component +- ![STAT] Correct Tramo outliers detection with missing values +- ![UI] Fix missing provider info in property sheet +- ![UI] Fix missing icons in providers + ## [3.0.1] - 2023-05-11 -This the release of JDemetra+ v3.0.1. -[Java SE 17 or later](https://adoptium.net/) version is required to run it. +This is a **patch release** of JDemetra+ v3.0.1. +Its sole purpose is to simplify the installation by providing Windows-specific binaries in addition to the platform-independent packages. +These binaries are self-sufficient and therefore don't require Java anymore. + +Install instructions are available at https://github.com/jdemetra/jdplus-main#installing. ### Added -- Add Windows binaries to release +- ![OTHER] Add Windows binaries to release ## [3.0.0] - 2023-05-02 -This the release of JDemetra+ v3.0.0. -[Java SE 17 or later](https://adoptium.net/) version is required to run it. +This is the **initial release** of JDemetra+ v3.0.0. +[Java SE 17 or later](https://whichjdk.com/) version is required to run it. -[Unreleased]: https://github.com/jdemetra/jd3-main/compare/v3.0.1...HEAD +[Unreleased]: https://github.com/jdemetra/jd3-main/compare/v3.0.2...HEAD +[3.0.2]: https://github.com/jdemetra/jd3-main/compare/v3.0.1...v3.0.2 [3.0.1]: https://github.com/jdemetra/jd3-main/compare/v3.0.0...v3.0.1 [3.0.0]: https://github.com/jdemetra/jd3-main/releases/tag/v3.0.0 + +[STAT]: https://img.shields.io/badge/-STAT-068C09 +[OTHER]: https://img.shields.io/badge/-OTHER-e4e669 +[IO]: https://img.shields.io/badge/-IO-F813F7 +[UI]: https://img.shields.io/badge/-UI-5319E7 diff --git a/README.md b/README.md index 5e3dda87..37321307 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,30 @@ # JDemetra+ v3 +[![Download](https://img.shields.io/github/release/jdemetra/jdplus-main.svg)](https://github.com/jdemetra/jdplus-main/releases/latest) + **JDemetra+ is a tool for seasonal adjustment (SA)** developed by the National Bank of Belgium (NBB) in cooperation with the Deutsche Bundesbank and Eurostat in accordance with the Guidelines of the European Statistical System (ESS). -## Installing / Getting started +Its main **documentation** is available at https://jdemetra-new-documentation.netlify.app. + +## Installing -JDemetra+ v3 runs on any operating system that supports **Java 17 or later** such as Microsoft **Windows**, **Solaris OS**, Apple **macOS**, **Ubuntu** and other various **Linux** distributions. +JDemetra+ v3 runs on any desktop operating system such as Microsoft **Windows**, **Solaris OS**, Apple **macOS**, **Ubuntu** and other various **Linux** distributions. -The project is still in development, but you can find **daily builds** and install instructions at https://github.com/nbbrd/jdemetra-app-snapshot. +Windows-specific packages are provided in addition to the platform-independent packages. +These specific packages are self-sufficient and therefore don't require Java to run. -Its main **documentation** is available at https://jdemetra-new-documentation.netlify.app. +### Microsoft Windows + +1. **Download** the [Windows-specific package](https://github.com/jdemetra/jdplus-main/releases) (`jdemetra-*-windows-bin.zip`) +2. **Extract** it to any folder on your system (i.e. `_DEMETRA_PATH_`) +3. **Run** the executable file `nbdemetra64.exe` located in the `_DEMETRA_PATH_/bin` directory + +### Other operating systems + +1. **Install** [Java version 17 or later](https://whichjdk.com/) +2. **Download** the [platform-independent package](https://github.com/jdemetra/jdplus-main/releases) (`jdemetra-*-bin.zip`) +3. **Extract** it to any folder on your system (i.e. `_DEMETRA_PATH_`) +4. **Run** the executable file `$ ./nbdemetra` located in the `_DEMETRA_PATH_/bin` directory ## Developing @@ -22,6 +38,8 @@ cd jdplus-main mvn clean install ``` +Daily builds are also available at https://github.com/nbbrd/jdemetra-app-snapshot. + ### Structure JDemetra+ code is **divided into topics** (toolkit, x13, ...) and is **grouped by lifecycle** (main, experimental, ...). diff --git a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-api/pom.xml b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-api/pom.xml index d8b0ad31..deae4c01 100644 --- a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-api/pom.xml +++ b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-api/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-sa-base-parent - 3.0.1 + 3.0.2 jdplus-sa-base-api diff --git a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-core/pom.xml b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-core/pom.xml index f6043142..718633f1 100644 --- a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-core/pom.xml +++ b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-core/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-sa-base-parent - 3.0.1 + 3.0.2 jdplus-sa-base-core diff --git a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-csv/pom.xml b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-csv/pom.xml index 0c50cad4..972508ac 100644 --- a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-csv/pom.xml +++ b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-csv/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-sa-base-parent - 3.0.1 + 3.0.2 jdplus-sa-base-csv diff --git a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-information/pom.xml b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-information/pom.xml index 581adaa1..44bf9972 100644 --- a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-information/pom.xml +++ b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-information/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-sa-base-parent - 3.0.1 + 3.0.2 jdplus-sa-base-information diff --git a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-information/src/main/java/jdplus/sa/base/information/SaItemMapping.java b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-information/src/main/java/jdplus/sa/base/information/SaItemMapping.java index d1e67260..78a03150 100644 --- a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-information/src/main/java/jdplus/sa/base/information/SaItemMapping.java +++ b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-information/src/main/java/jdplus/sa/base/information/SaItemMapping.java @@ -91,7 +91,7 @@ public SaItem read(InformationSet info, NameManager defaults, M } InformationSet md = info.getSubSet(METADATA); if (md != null) { - List> sel = md.select(String.class); + List> sel = md.deepSelect(String.class); sel.forEach(v -> builder.meta(v.getName(), v.getValue())); } String name = info.get(NAME, String.class); diff --git a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-protobuf/pom.xml b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-protobuf/pom.xml index 09d95138..b06dac6a 100644 --- a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-protobuf/pom.xml +++ b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-protobuf/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-sa-base-parent - 3.0.1 + 3.0.2 jdplus-sa-base-protobuf diff --git a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-r/pom.xml b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-r/pom.xml index 6b1e0543..fa73b0d0 100644 --- a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-r/pom.xml +++ b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-r/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-sa-base-parent - 3.0.1 + 3.0.2 jdplus-sa-base-r diff --git a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-workspace/pom.xml b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-workspace/pom.xml index 07af8eb0..02667fb0 100644 --- a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-workspace/pom.xml +++ b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-workspace/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-sa-base-parent - 3.0.1 + 3.0.2 jdplus-sa-base-workspace diff --git a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-xml/pom.xml b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-xml/pom.xml index e0ea3f1f..261ee46b 100644 --- a/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-xml/pom.xml +++ b/jdplus-main-base/jdplus-sa-base-parent/jdplus-sa-base-xml/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-sa-base-parent - 3.0.1 + 3.0.2 jdplus-sa-base-xml diff --git a/jdplus-main-base/jdplus-sa-base-parent/pom.xml b/jdplus-main-base/jdplus-sa-base-parent/pom.xml index d9826bcb..b59cb5d4 100644 --- a/jdplus-main-base/jdplus-sa-base-parent/pom.xml +++ b/jdplus-main-base/jdplus-sa-base-parent/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-main-base - 3.0.1 + 3.0.2 jdplus-sa-base-parent diff --git a/jdplus-main-base/jdplus-spreadsheet-base-parent/jdplus-spreadsheet-base-api/pom.xml b/jdplus-main-base/jdplus-spreadsheet-base-parent/jdplus-spreadsheet-base-api/pom.xml index ceba8d2a..fbb6993a 100644 --- a/jdplus-main-base/jdplus-spreadsheet-base-parent/jdplus-spreadsheet-base-api/pom.xml +++ b/jdplus-main-base/jdplus-spreadsheet-base-parent/jdplus-spreadsheet-base-api/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-spreadsheet-base-parent - 3.0.1 + 3.0.2 jdplus-spreadsheet-base-api diff --git a/jdplus-main-base/jdplus-spreadsheet-base-parent/pom.xml b/jdplus-main-base/jdplus-spreadsheet-base-parent/pom.xml index 8e7262ef..2fe7a058 100644 --- a/jdplus-main-base/jdplus-spreadsheet-base-parent/pom.xml +++ b/jdplus-main-base/jdplus-spreadsheet-base-parent/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-main-base - 3.0.1 + 3.0.2 jdplus-spreadsheet-base-parent diff --git a/jdplus-main-base/jdplus-sql-base-parent/jdplus-sql-base-api/pom.xml b/jdplus-main-base/jdplus-sql-base-parent/jdplus-sql-base-api/pom.xml index 7b8d367f..2407fd0a 100644 --- a/jdplus-main-base/jdplus-sql-base-parent/jdplus-sql-base-api/pom.xml +++ b/jdplus-main-base/jdplus-sql-base-parent/jdplus-sql-base-api/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-sql-base-parent - 3.0.1 + 3.0.2 jdplus-sql-base-api diff --git a/jdplus-main-base/jdplus-sql-base-parent/pom.xml b/jdplus-main-base/jdplus-sql-base-parent/pom.xml index 92e067fb..4a4441b7 100644 --- a/jdplus-main-base/jdplus-sql-base-parent/pom.xml +++ b/jdplus-main-base/jdplus-sql-base-parent/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-main-base - 3.0.1 + 3.0.2 jdplus-sql-base-parent diff --git a/jdplus-main-base/jdplus-text-base-parent/jdplus-text-base-api/pom.xml b/jdplus-main-base/jdplus-text-base-parent/jdplus-text-base-api/pom.xml index 6b20c200..aa489435 100644 --- a/jdplus-main-base/jdplus-text-base-parent/jdplus-text-base-api/pom.xml +++ b/jdplus-main-base/jdplus-text-base-parent/jdplus-text-base-api/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-text-base-parent - 3.0.1 + 3.0.2 jdplus-text-base-api diff --git a/jdplus-main-base/jdplus-text-base-parent/pom.xml b/jdplus-main-base/jdplus-text-base-parent/pom.xml index f4901bc2..1b7019c0 100644 --- a/jdplus-main-base/jdplus-text-base-parent/pom.xml +++ b/jdplus-main-base/jdplus-text-base-parent/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-main-base - 3.0.1 + 3.0.2 jdplus-text-base-parent diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-api/pom.xml b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-api/pom.xml index b620353c..f5a03146 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-api/pom.xml +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-api/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-toolkit-base-parent - 3.0.1 + 3.0.2 jdplus-toolkit-base-api diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-api/src/main/java/jdplus/toolkit/base/api/timeseries/TsPeriod.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-api/src/main/java/jdplus/toolkit/base/api/timeseries/TsPeriod.java index aa0c6b82..5ea87fa1 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-api/src/main/java/jdplus/toolkit/base/api/timeseries/TsPeriod.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-api/src/main/java/jdplus/toolkit/base/api/timeseries/TsPeriod.java @@ -146,15 +146,15 @@ public TsPeriod withId(long id) { } /** - * Distance between this period and the given period (exclusive) + * Distance between this period and the given period * - * @param endExclusive The given period + * @param end The given period * @return The result is 0 when the two periods are equal, positive if the * given period is after this period or negative otherwise. */ - public int until(TsPeriod endExclusive) { - checkCompatibility(endExclusive); - return (int) (getRebasedId(endExclusive) - id); + public int until(TsPeriod end) { + checkCompatibility(end); + return (int) (getRebasedId(end) - id); } // /** diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/pom.xml b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/pom.xml index 0e703d38..0b1404ef 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/pom.xml +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-toolkit-base-parent - 3.0.1 + 3.0.2 jdplus-toolkit-base-core diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/internal/toolkit/base/core/math/functions/riso/LbfgsMinimizer.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/internal/toolkit/base/core/math/functions/riso/LbfgsMinimizer.java index 839f4b0d..99fa05a5 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/internal/toolkit/base/core/math/functions/riso/LbfgsMinimizer.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/internal/toolkit/base/core/math/functions/riso/LbfgsMinimizer.java @@ -128,7 +128,8 @@ public double getGTol() { * * @return */ - public int getNIter() { + @Override + public int getIterationsCount() { return lbfgs.getNIter(); } diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/FunctionMinimizer.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/FunctionMinimizer.java index 77256ce8..19396982 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/FunctionMinimizer.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/FunctionMinimizer.java @@ -59,6 +59,8 @@ interface Builder{ IFunctionPoint getResult(); double getObjective(); + + int getIterationsCount(); } diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/GridSearch.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/GridSearch.java index c6e36517..86c34aed 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/GridSearch.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/GridSearch.java @@ -238,4 +238,12 @@ private double evaluate(double x) { } } + /** + * + * @return + */ + @Override + public int getIterationsCount() { + return niter; + } } diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/bfgs/Bfgs.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/bfgs/Bfgs.java index c2bb3f5e..a94d7561 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/bfgs/Bfgs.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/bfgs/Bfgs.java @@ -322,6 +322,15 @@ public BfgsBuilder toBuilder() { return builder; } + /** + * + * @return + */ + @Override + public int getIterationsCount() { + return iter; + } + @Override public FastMatrix curvatureAtMinimum() { return H; diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/levmar/DogLegMinimizer.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/levmar/DogLegMinimizer.java index c45633c2..ec33c386 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/levmar/DogLegMinimizer.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/levmar/DogLegMinimizer.java @@ -240,6 +240,15 @@ private boolean iterate() { } + /** + * + * @return + */ + @Override + public int getIterationsCount() { + return iter; + } + private boolean calc() { iter = 0; ecur_ = DataBlock.of(fcur_.getE()); diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/levmar/LevenbergMarquardtMinimizer.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/levmar/LevenbergMarquardtMinimizer.java index 7536cf56..3297071b 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/levmar/LevenbergMarquardtMinimizer.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/levmar/LevenbergMarquardtMinimizer.java @@ -159,7 +159,16 @@ public ISsqFunctionPoint getResult() { return currentPoint; } + /** + * + * @return + */ @Override + public int getIterationsCount() { + return iter; + } + + @Override public double getObjective() { return currentObjective; } diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/minpack/MinPackMinimizer.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/minpack/MinPackMinimizer.java index 7bf0109a..52ead963 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/minpack/MinPackMinimizer.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/minpack/MinPackMinimizer.java @@ -115,6 +115,15 @@ public double getObjective() { return m_problem.getResult() == null ? Double.NaN : m_problem.getResult().getSsqE(); } + /** + * + * @return + */ + @Override + public int getIterationsCount() { + return m_estimator.getIterCount(); + } + @Override public boolean minimize(ISsqFunctionPoint start) { m_problem = new SsqEstimationProblem(start); diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/ssq/ProxyMinimizer.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/ssq/ProxyMinimizer.java index 813f1f4c..9c534e60 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/ssq/ProxyMinimizer.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/ssq/ProxyMinimizer.java @@ -105,4 +105,9 @@ public boolean minimize(IFunctionPoint start) { ISsqFunctionPoint s = fn.ssqEvaluate(start.getParameters()); return minimizer.minimize(s); } + + @Override + public int getIterationsCount(){ + return minimizer.getIterationsCount(); + } } diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/ssq/SsqFunctionMinimizer.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/ssq/SsqFunctionMinimizer.java index 185a02ae..e2640f94 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/ssq/SsqFunctionMinimizer.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/ssq/SsqFunctionMinimizer.java @@ -59,4 +59,5 @@ interface Builder{ */ boolean minimize(ISsqFunctionPoint start); + int getIterationsCount(); } diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/ssq/SsqProxyMinimizer.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/ssq/SsqProxyMinimizer.java index a1dbe323..4c463a02 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/ssq/SsqProxyMinimizer.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/math/functions/ssq/SsqProxyMinimizer.java @@ -78,4 +78,13 @@ public boolean minimize(ISsqFunctionPoint start) { return minimizer.minimize(new SsqProxyFunctionPoint(start)); } + /** + * + * @return + */ + @Override + public int getIterationsCount() { + return minimizer.getIterationsCount(); + } + } diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/regarima/outlier/FastOutlierDetector.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/regarima/outlier/FastOutlierDetector.java index e451d0d3..b66f7850 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/regarima/outlier/FastOutlierDetector.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/regarima/outlier/FastOutlierDetector.java @@ -159,7 +159,7 @@ private void processOutlier(int idx) { } private DoubleSeq fullResiduals(RegArmaModel differencedModel, ConcentratedLikelihoodWithMissing cll) { - if (cll.nx() == 0) { + if (cll.allCoefficients().isEmpty() ) { return cll.e(); } DataBlock res = differencedModel.asLinearModel().calcResiduals(cll.allCoefficients()); diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/stats/StatUtility.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/stats/StatUtility.java index b2f494a1..a86121d4 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/stats/StatUtility.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/stats/StatUtility.java @@ -69,7 +69,7 @@ public double theilInequalityCoefficient2(@NonNull DoubleSeq a, @NonNull DoubleS throw new StatException("Non compatible data"); } if(a.anyMatch(d -> d == 0)){ - throw new StatException("The method requires a not to contain any 0"); + return Double.NaN; } if(a.isEmpty() || b.isEmpty()){ throw new StatException("a and b cannot be empty"); diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/stats/linearmodel/LeastSquaresResults.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/stats/linearmodel/LeastSquaresResults.java index a99d0374..bedc09df 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/stats/linearmodel/LeastSquaresResults.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/main/java/jdplus/toolkit/base/core/stats/linearmodel/LeastSquaresResults.java @@ -326,8 +326,16 @@ public double standardDeviation(int idx) { double v = ucov.get(idx, idx); return Math.sqrt(getErrorMeanSquares() * v); } + + public double T(int idx){ + return T(idx,0); + } - public double T(int idx) { + public StatisticalTest Ttest(int idx) { + return Ttest(idx, 0); + } + + public double T(int idx, double value) { double e = ucov.get(idx, idx); if (e == 0) { return Double.NaN; @@ -336,11 +344,11 @@ public double T(int idx) { if (b == 0) { return 0; } - return b / Math.sqrt(e * getErrorMeanSquares()); + return (b - value) / Math.sqrt(e * getErrorMeanSquares()); } - public StatisticalTest Ttest(int idx) { - double t = T(idx); + public StatisticalTest Ttest(int idx, double value) { + double t = T(idx, value); if (!Double.isFinite(t)) { return null; } else { diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/test/java/jdplus/toolkit/base/core/stats/StatUtilityTest.java b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/test/java/jdplus/toolkit/base/core/stats/StatUtilityTest.java index 7cfece5e..4ae8feb8 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/test/java/jdplus/toolkit/base/core/stats/StatUtilityTest.java +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-core/src/test/java/jdplus/toolkit/base/core/stats/StatUtilityTest.java @@ -27,13 +27,8 @@ public void testTheil2() { assertThat(StatUtility.theilInequalityCoefficient2(y, f2)) .isEqualTo(1); - assertThatExceptionOfType(StatException.class) - .isThrownBy(() -> StatUtility.theilInequalityCoefficient2(DoubleSeq.of(1, 2, 3, 4), DoubleSeq.ONE)) - .withMessage("Non compatible data"); - - assertThatExceptionOfType(StatException.class) - .isThrownBy(() -> StatUtility.theilInequalityCoefficient2(DoubleSeq.ZERO, DoubleSeq.ONE)) - .withMessage("The method requires a not to contain any 0"); + assertThat(StatUtility.theilInequalityCoefficient2(DoubleSeq.ZERO, DoubleSeq.ONE)) + .isNaN(); assertThat(StatUtility.theilInequalityCoefficient2(DoubleSeq.ONE, DoubleSeq.ZERO)) .isEqualTo(0); diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-information/pom.xml b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-information/pom.xml index 848b3293..82d029fa 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-information/pom.xml +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-information/pom.xml @@ -4,7 +4,7 @@ eu.europa.ec.joinup.sat jdplus-toolkit-base-parent - 3.0.1 + 3.0.2 jdplus-toolkit-base-information diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-protobuf/pom.xml b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-protobuf/pom.xml index bb8ffa1f..748fb856 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-protobuf/pom.xml +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-protobuf/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-toolkit-base-parent - 3.0.1 + 3.0.2 jdplus-toolkit-base-protobuf diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-r/pom.xml b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-r/pom.xml index 4d2588a1..068d9759 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-r/pom.xml +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-r/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-toolkit-base-parent - 3.0.1 + 3.0.2 jdplus-toolkit-base-r diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-tsp/pom.xml b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-tsp/pom.xml index 485d76f5..5fa36c73 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-tsp/pom.xml +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-tsp/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-toolkit-base-parent - 3.0.1 + 3.0.2 jdplus-toolkit-base-tsp diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-tspbridge/pom.xml b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-tspbridge/pom.xml index 60ebf95b..3c35c751 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-tspbridge/pom.xml +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-tspbridge/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-toolkit-base-parent - 3.0.1 + 3.0.2 jdplus-toolkit-base-tspbridge diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-workspace/pom.xml b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-workspace/pom.xml index 29560b97..9cc6035d 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-workspace/pom.xml +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-workspace/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-toolkit-base-parent - 3.0.1 + 3.0.2 jdplus-toolkit-base-workspace diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-xml/pom.xml b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-xml/pom.xml index a5666299..8e7a98e1 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-xml/pom.xml +++ b/jdplus-main-base/jdplus-toolkit-base-parent/jdplus-toolkit-base-xml/pom.xml @@ -4,7 +4,7 @@ eu.europa.ec.joinup.sat jdplus-toolkit-base-parent - 3.0.1 + 3.0.2 jdplus-toolkit-base-xml diff --git a/jdplus-main-base/jdplus-toolkit-base-parent/pom.xml b/jdplus-main-base/jdplus-toolkit-base-parent/pom.xml index c075f915..cb354fec 100644 --- a/jdplus-main-base/jdplus-toolkit-base-parent/pom.xml +++ b/jdplus-main-base/jdplus-toolkit-base-parent/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-main-base - 3.0.1 + 3.0.2 jdplus-toolkit-base-parent diff --git a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-api/pom.xml b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-api/pom.xml index 4da8e9ef..f5e17a59 100644 --- a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-api/pom.xml +++ b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-api/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-tramoseats-base-parent - 3.0.1 + 3.0.2 jdplus-tramoseats-base-api diff --git a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-api/src/main/java/jdplus/tramoseats/base/api/tramo/TradingDaysSpec.java b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-api/src/main/java/jdplus/tramoseats/base/api/tramo/TradingDaysSpec.java index dc6de987..faae2572 100644 --- a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-api/src/main/java/jdplus/tramoseats/base/api/tramo/TradingDaysSpec.java +++ b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-api/src/main/java/jdplus/tramoseats/base/api/tramo/TradingDaysSpec.java @@ -41,7 +41,7 @@ public static TradingDaysSpec stockTradingDays(int w, RegressionTestType type) { LengthOfPeriodType.None, type, DEF_ADJUST, DEF_SIMPLIFIED, w, AutoMethod.UNUSED, 0, null, null); } - public static TradingDaysSpec stockTradingDays(int w, @NonNull Parameter[] tdcoeff) { + public static TradingDaysSpec stockTradingDays(int w, Parameter[] tdcoeff) { if (tdcoeff.length != 6) { throw new IllegalArgumentException(); } @@ -58,7 +58,7 @@ public static TradingDaysSpec userDefined(@NonNull String[] vars, RegressionTest LengthOfPeriodType.None, type, DEF_ADJUST, DEF_SIMPLIFIED, 0, AutoMethod.UNUSED, 0, null, null); } - public static TradingDaysSpec userDefined(@NonNull String[] vars, @NonNull Parameter[] coeff) { + public static TradingDaysSpec userDefined(@NonNull String[] vars, Parameter[] coeff) { if (coeff.length != vars.length) { throw new IllegalArgumentException(); } diff --git a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-core/pom.xml b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-core/pom.xml index 4121d10e..e8c6a86f 100644 --- a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-core/pom.xml +++ b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-core/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-tramoseats-base-parent - 3.0.1 + 3.0.2 jdplus-tramoseats-base-core diff --git a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-core/src/main/java/jdplus/tramoseats/base/core/seats/BurmanEstimates.java b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-core/src/main/java/jdplus/tramoseats/base/core/seats/BurmanEstimates.java index c31c2028..7e1e6ca0 100644 --- a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-core/src/main/java/jdplus/tramoseats/base/core/seats/BurmanEstimates.java +++ b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-core/src/main/java/jdplus/tramoseats/base/core/seats/BurmanEstimates.java @@ -29,7 +29,6 @@ import jdplus.toolkit.base.core.ucarima.WienerKolmogorovEstimators; import jdplus.toolkit.base.api.data.DoubleSeq; import jdplus.toolkit.base.api.data.Doubles; -import jdplus.toolkit.base.api.data.DoublesMath; import jdplus.toolkit.base.core.ssf.arima.ExactArimaForecasts; import jdplus.toolkit.base.core.math.matrices.FastMatrix; import jdplus.toolkit.base.core.math.matrices.MatrixWindow; @@ -126,9 +125,6 @@ private BurmanEstimates(Builder builder) { for (int i = 0; i < ucm.getComponentsCount(); ++i) { calc(i); } -// if (bmean) { -// completeCasts(); -// } } private final int nfcasts, nbcasts; @@ -146,7 +142,7 @@ private BurmanEstimates(Builder builder) { private DoubleSeq[] estimates, forecasts, backcasts; private DoubleSeq xbcasts, xfcasts; private LUDecomposition lu; - private int nf; + private int nf, nbc, nfc; private void calc(final int cmp) { int n = data.length(); @@ -167,8 +163,8 @@ private void calc(final int cmp) { return; } BackFilter sur = ucm.getComponent(cmp).getNonStationaryAr(); - // no unit root if (mean != 0) { + // no unit root if (sur.isIdentity()) { mc = meanc; } else { @@ -187,17 +183,19 @@ private void calc(final int cmp) { int pstar = ar.length - 1; int rstar = qstar + pstar; double[] gcur = this.g[cmp]; - int gstar = gcur.length - 1; // gstar = max(pstar, qstar). Could it be less ? - // We want to estimate x1(t) = g(F)/Q(F) z(t) in [-2*q*, n + 2*q*[ - // 1. Compute w1(t) = g(F) z(t) in [-2*q*, n + q*[ (nf - g* = q*) + int gstar = gcur.length - 1; + // g* = max(p*, q*). Could it be less ? + // Also, nf-g*=q*; nfc >= nf + // We want to estimate x1(t) = g(F)/Q(F) z(t) in [-nbc, n + nfc[ + // 1. Compute w1(t) = g(F) z(t) in [-nbc, n + q*[ (nf - g* = q*) // 2. Estimate x1(t) for t in [n+q*-p*, n+ 2* q*[ . See Burman's paper // 3. Compute the rest by recursion // ////////////////////////////////// - // 1. w1(t) = g(F) z(t) in [-2* q*, n + q*[ - // rem: z in [-nf, n+nf[. Starts at nf-2*q* - double[] w1 = new double[n + 2 * nf]; - int start = nf - 2 * qstar, end = nf + n + qstar; + // 1. w1(t) = g(F) z(t) in [-nbc, n + q*[ + // rem: z in [-nbc, n+nfc[. + int start = 0, end = nbc + n + qstar; + double[] w1 = new double[end]; for (int i = start; i < end; ++i) { double s = gcur[0] * z[i]; for (int k = 1; k <= gstar; ++k) { @@ -206,11 +204,11 @@ private void calc(final int cmp) { w1[i] = s; } - // 2. Estimate x1(t) for t in [n + q* - p*, n+ 2* q*[ + // 2. Estimate x1(t) for t in [n + q* - p*, n + 2* q*[ // Q(F) x1(t) = w1(t) (t in n + q* - p*, n + q*) // p equations // P(B) x1(t) = 0 or m (t in n+q*, n + 2 * q*) // q equations double[] ww = new double[rstar]; - for (int i = 0, j = nf + n + qstar - pstar; i < pstar; ++i, ++j) { + for (int i = 0, j = nbc + n + qstar - pstar; i < pstar; ++i, ++j) { ww[i] = w1[j]; } for (int i = pstar; i < ww.length; ++i) { @@ -218,14 +216,14 @@ private void calc(final int cmp) { } lu.solve(DataBlock.of(ww)); - double[] x1 = new double[n + 2 * nf]; - start = nf + n + qstar - pstar; + double[] x1 = new double[nbc + n + nfc]; + start = nbc + n + qstar - pstar; // Estimated xl for (int i = 0, j = start; i < rstar; ++i, ++j) { x1[j] = ww[i]; } // backward iteration: w = (m+MA(F))x1 <-> w(t)-m = MA(f)x1 - end = nf - 2 * qstar; + end = 0; for (int i = start - 1; i >= end; --i) { double s = w1[i]; for (int k = 1; k < ma.length; ++k) { @@ -233,12 +231,21 @@ private void calc(final int cmp) { } x1[i] = s / ma[0]; } + // forward iteration + for (int i = nbc + n + 2 * qstar; i < x1.length; ++i) { + double s = fmu/2; + for (int j = 1; j <= pstar; ++j) { + s -= ar[j] * x1[i - j]; + } + x1[i] = s; + } - // symmetric computation for w2 =g(B) z(t) - // 1. w2(t) = g(B) z(t) in [-q*, n + 2*q*[ - double[] w2 = new double[n + 2 * nf]; - start = nf - qstar; - end = nf + n + 2 * qstar; + // symmetric computation for w2 = g(B) z(t) + // 1. w2(t) = g(B) z(t) in [-q*, n + nfc[ + // we waste some memory to align the indices + double[] w2 = new double[n + nbc + nfc]; + start = nbc - qstar; + end = nbc + n + nfc; for (int i = start; i < end; ++i) { double s = gcur[0] * z[i]; for (int k = 1; k <= gstar; ++k) { @@ -251,7 +258,7 @@ private void calc(final int cmp) { // Q(F) x1(t) = w1(t) (t in n + q* - p*, n + q*) // p equations // P(B) x1(t) = 0 or m (t in n+q*, n + 2 * q*) // q equations ww = new double[rstar]; - for (int i = 0, j = nf + pstar - qstar; i < pstar; ++i) { + for (int i = 0, j = nbc + pstar - qstar; i < pstar; ++i) { ww[i] = w2[--j]; } for (int i = pstar; i < ww.length; ++i) { @@ -259,15 +266,14 @@ private void calc(final int cmp) { } lu.solve(DataBlock.of(ww)); // ww contains estimates of the signal for t= -2q* to p*-q* (in reverse order) - double[] x2 = new double[n + 2 * nf]; - start = nf + pstar - qstar; + double[] x2 = new double[n + nbc + nfc]; + start = nbc + pstar - qstar; for (int i = 0, j = start; i < ww.length; ++i) { x2[--j] = ww[i]; } // forward recursion: Q(B) w = x2 - end = nf + n + 2 * qstar; - for (int i = start; i < end; ++i) { + for (int i = start; i < x2.length; ++i) { double s = w2[i]; for (int k = 1; k < ma.length; ++k) { s -= x2[i - k] * ma[k]; @@ -275,39 +281,25 @@ private void calc(final int cmp) { x2[i] = s / ma[0]; } - int nfc = Math.max(2 * qstar, nfcasts), nbc = Math.max(2 * qstar, nbcasts); - + // backward iteration + for (int i = nbc - 2 * qstar-1; i >= 0; --i) { + double s = bmu/2; + for (int j = 1; j <= pstar; ++j) { + s -= ar[j] * x2[i + j]; + } + x2[i] = s; + } double[] rslt = new double[n + nfc + nbc]; - int xstart = nf - 2 * qstar, xend = nf + n + 2 * qstar; - int del = nbc - nf; // x1, x2 defined in [-2*qstar, n + 2*qstar[ // rslt define in ]-nbc, n+nbf[ - for (int i = xstart, j = xstart + del; i < xend; ++i, ++j) { - rslt[j] = x1[i] + x2[i]; + for (int i = 0; i < x1.length; ++i) { + rslt[i] = x1[i] + x2[i]; } estimates[cmp] = DoubleSeq.of(rslt, nbc, n); - double[] car = ucm.getComponent(cmp).getAr().asPolynomial().toArray(); if (mc != 0) { for (int i = 0; i < rslt.length; ++i) { rslt[i] += mc; } - } else { - // complete backcasts - for (int j = nbc - 2 * qstar - 1; j >= 0; --j) { - double s = fmu; - for (int k = 1; k < car.length; ++k) { - s -= car[k] * rslt[j + k]; - } - rslt[j] = s; - } - // complete forecasts - for (int j = nbc + n + 2 * qstar; j < rslt.length; ++j) { - double s = bmu; - for (int k = 1; k < car.length; ++k) { - s -= car[k] * rslt[j - k]; - } - rslt[j] = s; - } } if (nfcasts > 0) { forecasts[cmp] = DoubleSeq.of(rslt, n + nbc, nfcasts); @@ -317,27 +309,6 @@ private void calc(final int cmp) { } } -// private void completeCasts() { -// if (nbcasts > 0) { -// DoubleSeq tmp = this.getSeriesBackcasts(); -// for (int i = 0; i < backcasts.length; ++i) { -// if (backcasts[i] != null) { -// tmp = DoublesMath.subtract(tmp, backcasts[i]); -// } -// } -// backcasts[mcmp] = tmp; -// } -// if (nfcasts > 0) { -// DoubleSeq tmp = this.getSeriesForecasts(); -// for (int i = 0; i < forecasts.length; ++i) { -// if (forecasts[i] != null) { -// tmp = DoublesMath.subtract(tmp, forecasts[i]); -// } -// } -// forecasts[mcmp] = tmp; -// } -// -// } /** * * @param cmp @@ -360,11 +331,12 @@ private void extendSeries() { int q = ma.length - 1, p = ar.length - 1; nf = q > p ? 2 * q : p + q; - + nbc = Math.max(nf, nbcasts); + nfc = Math.max(nf, nfcasts); ExactArimaForecasts fcasts = new ExactArimaForecasts(); fcasts.prepare(wk.getUcarimaModel().getModel(), bmean); - xfcasts = fcasts.forecasts(data, Math.max(nf, nfcasts)); - xbcasts = fcasts.backcasts(data, Math.max(nf, nbcasts)); + xfcasts = fcasts.forecasts(data, nfc); + xbcasts = fcasts.backcasts(data, nbc); if (bmean) { mean = fcasts.getMean(); } else { @@ -372,13 +344,13 @@ private void extendSeries() { } int n = data.length(); // z is the extended series with forecasts and backcasts - z = new double[n + 2 * nf]; - data.copyTo(z, nf); + z = new double[n + nbc+nfc]; + data.copyTo(z, nbc); - xfcasts.range(0, nf).copyTo(z, nf + n); - xbcasts.drop(xbcasts.length() - nf, 0).copyTo(z, 0); + xfcasts.copyTo(z, nbc + n); + xbcasts.copyTo(z, 0); + meanc = correctedMean(); if (useMean()) { - meanc = correctedMean(); for (int i = 0; i < z.length; ++i) { z[i] -= meanc; } diff --git a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-information/pom.xml b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-information/pom.xml index a25213bc..bfc572f0 100644 --- a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-information/pom.xml +++ b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-information/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-tramoseats-base-parent - 3.0.1 + 3.0.2 jdplus-tramoseats-base-information diff --git a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-protobuf/pom.xml b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-protobuf/pom.xml index e7f99478..a0c08e23 100644 --- a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-protobuf/pom.xml +++ b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-protobuf/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-tramoseats-base-parent - 3.0.1 + 3.0.2 jdplus-tramoseats-base-protobuf diff --git a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-r/pom.xml b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-r/pom.xml index 2264b70a..c7c68950 100644 --- a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-r/pom.xml +++ b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-r/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-tramoseats-base-parent - 3.0.1 + 3.0.2 jdplus-tramoseats-base-r diff --git a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-r/src/main/java/jdplus/tramoseats/base/r/TramoOutliersDetection.java b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-r/src/main/java/jdplus/tramoseats/base/r/TramoOutliersDetection.java index 77f337f4..9a9a915f 100644 --- a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-r/src/main/java/jdplus/tramoseats/base/r/TramoOutliersDetection.java +++ b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-r/src/main/java/jdplus/tramoseats/base/r/TramoOutliersDetection.java @@ -48,6 +48,8 @@ import jdplus.toolkit.base.core.sarima.estimation.SarimaMapping; import jdplus.tramoseats.base.core.tramo.internal.TramoUtility; import jdplus.toolkit.base.api.information.GenericExplorable; +import jdplus.toolkit.base.api.util.IntList; +import jdplus.toolkit.base.core.data.interpolation.AverageInterpolator; /** * @@ -87,7 +89,7 @@ public byte[] buffer() { SarimaModel initialArima, finalArima; - DoubleSeq y; + TsData y; Matrix x; OutlierDescriptor[] outliers; @@ -177,17 +179,21 @@ public Class getSourceClass() { } return names; }); + MAPPING.set(Y, TsData.class, source -> source.getY()); MAPPING.set(REGRESSORS, Matrix.class, source -> source.getRegressors()); MAPPING.set(LIN, double[].class, source -> source.getLinearized().toArray()); } } public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Matrix x, - boolean bao, boolean bls, boolean btc, boolean bso, double cv, boolean ml) { - TsData y = ts.cleanExtremities(); - if (x != null && ts.length() != y.length()) { - int start = ts.getStart().until(y.getStart()); - x = x.extract(start, y.length(), 0, x.getColumnsCount()); + boolean bao, boolean bls, boolean btc, boolean bso, double cv, boolean ml, boolean clean) { + TsData y = ts; + if (clean) { + y = ts.cleanExtremities(); + if (x != null && ts.length() != y.length()) { + int start = ts.getStart().until(y.getStart()); + x = x.extract(start, y.length(), 0, x.getColumnsCount()); + } } SarimaOrders spec = new SarimaOrders(y.getAnnualFrequency()); spec.setP(order[0]); @@ -199,6 +205,10 @@ public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Mat spec.setBq(seasonal[2]); } + double[] yc = y.getValues().toArray(); + IntList missings = new IntList(); + AverageInterpolator.cleanMissings(yc, missings); + int[] m = missings.toArray(); SarimaModel arima = SarimaModel.builder(spec) .setDefault() .build(); @@ -206,8 +216,9 @@ public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Mat RegArimaModel regarima = RegArimaModel.builder() .arima(arima) .meanCorrection(mean) - .y(y.getValues()) + .y(DoubleSeq.of(yc)) .addX(FastMatrix.of(x)) + .missing(m) .build(); RegArimaEstimation estimation0 = RegSarimaComputer.builder() .build() @@ -227,7 +238,7 @@ public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Mat if (bso) { factories.add(new PeriodicOutlierFactory(y.getAnnualFrequency(), true)); } - detector.setOutlierFactories(factories.toArray(new IOutlierFactory[factories.size()])); + detector.setOutlierFactories(factories.toArray(IOutlierFactory[]::new)); FastOutliersDetector od = FastOutliersDetector.builder() .singleOutlierDetector(detector) @@ -236,7 +247,13 @@ public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Mat .processor(RegArimaUtility.processor(true, 1e-7)) .build(); - od.prepare(y.length()); + od.prepare(yc.length); + for (int i = 0; i < m.length; ++i) { + for (int j = 0; j < factories.size(); ++j) { + od.exclude(m[i], j); + } + } + if (!od.process(regarima, SarimaMapping.of(spec))) { return null; } @@ -261,7 +278,7 @@ public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Mat .coefficients(estimation1.getConcentratedLikelihood().coefficients().toArray()) .coefficientsCovariance(estimation1.getConcentratedLikelihood().covariance(np, true)) .x(x) - .y(y.getValues()) + .y(y) .linearized(RegArimaUtility.linearizedData(estimation1.getModel(), estimation1.getConcentratedLikelihood())) .residuals(estimation1.getConcentratedLikelihood().e()) .build(); diff --git a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-r/src/test/java/jdplus/tramoseats/base/r/TramoOutliersDetectionTest.java b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-r/src/test/java/jdplus/tramoseats/base/r/TramoOutliersDetectionTest.java index b04ef12e..f1e6777f 100644 --- a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-r/src/test/java/jdplus/tramoseats/base/r/TramoOutliersDetectionTest.java +++ b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-r/src/test/java/jdplus/tramoseats/base/r/TramoOutliersDetectionTest.java @@ -5,6 +5,7 @@ */ package jdplus.tramoseats.base.r; +import jdplus.toolkit.base.api.timeseries.TsData; import tck.demetra.data.Data; import org.junit.jupiter.api.Test; @@ -22,7 +23,7 @@ public TramoOutliersDetectionTest() { @Test public void testProd() { - TramoOutliersDetection.Results rslts = TramoOutliersDetection.process(Data.TS_PROD, new int[]{0, 1, 1}, new int[]{0, 1, 1}, false, null, true, true, false, true, 4, false); + TramoOutliersDetection.Results rslts = TramoOutliersDetection.process(Data.TS_PROD, new int[]{0, 1, 1}, new int[]{0, 1, 1}, false, null, true, true, false, true, 4, false, false); String[] outliers = rslts.getData(TramoOutliersDetection.Results.BNAMES, String[].class); // if (outliers != null) { // for (int i = 0; i < outliers.length; ++i) { @@ -32,4 +33,15 @@ public void testProd() { assertTrue(outliers == null); } + @Test + public void testProdMissing() { + double[] x=Data.PROD.clone(); + x[10]=Double.NaN; + x[100]=Double.NaN; + x[200]=10; + TsData X=TsData.ofInternal(Data.TS_PROD.getStart(), x); + TramoOutliersDetection.Results rslts = TramoOutliersDetection.process(X, new int[]{0, 1, 1}, new int[]{0, 1, 1}, false, null, true, true, false, true, 4, false, false); + String[] outliers = rslts.getData(TramoOutliersDetection.Results.BNAMES, String[].class); + assertTrue(outliers.length == 1); + } } diff --git a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-workspace/pom.xml b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-workspace/pom.xml index 05158c87..9faa41ca 100644 --- a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-workspace/pom.xml +++ b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-workspace/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-tramoseats-base-parent - 3.0.1 + 3.0.2 jdplus-tramoseats-base-workspace diff --git a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-xml/pom.xml b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-xml/pom.xml index 492bad09..9bffeb7c 100644 --- a/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-xml/pom.xml +++ b/jdplus-main-base/jdplus-tramoseats-base-parent/jdplus-tramoseats-base-xml/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-tramoseats-base-parent - 3.0.1 + 3.0.2 jdplus-tramoseats-base-xml diff --git a/jdplus-main-base/jdplus-tramoseats-base-parent/pom.xml b/jdplus-main-base/jdplus-tramoseats-base-parent/pom.xml index bd63e735..bb929078 100644 --- a/jdplus-main-base/jdplus-tramoseats-base-parent/pom.xml +++ b/jdplus-main-base/jdplus-tramoseats-base-parent/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-main-base - 3.0.1 + 3.0.2 jdplus-tramoseats-base-parent diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-api/pom.xml b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-api/pom.xml index f33a8df0..cbd1b6c7 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-api/pom.xml +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-api/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-x13-base-parent - 3.0.1 + 3.0.2 jdplus-x13-base-api diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-api/src/main/java/jdplus/x13/base/api/regarima/TradingDaysSpec.java b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-api/src/main/java/jdplus/x13/base/api/regarima/TradingDaysSpec.java index f814e7d5..dc643dba 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-api/src/main/java/jdplus/x13/base/api/regarima/TradingDaysSpec.java +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-api/src/main/java/jdplus/x13/base/api/regarima/TradingDaysSpec.java @@ -38,17 +38,17 @@ public static enum AutoMethod { BIC, AIC } - + public static final double DEF_AUTO_PVALUE1 = .01, DEF_AUTO_PVALUE2 = 0.1; public static final boolean DEF_ADJUST = true; - + private String holidays; private String[] userVariables; private TradingDaysType tradingDaysType; private LengthOfPeriodType lengthOfPeriodType; private RegressionTestSpec regressionTestType; - private boolean autoAdjust; - private int stockTradingDays; + private boolean autoAdjust; + private int stockTradingDays; private AutoMethod automaticMethod; private double autoPvalue1, autoPvalue2; private Parameter[] tdCoefficients; @@ -62,7 +62,7 @@ public static TradingDaysSpec stockTradingDays(int w, RegressionTestSpec test) { LengthOfPeriodType.None, test, false, w, AutoMethod.UNUSED, 0, 0, null, null); } - public static TradingDaysSpec stockTradingDays(int w, @NonNull Parameter[] tdc) { + public static TradingDaysSpec stockTradingDays(int w, Parameter[] tdc) { return new TradingDaysSpec(null, null, TradingDaysType.NONE, LengthOfPeriodType.None, RegressionTestSpec.None, false, w, AutoMethod.UNUSED, 0, 0, tdc, null); } @@ -76,7 +76,7 @@ public static TradingDaysSpec userDefined(@NonNull String[] vars, RegressionTest LengthOfPeriodType.None, test, false, 0, AutoMethod.UNUSED, 0, 0, null, null); } - public static TradingDaysSpec userDefined(@NonNull String[] vars, @NonNull Parameter[] tdcoeff) { + public static TradingDaysSpec userDefined(@NonNull String[] vars, Parameter[] tdcoeff) { return new TradingDaysSpec(null, vars, TradingDaysType.NONE, LengthOfPeriodType.None, RegressionTestSpec.None, false, 0, AutoMethod.UNUSED, 0, 0, tdcoeff, null); } @@ -145,6 +145,7 @@ public boolean isDefined() { public boolean isAutomatic() { return automaticMethod != AutoMethod.UNUSED; } + public boolean isStockTradingDays() { return stockTradingDays != 0; } @@ -184,7 +185,7 @@ public TradingDaysSpec validate() throws IllegalArgumentException { return this; } - public boolean hasFixedCoefficients(){ + public boolean hasFixedCoefficients() { return (lpCoefficient != null && lpCoefficient.isFixed()) || Parameter.hasFixedParameters(tdCoefficients); } diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/pom.xml b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/pom.xml index a97315fa..0de574fd 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/pom.xml +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-x13-base-parent - 3.0.1 + 3.0.2 jdplus-x13-base-core diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11BStep.java b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11BStep.java index b789482d..819de7fa 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11BStep.java +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11BStep.java @@ -17,6 +17,7 @@ import jdplus.toolkit.base.core.data.DataBlock; import jdplus.toolkit.base.core.math.linearfilters.IFiniteFilter; import jdplus.toolkit.base.core.math.linearfilters.SymmetricFilter; +import jdplus.x13.base.core.x11.filter.DummyFilter; /** * @@ -61,9 +62,14 @@ private void b3Step(X11Context context) { } private void b4Step(X11Context context) { - X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getInitialSeasonalFilter()); - b4a = processor.process(b3, (context.getFirstPeriod() + b2drop) % context.getPeriod()); - b4anorm = DefaultSeasonalNormalizer.normalize(b4a, 0, context, b2drop); + if (context.isSeasonal()) { + X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getInitialSeasonalFilter()); + b4a = processor.process(b3, (context.getFirstPeriod() + b2drop) % context.getPeriod()); + b4anorm = DefaultSeasonalNormalizer.normalize(b4a, 0, context, b2drop); + } else { + b4a = DummyFilter.filter(context.isMultiplicative(), b3); + b4anorm = b4a; + } b4d = b4d(context); IExtremeValuesCorrector ecorr = context.selectExtremeValuesCorrector(b4d); int j = (b2drop + context.getFirstPeriod()) % context.getPeriod(); @@ -79,9 +85,13 @@ protected DoubleSeq b4d(X11Context context) { } private void b5Step(X11Context context) { - X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getInitialSeasonalFilter()); - DoubleSeq b5a = processor.process(b4g, (context.getFirstPeriod() + b2drop) % context.getPeriod()); - b5 = DefaultSeasonalNormalizer.normalize(b5a, b2drop, context); + if (context.isSeasonal()) { + X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getInitialSeasonalFilter()); + DoubleSeq b5a = processor.process(b4g, (context.getFirstPeriod() + b2drop) % context.getPeriod()); + b5 = DefaultSeasonalNormalizer.normalize(b5a, b2drop, context); + } else { + b5 = DummyFilter.filter(context.isMultiplicative(), b4g); + } } private void b6Step(X11Context context) { @@ -128,9 +138,14 @@ private void b8Step(X11Context context) { } private void b9Step(X11Context context) { - X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getFinalSeasonalFilter()); - DoubleSeq b9a = processor.process(b8, context.getFirstPeriod()); - DoubleSeq b9c = DefaultSeasonalNormalizer.normalize(b9a, 0, context); + DoubleSeq b9c; + if (context.isSeasonal()) { + X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getFinalSeasonalFilter()); + DoubleSeq b9a = processor.process(b8, context.getFirstPeriod()); + b9c = DefaultSeasonalNormalizer.normalize(b9a, 0, context); + } else { + b9c = DummyFilter.filter(context.isMultiplicative(), b8); + } DoubleSeq b9d = b9d(context, b9c); IExtremeValuesCorrector ecorr = context.getExtremeValuesCorrector(); ecorr.setStart(context.getFirstPeriod()); @@ -145,9 +160,13 @@ protected DoubleSeq b9d(X11Context context, DoubleSeq b9c) { } private void bFinalStep(X11Context context) { - X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getFinalSeasonalFilter()); - DoubleSeq b10a = processor.process(b9g, context.getFirstPeriod()); - b10 = DefaultSeasonalNormalizer.normalize(b10a, 0, context); + if (context.isSeasonal()) { + X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getFinalSeasonalFilter()); + DoubleSeq b10a = processor.process(b9g, context.getFirstPeriod()); + b10 = DefaultSeasonalNormalizer.normalize(b10a, 0, context); + }else{ + b10=DummyFilter.filter(context.isMultiplicative(), b9g); + } b11 = b11(context); b13 = context.remove(b11, b7); diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11CStep.java b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11CStep.java index 47906474..cbb0fa39 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11CStep.java +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11CStep.java @@ -17,6 +17,7 @@ import jdplus.x13.base.core.x11.filter.X11SeasonalFiltersFactory; import jdplus.x13.base.core.x11.filter.endpoints.AsymmetricEndPoints; import jdplus.toolkit.base.api.data.DoubleSeq; +import jdplus.x13.base.core.x11.filter.DummyFilter; /** * @@ -65,9 +66,15 @@ private void c4Step(X11Context context) { } private void c5Step(X11Context context) { - X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getInitialSeasonalFilter()); - c5a = processor.process(c4, (context.getFirstPeriod() + c2drop) % context.getPeriod()); - c5 = DefaultSeasonalNormalizer.normalize(c5a, c2drop, context); + if (context.isSeasonal()) { + X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getInitialSeasonalFilter()); + c5a = processor.process(c4, (context.getFirstPeriod() + c2drop) % context.getPeriod()); + c5 = DefaultSeasonalNormalizer.normalize(c5a, c2drop, context); + } else { + c5a = DummyFilter.filter(context.isMultiplicative(), c4); + c5 = c5a; + } + } private void c6Step(X11Context context) { @@ -109,9 +116,14 @@ private void c9Step(X11Context context) { } private void cFinalStep(X11Context context) { - X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getFinalSeasonalFilter()); - c10a = processor.process(c9, context.getFirstPeriod()); - c10 = DefaultSeasonalNormalizer.normalize(c10a, 0, context); + if (context.isSeasonal()) { + X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getFinalSeasonalFilter()); + c10a = processor.process(c9, context.getFirstPeriod()); + c10 = DefaultSeasonalNormalizer.normalize(c10a, 0, context); + } else { + c10a = DummyFilter.filter(context.isMultiplicative(), c9); + c10 = c10a; + } c11 = c11(context); c13 = context.remove(c11, c7); diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11Context.java b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11Context.java index 1378f80f..0954dc49 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11Context.java +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11Context.java @@ -41,9 +41,8 @@ public class X11Context { int period; int trendFilterLength; int localPolynomialDegree; - @lombok.NonNull + boolean seasonal; SeasonalFilterOption[] initialSeasonalFilter; - @lombok.NonNull SeasonalFilterOption[] finalSeasonalFilter; double lowerSigma, upperSigma; CalendarSigmaOption calendarSigma; @@ -66,6 +65,7 @@ public class X11Context { public static Builder builder() { Builder builder = new Builder(); builder.mode = DecompositionMode.Multiplicative; + builder.seasonal = true; builder.trendFilterLength = 13; builder.localPolynomialDegree = 3; builder.period = 1; @@ -79,15 +79,20 @@ public static Builder builder() { } public static X11Context of(@lombok.NonNull X11Spec spec, @lombok.NonNull TsData data) { - SeasonalFilterOption[] filters = new SeasonalFilterOption[data.getAnnualFrequency()]; - if (spec.getFilters().length == 1) { + SeasonalFilterOption[] filters; + if (!spec.isSeasonal()) { + filters = null; + } else { filters = new SeasonalFilterOption[data.getAnnualFrequency()]; - SeasonalFilterOption filter = spec.getFilters()[0]; - for (int i = 0; i < data.getAnnualFrequency(); i++) { - filters[i] = filter; + if (spec.getFilters().length == 1) { + filters = new SeasonalFilterOption[data.getAnnualFrequency()]; + SeasonalFilterOption filter = spec.getFilters()[0]; + for (int i = 0; i < data.getAnnualFrequency(); i++) { + filters[i] = filter; + } + } else { + filters = spec.getFilters(); } - } else { - filters = spec.getFilters(); } int p = data.getAnnualFrequency(); int nb = spec.getBackcastHorizon(), nf = spec.getForecastHorizon(); @@ -98,6 +103,7 @@ public static X11Context of(@lombok.NonNull X11Spec spec, @lombok.NonNull TsData nf = -nf * p; } return builder().mode(spec.getMode()) + .seasonal(spec.isSeasonal()) .trendFilterLength(spec.getHendersonFilterLength()) .period(p) .firstPeriod(data.getStart().annualPosition()) @@ -256,6 +262,8 @@ public SeasonalFilterOption[] getInitialSeasonalFilter() { } public SeasonalFilterOption[] getFinalSeasonalFilter() { + if (finalSeasonalFilter == null) + return null; SeasonalFilterOption[] result = new SeasonalFilterOption[period]; for (int i = 0; i < period; i++) { result[i] = finalSeasonalFilter[i]; diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11DStep.java b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11DStep.java index b4038b77..f1876888 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11DStep.java +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/X11DStep.java @@ -24,6 +24,7 @@ import jdplus.toolkit.base.core.data.DataBlock; import jdplus.toolkit.base.core.math.linearfilters.IFiniteFilter; import jdplus.toolkit.base.core.math.linearfilters.SymmetricFilter; +import jdplus.x13.base.core.x11.filter.DummyFilter; /** * @@ -80,9 +81,13 @@ private void d4Step(X11Context context) { } private void d5Step(X11Context context) { - X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getInitialSeasonalFilter()); - DoubleSeq d5a = processor.process(d4, (context.getFirstPeriod() + d2drop) % context.getPeriod()); - d5 = DefaultSeasonalNormalizer.normalize(d5a, d2drop, context); + if (context.isSeasonal()) { + X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), context.getInitialSeasonalFilter()); + DoubleSeq d5a = processor.process(d4, (context.getFirstPeriod() + d2drop) % context.getPeriod()); + d5 = DefaultSeasonalNormalizer.normalize(d5a, d2drop, context); + } else { + d5 = DummyFilter.filter(context.isMultiplicative(), d4); + } } private void d6Step(X11Context context) { @@ -144,18 +149,23 @@ private void d9Step(X11Context context) { } private void dFinalStep(X11Context context) { - seasFilter = context.getFinalSeasonalFilter(); - if (context.isMSR()) { - MsrFilterSelection msr = getMsrFilterSelection(); - SeasonalFilterOption msrFilter = msr.doMSR(d9_g_bis, context); - d9msriter=msr.getIterCount(); - d9filter = msrFilter; - Arrays.fill(seasFilter, msrFilter); + if (context.isSeasonal()) { + seasFilter = context.getFinalSeasonalFilter(); + if (context.isMSR()) { + MsrFilterSelection msr = getMsrFilterSelection(); + SeasonalFilterOption msrFilter = msr.doMSR(d9_g_bis, context); + d9msriter = msr.getIterCount(); + d9filter = msrFilter; + Arrays.fill(seasFilter, msrFilter); + } + d9msr = X11Utility.defaultMsrTable(d9_g_bis.drop(context.getBackcastHorizon(), context.getForecastHorizon()), context.getPeriod(), context.getFirstPeriod(), context.getMode()); + X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), seasFilter); + d10bis = processor.process(d9_g_bis, context.getFirstPeriod()); + d10 = DefaultSeasonalNormalizer.normalize(d10bis, 0, context); + } else { + d10bis = DummyFilter.filter(context.isMultiplicative(), d9_g_bis); + d10 = d10bis; } - d9msr=X11Utility.defaultMsrTable(d9_g_bis.drop(context.getBackcastHorizon(), context.getForecastHorizon()), context.getPeriod(), context.getFirstPeriod(), context.getMode()); - X11SeasonalFilterProcessor processor = X11SeasonalFiltersFactory.filter(context.getPeriod(), seasFilter); - d10bis = processor.process(d9_g_bis, context.getFirstPeriod()); - d10 = DefaultSeasonalNormalizer.normalize(d10bis, 0, context); d11bis = d11bis(context); diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/filter/DummyFilter.java b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/filter/DummyFilter.java index 1dfa454f..020d2f89 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/filter/DummyFilter.java +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-core/src/main/java/jdplus/x13/base/core/x11/filter/DummyFilter.java @@ -13,32 +13,23 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Licence for the specific language governing permissions and * limitations under the Licence. -*/ - + */ package jdplus.x13.base.core.x11.filter; -import java.util.Arrays; import jdplus.toolkit.base.api.data.DoubleSeq; - /** - * The dummy filter will set the filtered series to O or 1 (multiplicative case). + * The dummy filter will set the filtered series to O or 1 (multiplicative + * case). + * * @author Jean Palate */ -public class DummyFilter{ - - public static final String NAME="None"; - - private final boolean mul; - - - public DummyFilter(boolean mul){ - this.mul=mul; - } +@lombok.experimental.UtilityClass +public class DummyFilter { - public int[] process(DoubleSeq s, double[] out) { - Arrays.fill(out, mul ? 1 : 0); - return new int[] {0, out.length}; + public DoubleSeq filter(boolean mul, DoubleSeq in) { + double c = mul ? 1.0 : 0.0; + return DoubleSeq.onMapping(in.length(), i -> c); } - + } diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-information/pom.xml b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-information/pom.xml index d407f342..4939c533 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-information/pom.xml +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-information/pom.xml @@ -4,7 +4,7 @@ eu.europa.ec.joinup.sat jdplus-x13-base-parent - 3.0.1 + 3.0.2 jdplus-x13-base-information diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-protobuf/pom.xml b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-protobuf/pom.xml index 3197b3fa..c2ab4a02 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-protobuf/pom.xml +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-protobuf/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-x13-base-parent - 3.0.1 + 3.0.2 jdplus-x13-base-protobuf diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-r/pom.xml b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-r/pom.xml index 13ea0efb..f01c249b 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-r/pom.xml +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-r/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-x13-base-parent - 3.0.1 + 3.0.2 jdplus-x13-base-r diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-r/src/main/java/jdplus/x13/base/r/RegArimaOutliersDetection.java b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-r/src/main/java/jdplus/x13/base/r/RegArimaOutliersDetection.java index 62912ea9..94b517b5 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-r/src/main/java/jdplus/x13/base/r/RegArimaOutliersDetection.java +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-r/src/main/java/jdplus/x13/base/r/RegArimaOutliersDetection.java @@ -31,6 +31,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import jdplus.toolkit.base.api.util.IntList; +import jdplus.toolkit.base.core.data.interpolation.AverageInterpolator; import jdplus.toolkit.base.core.math.matrices.FastMatrix; import jdplus.toolkit.base.core.modelling.regression.AdditiveOutlierFactory; import jdplus.toolkit.base.core.modelling.regression.IOutlierFactory; @@ -88,7 +90,7 @@ public byte[] buffer() { } SarimaModel initialArima, finalArima; - DoubleSeq y; + TsData y; Matrix x; OutlierDescriptor[] outliers; @@ -182,17 +184,21 @@ public Class getSourceClass() { } return names; }); + MAPPING.set(Y, TsData.class, source -> source.getY()); MAPPING.set(REGRESSORS, Matrix.class, source -> source.getRegressors()); MAPPING.set(LIN, double[].class, source -> source.getLinearized().toArray()); } } public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Matrix x, - boolean bao, boolean bls, boolean btc, boolean bso, double cv) { - TsData y = ts.cleanExtremities(); - if (x != null && ts.length() != y.length()){ - int start=ts.getStart().until(y.getStart()); - x=x.extract(start, y.length(), 0, x.getColumnsCount()); + boolean bao, boolean bls, boolean btc, boolean bso, double cv, boolean clean) { + TsData y = ts; + if (clean) { + y = ts.cleanExtremities(); + if (x != null && ts.length() != y.length()) { + int start = ts.getStart().until(y.getStart()); + x = x.extract(start, y.length(), 0, x.getColumnsCount()); + } } SarimaOrders spec = new SarimaOrders(y.getAnnualFrequency()); spec.setP(order[0]); @@ -204,6 +210,10 @@ public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Mat spec.setBq(seasonal[2]); } + double[] yc = y.getValues().toArray(); + IntList missings = new IntList(); + AverageInterpolator.cleanMissings(yc, missings); + int[] m = missings.toArray(); SarimaModel arima = SarimaModel.builder(spec) .setDefault() .build(); @@ -213,6 +223,7 @@ public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Mat .meanCorrection(mean) .y(y.getValues()) .addX(FastMatrix.of(x)) + .missing(m) .build(); RegArimaEstimation estimation0 = RegSarimaComputer.builder() .build() @@ -221,12 +232,12 @@ public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Mat SingleOutlierDetector sod = new ExactSingleOutlierDetector(RobustStandardDeviationComputer.mad(false), null, X13Utility.mlComputer()); - List factory=new ArrayList<>(); + List factories=new ArrayList<>(); if (bao) { - factory.add(AdditiveOutlierFactory.FACTORY); + factories.add(AdditiveOutlierFactory.FACTORY); } if (bls) { - factory.add(LevelShiftFactory.FACTORY_ZEROENDED); + factories.add(LevelShiftFactory.FACTORY_ZEROENDED); } int freq=y.getAnnualFrequency(); if (btc) { @@ -235,12 +246,12 @@ public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Mat if (r > 1) { c = Math.pow(c, r); } - factory.add(new TransitoryChangeFactory(c)); + factories.add(new TransitoryChangeFactory(c)); } if (freq > 1 && bso) { - factory.add(new PeriodicOutlierFactory(freq, true)); + factories.add(new PeriodicOutlierFactory(freq, true)); } - sod.setOutlierFactories(factory.toArray(new IOutlierFactory[factory.size()])); + sod.setOutlierFactories(factories.toArray(IOutlierFactory[]::new)); ExactOutliersDetector od = ExactOutliersDetector.builder() .singleOutlierDetector(sod) @@ -249,7 +260,12 @@ public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Mat .build(); od.prepare(y.length()); - od.process(regarima, SarimaMapping.of(spec)); + for (int i = 0; i < m.length; ++i) { + for (int j = 0; j < factories.size(); ++j) { + od.exclude(m[i], j); + } + } + od.process(regarima, SarimaMapping.of(spec)); int[][] o = od.getOutliers(); String[] ids = od.outlierTypes(); @@ -271,7 +287,7 @@ public Results process(TsData ts, int[] order, int[] seasonal, boolean mean, Mat .coefficients(estimation1.getConcentratedLikelihood().coefficients().toArray()) .coefficientsCovariance(estimation1.getConcentratedLikelihood().covariance(np, true)) .x(x) - .y(y.getValues()) + .y(y) .linearized(RegArimaUtility.linearizedData(estimation1.getModel(), estimation1.getConcentratedLikelihood())) .residuals(estimation1.getConcentratedLikelihood().e()) .build(); diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-r/src/test/java/jdplus/x13/base/r/RegArimaOutliersDetectionTest.java b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-r/src/test/java/jdplus/x13/base/r/RegArimaOutliersDetectionTest.java index 1c8694fa..230721ae 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-r/src/test/java/jdplus/x13/base/r/RegArimaOutliersDetectionTest.java +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-r/src/test/java/jdplus/x13/base/r/RegArimaOutliersDetectionTest.java @@ -32,7 +32,7 @@ public RegArimaOutliersDetectionTest() { @Test public void testProd() { - RegArimaOutliersDetection.Results rslts = RegArimaOutliersDetection.process(Data.TS_PROD, new int[]{0, 1, 1}, new int[]{0, 1, 1}, false, null, true, true, false, true, 4); + RegArimaOutliersDetection.Results rslts = RegArimaOutliersDetection.process(Data.TS_PROD, new int[]{0, 1, 1}, new int[]{0, 1, 1}, false, null, true, true, false, true, 4, true); String[] outliers = rslts.getData(RegArimaOutliersDetection.Results.BNAMES, String[].class); // if (outliers != null) { // for (int i = 0; i < outliers.length; ++i) { diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-workspace/pom.xml b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-workspace/pom.xml index 53c2a0ee..032e6c19 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-workspace/pom.xml +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-workspace/pom.xml @@ -4,7 +4,7 @@ eu.europa.ec.joinup.sat jdplus-x13-base-parent - 3.0.1 + 3.0.2 jdplus-x13-base-workspace diff --git a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-xml/pom.xml b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-xml/pom.xml index 17ef9b29..ea65e6dc 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-xml/pom.xml +++ b/jdplus-main-base/jdplus-x13-base-parent/jdplus-x13-base-xml/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-x13-base-parent - 3.0.1 + 3.0.2 jdplus-x13-base-xml diff --git a/jdplus-main-base/jdplus-x13-base-parent/pom.xml b/jdplus-main-base/jdplus-x13-base-parent/pom.xml index f9e2e2b3..69f2d44c 100644 --- a/jdplus-main-base/jdplus-x13-base-parent/pom.xml +++ b/jdplus-main-base/jdplus-x13-base-parent/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-main-base - 3.0.1 + 3.0.2 jdplus-x13-base-parent diff --git a/jdplus-main-base/pom.xml b/jdplus-main-base/pom.xml index 33edcc3b..45b7e629 100644 --- a/jdplus-main-base/pom.xml +++ b/jdplus-main-base/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main - 3.0.1 + 3.0.2 jdplus-main-base diff --git a/jdplus-main-bom/pom.xml b/jdplus-main-bom/pom.xml index 38b4f6d0..8f649622 100644 --- a/jdplus-main-bom/pom.xml +++ b/jdplus-main-bom/pom.xml @@ -7,7 +7,7 @@ eu.europa.ec.joinup.sat jdplus-main - 3.0.1 + 3.0.2 jdplus-main-bom @@ -254,7 +254,6 @@ true - true ${project.build.directory}/CHANGELOG.md diff --git a/jdplus-main-cli/jdplus-main-cli-bin/pom.xml b/jdplus-main-cli/jdplus-main-cli-bin/pom.xml index f0d210cc..1eeced86 100644 --- a/jdplus-main-cli/jdplus-main-cli-bin/pom.xml +++ b/jdplus-main-cli/jdplus-main-cli-bin/pom.xml @@ -7,7 +7,7 @@ eu.europa.ec.joinup.sat jdplus-main-cli - 3.0.1 + 3.0.2 jdplus-main-cli-bin diff --git a/jdplus-main-cli/jdplus-main-cli-design/pom.xml b/jdplus-main-cli/jdplus-main-cli-design/pom.xml index d3f01d0b..d9285e36 100644 --- a/jdplus-main-cli/jdplus-main-cli-design/pom.xml +++ b/jdplus-main-cli/jdplus-main-cli-design/pom.xml @@ -7,7 +7,7 @@ eu.europa.ec.joinup.sat jdplus-main-cli - 3.0.1 + 3.0.2 jdplus-main-cli-design diff --git a/jdplus-main-cli/jdplus-sa-cli-plugin/pom.xml b/jdplus-main-cli/jdplus-sa-cli-plugin/pom.xml index ea261322..91f81ea2 100644 --- a/jdplus-main-cli/jdplus-sa-cli-plugin/pom.xml +++ b/jdplus-main-cli/jdplus-sa-cli-plugin/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main-cli - 3.0.1 + 3.0.2 jdplus-sa-cli-plugin diff --git a/jdplus-main-cli/jdplus-spreadsheet-cli-plugin/pom.xml b/jdplus-main-cli/jdplus-spreadsheet-cli-plugin/pom.xml index 093dedc4..b6b7e676 100644 --- a/jdplus-main-cli/jdplus-spreadsheet-cli-plugin/pom.xml +++ b/jdplus-main-cli/jdplus-spreadsheet-cli-plugin/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main-cli - 3.0.1 + 3.0.2 jdplus-spreadsheet-cli-plugin diff --git a/jdplus-main-cli/jdplus-sql-cli-plugin/pom.xml b/jdplus-main-cli/jdplus-sql-cli-plugin/pom.xml index 9c0aa5a0..72ac8f85 100644 --- a/jdplus-main-cli/jdplus-sql-cli-plugin/pom.xml +++ b/jdplus-main-cli/jdplus-sql-cli-plugin/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main-cli - 3.0.1 + 3.0.2 jdplus-sql-cli-plugin diff --git a/jdplus-main-cli/jdplus-text-cli-plugin/pom.xml b/jdplus-main-cli/jdplus-text-cli-plugin/pom.xml index 353fefbd..2a02dcc6 100644 --- a/jdplus-main-cli/jdplus-text-cli-plugin/pom.xml +++ b/jdplus-main-cli/jdplus-text-cli-plugin/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main-cli - 3.0.1 + 3.0.2 jdplus-text-cli-plugin diff --git a/jdplus-main-cli/jdplus-toolkit-cli-plugin/pom.xml b/jdplus-main-cli/jdplus-toolkit-cli-plugin/pom.xml index d42b60ca..bec436ca 100644 --- a/jdplus-main-cli/jdplus-toolkit-cli-plugin/pom.xml +++ b/jdplus-main-cli/jdplus-toolkit-cli-plugin/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main-cli - 3.0.1 + 3.0.2 jdplus-toolkit-cli-plugin diff --git a/jdplus-main-cli/jdplus-tramoseats-cli-plugin/pom.xml b/jdplus-main-cli/jdplus-tramoseats-cli-plugin/pom.xml index 2d17de63..cbcfa36c 100644 --- a/jdplus-main-cli/jdplus-tramoseats-cli-plugin/pom.xml +++ b/jdplus-main-cli/jdplus-tramoseats-cli-plugin/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main-cli - 3.0.1 + 3.0.2 jdplus-tramoseats-cli-plugin diff --git a/jdplus-main-cli/jdplus-x13-cli-plugin/pom.xml b/jdplus-main-cli/jdplus-x13-cli-plugin/pom.xml index f5f79b75..db2dc46f 100644 --- a/jdplus-main-cli/jdplus-x13-cli-plugin/pom.xml +++ b/jdplus-main-cli/jdplus-x13-cli-plugin/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main-cli - 3.0.1 + 3.0.2 jdplus-x13-cli-plugin diff --git a/jdplus-main-cli/pom.xml b/jdplus-main-cli/pom.xml index 0cdc4a7e..03040c01 100644 --- a/jdplus-main-cli/pom.xml +++ b/jdplus-main-cli/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main - 3.0.1 + 3.0.2 jdplus-main-cli @@ -17,7 +17,7 @@ ${project.parent.url} - 4.7.3 + 4.7.4 diff --git a/jdplus-main-desktop/jdplus-main-desktop-bin/pom.xml b/jdplus-main-desktop/jdplus-main-desktop-bin/pom.xml index 55dd567b..580b37bb 100644 --- a/jdplus-main-desktop/jdplus-main-desktop-bin/pom.xml +++ b/jdplus-main-desktop/jdplus-main-desktop-bin/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-main-desktop - 3.0.1 + 3.0.2 jdplus-main-desktop-bin diff --git a/jdplus-main-desktop/jdplus-main-desktop-branding/pom.xml b/jdplus-main-desktop/jdplus-main-desktop-branding/pom.xml index e36f9871..1e3d4984 100644 --- a/jdplus-main-desktop/jdplus-main-desktop-branding/pom.xml +++ b/jdplus-main-desktop/jdplus-main-desktop-branding/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-main-desktop - 3.0.1 + 3.0.2 jdplus-main-desktop-branding diff --git a/jdplus-main-desktop/jdplus-main-desktop-design/pom.xml b/jdplus-main-desktop/jdplus-main-desktop-design/pom.xml index c5b6ce40..38eb81ef 100644 --- a/jdplus-main-desktop/jdplus-main-desktop-design/pom.xml +++ b/jdplus-main-desktop/jdplus-main-desktop-design/pom.xml @@ -5,7 +5,7 @@ eu.europa.ec.joinup.sat jdplus-main-desktop - 3.0.1 + 3.0.2 jdplus-main-desktop-design diff --git a/jdplus-main-desktop/jdplus-sa-desktop-plugin/pom.xml b/jdplus-main-desktop/jdplus-sa-desktop-plugin/pom.xml index ec30bae5..ed5d44bd 100644 --- a/jdplus-main-desktop/jdplus-sa-desktop-plugin/pom.xml +++ b/jdplus-main-desktop/jdplus-sa-desktop-plugin/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main-desktop - 3.0.1 + 3.0.2 jdplus-sa-desktop-plugin diff --git a/jdplus-main-desktop/jdplus-spreadsheet-desktop-plugin/pom.xml b/jdplus-main-desktop/jdplus-spreadsheet-desktop-plugin/pom.xml index 197f78d6..5553dcdb 100644 --- a/jdplus-main-desktop/jdplus-spreadsheet-desktop-plugin/pom.xml +++ b/jdplus-main-desktop/jdplus-spreadsheet-desktop-plugin/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main-desktop - 3.0.1 + 3.0.2 jdplus-spreadsheet-desktop-plugin diff --git a/jdplus-main-desktop/jdplus-spreadsheet-desktop-plugin/src/main/java/jdplus/spreadsheet/desktop/plugin/SpreadsheetProviderBuddy.java b/jdplus-main-desktop/jdplus-spreadsheet-desktop-plugin/src/main/java/jdplus/spreadsheet/desktop/plugin/SpreadsheetProviderBuddy.java index e421a5cc..0c3d8a82 100644 --- a/jdplus-main-desktop/jdplus-spreadsheet-desktop-plugin/src/main/java/jdplus/spreadsheet/desktop/plugin/SpreadsheetProviderBuddy.java +++ b/jdplus-main-desktop/jdplus-spreadsheet-desktop-plugin/src/main/java/jdplus/spreadsheet/desktop/plugin/SpreadsheetProviderBuddy.java @@ -16,25 +16,26 @@ */ package jdplus.spreadsheet.desktop.plugin; -import jdplus.toolkit.desktop.plugin.TsManager; -import jdplus.toolkit.desktop.plugin.properties.NodePropertySetBuilder; -import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddy; -import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddyUtil; -import static jdplus.toolkit.desktop.plugin.tsproviders.TsProviderProperties.addFile; -import static jdplus.toolkit.desktop.plugin.tsproviders.TsProviderProperties.addObsFormat; -import static jdplus.toolkit.desktop.plugin.tsproviders.TsProviderProperties.addObsGathering; import jdplus.spreadsheet.base.api.SpreadSheetBean; import jdplus.toolkit.base.tsp.DataSet; import jdplus.toolkit.base.tsp.DataSource; import jdplus.toolkit.base.tsp.FileLoader; +import jdplus.toolkit.desktop.plugin.TsManager; +import jdplus.toolkit.desktop.plugin.properties.NodePropertySetBuilder; +import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddy; +import nbbrd.design.DirectImpl; import nbbrd.service.ServiceProvider; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.openide.nodes.Sheet; import org.openide.util.ImageUtilities; import org.openide.util.NbBundle.Messages; import java.awt.*; import java.beans.IntrospectionException; -import nbbrd.design.DirectImpl; -import org.openide.nodes.Sheet; +import java.util.Arrays; +import java.util.List; + +import static jdplus.toolkit.desktop.plugin.tsproviders.TsProviderProperties.*; /** * @author Philippe Charles @@ -72,15 +73,13 @@ public Image getIconOrNull(DataSet dataSet, int type, boolean opened) { } @Override - public Sheet getSheetOfBeanOrNull(Object bean) throws IntrospectionException { - return bean instanceof SpreadSheetBean - ? createSheetSets((SpreadSheetBean) bean) - : DataSourceProviderBuddy.super.getSheetOfBeanOrNull(bean); + public List getSheetOfBeanOrNull(@NonNull Object bean) throws IntrospectionException { + return bean instanceof SpreadSheetBean ? createSheetSets((SpreadSheetBean) bean) : null; } - private Sheet createSheetSets(SpreadSheetBean bean) { + private List createSheetSets(SpreadSheetBean bean) { NodePropertySetBuilder b = new NodePropertySetBuilder(); - return DataSourceProviderBuddyUtil.sheetOf( + return Arrays.asList( createSource(b, bean), createOptions(b, bean) ); diff --git a/jdplus-main-desktop/jdplus-sql-desktop-plugin/pom.xml b/jdplus-main-desktop/jdplus-sql-desktop-plugin/pom.xml index 85f94c84..7c9f2e2f 100644 --- a/jdplus-main-desktop/jdplus-sql-desktop-plugin/pom.xml +++ b/jdplus-main-desktop/jdplus-sql-desktop-plugin/pom.xml @@ -4,7 +4,7 @@ eu.europa.ec.joinup.sat jdplus-main-desktop - 3.0.1 + 3.0.2 jdplus-sql-desktop-plugin diff --git a/jdplus-main-desktop/jdplus-sql-desktop-plugin/src/main/java/jdplus/sql/desktop/plugin/jdbc/JdbcProviderBuddy.java b/jdplus-main-desktop/jdplus-sql-desktop-plugin/src/main/java/jdplus/sql/desktop/plugin/jdbc/JdbcProviderBuddy.java index 6db1f01f..7139027b 100644 --- a/jdplus-main-desktop/jdplus-sql-desktop-plugin/src/main/java/jdplus/sql/desktop/plugin/jdbc/JdbcProviderBuddy.java +++ b/jdplus-main-desktop/jdplus-sql-desktop-plugin/src/main/java/jdplus/sql/desktop/plugin/jdbc/JdbcProviderBuddy.java @@ -16,13 +16,6 @@ */ package jdplus.sql.desktop.plugin.jdbc; -import jdplus.toolkit.desktop.plugin.TsManager; -import jdplus.toolkit.desktop.plugin.actions.Configurable; -import jdplus.toolkit.desktop.plugin.properties.NodePropertySetBuilder; -import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddy; -import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddyUtil; -import jdplus.toolkit.desktop.plugin.tsproviders.TsProviderProperties; -import jdplus.toolkit.desktop.plugin.util.SimpleHtmlCellRenderer; import ec.util.completion.AutoCompletionSource; import ec.util.completion.ExtAutoCompletionSource; import ec.util.various.swing.FontAwesome; @@ -34,6 +27,12 @@ import jdplus.sql.desktop.plugin.SqlProviderBuddy; import jdplus.sql.desktop.plugin.SqlTableListCellRenderer; import jdplus.toolkit.base.tsp.DataSource; +import jdplus.toolkit.desktop.plugin.TsManager; +import jdplus.toolkit.desktop.plugin.actions.Configurable; +import jdplus.toolkit.desktop.plugin.properties.NodePropertySetBuilder; +import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddy; +import jdplus.toolkit.desktop.plugin.tsproviders.TsProviderProperties; +import jdplus.toolkit.desktop.plugin.util.SimpleHtmlCellRenderer; import nbbrd.design.DirectImpl; import nbbrd.io.text.Formatter; import nbbrd.io.text.Parser; @@ -142,8 +141,8 @@ private DbConnStatus getStatus(DataSource dataSource) { } @Override - public Sheet getSheetOrNull(DataSource dataSource) { - Sheet result = DataSourceProviderBuddy.super.getSheetOrNull(dataSource); + public List getSheetOrNull(@NonNull DataSource dataSource) { + List result = new ArrayList<>(); NodePropertySetBuilder b = new NodePropertySetBuilder().name("Connection"); getProvider() @@ -151,20 +150,18 @@ public Sheet getSheetOrNull(DataSource dataSource) { .map(bean -> new DbConnStatusProperty(bean.getDatabase())) .ifPresent(b::add); - result.put(b.build()); + result.add(b.build()); return result; } @Override - public Sheet getSheetOfBeanOrNull(Object bean) throws IntrospectionException { - return bean instanceof JdbcBean - ? createSheetSets((JdbcBean) bean) - : DataSourceProviderBuddy.super.getSheetOfBeanOrNull(bean); + public List getSheetOfBeanOrNull(@NonNull Object bean) throws IntrospectionException { + return bean instanceof JdbcBean ? createSheetSets((JdbcBean) bean) : null; } - private Sheet createSheetSets(JdbcBean bean) { + private List createSheetSets(JdbcBean bean) { NodePropertySetBuilder b = new NodePropertySetBuilder(); - return DataSourceProviderBuddyUtil.sheetOf( + return Arrays.asList( createSource(b, bean), createCube(b, bean), createParsing(b, bean), diff --git a/jdplus-main-desktop/jdplus-sql-desktop-plugin/src/main/java/jdplus/sql/desktop/plugin/odbc/OdbcProviderBuddy.java b/jdplus-main-desktop/jdplus-sql-desktop-plugin/src/main/java/jdplus/sql/desktop/plugin/odbc/OdbcProviderBuddy.java index 137fcfae..4bb4949e 100644 --- a/jdplus-main-desktop/jdplus-sql-desktop-plugin/src/main/java/jdplus/sql/desktop/plugin/odbc/OdbcProviderBuddy.java +++ b/jdplus-main-desktop/jdplus-sql-desktop-plugin/src/main/java/jdplus/sql/desktop/plugin/odbc/OdbcProviderBuddy.java @@ -16,13 +16,6 @@ */ package jdplus.sql.desktop.plugin.odbc; -import jdplus.toolkit.desktop.plugin.TsManager; -import jdplus.toolkit.desktop.plugin.actions.Configurable; -import jdplus.toolkit.desktop.plugin.properties.NodePropertySetBuilder; -import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddy; -import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddyUtil; -import jdplus.toolkit.desktop.plugin.tsproviders.TsProviderProperties; -import jdplus.toolkit.desktop.plugin.util.SimpleHtmlCellRenderer; import ec.util.completion.AutoCompletionSource; import ec.util.completion.ExtAutoCompletionSource; import jdplus.sql.base.api.HasSqlProperties; @@ -30,11 +23,18 @@ import jdplus.sql.desktop.plugin.SqlColumnListCellRenderer; import jdplus.sql.desktop.plugin.SqlProviderBuddy; import jdplus.sql.desktop.plugin.SqlTableListCellRenderer; +import jdplus.toolkit.desktop.plugin.TsManager; +import jdplus.toolkit.desktop.plugin.actions.Configurable; +import jdplus.toolkit.desktop.plugin.properties.NodePropertySetBuilder; +import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddy; +import jdplus.toolkit.desktop.plugin.tsproviders.TsProviderProperties; +import jdplus.toolkit.desktop.plugin.util.SimpleHtmlCellRenderer; import nbbrd.design.DirectImpl; import nbbrd.service.ServiceProvider; import nbbrd.sql.jdbc.SqlConnectionSupplier; import nbbrd.sql.odbc.OdbcDataSource; import nbbrd.sql.odbc.OdbcRegistry; +import org.checkerframework.checker.nullness.qual.NonNull; import org.openide.nodes.Sheet; import org.openide.util.Exceptions; import org.openide.util.ImageUtilities; @@ -46,10 +46,8 @@ import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; -import java.util.Collections; -import java.util.Comparator; import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -94,15 +92,13 @@ public Image getIconOrNull(int type, boolean opened) { } @Override - public Sheet getSheetOfBeanOrNull(Object bean) throws IntrospectionException { - return bean instanceof OdbcBean - ? createSheetSets((OdbcBean) bean) - : DataSourceProviderBuddy.super.getSheetOfBeanOrNull(bean); + public List getSheetOfBeanOrNull(@NonNull Object bean) throws IntrospectionException { + return bean instanceof OdbcBean ? createSheetSets((OdbcBean) bean) : null; } - private Sheet createSheetSets(OdbcBean bean) { + private List createSheetSets(OdbcBean bean) { NodePropertySetBuilder b = new NodePropertySetBuilder(); - return DataSourceProviderBuddyUtil.sheetOf( + return Arrays.asList( createSource(b, bean), createCube(b, bean), createParsing(b, bean), diff --git a/jdplus-main-desktop/jdplus-text-desktop-plugin/pom.xml b/jdplus-main-desktop/jdplus-text-desktop-plugin/pom.xml index a568babd..05bc1542 100644 --- a/jdplus-main-desktop/jdplus-text-desktop-plugin/pom.xml +++ b/jdplus-main-desktop/jdplus-text-desktop-plugin/pom.xml @@ -4,7 +4,7 @@ eu.europa.ec.joinup.sat jdplus-main-desktop - 3.0.1 + 3.0.2 jdplus-text-desktop-plugin diff --git a/jdplus-main-desktop/jdplus-text-desktop-plugin/src/main/java/jdplus/text/desktop/plugin/TxtProviderBuddy.java b/jdplus-main-desktop/jdplus-text-desktop-plugin/src/main/java/jdplus/text/desktop/plugin/TxtProviderBuddy.java index 8b5ed35a..5bf148f4 100644 --- a/jdplus-main-desktop/jdplus-text-desktop-plugin/src/main/java/jdplus/text/desktop/plugin/TxtProviderBuddy.java +++ b/jdplus-main-desktop/jdplus-text-desktop-plugin/src/main/java/jdplus/text/desktop/plugin/TxtProviderBuddy.java @@ -1,38 +1,40 @@ /* * Copyright 2013 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved * by the European Commission - subsequent versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: - * + * * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software + * + * Unless required by applicable law or agreed to in writing, software * distributed under the Licence is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and + * See the Licence for the specific language governing permissions and * limitations under the Licence. */ package jdplus.text.desktop.plugin; +import jdplus.text.base.api.TxtBean; +import jdplus.toolkit.base.tsp.FileLoader; import jdplus.toolkit.desktop.plugin.TsManager; import jdplus.toolkit.desktop.plugin.properties.NodePropertySetBuilder; import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddy; -import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddyUtil; import jdplus.toolkit.desktop.plugin.tsproviders.TsProviderProperties; -import jdplus.text.base.api.TxtBean; -import jdplus.toolkit.base.tsp.FileLoader; -import java.awt.Image; -import java.beans.IntrospectionException; -import java.nio.charset.Charset; import nbbrd.design.DirectImpl; import nbbrd.service.ServiceProvider; +import org.checkerframework.checker.nullness.qual.NonNull; import org.openide.nodes.Sheet; import org.openide.util.ImageUtilities; +import java.awt.*; +import java.beans.IntrospectionException; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.List; + /** - * * @author Philippe Charles */ @DirectImpl @@ -52,15 +54,13 @@ public Image getIconOrNull(int type, boolean opened) { } @Override - public Sheet getSheetOfBeanOrNull(Object bean) throws IntrospectionException { - return bean instanceof TxtBean - ? createSheetSets((TxtBean) bean) - : DataSourceProviderBuddy.super.getSheetOfBeanOrNull(bean); + public List getSheetOfBeanOrNull(@NonNull Object bean) throws IntrospectionException { + return bean instanceof TxtBean ? createSheetSets((TxtBean) bean) : null; } - private Sheet createSheetSets(TxtBean bean) { + private List createSheetSets(TxtBean bean) { NodePropertySetBuilder b = new NodePropertySetBuilder(); - return DataSourceProviderBuddyUtil.sheetOf( + return Arrays.asList( createSource(b, bean), createContent(b, bean) ); diff --git a/jdplus-main-desktop/jdplus-text-desktop-plugin/src/main/java/jdplus/text/desktop/plugin/XmlProviderBuddy.java b/jdplus-main-desktop/jdplus-text-desktop-plugin/src/main/java/jdplus/text/desktop/plugin/XmlProviderBuddy.java index 01ba0874..6597cffe 100644 --- a/jdplus-main-desktop/jdplus-text-desktop-plugin/src/main/java/jdplus/text/desktop/plugin/XmlProviderBuddy.java +++ b/jdplus-main-desktop/jdplus-text-desktop-plugin/src/main/java/jdplus/text/desktop/plugin/XmlProviderBuddy.java @@ -16,21 +16,24 @@ */ package jdplus.text.desktop.plugin; +import jdplus.text.base.api.XmlBean; +import jdplus.toolkit.base.tsp.FileLoader; import jdplus.toolkit.desktop.plugin.TsManager; import jdplus.toolkit.desktop.plugin.properties.NodePropertySetBuilder; import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddy; -import jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddyUtil; import jdplus.toolkit.desktop.plugin.tsproviders.TsProviderProperties; -import jdplus.text.base.api.XmlBean; -import jdplus.toolkit.base.tsp.FileLoader; -import java.awt.Image; -import java.beans.IntrospectionException; -import java.nio.charset.Charset; import nbbrd.design.DirectImpl; import nbbrd.service.ServiceProvider; +import org.checkerframework.checker.nullness.qual.NonNull; import org.openide.nodes.Sheet; import org.openide.util.ImageUtilities; +import java.awt.*; +import java.beans.IntrospectionException; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.List; + /** * * @author Philippe Charles @@ -52,15 +55,13 @@ public Image getIconOrNull(int type, boolean opened) { } @Override - public Sheet getSheetOfBeanOrNull(Object bean) throws IntrospectionException { - return bean instanceof XmlBean - ? createSheetSets((XmlBean) bean) - : DataSourceProviderBuddy.super.getSheetOfBeanOrNull(bean); + public List getSheetOfBeanOrNull(@NonNull Object bean) throws IntrospectionException { + return bean instanceof XmlBean ? createSheetSets((XmlBean) bean) : null; } - private Sheet createSheetSets(XmlBean bean) { + private List createSheetSets(XmlBean bean) { NodePropertySetBuilder b = new NodePropertySetBuilder(); - return DataSourceProviderBuddyUtil.sheetOf( + return Arrays.asList( createSource(b, bean) ); } diff --git a/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/pom.xml b/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/pom.xml index fe7e13d4..e6a24154 100644 --- a/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/pom.xml +++ b/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main-desktop - 3.0.1 + 3.0.2 jdplus-toolkit-desktop-plugin diff --git a/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/src/main/java/jdplus/toolkit/desktop/plugin/tsproviders/DataSourceManager.java b/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/src/main/java/jdplus/toolkit/desktop/plugin/tsproviders/DataSourceManager.java index 3dd9d2f0..cd671b5e 100644 --- a/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/src/main/java/jdplus/toolkit/desktop/plugin/tsproviders/DataSourceManager.java +++ b/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/src/main/java/jdplus/toolkit/desktop/plugin/tsproviders/DataSourceManager.java @@ -16,29 +16,29 @@ */ package jdplus.toolkit.desktop.plugin.tsproviders; +import jdplus.main.desktop.design.GlobalService; +import jdplus.toolkit.base.api.timeseries.TsMoniker; +import jdplus.toolkit.base.tsp.*; import jdplus.toolkit.desktop.plugin.DemetraIcons; import jdplus.toolkit.desktop.plugin.TsManager; import jdplus.toolkit.desktop.plugin.actions.Configurable; import jdplus.toolkit.desktop.plugin.beans.BeanEditor; -import jdplus.main.desktop.design.GlobalService; import jdplus.toolkit.desktop.plugin.properties.ForwardingNodeProperty; import jdplus.toolkit.desktop.plugin.properties.NodePropertySetBuilder; import jdplus.toolkit.desktop.plugin.properties.PropertySheetDialogBuilder; -import static jdplus.toolkit.desktop.plugin.tsproviders.DataSourceProviderBuddyUtil.sheetOf; import jdplus.toolkit.desktop.plugin.util.CollectionSupplier; import jdplus.toolkit.desktop.plugin.util.FrozenTsHelper; import jdplus.toolkit.desktop.plugin.util.LazyGlobalService; -import jdplus.toolkit.base.api.timeseries.TsMoniker; -import jdplus.toolkit.base.tsp.DataSet; -import jdplus.toolkit.base.tsp.DataSource; -import jdplus.toolkit.base.tsp.DataSourceLoader; -import jdplus.toolkit.base.tsp.DataSourceProvider; -import jdplus.toolkit.base.tsp.FileLoader; -import java.awt.Image; +import nbbrd.design.MightBePromoted; import org.checkerframework.checker.nullness.qual.NonNull; +import org.openide.ErrorManager; +import org.openide.nodes.BeanNode; +import org.openide.nodes.Node; import org.openide.nodes.Sheet; import org.openide.util.ImageUtilities; +import javax.swing.*; +import java.awt.*; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.io.IOException; @@ -46,14 +46,8 @@ import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.function.BiConsumer; -import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.swing.Icon; -import nbbrd.design.MightBePromoted; -import org.openide.nodes.BeanNode; -import org.openide.nodes.Node; /** * @author Philippe Charles @@ -283,9 +277,9 @@ public Image getDataSetImage(DataSourceProviderBuddy buddy, DataSet dataSet, int } switch (dataSet.getKind()) { case COLLECTION: - return ImageUtilities.loadImage("demetra/desktop/icons/folder.png", true); + return ImageUtilities.loadImage("jdplus/toolkit/desktop/plugin/icons/folder.png", true); case SERIES: - return ImageUtilities.loadImage("demetra/desktop/icons/chart_line.png", true); + return ImageUtilities.loadImage("jdplus/toolkit/desktop/plugin/icons/chart_line.png", true); default: return getDataSourceImage(buddy, dataSet.getDataSource(), type, opened); } @@ -308,42 +302,42 @@ private static final class DefaultSheetStrategy implements SheetStrategy { @Override public Sheet getProviderSheet(DataSourceProviderBuddy buddy, String providerName) { - Sheet result = buddy.getSheetOrNull(); - return result != null ? result : DataSourceProviderBuddyUtil.sheetOf(sheetSetsOfProvider(providerName)); + List result = buddy.getSheetOrNull(); + return sheetOf(result != null ? result : providerName(providerName)); } @Override public Sheet getDataSourceSheet(DataSourceProviderBuddy buddy, DataSource dataSource) { - Sheet result = buddy.getSheetOrNull(dataSource); - return result != null ? result : DataSourceProviderBuddyUtil.sheetOf(sheetSetsOfDataSource(dataSource)); + List result = buddy.getSheetOrNull(dataSource); + return sheetOf(result != null ? result : dataSource(buddy, dataSource)); } @Override public Sheet getDataSetSheet(DataSourceProviderBuddy buddy, DataSet dataSet) { - Sheet result = buddy.getSheetOrNull(dataSet); - return result != null ? result : DataSourceProviderBuddyUtil.sheetOf(sheetSetsOfDataSet(dataSet)); + List result = buddy.getSheetOrNull(dataSet); + return sheetOf(result != null ? result : dataSet(buddy, dataSet)); } @Override public Sheet getErrorSheet(DataSourceProviderBuddy buddy, String providerName, IOException ex) { - Sheet result = buddy.getSheetOrNull(ex); - return result != null ? result : DataSourceProviderBuddyUtil.sheetOf(sheetSetsOfException(ex)); + List result = buddy.getSheetOrNull(ex); + return sheetOf(result != null ? result : error(ex)); } @Override public Sheet getBeanSheet(DataSourceProviderBuddy buddy, String providerName, Object bean) throws IntrospectionException { - Sheet result = buddy.getSheetOfBeanOrNull(bean); - return result != null ? result : DataSourceProviderBuddyUtil.sheetOf(sheetSetsOfBean(bean)); + List result = buddy.getSheetOfBeanOrNull(bean); + return sheetOf(result != null ? result : bean(bean)); } - private static List sheetSetsOfProvider(String providerName) { + private static List providerName(String providerName) { return TsManager.get() .getProvider(DataSourceProvider.class, providerName) - .map(DefaultSheetStrategy::sheetSetsOfProvider) + .map(DefaultSheetStrategy::provider) .orElseGet(Collections::emptyList); } - private static List sheetSetsOfProvider(DataSourceProvider provider) { + private static List provider(DataSourceProvider provider) { List result = new ArrayList<>(); NodePropertySetBuilder b = new NodePropertySetBuilder(); b.with(String.class).select(provider, "getSource", null).display("Source").add(); @@ -354,19 +348,13 @@ private static List sheetSetsOfProvider(DataSourceProvider provider) return result; } - private static List sheetSetsOfBean(Object bean) throws IntrospectionException { + private static List bean(Object bean) throws IntrospectionException { return Stream.of(new BeanNode<>(bean).getPropertySets()) - .map(DefaultSheetStrategy::sheetSetOfPropertySet) + .map(DefaultSheetStrategy::sheetSetOf) .collect(Collectors.toList()); } - private static Sheet.Set sheetSetOfPropertySet(Node.PropertySet o) { - Sheet.Set set = Sheet.createPropertiesSet(); - set.put(o.getProperties()); - return set; - } - - private static List sheetSetsOfException(IOException ex) { + private static List error(IOException ex) { List result = new ArrayList<>(); NodePropertySetBuilder b = new NodePropertySetBuilder().name("IOException"); @@ -383,11 +371,7 @@ private static List sheetSetsOfException(IOException ex) { return result; } - private static List sheetSetsOfDataSource(DataSource dataSource) { - return sheetSetsOfDataSource(dataSource, DataSourceProviderBuddyUtil.usingErrorManager(DefaultSheetStrategy::sheetSetsOfBean, Collections::emptyList)); - } - - private static List sheetSetsOfDataSource(DataSource dataSource, Function> beanFunc) { + private static List dataSource(DataSourceProviderBuddy buddy, DataSource dataSource) { List result = new ArrayList<>(); NodePropertySetBuilder b = new NodePropertySetBuilder().name("DataSource"); b.with(String.class).select(dataSource, "getProviderName", null).display("Source").add(); @@ -395,33 +379,45 @@ private static List sheetSetsOfDataSource(DataSource dataSource, Func Optional loader = TsManager.get().getProvider(DataSourceLoader.class, dataSource); if (loader.isPresent()) { Object bean = loader.orElseThrow().decodeBean(dataSource); - beanFunc.apply(bean).stream() - .flatMap(set -> Stream.of(set.getProperties())) - .map(ForwardingNodeProperty::readOnly) - .forEach(b::add); + try { + List sheetOfBeanOrNull = buddy.getSheetOfBeanOrNull(bean); + if (sheetOfBeanOrNull == null) { + sheetOfBeanOrNull = bean(bean); + } + if (sheetOfBeanOrNull != null) { + sheetOfBeanOrNull.stream() + .flatMap(set -> Stream.of(set.getProperties())) + .map(ForwardingNodeProperty::readOnly) + .forEach(b::add); + } + } catch (IntrospectionException ex) { + ErrorManager.getDefault().log(ex.getMessage()); + } } result.add(b.build()); return result; } - private static List sheetSetsOfDataSet(DataSet dataSet) { - return sheetSetsOfDataSet(dataSet, DefaultSheetStrategy::sheetSetsOfDataSource, DefaultSheetStrategy::fillParamProperties); - } - - private static void fillParamProperties(NodePropertySetBuilder b, DataSet dataSet) { - dataSet.getParameters().forEach((k, v) -> b.with(String.class).selectConst(k, v).add()); - } - - private static List sheetSetsOfDataSet(DataSet dataSet, - Function> sourceFunc, - BiConsumer paramFiller) { - List result = new ArrayList<>(sourceFunc.apply(dataSet.getDataSource())); + private static List dataSet(DataSourceProviderBuddy buddy, DataSet dataSet) { + List result = new ArrayList<>(dataSource(buddy, dataSet.getDataSource())); NodePropertySetBuilder b = new NodePropertySetBuilder().name("DataSet"); b.withEnum(DataSet.Kind.class).select(dataSet, "getKind", null).display("Kind").add(); - paramFiller.accept(b, dataSet); + dataSet.getParameters().forEach((k, v) -> b.with(String.class).selectConst(k, v).add()); result.add(b.build()); return result; } + + private static Sheet sheetOf(List sets) { + Sheet result = new Sheet(); + sets.forEach(result::put); + return result; + } + + private static Sheet.Set sheetSetOf(Node.PropertySet o) { + Sheet.Set set = Sheet.createPropertiesSet(); + set.put(o.getProperties()); + return set; + } } private enum NoOpDataSourceProviderBuddy implements DataSourceProviderBuddy { diff --git a/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/src/main/java/jdplus/toolkit/desktop/plugin/tsproviders/DataSourceProviderBuddy.java b/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/src/main/java/jdplus/toolkit/desktop/plugin/tsproviders/DataSourceProviderBuddy.java index f8c69fa2..281b978f 100644 --- a/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/src/main/java/jdplus/toolkit/desktop/plugin/tsproviders/DataSourceProviderBuddy.java +++ b/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/src/main/java/jdplus/toolkit/desktop/plugin/tsproviders/DataSourceProviderBuddy.java @@ -16,11 +16,11 @@ */ package jdplus.toolkit.desktop.plugin.tsproviders; -import jdplus.toolkit.desktop.plugin.beans.BeanEditor; -import jdplus.toolkit.desktop.plugin.util.NetBeansServiceBackend; import jdplus.toolkit.base.api.timeseries.TsMoniker; import jdplus.toolkit.base.tsp.DataSet; import jdplus.toolkit.base.tsp.DataSource; +import jdplus.toolkit.desktop.plugin.beans.BeanEditor; +import jdplus.toolkit.desktop.plugin.util.NetBeansServiceBackend; import nbbrd.service.Quantifier; import nbbrd.service.ServiceDefinition; import org.checkerframework.checker.nullness.qual.NonNull; @@ -30,6 +30,7 @@ import java.awt.*; import java.beans.IntrospectionException; import java.io.IOException; +import java.util.List; /** * @author Philippe Charles @@ -71,27 +72,27 @@ default Image getIconOrNull(@NonNull TsMoniker moniker, int type, boolean opened } @Nullable - default Sheet getSheetOrNull() { + default List getSheetOrNull() { return null; } @Nullable - default Sheet getSheetOrNull(@NonNull DataSource dataSource) { + default List getSheetOrNull(@NonNull DataSource dataSource) { return null; } @Nullable - default Sheet getSheetOrNull(@NonNull DataSet dataSet) { + default List getSheetOrNull(@NonNull DataSet dataSet) { return null; } @Nullable - default Sheet getSheetOrNull(@NonNull IOException ex) { + default List getSheetOrNull(@NonNull IOException ex) { return null; } @Nullable - default Sheet getSheetOfBeanOrNull(@NonNull Object bean) throws IntrospectionException { + default List getSheetOfBeanOrNull(@NonNull Object bean) throws IntrospectionException { return null; } diff --git a/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/src/main/java/jdplus/toolkit/desktop/plugin/tsproviders/DataSourceProviderBuddyUtil.java b/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/src/main/java/jdplus/toolkit/desktop/plugin/tsproviders/DataSourceProviderBuddyUtil.java index fcc150ec..8c6fa020 100644 --- a/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/src/main/java/jdplus/toolkit/desktop/plugin/tsproviders/DataSourceProviderBuddyUtil.java +++ b/jdplus-main-desktop/jdplus-toolkit-desktop-plugin/src/main/java/jdplus/toolkit/desktop/plugin/tsproviders/DataSourceProviderBuddyUtil.java @@ -16,17 +16,14 @@ */ package jdplus.toolkit.desktop.plugin.tsproviders; -import jdplus.toolkit.desktop.plugin.Config; import jdplus.toolkit.base.tsp.DataSource; +import jdplus.toolkit.desktop.plugin.Config; import org.checkerframework.checker.nullness.qual.NonNull; import org.openide.ErrorManager; -import org.openide.nodes.Sheet; import java.beans.IntrospectionException; -import java.util.List; import java.util.function.Function; import java.util.function.Supplier; -import java.util.stream.Stream; /** * @author Philippe Charles @@ -57,20 +54,6 @@ public static Config getConfig(DataSource dataSource, String displayName) { .build(); } - @NonNull - public static Sheet sheetOf(List sets) { - Sheet result = new Sheet(); - sets.forEach(result::put); - return result; - } - - @NonNull - public static Sheet sheetOf(Sheet.Set... sets) { - Sheet result = new Sheet(); - Stream.of(sets).forEach(result::put); - return result; - } - @FunctionalInterface public interface IntrospectionFunc { diff --git a/jdplus-main-desktop/jdplus-tramoseats-desktop-plugin/pom.xml b/jdplus-main-desktop/jdplus-tramoseats-desktop-plugin/pom.xml index 0814e5bf..d004c070 100644 --- a/jdplus-main-desktop/jdplus-tramoseats-desktop-plugin/pom.xml +++ b/jdplus-main-desktop/jdplus-tramoseats-desktop-plugin/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main-desktop - 3.0.1 + 3.0.2 jdplus-tramoseats-desktop-plugin diff --git a/jdplus-main-desktop/jdplus-x13-desktop-plugin/pom.xml b/jdplus-main-desktop/jdplus-x13-desktop-plugin/pom.xml index 91273ebb..f24e32d6 100644 --- a/jdplus-main-desktop/jdplus-x13-desktop-plugin/pom.xml +++ b/jdplus-main-desktop/jdplus-x13-desktop-plugin/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main-desktop - 3.0.1 + 3.0.2 jdplus-x13-desktop-plugin diff --git a/jdplus-main-desktop/pom.xml b/jdplus-main-desktop/pom.xml index 32d51431..23ad349e 100644 --- a/jdplus-main-desktop/pom.xml +++ b/jdplus-main-desktop/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main - 3.0.1 + 3.0.2 jdplus-main-desktop @@ -21,7 +21,7 @@ nbdemetra - RELEASE170 + RELEASE180 diff --git a/pom.xml b/pom.xml index 28c5822a..9735a08a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ eu.europa.ec.joinup.sat jdplus-main - 3.0.1 + 3.0.2 pom ${project.artifactId} @@ -48,7 +48,7 @@ ${project.artifactId} - 1.18.26 + 1.18.28 1.6.1 1.4.0 3.33.0 @@ -60,7 +60,7 @@ 2.2.4 3.21.12 - 0.0.22 + 0.0.23 1.0.3 2.5.2 @@ -162,7 +162,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.1.0 + 3.1.2 @@ -193,12 +193,12 @@ com.amashchenko.maven.plugin gitflow-maven-plugin - 1.19.0 + 1.20.0 org.apache.maven.plugins maven-source-plugin - 3.2.1 + 3.3.0 org.apache.maven.plugins @@ -218,12 +218,12 @@ org.apache.maven.plugins maven-dependency-plugin - 3.5.0 + 3.6.0 org.apache.maven.plugins maven-assembly-plugin - 3.5.0 + 3.6.0