You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by le...@apache.org on 2024/10/27 15:41:51 UTC
(iotdb) 11/31: add
This is an automated email from the ASF dual-hosted git repository.
leirui pushed a commit to branch research/LTS-visualization
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit a2c986a765aac4425dbe3bfae4ab6e64abd172bf
Author: Lei Rui <10...@qq.com>
AuthorDate: Wed Oct 2 01:57:04 2024 +0800
add
---
.../org/apache/iotdb/db/query/simpiece/DFT.java | 2 +-
.../org/apache/iotdb/db/query/simpiece/DWT.java | 2 +-
.../iotdb/db/query/simpiece/SamplingTest.java | 50 ++
.../iotdb/db/query/simpiece/jwave/JWave.java | 136 +++++
.../iotdb/db/query/simpiece/jwave/Transform.java | 459 ++++++++++++++++
.../db/query/simpiece/jwave/TransformBuilder.java | 99 ++++
.../simpiece/jwave/compressions/Compressor.java | 229 ++++++++
.../jwave/compressions/CompressorMagnitude.java | 121 +++++
.../jwave/compressions/CompressorPeaksAverage.java | 150 ++++++
.../db/query/simpiece/jwave/datatypes/Super.java | 92 ++++
.../query/simpiece/jwave/datatypes/SuperLine.java | 184 +++++++
.../simpiece/jwave/datatypes/blocks/Block.java | 228 ++++++++
.../simpiece/jwave/datatypes/blocks/BlockFull.java | 187 +++++++
.../simpiece/jwave/datatypes/blocks/BlockHash.java | 201 +++++++
.../query/simpiece/jwave/datatypes/lines/Line.java | 184 +++++++
.../simpiece/jwave/datatypes/lines/LineFull.java | 178 ++++++
.../simpiece/jwave/datatypes/lines/LineHash.java | 215 ++++++++
.../simpiece/jwave/datatypes/natives/Complex.java | 384 +++++++++++++
.../simpiece/jwave/datatypes/spaces/Space.java | 280 ++++++++++
.../simpiece/jwave/datatypes/spaces/SpaceFull.java | 190 +++++++
.../simpiece/jwave/datatypes/spaces/SpaceHash.java | 205 +++++++
.../simpiece/jwave/exceptions/JWaveError.java | 55 ++
.../simpiece/jwave/exceptions/JWaveException.java | 114 ++++
.../simpiece/jwave/exceptions/JWaveFailure.java | 55 ++
.../jwave/exceptions/JWaveFailureNotAllocated.java | 45 ++
.../jwave/exceptions/JWaveFailureNotFound.java | 45 ++
.../exceptions/JWaveFailureNotImplemented.java | 45 ++
.../jwave/exceptions/JWaveFailureNotKnown.java | 45 ++
.../jwave/exceptions/JWaveFailureNotValid.java | 46 ++
.../db/query/simpiece/jwave/tools/MathToolKit.java | 242 +++++++++
.../transforms/AncientEgyptianDecomposition.java | 173 ++++++
.../simpiece/jwave/transforms/BasicTransform.java | 596 +++++++++++++++++++++
.../jwave/transforms/DiscreteFourierTransform.java | 266 +++++++++
.../jwave/transforms/FastWaveletTransform.java | 141 +++++
.../jwave/transforms/ShiftingWaveletTransform.java | 126 +++++
.../jwave/transforms/WaveletPacketTransform.java | 171 ++++++
.../jwave/transforms/WaveletTransform.java | 164 ++++++
.../jwave/transforms/wavelets/Wavelet.java | 264 +++++++++
.../jwave/transforms/wavelets/WaveletBuilder.java | 499 +++++++++++++++++
.../wavelets/biorthogonal/BiOrthogonal.java | 127 +++++
.../wavelets/biorthogonal/BiOrthogonal11.java | 63 +++
.../wavelets/biorthogonal/BiOrthogonal13.java | 83 +++
.../wavelets/biorthogonal/BiOrthogonal15.java | 74 +++
.../wavelets/biorthogonal/BiOrthogonal22.java | 83 +++
.../wavelets/biorthogonal/BiOrthogonal24.java | 74 +++
.../wavelets/biorthogonal/BiOrthogonal26.java | 82 +++
.../wavelets/biorthogonal/BiOrthogonal28.java | 90 ++++
.../wavelets/biorthogonal/BiOrthogonal31.java | 62 +++
.../wavelets/biorthogonal/BiOrthogonal33.java | 70 +++
.../wavelets/biorthogonal/BiOrthogonal35.java | 78 +++
.../wavelets/biorthogonal/BiOrthogonal37.java | 86 +++
.../wavelets/biorthogonal/BiOrthogonal39.java | 94 ++++
.../wavelets/biorthogonal/BiOrthogonal44.java | 74 +++
.../wavelets/biorthogonal/BiOrthogonal55.java | 107 ++++
.../wavelets/biorthogonal/BiOrthogonal68.java | 90 ++++
.../transforms/wavelets/coiflet/Coiflet1.java | 63 +++
.../transforms/wavelets/coiflet/Coiflet2.java | 64 +++
.../transforms/wavelets/coiflet/Coiflet3.java | 70 +++
.../transforms/wavelets/coiflet/Coiflet4.java | 76 +++
.../transforms/wavelets/coiflet/Coiflet5.java | 82 +++
.../wavelets/daubechies/Daubechies10.java | 93 ++++
.../wavelets/daubechies/Daubechies11.java | 75 +++
.../wavelets/daubechies/Daubechies12.java | 77 +++
.../wavelets/daubechies/Daubechies13.java | 79 +++
.../wavelets/daubechies/Daubechies14.java | 81 +++
.../wavelets/daubechies/Daubechies15.java | 83 +++
.../wavelets/daubechies/Daubechies16.java | 85 +++
.../wavelets/daubechies/Daubechies17.java | 87 +++
.../wavelets/daubechies/Daubechies18.java | 89 +++
.../wavelets/daubechies/Daubechies19.java | 91 ++++
.../wavelets/daubechies/Daubechies2.java | 63 +++
.../wavelets/daubechies/Daubechies20.java | 92 ++++
.../wavelets/daubechies/Daubechies3.java | 66 +++
.../wavelets/daubechies/Daubechies4.java | 61 +++
.../wavelets/daubechies/Daubechies5.java | 63 +++
.../wavelets/daubechies/Daubechies6.java | 65 +++
.../wavelets/daubechies/Daubechies7.java | 67 +++
.../wavelets/daubechies/Daubechies8.java | 69 +++
.../wavelets/daubechies/Daubechies9.java | 71 +++
.../jwave/transforms/wavelets/haar/Haar1.java | 86 +++
.../transforms/wavelets/haar/Haar1Orthogonal.java | 196 +++++++
.../transforms/wavelets/legendre/Legendre1.java | 60 +++
.../transforms/wavelets/legendre/Legendre2.java | 61 +++
.../transforms/wavelets/legendre/Legendre3.java | 63 +++
.../jwave/transforms/wavelets/other/Battle23.java | 90 ++++
.../jwave/transforms/wavelets/other/CDF53.java | 73 +++
.../jwave/transforms/wavelets/other/CDF97.java | 80 +++
.../transforms/wavelets/other/DiscreteMayer.java | 115 ++++
.../transforms/wavelets/symlets/Symlet10.java | 72 +++
.../transforms/wavelets/symlets/Symlet11.java | 75 +++
.../transforms/wavelets/symlets/Symlet12.java | 77 +++
.../transforms/wavelets/symlets/Symlet13.java | 79 +++
.../transforms/wavelets/symlets/Symlet14.java | 81 +++
.../transforms/wavelets/symlets/Symlet15.java | 83 +++
.../transforms/wavelets/symlets/Symlet16.java | 85 +++
.../transforms/wavelets/symlets/Symlet17.java | 87 +++
.../transforms/wavelets/symlets/Symlet18.java | 89 +++
.../transforms/wavelets/symlets/Symlet19.java | 91 ++++
.../jwave/transforms/wavelets/symlets/Symlet2.java | 74 +++
.../transforms/wavelets/symlets/Symlet20.java | 92 ++++
.../jwave/transforms/wavelets/symlets/Symlet3.java | 58 ++
.../jwave/transforms/wavelets/symlets/Symlet4.java | 60 +++
.../jwave/transforms/wavelets/symlets/Symlet5.java | 62 +++
.../jwave/transforms/wavelets/symlets/Symlet6.java | 64 +++
.../jwave/transforms/wavelets/symlets/Symlet7.java | 66 +++
.../jwave/transforms/wavelets/symlets/Symlet8.java | 68 +++
.../jwave/transforms/wavelets/symlets/Symlet9.java | 70 +++
107 files changed, 12272 insertions(+), 2 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/DFT.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/DFT.java
index e890d0f76d1..f6f6021125d 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/simpiece/DFT.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/DFT.java
@@ -23,7 +23,7 @@ import java.util.ArrayList;
import java.util.List;
public class DFT {
- public static List<Point> reducePoints(List<Point> points, double epsilon) {
+ public static List<Point> reducePoints(List<Point> points, double threshold) {
int length = points.size();
List<Point> result = new ArrayList<>();
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/DWT.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/DWT.java
index 46a67f38c10..bd6e8e9f2a2 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/simpiece/DWT.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/DWT.java
@@ -23,7 +23,7 @@ import java.util.ArrayList;
import java.util.List;
public class DWT {
- public static List<Point> reducePoints(List<Point> points, double epsilon) {
+ public static List<Point> reducePoints(List<Point> points, double threshold) {
int length = points.size();
List<Point> result = new ArrayList<>();
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/SamplingTest.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/SamplingTest.java
new file mode 100644
index 00000000000..cbe66a17546
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/SamplingTest.java
@@ -0,0 +1,50 @@
+package org.apache.iotdb.db.query.simpiece;
+
+import org.apache.iotdb.db.query.simpiece.jwave.Transform;
+import org.apache.iotdb.db.query.simpiece.jwave.TransformBuilder;
+import org.apache.iotdb.db.query.simpiece.jwave.tools.MathToolKit;
+
+public class SamplingTest {
+
+ public static void main(String[] args) {
+ int samplingRate = 1024 * 1024; // sampling rate
+ int noOfOscillations = 1024;
+
+ // generate sampled (discrete) sine over 2 pi
+ double[] arrTime = MathToolKit.createSineOscillation(samplingRate, noOfOscillations);
+
+ Transform transform = TransformBuilder.create("Fast Wavelet Transform", "Haar");
+
+ double[] arrHilb = transform.forward(arrTime);
+
+ double[] arrReco = transform.reverse(arrHilb);
+
+ // assertArray(arrTime, arrReco, 1e-10);
+
+ // generate sampled (discrete) sine over 2 pi
+ arrTime = MathToolKit.createCosineOscillation(samplingRate, noOfOscillations);
+
+ arrHilb = transform.forward(arrTime);
+
+ arrReco = transform.reverse(arrHilb);
+
+ // assertArray(arrTime, arrReco, 1e-10);
+
+ transform = TransformBuilder.create("Wavelet Packet Transform", "Haar");
+
+ arrHilb = transform.forward(arrTime);
+
+ arrReco = transform.reverse(arrHilb);
+
+ // assertArray(arrTime, arrReco, 1e-10);
+
+ // generate sampled (discrete) sine over 2 pi
+ arrTime = MathToolKit.createCosineOscillation(samplingRate, noOfOscillations);
+
+ arrHilb = transform.forward(arrTime);
+
+ arrReco = transform.reverse(arrHilb);
+
+ // assertArray(arrTime, arrReco, 1e-10);
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/JWave.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/JWave.java
new file mode 100644
index 00000000000..1a552436248
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/JWave.java
@@ -0,0 +1,136 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.DiscreteFourierTransform;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.WaveletBuilder;
+
+/**
+ * Main class can be used to do a little console test by entering a transform type and a wavelet by
+ * their names. However, this should only make a quick n dirty test available by skipping the JUnit
+ * framework. JWave is supported as a library and foreseen to be used like this.
+ *
+ * @date 23.02.2010 14:26:47
+ * @author Christian (graetz23@gmail.com)
+ */
+public class JWave {
+
+ /**
+ * Main method for doing little test runs for different transform types and different wavelets
+ * without JUnit. Type in the name of the transform and the name of the wavelet. The result is an
+ * array of length 16 (2^p | p E N) is transformed in four hierarchical steps (16/2=8 .. 8/2=4 ..
+ * 4/2=2 .. 2/1=1) and reduced by 1/sqrt(2.). The result is an array in Hilbert space keeping only
+ * one coefficient, the energy of value 4. (low pass), in the first position of the array. All
+ * detail coefficients (high pass of four stages) are zero, due to the fact that the input array
+ * was constant. This shows an application of a loss less compression of 93.75 % (15/16 * 100 %).
+ * Therefore, the reverse transform allows, due to orthogonality (even orthonormality) a located
+ * reconstruction of any coefficient that is currently supported in Hilbert space. Anyway, this
+ * little example already reveals the application power of wavelets. that can be used for any kind
+ * of data!
+ *
+ * @date 23.02.2010 14:26:47
+ * @author Christian (graetz23@gmail.com)
+ * @param args [transformType] [waveletType]
+ */
+ public static void main(String[] args) {
+
+ if (args.length < 3 || args.length > 5) {
+ System.err.println("example usage: JWave [transformType] {waveletType}");
+ System.err.println("");
+ System.err.println(
+ "Transform names: "
+ + "'Discrete Fourier Transform'"
+ + " "
+ + "'Fast Wavelet Transform'"
+ + " "
+ + "'Wavelet Packet Transform'");
+ System.err.println(
+ "Wavelet names: "
+ + "'Haar',"
+ + " "
+ + "'Haar orthogonal',"
+ + " "
+ + "'Daubechies 2'"
+ + " "
+ + ".."
+ + " "
+ + "'Daubechies 20',"
+ + " "
+ + "'Symlet 2'"
+ + " "
+ + ".."
+ + " "
+ + "'Symlet 20',"
+ + " "
+ + "'Coiflet 1'"
+ + " "
+ + ".."
+ + " "
+ + "'Coiflet 5',"
+ + " "
+ + "'Legendre 1'"
+ + " "
+ + ".."
+ + " "
+ + "'Legendre 3',"
+ + " "
+ + " ... 'BiOrthogonal 1/1'"
+ + " have a look for more in the 'transform.wavelets' package!");
+ return;
+ } // if args
+
+ String waveletIdentifier = "";
+ if (args.length > 4) waveletIdentifier = args[3] + " " + args[4]; // raw n dirty but working
+ else waveletIdentifier = args[3]; // if "Haar" is used
+ String transformIdentifier = args[0] + " " + args[1] + " " + args[2]; // raw n dirty but working
+
+ Transform transform = TransformBuilder.create(transformIdentifier, waveletIdentifier);
+
+ Wavelet wavelet = transform.getWavelet();
+
+ double[] arrTime = {1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.};
+
+ if (transform.getBasicTransform() instanceof DiscreteFourierTransform)
+ System.out.print(TransformBuilder.identify(transform));
+ else
+ System.out.print(
+ TransformBuilder.identify(transform) + " using " + WaveletBuilder.identify(wavelet));
+ System.out.println("");
+ System.out.println("time domain:");
+ for (int p = 0; p < arrTime.length; p++) System.out.printf("%7.4f", arrTime[p]);
+ System.out.println("");
+
+ double[] arrFreqOrHilb = transform.forward(arrTime);
+
+ if (transform.getBasicTransform() instanceof DiscreteFourierTransform)
+ System.out.println("frequency domain:");
+ else System.out.println("Hilbert domain:");
+ for (int p = 0; p < arrTime.length; p++) System.out.printf("%7.4f", arrFreqOrHilb[p]);
+ System.out.println("");
+
+ double[] arrReco = transform.reverse(arrFreqOrHilb);
+
+ System.out.println("reconstruction:");
+ for (int p = 0; p < arrTime.length; p++) System.out.printf("%7.4f", arrReco[p]);
+ System.out.println("");
+ } // main
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/Transform.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/Transform.java
new file mode 100644
index 00000000000..0ad44291f5b
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/Transform.java
@@ -0,0 +1,459 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 23.05.2008 17:42:23
+ */
+package org.apache.iotdb.db.query.simpiece.jwave;
+
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.natives.Complex;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.BasicTransform;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Base class for transforms like DiscreteFourierTransform, FastBasicTransform, and
+ * WaveletPacketTransform.
+ *
+ * @date 19.05.2009 09:43:40
+ * @author Christian (graetz23@gmail.com)
+ */
+public final class Transform {
+
+ /** Transform object of type base class */
+ protected final BasicTransform _basicTransform;
+
+ /**
+ * Constructor; needs some object like DiscreteFourierTransform, FastBasicTransform,
+ * WaveletPacketTransfom, ...
+ *
+ * @date 19.05.2009 09:50:24
+ * @author Christian (graetz23@gmail.com)
+ * @param transform Transform object
+ */
+ public Transform(BasicTransform transform) {
+ _basicTransform = transform;
+ try {
+ if (_basicTransform == null) throw new JWaveFailure("given object is null!");
+ if (!(_basicTransform instanceof BasicTransform))
+ throw new JWaveFailure("given object is not of type BasicTransform");
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ } // Transform
+
+ /**
+ * Performs the forward transform of the specified BasicWave object.
+ *
+ * @date 10.02.2010 09:41:01
+ * @author Christian (graetz23@gmail.com)
+ * @param arrTime coefficients of time domain
+ * @return coefficients of frequency or Hilbert domain
+ */
+ public final double[] forward(double[] arrTime) {
+ double[] arrHilb = null;
+ try {
+ arrHilb = _basicTransform.forward(arrTime);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return arrHilb;
+ } // forward
+
+ /**
+ * Performs the reverse transform of the specified BasicWave object.
+ *
+ * @date 10.02.2010 09:42:18
+ * @author Christian (graetz23@gmail.com)
+ * @param arrHilb coefficients of frequency or Hilbert domain
+ * @return coefficients of time domain
+ */
+ public final double[] reverse(double[] arrHilb) {
+ double[] arrTime = null;
+ try {
+ arrTime = _basicTransform.reverse(arrHilb);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return arrTime;
+ } // reverse
+
+ /**
+ * Performs a forward transform to a certain level of Hilbert space.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 11:53:05
+ * @param arrTime array of length 2^p | p E N .. 2, 4, 8, 16, 32, 64, ...
+ * @param level a certain level that matches the array
+ * @return Hilbert space of certain level
+ */
+ public final double[] forward(double[] arrTime, int level) {
+ double[] arrHilb = null;
+ try {
+ arrHilb = _basicTransform.forward(arrTime, level);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return arrHilb;
+ } // forward
+
+ /**
+ * Performs a reverse transform for a Hilbert space of certain level; level has to match the
+ * supported coefficients in the array!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 11:54:59
+ * @param arrHilb Hilbert space by an array of length 2^p | p E N .. 2, 4, 8, 16, 32, 64, ...
+ * @param level the certain level the supported hilbert space
+ * @return time domain for a certain level of Hilbert space
+ */
+ public final double[] reverse(double[] arrHilb, int level) {
+ double[] arrTime = null;
+ try {
+ arrTime = _basicTransform.reverse(arrHilb, level);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return arrTime;
+ } // reverse
+
+ /**
+ * Performs the forward transform from time domain to frequency or Hilbert domain for a given
+ * array depending on the used transform algorithm by inheritance.
+ *
+ * @date 23.11.2010 19:19:24
+ * @author Christian (graetz23@gmail.com)
+ * @param arrTime coefficients of 1-D time domain
+ * @return coefficients of 1-D frequency or Hilbert domain
+ */
+ public final Complex[] forward(Complex[] arrTime) {
+ Complex[] arrFreq = null;
+ try {
+ arrFreq = ((BasicTransform) _basicTransform).forward(arrTime);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return arrFreq;
+ } // forward
+
+ /**
+ * Performs the reverse transform from frequency or Hilbert domain to time domain for a given
+ * array depending on the used transform algorithm by inheritance.
+ *
+ * @date 23.11.2010 19:19:33
+ * @author Christian (graetz23@gmail.com)
+ * @param arrFreq coefficients of 1-D frequency or Hilbert domain
+ * @return coefficients of 1-D time domain
+ */
+ public final Complex[] reverse(Complex[] arrFreq) {
+ Complex[] arrTime = null;
+ try {
+ arrTime = ((BasicTransform) _basicTransform).reverse(arrFreq);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return arrTime;
+ } // reverse
+
+ /**
+ * Performs the 2-D forward transform of the specified BasicWave object.
+ *
+ * @date 10.02.2010 10:58:54
+ * @author Christian (graetz23@gmail.com)
+ * @param matrixTime coefficients of 2-D time domain; internal M(i),N(j)
+ * @return coefficients of 2-D frequency or Hilbert domain
+ */
+ public final double[][] forward(double[][] matrixTime) {
+ double[][] matrixHilb = null;
+ try {
+ matrixHilb = _basicTransform.forward(matrixTime);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return matrixHilb;
+ } // forward
+
+ /**
+ * Performs the 2-D reverse transform of the specified BasicWave object.
+ *
+ * @date 10.02.2010 10:59:32
+ * @author Christian (graetz23@gmail.com)
+ * @param matrixFreq coefficients of 2-D frequency or Hilbert domain; internal M(i),N(j)
+ * @return coefficients of 2-D time domain
+ */
+ public final double[][] reverse(double[][] matrixHilb) {
+ double[][] matrixTime = null;
+ try {
+ matrixTime = _basicTransform.reverse(matrixHilb);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return matrixTime;
+ } // reverse
+
+ /**
+ * Performs the 2-D forward transform of the specified BasicWave object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 14:40:54
+ * @param matrixTime coefficients of 2-D time domain; internal M(i),N(j)
+ * @param levelM a certain level to stop transform for over rows
+ * @param levelN a certain level to stop transform for over columns
+ * @return coefficients of 2-D frequency or Hilbert domain
+ */
+ public final double[][] forward(double[][] matrixTime, int levelM, int levelN) {
+ double[][] matrixHilb = null;
+ try {
+ matrixHilb = _basicTransform.forward(matrixTime, levelM, levelN);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return matrixHilb;
+ } // forward
+
+ /**
+ * Performs the 2-D reverse transform of the specified BasicWave object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 14:42:12
+ * @param matrixFreq coefficients of 2-D frequency or Hilbert domain; internal M(i),N(j)
+ * @param levelM a certain level to stop transform for over rows
+ * @param levelN a certain level to stop transform for over columns
+ * @return coefficients of 2-D time domain
+ */
+ public final double[][] reverse(double[][] matrixHilb, int levelM, int levelN) {
+ double[][] matrixTime = null;
+ try {
+ matrixTime = _basicTransform.reverse(matrixHilb, levelM, levelN);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return matrixTime;
+ } // reverse
+
+ /**
+ * Performs the 3-D forward transform of the specified BasicWave object.
+ *
+ * @date 10.07.2010 18:15:22
+ * @author Christian (graetz23@gmail.com)
+ * @param matrixTime coefficients of 2-D time domain; internal M(i),N(j),O(k)
+ * @return coefficients of 2-D frequency or Hilbert domain
+ */
+ public final double[][][] forward(double[][][] spaceTime) {
+ double[][][] spaceHilb = null;
+ try {
+ spaceHilb = _basicTransform.forward(spaceTime);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return spaceHilb;
+ } // forward
+
+ /**
+ * Performs the 3-D reverse transform of the specified BasicWave object.
+ *
+ * @date 10.07.2010 18:15:33
+ * @author Christian (graetz23@gmail.com)
+ * @param matrixFreq coefficients of 2-D frequency or Hilbert domain; internal M(i),N(j),O(k)
+ * @return coefficients of 2-D time domain
+ */
+ public final double[][][] reverse(double[][][] spaceHilb) {
+ double[][][] spaceTime = null;
+ try {
+ spaceTime = _basicTransform.reverse(spaceHilb);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return spaceTime;
+ } // reverse
+
+ /**
+ * Performs the 3-D forward transform of the specified BasicWave object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 14:45:46
+ * @param spaceTime coefficients of 2-D time domain; internal M(i),N(j),O(k)
+ * @param levelP a certain level to stop transform for over rows
+ * @param levelQ a certain level to stop transform for over columns
+ * @param levelR a certain level to stop transform for over height
+ * @return coefficients of 2-D frequency or Hilbert domain
+ */
+ public final double[][][] forward(double[][][] spaceTime, int levelP, int levelQ, int levelR) {
+ double[][][] spaceHilb = null;
+ try {
+ spaceHilb = _basicTransform.forward(spaceTime, levelP, levelQ, levelR);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return spaceHilb;
+ } // forward
+
+ /**
+ * Performs the 3-D reverse transform of the specified BasicWave object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 14:46:09
+ * @param spaceHilb coefficients of 2-D frequency or Hilbert domain; internal M(i),N(j),O(k)
+ * @param levelP a certain level to start transform from over rows
+ * @param levelQ a certain level to stop transform for over columns
+ * @param levelR a certain level to start transform from over height
+ * @return coefficients of 2-D time domain
+ */
+ public final double[][][] reverse(double[][][] spaceHilb, int levelP, int levelQ, int levelR) {
+ double[][][] spaceTime = null;
+ try {
+ spaceTime = _basicTransform.reverse(spaceHilb, levelP, levelQ, levelR);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return spaceTime;
+ } // reverse
+
+ /**
+ * Generates from a 1D signal a 2D output, where the second dimension are the levels of the
+ * wavelet transform.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 17.08.2014 10:07:19
+ * @param arrTime coefficients of time domain
+ * @return matDeComp 2-D Hilbert spaces: [ 0 .. p ][ 0 .. N ] where p is the exponent of N=2^p
+ */
+ public final double[][] decompose(double[] arrTime) {
+ double[][] matDeComp = null;
+ try {
+ matDeComp = _basicTransform.decompose(arrTime);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return matDeComp;
+ } // decompose
+
+ /**
+ * Generates from a 2-D decomposition a 1-D time series.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 17.08.2014 10:07:19
+ * @param matDeComp 2-D Hilbert spaces: [ 0 .. p ][ 0 .. N ] where p is the exponent of N=2^p
+ * @return a 1-D time domain signal
+ */
+ public final double[] recompose(double[][] matDeComp) {
+ double[] arrTime = null;
+ try {
+ arrTime = _basicTransform.recompose(matDeComp);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return arrTime;
+ } // recompose
+
+ /**
+ * Recompose signal from a certain level of decomposition.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 10:08:52
+ * @param matDeComp
+ * @param level
+ * @return
+ */
+ public final double[] recompose(double[][] matDeComp, int level) {
+ double[] arrTime = null;
+ try {
+ arrTime = _basicTransform.recompose(matDeComp, level);
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+ return arrTime;
+ } // recompose
+
+ /**
+ * Return the used object of type BasicTransform.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 18:19:13
+ * @return identifier of object of type Basic Transform
+ */
+ public final BasicTransform getBasicTransform() {
+
+ BasicTransform basicTransform = null;
+
+ try {
+
+ if (_basicTransform == null)
+ throw new JWaveFailure("Transform - BasicTransform object is null!");
+
+ if (!(_basicTransform instanceof BasicTransform))
+ throw new JWaveFailure(
+ "Transform - getBasicTransform - " + "member is not of type BasicTransform!");
+
+ basicTransform = _basicTransform;
+
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+
+ return basicTransform;
+ } // getBasicTransform
+
+ /**
+ * Returns the used Wavelet object or null pointer.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 18:58:50
+ * @return object of type Wavelet
+ * @throws JWaveFailure if Wavelet object is not available
+ */
+ public final Wavelet getWavelet() {
+
+ Wavelet wavelet = null;
+ BasicTransform basicTransform = null;
+
+ try {
+
+ basicTransform = getBasicTransform();
+ wavelet = basicTransform.getWavelet();
+
+ } catch (JWaveException e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+
+ return wavelet;
+ } // getWavelet
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/TransformBuilder.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/TransformBuilder.java
new file mode 100644
index 00000000000..5ea947e7c18
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/TransformBuilder.java
@@ -0,0 +1,99 @@
+/**
+ * Create Transform objects ...
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 14:25:21
+ * <p>TransformBuilder.java
+ */
+package org.apache.iotdb.db.query.simpiece.jwave;
+
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.BasicTransform;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.DiscreteFourierTransform;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.FastWaveletTransform;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.WaveletPacketTransform;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.WaveletBuilder;
+
+/**
+ * Class for creating and identifying Transform object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 14:25:21
+ */
+public class TransformBuilder {
+
+ /**
+ * Create a Transform object by a given string and a given Wavelet object. Look into each
+ * Transform for matching string identifier. By the way the method requires Java 7, due to the
+ * switch statement on a string. *rofl*
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 14:35:12
+ * @param transformName identifier as stored in Transform object
+ * @param wavelet
+ * @return a matching object of type Transform
+ */
+ public static Transform create(String transformName, Wavelet wavelet) {
+
+ BasicTransform basicTransform = null;
+
+ try {
+
+ switch (transformName) {
+ case "Discrete Fourier Transform":
+ basicTransform = new DiscreteFourierTransform();
+ break;
+
+ case "Fast Wavelet Transform":
+ basicTransform = new FastWaveletTransform(wavelet);
+ break;
+
+ case "Wavelet Packet Transform":
+ basicTransform = new WaveletPacketTransform(wavelet);
+ break;
+
+ default:
+ throw new JWaveFailure(
+ "TransformBuilder::create - unknown type of transform for given string!");
+ } // switch
+
+ } catch (JWaveException e) {
+
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+
+ return new Transform(basicTransform);
+ } // create
+
+ /**
+ * Create a Transform object by a given string and a given string for a Wavelet object. Look into
+ * each Transform and Wavelet for matching string identifier.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 14:37:30
+ * @param transformName identifier as stored in Transform object
+ * @param waveletName
+ * @return identifier as stored in Wavelet object
+ */
+ public static Transform create(String transformName, String waveletName) {
+
+ return create(transformName, WaveletBuilder.create(waveletName));
+ } // create
+
+ /**
+ * Returns the identifier string of a given Transform object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 14:34:20
+ * @param transform string identifier of the given Transform object
+ * @return a string as the identifier of the given Transform object
+ */
+ public static String identify(Transform transform) {
+
+ BasicTransform basicTransform = transform.getBasicTransform();
+ return basicTransform.getName();
+ } // identify
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/compressions/Compressor.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/compressions/Compressor.java
new file mode 100644
index 00000000000..e493a222aef
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/compressions/Compressor.java
@@ -0,0 +1,229 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.compressions;
+
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+
+/**
+ * Some how this class is doing the same as the technical counterpart is doing - compressing data
+ * that is transformed to Hilbert space by different methods.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.02.2014 23:41:35
+ */
+public abstract class Compressor {
+
+ /**
+ * A threshold that is used in several compression methods.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.02.2014 23:44:26
+ */
+ protected double _threshold = 1.;
+
+ /**
+ * The calculated magnitude by algorithm of derived class.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.05.2015 18:36:17
+ */
+ protected double _magnitude = 0.;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.02.2014 23:41:35
+ */
+ public Compressor() {
+
+ _magnitude = 0.;
+ _threshold = 1.;
+ } // Compressor
+
+ public Compressor(double threshold) {
+
+ _magnitude = 0.;
+
+ try {
+
+ if (threshold <= 0.)
+ throw new JWaveFailure("Compressor - given threshold should be larger than zero!");
+ } catch (JWaveException e) {
+
+ e.showMessage();
+ System.out.println("Compressor - setting threshold to default value: " + 1.);
+ threshold = 1.;
+ }
+
+ _threshold = threshold;
+ } // Compressor
+
+ /**
+ * Compresses by comparing the magnitude value by the set compression factor, the threshold, and
+ * the sets all lower values to zero.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.05.2015 18:06:52
+ * @param arr
+ * @param magnitude
+ * @return
+ */
+ protected double[] compress(double[] arr, double magnitude) {
+
+ int arrLength = arr.length;
+
+ double[] arrComp = new double[arrLength];
+
+ for (int i = 0; i < arrLength; i++)
+ if (Math.abs(arr[i]) >= magnitude * _threshold) arrComp[i] = arr[i];
+ else arrComp[i] = 0.; // compression be setting to zero
+
+ return arrComp;
+ } // compress
+
+ /**
+ * Compresses by comparing the magnitude value by the set compression factor, the threshold, and
+ * the sets all lower values to zero.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.05.2015 18:17:31
+ * @param mat
+ * @param magnitude
+ * @return
+ */
+ protected double[][] compress(double[][] mat, double magnitude) {
+
+ int matHilbNoOfRows = mat.length;
+ int matHilbNoOfCols = mat[0].length;
+
+ double[][] matComp = new double[matHilbNoOfRows][matHilbNoOfCols];
+
+ for (int i = 0; i < matHilbNoOfRows; i++)
+ for (int j = 0; j < matHilbNoOfCols; j++)
+ if (Math.abs(mat[i][j]) >= magnitude * _threshold) matComp[i][j] = mat[i][j];
+ else matComp[i][j] = 0.;
+
+ return matComp;
+ } // compress
+
+ /**
+ * Compresses by comparing the magnitude value by the set compression factor, the threshold, and
+ * the sets all lower values to zero.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.05.2015 18:18:44
+ * @param spc
+ * @param magnitude
+ * @return
+ */
+ protected double[][][] compress(double[][][] spc, double magnitude) {
+
+ int matHilbNoOfRows = spc.length;
+ int matHilbNoOfCols = spc[0].length;
+ int matHilbNoOfLvls = spc[0][0].length;
+
+ double[][][] spcComp = new double[matHilbNoOfRows][matHilbNoOfCols][matHilbNoOfLvls];
+
+ for (int i = 0; i < matHilbNoOfRows; i++)
+ for (int j = 0; j < matHilbNoOfCols; j++)
+ for (int k = 0; k < matHilbNoOfLvls; k++)
+ if (Math.abs(spc[i][j][k]) >= magnitude * _threshold) spcComp[i][j][k] = spc[i][j][k];
+ else spcComp[i][j][k] = 0.;
+
+ return spcComp;
+ } // compress
+
+ /**
+ * Calculate the compression rate for a given array; means the percentage of the number of zeros
+ * kept by the array.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 06.01.2016 23:47:06
+ * @param arr the input of array keeping values and zeros
+ * @return the compression rate as a percentage: [0 .. 100] %
+ */
+ public double calcCompressionRate(double[] arr) {
+
+ double compressionRate = 0.;
+ int noOfZeros = 0;
+ int length = arr.length;
+ for (int i = 0; i < length; i++) {
+ if (arr[i] == 0.) noOfZeros++;
+ } // i
+ if (noOfZeros != 0) compressionRate = (double) noOfZeros / (double) length * 100.;
+ else compressionRate = (double) noOfZeros;
+ return compressionRate;
+ } // calcCompressionRate
+
+ /**
+ * Getter for _threshold member.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.05.2015 18:38:33
+ * @return value of threshold member
+ */
+ public double getThreshold() {
+
+ return _threshold;
+ } // getThreshold
+
+ /**
+ * Getter for calculated _magnitude member.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.05.2015 18:39:32
+ * @return value of magnitude member
+ */
+ public double getMagnitude() {
+
+ return _magnitude;
+ } // getMagnitude
+
+ /**
+ * Interface for arrays for driving the different compression methods.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.02.2014 23:48:06
+ * @param arrHilb
+ * @return
+ */
+ public abstract double[] compress(double[] arrHilb);
+
+ /**
+ * Interface for matrices for driving the different compression methods.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.02.2014 23:54:11
+ * @param matHilb
+ * @return
+ */
+ public abstract double[][] compress(double[][] matHilb);
+
+ /**
+ * Interface for spaces for driving the different compression methods.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.02.2014 23:54:52
+ * @param spcHilb
+ * @return
+ */
+ public abstract double[][][] compress(double[][][] spcHilb);
+} // Compressor
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/compressions/CompressorMagnitude.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/compressions/CompressorMagnitude.java
new file mode 100644
index 00000000000..8a853cc7845
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/compressions/CompressorMagnitude.java
@@ -0,0 +1,121 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.compressions;
+
+/**
+ * Compression algorithm is adding up all magnitudes of an array, a matrix, or a space and dividing
+ * this absolute value by the number of given data samples.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.02.2014 23:56:09
+ */
+public class CompressorMagnitude extends Compressor {
+
+ /**
+ * Threshold is set to one, which should always guarantee a rather good compression result.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.02.2014 23:56:09
+ */
+ public CompressorMagnitude() {
+
+ _magnitude = 0.;
+ _threshold = 1.;
+ } // CompressorMagnitude
+
+ /**
+ * Threshold is set a chosen; value 0 means no compression.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.02.2014 23:56:09
+ * @param threshold has to be positive value starting at 0 - 0 means no compression.
+ * @throws JWaveException
+ */
+ public CompressorMagnitude(double threshold) {
+
+ super(threshold);
+
+ _magnitude = 0.;
+ } // CompressorMagnitude
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.02.2014 23:56:09 (non-Javadoc)
+ * @see jwave.compressions.Compressor#compress(double[])
+ */
+ @Override
+ public double[] compress(double[] arrHilb) {
+
+ _magnitude = 0.;
+
+ int arrHilbLength = arrHilb.length;
+
+ for (int i = 0; i < arrHilbLength; i++) _magnitude += Math.abs(arrHilb[i]);
+
+ _magnitude /= (double) arrHilbLength;
+
+ return compress(arrHilb, _magnitude); // generates new array
+ } // compress
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.02.2014 23:56:09 (non-Javadoc)
+ * @see jwave.compressions.Compressor#compress(double[][])
+ */
+ @Override
+ public double[][] compress(double[][] matHilb) {
+
+ _magnitude = 0.;
+
+ int matHilbNoOfRows = matHilb.length;
+ int matHilbNoOfCols = matHilb[0].length;
+
+ for (int i = 0; i < matHilbNoOfRows; i++)
+ for (int j = 0; j < matHilbNoOfCols; j++) _magnitude += Math.abs(matHilb[i][j]);
+
+ _magnitude /= (double) matHilbNoOfRows * (double) matHilbNoOfCols;
+
+ return compress(matHilb, _magnitude);
+ } // compress
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.02.2014 23:56:09 (non-Javadoc)
+ * @see jwave.compressions.Compressor#compress(double[][][])
+ */
+ @Override
+ public double[][][] compress(double[][][] spcHilb) {
+
+ _magnitude = 0.;
+
+ int matHilbNoOfRows = spcHilb.length;
+ int matHilbNoOfCols = spcHilb[0].length;
+ int matHilbNoOfLvls = spcHilb[0][0].length;
+
+ for (int i = 0; i < matHilbNoOfRows; i++)
+ for (int j = 0; j < matHilbNoOfCols; j++)
+ for (int k = 0; k < matHilbNoOfLvls; k++) _magnitude += Math.abs(spcHilb[i][j][k]);
+
+ _magnitude /= (double) matHilbNoOfRows * (double) matHilbNoOfCols * (double) matHilbNoOfLvls;
+
+ return compress(spcHilb, _magnitude);
+ } // compress
+} // CompressorMagnitude
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/compressions/CompressorPeaksAverage.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/compressions/CompressorPeaksAverage.java
new file mode 100644
index 00000000000..39af7653004
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/compressions/CompressorPeaksAverage.java
@@ -0,0 +1,150 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.compressions;
+
+/**
+ * This compression takes the average of the min and absolute the max of a given array, matrix, or
+ * space as thresholding value.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.05.2015 17:57:19
+ */
+public class CompressorPeaksAverage extends Compressor {
+
+ protected double _peakMinimum;
+
+ protected double _peakMaximum;
+
+ /**
+ * Compression by average of peak min & max.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.05.2015 17:57:19
+ */
+ public CompressorPeaksAverage() {
+
+ _peakMinimum = 0.;
+ _peakMaximum = 0.;
+ _magnitude = 0.;
+ } // CompressorPeaksAverage
+
+ /**
+ * Compression by average of peak min & max.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.05.2015 17:57:19
+ * @param threshold
+ * @throws JWaveException
+ */
+ public CompressorPeaksAverage(double threshold) {
+
+ super(threshold);
+
+ _peakMinimum = 0.;
+ _peakMaximum = 0.;
+ _magnitude = 0.;
+ } // CompressorPeaksAverage
+
+ /**
+ * Calculating the average by maximal distance between minimal and maximal absolute value.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.05.2015 17:57:19 (non-Javadoc)
+ * @see jwave.compressions.Compressor#compress(double[])
+ */
+ @Override
+ public double[] compress(double[] arrHilb) {
+
+ for (double val : arrHilb) {
+
+ double absVal = Math.abs(val);
+
+ if (absVal <= _peakMinimum) _peakMinimum = absVal;
+
+ if (absVal >= _peakMaximum) _peakMaximum = absVal;
+ } // loop over all entries
+
+ _magnitude = .5 * (_peakMaximum - _peakMinimum);
+
+ return compress(arrHilb, _magnitude);
+ } // compress
+
+ /**
+ * Calculating the average by maximal distance between minimal and maximal absolute value.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.05.2015 17:57:19 (non-Javadoc)
+ * @see jwave.compressions.Compressor#compress(double[][])
+ */
+ @Override
+ public double[][] compress(double[][] matHilb) {
+
+ int matHilbNoOfRows = matHilb.length;
+ int matHilbNoOfCols = matHilb[0].length;
+
+ for (int i = 0; i < matHilbNoOfRows; i++) {
+ for (int j = 0; j < matHilbNoOfCols; j++) {
+
+ double absVal = Math.abs(matHilb[i][j]);
+
+ if (absVal <= _peakMinimum) _peakMinimum = absVal;
+
+ if (absVal >= _peakMaximum) _peakMaximum = absVal;
+ } // j
+ } // i - loop over all entries
+
+ _magnitude = .5 * (_peakMaximum - _peakMinimum);
+
+ return compress(matHilb, _magnitude);
+ } // compress
+
+ /**
+ * Calculating the average by maximal distance between minimal and maximal absolute value.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.05.2015 17:57:19 (non-Javadoc)
+ * @see jwave.compressions.Compressor#compress(double[][][])
+ */
+ @Override
+ public double[][][] compress(double[][][] spcHilb) {
+
+ int matHilbNoOfRows = spcHilb.length;
+ int matHilbNoOfCols = spcHilb[0].length;
+ int matHilbNoOfLvls = spcHilb[0][0].length;
+
+ for (int i = 0; i < matHilbNoOfRows; i++) {
+ for (int j = 0; j < matHilbNoOfCols; j++) {
+ for (int k = 0; k < matHilbNoOfLvls; k++) {
+
+ double absVal = Math.abs(spcHilb[i][j][k]);
+
+ if (absVal <= _peakMinimum) _peakMinimum = absVal;
+
+ if (absVal >= _peakMaximum) _peakMaximum = absVal;
+ } // k
+ } // j
+ } // i - loop over all entries
+
+ _magnitude = .5 * (_peakMaximum - _peakMinimum);
+
+ return compress(spcHilb, _magnitude);
+ } // compress
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/Super.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/Super.java
new file mode 100644
index 00000000000..1e83589c194
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/Super.java
@@ -0,0 +1,92 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.datatypes;
+
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailureNotAllocated;
+
+/**
+ * Instead using Java's Object class as super type, a named Super typed is used for grouping data
+ * containers like Line, Block, or Space objects together!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 19:27:00
+ */
+public abstract class Super {
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 19:27:01
+ */
+ public Super() {} // Super
+
+ /**
+ * Checks whether memory is allocated for this Line object or not. If not a "not allocated"
+ * failure is thrown.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:36:45
+ * @throws JWaveException if no memory is allocated
+ */
+ protected void checkMemory() throws JWaveException {
+
+ if (!isAllocated())
+ throw new JWaveFailureNotAllocated(
+ "Super#checkMemory - no memory allocated for this object!");
+ } // checkMemory( )
+
+ /**
+ * Returns a copy of the object - if allocated, with all data!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:56:50
+ * @return copy of itself, if allocated with all data stored
+ */
+ public abstract Super copy();
+
+ /**
+ * If memory is allocated then return true else return false.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 18:03:55
+ * @return true if memory is allocated
+ */
+ public abstract boolean isAllocated();
+
+ /**
+ * Allocates the memory of the object internally, but only if no memory is allocated yet. However,
+ * there can be different strategies in data storage for each object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 17:59:24
+ * @throws JWaveException if memory is already occupied or if memory cannot be allocated
+ */
+ public abstract void alloc() throws JWaveException;
+
+ /**
+ * Simply drops the internal storage and places a null pointer in Java.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 18:01:56
+ * @throws JWaveException if internal memory is already erased
+ */
+ public abstract void erase() throws JWaveException;
+} // Super
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/SuperLine.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/SuperLine.java
new file mode 100644
index 00000000000..c5201a56cb3
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/SuperLine.java
@@ -0,0 +1,184 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.datatypes;
+
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.lines.Line;
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.lines.LineFull;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailureNotValid;
+import org.apache.iotdb.db.query.simpiece.jwave.tools.MathToolKit;
+
+import java.util.ArrayList;
+
+/**
+ * SuperLine consists of several Line objects of different sizes.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 19:30:28
+ */
+public class SuperLine {
+
+ /** maximal size of a line object, */
+ private int _maxLineSize;
+
+ /** no of entries in the Line object. */
+ private int _noOfRows;
+
+ /**
+ * However, who knows how many blocks are delivered!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:02:59
+ */
+ ArrayList<Super> _listOfLines;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 19:30:28
+ */
+ public SuperLine() {
+
+ _noOfRows = 0;
+ _maxLineSize = 1;
+ _listOfLines = new ArrayList<Super>();
+ } // SuperLine
+
+ /**
+ * Set a SuperLine object by the noOfRows or noOfEntries.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 12.01.2016 23:35:12
+ * @param noOfRows the number of entries
+ */
+ public SuperLine(int noOfRows) {
+
+ _noOfRows = noOfRows;
+ _maxLineSize = 1;
+ _listOfLines = new ArrayList<Super>();
+ } // SuperLine
+
+ /**
+ * Set the SuperLine object by the noOfRows and the maximal block size.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 12.01.2016 23:36:23
+ * @param noOfRows the number of entries
+ * @param maxBlockSize the maximal block size, should be << number of entries
+ */
+ public SuperLine(int noOfRows, int maxBlockSize) {
+
+ _noOfRows = noOfRows;
+ _maxLineSize = maxBlockSize;
+ _listOfLines = new ArrayList<Super>();
+ } // SuperLine
+
+ /**
+ * Set up a configured an empty SuperLine object by allocating empty Block objects.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @throws JWaveException is throwsn while parameters are calcualted wrong
+ * @date 12.01.2016 23:38:50
+ */
+ public void init() throws JWaveException {
+
+ int noOfLineObjects = (int) (_noOfRows / _maxLineSize); // 29 / 8 = 3
+
+ int leftEntries = _noOfRows % _maxLineSize; // 29 % 8 = 5
+
+ if (leftEntries + _maxLineSize * noOfLineObjects != _noOfRows)
+ throw new JWaveFailureNotValid("calculated splitting to Block objects is not valid");
+
+ for (int i = 0; i < noOfLineObjects; i++) add(new LineFull(i * _maxLineSize, _maxLineSize));
+
+ int[] arrBinaries = MathToolKit.decompose(leftEntries);
+ for (int i = 0; i < arrBinaries.length; i++)
+ arrBinaries[i] = (int) MathToolKit.scalb(1., arrBinaries[i]);
+
+ for (int a = 0; a < arrBinaries.length; a++)
+ System.out.println("arrbBinaries[ " + a + " ] = " + arrBinaries[a]);
+
+ int offset = noOfLineObjects * _maxLineSize;
+ for (int i = 0; i < arrBinaries.length; i++) {
+ if (i == 0) add(new LineFull(offset, arrBinaries[i]));
+ else {
+ offset += arrBinaries[i - 1];
+ add(new LineFull(offset, arrBinaries[i]));
+ }
+ }
+ } // init
+
+ /**
+ * Returns the number of stored Line objects.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 19:36:13
+ * @return number of Line objects
+ */
+ public int getNoOfLines() {
+
+ return _listOfLines.size();
+ } // getNoOfLines
+
+ /**
+ * Add a Line object to list
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 19:36:54
+ * @param line object of type Line
+ */
+ public void add(Line line) {
+
+ _listOfLines.add(line);
+ } // add
+
+ /**
+ * Return Line object at position p; 0 .. N-1
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:16:27
+ * @param p
+ * @return
+ * @throws JWaveException
+ */
+ public Line get(int p) throws JWaveException {
+
+ Line line = null;
+
+ if (p < 0 || p >= getNoOfLines())
+ throw new JWaveFailureNotValid("SuperLine#get - position p is out of bound!");
+
+ line = (Line) _listOfLines.get(p);
+
+ return line;
+ } // get
+
+ /**
+ * Return the set number of rows
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 12.01.2016 23:34:12
+ * @return
+ */
+ public int getNoOfRows() {
+
+ return _noOfRows;
+ } // getNoOfRows
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/blocks/Block.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/blocks/Block.java
new file mode 100644
index 00000000000..aad9b700437
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/blocks/Block.java
@@ -0,0 +1,228 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.datatypes.blocks;
+
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.Super;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+
+/**
+ * A block of Data; 2-D organized by (0,0) .. (noOfRows,noOfCols). This object is strictly using the
+ * Line objects, due to having here the possibility to implement different strategies on values
+ * storage.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 14:39:22
+ */
+public abstract class Block extends Super {
+
+ /**
+ * The number of rows of this Block.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 14:41:23
+ */
+ protected int _noOfRows;
+
+ /**
+ * The number of columns of this Block.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 14:41:42
+ */
+ protected int _noOfCols;
+
+ /**
+ * The row position where the block starts from as a sub set in the context of SuperBlock; check
+ * _offSetRow in class Line for more details.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 23.05.2015 19:50:40
+ */
+ protected int _offSetRow;
+
+ /**
+ * The column position where the block starts from as a sub set in the context of SuperBlock;
+ * check _offSetRow in class Line for more details.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 23.05.2015 19:52:19
+ */
+ protected int _offSetCol;
+
+ /**
+ * Create an object of a sub type; e.g. as pattern.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 23.05.2015 19:53:18
+ */
+ public Block() {
+ _offSetRow = 0;
+ _offSetCol = 0;
+ _noOfRows = 0;
+ _noOfCols = 0;
+ } // Block
+
+ /**
+ * Copy constructor - attention in base class there are only boundaries passed to the new object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 23.05.2015 19:54:16
+ * @param block
+ */
+ public Block(Block block) {
+ _offSetRow = block._offSetRow;
+ _offSetCol = block._offSetCol;
+ _noOfRows = block._offSetRow;
+ _noOfCols = block._noOfCols;
+ } // Block
+
+ /**
+ * Taking the block object as a single global object by setting both off sets to zero.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:21:17
+ * @param noOfRows stores the noOfRows exclusively, even if each Line object stores that value
+ * again.
+ * @param noOfCols the no of columns or the number of Line objects.
+ */
+ public Block(int noOfRows, int noOfCols) {
+ _offSetRow = 0;
+ _offSetCol = 0;
+ _noOfRows = noOfRows;
+ _noOfCols = noOfCols;
+ } // Block
+
+ /**
+ * Passing information that takes the block as a part of a global structure; e.g. a SuperBlock.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 14:03:45
+ * @param offSetRow the global off set of rows of the block
+ * @param offSetCol the global off set of columns of the block
+ * @param noOfRows the number of rows of the block
+ * @param noOfCols the number of columns of the block
+ */
+ public Block(int offSetRow, int offSetCol, int noOfRows, int noOfCols) {
+ _offSetRow = offSetRow;
+ _offSetCol = offSetCol;
+ _noOfRows = noOfRows;
+ _noOfCols = noOfCols;
+ } // Block
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 14:43:41
+ * @return the _noOfRows
+ */
+ public int getNoOfRows() {
+ return _noOfRows;
+ } // getNoOfRows
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 14:43:41
+ * @return the _noOfCols
+ */
+ public int getNoOfCols() {
+ return _noOfCols;
+ } // getNoOfCols
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:31:31
+ * @return the off set of the row
+ */
+ public int getOffSetRow() {
+ return _offSetRow;
+ } // getOffSetRow
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:31:54
+ * @return the off set of the column
+ */
+ public int getOffSetCol() {
+ return _offSetCol;
+ } // getOffSetCol
+
+ /**
+ * Check the given input of j is in bound of the number of columns, otherwise throw a failure
+ * (exception) if j is not valid.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:37:57
+ * @param j from 0 to noOfCols-1
+ * @throws JWaveException
+ */
+ protected void check(int j) throws JWaveException {
+
+ if (j < 0) throw new JWaveFailure("Block - i is smaller than zero");
+
+ if (j == _noOfCols) throw new JWaveFailure("Block - i is equal to noOfCols: " + _noOfCols);
+
+ if (j > _noOfCols) throw new JWaveFailure("Block - i is greater than noOfCols: " + _noOfCols);
+ } // check
+
+ /**
+ * Check the given input of (i,j) and throws a failure (exception) if position is not valid.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:33:14
+ * @param i from 0 to noOfRows-1
+ * @param j from 0 to noOfCols-1
+ * @throws JWaveException if (i,j) is out of bounds
+ */
+ protected void check(int i, int j) throws JWaveException {
+
+ if (i < 0) throw new JWaveFailure("Block - i is smaller than zero");
+
+ if (i == _noOfRows) throw new JWaveFailure("Block - i is equal to noOfRows: " + _noOfRows);
+
+ if (i > _noOfRows) throw new JWaveFailure("Block - i is greater than noOfRows: " + _noOfRows);
+
+ check(j); // for checking j, while i is in every Line object stored.
+ } // check
+
+ /**
+ * Getter for a stored value of type double.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:23:22
+ * @param i position in rows of the block
+ * @param j position in columns of the block
+ * @return the stored value
+ * @throws JWaveException if i and / or j are out of bounds
+ */
+ public abstract double get(int i, int j) throws JWaveException;
+
+ /**
+ * Setter for a stored value of type double!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:42:53
+ * @param i position in rows of the block
+ * @param j position in columns of the block
+ * @param value any value in range of a double type is possible
+ * @throws JWaveException if i and / or j are out of bounds
+ */
+ public abstract void set(int i, int j, double value) throws JWaveException;
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/blocks/BlockFull.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/blocks/BlockFull.java
new file mode 100644
index 00000000000..66e101c1271
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/blocks/BlockFull.java
@@ -0,0 +1,187 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.datatypes.blocks;
+
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.lines.Line;
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.lines.LineFull;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+
+/**
+ * A block that uses a full array for storage of Line objects.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 14:45:52
+ */
+public class BlockFull extends Block {
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:26:11
+ */
+ protected Line[] _arrLines = null;
+
+ /**
+ * Create an object of a sub type; e.g. as pattern.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 13:57:28
+ */
+ public BlockFull() {
+ super();
+ } // BlockFull
+
+ /**
+ * Copy constructor that takes over - if available - the values of another type of block.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 14:01:22
+ * @param block object of type block; e.g. BlockHash
+ */
+ public BlockFull(Block block) {
+
+ super(block); // takes the off sets and the dimension
+
+ try {
+ alloc();
+ for (int i = 0; i < _noOfRows; i++)
+ for (int j = 0; j < _noOfCols; j++) set(i, j, block.get(i, j));
+ } catch (JWaveException e) {
+ e.printStackTrace();
+ } // try
+
+ // TODO optimize this constructor by instanceof
+
+ } // BlockFull
+
+ /**
+ * Constructor setting members for and allocating memory!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 14:45:52
+ * @param noOfRows
+ * @param noOfCols
+ */
+ public BlockFull(int noOfRows, int noOfCols) {
+ super(noOfRows, noOfCols); // store does exclusively
+ } // BlockFull
+
+ /**
+ * Passing information that takes the block as a part of a global structure; e.g. a SuperBlock.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 14:05:55
+ * @param offSetRow the global off set of rows of the block
+ * @param offSetCol the global off set of columns of the block
+ * @param noOfRows the number of rows of the block
+ * @param noOfCols the number of columns of the block
+ */
+ public BlockFull(int offSetRow, int offSetCol, int noOfRows, int noOfCols) {
+ super(offSetRow, offSetCol, noOfRows, noOfCols);
+ } // BlockFull
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:12:35 (non-Javadoc)
+ * @see jwave.datatypes.Super#copy()
+ */
+ @Override
+ public Block copy() {
+ return new BlockFull(this);
+ } // copy
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:01:42 (non-Javadoc)
+ * @see jwave.datatypes.Super#isAllocated()
+ */
+ @Override
+ public boolean isAllocated() {
+ boolean isAllocated = true;
+ if (_arrLines == null) isAllocated = false;
+ return isAllocated;
+ } // isAllocated
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:01:42 (non-Javadoc)
+ * @see jwave.datatypes.Super#alloc()
+ */
+ @Override
+ public void alloc() throws JWaveException {
+ if (!isAllocated()) {
+ _arrLines = new Line[_noOfCols];
+ for (int j = 0; j < _noOfCols; j++) {
+ Line line = new LineFull(_offSetRow, _noOfRows);
+ line.alloc();
+ _arrLines[j] = line;
+ } // for
+ } // if
+ } // alloc
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:01:42 (non-Javadoc)
+ * @see jwave.datatypes.Super#erase()
+ */
+ @Override
+ public void erase() throws JWaveException {
+ if (_arrLines != null) {
+ for (int j = 0; j < _noOfCols; j++)
+ if (_arrLines[j] != null) {
+ Line line = _arrLines[j];
+ line.erase();
+ _arrLines[j] = null;
+ } // for
+ _arrLines = null;
+ } // if
+ } // erase
+
+ /*
+ * Getter!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:34:59 (non-Javadoc)
+ * @see jwave.datatypes.blocks.Block#get(int, int)
+ */
+ @Override
+ public double get(int i, int j) throws JWaveException {
+ checkMemory();
+ // check( j );
+ check(i, j);
+ Line line = _arrLines[j];
+ double value = line.get(i);
+ return value; // checks i again
+ } // get
+
+ /*
+ * Setter!
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:24:39 (non-Javadoc)
+ * @see jwave.datatypes.blocks.Block#set(int, int, double)
+ */
+ @Override
+ public void set(int i, int j, double value) throws JWaveException {
+ checkMemory();
+ // check( j );
+ check(i, j);
+ Line line = _arrLines[j];
+ line.set(i, value); // checks i again
+ } // set
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/blocks/BlockHash.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/blocks/BlockHash.java
new file mode 100644
index 00000000000..0279218dcfe
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/blocks/BlockHash.java
@@ -0,0 +1,201 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.datatypes.blocks;
+
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.lines.Line;
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.lines.LineHash;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+
+import java.util.HashMap;
+
+/**
+ * Uses HashMap generic for sparse data representations.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:41:53
+ */
+public class BlockHash extends Block {
+
+ /**
+ * Storing LineHash objects in a HashMap for sparse representation.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:43:03
+ */
+ HashMap<Integer, Line> _hashMapLines = null;
+
+ /**
+ * Create an object of a sub type; e.g. as pattern.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 13:58:16
+ */
+ public BlockHash() {
+ super();
+ } // BlockHash
+
+ /**
+ * Copy constructor that takes over - if available - the values of another type of block.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 13:59:49
+ * @param block object of type block; e.g. BlockFull
+ */
+ public BlockHash(Block block) {
+
+ super(block); // takes the off sets and the dimension
+
+ try {
+ alloc();
+ for (int i = 0; i < _noOfRows; i++)
+ for (int j = 0; j < _noOfCols; j++) set(i, j, block.get(i, j));
+ } catch (JWaveException e) {
+ e.printStackTrace();
+ } // try
+
+ // TODO optimize this constructor by instanceof
+
+ } // BlockHash
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:41:53
+ * @param noOfRows
+ * @param noOfCols
+ */
+ public BlockHash(int noOfRows, int noOfCols) {
+ super(noOfRows, noOfCols);
+ } // BlockHash
+
+ /**
+ * Passing information that takes the block as a part of a global structure; e.g. a SuperBlock.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 14:03:36
+ * @param offSetRow the global off set of rows of the block
+ * @param offSetCol the global off set of columns of the block
+ * @param noOfRows the number of rows of the block
+ * @param noOfCols the number of columns of the block
+ */
+ public BlockHash(int offSetRow, int offSetCol, int noOfRows, int noOfCols) {
+ super(offSetRow, offSetCol, noOfRows, noOfCols);
+ } // BlockHash
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:13:30 (non-Javadoc)
+ * @see jwave.datatypes.Super#copy()
+ */
+ @Override
+ public Block copy() {
+ return new BlockHash(this);
+ } // copy
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:02:40 (non-Javadoc)
+ * @see jwave.datatypes.Super#isAllocated()
+ */
+ @Override
+ public boolean isAllocated() {
+ boolean isAllocated = true;
+ if (_hashMapLines == null) isAllocated = false;
+ return isAllocated;
+ } // isAllocated
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:02:40 (non-Javadoc)
+ * @see jwave.datatypes.Super#alloc()
+ */
+ @Override
+ public void alloc() throws JWaveException {
+ if (!isAllocated()) _hashMapLines = new HashMap<Integer, Line>();
+ } // alloc
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:02:40 (non-Javadoc)
+ * @see jwave.datatypes.Super#erase()
+ */
+ @Override
+ public void erase() throws JWaveException {
+ if (_hashMapLines != null) _hashMapLines.clear();
+ _hashMapLines = null;
+ } // erase
+
+ /*
+ * Getter!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:41:53 (non-Javadoc)
+ * @see jwave.datatypes.blocks.Block#get(int, int)
+ */
+ @Override
+ public double get(int i, int j) throws JWaveException {
+
+ checkMemory();
+
+ check(i, j);
+
+ Line line = null;
+ double value = 0.;
+
+ if (_hashMapLines.containsKey(j)) {
+
+ line = _hashMapLines.get(j);
+
+ value = line.get(i);
+
+ } else throw new JWaveFailure("Line - no value stored for requested i: " + i);
+
+ return value;
+ } // get
+
+ /*
+ * Setter!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:41:53 (non-Javadoc)
+ * @see jwave.datatypes.blocks.Block#set(int, int, double)
+ */
+ @Override
+ public void set(int i, int j, double value) throws JWaveException {
+
+ checkMemory();
+
+ check(i, j);
+
+ Line line = null;
+
+ if (_hashMapLines.containsKey(j)) {
+
+ line = _hashMapLines.get(j);
+ line.set(i, value);
+
+ } else {
+
+ line = new LineHash(_offSetRow, _noOfRows);
+ line.alloc();
+ line.set(i, value);
+ _hashMapLines.put(j, line);
+ } // if
+ } // set
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/lines/Line.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/lines/Line.java
new file mode 100644
index 00000000000..583345b5856
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/lines/Line.java
@@ -0,0 +1,184 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.datatypes.lines;
+
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.Super;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailureNotValid;
+
+/**
+ * A line of Data; 1-D organized by (0) .. (noOfRows).
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:00:01
+ */
+public abstract class Line extends Super {
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:02:58
+ */
+ protected int _noOfRows;
+
+ /**
+ * The position where the line start from as a sub set in the context of SuperLine. For example a
+ * SuperLine Objects defines 0 .. 10 and by three Line objects this results in - e.g. - 0 .. 3 and
+ * 4 .. 7 and 8 .. 9. the off sets of theses Line objects are: 0, 4, and 8.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 17:44:48
+ */
+ protected int _offSetRow;
+
+ /**
+ * Create an object of a sub type; e.g. as pattern.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:27:57
+ */
+ public Line() {
+ _offSetRow = 0; // the block itself is global
+ _noOfRows = 0;
+ } // Line
+
+ /**
+ * Copy constructor - attention in base class there are only boundaries passed to the new object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.05.2015 07:23:56
+ * @param line
+ */
+ public Line(Line line) {
+ _offSetRow = line._noOfRows;
+ _noOfRows = line._offSetRow;
+ } // Line
+
+ /**
+ * Create a Line object by a certain number of rows.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:03:33
+ * @param noOfRows the size or length of this Line object
+ */
+ public Line(int noOfRows) {
+ _offSetRow = 0; // the block itself is global
+ _noOfRows = noOfRows;
+ } // Line
+
+ /**
+ * Create a Line object by an off set and the number of rows. Set the off set of row starting for
+ * this line; e.g. _offSetRow + _noOfRows => next_offSetRow of next_lineObject!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 17:54:29
+ * @param offSetRow the global off set of this Line object in a SuperLine object
+ * @param noOfRows the size or length of this Line object
+ */
+ public Line(int offSetRow, int noOfRows) {
+ _offSetRow = offSetRow;
+ _noOfRows = noOfRows;
+ } // Line
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:06:52
+ * @return the _noOfRows
+ */
+ public int getNoOfRows() {
+ return _noOfRows;
+ } // getNoOfRows
+
+ public void setNoOfRows(int noOfRows) throws JWaveException {
+
+ if (isAllocated())
+ throw new JWaveFailureNotValid(
+ "Line - "
+ + "setting new number of rows is not valid "
+ + "while memory is already allocated");
+
+ _noOfRows = noOfRows;
+ } // setNoOfRows
+
+ /**
+ * Getter for the global off set of this Line object in a SuperLine object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 17:52:00
+ * @return the global off set of this Line object in a SuperLine object
+ */
+ public int getOffSetRow() {
+ return _offSetRow;
+ } // getOffSetRow
+
+ /**
+ * Set the off set of row starting for this line; e.g. _offSetRow + _noOfRows => next_offSetRow of
+ * next_lineObject!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 17:51:02
+ * @param offSetRows the global off set of this Line object in a SuperLine object
+ */
+ protected void setOffSetRow(int offSetRow) { // set to protected due to miss usage
+ _offSetRow = offSetRow;
+ } // setOffSetRow
+
+ /**
+ * Check the given input of i as position in number of rows, otherwise throw a failure (exception)
+ * if i as position is not valid.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:13:18
+ * @param i from 0 to noOfRows-1
+ * @throws JWaveException if i is out of bounds
+ */
+ protected void checkIndex(int i) throws JWaveException {
+
+ if (i < 0) throw new JWaveFailureNotValid("Line - i is smaller than zero");
+
+ if (i == _noOfRows)
+ throw new JWaveFailureNotValid("Line - i is equal to noOfRows: " + _noOfRows);
+
+ if (i > _noOfRows)
+ throw new JWaveFailureNotValid("Line - i is greater than noOfRows: " + _noOfRows);
+ } // checkIndex
+
+ /**
+ * Getter for the stored values.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:10:04
+ * @param pos from 0 to noOfRows-1 as range of input
+ * @return the stored double value
+ * @throws JWaveException if i is out of bounds
+ */
+ public abstract double get(int i) throws JWaveException;
+
+ /**
+ * Setter to store values.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:16:42
+ * @param i from 0 to noOfRows-1 as range of input
+ * @param val the value to be stored in Line object.
+ * @throws JWaveException if i out of bounds
+ */
+ public abstract void set(int i, double val) throws JWaveException;
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/lines/LineFull.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/lines/LineFull.java
new file mode 100644
index 00000000000..46a2993ace7
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/lines/LineFull.java
@@ -0,0 +1,178 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.datatypes.lines;
+
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+
+/**
+ * A line of Data; 1-D organized by (0) .. (noOfRows), using a double array for storage of data.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:05:28
+ */
+public class LineFull extends Line {
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:24:50
+ */
+ protected double[] _arr;
+
+ /**
+ * Pass nothing, use this a a place holder.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:40:08
+ */
+ public LineFull() {
+ super();
+ } // LineFull
+
+ /**
+ * Copy constructor that takes over - if available - the values of another type of Line object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.05.2015 07:26:25
+ * @param line an object of type Line
+ */
+ public LineFull(Line line) {
+
+ super(line); // takes the number of rows and the off set value
+
+ try {
+
+ alloc();
+
+ for (int i = 0; i < line._noOfRows; i++) set(i, line.get(i));
+
+ } catch (JWaveException e) {
+ e.printStackTrace();
+ } // try
+
+ // TODO improve constructor memory passing by (instance of); e.g. LineHash
+
+ } // LineFull
+
+ /**
+ * Pass the number of rows - global line?!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:05:28
+ * @param noOfRows
+ */
+ public LineFull(int noOfRows) {
+ super(noOfRows);
+ } // LineFull
+
+ /**
+ * Pass an of set to the line and a number of rows.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:38:38
+ * @param offSetRow
+ * @param noOfRows
+ */
+ public LineFull(int offSetRow, int noOfRows) {
+ super(offSetRow, noOfRows);
+ } // LineFull
+
+ /*
+ * Get a full copy of this Line object!
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 21:01:23 (non-Javadoc)
+ * @see jwave.datatypes.lines.Line#copy()
+ */
+ @Override
+ public Line copy() {
+
+ Line line = new LineFull(_offSetRow, _noOfRows);
+
+ try {
+ if (isAllocated()) {
+ line.alloc();
+ for (int i = 0; i < line.getNoOfRows(); i++) line.set(i, get(i));
+ } // isAllocated
+ } catch (JWaveException e) {
+ e.printStackTrace();
+ } // try - never ever
+
+ return line;
+ } // copy
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 18:07:07 (non-Javadoc)
+ * @see jwave.datatypes.lines.Line#isAllocated()
+ */
+ @Override
+ public boolean isAllocated() {
+ boolean isAllocated = true;
+ if (_arr == null) isAllocated = false;
+ return isAllocated;
+ } // isAllocated
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 18:07:14 (non-Javadoc)
+ * @see jwave.datatypes.lines.Line#alloc()
+ */
+ @Override
+ public void alloc() throws JWaveException {
+ if (!isAllocated()) _arr = new double[_noOfRows];
+ } // alloc
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 18:07:21 (non-Javadoc)
+ * @see jwave.datatypes.lines.Line#erase()
+ */
+ @Override
+ public void erase() throws JWaveException {
+ _arr = null;
+ } // erase
+
+ /*
+ * Getter!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:18:14 (non-Javadoc)
+ * @see jwave.datatypes.lines.Line#get(int)
+ */
+ @Override
+ public double get(int i) throws JWaveException {
+ checkMemory();
+ checkIndex(i);
+ double value = _arr[i];
+ return value;
+ } // get
+
+ /*
+ * Setter!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:18:26 (non-Javadoc)
+ * @see jwave.datatypes.lines.Line#set(int, double)
+ */
+ @Override
+ public void set(int i, double value) throws JWaveException {
+ checkMemory();
+ checkIndex(i);
+ _arr[i] = value;
+ } // set
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/lines/LineHash.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/lines/LineHash.java
new file mode 100644
index 00000000000..9062d1237d5
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/lines/LineHash.java
@@ -0,0 +1,215 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.datatypes.lines;
+
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailureNotFound;
+
+import java.util.HashMap;
+
+/**
+ * Uses HashMap generic for sparse data representations.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:30:00
+ */
+public class LineHash extends Line {
+
+ /**
+ * Simple hash mapping for sparse data.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:31:41
+ */
+ HashMap<Integer, Double> _hashMap;
+
+ /**
+ * Pass nothing, use this a a place holder.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:41:15
+ */
+ public LineHash() {
+ super();
+ } // LineHash
+
+ /**
+ * Copy constructor that takes over - if available - the values of another type of Line object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 20.05.2015 07:28:18
+ * @param line an object of type Line
+ */
+ public LineHash(Line line) {
+
+ super(line); // takes the number of rows and the off set value
+
+ try {
+
+ alloc();
+
+ for (int i = 0; i < line._noOfRows; i++) {
+ set(i, line.get(i));
+ }
+
+ } catch (JWaveException e) {
+ e.printStackTrace();
+ } // try
+
+ // TODO improve constructor memory passing by (instance of)
+
+ } // LineHash
+
+ /**
+ * Pass the number of rows - global line?!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:30:00
+ * @param noOfRows
+ */
+ public LineHash(int noOfRows) {
+ super(noOfRows);
+ } // LineHash
+
+ /**
+ * Pass an of set to the line and a number of rows.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:40:38
+ * @param offSetRow
+ * @param noOfRows
+ */
+ public LineHash(int offSetRow, int noOfRows) {
+ super(offSetRow, noOfRows);
+ } // LineHash
+
+ /*
+ * Get a full copy of this Line object!
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 21:02:37 (non-Javadoc)
+ * @see jwave.datatypes.lines.Line#copy()
+ */
+ @Override
+ public Line copy() {
+
+ int offSetRow = getOffSetRow();
+ int noOfRows = getNoOfRows();
+
+ Line line = new LineHash(offSetRow, noOfRows);
+
+ try {
+ if (isAllocated()) {
+ line.alloc();
+ for (int i = 0; i < noOfRows; i++) {
+ try {
+ line.set(i, get(i));
+ } catch (JWaveFailureNotFound notFound) {
+ // do nothing, no value stored
+ } catch (JWaveException e) {
+ e.printStackTrace();
+ } // try - never ever
+ } // i
+ } // isAllocated
+ } catch (JWaveException e) {
+ e.printStackTrace();
+ } // try - never ever
+
+ return line;
+ } // copy
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 18:11:28 (non-Javadoc)
+ * @see jwave.datatypes.lines.Line#isAllocated()
+ */
+ @Override
+ public boolean isAllocated() {
+ boolean isAllocated = true;
+ if (_hashMap == null) {
+ isAllocated = false;
+ }
+ return isAllocated;
+ } // isAllocated
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 18:12:03 (non-Javadoc)
+ * @see jwave.datatypes.lines.Line#alloc()
+ */
+ @Override
+ public void alloc() throws JWaveException {
+
+ if (!isAllocated()) {
+ _hashMap = new HashMap<Integer, Double>();
+ }
+ } // alloc
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 18:12:13 (non-Javadoc)
+ * @see jwave.datatypes.lines.Line#erase()
+ */
+ @Override
+ public void erase() throws JWaveException {
+
+ _hashMap = null;
+ } // erase
+
+ /*
+ * Getter!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:30:00 (non-Javadoc)
+ * @see jwave.datatypes.lines.Line#get(int)
+ */
+ @Override
+ public double get(int i) throws JWaveException {
+
+ checkMemory();
+
+ checkIndex(i);
+
+ double value = 0.;
+
+ if (_hashMap.containsKey(i)) {
+ value = _hashMap.get(i);
+ } else {
+ throw new JWaveFailureNotFound("Line - no value stored for requested i: " + i);
+ }
+
+ return value;
+ } // get
+
+ /*
+ * Setter!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:30:00 (non-Javadoc)
+ * @see jwave.datatypes.lines.Line#set(int, double)
+ */
+ @Override
+ public void set(int i, double value) throws JWaveException {
+
+ checkMemory();
+
+ checkIndex(i);
+
+ _hashMap.put(i, value);
+ } // set
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/natives/Complex.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/natives/Complex.java
new file mode 100644
index 00000000000..f526876f424
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/natives/Complex.java
@@ -0,0 +1,384 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.datatypes.natives;
+
+/**
+ * A class to represent a complex number. A Complex object is immutable once created; the add,
+ * subtract and multiply routines return newly-created Complex objects containing each requested
+ * result.
+ *
+ * @date 19.11.2010 13:20:48
+ * @author Christian (graetz23@gmail.com)
+ */
+public class Complex {
+
+ /** The real number. */
+ private double _r;
+
+ /** The imaginary number. */
+ private double _j;
+
+ /**
+ * Standard constructor.
+ *
+ * @date 19.11.2010 13:38:56
+ * @author Christian (graetz23@gmail.com)
+ */
+ public Complex() {
+ _r = 0.;
+ _j = 0.;
+ } // Complex
+
+ /**
+ * Copy constructor.
+ *
+ * @date 19.11.2010 13:22:54
+ * @author Christian (graetz23@gmail.com)
+ * @param c complex number
+ */
+ public Complex(Complex c) {
+ _r = c._r;
+ _j = c._j;
+ } // Complex
+
+ /**
+ * Constructor taking real and imaginary number.
+ *
+ * @date 19.11.2010 13:21:48
+ * @author Christian (graetz23@gmail.com)
+ * @param r real number
+ * @param j imaginary number
+ */
+ public Complex(double r, double j) {
+ _r = r;
+ _j = j;
+ } // Complex
+
+ /**
+ * Display the current Complex as a String, for usage in println( ) or writing the complex into a
+ * file.
+ *
+ * @date 19.11.2010 13:23:13
+ * @author Christian (graetz23@gmail.com)
+ */
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer().append(_r);
+ if (_j >= 0) sb.append('+');
+ else sb.append('-');
+ return sb.append(_j).append('j').toString();
+ } // toString
+
+ /**
+ * Return the real number.
+ *
+ * @date 19.11.2010 13:23:34
+ * @author Christian (graetz23@gmail.com)
+ * @return real number of this complex number
+ */
+ public double getReal() {
+ return _r;
+ } // getReal( )
+
+ /**
+ * Return the imaginary number.
+ *
+ * @date 19.11.2010 13:23:51
+ * @author Christian (graetz23@gmail.com)
+ * @return imaginary number of this complex number
+ */
+ public double getImag() {
+ return _j;
+ } // getImag
+
+ /**
+ * Set the real number.
+ *
+ * @date 23.11.2010 18:44:52
+ * @author Christian (graetz23@gmail.com)
+ * @param r the real number
+ */
+ public void setReal(double r) {
+ _r = r;
+ } // setReal
+
+ /**
+ * Set the imaginary number.
+ *
+ * @date 23.11.2010 18:45:16
+ * @author Christian (graetz23@gmail.com)
+ * @param j the imaginary number
+ */
+ public void setImag(double j) {
+ _j = j;
+ } // setImag
+
+ /**
+ * Add to real number.
+ *
+ * @date 23.11.2010 18:49:57
+ * @author Christian (graetz23@gmail.com)
+ * @param r the real number
+ */
+ public void addReal(double r) {
+ _r += r;
+ } // addReal
+
+ /**
+ * Add to imaginary number.
+ *
+ * @date 23.11.2010 18:50:23
+ * @author Christian (graetz23@gmail.com)
+ * @param j the imaginary number
+ */
+ public void addImag(double j) {
+ _j += j;
+ } // addImag
+
+ /**
+ * multiply scalar to real number.
+ *
+ * @date 23.11.2010 18:53:27
+ * @author Christian (graetz23@gmail.com)
+ * @param s scalar
+ */
+ public void mulReal(double s) {
+ _r *= s;
+ } // mulReal
+
+ /**
+ * multiply scalar to imaginary number.
+ *
+ * @date 23.11.2010 18:54:48
+ * @author Christian (graetz23@gmail.com)
+ * @param s scalar
+ */
+ public void mulImag(double s) {
+ _j *= s;
+ } // mulImag
+
+ /**
+ * Calculate the magnitude of the complex number.
+ *
+ * @date 19.11.2010 13:24:28
+ * @author Christian (graetz23@gmail.com)
+ * @return magnitude of this complex number
+ */
+ public double getMag() {
+ return Math.sqrt(_r * _r + _j * _j);
+ } // getMag( )
+
+ /**
+ * Calculates the angle phi of a complex number.
+ *
+ * @date 19.11.2010 13:24:48
+ * @author Christian (graetz23@gmail.com)
+ * @return angle of this complex number
+ */
+ public double getPhi() {
+ if (_r == 0. && _j == 0) return 0.;
+ double phi = Math.toDegrees(Math.atan(Math.abs(_j / _r)));
+ if (_r >= 0. && _j >= 0.) // 1. quadrant
+ return phi;
+ if (_r <= 0. && _j >= 0.) // 2. quadrant
+ return 180. - phi;
+ if (_r <= 0. && _j <= 0.) // 3. quadrant
+ return phi + 180.;
+ if (_r >= 0. && _j <= 0.) // 4. quadrant
+ return 360. - phi;
+ return Math.toDegrees(Math.atan(Math.abs(_j / _r)));
+ } // getPhi( )
+
+ /**
+ * Returns the stored values as new double array: [ real, imag ].
+ *
+ * @date 19.11.2010 13:25:38
+ * @author Christian (graetz23@gmail.com)
+ * @return returns stored values as array [ real, imag ]
+ */
+ public double[] toArr() {
+ double[] arr = {_r, _j};
+ return arr;
+ } // toArr
+
+ /**
+ * Returns the conjugate complex number of this complex number.
+ *
+ * @date 19.11.2010 19:36:52
+ * @author Thomas Leduc
+ * @return new object of Complex keeping the result
+ */
+ public Complex conjugate() {
+ return new Complex(_r, -_j);
+ } // conjugate
+
+ /**
+ * Add another complex number to this one and return.
+ *
+ * @date 19.11.2010 13:25:55
+ * @author Christian (graetz23@gmail.com)
+ * @param c complex number
+ * @return new object of Complex keeping the result
+ */
+ public Complex add(Complex c) {
+ return new Complex(_r + c._r, _j + c._j);
+ } // add
+
+ /**
+ * Subtract another complex number from this one.
+ *
+ * @date 19.11.2010 13:27:05
+ * @author Christian (graetz23@gmail.com)
+ * @param c complex number
+ * @return new object of Complex keeping the result
+ */
+ public Complex sub(Complex c) {
+ return new Complex(_r - c._r, _j - c._j);
+ } // sub
+
+ /**
+ * Multiply this complex number times another one.
+ *
+ * @date 19.11.2010 13:27:36
+ * @author Christian (graetz23@gmail.com)
+ * @param c complex number
+ * @return new object of Complex keeping the result
+ */
+ public Complex mul(Complex c) {
+ return new Complex(_r * c._r - _j * c._j, _r * c._j + _j * c._r);
+ } // mul
+
+ /**
+ * Multiply this complex number times a scalar.
+ *
+ * @date 19.11.2010 13:28:03
+ * @author Christian (graetz23@gmail.com)
+ * @param s scalar
+ * @return new object of Complex keeping the result
+ */
+ public Complex mul(double s) {
+ return new Complex(_r * s, _j * s);
+ } // mul
+
+ /**
+ * Divide this complex number by another one.
+ *
+ * @date 19.11.2010 19:45:02
+ * @author Thomas Leduc
+ * @param c complex number
+ * @return new object of Complex keeping the result
+ */
+ public Complex div(Complex c) {
+ return mul(c.conjugate()).div(c._r * c._r + c._j * c._j);
+ } // div
+
+ /**
+ * Divide this complex number by a scalar.
+ *
+ * @date 19.11.2010 13:29:49
+ * @author Thomas Leduc
+ * @param s scalar
+ * @return new object of Complex keeping the result
+ */
+ public Complex div(double s) {
+ return mul(1. / s);
+ } // div
+
+ /**
+ * Generates a hash code for this object.
+ *
+ * @date 19.11.2010 19:42:39
+ * @author Thomas Leduc
+ * @see Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ long temp;
+ temp = Double.doubleToLongBits(_j);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ temp = Double.doubleToLongBits(_r);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ } // hashCode
+
+ /**
+ * Compare this Complex number with another one.
+ *
+ * @date 19.11.2010 13:30:35
+ * @author Thomas Leduc
+ * @see Object#equals(Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+ Complex other = (Complex) obj;
+ if (Double.doubleToLongBits(_j) != Double.doubleToLongBits(other._j)) return false;
+ if (Double.doubleToLongBits(_r) != Double.doubleToLongBits(other._r)) return false;
+ return true;
+ } // equals
+
+ /**
+ * Print this complex number to console.
+ *
+ * @date 19.11.2010 13:31:16
+ * @author Christian (graetz23@gmail.com)
+ */
+ public void show() {
+ if (_j < 0) System.out.println(getReal() + " - j" + Math.abs(getImag()));
+ else System.out.println(getReal() + " + j" + getImag());
+ } // show
+
+ /**
+ * Print this complex number to console with an identifier before.
+ *
+ * @date 19.11.2010 13:31:32
+ * @author Christian (graetz23@gmail.com)
+ * @param ident string to label this complex number
+ */
+ public void show(String ident) {
+ if (_j < 0) System.out.println(ident + ": " + getReal() + " - j" + Math.abs(getImag()));
+ else System.out.println(ident + ": " + getReal() + " + j" + getImag());
+ } // show
+
+ /**
+ * Print magnitude to console out.
+ *
+ * @date 19.11.2010 13:32:15
+ * @author Christian (graetz23@gmail.com)
+ */
+ public void showMag() {
+ System.out.println(getMag());
+ } // showMag
+
+ /**
+ * Print angle to console out.
+ *
+ * @date 19.11.2010 13:32:33
+ * @author Christian (graetz23@gmail.com)
+ */
+ public void showPhi() {
+ System.out.println(getPhi());
+ } // showPhi
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/spaces/Space.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/spaces/Space.java
new file mode 100644
index 00000000000..7b47fd4fd66
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/spaces/Space.java
@@ -0,0 +1,280 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.datatypes.spaces;
+
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.Super;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+
+/**
+ * A space of Data; 3-D organized by (0,0,0) .. (noOfRows,noOfCols,noOfBlocks).
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 14:47:21
+ */
+public abstract class Space extends Super {
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:46:06
+ */
+ protected int _noOfRows;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:46:07
+ */
+ protected int _noOfCols;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:46:08
+ */
+ protected int _noOfLvls;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:23:47
+ */
+ protected int _offSetRow;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:23:49
+ */
+ protected int _offSetCol;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:23:51
+ */
+ protected int _offSetLvl;
+
+ /**
+ * Create an object of a sub type; e.g. as pattern.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:28:20
+ */
+ public Space() {
+ _offSetRow = 0;
+ _offSetCol = 0;
+ _offSetLvl = 0;
+ _noOfRows = 0;
+ _noOfCols = 0;
+ _noOfLvls = 0;
+ } // Space
+
+ /**
+ * Copy constructor passes the off sets and the dimesion of the passed space object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:29:35
+ * @param space object of type space
+ */
+ public Space(Space space) {
+ _offSetRow = space._offSetRow;
+ _offSetCol = space._offSetCol;
+ _offSetLvl = space._offSetLvl;
+ _noOfRows = space._noOfRows;
+ _noOfCols = space._noOfCols;
+ _noOfLvls = space._noOfLvls;
+ } // Space
+
+ /**
+ * Use this space as a single space that has all its off set at zero.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 14:47:21
+ * @param noOfRows the number of rows
+ * @param noOfCols the number of columns
+ * @param noOfLvls the number of levels (height)
+ */
+ public Space(int noOfRows, int noOfCols, int noOfLvls) {
+ _offSetRow = 0;
+ _offSetCol = 0;
+ _offSetLvl = 0;
+ _noOfRows = noOfRows;
+ _noOfCols = noOfCols;
+ _noOfLvls = noOfLvls;
+ } // Space
+
+ /**
+ * Configure a space (a cube) as a part of a super space.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:25:13
+ * @param offSetRow the starting position for the row of the space
+ * @param offSetCol the starting position for the column of the space
+ * @param offSetLvl the starting position for the level (height) of the space
+ * @param noOfRows the number of rows
+ * @param noOfCols the number of columns
+ * @param noOfLvls the number of levels (height)
+ */
+ public Space(
+ int offSetRow, int offSetCol, int offSetLvl, int noOfRows, int noOfCols, int noOfLvls) {
+ _offSetRow = offSetRow;
+ _offSetCol = offSetCol;
+ _offSetLvl = offSetLvl;
+ _noOfRows = noOfRows;
+ _noOfCols = noOfCols;
+ _noOfLvls = noOfLvls;
+ } // Space
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:47:27
+ * @return the _noOfRows
+ */
+ public int getNoOfRows() {
+ return _noOfRows;
+ } // getNoOfRows
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:47:27
+ * @return the _noOfCols
+ */
+ public int getNoOfCols() {
+ return _noOfCols;
+ } // getNoOfCols
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:47:27
+ * @return the _noOfLvls
+ */
+ public int getNoOfLvls() {
+ return _noOfLvls;
+ } // getNoOfLvls
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:32:13
+ * @return the off set of the row
+ */
+ public int getOffSetRow() {
+ return _offSetRow;
+ } // getOffSetRow
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:32:23
+ * @return the off set of the column
+ */
+ public int getOffSetCol() {
+ return _offSetCol;
+ } // getOffSetCol
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:32:39
+ * @return the off set of the level (height)
+ */
+ public int getOffSetLvl() {
+ return _offSetLvl;
+ } // getOffSetLvl
+
+ /**
+ * Check the given input of i as position in number of levels, otherwise throw a failure
+ * (exception) if i as position is not valid.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:49:28
+ * @param k from 0 to noOfLvls-1
+ * @throws JWaveException if i is out of bounds
+ */
+ protected void check(int k) throws JWaveException {
+
+ if (k < 0) throw new JWaveFailure("Space - i is smaller than zero");
+
+ if (k == _noOfLvls) throw new JWaveFailure("Space - i is equal to noOfLvls: " + _noOfLvls);
+
+ if (k > _noOfLvls) throw new JWaveFailure("Space - i is greater than noOfLvls: " + _noOfLvls);
+ } // check
+
+ /**
+ * Check the given input of (j,k) and throws a failure (exception) if position is not valid.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:52:00
+ * @param j from 0 to noOfCols-1
+ * @param k from 0 to noOfLvls-1
+ * @throws JWaveException if (j,k) is out of bounds
+ */
+ protected void check(int j, int k) throws JWaveException {
+
+ if (j < 0) throw new JWaveFailure("Space - i is smaller than zero");
+
+ if (j == _noOfCols) throw new JWaveFailure("Space - i is equal to noOfCols: " + _noOfCols);
+
+ if (j > _noOfCols) throw new JWaveFailure("Space - i is greater than noOfCols: " + _noOfCols);
+
+ check(k); // for checking k, while j is in every Block object stored.
+ } // check
+
+ /**
+ * Check the given input of (i,j,k) and throws a failure (exception) if position is not valid.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:54:08
+ * @param i from 0 to noOfRows-1
+ * @param j from 0 to noOfCols-1
+ * @param k from 0 to noOfLvls-1
+ * @throws JWaveException if (i,j,k) is out of bounds
+ */
+ protected void check(int i, int j, int k) throws JWaveException {
+
+ if (i < 0) throw new JWaveFailure("Space - i is smaller than zero");
+
+ if (i == _noOfRows) throw new JWaveFailure("Space - i is equal to noOfRows: " + _noOfRows);
+
+ if (i > _noOfRows) throw new JWaveFailure("Space - i is greater than noOfRows: " + _noOfRows);
+
+ check(j, k); // for checking (j,k), while i is in every Line object stored.
+ } // check
+
+ /**
+ * Getter!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:55:57
+ * @param i from 0 to noOfRows-1
+ * @param j from 0 to noOfCols-1
+ * @param k from 0 to noOfLvls-1
+ * @return the stored double value
+ * @throws JWaveException if (i,j,k) is out of bounds
+ */
+ public abstract double get(int i, int j, int k) throws JWaveException;
+
+ /**
+ * Setter!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:56:24
+ * @param i from 0 to noOfRows-1
+ * @param j from 0 to noOfCols-1
+ * @param k from 0 to noOfLvls-1
+ * @param value any value of type double
+ * @throws JWaveException if (i,j,k) is out of bounds
+ */
+ public abstract void set(int i, int j, int k, double value) throws JWaveException;
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/spaces/SpaceFull.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/spaces/SpaceFull.java
new file mode 100644
index 00000000000..a0b93fdab8e
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/spaces/SpaceFull.java
@@ -0,0 +1,190 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.datatypes.spaces;
+
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.blocks.Block;
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.blocks.BlockFull;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+
+/**
+ * A space that uses a full array for storage of Block objects.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:57:35
+ */
+public class SpaceFull extends Space {
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:00:11
+ */
+ protected Block[] _arrBlocks = null;
+
+ /**
+ * A space object with no input; e.g. as a pattern.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:51:54
+ */
+ public SpaceFull() {
+ super();
+ } // SpaceFull
+
+ /**
+ * Copy constructor for generating the same space (cube) object again.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:53:30
+ * @param space
+ */
+ public SpaceFull(Space space) {
+ super(space);
+
+ try {
+ alloc();
+ for (int i = 0; i < _noOfRows; i++)
+ for (int j = 0; j < _noOfCols; j++)
+ for (int k = 0; k < _noOfLvls; k++) set(i, j, k, space.get(i, j, k));
+ } catch (JWaveException e) {
+ e.printStackTrace();
+ } // try
+
+ // TODO implement more efficient by using instanceof
+
+ } // Space
+
+ /**
+ * Constructor setting members for and allocating memory!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:57:35
+ * @param i from 0 to noOfRows-1
+ * @param j from 0 to noOfCols-1
+ * @param k from 0 to noOfLvls-1
+ */
+ public SpaceFull(int noOfRows, int noOfCols, int noOfLvls) {
+ super(noOfRows, noOfCols, noOfLvls);
+ } // SpaceFull
+
+ /**
+ * Configure a space (a cube) as a part of a super space.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 18:50:59
+ * @param offSetRow the starting position for the row of the space
+ * @param offSetCol the starting position for the column of the space
+ * @param offSetLvl the starting position for the level (height) of the space
+ * @param noOfRows the number of rows
+ * @param noOfCols the number of columns
+ * @param noOfLvls the number of levels (height)
+ */
+ public SpaceFull(
+ int offSetRow, int offSetCol, int offSetLvl, int noOfRows, int noOfCols, int noOfLvls) {
+ super(offSetRow, offSetCol, offSetLvl, noOfRows, noOfCols, noOfLvls);
+ } // SpaceFull
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:14:11 (non-Javadoc)
+ * @see jwave.datatypes.Super#copy()
+ */
+ @Override
+ public Space copy() {
+ return new SpaceFull(this);
+ } // copy
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:04:11 (non-Javadoc)
+ * @see jwave.datatypes.Super#isAllocated()
+ */
+ @Override
+ public boolean isAllocated() {
+ boolean isAllocated = true;
+ if (_arrBlocks == null) isAllocated = false;
+ return isAllocated;
+ } // isAllocated
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:04:11 (non-Javadoc)
+ * @see jwave.datatypes.Super#alloc()
+ */
+ @Override
+ public void alloc() throws JWaveException {
+ if (!isAllocated()) {
+ _arrBlocks = new Block[_noOfLvls];
+ for (int k = 0; k < _noOfLvls; k++) {
+ Block block = new BlockFull(_offSetRow, _offSetCol, _noOfRows, _noOfCols);
+ block.alloc();
+ _arrBlocks[k] = block;
+ } // for
+ }
+ } // alloc
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:04:11 (non-Javadoc)
+ * @see jwave.datatypes.Super#erase()
+ */
+ @Override
+ public void erase() throws JWaveException {
+ if (_arrBlocks != null) {
+ for (int k = 0; k < _noOfLvls; k++) {
+ if (_arrBlocks[k] != null) {
+ Block block = _arrBlocks[k];
+ block.erase();
+ _arrBlocks[k] = null;
+ } // if
+ } // for
+ _arrBlocks = null;
+ } // if
+ } // erase
+
+ /*
+ * Getter!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:57:35 (non-Javadoc)
+ * @see jwave.datatypes.spaces.Space#get(int, int, int)
+ */
+ @Override
+ public double get(int i, int j, int k) throws JWaveException {
+ checkMemory();
+ check(i, j, k);
+ Block block = _arrBlocks[k];
+ double value = block.get(i, j);
+ return value;
+ } // get
+
+ /*
+ * Setter!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 15:57:35 (non-Javadoc)
+ * @see jwave.datatypes.spaces.Space#set(int, int, int, double)
+ */
+ @Override
+ public void set(int i, int j, int k, double value) throws JWaveException {
+ checkMemory();
+ check(i, j, k);
+ Block block = _arrBlocks[k];
+ block.set(i, j, value);
+ } // set
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/spaces/SpaceHash.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/spaces/SpaceHash.java
new file mode 100644
index 00000000000..d58cfdbfdf7
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/datatypes/spaces/SpaceHash.java
@@ -0,0 +1,205 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.datatypes.spaces;
+
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.blocks.Block;
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.blocks.BlockHash;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+
+import java.util.HashMap;
+
+/**
+ * Uses HashMap generic for sparse data representations.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:52:40
+ */
+public class SpaceHash extends Space {
+
+ /**
+ * Storing BlockHash objects in a HashMap for sparse representation.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:55:22
+ */
+ HashMap<Integer, Block> _hashMapBlocks = null;
+
+ /**
+ * A space object with no input; e.g. as a pattern.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 19:05:01
+ */
+ public SpaceHash() {
+ super();
+ } // SpaceHash
+
+ /**
+ * Copy constructor for generating the same space (cube) object again.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 19:06:25
+ * @param space
+ */
+ public SpaceHash(Space space) {
+ super(space);
+
+ try {
+ alloc();
+ for (int i = 0; i < _noOfRows; i++)
+ for (int j = 0; j < _noOfCols; j++)
+ for (int k = 0; k < _noOfLvls; k++) set(i, j, k, space.get(i, j, k));
+ } catch (JWaveException e) {
+ e.printStackTrace();
+ } // try
+
+ // TODO implement more efficient by using instanceof
+
+ } // SpaceHash
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:52:40
+ * @param noOfRows 0 ..
+ * @param noOfCols 0 ..
+ * @param noOfLvls 0 ..
+ */
+ public SpaceHash(int noOfRows, int noOfCols, int noOfLvls) {
+ super(noOfRows, noOfCols, noOfLvls);
+ } // SpaceHash
+
+ /**
+ * Configure a space (a cube) as a part of a super space.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 19:07:05
+ * @param offSetRow the starting position for the row of the space
+ * @param offSetCol the starting position for the column of the space
+ * @param offSetLvl the starting position for the level (height) of the space
+ * @param noOfRows the number of rows
+ * @param noOfCols the number of columns
+ * @param noOfLvls the number of levels (height)
+ */
+ public SpaceHash(
+ int offSetRow, int offSetCol, int offSetLvl, int noOfRows, int noOfCols, int noOfLvls) {
+ super(offSetRow, offSetCol, offSetLvl, noOfRows, noOfCols, noOfLvls);
+ } // SpaceHash
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:14:34 (non-Javadoc)
+ * @see jwave.datatypes.Super#copy()
+ */
+ @Override
+ public Space copy() {
+ return new SpaceHash(this);
+ } // copy
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:03:28 (non-Javadoc)
+ * @see jwave.datatypes.Super#isAllocated()
+ */
+ @Override
+ public boolean isAllocated() {
+ boolean isAllocated = true;
+ if (_hashMapBlocks == null) isAllocated = false;
+ return isAllocated;
+ } // isAllocated
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:03:28 (non-Javadoc)
+ * @see jwave.datatypes.Super#alloc()
+ */
+ @Override
+ public void alloc() throws JWaveException {
+ if (!isAllocated()) _hashMapBlocks = new HashMap<Integer, Block>();
+ } // alloc
+
+ /*
+ * @author Christian (graetz23@gmail.com)
+ * @date 24.05.2015 15:03:28 (non-Javadoc)
+ * @see jwave.datatypes.Super#erase()
+ */
+ @Override
+ public void erase() throws JWaveException {
+ if (_hashMapBlocks != null) _hashMapBlocks.clear();
+ _hashMapBlocks = null;
+ } // erase
+
+ /*
+ * Getter!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:52:40 (non-Javadoc)
+ * @see jwave.datatypes.spaces.Space#get(int, int, int)
+ */
+ @Override
+ public double get(int i, int j, int k) throws JWaveException {
+
+ checkMemory();
+
+ check(i, j, k);
+
+ Block block = null;
+ double value = 0.;
+
+ if (_hashMapBlocks.containsKey(k)) {
+
+ block = _hashMapBlocks.get(k);
+
+ value = block.get(i, j);
+
+ } else throw new JWaveFailure("Line - no value stored for requested i: " + i);
+
+ return value;
+ } // get
+
+ /*
+ * Setter!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 16:52:40 (non-Javadoc)
+ * @see jwave.datatypes.spaces.Space#set(int, int, int, double)
+ */
+ @Override
+ public void set(int i, int j, int k, double value) throws JWaveException {
+
+ checkMemory();
+
+ check(i, j, k);
+
+ Block block = null;
+
+ if (_hashMapBlocks.containsKey(k)) {
+
+ block = _hashMapBlocks.get(k);
+ block.set(i, j, value);
+
+ } else {
+
+ block = new BlockHash(_offSetRow, _offSetCol, _noOfRows, _noOfCols);
+ block.alloc();
+ block.set(i, j, value);
+ _hashMapBlocks.put(k, block);
+ } // if
+ } // set
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveError.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveError.java
new file mode 100644
index 00000000000..56711b54397
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveError.java
@@ -0,0 +1,55 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.exceptions;
+
+/**
+ * Marking errors for this package; failures that are not recoverable
+ *
+ * @date 19.05.2009 09:28:17
+ * @author Christian (graetz23@gmail.com)
+ */
+public class JWaveError extends JWaveException {
+
+ /**
+ * Generated serial ID for this error
+ *
+ * @date 19.05.2009 09:29:04
+ * @author Christian (graetz23@gmail.com)
+ */
+ private static final long serialVersionUID = -2757378141408012245L;
+
+ /**
+ * constructor taking an error message
+ *
+ * @date 19.05.2009 09:28:17
+ * @author Christian (graetz23@gmail.com)
+ * @param message stored message for this error
+ */
+ public JWaveError(String message) {
+ super(message);
+ _message = "JWave"; // overwrite
+ _message += ": "; // separator
+ _message += "Error"; // Exception type
+ _message += ": "; // separator
+ _message += message; // add message
+ _message += "\n"; // break line
+ } // TransformError
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveException.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveException.java
new file mode 100644
index 00000000000..2fe9326579d
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveException.java
@@ -0,0 +1,114 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.exceptions;
+
+/**
+ * General exception class of the JWave package.
+ *
+ * @date 16.10.2008 07:30:20
+ * @author Christian (graetz23@gmail.com)
+ */
+public class JWaveException extends Throwable {
+
+ /**
+ * @date 27.05.2009 06:58:27
+ * @author Christian (graetz23@gmail.com)
+ */
+ private static final long serialVersionUID = -4165486739091019056L;
+
+ /** Member string for the stored exception message. */
+ protected String _message; // exception message
+
+ /**
+ * Constructor for storing a handed exception message.
+ *
+ * @date 27.05.2009 06:51:57
+ * @author Christian (graetz23@gmail.com)
+ * @param message this message should tell exactly what went wrong
+ */
+ public JWaveException(String message) {
+ _message = "JWave "; // overwrite
+ _message += "- "; // separator
+ _message += "Exception"; // Exception type
+ _message += "- "; // separator
+ _message += message; // add message
+ _message += "\n"; // break line
+ } // TransformException
+
+ /**
+ * Copy constructor; use this for a quick fix of sub types.
+ *
+ * @date 29.07.2009 07:03:45
+ * @author Christian (graetz23@gmail.com)
+ * @param e an object of this class
+ */
+ public JWaveException(Exception e) {
+ _message = e.getMessage();
+ } // TransformException
+
+ /**
+ * Returns the stored exception message as a string.
+ *
+ * @date 27.05.2009 06:52:46
+ * @author Christian (graetz23@gmail.com)
+ * @return exception message that should tell exactly what went wrong
+ */
+ @Override
+ public String getMessage() {
+ return _message;
+ } // getMessage
+
+ /**
+ * Displays the stored exception message at console out.
+ *
+ * @date 27.05.2009 06:53:23
+ * @author Christian (graetz23@gmail.com)
+ */
+ public void showMessage() {
+ System.out.println(_message);
+ } // showMessage
+
+ /**
+ * Nuke the run and print stack trace.
+ *
+ * @date 02.07.2009 05:07:42
+ * @author Christian (graetz23@gmail.com)
+ */
+ public void nuke() {
+ System.out.println("");
+ System.out.println(" ____ ");
+ System.out.println(" __,-~~/~ `---. ");
+ System.out.println(" _/_,---( , ) ");
+ System.out.println(" __ / NUKED ) \\ __ ");
+ System.out.println(" ====------------------===;;;== ");
+ System.out.println(" / ~\"~\"~\"~\"~\"~~\"~) ");
+ System.out.println(" (_ ( ( > \\) ");
+ System.out.println(" \\_( _ < >_>\' ");
+ System.out.println(" ~ `-i' ::>|--\" ");
+ System.out.println(" I;|.|.| ");
+ System.out.println(" <|i::|i|> ");
+ System.out.println(" |[::|.| ");
+ System.out.println(" ||: | ");
+ System.out.println("");
+ this.showMessage();
+ this.printStackTrace();
+ } // nuke
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailure.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailure.java
new file mode 100644
index 00000000000..ba6e545621e
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailure.java
@@ -0,0 +1,55 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.exceptions;
+
+/**
+ * Marking failures for this package; failures that are recoverable
+ *
+ * @date 19.05.2009 09:26:22
+ * @author Christian (graetz23@gmail.com)
+ */
+public class JWaveFailure extends JWaveException {
+
+ /**
+ * Generated serial ID for this failure
+ *
+ * @date 19.05.2009 09:27:18
+ * @author Christian (graetz23@gmail.com)
+ */
+ private static final long serialVersionUID = 5471588833755939370L;
+
+ /**
+ * Constructor taking a failure message
+ *
+ * @date 19.05.2009 09:26:22
+ * @author Christian (graetz23@gmail.com)
+ * @param message the stored failure message for this exception
+ */
+ public JWaveFailure(String message) {
+ super(message);
+ _message = "JWave"; // overwrite
+ _message += ": "; // separator
+ _message += "Failure"; // Exception type
+ _message += ": "; // separator
+ _message += message; // add message
+ _message += "\n"; // break line
+ } // TransformFailure
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotAllocated.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotAllocated.java
new file mode 100644
index 00000000000..94f8363c03c
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotAllocated.java
@@ -0,0 +1,45 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.exceptions;
+
+/**
+ * This exception should be thrown if some memory is not allocated.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:11:28
+ */
+public class JWaveFailureNotAllocated extends JWaveFailure {
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:12:36
+ */
+ private static final long serialVersionUID = 2187309268927118324L;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:11:28
+ * @param message
+ */
+ public JWaveFailureNotAllocated(String message) {
+ super(message);
+ } // JWaveFailureNotAllocated
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotFound.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotFound.java
new file mode 100644
index 00000000000..c6bcca24146
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotFound.java
@@ -0,0 +1,45 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.exceptions;
+
+/**
+ * This exception should be thrown if something is searched and not found.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:09:52
+ */
+public class JWaveFailureNotFound extends JWaveFailure {
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:10:47
+ */
+ private static final long serialVersionUID = 7185956692241086674L;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:09:52
+ * @param message
+ */
+ public JWaveFailureNotFound(String message) {
+ super(message);
+ } // JWaveFailureNotFound
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotImplemented.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotImplemented.java
new file mode 100644
index 00000000000..fdd90234da1
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotImplemented.java
@@ -0,0 +1,45 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.exceptions;
+
+/**
+ * This exception should be thrown if some code is not implemented yet.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:15:06
+ */
+public class JWaveFailureNotImplemented extends JWaveFailure {
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:16:06
+ */
+ private static final long serialVersionUID = 5830042445149954785L;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:15:06
+ * @param message
+ */
+ public JWaveFailureNotImplemented(String message) {
+ super(message);
+ } // JWaveFailureNotImplemented
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotKnown.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotKnown.java
new file mode 100644
index 00000000000..189037f5c2b
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotKnown.java
@@ -0,0 +1,45 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.exceptions;
+
+/**
+ * This exception should be thrown if some type, especially object type, is not known.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:21:52
+ */
+public class JWaveFailureNotKnown extends JWaveFailure {
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:22:50
+ */
+ private static final long serialVersionUID = 2216625923966203000L;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:21:52
+ * @param message
+ */
+ public JWaveFailureNotKnown(String message) {
+ super(message);
+ } // JWaveFailureNotKnown
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotValid.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotValid.java
new file mode 100644
index 00000000000..d67cb6a96e2
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/exceptions/JWaveFailureNotValid.java
@@ -0,0 +1,46 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.exceptions;
+
+/**
+ * This exception should be thrown if some input or something else is not valid. For example, due to
+ * set or known boundaries.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:30:12
+ */
+public class JWaveFailureNotValid extends JWaveFailure {
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:31:23
+ */
+ private static final long serialVersionUID = -2046012862738040230L;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 18.05.2015 20:30:12
+ * @param message
+ */
+ public JWaveFailureNotValid(String message) {
+ super(message);
+ } // JWaveFailureNotValid
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/tools/MathToolKit.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/tools/MathToolKit.java
new file mode 100644
index 00000000000..7c9a6aae600
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/tools/MathToolKit.java
@@ -0,0 +1,242 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.tools;
+
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveError;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+
+/** @author Christian (graetz23@gmail.com) date Feb 11, 2013 1:42:37 PM */
+public class MathToolKit {
+
+ /**
+ * Some how useless ~8>
+ *
+ * @author Christian (graetz23@gmail.com) date Feb 11, 2013 1:42:37 PM
+ */
+ public MathToolKit() {} // MathToolKit
+
+ /**
+ * The method converts a positive integer to the ancient Egyptian multipliers which are actually
+ * the multipliers to display the number by a sum of the largest possible powers of two. E.g. 42 =
+ * 2^5 + 2^3 + 2^1 = 32 + 8 + 2. However, odd numbers always 2^0 = 1 as the last entry. Also see:
+ * http://en.wikipedia.org/wiki/Ancient_Egyptian_multiplication
+ *
+ * @author Christian (graetz23@gmail.com) date Feb 11, 2013 1:50:42 PM
+ * @param number
+ * @return
+ * @throws JWaveException
+ */
+ public static int[] decompose(int number) throws JWaveException {
+
+ if (number < 1)
+ throw new JWaveFailure("the supported number for decomposition is smaller than one");
+
+ int power = getExponent((double) number);
+
+ int[] tmpArr = new int[power + 1]; // max no of possible multipliers
+
+ int pos = 0;
+ double current = (double) number;
+ while (current >= 1.) {
+
+ power = getExponent(current);
+ tmpArr[pos] = power;
+ current = current - scalb(1., power); // 1. * 2 ^ power
+ pos++;
+ } // while
+
+ int[] ancientEgyptianMultipliers = new int[pos]; // shrink
+ for (int c = 0; c < pos; c++) ancientEgyptianMultipliers[c] = tmpArr[c];
+
+ return ancientEgyptianMultipliers;
+ } // decompose
+
+ /**
+ * splits the given length of the data array to a possible number of blocks in block size and then
+ * handles the rest as the ancient egyptian decomposition: e. g. 127 by block size 32 ends up as:
+ * 32 | 32 | 32 | 16 | 8 | 4 | 2 | 1.
+ *
+ * @param number the number that should be decompose; greater than block size
+ * @param blockSize the block size as a type of 2^p|p={1,2,4,..} that is first used blocks until a
+ * rest is left; smaller than parameter number.
+ * @return an array keeping splits by several time the given block size first and then of a rest
+ * split by the ancient egyptian decomposition.
+ * @throws JWaveException if block size is not of type 2^p|p={1,2,4,..}, if block size is smaller
+ * than number or negative input is given.
+ */
+ public static int[] decompose(int number, int blockSize) throws JWaveException {
+
+ int[] blockedAncientEgyptianMultipliers = null;
+
+ if (!isBinary(blockSize))
+ throw new JWaveFailure(
+ "given block size is not 2^p|p={1,2,3,4,..}. "
+ + "block size shold be e. g.: 4, 8, 16, 32, ..");
+
+ if (number < blockSize)
+ throw new JWaveFailure(
+ "Given blockSize is greater than the given number " + "to be split by it");
+
+ int noOfBlocks = number % blockSize; // 127 % 32 = 3
+
+ int rest = number - noOfBlocks * blockSize; // 127 - 3 * 32 = 31
+
+ int[] ancientEgyptianMultipliers = decompose(rest);
+
+ int blockedAncientEgyptianMultipliersSize = ancientEgyptianMultipliers.length + noOfBlocks;
+
+ blockedAncientEgyptianMultipliers = new int[blockedAncientEgyptianMultipliersSize];
+
+ int j = 0;
+ for (int i = 0; i < blockedAncientEgyptianMultipliersSize; i++)
+ if (i < noOfBlocks) blockedAncientEgyptianMultipliers[i] = blockSize;
+ else {
+ blockedAncientEgyptianMultipliers[i] = ancientEgyptianMultipliers[j];
+ j++;
+ }
+
+ return blockedAncientEgyptianMultipliers;
+ } // decompose
+
+ /**
+ * The method converts a list of ancient Egyptian multipliers to the corresponding integer. The
+ * ancient Egyptian multipliers are actually the multipliers to display am integer by a sum of the
+ * largest possible powers of two. E.g. 42 = 2^5 + 2^3 + 2^1 = 32 + 8 + 2. Also see:
+ * http://en.wikipedia.org/wiki/Ancient_Egyptian_multiplication
+ *
+ * @author Christian (graetz23@gmail.com) date Feb 11, 2013 1:55:54 PM
+ * @param ancientEgyptianMultipliers an integer array keeping the ancient Egyptian multipliers
+ * @return resulting integer as sum of powers of two
+ * @throws JWaveException
+ */
+ public static int compose(int[] ancientEgyptianMultipliers) throws JWaveException {
+
+ if (ancientEgyptianMultipliers == null) throw new JWaveError("given array is null");
+
+ int number = 0;
+
+ int noOfAncientEgyptianMultipliers = ancientEgyptianMultipliers.length;
+ for (int m = 0; m < noOfAncientEgyptianMultipliers; m++) {
+
+ int ancientEgyptianMultiplier = ancientEgyptianMultipliers[m];
+
+ number += (int) scalb(1., ancientEgyptianMultiplier); // 1. * 2^p
+ } // compose
+
+ return number;
+ }
+
+ /**
+ * Checks if given number is of type 2^p = 1, 2, 4, 8, 18, 32, 64, .., 1024, ..
+ *
+ * @author Christian (graetz23@gmail.com) 10.02.2014 20:18:26
+ * @param number any positive integer
+ * @return true if is 2^p else false
+ */
+ public static boolean isBinary(int number) {
+ // DLM#23 Power of 2 test
+ return number > 0 && ((number & (number - 1)) == 0);
+ } // isBinary
+
+ /**
+ * Replaced Math.getExponent due to google's Android OS is not supporting it in Math library.
+ *
+ * @author Christian (graetz23@gmail.com) date Feb 11, 2013 1:47:05 PM
+ * @author sashi
+ * @date 19.04.2011 15:43:16
+ * @param f
+ * @return p of 2^p <= f < 2^(p+1)
+ */
+ public static int getExponent(double f) {
+
+ int exp = (int) (Math.log(f) / Math.log(2.));
+
+ return exp;
+ } // exp
+
+ /**
+ * Replaced Math.scalb due to google's Android OS is not supporting it in Math library.
+ *
+ * @author Christian (graetz23@gmail.com) date Feb 11, 2013 1:46:33 PM
+ * @param f
+ * @param scaleFactor
+ * @return f times 2^(scaleFactor)
+ */
+ public static double scalb(double f, int scaleFactor) {
+
+ double res = f * Math.pow(2., scaleFactor);
+
+ return res;
+ } // scalb
+
+ /**
+ * Returns a sampled array of sine waves for given number of oscillations.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 19:38:39
+ * @param samplingRate should be great than 2 and likely to be of 2^p | p E N
+ * @param noOfOscillations should be of natural numbers except zero
+ * @return sampled array keeping a number of sine waves
+ */
+ public static double[] createSineOscillation(int samplingRate, int noOfOscillations) {
+
+ if (samplingRate < 1) samplingRate = 2;
+
+ if (noOfOscillations < 1) noOfOscillations = 1;
+
+ double[] arrTime = new double[samplingRate];
+
+ for (int i = 0; i < samplingRate; i++) {
+ double arg = 2. * Math.PI * (double) i / (double) samplingRate * (double) noOfOscillations;
+ double sine = Math.sin(arg);
+ arrTime[i] = sine;
+ } // i
+
+ return arrTime;
+ } // createSineOscillation
+
+ /**
+ * Returns a sampled array of cosine waves for given number of oscillations.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 19:41:16
+ * @param samplingRate should be great than 2 and likely to be of 2^p | p E N
+ * @param noOfOscillations should be of natural numbers except zero
+ * @return sampled array keeping a number of cosine waves
+ */
+ public static double[] createCosineOscillation(int samplingRate, int noOfOscillations) {
+
+ if (samplingRate < 1) samplingRate = 2;
+
+ if (noOfOscillations < 1) noOfOscillations = 1;
+
+ double[] arrTime = new double[samplingRate];
+
+ for (int i = 0; i < samplingRate; i++) {
+ double arg = 2. * Math.PI * (double) i / (double) samplingRate * (double) noOfOscillations;
+ double sine = Math.cos(arg);
+ arrTime[i] = sine;
+ } // i
+
+ return arrTime;
+ } // createCoSineOscillation
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/AncientEgyptianDecomposition.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/AncientEgyptianDecomposition.java
new file mode 100644
index 00000000000..c97ef47ef84
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/AncientEgyptianDecomposition.java
@@ -0,0 +1,173 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms;
+
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.tools.MathToolKit;
+
+/**
+ * A wavelet transform method for arrays and signals of arbitrary lengths, even odd lengths. The
+ * array is decomposed in several parts of optimal lengths by applying the ancient Egyptian
+ * decomposition. Hereby, the array or signal is decomposed to the largest possible sub arrays of
+ * two the power of p. Afterwards each sub array is transformed forward and copied back to the
+ * discrete position of the input array. The reverse transform applies the same vice versa. In more
+ * detail the ancient Egyptian Multiplication can be easily explained by the following example: 42 =
+ * 2^5 + 2^3 + 2^1 = 32 + 8 + 2. However, an array or signal of odd length produces the smallest
+ * ancient Egyptian multiplier 2^0 which is actually 1. Therefore, the matching sub array or signal
+ * is untouched an the coefficient is actually the wavelet coefficient of wavelet space of level 0.
+ * For an "orthonormal" wavelet this holds. See:
+ * http://en.wikipedia.org/wiki/Ancient_Egyptian_multiplication
+ *
+ * @date 14.08.2010 10:43:28
+ * @author Christian (graetz23@gmail.com)
+ */
+public class AncientEgyptianDecomposition extends BasicTransform {
+
+ /**
+ * The selected Transform (FWT or WPT) used for the sub arrays of the ancient Egyptian
+ * decomposition. Actually, this displays somehow the Composite Pattern of software design
+ * pattern. See: http://en.wikipedia.org/wiki/Composite_pattern#Java
+ */
+ protected BasicTransform _basicTransform;
+
+ /**
+ * the base block size for spitting an array; e. g. 127 with block size of 32 ends up as: 32 | 32
+ * | 32 | 16 | 8 | 4 | 2 | 1.
+ */
+ @SuppressWarnings("unused")
+ private int _initialWaveletSpaceSize;
+
+ /**
+ * Constructor taking the
+ *
+ * @date 14.08.2010 10:43:28
+ * @author Christian (graetz23@gmail.com)
+ */
+ public AncientEgyptianDecomposition(BasicTransform basicTransform) {
+
+ _basicTransform = basicTransform;
+
+ _initialWaveletSpaceSize = 0;
+ } // FastBasicTransformArbitrary
+
+ public AncientEgyptianDecomposition(BasicTransform waveTransform, int initialWaveletSpaceSize) {
+
+ _basicTransform = waveTransform;
+
+ _initialWaveletSpaceSize = initialWaveletSpaceSize;
+ } // AncientEgyptianDecomposition
+
+ /**
+ * This forward method decomposes the given array of arbitrary length to sub arrays while applying
+ * the ancient Egyptian decomposition. Each sub array is transformed by the selected basic
+ * transform and the resulting wavelet coefficients are copied back to their original discrete
+ * positions.
+ *
+ * @date 14.08.2010 10:43:28
+ * @author Christian (graetz23@gmail.com)
+ * @throws JWaveException
+ * @see jwave.transforms.BasicTransform#forward(double[])
+ */
+ @Override
+ public double[] forward(double[] arrTime) throws JWaveException {
+
+ double[] arrHilb = new double[arrTime.length];
+
+ int[] ancientEgyptianMultipliers = null;
+
+ ancientEgyptianMultipliers = MathToolKit.decompose(arrTime.length);
+
+ int offSet = 0;
+ for (int m = 0; m < ancientEgyptianMultipliers.length; m++) {
+
+ int ancientEgyptianMultiplier = ancientEgyptianMultipliers[m];
+
+ int arrTimeSubLength = (int) MathToolKit.scalb(1., ancientEgyptianMultiplier);
+
+ double[] arrTimeSub = new double[arrTimeSubLength];
+
+ for (int i = 0; i < arrTimeSub.length; i++) {
+ arrTimeSub[i] = arrTime[i + offSet];
+ }
+
+ double[] arrHilbSub = _basicTransform.forward(arrTimeSub);
+
+ for (int i = 0; i < arrHilbSub.length; i++) {
+ arrHilb[i + offSet] = arrHilbSub[i];
+ }
+
+ offSet += arrHilbSub.length;
+ } // m - no of sub transforms
+
+ return arrHilb;
+ } // forward
+
+ /**
+ * This reverse method awaits an array of arbitrary length in wavelet space keeping the wavelet
+ * already decomposed by the ancient Egyptian decomposition. Therefore, each of the existing sub
+ * arrays of length 2^p is reverse transformed by the selected basic transform and the resulting
+ * coefficients of time domain are copied back to their original discrete positions.
+ *
+ * @date 14.08.2010 10:43:28
+ * @author Christian (graetz23@gmail.com)
+ * @throws JWaveException
+ * @see jwave.transforms.BasicTransform#reverse(double[])
+ */
+ @Override
+ public double[] reverse(double[] arrHilb) throws JWaveException {
+
+ double[] arrTime = new double[arrHilb.length];
+
+ int[] ancientEgyptianMultipliers = null;
+ try {
+
+ ancientEgyptianMultipliers = MathToolKit.decompose(arrHilb.length);
+
+ } catch (JWaveException e) {
+
+ e.printStackTrace();
+ }
+
+ int offSet = 0;
+ for (int m = 0; m < ancientEgyptianMultipliers.length; m++) {
+
+ int ancientEgyptianMultiplier = ancientEgyptianMultipliers[m];
+
+ int arrHilbSubLength = (int) MathToolKit.scalb(1., ancientEgyptianMultiplier);
+
+ double[] arrHilbSub = new double[arrHilbSubLength];
+
+ for (int i = 0; i < arrHilbSub.length; i++) {
+ arrHilbSub[i] = arrHilb[i + offSet];
+ }
+
+ double[] arrTimeSub = _basicTransform.reverse(arrHilbSub);
+
+ for (int i = 0; i < arrTimeSub.length; i++) {
+ arrTime[i + offSet] = arrTimeSub[i];
+ }
+
+ offSet += arrHilbSub.length;
+ } // m - no of sub transforms
+
+ return arrTime;
+ } // reverse
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/BasicTransform.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/BasicTransform.java
new file mode 100644
index 00000000000..3201f193ab3
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/BasicTransform.java
@@ -0,0 +1,596 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms;
+
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.natives.Complex;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveError;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+import org.apache.iotdb.db.query.simpiece.jwave.tools.MathToolKit;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Basic Wave for transformations like Fast Fourier Transform (FFT), Fast Wavelet Transform (FWT),
+ * Fast Wavelet Packet Transform (WPT), or Discrete Wavelet Transform (DWT). Naming of this class
+ * due to en.wikipedia.org; to write Fourier series in terms of the 'basic waves' of function:
+ * e^(2*pi*i*w).
+ *
+ * @date 08.02.2010 11:11:59
+ * @author Christian (graetz23@gmail.com)
+ */
+public abstract class BasicTransform {
+
+ /**
+ * String identifier of the current Transform object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 14:25:56
+ */
+ protected String _name;
+
+ /**
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.02.2014 18:38:21
+ */
+ public BasicTransform() {
+
+ _name = null;
+ } // BasicTransform
+
+ /**
+ * Returns String identifier of current type of BasicTransform Object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 18:13:34
+ * @return identifier as String
+ */
+ public String getName() {
+ return _name;
+ } // getName
+
+ /**
+ * Returns the stored Wavelet object or null pointer.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 18:26:44
+ * @return object of type Wavelet of null pointer
+ * @throws JWaveFailure if Wavelet object is not available
+ */
+ public Wavelet getWavelet() throws JWaveFailure {
+ throw new JWaveFailure("BasicTransform#getWavelet - not available");
+ } // getWavelet
+
+ /**
+ * Performs the forward transform from time domain to frequency or Hilbert domain for a given
+ * array depending on the used transform algorithm by inheritance.
+ *
+ * @date 10.02.2010 08:23:24
+ * @author Christian (graetz23@gmail.com)
+ * @param arrTime coefficients of 1-D time domain
+ * @return coefficients of 1-D frequency or Hilbert space
+ * @throws JWaveException
+ */
+ public abstract double[] forward(double[] arrTime) throws JWaveException;
+
+ /**
+ * Performs the reverse transform from frequency or Hilbert domain to time domain for a given
+ * array depending on the used transform algorithm by inheritance.
+ *
+ * @date 10.02.2010 08:23:24
+ * @author Christian (graetz23@gmail.com)
+ * @param arrFreq coefficients of 1-D frequency or Hilbert domain
+ * @return coefficients of time series of 1-D frequency or Hilbert space
+ * @throws JWaveException
+ */
+ public abstract double[] reverse(double[] arrFreq) throws JWaveException;
+
+ /**
+ * Performs the forward transform from time domain to Hilbert domain of a given level depending on
+ * the used transform algorithm by inheritance.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 11:33:11
+ * @param arrTime
+ * @param level the level of Hilbert space; energy & detail coefficients
+ * @return array keeping Hilbert space of requested level
+ * @throws JWaveException if given array is not of type 2^p | p E N or given level does not match
+ * the possibilities of given array.
+ */
+ public double[] forward(double[] arrTime, int level) throws JWaveException {
+
+ throw new JWaveError(
+ "BasicTransform#forward - " + "method is not implemented for this transform type!");
+ } // forward
+
+ /**
+ * Performs the reverse transform from Hilbert domain of a given level to time domain depending on
+ * the used transform algorithm by inheritance.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 11:34:27
+ * @param arrFreq
+ * @param level the level of Hilbert space; energy & detail coefficients
+ * @return array keeping Hilbert space of requested level
+ * @throws JWaveException if given array is not of type 2^p | p E N or given level does not match
+ * the possibilities of given array.
+ */
+ public double[] reverse(double[] arrFreq, int level) throws JWaveException {
+
+ throw new JWaveError(
+ "BasicTransform#reverse - " + "method is not implemented for this transform type!");
+ } // reverse
+
+ /**
+ * Generates from a 2-D decomposition a 1-D time series.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 17.08.2014 10:07:19
+ * @param matDeComp 2-D Hilbert spaces: [ 0 .. p ][ 0 .. N ] where p is the exponent of N=2^p
+ * @return a 1-D time domain signal
+ * @throws JWaveException
+ */
+ public double[][] decompose(double[] arrTime) throws JWaveException {
+
+ throw new JWaveError(
+ "BasicTransform#decompose - " + "method is not implemented for this transform type!");
+ } // decompose
+
+ /**
+ * Generates from a 1-D signal a 2-D output, where the second dimension are the levels of the
+ * wavelet transform. The first level should keep the original coefficients. All following levels
+ * should keep each step of the decomposition of the Fast Wavelet Transform. However, each level
+ * of the this decomposition matrix is having the full set, full energy and full details, that are
+ * needed to do a full reconstruction. So one can select a level filter it and then do
+ * reconstruction only from this single line! BY THIS METHOD, THE _HIGHEST_ LEVEL IS _ALWAYS_
+ * TAKEN FOR RECONSTRUCTION!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 17.08.2014 10:07:19
+ * @param matDeComp 2-D Hilbert spaces: [ 0 .. p ][ 0 .. M ] where p is the exponent of M=2^p |
+ * pEN
+ * @return a 1-D time domain signal
+ */
+ public double[] recompose(double[][] matDeComp) throws JWaveException {
+
+ // Each level of the matrix is having the full set (full energy + details)
+ // of decomposition. Therefore, each level can be used to do a full reconstruction,
+ int level = matDeComp.length - 1; // selected highest level in general.
+ double[] arrTime = null;
+ try {
+ arrTime = recompose(matDeComp, level);
+ } catch (JWaveFailure e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+
+ return arrTime;
+ } // recompose
+
+ /**
+ * Generates from a 1-D signal a 2-D output, where the second dimension are the levels of the
+ * wavelet transform. The first level should keep the original coefficients. All following levels
+ * should keep each step of the decomposition of the Fast Wavelet Transform. However, each level
+ * of the this decomposition matrix is having the full set, full energy and full details, that are
+ * needed to do a full reconstruction. So one can select a level filter it and then do
+ * reconstruction only from this single line!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 15:12:19
+ * @param matDeComp 2-D Hilbert spaces: [ 0 .. p ][ 0 .. M ] where p is the exponent of M=2^p |
+ * pEN
+ * @param level the level that should be used for reconstruction
+ * @return the reconstructed time series of a selected level
+ * @throws JWaveException
+ */
+ public double[] recompose(double[][] matDeComp, int level) throws JWaveException {
+
+ double[] arrTime = null;
+ try {
+ arrTime = recompose(matDeComp, level);
+ } catch (JWaveFailure e) {
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+
+ return arrTime;
+ } // recompose
+
+ /**
+ * Performs the forward transform from time domain to frequency or Hilbert domain for a given
+ * array depending on the used transform algorithm by inheritance.
+ *
+ * @date 16.02.2014 14:42:57
+ * @author Christian (graetz23@gmail.com)
+ * @param arrTime coefficients of 1-D time domain
+ * @return coefficients of 1-D frequency or Hilbert domain
+ * @throws JWaveException
+ */
+ public Complex[] forward(Complex[] arrTime) throws JWaveException {
+
+ double[] arrTimeBulk = new double[2 * arrTime.length];
+
+ for (int i = 0; i < arrTime.length; i++) {
+
+ // TODO rehack complex number splitting this to: { r1, r2, r3, .., c1, c2, c3, .. }
+ int k = i * 2;
+ arrTimeBulk[k] = arrTime[i].getReal();
+ arrTimeBulk[k + 1] = arrTime[i].getImag();
+ } // i blown to k = 2 * i
+
+ double[] arrHilbBulk = forward(arrTimeBulk);
+
+ Complex[] arrHilb = new Complex[arrTime.length];
+
+ for (int i = 0; i < arrTime.length; i++) {
+
+ int k = i * 2;
+ arrHilb[i] = new Complex(arrHilbBulk[k], arrHilbBulk[k + 1]);
+ } // k = 2 * i shrink to i
+
+ return arrHilb;
+ } // forward
+
+ /**
+ * Performs the reverse transform from frequency or Hilbert domain to time domain for a given
+ * array depending on the used transform algorithm by inheritance.
+ *
+ * @date 16.02.2014 14:42:57
+ * @author Christian (graetz23@gmail.com)
+ * @param arrFreq coefficients of 1-D frequency or Hilbert domain
+ * @return coefficients of 1-D time domain
+ * @throws JWaveException
+ */
+ public Complex[] reverse(Complex[] arrHilb) throws JWaveException {
+
+ double[] arrHilbBulk = new double[2 * arrHilb.length];
+
+ for (int i = 0; i < arrHilb.length; i++) {
+
+ int k = i * 2;
+ arrHilbBulk[k] = arrHilb[i].getReal();
+ arrHilbBulk[k + 1] = arrHilb[i].getImag();
+ } // i blown to k = 2 * i
+
+ double[] arrTimeBulk = reverse(arrHilbBulk);
+
+ Complex[] arrTime = new Complex[arrHilb.length];
+
+ for (int i = 0; i < arrTime.length; i++) {
+
+ int k = i * 2;
+ arrTime[i] = new Complex(arrTimeBulk[k], arrTimeBulk[k + 1]);
+ } // k = 2 * i shrink to i
+
+ return arrTime;
+ } // reverse
+
+ /**
+ * Performs the 2-D forward transform from time domain to frequency or Hilbert domain for a given
+ * matrix depending on the used transform algorithm by inheritance.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 12:47:01
+ * @param matTime
+ * @return
+ * @throws JWaveException if matrix id not of matching dimension like 2^p | pEN
+ */
+ public double[][] forward(double[][] matTime) throws JWaveException {
+
+ int maxM = MathToolKit.getExponent(matTime.length);
+ int maxN = MathToolKit.getExponent(matTime[0].length);
+ return forward(matTime, maxM, maxN);
+ } // forward
+
+ /**
+ * Performs the 2-D forward transform from time domain to frequency or Hilbert domain of a certain
+ * level for a given matrix depending on the used transform algorithm by inheritance. The
+ * supported level has to match the possible dimensions of the given matrix.
+ *
+ * @date 10.02.2010 11:00:29
+ * @author Christian (graetz23@gmail.com)
+ * @param matTime coefficients of 2-D time domain
+ * @param lvlM level to stop in dimension M of the matrix
+ * @param lvlN level to stop in dimension N of the matrix
+ * @return coefficients of 2-D frequency or Hilbert domain
+ * @throws JWaveException
+ */
+ public double[][] forward(double[][] matTime, int lvlM, int lvlN) throws JWaveException {
+
+ int noOfRows = matTime.length;
+ int noOfCols = matTime[0].length;
+
+ double[][] matHilb = new double[noOfRows][noOfCols];
+
+ for (int i = 0; i < noOfRows; i++) {
+
+ double[] arrTime = new double[noOfCols];
+
+ for (int j = 0; j < noOfCols; j++) arrTime[j] = matTime[i][j];
+
+ double[] arrHilb = forward(arrTime, lvlN);
+
+ for (int j = 0; j < noOfCols; j++) matHilb[i][j] = arrHilb[j];
+ } // rows
+
+ for (int j = 0; j < noOfCols; j++) {
+
+ double[] arrTime = new double[noOfRows];
+
+ for (int i = 0; i < noOfRows; i++) arrTime[i] = matHilb[i][j];
+
+ double[] arrHilb = forward(arrTime, lvlM);
+
+ for (int i = 0; i < noOfRows; i++) matHilb[i][j] = arrHilb[i];
+ } // cols
+
+ return matHilb;
+ } // forward
+
+ /**
+ * Performs the 2-D reverse transform from frequency or Hilbert or time domain to time domain for
+ * a given matrix depending on the used transform algorithm by inheritance.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 10.02.2010 11:01:38
+ * @param matFreq
+ * @return
+ * @throws JWaveException
+ */
+ public double[][] reverse(double[][] matFreq) throws JWaveException {
+
+ int maxM = MathToolKit.getExponent(matFreq.length);
+ int maxN = MathToolKit.getExponent(matFreq[0].length);
+ return reverse(matFreq, maxM, maxN);
+ } // reverse
+
+ /**
+ * Performs the 2-D reverse transform from frequency or Hilbert or time domain to time domain of a
+ * certain level for a given matrix depending on the used transform algorithm by inheritance.
+ *
+ * @date 22.03.2015 12:49:16
+ * @author Christian (graetz23@gmail.com)
+ * @param matFreq coefficients of 2-D frequency or Hilbert domain
+ * @param lvlM level to start reconstruction for dimension M of the matrix
+ * @param lvlN level to start reconstruction for dimension N of the matrix
+ * @return coefficients of 2-D time domain
+ * @throws JWaveException
+ */
+ public double[][] reverse(double[][] matFreq, int lvlM, int lvlN) throws JWaveException {
+
+ int noOfRows = matFreq.length;
+ int noOfCols = matFreq[0].length;
+
+ double[][] matTime = new double[noOfRows][noOfCols];
+
+ for (int j = 0; j < noOfCols; j++) {
+
+ double[] arrFreq = new double[noOfRows];
+
+ for (int i = 0; i < noOfRows; i++) arrFreq[i] = matFreq[i][j];
+
+ double[] arrTime = reverse(arrFreq, lvlM); // AED
+
+ for (int i = 0; i < noOfRows; i++) matTime[i][j] = arrTime[i];
+ } // cols
+
+ for (int i = 0; i < noOfRows; i++) {
+
+ double[] arrFreq = new double[noOfCols];
+
+ for (int j = 0; j < noOfCols; j++) arrFreq[j] = matTime[i][j];
+
+ double[] arrTime = reverse(arrFreq, lvlN); // AED
+
+ for (int j = 0; j < noOfCols; j++) matTime[i][j] = arrTime[j];
+ } // rows
+
+ return matTime;
+ } // reverse
+
+ /**
+ * Performs the 3-D forward transform from time domain to frequency or Hilbert domain for a given
+ * space (3-D) depending on the used transform algorithm by inheritance.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 10.07.2010 18:08:17
+ * @param spcTime
+ * @return
+ * @throws JWaveException
+ */
+ public double[][][] forward(double[][][] spcTime) throws JWaveException {
+
+ int maxP = MathToolKit.getExponent(spcTime.length);
+ int maxQ = MathToolKit.getExponent(spcTime[0].length);
+ int maxR = MathToolKit.getExponent(spcTime[0][0].length);
+ return forward(spcTime, maxP, maxQ, maxR);
+ } // forward
+
+ /**
+ * Performs the 3-D forward transform from time domain to frequency or Hilbert domain of a certain
+ * level for a given space (3-D) depending on the used transform algorithm by inheritance.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 12:58:34
+ * @param spcTime coefficients of 3-D time domain domain
+ * @return coefficients of 3-D frequency or Hilbert domain
+ * @throws JWaveException
+ */
+ public double[][][] forward(double[][][] spcTime, int lvlP, int lvlQ, int lvlR)
+ throws JWaveException {
+
+ int noOfRows = spcTime.length; // first dimension
+ int noOfCols = spcTime[0].length; // second dimension
+ int noOfHigh = spcTime[0][0].length; // third dimension
+
+ double[][][] spcHilb = new double[noOfRows][noOfCols][noOfHigh];
+
+ for (int i = 0; i < noOfRows; i++) {
+
+ double[][] matTime = new double[noOfCols][noOfHigh];
+
+ for (int j = 0; j < noOfCols; j++) {
+
+ for (int k = 0; k < noOfHigh; k++) {
+
+ matTime[j][k] = spcTime[i][j][k];
+ } // high
+ } // cols
+
+ double[][] matHilb = forward(matTime, lvlP, lvlQ); // 2-D forward
+
+ for (int j = 0; j < noOfCols; j++) {
+
+ for (int k = 0; k < noOfHigh; k++) {
+
+ spcHilb[i][j][k] = matHilb[j][k];
+ } // high
+ } // cols
+ } // rows
+
+ for (int j = 0; j < noOfCols; j++) {
+
+ for (int k = 0; k < noOfHigh; k++) {
+
+ double[] arrTime = new double[noOfRows];
+
+ for (int i = 0; i < noOfRows; i++) arrTime[i] = spcHilb[i][j][k];
+
+ double[] arrHilb = forward(arrTime, lvlR); // 1-D forward
+
+ for (int i = 0; i < noOfRows; i++) spcHilb[i][j][k] = arrHilb[i];
+ } // high
+ } // cols
+
+ return spcHilb;
+ } // forward
+
+ /**
+ * Performs the 3-D reverse transform from frequency or Hilbert domain to time domain for a given
+ * space (3-D) depending on the used transform algorithm by inheritance.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 10.07.2010 18:09:54
+ * @param spcHilb
+ * @return
+ * @throws JWaveException
+ */
+ public double[][][] reverse(double[][][] spcHilb) throws JWaveException {
+
+ int maxP = MathToolKit.getExponent(spcHilb.length);
+ int maxQ = MathToolKit.getExponent(spcHilb[0].length);
+ int maxR = MathToolKit.getExponent(spcHilb[0][0].length);
+ return reverse(spcHilb, maxP, maxQ, maxR);
+ } // reverse
+
+ /**
+ * Performs the 3-D reverse transform from frequency or Hilbert domain of a certain level to time
+ * domain for a given space (3-D) depending on the used transform algorithm by inheritance. The
+ * supported coefficients have to match the level of Hilbert space.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 13:01:47
+ * @param spcHilb coefficients of 3-D frequency or Hilbert domain
+ * @return coefficients of 3-D time domain
+ * @throws JWaveException
+ */
+ public double[][][] reverse(double[][][] spcHilb, int lvlP, int lvlQ, int lvlR)
+ throws JWaveException {
+
+ int noOfRows = spcHilb.length; // first dimension
+ int noOfCols = spcHilb[0].length; // second dimension
+ int noOfHigh = spcHilb[0][0].length; // third dimension
+
+ double[][][] spcTime = new double[noOfRows][noOfCols][noOfHigh];
+
+ for (int i = 0; i < noOfRows; i++) {
+
+ double[][] matHilb = new double[noOfCols][noOfHigh];
+
+ for (int j = 0; j < noOfCols; j++) {
+
+ for (int k = 0; k < noOfHigh; k++) {
+
+ matHilb[j][k] = spcHilb[i][j][k];
+ } // high
+ } // cols
+
+ double[][] matTime = reverse(matHilb, lvlP, lvlQ); // 2-D reverse
+
+ for (int j = 0; j < noOfCols; j++) {
+
+ for (int k = 0; k < noOfHigh; k++) {
+
+ spcTime[i][j][k] = matTime[j][k];
+ } // high
+ } // cols
+ } // rows
+
+ for (int j = 0; j < noOfCols; j++) {
+
+ for (int k = 0; k < noOfHigh; k++) {
+
+ double[] arrHilb = new double[noOfRows];
+
+ for (int i = 0; i < noOfRows; i++) arrHilb[i] = spcTime[i][j][k];
+
+ double[] arrTime = reverse(arrHilb, lvlR); // 1-D reverse
+
+ for (int i = 0; i < noOfRows; i++) spcTime[i][j][k] = arrTime[i];
+ } // high
+ } // cols
+
+ return spcTime;
+ } // reverse
+
+ /**
+ * Returns true if given integer is of type binary (2, 4, 8, 16, ..) else the method returns
+ * false.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 13:31:39
+ * @param number an integer of type 2, 4, 8, 16, 32, 64, ...
+ * @return true if number is a binary number else false
+ */
+ protected boolean isBinary(int number) {
+
+ return MathToolKit.isBinary(number); // use MathToolKit or implement
+ } // isBinary
+
+ /**
+ * Return the exponent of a binary a number
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 13:35:50
+ * @param number any integer that fulfills 2^p | pEN
+ * @return p as number = 2^p | pEN
+ * @throws JWaveException if given number is not a binary number
+ */
+ protected int calcExponent(int number) throws JWaveException {
+
+ if (!isBinary(number))
+ throw new JWaveFailure(
+ "BasicTransform#calcExponent - "
+ + "given number is not binary: "
+ + "2^p | pEN .. = 1, 2, 4, 8, 16, 32, .. ");
+
+ return (int) (MathToolKit.getExponent((int) (number))); // use MathToolKit or implement
+ } // calcExponent
+} // BasicTransform
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/DiscreteFourierTransform.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/DiscreteFourierTransform.java
new file mode 100644
index 00000000000..ab9012dab4b
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/DiscreteFourierTransform.java
@@ -0,0 +1,266 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms;
+
+/**
+ * The Discrete Fourier Transform (DFT) is - as the name says - the discrete version of the Fourier
+ * Transform applied to a discrete complex valued series. While the DFT can be applied to any
+ * complex valued series; of any length, in practice for large series it can take considerable time
+ * to compute, while the time taken being proportional to the square of the number on points in the
+ * series.
+ *
+ * @date 25.03.2010 19:56:29
+ * @author Christian (graetz23@gmail.com)
+ */
+import org.apache.iotdb.db.query.simpiece.jwave.datatypes.natives.Complex;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+
+/**
+ * Discrete Fast Fourier Transform (dFFT)
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 18:30:35
+ */
+public class DiscreteFourierTransform extends BasicTransform {
+
+ /**
+ * Constructor; does nothing
+ *
+ * @date 25.03.2010 19:56:29
+ * @author Christian (graetz23@gmail.com)
+ */
+ public DiscreteFourierTransform() {
+
+ _name = "Discrete Fourier Transform";
+ } // DiscreteFourierTransform
+
+ /**
+ * The 1-D forward version of the Discrete Fourier Transform (DFT); The input array arrTime is
+ * organized by real and imaginary parts of a complex number using even and odd places for the
+ * index. For example: arrTime[ 0 ] = real1, arrTime[ 1 ] = imag1, arrTime[ 2 ] = real2, arrTime[
+ * 3 ] = imag2, ... The output arrFreq is organized by the same scheme.
+ *
+ * @date 25.03.2010 19:56:29
+ * @author Christian (graetz23@gmail.com)
+ * @throws JWaveException
+ * @see jwave.transforms.BasicTransform#forward(double[])
+ */
+ @Override
+ public double[] forward(double[] arrTime) throws JWaveException {
+
+ if (!isBinary(arrTime.length))
+ throw new JWaveFailure(
+ "DiscreteFourierTransform#forward - "
+ + "given array length is not 2^p | p E N "
+ + "... = 1, 2, 4, 8, 16, 32, .. "
+ + "please use the Ancient Egyptian "
+ + "Decomposition for any other array length!");
+
+ int m = arrTime.length;
+ double[] arrFreq = new double[m]; // result
+
+ int n = m >> 1; // half of m
+
+ for (int i = 0; i < n; i++) {
+
+ int iR = i * 2;
+ int iC = i * 2 + 1;
+
+ arrFreq[iR] = 0.;
+ arrFreq[iC] = 0.;
+
+ double arg = -2. * Math.PI * (double) i / (double) n;
+
+ for (int k = 0; k < n; k++) {
+
+ int kR = k * 2;
+ int kC = k * 2 + 1;
+
+ double cos = Math.cos(k * arg);
+ double sin = Math.sin(k * arg);
+
+ arrFreq[iR] += arrTime[kR] * cos - arrTime[kC] * sin;
+ arrFreq[iC] += arrTime[kR] * sin + arrTime[kC] * cos;
+ } // k
+
+ arrFreq[iR] /= (double) n;
+ arrFreq[iC] /= (double) n;
+ } // i
+
+ return arrFreq;
+ } // forward
+
+ /**
+ * The 1-D reverse version of the Discrete Fourier Transform (DFT); The input array arrFreq is
+ * organized by real and imaginary parts of a complex number using even and odd places for the
+ * index. For example: arrTime[ 0 ] = real1, arrTime[ 1 ] = imag1, arrTime[ 2 ] = real2, arrTime[
+ * 3 ] = imag2, ... The output arrTime is organized by the same scheme.
+ *
+ * @date 25.03.2010 19:56:29
+ * @author Christian (graetz23@gmail.com)
+ * @throws JWaveException
+ * @see jwave.transforms.BasicTransform#reverse(double[])
+ */
+ @Override
+ public double[] reverse(double[] arrFreq) throws JWaveException {
+
+ if (!isBinary(arrFreq.length))
+ throw new JWaveFailure(
+ "DiscreteFourierTransform#reverse - "
+ + "given array length is not 2^p | p E N "
+ + "... = 1, 2, 4, 8, 16, 32, .. "
+ + "please use the Ancient Egyptian "
+ + "Decomposition for any other array length!");
+
+ int m = arrFreq.length;
+ double[] arrTime = new double[m]; // result
+
+ int n = m >> 1; // half of m
+
+ for (int i = 0; i < n; i++) {
+
+ int iR = i * 2;
+ int iC = i * 2 + 1;
+
+ arrTime[iR] = 0.;
+ arrTime[iC] = 0.;
+
+ double arg = 2. * Math.PI * (double) i / (double) n;
+
+ for (int k = 0; k < n; k++) {
+
+ int kR = k * 2;
+ int kC = k * 2 + 1;
+
+ double cos = Math.cos(k * arg);
+ double sin = Math.sin(k * arg);
+
+ arrTime[iR] += arrFreq[kR] * cos - arrFreq[kC] * sin;
+ arrTime[iC] += arrFreq[kR] * sin + arrFreq[kC] * cos;
+ } // k
+ } // i
+
+ return arrTime;
+ } // reverse
+
+ /*
+ * ATTENTION - yet no level implemented; it is ognored!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 21:18:34 (non-Javadoc)
+ * @see jwave.transforms.BasicTransform#forward(double[], int)
+ */
+ @Override
+ public double[] forward(double[] arrTime, int level) throws JWaveException {
+
+ return forward(arrTime);
+ } // forward
+
+ /*
+ * ATTENTION - yet no level implemented; it is ognored!
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.05.2015 21:18:34 (non-Javadoc)
+ * @see jwave.transforms.BasicTransform#reverse(double[], int)
+ */
+ @Override
+ public double[] reverse(double[] arrFreq, int level) throws JWaveException {
+
+ return reverse(arrFreq);
+ } // reverse
+
+ /**
+ * The 1-D forward version of the Discrete Fourier Transform (DFT); The input array arrTime is
+ * organized by a class called Complex keeping real and imaginary part of a complex number. The
+ * output arrFreq is organized by the same scheme.
+ *
+ * @date 23.11.2010 18:57:34
+ * @author Christian (graetz23@gmail.com)
+ * @param arrTime array of type Complex keeping coefficients of complex numbers
+ * @return array of type Complex keeping the discrete fourier transform coefficients
+ */
+ public Complex[] forward(Complex[] arrTime) {
+
+ int n = arrTime.length;
+
+ Complex[] arrFreq = new Complex[n]; // result
+
+ for (int i = 0; i < n; i++) {
+
+ arrFreq[i] = new Complex(); // 0. , 0.
+
+ double arg = -2. * Math.PI * (double) i / (double) n;
+
+ for (int k = 0; k < n; k++) {
+
+ double cos = Math.cos(k * arg);
+ double sin = Math.sin(k * arg);
+
+ double real = arrTime[k].getReal();
+ double imag = arrTime[k].getImag();
+
+ arrFreq[i].addReal(real * cos - imag * sin);
+ arrFreq[i].addImag(real * sin + imag * cos);
+ } // k
+
+ arrFreq[i].mulReal(1. / (double) n);
+ arrFreq[i].mulImag(1. / (double) n);
+ } // i
+
+ return arrFreq;
+ } // forward
+
+ /**
+ * The 1-D reverse version of the Discrete Fourier Transform (DFT); The input array arrFreq is
+ * organized by a class called Complex keeping real and imaginary part of a complex number. The
+ * output arrTime is organized by the same scheme.
+ *
+ * @date 23.11.2010 19:02:12
+ * @author Christian (graetz23@gmail.com)
+ * @param arrFreq array of type Complex keeping the discrete fourier transform coefficients
+ * @return array of type Complex keeping coefficients of tiem domain
+ */
+ public Complex[] reverse(Complex[] arrFreq) {
+
+ int n = arrFreq.length;
+ Complex[] arrTime = new Complex[n]; // result
+
+ for (int i = 0; i < n; i++) {
+
+ arrTime[i] = new Complex(); // 0. , 0.
+
+ double arg = 2. * Math.PI * (double) i / (double) n;
+
+ for (int k = 0; k < n; k++) {
+
+ double cos = Math.cos(k * arg);
+ double sin = Math.sin(k * arg);
+
+ double real = arrFreq[k].getReal();
+ double imag = arrFreq[k].getImag();
+
+ arrTime[i].addReal(real * cos - imag * sin);
+ arrTime[i].addImag(real * sin + imag * cos);
+ } // k
+ } // i
+
+ return arrTime;
+ } // reverse
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/FastWaveletTransform.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/FastWaveletTransform.java
new file mode 100644
index 00000000000..3614c79cac5
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/FastWaveletTransform.java
@@ -0,0 +1,141 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms;
+
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+import java.util.Arrays;
+
+/**
+ * Base class for - stepping - forward and reverse methods, due to one kind of a Fast Wavelet
+ * Transform (FWD) in 1-D using a specific Wavelet.
+ *
+ * @date 10.02.2010 08:10:42
+ * @author Christian (graetz23@gmail.com)
+ */
+public class FastWaveletTransform extends WaveletTransform {
+
+ /**
+ * Constructor receiving a Wavelet object and setting identifier of transform.
+ *
+ * @date 10.02.2010 08:10:42
+ * @author Christian (graetz23@gmail.com)
+ * @param wavelet object of type Wavelet
+ */
+ public FastWaveletTransform(Wavelet wavelet) {
+
+ super(wavelet);
+ _name = "Fast Wavelet Transform"; // set identifier of transform; keep constant
+ } // FastWaveletTransform
+
+ /**
+ * Performs a 1-D forward transform from time domain to Hilbert domain using one kind of a Fast
+ * Wavelet Transform (FWT) algorithm for a given array of dimension (length) 2^p | pEN; N = 2, 4,
+ * 8, 16, 32, 64, 128, .., and so on. However, the algorithms stops for a supported level that has
+ * be in the range 0, .., p of the dimension of the input array; 0 is the time series itself and p
+ * is the maximal number of possible levels.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 11:58:37
+ * @throws JWaveException if given array is not of length 2^p | pEN or given level does not match
+ * the supported domain (array)
+ * @see jwave.transforms.BasicTransform#forward(double[], int)
+ */
+ @Override
+ public double[] forward(double[] arrTime, int level) throws JWaveException {
+
+ if (!isBinary(arrTime.length))
+ throw new JWaveFailure(
+ "FastWaveletTransform#forward - "
+ + "given array length is not 2^p | p E N ... = 1, 2, 4, 8, 16, 32, .. "
+ + "please use the Ancient Egyptian Decomposition for any other array length!");
+
+ int noOfLevels = calcExponent(arrTime.length);
+ if (level < 0 || level > noOfLevels)
+ throw new JWaveFailure(
+ "FastWaveletTransform#forward - " + "given level is out of range for given array");
+
+ double[] arrHilb = Arrays.copyOf(arrTime, arrTime.length);
+
+ int l = 0;
+ int h = arrHilb.length;
+ int transformWavelength = _wavelet.getTransformWavelength(); // normally 2
+ while (h >= transformWavelength && l < level) {
+
+ double[] arrTempPart = _wavelet.forward(arrHilb, h);
+ System.arraycopy(arrTempPart, 0, arrHilb, 0, h);
+ h = h >> 1;
+ l++;
+ } // levels
+
+ return arrHilb;
+ } // forward
+
+ /**
+ * Performs a 1-D reverse transform from Hilbert domain to time domain using one kind of a Fast
+ * Wavelet Transform (FWT) algorithm for a given array of dimension (length) 2^p | pEN; N = 2, 4,
+ * 8, 16, 32, 64, 128, .., and so on. However, the algorithms starts for at a supported level that
+ * has be in the range 0, .., p of the dimension of the input array; 0 is the time series itself
+ * and p is the maximal number of possible levels. The coefficients of the input array have to
+ * match to the supported level.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 12:00:10
+ * @throws JWaveException if given array is not of length 2^p | pEN or given level does not match
+ * the supported domain (array)
+ * @see jwave.transforms.BasicTransform#reverse(double[], int)
+ */
+ @Override
+ public double[] reverse(double[] arrHilb, int level) throws JWaveException {
+
+ if (!isBinary(arrHilb.length))
+ throw new JWaveFailure(
+ "FastWaveletTransform#reverse - "
+ + "given array length is not 2^p | p E N ... = 1, 2, 4, 8, 16, 32, .. "
+ + "please use the Ancient Egyptian Decomposition for any other array length!");
+
+ int noOfLevels = calcExponent(arrHilb.length);
+ if (level < 0 || level > noOfLevels)
+ throw new JWaveFailure(
+ "FastWaveletTransform#reverse - " + "given level is out of range for given array");
+
+ int length = arrHilb.length; // length of first Hilbert space
+ double[] arrTime = Arrays.copyOf(arrHilb, length);
+
+ int transformWavelength = _wavelet.getTransformWavelength(); // normally 2
+ int h = transformWavelength;
+
+ int steps = calcExponent(length);
+ for (int l = level; l < steps; l++)
+ h = h << 1; // begin reverse transform at certain - matching - level of Hilbert space
+
+ while (h <= arrTime.length && h >= transformWavelength) {
+
+ double[] arrTempPart = _wavelet.reverse(arrTime, h);
+ System.arraycopy(arrTempPart, 0, arrTime, 0, h);
+ h = h << 1;
+ } // levels
+
+ return arrTime;
+ } // reverse
+} // FastWaveletTransfrom
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/ShiftingWaveletTransform.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/ShiftingWaveletTransform.java
new file mode 100644
index 00000000000..798cfc3b529
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/ShiftingWaveletTransform.java
@@ -0,0 +1,126 @@
+/**
+ * Shifting Wavelet Transform shifts a wavelet of smallest wavelength over the input array, then by
+ * the double wavelength, .., and so on.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2016 23:12:55
+ * <p>ShiftingWaveletTransform.java
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms;
+
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Shifting Wavelet Transform shifts a wavelet of smallest wavelength over the input array, then by
+ * the double wavelength, .., and so on.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2016 23:12:55
+ */
+public class ShiftingWaveletTransform extends WaveletTransform {
+
+ /**
+ * Constructor taking Wavelet object for performing the transform.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2016 23:12:55
+ */
+ public ShiftingWaveletTransform(Wavelet wavelet) {
+ super(wavelet);
+ } // ShiftingWaveletTransform
+
+ /**
+ * Forward method that uses strictly the abilities of an orthogonal transform.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2016 23:12:55 (non-Javadoc)
+ * @see jwave.transforms.BasicTransform#forward(double[])
+ */
+ @Override
+ public double[] forward(double[] arrTime) throws JWaveException {
+
+ int length = arrTime.length;
+
+ int div = 2;
+ int odd = length % div; // if odd == 1 => steps * 2 + odd else steps * 2
+
+ double[] arrHilb = new double[length];
+ for (int i = 0; i < length; i++) arrHilb[i] = arrTime[i];
+
+ while (div <= length) {
+
+ int splits = length / div; // cuts the digits == round down to full
+
+ // doing smallest wavelength of div by no of steps
+
+ for (int s = 0; s < splits; s++) {
+
+ double[] arrDiv = new double[div];
+ double[] arrRes = null;
+
+ for (int p = 0; p < div; p++) arrDiv[p] = arrHilb[s * div + p];
+
+ arrRes = _wavelet.forward(arrDiv, div);
+
+ for (int q = 0; q < div; q++) arrHilb[s * div + q] = arrRes[q];
+ } // s
+
+ div *= 2;
+ } // while
+
+ if (odd == 1) arrHilb[length - 1] = arrTime[length - 1];
+
+ return arrHilb;
+ } // forward
+
+ /**
+ * Reverse method that uses strictly the abilities of an orthogonal transform.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2016 23:12:55 (non-Javadoc)
+ * @see jwave.transforms.BasicTransform#reverse(double[])
+ */
+ @Override
+ public double[] reverse(double[] arrHilb) throws JWaveException {
+
+ int length = arrHilb.length;
+
+ int div = 0;
+ if (length % 2 == 0) div = length;
+ else {
+ div = length / 2; // 2 = 4.5 => 4
+ div *= 2; // 4 * 2 = 8
+ }
+
+ int odd = length % div; // if odd == 1 => steps * 2 + odd else steps * 2
+
+ double[] arrTime = new double[length];
+ for (int i = 0; i < length; i++) arrTime[i] = arrHilb[i];
+
+ while (div >= 2) {
+
+ int splits = length / div; // cuts the digits == round down to full
+
+ // doing smallest wavelength of div by no of steps
+
+ for (int s = 0; s < splits; s++) {
+
+ double[] arrDiv = new double[div];
+ double[] arrRes = null;
+
+ for (int p = 0; p < div; p++) arrDiv[p] = arrTime[s * div + p];
+
+ arrRes = _wavelet.reverse(arrDiv, div);
+
+ for (int q = 0; q < div; q++) arrTime[s * div + q] = arrRes[q];
+ } // s
+
+ div /= 2;
+ } // while
+
+ if (odd == 1) arrTime[length - 1] = arrHilb[length - 1];
+
+ return arrTime;
+ } // reverse
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/WaveletPacketTransform.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/WaveletPacketTransform.java
new file mode 100644
index 00000000000..750acea1826
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/WaveletPacketTransform.java
@@ -0,0 +1,171 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms;
+
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+import java.util.Arrays;
+
+/**
+ * Base class for - stepping - forward and reverse methods, due to one kind of a Fast Wavelet Packet
+ * Transform (WPT) or Wavelet Packet Decomposition (WPD) in 1-D using a specific Wavelet.
+ *
+ * @date 23.02.2010 13:44:05
+ * @author Christian (graetz23@gmail.com)
+ */
+public class WaveletPacketTransform extends WaveletTransform {
+
+ /**
+ * Constructor receiving a Wavelet object and setting identifier of transform.
+ *
+ * @date 23.02.2010 13:44:05
+ * @author Christian (graetz23@gmail.com)
+ * @param wavelet object of type Wavelet
+ */
+ public WaveletPacketTransform(Wavelet wavelet) {
+
+ super(wavelet);
+
+ _name = "Wavelet Packet Transform";
+ } // WaveletPacketTransform
+
+ /**
+ * Performs a 1-D forward transform from time domain to Hilbert domain using one kind of a Wavelet
+ * Packet Transform (WPT) algorithm for a given array of dimension (length) 2^p | pEN; N = 2, 4,
+ * 8, 16, 32, 64, 128, .., and so on. However, the algorithms stops for a supported level that has
+ * be in the range 0, .., p of the dimension of the input array; 0 is the time series itself and p
+ * is the maximal number of possible levels.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 12:35:15
+ * @throws JWaveException if givven array is not of length 2^p | pEN or the given level is out of
+ * range for the supported Hilbert space (array).
+ * @see jwave.transforms.BasicTransform#forward(double[], int)
+ */
+ @Override
+ public double[] forward(double[] arrTime, int level) throws JWaveException {
+
+ if (!isBinary(arrTime.length))
+ throw new JWaveFailure(
+ "given array length is not 2^p | p E N ... = 1, 2, 4, 8, 16, 32, .. "
+ + "please use the Ancient Egyptian Decomposition for any other array length!");
+
+ int noOfLevels = calcExponent(arrTime.length);
+ if (level < 0 || level > noOfLevels)
+ throw new JWaveFailure(
+ "WaveletPacketTransform#forward - given level is out of range for given array");
+
+ double[] arrHilb = new double[arrTime.length];
+ for (int i = 0; i < arrTime.length; i++) arrHilb[i] = arrTime[i];
+
+ int k = arrTime.length;
+
+ int h = arrTime.length;
+
+ int transformWavelength = _wavelet.getTransformWavelength(); // 2, 4, 8, 16, 32, ...
+
+ int l = 0;
+
+ while (h >= transformWavelength && l < level) {
+
+ int g = k / h; // 1 -> 2 -> 4 -> 8 -> ...
+
+ for (int p = 0; p < g; p++) {
+
+ double[] iBuf = new double[h];
+
+ for (int i = 0; i < h; i++) iBuf[i] = arrHilb[i + (p * h)];
+
+ double[] oBuf = _wavelet.forward(iBuf, h);
+
+ for (int i = 0; i < h; i++) arrHilb[i + (p * h)] = oBuf[i];
+ } // packets
+
+ h = h >> 1;
+
+ l++;
+ } // levels
+
+ return arrHilb;
+ } // forward
+
+ /**
+ * Performs a 1-D reverse transform from Hilbert domain to time domain using one kind of a Wavelet
+ * Packet Transform (WPT) algorithm for a given array of dimension (length) 2^p | pEN; N = 2, 4,
+ * 8, 16, 32, 64, 128, .., and so on. However, the algorithms starts for at a supported level that
+ * has be in the range 0, .., p of the dimension of the input array; 0 is the time series itself
+ * and p is the maximal number of possible levels. The coefficients of the input array have to
+ * match to the supported level.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 12:38:23
+ * @throws JWaveException (non-Javadoc)
+ * @see jwave.transforms.BasicTransform#reverse(double[], int)
+ */
+ @Override
+ public double[] reverse(double[] arrHilb, int level) throws JWaveException {
+
+ if (!isBinary(arrHilb.length))
+ throw new JWaveFailure(
+ "given array length is not 2^p | p E N ... = 1, 2, 4, 8, 16, 32, .. "
+ + "please use the Ancient Egyptian Decomposition for any other array length!");
+
+ int noOfLevels = calcExponent(arrHilb.length);
+ if (level < 0 || level > noOfLevels)
+ throw new JWaveFailure(
+ "WaveletPacketTransform#reverse - given level is out of range for given array");
+
+ int length = arrHilb.length; // length of first Hilbert space
+ double[] arrTime = Arrays.copyOf(arrHilb, length);
+
+ int transformWavelength = _wavelet.getTransformWavelength(); // 2, 4, 8, 16, 32, ...
+
+ int k = arrTime.length;
+
+ int h = transformWavelength;
+
+ int steps = calcExponent(length);
+ for (int l = level; l < steps; l++)
+ h = h << 1; // begin reverse transform at certain - matching - level of hilbert space
+
+ while (h <= arrTime.length && h >= transformWavelength) {
+
+ int g = k / h; // ... -> 8 -> 4 -> 2 -> 1
+
+ for (int p = 0; p < g; p++) {
+
+ double[] iBuf = new double[h];
+
+ for (int i = 0; i < h; i++) iBuf[i] = arrTime[i + (p * h)];
+
+ double[] oBuf = _wavelet.reverse(iBuf, h);
+
+ for (int i = 0; i < h; i++) arrTime[i + (p * h)] = oBuf[i];
+ } // packets
+
+ h = h << 1;
+ } // levels
+
+ return arrTime;
+ } // reverse
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/WaveletTransform.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/WaveletTransform.java
new file mode 100644
index 00000000000..3490bdad7c9
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/WaveletTransform.java
@@ -0,0 +1,164 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms;
+
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2014 21:05:33
+ */
+public abstract class WaveletTransform extends BasicTransform {
+
+ /**
+ * The used wavelet for transforming
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2014 21:05:33
+ */
+ protected Wavelet _wavelet;
+
+ /**
+ * Constructor checks whether the given object is all right.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2014 21:05:33
+ * @param wavelet object of type Wavelet
+ */
+ protected WaveletTransform(Wavelet wavelet) {
+ _wavelet = wavelet;
+ } // check for objects od type Wavelet
+
+ /*
+ * Returns the stored Wavelet object.
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 18:27:05 (non-Javadoc)
+ * @see jwave.transforms.BasicTransform#getWavelet()
+ */
+ public Wavelet getWavelet() {
+ return _wavelet;
+ } // getWavelet
+
+ /**
+ * Performs a 1-D forward transform from time domain to Hilbert domain using one kind of wavelet
+ * transform algorithm for a given array of dimension (length) 2^p | pEN; N = 2, 4, 8, 16, 32, 64,
+ * 128, .., and so on.
+ *
+ * @date 10.02.2010 08:23:24
+ * @author Christian (graetz23@gmail.com)
+ * @throws JWaveException if given array is not of length 2^p | pEN
+ * @see jwave.transforms.BasicTransform#forward(double[])
+ */
+ @Override
+ public double[] forward(double[] arrTime) throws JWaveException {
+
+ if (!isBinary(arrTime.length))
+ throw new JWaveFailure(
+ "WaveletTransform#forward - "
+ + "given array length is not 2^p | p E N ... = 1, 2, 4, 8, 16, 32, .. "
+ + "please use the Ancient Egyptian Decomposition for any other array length!");
+
+ int maxLevel = calcExponent(arrTime.length);
+ return forward(arrTime, maxLevel); // forward by maximal steps
+ } // forward
+
+ /**
+ * Performs a 1-D reverse transform from Hilbert domain to time domain using one kind of wavelet
+ * transform algorithm for a given array of dimension (length) 2^p | pEN; N = 2, 4, 8, 16, 32, 64,
+ * 128, .., and so on.
+ *
+ * @date 10.02.2010 08:23:24
+ * @author Christian (graetz23@gmail.com)
+ * @throws JWaveException if given array is not of length 2^p | pEN
+ * @see jwave.transforms.BasicTransform#reverse(double[])
+ */
+ @Override
+ public double[] reverse(double[] arrHilb) throws JWaveException {
+
+ if (!isBinary(arrHilb.length))
+ throw new JWaveFailure(
+ "WaveletTransform#reverse - "
+ + "given array length is not 2^p | p E N ... = 1, 2, 4, 8, 16, 32, .. "
+ + "please use the Ancient Egyptian Decomposition for any other array length!");
+
+ int maxLevel = calcExponent(arrHilb.length);
+ return reverse(arrHilb, maxLevel); // reverse by maximal steps
+ } // reverse
+
+ /**
+ * Performs several 1-D forward transforms from time domain to all possible Hilbert domains using
+ * one kind of wavelet transform algorithm for a given array of dimension (length) 2^p | pEN; N =
+ * 2, 4, 8, 16, 32, 64, 128, .., and so on. However, the algorithm stores all levels in a matrix
+ * that has in first dimension the range of 0, .., p and in second dimension the coefficients
+ * (energy & details) of a certain level. From any level a full reconstruction can be performed.
+ * The first dimension is keeping the time series, due to being the Hilbert space of level 0. All
+ * following dimensions are keeping the next higher Hilbert spaces, so the next step in wavelet
+ * filtering.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 14:28:49
+ * @param arrTime coefficients of time domain
+ * @return matDeComp coefficients of frequency or Hilbert domain in 2-D spaces: [ 0 .. p ][ 0 .. M
+ * ] where p is the exponent of M=2^p | pEN
+ * @throws JWaveException if something does not match upon the criteria of input
+ * @see jwave.transforms.BasicTransform#decompose(double[])
+ */
+ @Override
+ public double[][] decompose(double[] arrTime) throws JWaveException {
+
+ int length = arrTime.length;
+ int levels = calcExponent(length);
+ double[][] matDeComp = new double[levels + 1][length];
+ for (int p = 0; p <= levels; p++)
+ System.arraycopy(forward(arrTime, p), 0, matDeComp[p], 0, length);
+ return matDeComp;
+ } // decompose
+
+ /**
+ * Performs one 1-D reverse transform from Hilbert domain to time domain using one kind of wavelet
+ * transform algorithm for a given array of dimension (length) 2^p | pEN; N = 2, 4, 8, 16, 32, 64,
+ * 128, .., and so on. However, the algorithm uses on of level in a matrix that has in first
+ * dimension the range of 0, .., p and in second dimension the coefficients (energy & details) the
+ * level. From any level a full a reconstruction can be performed; so from the selected by
+ * "level". Anyway, the first dimension is keeping the time series, due to being the Hilbert space
+ * of level 0. All following dimensions are keeping the next higher Hilbert spaces, so the next
+ * step in wavelet filtering. If one want to denoise each level in the same way and compare
+ * results after reverse transform, this is the best input for it.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 14:29:01
+ * @see jwave.transforms.BasicTransform#recompose(double[][], int)
+ * @param matDeComp 2-D Hilbert spaces: [ 0 .. p ][ 0 .. M ] where p is the exponent of M=2^p |
+ * pEN
+ * @throws JWaveException if something does not match upon the criteria of input
+ * @return a 1-D time domain signal
+ * @see jwave.transforms.BasicTransform#recompose(double[])
+ */
+ public double[] recompose(double[][] matDeComp, int level) throws JWaveException {
+
+ if (level < 0 || level >= matDeComp.length)
+ throw new JWaveFailure("WaveletTransform#recompose - " + "given level is out of range");
+
+ return reverse(matDeComp[level], level);
+ } // recompose
+} // WaveletTransform
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/Wavelet.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/Wavelet.java
new file mode 100644
index 00000000000..d3c24f7a803
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/Wavelet.java
@@ -0,0 +1,264 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets;
+
+import java.util.Arrays;
+
+/**
+ * Basic class for one wavelet keeping coefficients of the wavelet function, the scaling function,
+ * the base wavelength, the forward transform method, and the reverse transform method.
+ *
+ * @date 10.02.2010 08:54:48
+ * @author Christian (graetz23@gmail.com)
+ */
+public abstract class Wavelet {
+
+ /** The name of the wavelet. */
+ protected String _name;
+
+ /** The wavelength of the base or so called mother wavelet and its matching scaling function. */
+ protected int _motherWavelength;
+
+ /** The minimal wavelength of a signal that can be transformed */
+ protected int _transformWavelength;
+
+ /** The coefficients of the mother scaling (low pass filter) for decomposition. */
+ protected double[] _scalingDeCom;
+
+ /** The coefficients of the mother wavelet (high pass filter) for decomposition. */
+ protected double[] _waveletDeCom;
+
+ /** The coefficients of the mother scaling (low pass filter) for reconstruction. */
+ protected double[] _scalingReCon;
+
+ /** The coefficients of the mother wavelet (high pass filter) for reconstruction. */
+ protected double[] _waveletReCon;
+
+ /**
+ * Constructor; predefine members to default values or null!
+ *
+ * @date 15.02.2014 22:16:27
+ * @author Christian (graetz23@gmail.com)
+ */
+ public Wavelet() {
+ _name = null;
+ _motherWavelength = 0;
+ _transformWavelength = 0;
+ _scalingDeCom = null;
+ _waveletDeCom = null;
+ _scalingReCon = null;
+ _waveletReCon = null;
+ } // Wavelet
+
+ /**
+ * The method builds form the scaling (low pass) coefficients for decomposition of a filter, the
+ * matching coefficients for the wavelet (high pass) for decomposition, for the scaling (low pass)
+ * for reconstruction, and for the wavelet (high pass) of reconstruction. This method should be
+ * called in the constructor of an orthonormal filter directly after defining the orthonormal
+ * coefficients of the scaling (low pass) for decomposition!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 13:19:27
+ */
+ protected void _buildOrthonormalSpace() {
+ // building wavelet as orthogonal (orthonormal) space from
+ // scaling coefficients (low pass filter). Have a look into
+ // Alfred Haar's wavelet or the Daubechies Wavelet with 2
+ // vanishing moments for understanding what is done here. ;-)
+ _waveletDeCom = new double[_motherWavelength];
+ for (int i = 0; i < _motherWavelength; i++)
+ if (i % 2 == 0) _waveletDeCom[i] = _scalingDeCom[(_motherWavelength - 1) - i];
+ else _waveletDeCom[i] = -_scalingDeCom[(_motherWavelength - 1) - i];
+ // Copy to reconstruction filters due to orthogonality (orthonormality)!
+ _scalingReCon = new double[_motherWavelength];
+ _waveletReCon = new double[_motherWavelength];
+ for (int i = 0; i < _motherWavelength; i++) {
+ _scalingReCon[i] = _scalingDeCom[i];
+ _waveletReCon[i] = _waveletDeCom[i];
+ } // i
+ } // _buildOrthonormalSpace
+
+ /**
+ * Returns a String keeping the name of the current Wavelet.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 17.08.2014 11:02:31
+ * @return String keeping the name of the wavelet
+ */
+ public String getName() {
+ return _name;
+ } // getName
+
+ /**
+ * Returns a String keeping the name of the current Wavelet. Used to override Object's toString
+ * method
+ *
+ * @author Dakota Williams
+ * @date 11.06.2015 10:12:15
+ * @return String with the name of the wavelet
+ */
+ public String toString() {
+ return getName();
+ } // toString
+
+ /**
+ * Returns the wavelength of the so called mother wavelet or scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2014 22:06:12
+ * @return the minimal wavelength for the mother wavelet
+ */
+ public int getMotherWavelength() {
+ return _motherWavelength;
+ } // getMotherWavelength
+
+ /**
+ * Returns the minimal necessary wavelength for a signal that can be transformed by this wavelet.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2014 22:08:43
+ * @return integer representing minimal wavelength of the input signal that should be transformed
+ * by this wavelet.
+ */
+ public int getTransformWavelength() {
+ return _transformWavelength;
+ } // getTransformWavelength
+
+ /**
+ * Returns a copy of the scaling (low pass filter) coefficients of decomposition.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2010 22:11:42
+ * @return array of length of the mother wavelet wavelength keeping the decomposition low pass
+ * filter coefficients
+ */
+ public final double[] getScalingDeComposition() {
+ return Arrays.copyOf(_scalingDeCom, _scalingDeCom.length);
+ } // getScalingDeComposition
+
+ /**
+ * Returns a copy of the wavelet (high pass filter) coefficients of decomposition.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2014 22:11:25
+ * @return array of length of the mother wavelet wavelength keeping the decomposition high pass
+ * filter coefficients
+ */
+ public final double[] getWaveletDeComposition() {
+ return Arrays.copyOf(_waveletDeCom, _waveletDeCom.length);
+ } // getWaveletDeComposition
+
+ /**
+ * Returns a copy of the scaling (low pass filter) coefficients of reconstruction.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 10:35:11
+ * @return array of length of the mother wavelet wavelength keeping the reconstruction low pass
+ * filter coefficients
+ */
+ public final double[] getScalingReConstruction() {
+ return Arrays.copyOf(_scalingReCon, _scalingReCon.length);
+ } // getScalingReConstruction
+
+ /**
+ * Returns a copy of the wavelet (high pass filter) coefficients of reconstruction.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 10:35:09
+ * @return array of length of the mother wavelet wavelength keeping the reconstruction high pass
+ * filter coefficients
+ */
+ public final double[] getWaveletReConstruction() {
+ return Arrays.copyOf(_waveletReCon, _waveletReCon.length);
+ } // getWaveletReConstruction
+
+ /**
+ * Performs the forward transform for the given array from time domain to Hilbert domain and
+ * returns a new array of the same size keeping coefficients of Hilbert domain and should be of
+ * length 2 to the power of p -- length = 2^p where p is a positive integer.
+ *
+ * @date 10.02.2010 08:18:02
+ * @author Christian (graetz23@gmail.com)
+ * @param arrTime array keeping time domain coefficients
+ * @param arrTimeLength is necessary, due to working only on a part of arrTime not on the full
+ * length of arrTime!
+ * @return coefficients represented by frequency domain
+ */
+ public double[] forward(double[] arrTime, int arrTimeLength) {
+
+ double[] arrHilb = new double[arrTimeLength];
+
+ int h = arrHilb.length >> 1; // .. -> 8 -> 4 -> 2 .. shrinks in each step by half wavelength
+ for (int i = 0; i < h; i++) {
+
+ arrHilb[i] = arrHilb[i + h] = 0.; // set to zero before sum up
+
+ for (int j = 0; j < _motherWavelength; j++) {
+
+ int k = (i << 1) + j; // k = ( i * 2 ) + j;
+ while (k >= arrHilb.length)
+ k -= arrHilb.length; // circulate over arrays if scaling and wavelet are are larger
+
+ arrHilb[i] +=
+ arrTime[k] * _scalingDeCom[j]; // low pass filter for the energy (approximation)
+ arrHilb[i + h] += arrTime[k] * _waveletDeCom[j]; // high pass filter for the details
+ } // Sorting each step in patterns of: { scaling coefficients | wavelet coefficients }
+ } // h = 2^(p-1) | p = { 1, 2, .., N } .. shrinks in each step by half wavelength
+
+ return arrHilb;
+ } // forward
+
+ /**
+ * Performs the reverse transform for the given array from Hilbert domain to time domain and
+ * returns a new array of the same size keeping coefficients of time domain and should be of
+ * length 2 to the power of p -- length = 2^p where p is a positive integer.
+ *
+ * @date 10.02.2010 08:19:24
+ * @author Christian (graetz23@gmail.com)
+ * @param arrHilb array keeping frequency domain coefficients
+ * @param arrHilbLength is necessary, due to working only on a part of arrHilb not on the full
+ * length of arrHilb!
+ * @return coefficients represented by time domain
+ */
+ public double[] reverse(double[] arrHilb, int arrHilbLength) {
+
+ double[] arrTime = new double[arrHilbLength];
+ for (int i = 0; i < arrTime.length; i++) arrTime[i] = 0.; // set to zero before sum up
+
+ int h = arrTime.length >> 1; // .. -> 8 -> 4 -> 2 .. shrinks in each step by half wavelength
+ for (int i = 0; i < h; i++) {
+
+ for (int j = 0; j < _motherWavelength; j++) {
+
+ int k = (i << 1) + j; // k = ( i * 2 ) + j;
+ while (k >= arrTime.length)
+ k -= arrTime.length; // circulate over arrays if scaling and wavelet are larger
+
+ // adding up energy from low pass (approximation) and details from high pass filter
+ arrTime[k] +=
+ (arrHilb[i] * _scalingReCon[j])
+ + (arrHilb[i + h] * _waveletReCon[j]); // looks better with brackets
+ } // Reconstruction from patterns of: { scaling coefficients | wavelet coefficients }
+ } // h = 2^(p-1) | p = { 1, 2, .., N } .. shrink in each step by half wavelength
+
+ return arrTime;
+ } // reverse
+} // Wavelet
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/WaveletBuilder.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/WaveletBuilder.java
new file mode 100644
index 00000000000..d6a139425b2
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/WaveletBuilder.java
@@ -0,0 +1,499 @@
+/**
+ * Create Wavelet objects ...
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 13:50:30
+ * <p>WaveletBuilder.java
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets;
+
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveException;
+import org.apache.iotdb.db.query.simpiece.jwave.exceptions.JWaveFailure;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal11;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal13;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal15;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal22;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal24;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal26;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal28;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal31;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal33;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal35;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal37;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal39;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal44;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal55;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal.BiOrthogonal68;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.coiflet.Coiflet1;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.coiflet.Coiflet2;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.coiflet.Coiflet3;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.coiflet.Coiflet4;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.coiflet.Coiflet5;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies10;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies11;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies12;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies13;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies14;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies15;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies16;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies17;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies18;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies19;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies2;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies20;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies3;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies4;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies5;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies6;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies7;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies8;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies.Daubechies9;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.haar.Haar1;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.haar.Haar1Orthogonal;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.legendre.Legendre1;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.legendre.Legendre2;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.legendre.Legendre3;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.other.DiscreteMayer;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet10;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet11;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet12;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet13;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet14;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet15;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet16;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet17;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet18;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet19;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet2;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet20;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet3;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet4;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet5;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet6;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet7;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet8;
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.symlets.Symlet9;
+
+import java.util.ArrayList;
+
+/**
+ * Class for creating and identifying Wavelet object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 13:50:30
+ */
+public class WaveletBuilder {
+
+ /**
+ * Create a Wavelet object by string. Look into each Wavelet for matching string identifier. By
+ * the way the method requires Java 7, due to the switch statement with at String. *rofl*
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 14:19:09
+ * @param waveletName identifier as stored in Wavelet object
+ * @return a matching object of type Wavelet
+ */
+ public static Wavelet create(String waveletName) {
+
+ Wavelet wavelet = null;
+
+ try {
+
+ switch (waveletName) {
+ case "Haar":
+ wavelet = new Haar1();
+ break;
+
+ case "Haar orthogonal":
+ wavelet = new Haar1Orthogonal();
+ break;
+
+ case "Daubechies 2":
+ wavelet = new Daubechies2();
+ break;
+
+ case "Daubechies 3":
+ wavelet = new Daubechies3();
+ break;
+
+ case "Daubechies 4":
+ wavelet = new Daubechies4();
+ break;
+
+ case "Daubechies 5":
+ wavelet = new Daubechies5();
+ break;
+
+ case "Daubechies 6":
+ wavelet = new Daubechies6();
+ break;
+
+ case "Daubechies 7":
+ wavelet = new Daubechies7();
+ break;
+
+ case "Daubechies 8":
+ wavelet = new Daubechies8();
+ break;
+
+ case "Daubechies 9":
+ wavelet = new Daubechies9();
+ break;
+
+ case "Daubechies 10":
+ wavelet = new Daubechies10();
+ break;
+
+ case "Daubechies 11":
+ wavelet = new Daubechies11();
+ break;
+
+ case "Daubechies 12":
+ wavelet = new Daubechies12();
+ break;
+
+ case "Daubechies 13":
+ wavelet = new Daubechies13();
+ break;
+
+ case "Daubechies 14":
+ wavelet = new Daubechies14();
+ break;
+
+ case "Daubechies 15":
+ wavelet = new Daubechies15();
+ break;
+
+ case "Daubechies 16":
+ wavelet = new Daubechies16();
+ break;
+
+ case "Daubechies 17":
+ wavelet = new Daubechies17();
+ break;
+
+ case "Daubechies 18":
+ wavelet = new Daubechies18();
+ break;
+
+ case "Daubechies 19":
+ wavelet = new Daubechies19();
+ break;
+
+ case "Daubechies 20":
+ wavelet = new Daubechies20();
+ break;
+
+ case "Coiflet 1":
+ wavelet = new Coiflet1();
+ break;
+
+ case "Coiflet 2":
+ wavelet = new Coiflet2();
+ break;
+
+ case "Coiflet 3":
+ wavelet = new Coiflet3();
+ break;
+
+ case "Coiflet 4":
+ wavelet = new Coiflet4();
+ break;
+
+ case "Coiflet 5":
+ wavelet = new Coiflet5();
+ break;
+
+ case "Legendre 1":
+ wavelet = new Legendre1();
+ break;
+
+ case "Legendre 2":
+ wavelet = new Legendre2();
+ break;
+
+ case "Legendre 3":
+ wavelet = new Legendre3();
+ break;
+
+ case "Symlet 2":
+ wavelet = new Symlet2();
+ break;
+
+ case "Symlet 3":
+ wavelet = new Symlet3();
+ break;
+
+ case "Symlet 4":
+ wavelet = new Symlet4();
+ break;
+
+ case "Symlet 5":
+ wavelet = new Symlet5();
+ break;
+
+ case "Symlet 6":
+ wavelet = new Symlet6();
+ break;
+
+ case "Symlet 7":
+ wavelet = new Symlet7();
+ break;
+
+ case "Symlet 8":
+ wavelet = new Symlet8();
+ break;
+
+ case "Symlet 9":
+ wavelet = new Symlet9();
+ break;
+
+ case "Symlet 10":
+ wavelet = new Symlet10();
+ break;
+
+ case "Symlet 11":
+ wavelet = new Symlet11();
+ break;
+
+ case "Symlet 12":
+ wavelet = new Symlet12();
+ break;
+
+ case "Symlet 13":
+ wavelet = new Symlet13();
+ break;
+
+ case "Symlet 14":
+ wavelet = new Symlet14();
+ break;
+
+ case "Symlet 15":
+ wavelet = new Symlet15();
+ break;
+
+ case "Symlet 16":
+ wavelet = new Symlet16();
+ break;
+
+ case "Symlet 17":
+ wavelet = new Symlet17();
+ break;
+
+ case "Symlet 18":
+ wavelet = new Symlet18();
+ break;
+
+ case "Symlet 19":
+ wavelet = new Symlet19();
+ break;
+
+ case "Symlet 20":
+ wavelet = new Symlet20();
+ break;
+
+ case "BiOrthogonal 1/1":
+ wavelet = new BiOrthogonal11();
+ break;
+
+ case "BiOrthogonal 1/3":
+ wavelet = new BiOrthogonal13();
+ break;
+
+ case "BiOrthogonal 1/5":
+ wavelet = new BiOrthogonal15();
+ break;
+
+ case "BiOrthogonal 2/2":
+ wavelet = new BiOrthogonal22();
+ break;
+
+ case "BiOrthogonal 2/4":
+ wavelet = new BiOrthogonal24();
+ break;
+
+ case "BiOrthogonal 2/6":
+ wavelet = new BiOrthogonal26();
+ break;
+
+ case "BiOrthogonal 2/8":
+ wavelet = new BiOrthogonal28();
+ break;
+
+ case "BiOrthogonal 3/1":
+ wavelet = new BiOrthogonal31();
+ break;
+
+ case "BiOrthogonal 3/3":
+ wavelet = new BiOrthogonal33();
+ break;
+
+ case "BiOrthogonal 3/5":
+ wavelet = new BiOrthogonal35();
+ break;
+
+ case "BiOrthogonal 3/7":
+ wavelet = new BiOrthogonal37();
+ break;
+
+ case "BiOrthogonal 3/9":
+ wavelet = new BiOrthogonal39();
+ break;
+
+ case "BiOrthogonal 4/4":
+ wavelet = new BiOrthogonal44();
+ break;
+
+ case "BiOrthogonal 5/5":
+ wavelet = new BiOrthogonal55();
+ break;
+
+ case "BiOrthogonal 6/8":
+ wavelet = new BiOrthogonal68();
+ break;
+
+ case "Discrete Mayer":
+ wavelet = new DiscreteMayer();
+ break;
+
+ case "Battle 23":
+ // wavelet = new Battle23( );
+ throw new JWaveFailure(
+ "WaveletBuilder::create - Battle23 - "
+ + "This wavelet has an odd number of coefficients, "
+ + "due to that it is not comaptible to the implemented algorithms; somehow!");
+ // break;
+
+ case "CDF 5/3":
+ // wavelet = new CDF53( );
+ throw new JWaveFailure(
+ "WaveletBuilder::create - CDF 5/3 - "
+ + "This wavelet has an odd number of coefficients, "
+ + "due to that it is not comaptible to the implemented algorithms; somehow!");
+ // break;
+
+ case "CDF 9/7":
+ // wavelet = new CDF97( );
+ throw new JWaveFailure(
+ "WaveletBuilder::create - CDF 9/7 - "
+ + "This wavelet has an odd number of coefficients, "
+ + "due to that it is not comaptible to the implemented algorithms; somehow!");
+ // break;
+
+ default:
+ throw new JWaveFailure(
+ "WaveletBuilder::create - unknown type of wavelet for given string!");
+ } // switch
+
+ } catch (JWaveException e) {
+
+ e.showMessage();
+ e.printStackTrace();
+ } // try
+
+ return wavelet;
+ } // create
+
+ /**
+ * Returns the identifier string of a given Wavelet object.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 14.03.2015 14:22:22
+ * @param wavelet an object of type Wavelet
+ * @return identifier string of a given Wavelet object
+ */
+ public static String identify(Wavelet wavelet) {
+
+ return wavelet.getName();
+ } // identify
+
+ /**
+ * Create an array keeping all - available - wavelet objects.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 22.03.2015 15:39:15
+ * @return an array keeping all Wavelet objects
+ */
+ public static Wavelet[] create2arr() {
+
+ ArrayList<Wavelet> listWavelets = new ArrayList<Wavelet>();
+
+ listWavelets.add(WaveletBuilder.create("Haar"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 2"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 3"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 4"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 5"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 6"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 7"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 8"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 9"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 10"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 11"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 12"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 13"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 14"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 15"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 16"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 17"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 18"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 19"));
+ listWavelets.add(WaveletBuilder.create("Daubechies 20"));
+ // listWavelets.add( WaveletBuilder.create( "Legendre 1" ) ); // not passing JUnit due to sign
+ // listWavelets.add( WaveletBuilder.create( "Legendre 2" ) ); // not passing JUnit due to sign
+ // listWavelets.add( WaveletBuilder.create( "Legendre 3" ) ); // not passing JUnit due to sign
+ listWavelets.add(WaveletBuilder.create("Coiflet 1"));
+ listWavelets.add(WaveletBuilder.create("Coiflet 2"));
+ listWavelets.add(WaveletBuilder.create("Coiflet 3"));
+ listWavelets.add(WaveletBuilder.create("Coiflet 4"));
+ listWavelets.add(WaveletBuilder.create("Coiflet 5"));
+ listWavelets.add(WaveletBuilder.create("Symlet 2"));
+ listWavelets.add(WaveletBuilder.create("Symlet 3"));
+ listWavelets.add(WaveletBuilder.create("Symlet 4"));
+ listWavelets.add(WaveletBuilder.create("Symlet 5"));
+ listWavelets.add(WaveletBuilder.create("Symlet 6"));
+ listWavelets.add(WaveletBuilder.create("Symlet 7"));
+ listWavelets.add(WaveletBuilder.create("Symlet 8"));
+ listWavelets.add(WaveletBuilder.create("Symlet 9"));
+ listWavelets.add(WaveletBuilder.create("Symlet 10"));
+ listWavelets.add(WaveletBuilder.create("Symlet 11"));
+ listWavelets.add(WaveletBuilder.create("Symlet 12"));
+ listWavelets.add(WaveletBuilder.create("Symlet 13"));
+ listWavelets.add(WaveletBuilder.create("Symlet 14"));
+ listWavelets.add(WaveletBuilder.create("Symlet 15"));
+ listWavelets.add(WaveletBuilder.create("Symlet 16"));
+ listWavelets.add(WaveletBuilder.create("Symlet 17"));
+ listWavelets.add(WaveletBuilder.create("Symlet 18"));
+ listWavelets.add(WaveletBuilder.create("Symlet 19"));
+ listWavelets.add(WaveletBuilder.create("Symlet 20"));
+ listWavelets.add(WaveletBuilder.create("BiOrthogonal 1/1"));
+ listWavelets.add(WaveletBuilder.create("BiOrthogonal 1/3"));
+ listWavelets.add(WaveletBuilder.create("BiOrthogonal 1/5"));
+ // listWavelets.add( WaveletBuilder.create( "BiOrthogonal 2/2" ) ); // not passing JUnit due to
+ // shifting one position
+ // listWavelets.add( WaveletBuilder.create( "BiOrthogonal 2/4" ) ); // not passing JUnit due to
+ // lifting scheme
+ // listWavelets.add( WaveletBuilder.create( "BiOrthogonal 2/6" ) ); // not passing JUnit due to
+ // lifting scheme
+ // listWavelets.add( WaveletBuilder.create( "BiOrthogonal 2/8" ) ); // not passing JUnit due to
+ // lifting scheme
+ listWavelets.add(WaveletBuilder.create("BiOrthogonal 3/1"));
+ listWavelets.add(WaveletBuilder.create("BiOrthogonal 3/3"));
+ listWavelets.add(WaveletBuilder.create("BiOrthogonal 3/5"));
+ listWavelets.add(WaveletBuilder.create("BiOrthogonal 3/7"));
+ listWavelets.add(WaveletBuilder.create("BiOrthogonal 3/9"));
+ // listWavelets.add( WaveletBuilder.create( "BiOrthogonal 4/4" ) ); // not passing JUnit due to
+ // lifting scheme
+ // listWavelets.add( WaveletBuilder.create( "BiOrthogonal 5/5" ) ); // not passing JUnit due to
+ // lifting scheme
+ // listWavelets.add( WaveletBuilder.create( "BiOrthogonal 6/8" ) ); // not passing JUnit due to
+ // lifting scheme
+ // listWavelets.add( WaveletBuilder.create( "Discrete Mayer" ) ); // not passing JUnit due to
+ // precision
+
+ int noOfWavelets = listWavelets.size();
+ Wavelet[] arrWavelets = new Wavelet[noOfWavelets];
+ for (int w = 0; w < noOfWavelets; w++) arrWavelets[w] = listWavelets.get(w);
+
+ return arrWavelets;
+ } // create2arr
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal.java
new file mode 100644
index 00000000000..88cd63442c4
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal.java
@@ -0,0 +1,127 @@
+/**
+ * Base class for BiOrthogonal wavelet keeping construction and different forward and reverse
+ * methods.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 28.03.2015 18:42:08
+ * <p>BiOrthogonal.java
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Base class for BiOrthogonal wavelets.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 28.03.2015 18:42:08
+ */
+public class BiOrthogonal extends Wavelet {
+
+ /**
+ * no jobs done here ..
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 28.03.2015 18:42:08
+ */
+ public BiOrthogonal() {} // BiOrthogonal
+
+ /**
+ * The method builds form the scaling (low pass) coefficients for decomposition and wavelet (high
+ * pass) coefficients for decomposition of a filter, the matching coefficients for the scaling
+ * (low pass) for reconstruction, and for the wavelet (high pass) of reconstruction. This method
+ * should be called in the constructor of an biorthogonal (biorthonormal) filter directly after
+ * defining the orthonormal coefficients of the scaling (low pass) and wavelet (high pass) for
+ * decomposition!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:04:44
+ */
+ protected void _buildBiOrthonormalSpace() {
+ // building wavelet and scaling function for reconstruction
+ // as orthogonal (orthonormal) spaces from scaling and wavelet
+ // of decomposition. ;-)
+ _scalingReCon = new double[_motherWavelength];
+ _waveletReCon = new double[_motherWavelength];
+ for (int i = 0; i < _motherWavelength; i++) {
+ // if( i % 2 == 0 ) {
+ // _scalingReCon[ i ] = _waveletDeCom[ ( _motherWavelength - 1 ) - i ];
+ // _waveletReCon[ i ] = _scalingDeCom[ ( _motherWavelength - 1 ) - i ];
+ // } else {
+ // _scalingReCon[ i ] = -_waveletDeCom[ ( _motherWavelength - 1 ) - i ];
+ // _waveletReCon[ i ] = -_scalingDeCom[ ( _motherWavelength - 1 ) - i ];
+ // } // if
+ if (i % 2 == 0) {
+ _scalingReCon[i] = -_waveletDeCom[i];
+ _waveletReCon[i] = -_scalingDeCom[i];
+ } else {
+ _scalingReCon[i] = _waveletDeCom[i];
+ _waveletReCon[i] = _scalingDeCom[i];
+ } // if
+ } // i
+ } // _buildBiOrthonormalSpace
+
+ /**
+ * Wavelet forward transform algorithm adapted to biorthogonal wavelets.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 28.03.2015 18:44:24 (non-Javadoc)
+ * @see Wavelet#forward(double[], int)
+ */
+ @Override
+ public double[] forward(double[] arrTime, int arrTimeLength) {
+
+ double[] arrHilb = new double[arrTimeLength];
+
+ int h = arrHilb.length >> 1; // .. -> 8 -> 4 -> 2 .. shrinks in each step by half wavelength
+ for (int i = 0; i < h; i++) {
+
+ arrHilb[i] = arrHilb[i + h] = 0.; // set to zero before sum up
+
+ for (int j = 0; j < _motherWavelength; j++) {
+
+ int k = (i << 1) + j; // k = ( i * 2 ) + j;
+ while (k >= arrHilb.length)
+ k -= arrHilb.length; // circulate over arrays if scaling and wavelet are are larger
+
+ arrHilb[i] +=
+ arrTime[k] * _scalingDeCom[j]; // low pass filter for the energy (approximation)
+ arrHilb[i + h] += arrTime[k] * _waveletDeCom[j]; // high pass filter for the details
+ } // Sorting each step in patterns of: { scaling coefficients | wavelet coefficients }
+ } // h = 2^(p-1) | p = { 1, 2, .., N } .. shrinks in each step by half wavelength
+
+ return arrHilb;
+ } // forward
+
+ /**
+ * Wavelet reverse transform algorithm adapted to biorthogonal wavelets.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 28.03.2015 18:44:24 (non-Javadoc)
+ * @see Wavelet#reverse(double[], int)
+ */
+ @Override
+ public double[] reverse(double[] arrHilb, int arrHilbLength) {
+
+ double[] arrTime = new double[arrHilbLength];
+ for (int i = 0; i < arrTime.length; i++) arrTime[i] = 0.;
+
+ int h = arrTime.length >> 1; // .. -> 8 -> 4 -> 2 .. shrinks in each step by half wavelength
+ for (int i = 0; i < h; i++) {
+
+ for (int j = 0; j < _motherWavelength; j++) {
+
+ int k = (i << 1) + j; // k = ( i * 2 ) + j;
+ while (k >= arrTime.length)
+ k -= arrTime.length; // circulate over arrays if scaling and wavelet are larger
+
+ // adding up energy from low pass (approximation) and details from high pass filter
+ arrTime[k] +=
+ (arrHilb[i] * _scalingReCon[j])
+ + (arrHilb[i + h] * _waveletReCon[j]); // looks better with brackets
+ } // Reconstruction from patterns of: { scaling coefficients | wavelet coefficients }
+ } // h = 2^(p-1) | p = { 1, 2, .., N } .. shrink in each step by half wavelength
+
+ return arrTime;
+ } // reverse
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal11.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal11.java
new file mode 100644
index 00000000000..7f819c08b2e
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal11.java
@@ -0,0 +1,63 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 1.1 - One vanishing moment in wavelet function and one vanishing
+ * moment in scaling function
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 10:15:11
+ */
+public class BiOrthogonal11 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior1.1/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 10:15:11
+ */
+ public BiOrthogonal11() {
+
+ _name = "BiOrthogonal 1/1"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 2; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = 0.7071067811865476; // s_d0
+ _scalingDeCom[1] = 0.7071067811865476; // s_d1
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.7071067811865476; // w_d0
+ _waveletDeCom[1] = -0.7071067811865476; // w_d1
+
+ _scalingReCon = new double[_motherWavelength];
+ _scalingReCon[0] = 0.7071067811865476; // w_r0 = w_d1 .. biorthogonal!
+ _scalingReCon[1] = 0.7071067811865476; // w_r1 = -w_d0 .. biorthogonal!
+
+ _waveletReCon = new double[_motherWavelength];
+ _waveletReCon[0] = 0.7071067811865476; // s_r0 = s_d1 .. biorthogonal!
+ _waveletReCon[1] = -0.7071067811865476; // s_r1 = -s_d0 .. biorthogonal!
+ } // BiOrthogonal11
+} // BiOrthogonal11
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal13.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal13.java
new file mode 100644
index 00000000000..20742c98e45
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal13.java
@@ -0,0 +1,83 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 1.3 - One vanishing moment in wavelet function and three vanishing
+ * moments in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 10:31:33
+ */
+public class BiOrthogonal13 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior1.3/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 10:31:33
+ */
+ public BiOrthogonal13() {
+
+ _name = "BiOrthogonal 1/3"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 6; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = -0.08838834764831845;
+ _scalingDeCom[1] = 0.08838834764831845;
+ _scalingDeCom[2] = 0.7071067811865476;
+ _scalingDeCom[3] = 0.7071067811865476;
+ _scalingDeCom[4] = 0.08838834764831845;
+ _scalingDeCom[5] = -0.08838834764831845;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.;
+ _waveletDeCom[1] = 0.;
+ _waveletDeCom[2] = 0.7071067811865476;
+ _waveletDeCom[3] = -0.7071067811865476;
+ _waveletDeCom[4] = 0.;
+ _waveletDeCom[5] = 0.;
+
+ _scalingReCon = new double[_motherWavelength];
+ _scalingReCon[0] = 0.; // w_r0 = w_d1 .. biorthogonal!
+ _scalingReCon[1] = 0.; // w_r1 = -w_d0 .. biorthogonal!
+ _scalingReCon[2] = 0.7071067811865476; // w_r0 = w_d1 .. biorthogonal!
+ _scalingReCon[3] = 0.7071067811865476; // w_r1 = -w_d0 .. biorthogonal!
+ _scalingReCon[4] = 0.; // w_r0 = w_d1 .. biorthogonal!
+ _scalingReCon[5] = 0.; // w_r1 = -w_d0 .. biorthogonal!
+
+ _waveletReCon = new double[_motherWavelength];
+ _waveletReCon[0] = -0.08838834764831845;
+ _waveletReCon[1] = -0.08838834764831845;
+ _waveletReCon[2] = 0.7071067811865476;
+ _waveletReCon[3] = -0.7071067811865476;
+ _waveletReCon[4] = 0.08838834764831845;
+ _waveletReCon[5] = 0.08838834764831845;
+
+ // build all other coefficients from low & high pass decomposition
+ // _buildBiOrthonormalSpace( );
+
+ } // BiOrthogonal13
+} // BiOrthogonal13
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal15.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal15.java
new file mode 100644
index 00000000000..d422329b8b8
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal15.java
@@ -0,0 +1,74 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 1.5 - One vanishing moment in wavelet function and five vanishing
+ * moments in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 11:27:59
+ */
+public class BiOrthogonal15 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior1.5/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 11:27:59
+ */
+ public BiOrthogonal15() {
+
+ _name = "BiOrthogonal 1/5"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 10; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = 0.01657281518405971;
+ _scalingDeCom[1] = -0.01657281518405971;
+ _scalingDeCom[2] = -0.12153397801643787;
+ _scalingDeCom[3] = 0.12153397801643787;
+ _scalingDeCom[4] = 0.7071067811865476;
+ _scalingDeCom[5] = 0.7071067811865476;
+ _scalingDeCom[6] = 0.12153397801643787;
+ _scalingDeCom[7] = -0.12153397801643787;
+ _scalingDeCom[8] = -0.01657281518405971;
+ _scalingDeCom[9] = 0.01657281518405971;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.;
+ _waveletDeCom[1] = 0.;
+ _waveletDeCom[2] = 0.;
+ _waveletDeCom[3] = 0.;
+ _waveletDeCom[4] = -0.7071067811865476;
+ _waveletDeCom[5] = 0.7071067811865476;
+ _waveletDeCom[6] = 0.;
+ _waveletDeCom[7] = 0.;
+ _waveletDeCom[8] = 0.;
+ _waveletDeCom[9] = 0.;
+
+ // build all other coefficients from low & high pass decomposition
+ _buildBiOrthonormalSpace();
+ } // BiOrthogonal15
+} // BiOrthogonal15
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal22.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal22.java
new file mode 100644
index 00000000000..47b79544d4b
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal22.java
@@ -0,0 +1,83 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 2.2 - Two vanishing moments in wavelet function and two vanishing
+ * moments in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 16:15:01
+ */
+public class BiOrthogonal22 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior2.2/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 16:15:01
+ */
+ public BiOrthogonal22() {
+
+ _name = "BiOrthogonal 2/2"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 6; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = 0.;
+ _scalingDeCom[1] = -0.1767766952966369;
+ _scalingDeCom[2] = 0.3535533905932738;
+ _scalingDeCom[3] = 1.0606601717798214;
+ _scalingDeCom[4] = 0.3535533905932738;
+ _scalingDeCom[5] = -0.1767766952966369;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.;
+ _waveletDeCom[1] = 0.3535533905932738;
+ _waveletDeCom[2] = -0.7071067811865476;
+ _waveletDeCom[3] = 0.3535533905932738;
+ _waveletDeCom[4] = 0.;
+ _waveletDeCom[5] = 0.;
+
+ _scalingReCon = new double[_motherWavelength];
+ _scalingReCon[0] = 0.;
+ _scalingReCon[1] = 0.3535533905932738;
+ _scalingReCon[2] = 0.7071067811865476;
+ _scalingReCon[3] = 0.3535533905932738;
+ _scalingReCon[4] = 0.;
+ _scalingReCon[5] = 0.;
+
+ _waveletReCon = new double[_motherWavelength];
+ _waveletReCon[0] = 0.;
+ _waveletReCon[1] = 0.1767766952966369;
+ _waveletReCon[2] = 0.3535533905932738;
+ _waveletReCon[3] = -1.0606601717798214;
+ _waveletReCon[4] = 0.3535533905932738;
+ _waveletReCon[5] = 0.1767766952966369;
+
+ // build all other coefficients from low & high pass decomposition
+ // _buildBiOrthonormalSpace( );
+
+ } // BiOrthogonal22
+} // BiOrthogonal22
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal24.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal24.java
new file mode 100644
index 00000000000..e67af7a099a
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal24.java
@@ -0,0 +1,74 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 2.4 - Two vanishing moments in wavelet function and four vanishing
+ * moments in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 16:24:22
+ */
+public class BiOrthogonal24 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior2.4/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 16:24:22
+ */
+ public BiOrthogonal24() {
+
+ _name = "BiOrthogonal 2/4"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 10; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = 0.;
+ _scalingDeCom[1] = 0.03314563036811942;
+ _scalingDeCom[2] = -0.06629126073623884;
+ _scalingDeCom[3] = -0.1767766952966369;
+ _scalingDeCom[4] = 0.4198446513295126;
+ _scalingDeCom[5] = 0.9943689110435825;
+ _scalingDeCom[6] = 0.4198446513295126;
+ _scalingDeCom[7] = -0.1767766952966369;
+ _scalingDeCom[8] = -0.06629126073623884;
+ _scalingDeCom[9] = 0.03314563036811942;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.;
+ _waveletDeCom[1] = 0.;
+ _waveletDeCom[2] = 0.;
+ _waveletDeCom[3] = 0.3535533905932738;
+ _waveletDeCom[4] = -0.7071067811865476;
+ _waveletDeCom[5] = 0.3535533905932738;
+ _waveletDeCom[6] = 0.;
+ _waveletDeCom[7] = 0.;
+ _waveletDeCom[8] = 0.;
+ _waveletDeCom[9] = 0.;
+
+ // build all other coefficients from low & high pass decomposition
+ _buildBiOrthonormalSpace();
+ } // BiOrthogonal24
+} // BiOrthogonal24
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal26.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal26.java
new file mode 100644
index 00000000000..7a9c2bc2e2b
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal26.java
@@ -0,0 +1,82 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 2.6 - Two vanishing moments in wavelet function and six vanishing
+ * moments in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 16:31:32
+ */
+public class BiOrthogonal26 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior2.6/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 16:31:32
+ */
+ public BiOrthogonal26() {
+
+ _name = "BiOrthogonal 2/6"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 14; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = 0.;
+ _scalingDeCom[1] = -0.006905339660024878;
+ _scalingDeCom[2] = 0.013810679320049757;
+ _scalingDeCom[3] = 0.046956309688169176;
+ _scalingDeCom[4] = -0.10772329869638811;
+ _scalingDeCom[5] = -0.16987135563661201;
+ _scalingDeCom[6] = 0.4474660099696121;
+ _scalingDeCom[7] = 0.966747552403483;
+ _scalingDeCom[8] = 0.4474660099696121;
+ _scalingDeCom[9] = -0.16987135563661201;
+ _scalingDeCom[10] = -0.10772329869638811;
+ _scalingDeCom[11] = 0.046956309688169176;
+ _scalingDeCom[12] = 0.013810679320049757;
+ _scalingDeCom[13] = -0.006905339660024878;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.;
+ _waveletDeCom[1] = 0.;
+ _waveletDeCom[2] = 0.;
+ _waveletDeCom[3] = 0.;
+ _waveletDeCom[4] = 0.;
+ _waveletDeCom[5] = 0.3535533905932738;
+ _waveletDeCom[6] = -0.7071067811865476;
+ _waveletDeCom[7] = 0.3535533905932738;
+ _waveletDeCom[8] = 0.;
+ _waveletDeCom[9] = 0.;
+ _waveletDeCom[10] = 0.;
+ _waveletDeCom[11] = 0.;
+ _waveletDeCom[12] = 0.;
+ _waveletDeCom[13] = 0.;
+
+ // build all other coefficients from low & high pass decomposition
+ _buildBiOrthonormalSpace();
+ } // BiOrthogonal26
+} // BiOrthogonal26
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal28.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal28.java
new file mode 100644
index 00000000000..6961abc1ef7
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal28.java
@@ -0,0 +1,90 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 2.8 - Two vanishing moments in wavelet function and eight vanishing
+ * moments in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 16:37:35
+ */
+public class BiOrthogonal28 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior2.8/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 16:37:35
+ */
+ public BiOrthogonal28() {
+
+ _name = "BiOrthogonal 2/8"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 18; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = 0.;
+ _scalingDeCom[1] = 0.0015105430506304422;
+ _scalingDeCom[2] = -0.0030210861012608843;
+ _scalingDeCom[3] = -0.012947511862546647;
+ _scalingDeCom[4] = 0.02891610982635418;
+ _scalingDeCom[5] = 0.052998481890690945;
+ _scalingDeCom[6] = -0.13491307360773608;
+ _scalingDeCom[7] = -0.16382918343409025;
+ _scalingDeCom[8] = 0.4625714404759166;
+ _scalingDeCom[9] = 0.9516421218971786;
+ _scalingDeCom[10] = 0.4625714404759166;
+ _scalingDeCom[11] = -0.16382918343409025;
+ _scalingDeCom[12] = -0.13491307360773608;
+ _scalingDeCom[13] = 0.052998481890690945;
+ _scalingDeCom[14] = 0.02891610982635418;
+ _scalingDeCom[15] = -0.012947511862546647;
+ _scalingDeCom[16] = -0.0030210861012608843;
+ _scalingDeCom[17] = 0.0015105430506304422;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.;
+ _waveletDeCom[1] = 0.;
+ _waveletDeCom[2] = 0.;
+ _waveletDeCom[3] = 0.;
+ _waveletDeCom[4] = 0.;
+ _waveletDeCom[5] = 0.;
+ _waveletDeCom[6] = 0.;
+ _waveletDeCom[7] = 0.3535533905932738;
+ _waveletDeCom[8] = -0.7071067811865476;
+ _waveletDeCom[9] = 0.3535533905932738;
+ _waveletDeCom[10] = 0.;
+ _waveletDeCom[11] = 0.;
+ _waveletDeCom[12] = 0.;
+ _waveletDeCom[13] = 0.;
+ _waveletDeCom[14] = 0.;
+ _waveletDeCom[15] = 0.;
+ _waveletDeCom[16] = 0.;
+ _waveletDeCom[17] = 0.;
+
+ // build all other coefficients from low & high pass decomposition
+ _buildBiOrthonormalSpace();
+ } // BiOrthogonal28
+} // BiOrthogonal28
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal31.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal31.java
new file mode 100644
index 00000000000..d12f45db336
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal31.java
@@ -0,0 +1,62 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 3.1 - Three vanishing moments in wavelet function and one vanishing
+ * moment in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 16:50:58
+ */
+public class BiOrthogonal31 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior3.1/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 16:50:58
+ */
+ public BiOrthogonal31() {
+
+ _name = "BiOrthogonal 3/1"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 4; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = -0.3535533905932738;
+ _scalingDeCom[1] = 1.0606601717798214;
+ _scalingDeCom[2] = 1.0606601717798214;
+ _scalingDeCom[3] = -0.3535533905932738;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = -0.1767766952966369;
+ _waveletDeCom[1] = 0.5303300858899107;
+ _waveletDeCom[2] = -0.5303300858899107;
+ _waveletDeCom[3] = 0.1767766952966369;
+
+ // build all other coefficients from low & high pass decomposition
+ _buildBiOrthonormalSpace();
+ } // BiOrthogonal31
+} // BiOrthogonal31
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal33.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal33.java
new file mode 100644
index 00000000000..c7bc4c6f594
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal33.java
@@ -0,0 +1,70 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 3.3 - Three vanishing moments in wavelet function and three
+ * vanishing moments in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:14:24
+ */
+public class BiOrthogonal33 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior3.3/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:14:24
+ */
+ public BiOrthogonal33() {
+
+ _name = "BiOrthogonal 3/3"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 8; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = 0.06629126073623884;
+ _scalingDeCom[1] = -0.19887378220871652;
+ _scalingDeCom[2] = -0.15467960838455727;
+ _scalingDeCom[3] = 0.9943689110435825;
+ _scalingDeCom[4] = 0.9943689110435825;
+ _scalingDeCom[5] = -0.15467960838455727;
+ _scalingDeCom[6] = -0.19887378220871652;
+ _scalingDeCom[7] = 0.06629126073623884;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.;
+ _waveletDeCom[1] = 0.;
+ _waveletDeCom[2] = -0.1767766952966369;
+ _waveletDeCom[3] = 0.5303300858899107;
+ _waveletDeCom[4] = -0.5303300858899107;
+ _waveletDeCom[5] = 0.1767766952966369;
+ _waveletDeCom[6] = 0.;
+ _waveletDeCom[7] = 0.;
+
+ // build all other coefficients from low & high pass decomposition
+ _buildBiOrthonormalSpace();
+ } // BiOrthogonal33
+} // BiOrthogonal33
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal35.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal35.java
new file mode 100644
index 00000000000..2b46ebc0d7f
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal35.java
@@ -0,0 +1,78 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 3.5 - Three vanishing moments in wavelet function and five vanishing
+ * moments in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:17:51
+ */
+public class BiOrthogonal35 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior3.5/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:17:51
+ */
+ public BiOrthogonal35() {
+
+ _name = "BiOrthogonal 3/5"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 12; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = -0.013810679320049757;
+ _scalingDeCom[1] = 0.04143203796014927;
+ _scalingDeCom[2] = 0.052480581416189075;
+ _scalingDeCom[3] = -0.26792717880896527;
+ _scalingDeCom[4] = -0.07181553246425874;
+ _scalingDeCom[5] = 0.966747552403483;
+ _scalingDeCom[6] = 0.966747552403483;
+ _scalingDeCom[7] = -0.07181553246425874;
+ _scalingDeCom[8] = -0.26792717880896527;
+ _scalingDeCom[9] = 0.052480581416189075;
+ _scalingDeCom[10] = 0.04143203796014927;
+ _scalingDeCom[11] = -0.013810679320049757;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.;
+ _waveletDeCom[1] = 0.;
+ _waveletDeCom[2] = 0.;
+ _waveletDeCom[3] = 0.;
+ _waveletDeCom[4] = -0.1767766952966369;
+ _waveletDeCom[5] = 0.5303300858899107;
+ _waveletDeCom[6] = -0.5303300858899107;
+ _waveletDeCom[7] = 0.1767766952966369;
+ _waveletDeCom[8] = 0.;
+ _waveletDeCom[9] = 0.;
+ _waveletDeCom[10] = 0.;
+ _waveletDeCom[11] = 0.;
+
+ // build all other coefficients from low & high pass decomposition
+ _buildBiOrthonormalSpace();
+ } // BiOrthogonal35
+} // BiOrthogonal35
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal37.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal37.java
new file mode 100644
index 00000000000..730f90415cd
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal37.java
@@ -0,0 +1,86 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 3.7 - Three vanishing moments in wavelet function and seven
+ * vanishing moments in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:21:28
+ */
+public class BiOrthogonal37 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior3.7/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:21:28
+ */
+ public BiOrthogonal37() {
+
+ _name = "BiOrthogonal 3/7"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 16; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = 0.0030210861012608843;
+ _scalingDeCom[1] = -0.009063258303782653;
+ _scalingDeCom[2] = -0.01683176542131064;
+ _scalingDeCom[3] = 0.074663985074019;
+ _scalingDeCom[4] = 0.03133297870736289;
+ _scalingDeCom[5] = -0.301159125922835;
+ _scalingDeCom[6] = -0.026499240945345472;
+ _scalingDeCom[7] = 0.9516421218971786;
+ _scalingDeCom[8] = 0.9516421218971786;
+ _scalingDeCom[9] = -0.026499240945345472;
+ _scalingDeCom[10] = -0.301159125922835;
+ _scalingDeCom[11] = 0.03133297870736289;
+ _scalingDeCom[12] = 0.074663985074019;
+ _scalingDeCom[13] = -0.01683176542131064;
+ _scalingDeCom[14] = -0.009063258303782653;
+ _scalingDeCom[15] = 0.0030210861012608843;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.;
+ _waveletDeCom[1] = 0.;
+ _waveletDeCom[2] = 0.;
+ _waveletDeCom[3] = 0.;
+ _waveletDeCom[4] = 0.;
+ _waveletDeCom[5] = 0.;
+ _waveletDeCom[6] = -0.1767766952966369;
+ _waveletDeCom[7] = 0.5303300858899107;
+ _waveletDeCom[8] = -0.5303300858899107;
+ _waveletDeCom[9] = 0.1767766952966369;
+ _waveletDeCom[10] = 0.;
+ _waveletDeCom[11] = 0.;
+ _waveletDeCom[12] = 0.;
+ _waveletDeCom[13] = 0.;
+ _waveletDeCom[14] = 0.;
+ _waveletDeCom[15] = 0.;
+
+ // build all other coefficients from low & high pass decomposition
+ _buildBiOrthonormalSpace();
+ } // BiOrthogonal37
+} // BiOrthogonal37
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal39.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal39.java
new file mode 100644
index 00000000000..9403f51db11
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal39.java
@@ -0,0 +1,94 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 3.9 - Three vanishing moments in wavelet function and nine vanishing
+ * moments in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:25:01
+ */
+public class BiOrthogonal39 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior3.9/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:25:01
+ */
+ public BiOrthogonal39() {
+
+ _name = "BiOrthogonal 3/9"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 20; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = -0.000679744372783699;
+ _scalingDeCom[1] = 0.002039233118351097;
+ _scalingDeCom[2] = 0.005060319219611981;
+ _scalingDeCom[3] = -0.020618912641105536;
+ _scalingDeCom[4] = -0.014112787930175846;
+ _scalingDeCom[5] = 0.09913478249423216;
+ _scalingDeCom[6] = 0.012300136269419315;
+ _scalingDeCom[7] = -0.32019196836077857;
+ _scalingDeCom[8] = 0.0020500227115698858;
+ _scalingDeCom[9] = 0.9421257006782068;
+ _scalingDeCom[10] = 0.9421257006782068;
+ _scalingDeCom[11] = 0.0020500227115698858;
+ _scalingDeCom[12] = -0.32019196836077857;
+ _scalingDeCom[13] = 0.012300136269419315;
+ _scalingDeCom[14] = 0.09913478249423216;
+ _scalingDeCom[15] = -0.014112787930175846;
+ _scalingDeCom[16] = -0.020618912641105536;
+ _scalingDeCom[17] = 0.005060319219611981;
+ _scalingDeCom[18] = 0.002039233118351097;
+ _scalingDeCom[19] = -0.000679744372783699;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.;
+ _waveletDeCom[1] = 0.;
+ _waveletDeCom[2] = 0.;
+ _waveletDeCom[3] = 0.;
+ _waveletDeCom[4] = 0.;
+ _waveletDeCom[5] = 0.;
+ _waveletDeCom[6] = 0.;
+ _waveletDeCom[7] = 0.;
+ _waveletDeCom[8] = -0.1767766952966369;
+ _waveletDeCom[9] = 0.5303300858899107;
+ _waveletDeCom[10] = -0.5303300858899107;
+ _waveletDeCom[11] = 0.1767766952966369;
+ _waveletDeCom[12] = 0.;
+ _waveletDeCom[13] = 0.;
+ _waveletDeCom[14] = 0.;
+ _waveletDeCom[15] = 0.;
+ _waveletDeCom[16] = 0.;
+ _waveletDeCom[17] = 0.;
+ _waveletDeCom[18] = 0.;
+ _waveletDeCom[19] = 0.;
+
+ // build all other coefficients from low & high pass decomposition
+ _buildBiOrthonormalSpace();
+ } // BiOrthogonal39
+} // BiOrthogonal39
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal44.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal44.java
new file mode 100644
index 00000000000..e4746cc129c
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal44.java
@@ -0,0 +1,74 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 4.4 - Four vanishing moments in wavelet function and four vanishing
+ * moments in scaling function - 44 muhahaha! ~8>
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:36:17
+ */
+public class BiOrthogonal44 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior4.4/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:36:17
+ */
+ public BiOrthogonal44() {
+
+ _name = "BiOrthogonal 4/4"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 10; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = 0.;
+ _scalingDeCom[1] = 0.03782845550726404;
+ _scalingDeCom[2] = -0.023849465019556843;
+ _scalingDeCom[3] = -0.11062440441843718;
+ _scalingDeCom[4] = 0.37740285561283066;
+ _scalingDeCom[5] = 0.8526986790088938;
+ _scalingDeCom[6] = 0.37740285561283066;
+ _scalingDeCom[7] = -0.11062440441843718;
+ _scalingDeCom[8] = -0.023849465019556843;
+ _scalingDeCom[9] = 0.03782845550726404;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.;
+ _waveletDeCom[1] = -0.06453888262869706;
+ _waveletDeCom[2] = 0.04068941760916406;
+ _waveletDeCom[3] = 0.41809227322161724;
+ _waveletDeCom[4] = -0.7884856164055829;
+ _waveletDeCom[5] = 0.41809227322161724;
+ _waveletDeCom[6] = 0.04068941760916406;
+ _waveletDeCom[7] = -0.06453888262869706;
+ _waveletDeCom[8] = 0.;
+ _waveletDeCom[9] = 0.;
+
+ // build all other coefficients from low & high pass decomposition
+ _buildBiOrthonormalSpace();
+ } // BiOrthogonal44
+} // BiOrthogonal44
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal55.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal55.java
new file mode 100644
index 00000000000..a1ac8c0d420
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal55.java
@@ -0,0 +1,107 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 4.4 - Five vanishing moments in wavelet function and five vanishing
+ * moments in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:40:01
+ */
+public class BiOrthogonal55 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior5.5/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 17:40:01
+ */
+ public BiOrthogonal55() {
+
+ _name = "BiOrthogonal 5/5"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 12; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = 0.;
+ _scalingDeCom[1] = 0.;
+ _scalingDeCom[2] = 0.03968708834740544;
+ _scalingDeCom[3] = 0.007948108637240322;
+ _scalingDeCom[4] = -0.05446378846823691;
+ _scalingDeCom[5] = 0.34560528195603346;
+ _scalingDeCom[6] = 0.7366601814282105;
+ _scalingDeCom[7] = 0.34560528195603346;
+ _scalingDeCom[8] = -0.05446378846823691;
+ _scalingDeCom[9] = 0.007948108637240322;
+ _scalingDeCom[10] = 0.03968708834740544;
+ _scalingDeCom[11] = 0.;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = -0.013456709459118716;
+ _waveletDeCom[1] = -0.002694966880111507;
+ _waveletDeCom[2] = 0.13670658466432914;
+ _waveletDeCom[3] = -0.09350469740093886;
+ _waveletDeCom[4] = -0.47680326579848425;
+ _waveletDeCom[5] = 0.8995061097486484;
+ _waveletDeCom[6] = -0.47680326579848425;
+ _waveletDeCom[7] = -0.09350469740093886;
+ _waveletDeCom[8] = 0.13670658466432914;
+ _waveletDeCom[9] = -0.002694966880111507;
+ _waveletDeCom[10] = -0.013456709459118716;
+ _waveletDeCom[11] = 0.;
+
+ _scalingReCon = new double[_motherWavelength];
+ _scalingReCon[0] = 0.013456709459118716;
+ _scalingReCon[1] = -0.002694966880111507;
+ _scalingReCon[2] = -0.13670658466432914;
+ _scalingReCon[3] = -0.09350469740093886;
+ _scalingReCon[4] = 0.47680326579848425;
+ _scalingReCon[5] = 0.8995061097486484;
+ _scalingReCon[6] = 0.47680326579848425;
+ _scalingReCon[7] = -0.09350469740093886;
+ _scalingReCon[8] = -0.13670658466432914;
+ _scalingReCon[9] = -0.002694966880111507;
+ _scalingReCon[10] = 0.013456709459118716;
+ _scalingReCon[11] = 0.;
+
+ _waveletReCon = new double[_motherWavelength];
+ _waveletReCon[0] = 0.;
+ _waveletReCon[1] = 0.;
+ _waveletReCon[2] = 0.03968708834740544;
+ _waveletReCon[3] = -0.007948108637240322;
+ _waveletReCon[4] = -0.05446378846823691;
+ _waveletReCon[5] = -0.34560528195603346;
+ _waveletReCon[6] = 0.7366601814282105;
+ _waveletReCon[7] = -0.34560528195603346;
+ _waveletReCon[8] = -0.05446378846823691;
+ _waveletReCon[9] = -0.007948108637240322;
+ _waveletReCon[10] = 0.03968708834740544;
+ _waveletReCon[11] = 0.;
+
+ // build all other coefficients from low & high pass decomposition
+ // _buildBiOrthonormalSpace( );
+
+ } // BiOrthogonal55
+} // BiOrthogonal55
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal68.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal68.java
new file mode 100644
index 00000000000..e06139bbe27
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/biorthogonal/BiOrthogonal68.java
@@ -0,0 +1,90 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.biorthogonal;
+
+/**
+ * BiOrthogonal Wavelet of type 6.8 - Six vanishing moments in wavelet function and eight vanishing
+ * moments in scaling function.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 11:42:09
+ */
+public class BiOrthogonal68 extends BiOrthogonal {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/bior6.8/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 11:42:09
+ */
+ public BiOrthogonal68() {
+
+ _name = "BiOrthogonal 6/8"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 18; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = 0.;
+ _scalingDeCom[1] = 0.0019088317364812906;
+ _scalingDeCom[2] = -0.0019142861290887667;
+ _scalingDeCom[3] = -0.016990639867602342;
+ _scalingDeCom[4] = 0.01193456527972926;
+ _scalingDeCom[5] = 0.04973290349094079;
+ _scalingDeCom[6] = -0.07726317316720414;
+ _scalingDeCom[7] = -0.09405920349573646;
+ _scalingDeCom[8] = 0.4207962846098268;
+ _scalingDeCom[9] = 0.8259229974584023;
+ _scalingDeCom[10] = 0.4207962846098268;
+ _scalingDeCom[11] = -0.09405920349573646;
+ _scalingDeCom[12] = -0.07726317316720414;
+ _scalingDeCom[13] = 0.04973290349094079;
+ _scalingDeCom[14] = 0.01193456527972926;
+ _scalingDeCom[15] = -0.016990639867602342;
+ _scalingDeCom[16] = -0.0019142861290887667;
+ _scalingDeCom[17] = 0.0019088317364812906;
+
+ _waveletDeCom = new double[_motherWavelength];
+ _waveletDeCom[0] = 0.;
+ _waveletDeCom[1] = 0.;
+ _waveletDeCom[2] = 0.;
+ _waveletDeCom[3] = 0.014426282505624435;
+ _waveletDeCom[4] = -0.014467504896790148;
+ _waveletDeCom[5] = -0.07872200106262882;
+ _waveletDeCom[6] = 0.04036797903033992;
+ _waveletDeCom[7] = 0.41784910915027457;
+ _waveletDeCom[8] = -0.7589077294536541;
+ _waveletDeCom[9] = 0.41784910915027457;
+ _waveletDeCom[10] = 0.04036797903033992;
+ _waveletDeCom[11] = -0.07872200106262882;
+ _waveletDeCom[12] = -0.014467504896790148;
+ _waveletDeCom[13] = 0.014426282505624435;
+ _waveletDeCom[14] = 0.;
+ _waveletDeCom[15] = 0.;
+ _waveletDeCom[16] = 0.;
+ _waveletDeCom[17] = 0.;
+
+ // build all other coefficients from low & high pass decomposition
+ _buildBiOrthonormalSpace();
+ } // BiOrthogonal68
+} // BiOrthogonal68
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet1.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet1.java
new file mode 100644
index 00000000000..d25552eb872
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet1.java
@@ -0,0 +1,63 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.coiflet;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Coiflet wavelet of six coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2014 22:27:55
+ */
+public class Coiflet1 extends Wavelet {
+
+ /**
+ * Constructor calculating analytically the orthogonal Coiflet wavelet of 6 coefficients,
+ * orthonormalizes them (normed, due to ||*||2 - euclidean norm), and spreads the scaling
+ * coefficients afterwards; .
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2014 22:27:55
+ */
+ public Coiflet1() {
+
+ _name = "Coiflet 1"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 6; // wavelength of mother wavelet
+
+ double sqrt02 = 1.4142135623730951;
+ double sqrt15 = Math.sqrt(15.);
+
+ // these coefficients are already orthonormal
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = sqrt02 * (sqrt15 - 3.) / 32.; // -0.01565572813546454;
+ _scalingDeCom[1] = sqrt02 * (1. - sqrt15) / 32.; // -0.0727326195128539;
+ _scalingDeCom[2] = sqrt02 * (6. - 2 * sqrt15) / 32.; // 0.38486484686420286;
+ _scalingDeCom[3] = sqrt02 * (2. * sqrt15 + 6.) / 32.; // 0.8525720202122554;
+ _scalingDeCom[4] = sqrt02 * (sqrt15 + 13.) / 32.; // 0.3378976624578092;
+ _scalingDeCom[5] = sqrt02 * (9. - sqrt15) / 32.; // -0.0727326195128539;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Coiflet1
+} // class
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet2.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet2.java
new file mode 100644
index 00000000000..6ee1c09f2b4
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet2.java
@@ -0,0 +1,64 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.coiflet;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Coiflet wavelet of 12 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2014 22:33:55
+ */
+public class Coiflet2 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/coif2/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2014 22:33:55
+ */
+ public Coiflet2() {
+
+ _name = "Coiflet 2"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 12; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = -0.0007205494453645122;
+ _scalingDeCom[1] = -0.0018232088707029932;
+ _scalingDeCom[2] = 0.0056114348193944995;
+ _scalingDeCom[3] = 0.023680171946334084;
+ _scalingDeCom[4] = -0.0594344186464569;
+ _scalingDeCom[5] = -0.0764885990783064;
+ _scalingDeCom[6] = 0.41700518442169254;
+ _scalingDeCom[7] = 0.8127236354455423;
+ _scalingDeCom[8] = 0.3861100668211622;
+ _scalingDeCom[9] = -0.06737255472196302;
+ _scalingDeCom[10] = -0.04146493678175915;
+ _scalingDeCom[11] = 0.016387336463522112;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Coiflet2
+} // Coiflet2
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet3.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet3.java
new file mode 100644
index 00000000000..bd4d3b73270
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet3.java
@@ -0,0 +1,70 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.coiflet;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Coiflet wavelet of 18 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2014 22:58:59
+ */
+public class Coiflet3 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/coif3/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 15.02.2014 22:58:59
+ */
+ public Coiflet3() {
+
+ _name = "Coiflet 3"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 18; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = -3.459977283621256e-05;
+ _scalingDeCom[1] = -7.098330313814125e-05;
+ _scalingDeCom[2] = 0.0004662169601128863;
+ _scalingDeCom[3] = 0.0011175187708906016;
+ _scalingDeCom[4] = -0.0025745176887502236;
+ _scalingDeCom[5] = -0.00900797613666158;
+ _scalingDeCom[6] = 0.015880544863615904;
+ _scalingDeCom[7] = 0.03455502757306163;
+ _scalingDeCom[8] = -0.08230192710688598;
+ _scalingDeCom[9] = -0.07179982161931202;
+ _scalingDeCom[10] = 0.42848347637761874;
+ _scalingDeCom[11] = 0.7937772226256206;
+ _scalingDeCom[12] = 0.4051769024096169;
+ _scalingDeCom[13] = -0.06112339000267287;
+ _scalingDeCom[14] = -0.0657719112818555;
+ _scalingDeCom[15] = 0.023452696141836267;
+ _scalingDeCom[16] = 0.007782596427325418;
+ _scalingDeCom[17] = -0.003793512864491014;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Coiflet3
+} // Coiflet3
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet4.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet4.java
new file mode 100644
index 00000000000..ba0f1fdb3d2
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet4.java
@@ -0,0 +1,76 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.coiflet;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Coiflet wavelet of 24 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 01:46:10
+ */
+public class Coiflet4 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/coif4/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 01:46:11
+ */
+ public Coiflet4() {
+
+ _name = "Coiflet 4"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 24; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = -1.7849850030882614e-06;
+ _scalingDeCom[1] = -3.2596802368833675e-06;
+ _scalingDeCom[2] = 3.1229875865345646e-05;
+ _scalingDeCom[3] = 6.233903446100713e-05;
+ _scalingDeCom[4] = -0.00025997455248771324;
+ _scalingDeCom[5] = -0.0005890207562443383;
+ _scalingDeCom[6] = 0.0012665619292989445;
+ _scalingDeCom[7] = 0.003751436157278457;
+ _scalingDeCom[8] = -0.00565828668661072;
+ _scalingDeCom[9] = -0.015211731527946259;
+ _scalingDeCom[10] = 0.025082261844864097;
+ _scalingDeCom[11] = 0.03933442712333749;
+ _scalingDeCom[12] = -0.09622044203398798;
+ _scalingDeCom[13] = -0.06662747426342504;
+ _scalingDeCom[14] = 0.4343860564914685;
+ _scalingDeCom[15] = 0.782238930920499;
+ _scalingDeCom[16] = 0.41530840703043026;
+ _scalingDeCom[17] = -0.05607731331675481;
+ _scalingDeCom[18] = -0.08126669968087875;
+ _scalingDeCom[19] = 0.026682300156053072;
+ _scalingDeCom[20] = 0.016068943964776348;
+ _scalingDeCom[21] = -0.0073461663276420935;
+ _scalingDeCom[22] = -0.0016294920126017326;
+ _scalingDeCom[23] = 0.0008923136685823146;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Coiflet4
+} // Coiflet4
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet5.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet5.java
new file mode 100644
index 00000000000..9e9cc985a15
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/coiflet/Coiflet5.java
@@ -0,0 +1,82 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.coiflet;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Coiflet wavelet of 30 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 01:49:39
+ */
+public class Coiflet5 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/coif5/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 01:49:39
+ */
+ public Coiflet5() {
+
+ _name = "Coiflet 5"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 30; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = -9.517657273819165e-08;
+ _scalingDeCom[1] = -1.6744288576823017e-07;
+ _scalingDeCom[2] = 2.0637618513646814e-06;
+ _scalingDeCom[3] = 3.7346551751414047e-06;
+ _scalingDeCom[4] = -2.1315026809955787e-05;
+ _scalingDeCom[5] = -4.134043227251251e-05;
+ _scalingDeCom[6] = 0.00014054114970203437;
+ _scalingDeCom[7] = 0.00030225958181306315;
+ _scalingDeCom[8] = -0.0006381313430451114;
+ _scalingDeCom[9] = -0.0016628637020130838;
+ _scalingDeCom[10] = 0.0024333732126576722;
+ _scalingDeCom[11] = 0.006764185448053083;
+ _scalingDeCom[12] = -0.009164231162481846;
+ _scalingDeCom[13] = -0.01976177894257264;
+ _scalingDeCom[14] = 0.03268357426711183;
+ _scalingDeCom[15] = 0.0412892087501817;
+ _scalingDeCom[16] = -0.10557420870333893;
+ _scalingDeCom[17] = -0.06203596396290357;
+ _scalingDeCom[18] = 0.4379916261718371;
+ _scalingDeCom[19] = 0.7742896036529562;
+ _scalingDeCom[20] = 0.4215662066908515;
+ _scalingDeCom[21] = -0.05204316317624377;
+ _scalingDeCom[22] = -0.09192001055969624;
+ _scalingDeCom[23] = 0.02816802897093635;
+ _scalingDeCom[24] = 0.023408156785839195;
+ _scalingDeCom[25] = -0.010131117519849788;
+ _scalingDeCom[26] = -0.004159358781386048;
+ _scalingDeCom[27] = 0.0021782363581090178;
+ _scalingDeCom[28] = 0.00035858968789573785;
+ _scalingDeCom[29] = -0.00021208083980379827;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Coiflet5
+} // Coiflet5
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies10.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies10.java
new file mode 100644
index 00000000000..821fb47bfd2
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies10.java
@@ -0,0 +1,93 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Daubechies wavelet of 20 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 00:41:08
+ */
+public class Daubechies10 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/db10/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 16.02.2014 00:41:08
+ */
+ public Daubechies10() {
+
+ _name = "Daubechies 10"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 20; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+ _scalingDeCom[0] = -1.326420300235487e-05;
+ _scalingDeCom[1] = 9.358867000108985e-05;
+ _scalingDeCom[2] = -0.0001164668549943862;
+ _scalingDeCom[3] = -0.0006858566950046825;
+ _scalingDeCom[4] = 0.00199240529499085;
+ _scalingDeCom[5] = 0.0013953517469940798;
+ _scalingDeCom[6] = -0.010733175482979604;
+ _scalingDeCom[7] = 0.0036065535669883944;
+ _scalingDeCom[8] = 0.03321267405893324;
+ _scalingDeCom[9] = -0.02945753682194567;
+ _scalingDeCom[10] = -0.07139414716586077;
+ _scalingDeCom[11] = 0.09305736460380659;
+ _scalingDeCom[12] = 0.12736934033574265;
+ _scalingDeCom[13] = -0.19594627437659665;
+ _scalingDeCom[14] = -0.24984642432648865;
+ _scalingDeCom[15] = 0.2811723436604265;
+ _scalingDeCom[16] = 0.6884590394525921;
+ _scalingDeCom[17] = 0.5272011889309198;
+ _scalingDeCom[18] = 0.18817680007762133;
+ _scalingDeCom[19] = 0.026670057900950818;
+
+ // _scalingDeCom[ 0 ] = -1.326420300235487e-05;
+ // _scalingDeCom[ 1 ] = -9.358867000108985e-05;
+ // _scalingDeCom[ 2 ] = -0.0001164668549943862;
+ // _scalingDeCom[ 3 ] = 0.0006858566950046825;
+ // _scalingDeCom[ 4 ] = 0.00199240529499085;
+ // _scalingDeCom[ 5 ] = -0.0013953517469940798;
+ // _scalingDeCom[ 6 ] = -0.010733175482979604;
+ // _scalingDeCom[ 7 ] = -0.0036065535669883944;
+ // _scalingDeCom[ 8 ] = 0.03321267405893324;
+ // _scalingDeCom[ 9 ] = 0.02945753682194567;
+ // _scalingDeCom[ 10 ] = -0.07139414716586077;
+ // _scalingDeCom[ 11 ] = -0.09305736460380659;
+ // _scalingDeCom[ 12 ] = 0.12736934033574265;
+ // _scalingDeCom[ 13 ] = 0.19594627437659665;
+ // _scalingDeCom[ 14 ] = -0.24984642432648865;
+ // _scalingDeCom[ 15 ] = -0.2811723436604265;
+ // _scalingDeCom[ 16 ] = 0.6884590394525921;
+ // _scalingDeCom[ 17 ] = -0.5272011889309198;
+ // _scalingDeCom[ 18 ] = 0.18817680007762133;
+ // _scalingDeCom[ 19 ] = -0.026670057900950818;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Daubechies10
+} // Daubechies10
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies11.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies11.java
new file mode 100644
index 00000000000..b39d4562c30
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies11.java
@@ -0,0 +1,75 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Daubechies wavelet of 22 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:52
+ */
+public class Daubechies11 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/db11/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:52
+ */
+ public Daubechies11() {
+
+ _name = "Daubechies 11"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 22; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+
+ _scalingDeCom[0] = 4.494274277236352e-06;
+ _scalingDeCom[1] = -3.463498418698379e-05;
+ _scalingDeCom[2] = 5.443907469936638e-05;
+ _scalingDeCom[3] = 0.00024915252355281426;
+ _scalingDeCom[4] = -0.0008930232506662366;
+ _scalingDeCom[5] = -0.00030859285881515924;
+ _scalingDeCom[6] = 0.004928417656058778;
+ _scalingDeCom[7] = -0.0033408588730145018;
+ _scalingDeCom[8] = -0.015364820906201324;
+ _scalingDeCom[9] = 0.02084090436018004;
+ _scalingDeCom[10] = 0.03133509021904531;
+ _scalingDeCom[11] = -0.06643878569502022;
+ _scalingDeCom[12] = -0.04647995511667613;
+ _scalingDeCom[13] = 0.14981201246638268;
+ _scalingDeCom[14] = 0.06604358819669089;
+ _scalingDeCom[15] = -0.27423084681792875;
+ _scalingDeCom[16] = -0.16227524502747828;
+ _scalingDeCom[17] = 0.41196436894789695;
+ _scalingDeCom[18] = 0.6856867749161785;
+ _scalingDeCom[19] = 0.44989976435603013;
+ _scalingDeCom[20] = 0.1440670211506196;
+ _scalingDeCom[21] = 0.01869429776147044;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Daubechies11
+} // Daubechies11
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies12.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies12.java
new file mode 100644
index 00000000000..22dd3997b53
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies12.java
@@ -0,0 +1,77 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Daubechies wavelet of 24 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:53
+ */
+public class Daubechies12 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/db12/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:53
+ */
+ public Daubechies12() {
+
+ _name = "Daubechies 12"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 24; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+
+ _scalingDeCom[0] = -1.5290717580684923e-06;
+ _scalingDeCom[1] = 1.2776952219379579e-05;
+ _scalingDeCom[2] = -2.4241545757030318e-05;
+ _scalingDeCom[3] = -8.850410920820318e-05;
+ _scalingDeCom[4] = 0.0003886530628209267;
+ _scalingDeCom[5] = 6.5451282125215034e-06;
+ _scalingDeCom[6] = -0.0021795036186277044;
+ _scalingDeCom[7] = 0.0022486072409952287;
+ _scalingDeCom[8] = 0.006711499008795549;
+ _scalingDeCom[9] = -0.012840825198299882;
+ _scalingDeCom[10] = -0.01221864906974642;
+ _scalingDeCom[11] = 0.04154627749508764;
+ _scalingDeCom[12] = 0.010849130255828966;
+ _scalingDeCom[13] = -0.09643212009649671;
+ _scalingDeCom[14] = 0.0053595696743599965;
+ _scalingDeCom[15] = 0.18247860592758275;
+ _scalingDeCom[16] = -0.023779257256064865;
+ _scalingDeCom[17] = -0.31617845375277914;
+ _scalingDeCom[18] = -0.04476388565377762;
+ _scalingDeCom[19] = 0.5158864784278007;
+ _scalingDeCom[20] = 0.6571987225792911;
+ _scalingDeCom[21] = 0.3773551352142041;
+ _scalingDeCom[22] = 0.10956627282118277;
+ _scalingDeCom[23] = 0.013112257957229239;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Daubechies12
+} // Daubechies12
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies13.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies13.java
new file mode 100644
index 00000000000..da2b065bbee
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies13.java
@@ -0,0 +1,79 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Daubechies wavelet of 26 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:54
+ */
+public class Daubechies13 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/db13/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:54
+ */
+ public Daubechies13() {
+
+ _name = "Daubechies 13"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 26; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+
+ _scalingDeCom[0] = 5.2200350984548e-07;
+ _scalingDeCom[1] = -4.700416479360808e-06;
+ _scalingDeCom[2] = 1.0441930571407941e-05;
+ _scalingDeCom[3] = 3.067853757932436e-05;
+ _scalingDeCom[4] = -0.0001651289885565057;
+ _scalingDeCom[5] = 4.9251525126285676e-05;
+ _scalingDeCom[6] = 0.000932326130867249;
+ _scalingDeCom[7] = -0.0013156739118922766;
+ _scalingDeCom[8] = -0.002761911234656831;
+ _scalingDeCom[9] = 0.007255589401617119;
+ _scalingDeCom[10] = 0.003923941448795577;
+ _scalingDeCom[11] = -0.02383142071032781;
+ _scalingDeCom[12] = 0.002379972254052227;
+ _scalingDeCom[13] = 0.056139477100276156;
+ _scalingDeCom[14] = -0.026488406475345658;
+ _scalingDeCom[15] = -0.10580761818792761;
+ _scalingDeCom[16] = 0.07294893365678874;
+ _scalingDeCom[17] = 0.17947607942935084;
+ _scalingDeCom[18] = -0.12457673075080665;
+ _scalingDeCom[19] = -0.31497290771138414;
+ _scalingDeCom[20] = 0.086985726179645;
+ _scalingDeCom[21] = 0.5888895704312119;
+ _scalingDeCom[22] = 0.6110558511587811;
+ _scalingDeCom[23] = 0.3119963221604349;
+ _scalingDeCom[24] = 0.08286124387290195;
+ _scalingDeCom[25] = 0.009202133538962279;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Daubechies13
+} // Daubechies13
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies14.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies14.java
new file mode 100644
index 00000000000..adb89f33e8a
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies14.java
@@ -0,0 +1,81 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Daubechies wavelet of 28 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:55
+ */
+public class Daubechies14 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/db14/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:55
+ */
+ public Daubechies14() {
+
+ _name = "Daubechies 14"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 28; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+
+ _scalingDeCom[0] = -1.7871399683109222e-07;
+ _scalingDeCom[1] = 1.7249946753674012e-06;
+ _scalingDeCom[2] = -4.389704901780418e-06;
+ _scalingDeCom[3] = -1.0337209184568496e-05;
+ _scalingDeCom[4] = 6.875504252695734e-05;
+ _scalingDeCom[5] = -4.177724577037067e-05;
+ _scalingDeCom[6] = -0.00038683194731287514;
+ _scalingDeCom[7] = 0.0007080211542354048;
+ _scalingDeCom[8] = 0.001061691085606874;
+ _scalingDeCom[9] = -0.003849638868019787;
+ _scalingDeCom[10] = -0.0007462189892638753;
+ _scalingDeCom[11] = 0.01278949326634007;
+ _scalingDeCom[12] = -0.0056150495303375755;
+ _scalingDeCom[13] = -0.030185351540353976;
+ _scalingDeCom[14] = 0.02698140830794797;
+ _scalingDeCom[15] = 0.05523712625925082;
+ _scalingDeCom[16] = -0.0715489555039835;
+ _scalingDeCom[17] = -0.0867484115681106;
+ _scalingDeCom[18] = 0.13998901658445695;
+ _scalingDeCom[19] = 0.13839521386479153;
+ _scalingDeCom[20] = -0.2180335299932165;
+ _scalingDeCom[21] = -0.27168855227867705;
+ _scalingDeCom[22] = 0.21867068775886594;
+ _scalingDeCom[23] = 0.6311878491047198;
+ _scalingDeCom[24] = 0.5543056179407709;
+ _scalingDeCom[25] = 0.25485026779256437;
+ _scalingDeCom[26] = 0.062364758849384874;
+ _scalingDeCom[27] = 0.0064611534600864905;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Daubechies14
+} // Daubechies14
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies15.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies15.java
new file mode 100644
index 00000000000..f419e6c69d7
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies15.java
@@ -0,0 +1,83 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Daubechies wavelet of 30 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:56
+ */
+public class Daubechies15 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/db15/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:56
+ */
+ public Daubechies15() {
+
+ _name = "Daubechies 15"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 30; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+
+ _scalingDeCom[0] = 6.133359913303714e-08;
+ _scalingDeCom[1] = -6.316882325879451e-07;
+ _scalingDeCom[2] = 1.8112704079399406e-06;
+ _scalingDeCom[3] = 3.3629871817363823e-06;
+ _scalingDeCom[4] = -2.8133296266037558e-05;
+ _scalingDeCom[5] = 2.579269915531323e-05;
+ _scalingDeCom[6] = 0.00015589648992055726;
+ _scalingDeCom[7] = -0.00035956524436229364;
+ _scalingDeCom[8] = -0.0003734823541372647;
+ _scalingDeCom[9] = 0.0019433239803823459;
+ _scalingDeCom[10] = -0.00024175649075894543;
+ _scalingDeCom[11] = -0.0064877345603061454;
+ _scalingDeCom[12] = 0.005101000360422873;
+ _scalingDeCom[13] = 0.015083918027862582;
+ _scalingDeCom[14] = -0.020810050169636805;
+ _scalingDeCom[15] = -0.02576700732836694;
+ _scalingDeCom[16] = 0.054780550584559995;
+ _scalingDeCom[17] = 0.033877143923563204;
+ _scalingDeCom[18] = -0.11112093603713753;
+ _scalingDeCom[19] = -0.0396661765557336;
+ _scalingDeCom[20] = 0.19014671400708816;
+ _scalingDeCom[21] = 0.06528295284876569;
+ _scalingDeCom[22] = -0.28888259656686216;
+ _scalingDeCom[23] = -0.19320413960907623;
+ _scalingDeCom[24] = 0.33900253545462167;
+ _scalingDeCom[25] = 0.6458131403572103;
+ _scalingDeCom[26] = 0.4926317717079753;
+ _scalingDeCom[27] = 0.20602386398692688;
+ _scalingDeCom[28] = 0.04674339489275062;
+ _scalingDeCom[29] = 0.004538537361577376;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Daubechies15
+} // Daubechies15
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies16.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies16.java
new file mode 100644
index 00000000000..577ff2b68fb
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies16.java
@@ -0,0 +1,85 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Daubechies wavelet of 32 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:57
+ */
+public class Daubechies16 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/db16/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:57
+ */
+ public Daubechies16() {
+
+ _name = "Daubechies 16"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 32; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+
+ _scalingDeCom[0] = -2.1093396300980412e-08;
+ _scalingDeCom[1] = 2.3087840868545578e-07;
+ _scalingDeCom[2] = -7.363656785441815e-07;
+ _scalingDeCom[3] = -1.0435713423102517e-06;
+ _scalingDeCom[4] = 1.133660866126152e-05;
+ _scalingDeCom[5] = -1.394566898819319e-05;
+ _scalingDeCom[6] = -6.103596621404321e-05;
+ _scalingDeCom[7] = 0.00017478724522506327;
+ _scalingDeCom[8] = 0.00011424152003843815;
+ _scalingDeCom[9] = -0.0009410217493585433;
+ _scalingDeCom[10] = 0.00040789698084934395;
+ _scalingDeCom[11] = 0.00312802338120381;
+ _scalingDeCom[12] = -0.0036442796214883506;
+ _scalingDeCom[13] = -0.006990014563390751;
+ _scalingDeCom[14] = 0.013993768859843242;
+ _scalingDeCom[15] = 0.010297659641009963;
+ _scalingDeCom[16] = -0.036888397691556774;
+ _scalingDeCom[17] = -0.007588974368642594;
+ _scalingDeCom[18] = 0.07592423604445779;
+ _scalingDeCom[19] = -0.006239722752156254;
+ _scalingDeCom[20] = -0.13238830556335474;
+ _scalingDeCom[21] = 0.027340263752899923;
+ _scalingDeCom[22] = 0.21119069394696974;
+ _scalingDeCom[23] = -0.02791820813292813;
+ _scalingDeCom[24] = -0.3270633105274758;
+ _scalingDeCom[25] = -0.08975108940236352;
+ _scalingDeCom[26] = 0.44029025688580486;
+ _scalingDeCom[27] = 0.6373563320829833;
+ _scalingDeCom[28] = 0.43031272284545874;
+ _scalingDeCom[29] = 0.1650642834886438;
+ _scalingDeCom[30] = 0.03490771432362905;
+ _scalingDeCom[31] = 0.0031892209253436892;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Daubechies16
+} // Daubechies16
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies17.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies17.java
new file mode 100644
index 00000000000..7953f7bc6c4
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies17.java
@@ -0,0 +1,87 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Daubechies wavelet of 34 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:58
+ */
+public class Daubechies17 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/db17/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:58
+ */
+ public Daubechies17() {
+
+ _name = "Daubechies 17"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 34; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+
+ _scalingDeCom[0] = 7.26749296856637e-09;
+ _scalingDeCom[1] = -8.423948446008154e-08;
+ _scalingDeCom[2] = 2.9577009333187617e-07;
+ _scalingDeCom[3] = 3.0165496099963414e-07;
+ _scalingDeCom[4] = -4.505942477225963e-06;
+ _scalingDeCom[5] = 6.990600985081294e-06;
+ _scalingDeCom[6] = 2.318681379876164e-05;
+ _scalingDeCom[7] = -8.204803202458212e-05;
+ _scalingDeCom[8] = -2.5610109566546042e-05;
+ _scalingDeCom[9] = 0.0004394654277689454;
+ _scalingDeCom[10] = -0.00032813251941022427;
+ _scalingDeCom[11] = -0.001436845304805;
+ _scalingDeCom[12] = 0.0023012052421511474;
+ _scalingDeCom[13] = 0.002967996691518064;
+ _scalingDeCom[14] = -0.008602921520347815;
+ _scalingDeCom[15] = -0.0030429899813869555;
+ _scalingDeCom[16] = 0.022733676583919053;
+ _scalingDeCom[17] = -0.0032709555358783646;
+ _scalingDeCom[18] = -0.04692243838937891;
+ _scalingDeCom[19] = 0.022312336178011833;
+ _scalingDeCom[20] = 0.08110598665408082;
+ _scalingDeCom[21] = -0.05709141963185808;
+ _scalingDeCom[22] = -0.12681569177849797;
+ _scalingDeCom[23] = 0.10113548917744287;
+ _scalingDeCom[24] = 0.19731058956508457;
+ _scalingDeCom[25] = -0.12659975221599248;
+ _scalingDeCom[26] = -0.32832074836418546;
+ _scalingDeCom[27] = 0.027314970403312946;
+ _scalingDeCom[28] = 0.5183157640572823;
+ _scalingDeCom[29] = 0.6109966156850273;
+ _scalingDeCom[30] = 0.3703507241528858;
+ _scalingDeCom[31] = 0.13121490330791097;
+ _scalingDeCom[32] = 0.025985393703623173;
+ _scalingDeCom[33] = 0.00224180700103879;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Daubechies17
+} // Daubechies17
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies18.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies18.java
new file mode 100644
index 00000000000..443f97344dc
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies18.java
@@ -0,0 +1,89 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Daubechies wavelet of 36 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:59
+ */
+public class Daubechies18 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/db18/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:10:59
+ */
+ public Daubechies18() {
+
+ _name = "Daubechies 18"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 36; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+
+ _scalingDeCom[0] = -2.507934454941929e-09;
+ _scalingDeCom[1] = 3.06883586303703e-08;
+ _scalingDeCom[2] = -1.1760987670250871e-07;
+ _scalingDeCom[3] = -7.691632689865049e-08;
+ _scalingDeCom[4] = 1.768712983622886e-06;
+ _scalingDeCom[5] = -3.3326344788769603e-06;
+ _scalingDeCom[6] = -8.520602537423464e-06;
+ _scalingDeCom[7] = 3.741237880730847e-05;
+ _scalingDeCom[8] = -1.535917123021341e-07;
+ _scalingDeCom[9] = -0.00019864855231101547;
+ _scalingDeCom[10] = 0.0002135815619103188;
+ _scalingDeCom[11] = 0.0006284656829644715;
+ _scalingDeCom[12] = -0.0013405962983313922;
+ _scalingDeCom[13] = -0.0011187326669886426;
+ _scalingDeCom[14] = 0.004943343605456594;
+ _scalingDeCom[15] = 0.00011863003387493042;
+ _scalingDeCom[16] = -0.013051480946517112;
+ _scalingDeCom[17] = 0.006262167954438661;
+ _scalingDeCom[18] = 0.026670705926689853;
+ _scalingDeCom[19] = -0.023733210395336858;
+ _scalingDeCom[20] = -0.04452614190225633;
+ _scalingDeCom[21] = 0.05705124773905827;
+ _scalingDeCom[22] = 0.0648872162123582;
+ _scalingDeCom[23] = -0.10675224665906288;
+ _scalingDeCom[24] = -0.09233188415030412;
+ _scalingDeCom[25] = 0.16708131276294505;
+ _scalingDeCom[26] = 0.14953397556500755;
+ _scalingDeCom[27] = -0.21648093400458224;
+ _scalingDeCom[28] = -0.2936540407357981;
+ _scalingDeCom[29] = 0.14722311196952223;
+ _scalingDeCom[30] = 0.571801654887122;
+ _scalingDeCom[31] = 0.5718268077650818;
+ _scalingDeCom[32] = 0.31467894133619284;
+ _scalingDeCom[33] = 0.10358846582214751;
+ _scalingDeCom[34] = 0.01928853172409497;
+ _scalingDeCom[35] = 0.0015763102184365595;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Daubechies18
+} // Daubechies18
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies19.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies19.java
new file mode 100644
index 00000000000..54cde266aff
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies19.java
@@ -0,0 +1,91 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal Daubechies wavelet of 38 coefficients.
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:11:00
+ */
+public class Daubechies19 extends Wavelet {
+
+ /**
+ * Already orthonormal coefficients taken from Filip Wasilewski's webpage
+ * http://wavelets.pybytes.com/wavelet/db19/ Thanks!
+ *
+ * @author Christian (graetz23@gmail.com)
+ * @date 19.08.2014 18:11:00
+ */
+ public Daubechies19() {
+
+ _name = "Daubechies 19"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 38; // wavelength of mother wavelet
+
+ _scalingDeCom = new double[_motherWavelength];
+
+ _scalingDeCom[0] = 8.666848839034483e-10;
+ _scalingDeCom[1] = -1.1164020670405678e-08;
+ _scalingDeCom[2] = 4.636937775802368e-08;
+ _scalingDeCom[3] = 1.447088298804088e-08;
+ _scalingDeCom[4] = -6.86275565779811e-07;
+ _scalingDeCom[5] = 1.531931476697877e-06;
+ _scalingDeCom[6] = 3.0109643163099385e-06;
+ _scalingDeCom[7] = -1.664017629722462e-05;
+ _scalingDeCom[8] = 5.105950487090694e-06;
+ _scalingDeCom[9] = 8.711270467250443e-05;
+ _scalingDeCom[10] = -0.00012460079173506306;
+ _scalingDeCom[11] = -0.0002606761356811995;
+ _scalingDeCom[12] = 0.0007358025205041731;
+ _scalingDeCom[13] = 0.00034180865344939543;
+ _scalingDeCom[14] = -0.002687551800734441;
+ _scalingDeCom[15] = 0.0007689543592242488;
+ _scalingDeCom[16] = 0.007040747367080495;
+ _scalingDeCom[17] = -0.005866922281112195;
+ _scalingDeCom[18] = -0.013988388678695632;
+ _scalingDeCom[19] = 0.019375549889114482;
+ _scalingDeCom[20] = 0.021623767409452484;
+ _scalingDeCom[21] = -0.04567422627778492;
+ _scalingDeCom[22] = -0.026501236250778635;
+ _scalingDeCom[23] = 0.0869067555554507;
+ _scalingDeCom[24] = 0.02758435062488713;
+ _scalingDeCom[25] = -0.14278569504021468;
+ _scalingDeCom[26] = -0.03351854190320226;
+ _scalingDeCom[27] = 0.21234974330662043;
+ _scalingDeCom[28] = 0.07465226970806647;
+ _scalingDeCom[29] = -0.28583863175723145;
+ _scalingDeCom[30] = -0.22809139421653665;
+ _scalingDeCom[31] = 0.2608949526521201;
+ _scalingDeCom[32] = 0.6017045491300916;
+ _scalingDeCom[33] = 0.5244363774668862;
+ _scalingDeCom[34] = 0.26438843174202237;
+ _scalingDeCom[35] = 0.08127811326580564;
+ _scalingDeCom[36] = 0.01428109845082521;
+ _scalingDeCom[37] = 0.0011086697631864314;
+
+ _buildOrthonormalSpace(); // build all other coefficients from low pass decomposition
+ } // Daubechies19
+} // Daubechies19
diff --git a/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies2.java b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies2.java
new file mode 100644
index 00000000000..0ab652459d7
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/query/simpiece/jwave/transforms/wavelets/daubechies/Daubechies2.java
@@ -0,0 +1,63 @@
+/**
+ * JWave is distributed under the MIT License (MIT); this file is part of.
+ *
+ * <p>Copyright (c) 2008-2024 Christian (graetz23@gmail.com)
+ *
+ * <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * <p>The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+package org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.daubechies;
+
+import org.apache.iotdb.db.query.simpiece.jwave.transforms.wavelets.Wavelet;
+
+/**
+ * Ingrid Daubechies' orthonormal wavelet of four coefficients and the scales; normed, due to ||*||2
+ * - euclidean norm.
+ *
+ * @date 10.02.2010 15:42:45
+ * @author Christian (graetz23@gmail.com)
+ */
+public class Daubechies2 extends Wavelet {
+
+ /**
+ * Constructor setting up the orthonormal Daubechie4 wavelet coeffs and the scales; normed, due to
+ * ||*||2 - euclidean norm.
+ *
+ * @date 10.02.2010 15:42:45
+ * @author Christian (graetz23@gmail.com)
+ */
+ public Daubechies2() {
+
+ _name = "Daubechies 2"; // name of the wavelet
+
+ _transformWavelength = 2; // minimal wavelength of input signal
+
+ _motherWavelength = 4; // wavelength of mother wavelet
+
+ // calculate the coefficients analytically
... 3041 lines suppressed ...