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