From a3aefa95d3a30b15bf050d6625434e57712d4596 Mon Sep 17 00:00:00 2001 From: wyq Date: Mon, 28 Jul 2025 08:30:50 +0800 Subject: [PATCH] add ArrayDuration in java and timedelta datatype in mipylib --- .../mipylib/numeric/core/_dtype$py.class | Bin 17960 -> 18328 bytes .../pylib/mipylib/numeric/core/_dtype.py | 11 +- .../mipylib/numeric/core/numeric$py.class | Bin 154488 -> 155059 bytes .../pylib/mipylib/numeric/core/numeric.py | 18 +- .../java/org/meteoinfo/ndarray/Array.java | 16 +- .../java/org/meteoinfo/ndarray/ArrayDate.java | 12 +- .../org/meteoinfo/ndarray/ArrayDuration.java | 708 ++++++++++++++++++ .../java/org/meteoinfo/ndarray/DataType.java | 11 + .../org/meteoinfo/ndarray/math/ArrayMath.java | 76 ++ .../org/meteoinfo/ndarray/math/ArrayUtil.java | 19 + 10 files changed, 859 insertions(+), 12 deletions(-) create mode 100644 meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayDuration.java diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype$py.class b/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype$py.class index 327d980d2eccbf76df4ee19c76219b3315348c0a..9c26df97735825115c3c6339b0763150f98fa0f5 100644 GIT binary patch literal 18328 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 X4K{hoJ#bi0aGodR8Nr=y&&dA;i_u|= diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype.py b/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype.py index 194920e9..2bea6429 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/_dtype.py @@ -2,7 +2,7 @@ from org.meteoinfo.ndarray import DataType as JDataType __all__ = [ 'byte','char','int','integer','int32','int16','short','int64','uint','long','float','float32','float64', - 'double','str','string','complex','date','datetime' + 'double','str','string','complex','date','datetime','timedelta' ] _dtype_dict = dict(byte = JDataType.BYTE, @@ -26,6 +26,7 @@ _dtype_dict = dict(byte = JDataType.BYTE, complex = JDataType.COMPLEX, date = JDataType.DATE, datetime = JDataType.DATE, + timedelta = JDataType.DURATION, object = JDataType.OBJECT) class DataType(object): @@ -155,6 +156,8 @@ class DataType(object): return 'c' elif self._dtype == JDataType.DATE: return 'M' + elif self._dtype == JDataType.DURATION: + return 'm' elif self._dtype == JDataType.OBJECT: return 'O' @@ -183,6 +186,8 @@ class DataType(object): return DataType('complex') elif c == 'M': return DataType('date') + elif c == 'm': + return DataType('timedelta') else: return DataType('object') @@ -207,6 +212,8 @@ class DataType(object): return dtype.complex elif k == 'M': return dtype.date + elif k == 'm': + return dtype.timedelta else: return dtype.obj @@ -241,6 +248,7 @@ class dtype(DataType): complex = DataType('complex') date = DataType('date') datetime = DataType('date') + timedelta = DataType('timedelta') obj = DataType('object') def __init__(self, name): @@ -282,6 +290,7 @@ string = DataType('string') complex = DataType('complex') date = DataType('date') datetime = DataType('date') +timedelta = DataType('timedelta') obj = DataType('object') def fromjava(dt): diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric$py.class b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric$py.class index cae3b780aa3fc896557d6db9eb2d1d12a1977534..1ce5283eb1c5ed2935358008a0cfa3a825beff0b 100644 GIT binary patch literal 155059 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 SnWO%>)4A7~tNy8Vs{aB8_?X!M diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py index 040d0cc6..8e3147fd 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py @@ -25,7 +25,7 @@ from org.python.core import PyComplex import _dtype from ._ndarray import NDArray -from org.meteoinfo.console.jython import JythonUtil +from org.meteoinfo.jython import JythonUtil # Global variables pi = Math.PI @@ -47,7 +47,7 @@ __all__ = [ 'moveaxis','newaxis','ones','ones_like','outer','peaks','pol2cart','power','radians','reciprocal','reshape', 'repeat','roll','rolling_mean','rot90','round','sec','sign','sin','sinh','shape','smooth5','smooth9','sort', 'spacing','sphere','squeeze','split','sqrt','square','std','swapaxes','take','tan','tanh','tile', - 'transpose','trapz','vdot','unravel_index','var','vstack','zeros','zeros_like' + 'transpose','trapz','to_datetime','vdot','unravel_index','var','vstack','zeros','zeros_like' ] @@ -3064,7 +3064,19 @@ def asmiarray(data): elif isinstance(data, NDArray): return data else: - return array(data) + return array(data) + +def to_datetime(a, format): + """ + Convert string array to datetime array. + + :param a: (*array*) The string array. + :param format: (*string*) Format string. + :return: The datetime array. + """ + a = asarray(a) + r = ArrayUtil.stringToDateArray(a._array, format) + return NDArray(r) def interp2d(*args, **kwargs): """ diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/Array.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/Array.java index ece98f03..2f86c852 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/Array.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/Array.java @@ -34,6 +34,7 @@ package org.meteoinfo.ndarray; import java.math.BigInteger; import java.nio.*; +import java.time.Duration; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; @@ -75,7 +76,7 @@ import java.util.List; * The type, shape and backing storage of an Array are immutable. The data * itself is read or written using an Index or an IndexIterator, which stores * any needed state information for efficient traversal. This makes use of - * Arrays thread-safe (as long as you dont share the Index or IndexIterator) + * Arrays thread-safe (as long as you don't share the Index or IndexIterator) * except for the possibility of non-atomic read/write on long/doubles. If this * is the case, you should probably synchronize your calls. Presumably 64-bit * CPUs will make those operations atomic also. @@ -133,6 +134,8 @@ public abstract class Array { return ArrayComplex.factory(index); } else if (classType == LocalDateTime.class) { return ArrayDate.factory(index); + } else if (classType == Duration.class) { + return ArrayDuration.factory(index); } else { return ArrayObject.factory(DataType.OBJECT, classType, false, index); } @@ -182,6 +185,8 @@ public abstract class Array { return ArrayComplex.factory(index, (Complex[]) storage); case DATE: return ArrayDate.factory(index, (LocalDateTime[]) storage); + case DURATION: + return ArrayDuration.factory(index, (Duration[]) storage); case STRUCTURE: return ArrayObject.factory(dtype, StructureData.class, false, index, (Object[]) storage); case SEQUENCE: @@ -255,6 +260,8 @@ public abstract class Array { return ArrayComplex.factory(indexCalc, (Complex[]) storage); } else if (classType == LocalDateTime.class) { return ArrayDate.factory(indexCalc, (LocalDateTime[]) storage); + } else if (classType == Duration.class) { + return ArrayDuration.factory(indexCalc, (Duration[]) storage); } else { return ArrayObject.factory(classType, indexCalc, (Object[]) storage); } @@ -294,6 +301,8 @@ public abstract class Array { return ArrayComplex.factory(index, (Complex[]) storage); } else if (classType == LocalDateTime.class) { return ArrayDate.factory(index, (LocalDateTime[]) storage); + } else if (classType == Duration.class) { + return ArrayDuration.factory(index, (Duration[]) storage); } else { return new ArrayObject(DataType.OBJECT, classType, false, index, (Object[]) storage); } @@ -546,6 +555,9 @@ public abstract class Array { if (this instanceof ArrayDate) { return DataType.DATE; } + if (this instanceof ArrayDuration) { + return DataType.DURATION; + } if (this instanceof ArrayObject) { return DataType.OBJECT; } @@ -921,7 +933,7 @@ public abstract class Array { * @param dtype type of data * @param shape shape of data; if null, then use int[]{bb.limit()} * @param bb data is in here - * @return equivilent Array + * @return equivalent Array */ public static Array factory(DataType dtype, int[] shape, ByteBuffer bb) { int size; diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayDate.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayDate.java index 640382b6..d43b51f8 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayDate.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayDate.java @@ -39,11 +39,11 @@ import java.nio.DoubleBuffer; import java.time.LocalDateTime; /** - * Concrete implementation of Array specialized for complex. Data storage is - * with 1D java array of complex. + * Concrete implementation of Array specialized for LocalDateTime. Data storage is + * with 1D java array of LocalDateTime. * * @see Array - * @author caron + * @author Yaqiang */ public class ArrayDate extends Array { @@ -54,11 +54,11 @@ public class ArrayDate extends Array { return ArrayDate.factory(index, null); } - /* Create new ArrayComplex with given indexImpl and backing store. + /* Create new ArrayDate with given indexImpl and backing store. * Should be private. * @param index use this Index * @param stor. use this storage. if null, allocate. - * @return. new ArrayDouble.D or ArrayDouble object. + * @return. new ArrayDate.D or ArrayDouble object. */ static ArrayDate factory(Index index, LocalDateTime[] storage) { switch (index.getRank()) { @@ -87,7 +87,7 @@ public class ArrayDate extends Array { protected LocalDateTime[] storage; /** - * Create a new Array of type double and the given shape. dimensions.length + * Create a new Array of type date and the given shape. dimensions.length * determines the rank of the new Array. * * @param shape the shape of the Array. diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayDuration.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayDuration.java new file mode 100644 index 00000000..6f062e75 --- /dev/null +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayDuration.java @@ -0,0 +1,708 @@ +/* + * Copyright 1998-2014 University Corporation for Atmospheric Research/Unidata + * + * Portions of this software were developed by the Unidata Program at the + * University Corporation for Atmospheric Research. + * + * Access and use of this software shall impose the following obligations + * and understandings on the user. The user is granted the right, without + * any fee or cost, to use, copy, modify, alter, enhance and distribute + * this software, and any derivative works thereof, and its supporting + * documentation for any purpose whatsoever, provided that this entire + * notice appears in all copies of the software, derivative works and + * supporting documentation. Further, UCAR requests that the user credit + * UCAR/Unidata in any publications that result from the use of this + * software or in any product that includes this software. The names UCAR + * and/or Unidata, however, may not be used in any advertising or publicity + * to endorse or promote any products or commercial entity unless specific + * written permission is obtained from UCAR/Unidata. The user also + * understands that UCAR/Unidata is not obligated to provide the user with + * any support, consulting, training or assistance of any kind with regard + * to the use, operation and performance of this software nor to provide + * the user with any updates, revisions, new versions or "bug fixes." + * + * THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING + * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE. + */ +package org.meteoinfo.ndarray; + +import org.meteoinfo.common.util.JDateUtil; + +import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; +import java.time.Duration; +import java.time.LocalDateTime; + +/** + * Concrete implementation of Array specialized for time duration. Data storage is + * with 1D java array of Duration. + * + * @see Array + * @author Yaqiang + */ +public class ArrayDuration extends Array { + + /** + * package private. use Array.factory() + */ + static ArrayDuration factory(Index index) { + return ArrayDuration.factory(index, null); + } + + /* Create new ArrayDuration with given indexImpl and backing store. + * Should be private. + * @param index use this Index + * @param stor. use this storage. if null, allocate. + * @return. new ArrayDuration.D or ArrayDuration object. + */ + static ArrayDuration factory(Index index, Duration[] storage) { + switch (index.getRank()) { + case 0: + return new D0(index, storage); + case 1: + return new D1(index, storage); + case 2: + return new D2(index, storage); + case 3: + return new D3(index, storage); + case 4: + return new D4(index, storage); + case 5: + return new D5(index, storage); + case 6: + return new D6(index, storage); + case 7: + return new D7(index, storage); + default: + return new ArrayDuration(index, storage); + } + } + + /////////////////////////////////////////////////////////////////////////////// + protected Duration[] storage; + + /** + * Create a new Array of type double and the given shape. dimensions.length + * determines the rank of the new Array. + * + * @param shape the shape of the Array. + */ + public ArrayDuration(int[] shape) { + super(DataType.DATE, shape); + storage = new Duration[(int) indexCalc.getSize()]; + } + + /** + * create new Array with given indexImpl and the same backing store + * @return New Array view + */ + @Override + protected Array createView(Index index) { + return ArrayDuration.factory(index, storage); + } + + /** + * Create a new Array using the given IndexArray and backing store. used for + * sections, and factory. Trusted package private. + * + * @param ima use this IndexArray as the index + * @param data use this as the backing store. if null, allocate + */ + ArrayDuration(Index ima, Duration[] data) { + super(DataType.DATE, ima); + + if (data != null) { + storage = data; + } else { + storage = new Duration[(int) indexCalc.getSize()]; + } + } + + /* Get underlying primitive array storage. CAUTION! You may invalidate your warrentee! */ + @Override + public Object[] getStorage() { + return storage; + } + + // copy from javaArray to storage using the iterator: used by factory( Object); + @Override + protected void copyFrom1DJavaArray(IndexIterator iter, Object javaArray) { + LocalDateTime[] ja = (LocalDateTime[]) javaArray; + for (LocalDateTime aJa : ja) { + iter.setDateNext(aJa); + } + } + + // copy to javaArray from storage using the iterator: used by copyToNDJavaArray; + @Override + protected void copyTo1DJavaArray(IndexIterator iter, Object javaArray) { + LocalDateTime[] ja = (LocalDateTime[]) javaArray; + for (int i = 0; i < ja.length; i++) { + ja[i] = iter.getDateNext(); + } + } + + @Override + public ByteBuffer getDataAsByteBuffer() { + ByteBuffer bb = ByteBuffer.allocate((int) (8 * getSize())); + DoubleBuffer ib = bb.asDoubleBuffer(); + ib.put((double[]) get1DJavaArray(double.class)); // make sure its in canonical order + return bb; + } + + /** + * Return the element class type + * @return Element class type + */ + @Override + public Class getElementType() { + return LocalDateTime.class; + } + + /** + * get the value at the specified index. + * @param i + * @return + */ + public Duration get(Index i) { + return storage[i.currentElement()]; + } + + /** + * set the value at the specified index. + * @param i + * @param value + */ + public void set(Index i, Duration value) { + storage[i.currentElement()] = value; + } + + public double getDouble(Index i) { + return storage[i.currentElement()].getSeconds(); + } + + public void setDouble(Index i, double value) { + storage[i.currentElement()] = Duration.ofSeconds(Math.round(value)); + } + + public float getFloat(Index i) { + return storage[i.currentElement()].getSeconds(); + } + + public void setFloat(Index i, float value) { + storage[i.currentElement()] = Duration.ofSeconds(Math.round(value)); + } + + public long getLong(Index i) { + return storage[i.currentElement()].getSeconds(); + } + + public void setLong(Index i, long value) { + storage[i.currentElement()] = Duration.ofSeconds(value); + } + + public int getInt(Index i) { + return (int) storage[i.currentElement()].getSeconds(); + } + + public void setInt(Index i, int value) { + storage[i.currentElement()] = Duration.ofSeconds(value); + } + + public short getShort(Index i) { + throw new ForbiddenConversionException(); + } + + public void setShort(Index i, short value) { + throw new ForbiddenConversionException(); + } + + public byte getByte(Index i) { + throw new ForbiddenConversionException(); + } + + public void setByte(Index i, byte value) { + throw new ForbiddenConversionException(); + } + + public char getChar(Index i) { + throw new ForbiddenConversionException(); + } + + public void setChar(Index i, char value) { + throw new ForbiddenConversionException(); + } + + /** + * not legal, throw ForbiddenConversionException + */ + public boolean getBoolean(Index i) { + throw new ForbiddenConversionException(); + } + + /** + * not legal, throw ForbiddenConversionException + */ + public void setBoolean(Index i, boolean value) { + throw new ForbiddenConversionException(); + } + + /** + * not legal, throw ForbiddenConversionException + */ + public String getString(Index i) { + return this.storage[i.currentElement()].toString(); + } + + /** + * not legal, throw ForbiddenConversionException + */ + public void setString(Index i, String value) { + throw new ForbiddenConversionException(); + } + + /** + * not legal, throw ForbiddenConversionException + */ + public Complex getComplex(Index i) { throw new ForbiddenConversionException(); } + + /** + * not legal, throw ForbiddenConversionException + */ + public void setComplex(Index i, Complex value) { throw new ForbiddenConversionException(); } + + public LocalDateTime getDate(Index i) { throw new ForbiddenConversionException(); } + + public void setDate(Index i, LocalDateTime value) { throw new ForbiddenConversionException(); } + + public Duration getDuration(Index i) { + return storage[i.currentElement()]; + } + + public void setDuration(Index i, Duration value) { + storage[i.currentElement()] = value; + } + + public Object getObject(Index i) { + return storage[i.currentElement()]; + } + + public void setObject(Index i, Object value) { + storage[i.currentElement()] = (Duration) value; + } + + // trusted, assumes that individual dimension lengths have been checked + public double getDouble(int index) { + return storage[index].getSeconds(); + } + + public void setDouble(int index, double value) { + storage[index] = Duration.ofSeconds(Math.round(value)); + } + + public float getFloat(int index) { + return storage[index].getSeconds(); + } + + public void setFloat(int index, float value) { + storage[index] = Duration.ofSeconds(Math.round(value)); + } + + public long getLong(int index) { + return storage[index].getSeconds(); + } + + public void setLong(int index, long value) { + storage[index] = Duration.ofSeconds(value); + } + + public int getInt(int index) { + return (int) storage[index].getSeconds(); + } + + public void setInt(int index, int value) { + storage[index] = Duration.ofSeconds(value); + } + + public short getShort(int index) { + throw new ForbiddenConversionException(); + } + + public void setShort(int index, short value) { + throw new ForbiddenConversionException(); + } + + public byte getByte(int index) { + throw new ForbiddenConversionException(); + } + + public void setByte(int index, byte value) { + throw new ForbiddenConversionException(); + } + + public char getChar(int index) { + throw new ForbiddenConversionException(); + } + + public void setChar(int index, char value) { + throw new ForbiddenConversionException(); + } + + public boolean getBoolean(int index) { + throw new ForbiddenConversionException(); + } + + public void setBoolean(int index, boolean value) { + throw new ForbiddenConversionException(); + } + + public String getString(int index) { + return this.storage[index].toString(); + } + + public void setString(int index, String value) { + throw new ForbiddenConversionException(); + } + + public Complex getComplex(int index) { + throw new ForbiddenConversionException(); + } + + public void setComplex(int index, Complex value) { throw new ForbiddenConversionException(); } + + public LocalDateTime getDate(int index) { throw new ForbiddenConversionException(); } + + public void setDate(int index, LocalDateTime value) { throw new ForbiddenConversionException(); } + + public Duration getDuration(int index) { + return storage[index]; + } + + public void setDuration(int index, Duration value) { + storage[index] = value; + } + + public Object getObject(int index) { + return getDate(index); + } + + public void setObject(int index, Object value) { + storage[index] = (Duration) value; + } + + /** + * Concrete implementation of Array specialized for doubles, rank 0. + */ + public static class D0 extends ArrayDuration { + + private Index0D ix; + + /** + * Constructor. + */ + public D0() { + super(new int[]{}); + ix = (Index0D) indexCalc; + } + + private D0(Index i, Duration[] store) { + super(i, store); + ix = (Index0D) indexCalc; + } + + /** + * get the value. + * @return + */ + public Duration get() { + return storage[ix.currentElement()]; + } + + /** + * set the value. + * @param value + */ + public void set(Duration value) { + storage[ix.currentElement()] = value; + } + } + + /** + * Concrete implementation of Array specialized for doubles, rank 1. + */ + public static class D1 extends ArrayDuration { + + private Index1D ix; + + /** + * Constructor for array of shape {len0}. + * @param len0 + */ + public D1(int len0) { + super(new int[]{len0}); + ix = (Index1D) indexCalc; + } + + private D1(Index i, Duration[] store) { + super(i, store); + ix = (Index1D) indexCalc; + } + + /** + * get the value. + * @param i + * @return + */ + public Duration get(int i) { + return storage[ix.setDirect(i)]; + } + + /** + * set the value. + * @param i + * @param value + */ + public void set(int i, Duration value) { + storage[ix.setDirect(i)] = value; + } + } + + /** + * Concrete implementation of Array specialized for doubles, rank 2. + */ + public static class D2 extends ArrayDuration { + + private Index2D ix; + + /** + * Constructor for array of shape {len0,len1}. + */ + public D2(int len0, int len1) { + super(new int[]{len0, len1}); + ix = (Index2D) indexCalc; + } + + private D2(Index i, Duration[] store) { + super(i, store); + ix = (Index2D) indexCalc; + } + + /** + * get the value. + */ + public Duration get(int i, int j) { + return storage[ix.setDirect(i, j)]; + } + + /** + * set the value. + */ + public void set(int i, int j, Duration value) { + storage[ix.setDirect(i, j)] = value; + } + } + + /** + * Concrete implementation of Array specialized for doubles, rank 3. + */ + public static class D3 extends ArrayDuration { + + private Index3D ix; + + /** + * Constructor for array of shape {len0,len1,len2}. + */ + public D3(int len0, int len1, int len2) { + super(new int[]{len0, len1, len2}); + ix = (Index3D) indexCalc; + } + + private D3(Index i, Duration[] store) { + super(i, store); + ix = (Index3D) indexCalc; + } + + /** + * get the value. + */ + public Duration get(int i, int j, int k) { + return storage[ix.setDirect(i, j, k)]; + } + + /** + * set the value. + */ + public void set(int i, int j, int k, Duration value) { + storage[ix.setDirect(i, j, k)] = value; + } + + public IF getIF() { + return new IF(); + } + + public class IF { + + private int currElement = -1; + private int size = (int) ix.getSize(); + + public boolean hasNext(int howMany) { + return currElement < size - howMany; + } + + public Duration getNext() { + return storage[++currElement]; + } + + public void setNext(Duration val) { + storage[++currElement] = val; + } + } + } + + /** + * Concrete implementation of Array specialized for doubles, rank 4. + */ + public static class D4 extends ArrayDuration { + + private Index4D ix; + + /** + * Constructor for array of shape {len0,len1,len2,len3}. + */ + public D4(int len0, int len1, int len2, int len3) { + super(new int[]{len0, len1, len2, len3}); + ix = (Index4D) indexCalc; + } + + private D4(Index i, Duration[] store) { + super(i, store); + ix = (Index4D) indexCalc; + } + + /** + * get the value. + */ + public Duration get(int i, int j, int k, int l) { + return storage[ix.setDirect(i, j, k, l)]; + } + + /** + * set the value. + */ + public void set(int i, int j, int k, int l, Duration value) { + storage[ix.setDirect(i, j, k, l)] = value; + } + } + + /** + * Concrete implementation of Array specialized for doubles, rank 5. + */ + public static class D5 extends ArrayDuration { + + private Index5D ix; + + /** + * Constructor for array of shape {len0,len1,len2,len3,len4}. + */ + public D5(int len0, int len1, int len2, int len3, int len4) { + super(new int[]{len0, len1, len2, len3, len4}); + ix = (Index5D) indexCalc; + } + + private D5(Index i, Duration[] store) { + super(i, store); + ix = (Index5D) indexCalc; + } + + /** + * get the value. + */ + public Duration get(int i, int j, int k, int l, int m) { + return storage[ix.setDirect(i, j, k, l, m)]; + } + + /** + * set the value. + */ + public void set(int i, int j, int k, int l, int m, Duration value) { + storage[ix.setDirect(i, j, k, l, m)] = value; + } + } + + /** + * Concrete implementation of Array specialized for doubles, rank 6. + */ + public static class D6 extends ArrayDuration { + + private Index6D ix; + + /** + * Constructor for array of shape {len0,len1,len2,len3,len4,len5,}. + */ + public D6(int len0, int len1, int len2, int len3, int len4, int len5) { + super(new int[]{len0, len1, len2, len3, len4, len5}); + ix = (Index6D) indexCalc; + } + + private D6(Index i, Duration[] store) { + super(i, store); + ix = (Index6D) indexCalc; + } + + /** + * get the value. + */ + public Duration get(int i, int j, int k, int l, int m, int n) { + return storage[ix.setDirect(i, j, k, l, m, n)]; + } + + /** + * set the value. + */ + public void set(int i, int j, int k, int l, int m, int n, Duration value) { + storage[ix.setDirect(i, j, k, l, m, n)] = value; + } + } + + /** + * Concrete implementation of Array specialized for doubles, rank 7. + */ + public static class D7 extends ArrayDuration { + + private Index7D ix; + + /** + * Constructor for array of shape {len0,len1,len2,len3,len4,len5,len6}. + */ + public D7(int len0, int len1, int len2, int len3, int len4, int len5, int len6) { + super(new int[]{len0, len1, len2, len3, len4, len5, len6}); + ix = (Index7D) indexCalc; + } + + private D7(Index i, Duration[] store) { + super(i, store); + ix = (Index7D) indexCalc; + } + + /** + * get the value. + */ + public Duration get(int i, int j, int k, int l, int m, int n, int o) { + return storage[ix.setDirect(i, j, k, l, m, n, o)]; + } + + /** + * set the value. + */ + public void set(int i, int j, int k, int l, int m, int n, int o, Duration value) { + storage[ix.setDirect(i, j, k, l, m, n, o)] = value; + } + } + +} diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/DataType.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/DataType.java index 12f7313d..edb0f167 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/DataType.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/DataType.java @@ -34,6 +34,7 @@ package org.meteoinfo.ndarray; import java.math.BigInteger; import java.nio.ByteBuffer; +import java.time.Duration; import java.time.LocalDateTime; /** @@ -53,6 +54,7 @@ public enum DataType { DOUBLE("double", 8, double.class, false, 12), COMPLEX("complex", 1, Complex.class, false, 15), DATE("date", 1, LocalDateTime.class, false, 21), + DURATION("duration", 1, Duration.class, false, 17), // object types SEQUENCE("Sequence", 4, StructureDataIterator.class, false, 22), // 32-bit index @@ -330,6 +332,9 @@ public enum DataType { if (c == LocalDateTime.class) { return DataType.DATE; } + if (c == Duration.class) { + return DataType.DURATION; + } if (c == StructureData.class) { return DataType.STRUCTURE; } @@ -367,6 +372,12 @@ public enum DataType { return isUnsigned ? DataType.ULONG : DataType.LONG; if (c == String.class) return DataType.STRING; + if (c == Complex.class) + return DataType.COMPLEX; + if (c == LocalDateTime.class) + return DataType.DATE; + if (c == Duration.class) + return DataType.DURATION; if (c == StructureData.class) return DataType.STRUCTURE; if (c == StructureDataIterator.class) diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java index b4923588..44b10388 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java @@ -321,6 +321,8 @@ public class ArrayMath { return ArrayMath.addDouble(a, b); case COMPLEX: return ArrayMath.addComplex(a, b); + case STRING: + return ArrayMath.addString(a, b); } return null; } @@ -369,6 +371,17 @@ public class ArrayMath { return addComplex(a, b); } + /** + * Array add + * + * @param a Array a + * @param b String b + * @return Added array + */ + public static Array add(Array a, String b) { + return addString(a, b); + } + private static Array addInt(Array a, Array b) { int broadcast = broadcastCheck(a, b); switch (broadcast) { @@ -773,6 +786,69 @@ public class ArrayMath { return r; } + private static Array addString(Array a, Array b) { + int broadcast = broadcastCheck(a, b); + switch (broadcast) { + case 0: + Array r = Array.factory(DataType.STRING, a.getShape()); + if (a.getIndexPrivate().isFastIterator() && b.getIndexPrivate().isFastIterator()) { + String va, vb; + for (int i = 0; i < r.getSize(); i++) { + va = a.getString(i); + vb = b.getString(i); + r.setString(i,va + vb); + } + } else { + IndexIterator iterR = r.getIndexIterator(); + IndexIterator iterA = a.getIndexIterator(); + IndexIterator iterB = b.getIndexIterator(); + String va, vb; + while (iterA.hasNext()) { + va = iterA.getStringNext(); + vb = iterB.getStringNext(); + iterR.setStringNext(va + vb); + } + } + return r; + case 1: + int[] shape = broadcast(a, b); + r = Array.factory(DataType.STRING, shape); + Index index = r.getIndex(); + Index aindex = a.getIndex(); + Index bindex = b.getIndex(); + int n = r.getRank(); + int na = a.getRank(); + int nb = b.getRank(); + int[] current; + for (int i = 0; i < r.getSize(); i++) { + current = index.getCurrentCounter(); + setIndex(aindex, bindex, current, n, na, nb); + r.setString(i, a.getString(aindex) + b.getString(bindex)); + index.incr(); + } + return r; + default: + return null; + } + } + + private static Array addString(Array a, String b) { + Array r = Array.factory(DataType.STRING, a.getShape()); + if (a.getIndexPrivate().isFastIterator()) { + for (int i = 0; i < r.getSize(); i++) { + r.setString(i, a.getString(i) + b); + } + } else { + IndexIterator iterR = r.getIndexIterator(); + IndexIterator iterA = a.getIndexIterator(); + while (iterA.hasNext()) { + iterR.setStringNext(iterA.getStringNext() + b); + } + } + + return r; + } + /** * Array subtract * diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java index af5fbb2e..4adc83f3 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java @@ -21,6 +21,7 @@ import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; @@ -2209,6 +2210,24 @@ public class ArrayUtil { return r; } + /** + * Convert string array to datetime array + * @param s The string array + * @param format Datetime format string + * @return Datetime array + */ + public static Array stringToDateArray(Array s, String format) { + Array r = Array.factory(DataType.DATE, s.getShape()); + IndexIterator iterS = s.getIndexIterator(); + IndexIterator iterR = r.getIndexIterator(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); + while(iterS.hasNext()) { + iterR.setDateNext(LocalDateTime.parse(iterS.getStringNext(), formatter)); + } + + return r; + } + /** * Convert char array encoding from UTF-8 * @param a Char array