From 89b3b81ab35da51ec2dd9ab0669e9f056aeaddf1 Mon Sep 17 00:00:00 2001 From: Nate Jensen Date: Tue, 29 Oct 2013 09:47:28 -0500 Subject: [PATCH] Issue #2476 fixed crash, added short[] numpy support, removed gfe wx/discrete string keys hack, cleaned up jep numpy interfaces and code Former-commit-id: a18df075865e28d999c357bf97f567324a78829f [formerly 554a9cddf39e3f7e36fab85cfe8ab6e14a0a736f] [formerly f3143ba7b47affa765fbfaaa16a37bcf9f298f35] [formerly a18df075865e28d999c357bf97f567324a78829f [formerly 554a9cddf39e3f7e36fab85cfe8ab6e14a0a736f] [formerly f3143ba7b47affa765fbfaaa16a37bcf9f298f35] [formerly 6880a18f1a059143f6af8fec62db7d9104566e42 [formerly f3143ba7b47affa765fbfaaa16a37bcf9f298f35 [formerly 0c24c900ce938982306bad9307f3b1ef27b362bb]]]] Former-commit-id: 6880a18f1a059143f6af8fec62db7d9104566e42 Former-commit-id: dced4c4d11e715f1512e42d36834668290199018 [formerly 19043faeaae6f64db04a849515391aac35da44ee] [formerly df19f622b8df95f3d1447cd1c6c599d088ba4b1c [formerly f2751f017ec69dc56b3c21928b9464538d97a685]] Former-commit-id: 15fd50423e5c76bf2d7d7f54653759492ef97c8d [formerly e8c199f1086fca7a7824d8157d9cb727fe132cc7] Former-commit-id: f2184b93794e90c31607c84126898b0600625680 --- .../core/interp/InterpolationContainer.java | 4 +- .../derivparam/python/MasterDerivScript.java | 15 +-- .../function/CapeFuncPythonAdapter.java | 2 +- .../gfe/userPython/utilities/SmartScript.py | 32 +++-- .../python/query/DBSSClient.py | 19 ++- .../gfe/core/griddata/DiscreteGridData.java | 2 +- .../gfe/core/griddata/WeatherGridData.java | 2 +- .../core/parm/vcparm/CalcVcModGridArg.java | 13 +- .../smarttool/script/SmartToolController.java | 11 +- cots/org.jep/jep.jar | Bin 51677 -> 51688 bytes .../edex/plugin/gfe/smartinit/FakeTopo.java | 77 ------------ .../edex_static/base/smartinit/Init.py | 50 +++++--- .../gfe/db/objects/GridLocation.java | 4 +- .../dataplugin/gfe/grid/Grid2DBoolean.java | 2 +- .../dataplugin/gfe/grid/Grid2DByte.java | 2 +- .../dataplugin/gfe/grid/Grid2DFloat.java | 2 +- .../gfe/slice/DiscreteGridSlice.java | 22 ++-- .../gfe/slice/PythonWeatherGridSlice.java | 4 +- .../dataplugin/gfe/slice/ScalarGridSlice.java | 2 +- .../dataplugin/gfe/slice/VectorGridSlice.java | 2 +- .../gfe/slice/WeatherGridSlice.java | 22 ++-- .../common/python/PythonNumpyFloatArray.java | 4 +- .../python/decoder/PythonNumpyByteArray.java | 4 +- .../jepp-2.3/src/jep/INumpyable.java | 18 ++- .../rary.cots.jepp/jepp-2.3/src/jep/Jep.java | 6 +- .../jepp-2.3/src/jep/pyjobject.c | 115 +++++------------- .../jepp-2.3/src/jep/pyjobject.h | 3 +- .../rary.cots.jepp/jepp-2.3/src/jep/util.c | 107 +++++++++++++++- .../rary.cots.jepp/jepp-2.3/src/jep/util.h | 8 +- .../viz/gfe/contours/TestContourAnalyzer.java | 4 +- 30 files changed, 284 insertions(+), 274 deletions(-) delete mode 100644 edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/smartinit/FakeTopo.java diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/interp/InterpolationContainer.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/interp/InterpolationContainer.java index eaacba9507..4a602dcbf4 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/interp/InterpolationContainer.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/interp/InterpolationContainer.java @@ -61,10 +61,10 @@ public class InterpolationContainer implements INumpyable { /* * (non-Javadoc) * - * @see jep.INumpyable#getNumPy() + * @see jep.INumpyable#getNumpy() */ @Override - public Object[] getNumPy() { + public Object[] getNumpy() { // todo return new Object[] { xValues, yValues, zValues }; } diff --git a/cave/com.raytheon.uf.viz.derivparam.python/src/com/raytheon/uf/viz/derivparam/python/MasterDerivScript.java b/cave/com.raytheon.uf.viz.derivparam.python/src/com/raytheon/uf/viz/derivparam/python/MasterDerivScript.java index 494bfd7f9a..3e89a873d6 100644 --- a/cave/com.raytheon.uf.viz.derivparam.python/src/com/raytheon/uf/viz/derivparam/python/MasterDerivScript.java +++ b/cave/com.raytheon.uf.viz.derivparam.python/src/com/raytheon/uf/viz/derivparam/python/MasterDerivScript.java @@ -49,6 +49,7 @@ import com.raytheon.uf.viz.derivparam.tree.CubeLevel; * Jul 8, 2008 njensen Initial creation * Nov 20, 2009 #3387 jelkins Use derived script's variableId instead of filename * Nov 21, 2009 #3576 rjpeter Refactored to populate DerivParamDesc. + * Oct 29, 2013 2476 njensen Renamed numeric methods to numpy * * * @author njensen @@ -214,7 +215,7 @@ public class MasterDerivScript extends PythonInterpreter { argKey += "_" + Integer.toHexString((val.hashCode())); } - // setNumeric won't work with indexed objects + // setNumpy won't work with indexed objects evaluateArgument(argKey, val); jep.eval(argName + ".append(" + argKey + ")"); } @@ -231,7 +232,7 @@ public class MasterDerivScript extends PythonInterpreter { for (int argIdx = 0; argIdx < valList.length; argIdx++) { IDataRecord val = valList[argIdx]; jep.eval(argName + ".append(None)"); - // setNumeric won't work with indexed objects + // setNumpy won't work with indexed objects evaluateArgument("__tmp", val); jep.eval(argName + "[" + argIdx + "] = __tmp"); } @@ -241,10 +242,10 @@ public class MasterDerivScript extends PythonInterpreter { setDataRecordArg(argName, (IDataRecord) argValue); } else if (argValue instanceof float[]) { float[] val = (float[]) argValue; - jep.setNumeric(argName, val, val.length, 1); + jep.setNumpy(argName, val, val.length, 1); } else if (argValue instanceof int[]) { int[] val = (int[]) argValue; - jep.setNumeric(argName, val, val.length, 1); + jep.setNumpy(argName, val, val.length, 1); } else if (argValue instanceof Float) { jep.set(argName, (argValue)); } else if (argValue instanceof DerivedParameterRequest) { @@ -401,7 +402,7 @@ public class MasterDerivScript extends PythonInterpreter { if (argValue instanceof FloatDataRecord) { FloatDataRecord record = (FloatDataRecord) argValue; if (sizes.length == 2) { - jep.setNumeric(argName, record.getFloatData(), (int) sizes[0], + jep.setNumpy(argName, record.getFloatData(), (int) sizes[0], (int) sizes[1]); reshape = false; } else { @@ -415,7 +416,7 @@ public class MasterDerivScript extends PythonInterpreter { } else if (argValue instanceof IntegerDataRecord) { IntegerDataRecord record = (IntegerDataRecord) argValue; if (sizes.length == 2) { - jep.setNumeric(argName, record.getIntData(), (int) sizes[0], + jep.setNumpy(argName, record.getIntData(), (int) sizes[0], (int) sizes[1]); reshape = false; } else { @@ -424,7 +425,7 @@ public class MasterDerivScript extends PythonInterpreter { } else if (argValue instanceof ByteDataRecord) { ByteDataRecord record = (ByteDataRecord) argValue; if (sizes.length == 2) { - jep.setNumeric(argName, record.getByteData(), (int) sizes[0], + jep.setNumpy(argName, record.getByteData(), (int) sizes[0], (int) sizes[1]); reshape = false; } else { diff --git a/cave/com.raytheon.uf.viz.derivparam.python/src/com/raytheon/uf/viz/derivparam/python/function/CapeFuncPythonAdapter.java b/cave/com.raytheon.uf.viz.derivparam.python/src/com/raytheon/uf/viz/derivparam/python/function/CapeFuncPythonAdapter.java index 09d64920bf..6448eb18eb 100644 --- a/cave/com.raytheon.uf.viz.derivparam.python/src/com/raytheon/uf/viz/derivparam/python/function/CapeFuncPythonAdapter.java +++ b/cave/com.raytheon.uf.viz.derivparam.python/src/com/raytheon/uf/viz/derivparam/python/function/CapeFuncPythonAdapter.java @@ -59,7 +59,7 @@ public class CapeFuncPythonAdapter { } @Override - public Object[] getNumPy() { + public Object[] getNumpy() { return new Object[] { cape, cin }; } diff --git a/cave/com.raytheon.viz.gfe/localization/gfe/userPython/utilities/SmartScript.py b/cave/com.raytheon.viz.gfe/localization/gfe/userPython/utilities/SmartScript.py index 7b9a7b7f18..93797c1dc7 100644 --- a/cave/com.raytheon.viz.gfe/localization/gfe/userPython/utilities/SmartScript.py +++ b/cave/com.raytheon.viz.gfe/localization/gfe/userPython/utilities/SmartScript.py @@ -50,6 +50,7 @@ # so mask can be used with advanced indexing # (e.g. grid[mask] = value) # Oct 07, 2013 2424 randerso remove use of pytz +# Oct 29, 2013 2476 njensen Improved getting wx/discrete keys in _getGridResults # ######################################################################## import types, string, time, sys @@ -463,24 +464,31 @@ class SmartScript(BaseTool.BaseTool): elif "List" == mode: xlated = [] for rgrid in result: - xlgrid = rgrid.getGridSlice() - xlgrid = xlgrid.__numpy__ + jxlgrid = rgrid.getGridSlice() + xlgrid = jxlgrid.__numpy__ if len(xlgrid) == 1: - xlgrid = xlgrid[0]; - elif len(xlgrid) == 2 and isinstance(xlgrid[1], str): - xlgrid[1] = eval(xlgrid[1]) + if xlgrid[0].dtype != numpy.int8: + # scalar + xlgrid = xlgrid[0] + else: + # discrete or weather + keys = JUtil.javaObjToPyVal(jxlgrid.getKeyList()) + xlgrid.append(keys) xlated.append(xlgrid) retVal = xlated else: result = result[0]; - result = result.getGridSlice() - result = result.__numpy__ + slice = result.getGridSlice() + result = slice.__numpy__ if len(result) == 1: - retVal = result[0] - elif len(result) == 2 and isinstance(result[1], str): - retVal = (result[0], eval(result[1])) - else: - retVal = (result[0], result[1]) + if result[0].dtype != numpy.int8: + # scalar + result = result[0] + else: + # discrete or weather + keys = JUtil.javaObjToPyVal(slice.getKeyList()) + result.append(keys) + retVal = result if retVal is None or retVal == []: if noDataError == 1: diff --git a/cave/com.raytheon.viz.gfe/python/query/DBSSClient.py b/cave/com.raytheon.viz.gfe/python/query/DBSSClient.py index 7ea3a28797..fa95809a08 100644 --- a/cave/com.raytheon.viz.gfe/python/query/DBSSClient.py +++ b/cave/com.raytheon.viz.gfe/python/query/DBSSClient.py @@ -17,12 +17,14 @@ # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. ## -import DatabaseID, AbsTime +import DatabaseID, AbsTime, JUtil from com.raytheon.uf.common.dataplugin.gfe.db.objects import DatabaseID as JavaDatabaseID from com.raytheon.uf.common.dataplugin.gfe.reference import ReferenceID from com.raytheon.uf.common.dataplugin.gfe.db.objects import ParmID +from numpy import int8 + class DBSSWE: def __init__(self, parm): self._parm = parm @@ -47,12 +49,17 @@ class DBSSWE: self._parm.getGridInventory()): if t == key: #return g.pyData() - g.populate() - result = g.getGridSlice().__numpy__ + g.populate() + slice = g.getGridSlice() + result = slice.__numpy__ if len(result) == 1: - result = result[0] - elif len(result) == 2 and isinstance(result[1], str): - result[1] = eval(result[1]) + if result[0].dtype != int8: + # scalar + result = result[0] + else: + # discrete or weather + dkeys = JUtil.javaObjToPyVal(slice.getKeyList()) + result.append(dkeys) return result return None diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/griddata/DiscreteGridData.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/griddata/DiscreteGridData.java index a5b7c2ae5c..ad1dbe8e5a 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/griddata/DiscreteGridData.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/griddata/DiscreteGridData.java @@ -840,7 +840,7 @@ public class DiscreteGridData extends AbstractGridData implements INumpyable { } @Override - public Object[] getNumPy() { + public Object[] getNumpy() { return new Object[] { this.getGrid().getBuffer().array() }; } diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/griddata/WeatherGridData.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/griddata/WeatherGridData.java index fd24fb53bf..98bb91ccd4 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/griddata/WeatherGridData.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/griddata/WeatherGridData.java @@ -817,7 +817,7 @@ public class WeatherGridData extends AbstractGridData implements INumpyable { } @Override - public Object[] getNumPy() { + public Object[] getNumpy() { return new Object[] { this.getGrid().getBuffer().array() }; } diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/vcparm/CalcVcModGridArg.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/vcparm/CalcVcModGridArg.java index 461e689170..0ebaecbc42 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/vcparm/CalcVcModGridArg.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/core/parm/vcparm/CalcVcModGridArg.java @@ -48,6 +48,7 @@ import com.raytheon.viz.gfe.core.griddata.WeatherGridData; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Jan 12, 2012 dgilling Initial creation + * Oct 29, 2013 2476 njensen Renamed numeric methods to numpy * * * @@ -117,7 +118,7 @@ public class CalcVcModGridArg implements IVcModuleArgument { ScalarGridData grid = (ScalarGridData) gd; Grid2DFloat f = (grid.getScalarSlice()).getScalarGrid(); String name = prefix + "grid"; - jep.setNumeric(name, f.getFloats(), f.getXdim(), f.getYdim()); + jep.setNumpy(name, f.getFloats(), f.getXdim(), f.getYdim()); jepString.append(name); jepString.append(", "); tempGridNames.add(name); @@ -127,9 +128,9 @@ public class CalcVcModGridArg implements IVcModuleArgument { Grid2DFloat dir = (grid.getVectorSlice()).getDirGrid(); String magName = prefix + "Mag"; String dirName = prefix + "Dir"; - jep.setNumeric(magName, mag.getFloats(), mag.getXdim(), + jep.setNumpy(magName, mag.getFloats(), mag.getXdim(), mag.getYdim()); - jep.setNumeric(dirName, dir.getFloats(), dir.getXdim(), + jep.setNumpy(dirName, dir.getFloats(), dir.getXdim(), dir.getYdim()); jepString.append('('); jepString.append(magName); @@ -142,7 +143,7 @@ public class CalcVcModGridArg implements IVcModuleArgument { WeatherGridData grid = (WeatherGridData) gd; Grid2DByte bytes = grid.getWeatherSlice().getWeatherGrid(); String name = prefix + "grid"; - jep.setNumeric(name, bytes.getBytes(), bytes.getXdim(), + jep.setNumpy(name, bytes.getBytes(), bytes.getXdim(), bytes.getYdim()); jepString.append('('); jepString.append(name); @@ -159,7 +160,7 @@ public class CalcVcModGridArg implements IVcModuleArgument { DiscreteGridData grid = (DiscreteGridData) gd; Grid2DByte bytes = grid.getDiscreteSlice().getDiscreteGrid(); String name = prefix + "grid"; - jep.setNumeric(name, bytes.getBytes(), bytes.getXdim(), + jep.setNumpy(name, bytes.getBytes(), bytes.getXdim(), bytes.getYdim()); jepString.append('('); jepString.append(name); @@ -175,7 +176,7 @@ public class CalcVcModGridArg implements IVcModuleArgument { } String maskName = prefix + "mask"; - jep.setNumeric(maskName, mask.getBytes(), mask.getXdim(), + jep.setNumpy(maskName, mask.getBytes(), mask.getXdim(), mask.getYdim()); jepString.append(maskName); sb.append(jepString); diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/smarttool/script/SmartToolController.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/smarttool/script/SmartToolController.java index 4c81b4319a..cb64d5e49e 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/smarttool/script/SmartToolController.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/smarttool/script/SmartToolController.java @@ -69,6 +69,7 @@ import com.raytheon.viz.gfe.core.wxvalue.WxValue; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Oct 20, 2008 njensen Initial creation + * Oct 29, 2013 2476 njensen Renamed numeric methods to numpy * * * @author njensen @@ -178,7 +179,7 @@ public class SmartToolController extends BaseGfePyController { if (parmToEdit == null) { return null; } else { - return getNumericResult(parmToEdit.getGridInfo().getGridType()); + return getNumpyResult(parmToEdit.getGridInfo().getGridType()); } } @@ -246,7 +247,7 @@ public class SmartToolController extends BaseGfePyController { * @return the result of the execution in Java format * @throws JepException */ - protected Object getNumericResult(GridType type) throws JepException { + protected Object getNumpyResult(GridType type) throws JepException { Object result = null; boolean resultFound = (Boolean) jep.getValue(RESULT + " is not None"); @@ -308,9 +309,9 @@ public class SmartToolController extends BaseGfePyController { Grid2DFloat dir = (grid.getVectorSlice()).getDirGrid(); String magName = argName + "Mag"; String dirName = argName + "Dir"; - jep.setNumeric(magName, mag.getFloats(), mag.getXdim(), + jep.setNumpy(magName, mag.getFloats(), mag.getXdim(), mag.getYdim()); - jep.setNumeric(dirName, dir.getFloats(), dir.getXdim(), + jep.setNumpy(dirName, dir.getFloats(), dir.getXdim(), dir.getYdim()); jep.eval(argName + " = [" + magName + ", " + dirName + "]"); jep.eval(magName + " = None"); @@ -318,7 +319,7 @@ public class SmartToolController extends BaseGfePyController { } else if (argValue instanceof ScalarGridData) { ScalarGridData grid = (ScalarGridData) argValue; Grid2DFloat f = (grid.getScalarSlice()).getScalarGrid(); - jep.setNumeric(argName, f.getFloats(), f.getXdim(), f.getYdim()); + jep.setNumpy(argName, f.getFloats(), f.getXdim(), f.getYdim()); } else if (argValue instanceof DiscreteGridData) { DiscreteGridData grid = (DiscreteGridData) argValue; jep.set("discreteGridData", grid); diff --git a/cots/org.jep/jep.jar b/cots/org.jep/jep.jar index a9d1006b65ee928947942a4614b63ce2906d4030..8c379a7cb51b85a1bfa8c7a5d017d2a954c492b6 100644 GIT binary patch delta 3725 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 - * SOFTWARE HISTORY - * Date Ticket# Engineer Description - * ------------ ---------- ----------- -------------------------- - * May 1, 2008 njensen Initial creation - * - * - * - * @author njensen - * @version 1.0 - */ - -public class FakeTopo implements INumpyable { - - // TODO need real topo databases! - - private static final int x = 145; - - private static final int y = 145; - - /* - * (non-Javadoc) - * - * @see jep.INumpyable#getNumPy() - */ - @Override - public Object[] getNumPy() { - return new Object[] { new float[x * y] }; - } - - /* - * (non-Javadoc) - * - * @see jep.INumpyable#getNumpyX() - */ - @Override - public int getNumpyX() { - return x; - } - - /* - * (non-Javadoc) - * - * @see jep.INumpyable#getNumpyY() - */ - @Override - public int getNumpyY() { - return y; - } - -} diff --git a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/smartinit/Init.py b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/smartinit/Init.py index 2b69ed97f1..bb8c4fd59e 100644 --- a/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/smartinit/Init.py +++ b/edexOsgi/com.raytheon.edex.plugin.gfe/utility/edex_static/base/smartinit/Init.py @@ -28,6 +28,7 @@ # 04/04/13 #1787 randerso fix validTime check to work with accumulative parms # fix logging so you can actually determine why # a smartInit is not calculating a parameter +# Oct 29, 2013 2476 njensen Improved getting wx/discrete keys when retrieving data # ## import string, sys, re, time, types, getopt, fnmatch, LogStream, DatabaseID, JUtil, AbsTime, TimeRange @@ -967,12 +968,16 @@ class Forecaster(GridUtilities): pytr = TimeRange.encodeJavaTimeRange(tr) pkeys = TimeRange.javaTimeRangeListToPyList(p.getKeys()) if pytr in pkeys: - slice = p.getItem(tr) - slice = slice.__numpy__ + jslice = p.getItem(tr) + slice = jslice.__numpy__ if len(slice) == 1: - slice = slice[0] - elif len(slice) == 2 and type(slice[1]) is str: - exec "slice[1] = " + slice[1] + if slice[0].dtype != int8: + # scalar + slice = slice[0] + else: + # discrete or weather + keys = JUtil.javaObjToPyVal(jslice.getKeyList()) + slice.append(keys) cache[arg] = (slice, pytr) else: cache[arg] = (None, time) @@ -1048,11 +1053,16 @@ class Forecaster(GridUtilities): if type(rval) is not ndarray: if type(rval) is not tuple: + jrval = rval rval = rval.__numpy__ if len(rval) == 1: - rval = rval[0] - elif len(rval) == 2 and type(rval[1]) is str: - exec "rval[1] = " + rval[1] + if rval[0].dtype != int8: + # scalar + rval = rval[0] + else: + # discrete or weather + keys = JUtil.javaObjToPyVal(jrval.getKeyList()) + rval.append(keys) cache[we] = (rval, time) if rval is not None and cache['mtime'][0] is not None and doStore: parm = self.__getNewWE(we) @@ -1211,9 +1221,13 @@ class IFPIO: slice = self.getSrcWE(name, 0).getItem(time) out = slice.__numpy__ if len(out) == 1: - out = out[0] - elif len(out) == 2 and type(out[1]) is str: - exec "out[1] = " + out[1] + if out[0].dtype != int8: + # scalar + out = out[0] + else: + # discrete or weather + keys = JUtil.javaObjToPyVal(slice.getKeyList()) + out.append(keys) else: out = self._getcube(self.eta, name, time) return out @@ -1239,12 +1253,16 @@ class IFPIO: pres = [] for l in lvls: p = self.getSrcWE(parm + "_" + l, 0) - slice = p.getItem(time) - slice = slice.__numpy__ + jslice = p.getItem(time) + slice = jslice.__numpy__ if len(slice) == 1: - slice = slice[0] - elif len(slice) == 2 and type(slice[1]) is str: - exec "slice[1] = " + slice[1] + if slice[0].dtype != int8: + # scalar + slice = slice[0] + else: + # discrete or weather + keys = JUtil.javaObjToPyVal(jslice.getKeyList()) + slice.append(keys) lst.append(slice) pres.append(int(l[2:])) if type(lst[0]) == types.TupleType or type(lst[0]) == types.ListType: diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GridLocation.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GridLocation.java index f55048c570..4b4d997446 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GridLocation.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GridLocation.java @@ -131,7 +131,7 @@ public class GridLocation extends PersistableDataObject implements } @Override - public Object[] getNumPy() { + public Object[] getNumpy() { return new Object[] { data }; } @@ -1048,7 +1048,7 @@ public class GridLocation extends PersistableDataObject implements System.out.println(gridCoord.x + "," + gridCoord.y + " " + latLon); PythonNumpyLatLonGrid latLonGrid = gloc.getLatLonGrid(); - float[] data = (float[]) latLonGrid.getNumPy()[0]; + float[] data = (float[]) latLonGrid.getNumpy()[0]; for (int x = 0; x < gloc.getNx(); x++) { for (int y = 0; y < gloc.getNy(); y++) { int idx = 2 * ((x * gloc.ny) + y); diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/grid/Grid2DBoolean.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/grid/Grid2DBoolean.java index 05f40fd51f..769e32dea0 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/grid/Grid2DBoolean.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/grid/Grid2DBoolean.java @@ -408,7 +408,7 @@ public class Grid2DBoolean implements IGrid2D, Cloneable, INumpyable, } @Override - public Object[] getNumPy() { + public Object[] getNumpy() { return new Object[] { buffer.array() }; } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/grid/Grid2DByte.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/grid/Grid2DByte.java index 39d8a7100a..bc563797e6 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/grid/Grid2DByte.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/grid/Grid2DByte.java @@ -414,7 +414,7 @@ public class Grid2DByte implements IGrid2D, Cloneable, INumpyable, } @Override - public Object[] getNumPy() { + public Object[] getNumpy() { return new Object[] { buffer.array() }; } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/grid/Grid2DFloat.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/grid/Grid2DFloat.java index bc308fec99..29d3015818 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/grid/Grid2DFloat.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/grid/Grid2DFloat.java @@ -425,7 +425,7 @@ public class Grid2DFloat implements IGrid2D, Cloneable, INumpyable, } @Override - public Object[] getNumPy() { + public Object[] getNumpy() { return new Object[] { buffer.array() }; } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/DiscreteGridSlice.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/DiscreteGridSlice.java index 012a72637d..423e78af45 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/DiscreteGridSlice.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/DiscreteGridSlice.java @@ -36,7 +36,6 @@ import com.raytheon.uf.common.dataplugin.gfe.discrete.DiscreteKey; import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DBit; import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DByte; import com.raytheon.uf.common.dataplugin.gfe.grid.IGrid2D; -import com.raytheon.uf.common.python.PyUtil; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.status.IUFStatusHandler; @@ -58,6 +57,7 @@ import com.raytheon.uf.common.time.TimeRange; * string * 08/13/2013 1571 randerso Removed toString to stop it from hanging the * debugger when trying to display the grid + * 10/29/2013 2476 njensen Updated getNumpy() and added getKeyList() * * * @author chammack @@ -789,16 +789,8 @@ public class DiscreteGridSlice extends AbstractGridSlice implements Cloneable { } @Override - public Object[] getNumPy() { - Object[] numpy = new Object[2]; - numpy[0] = getDiscreteGrid().getBuffer().array(); - List keyList = new ArrayList(); - for (DiscreteKey k : key) { - keyList.add(k.toString()); - } - String pyList = PyUtil.listToList(keyList); - numpy[1] = pyList; - return numpy; + public Object[] getNumpy() { + return new Object[] { getDiscreteGrid().getBuffer().array() }; } @Override @@ -860,4 +852,12 @@ public class DiscreteGridSlice extends AbstractGridSlice implements Cloneable { diskCache.removeFromCache(cacheId); } } + + public List getKeyList() { + List list = new ArrayList(key.length); + for (DiscreteKey k : key) { + list.add(k.toString()); + } + return list; + } } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/PythonWeatherGridSlice.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/PythonWeatherGridSlice.java index 9d1a14c9bd..3cb3e5b5e0 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/PythonWeatherGridSlice.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/PythonWeatherGridSlice.java @@ -72,10 +72,10 @@ public class PythonWeatherGridSlice extends AbstractGridSlice { /* * (non-Javadoc) * - * @see jep.INumpyable#getNumPy() + * @see jep.INumpyable#getNumpy() */ @Override - public Object[] getNumPy() { + public Object[] getNumpy() { Object[] numpy = new Object[2]; numpy[0] = weatherGrid.getBuffer().array(); String pyList = PyUtil.listToList(keys); diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/ScalarGridSlice.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/ScalarGridSlice.java index f215d2afb5..235af74b9f 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/ScalarGridSlice.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/ScalarGridSlice.java @@ -937,7 +937,7 @@ public class ScalarGridSlice extends AbstractGridSlice implements } @Override - public Object[] getNumPy() { + public Object[] getNumpy() { return new Object[] { this.getScalarGrid().getFloats() }; } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/VectorGridSlice.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/VectorGridSlice.java index c0c565ccc6..0e47319ca4 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/VectorGridSlice.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/VectorGridSlice.java @@ -1225,7 +1225,7 @@ public class VectorGridSlice extends ScalarGridSlice implements Cloneable, } @Override - public Object[] getNumPy() { + public Object[] getNumpy() { return new Object[] { this.getMagGrid().getFloats(), this.getDirGrid().getFloats() }; } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/WeatherGridSlice.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/WeatherGridSlice.java index d71db3d1f3..bd9506aaaa 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/WeatherGridSlice.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/slice/WeatherGridSlice.java @@ -35,7 +35,6 @@ import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DByte; import com.raytheon.uf.common.dataplugin.gfe.grid.IGrid2D; import com.raytheon.uf.common.dataplugin.gfe.weather.WeatherKey; import com.raytheon.uf.common.dataplugin.gfe.weather.WeatherSubKey; -import com.raytheon.uf.common.python.PyUtil; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.status.IUFStatusHandler; @@ -56,6 +55,7 @@ import com.raytheon.uf.common.time.TimeRange; * Jan 30, 2013 15719 jdynina Allowed more than 128 char wx string * Aug 13, 2013 1571 randerso Removed toString to stop it from hanging the * debugger when trying to display the grid + * Oct 29, 2013 2476 njensen Updated getNumpy() and added getKeyList() * * * @@ -814,16 +814,8 @@ public class WeatherGridSlice extends AbstractGridSlice { } @Override - public Object[] getNumPy() { - Object[] numpy = new Object[2]; - numpy[0] = getWeatherGrid().getBuffer().array(); - List keyList = new ArrayList(); - for (WeatherKey k : keys) { - keyList.add(k.toString()); - } - String pyList = PyUtil.listToList(keyList); - numpy[1] = pyList; - return numpy; + public Object[] getNumpy() { + return new Object[] { getWeatherGrid().getBuffer().array() }; } @Override @@ -884,4 +876,12 @@ public class WeatherGridSlice extends AbstractGridSlice { diskCache.removeFromCache(cacheId); } } + + public List getKeyList() { + List list = new ArrayList(keys.length); + for (WeatherKey k : keys) { + list.add(k.toString()); + } + return list; + } } diff --git a/edexOsgi/com.raytheon.uf.common.python/src/com/raytheon/uf/common/python/PythonNumpyFloatArray.java b/edexOsgi/com.raytheon.uf.common.python/src/com/raytheon/uf/common/python/PythonNumpyFloatArray.java index ec3357c58a..c366fde088 100644 --- a/edexOsgi/com.raytheon.uf.common.python/src/com/raytheon/uf/common/python/PythonNumpyFloatArray.java +++ b/edexOsgi/com.raytheon.uf.common.python/src/com/raytheon/uf/common/python/PythonNumpyFloatArray.java @@ -52,10 +52,10 @@ public class PythonNumpyFloatArray implements INumpyable { /* * (non-Javadoc) * - * @see jep.INumpyable#getNumPy() + * @see jep.INumpyable#getNumpy() */ @Override - public Object[] getNumPy() { + public Object[] getNumpy() { return new Object[] { messageData }; } diff --git a/edexOsgi/com.raytheon.uf.edex.python.decoder/src/com/raytheon/uf/edex/python/decoder/PythonNumpyByteArray.java b/edexOsgi/com.raytheon.uf.edex.python.decoder/src/com/raytheon/uf/edex/python/decoder/PythonNumpyByteArray.java index 42c4569c1e..229e64ddde 100644 --- a/edexOsgi/com.raytheon.uf.edex.python.decoder/src/com/raytheon/uf/edex/python/decoder/PythonNumpyByteArray.java +++ b/edexOsgi/com.raytheon.uf.edex.python.decoder/src/com/raytheon/uf/edex/python/decoder/PythonNumpyByteArray.java @@ -46,10 +46,10 @@ public class PythonNumpyByteArray implements INumpyable { /* * (non-Javadoc) * - * @see jep.INumpyable#getNumPy() + * @see jep.INumpyable#getNumpy() */ @Override - public Object[] getNumPy() { + public Object[] getNumpy() { return new Object[] { messageData }; } diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/INumpyable.java b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/INumpyable.java index 38f91c463b..0174f94ca2 100644 --- a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/INumpyable.java +++ b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/INumpyable.java @@ -20,13 +20,14 @@ package jep; /** - * TODO Add Description + * Interface representing a Java object that can be transformed into a numpy + * array. * *
  * SOFTWARE HISTORY
- * Date			Ticket#		Engineer	Description
+ * Date         Ticket#         Engineer        Description
  * ------------	----------	-----------	--------------------------
- * Apr 4, 2008				njensen	Initial creation
+ * Apr 4, 2008                  njensen         Initial creation
  * 
  * 
* @@ -39,14 +40,21 @@ public interface INumpyable { /** * Gets an Object[] representation of the object to transform into numpy. * Each index in the Object[] should be another array of the primitive type, - * e.g. {float[], float[]} + * e.g. {float[], float[]}. The result in python will then be a python + * list, e.g. [numpy.ndarray(dtype=float32), numpy.ndarray(dtype=float32)]. * * @return */ - public Object[] getNumPy(); + public Object[] getNumpy(); + /** + * Gets the x dimension of the arrays returned by getNumpy(). + */ public int getNumpyX(); + /** + * Gets the y dimension of hte arrays returned by getNumpy(). + */ public int getNumpyY(); } diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/Jep.java b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/Jep.java index 5302e4aa2e..cc46254d63 100644 --- a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/Jep.java +++ b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/Jep.java @@ -821,7 +821,7 @@ public final class Jep { throws JepException; // added by njensen - public void setNumeric(String name, float[] v, int nx, int ny) throws JepException { + public void setNumpy(String name, float[] v, int nx, int ny) throws JepException { if(this.closed) throw new JepException("Jep has been closed."); isValidThread(); @@ -832,7 +832,7 @@ public final class Jep { private native void setNumeric(long tstate, String name, float[] v, int nx, int ny) throws JepException; // end of added by njensen - public void setNumeric(String name, int[] v, int nx, int ny) throws JepException { + public void setNumpy(String name, int[] v, int nx, int ny) throws JepException { if(this.closed) throw new JepException("Jep has been closed."); isValidThread(); @@ -843,7 +843,7 @@ public final class Jep { private native void setNumeric(long tstate, String name, int[] v, int nx, int ny) throws JepException; - public void setNumeric(String name, byte[] v, int nx, int ny) throws JepException { + public void setNumpy(String name, byte[] v, int nx, int ny) throws JepException { if(this.closed) throw new JepException("Jep has been closed."); isValidThread(); diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.c b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.c index 4b9feaa71f..e516ba812f 100644 --- a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.c +++ b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.c @@ -86,17 +86,11 @@ static jmethodID objectGetClass = 0; static jmethodID classGetMethods = 0; static jmethodID classGetFields = 0; +// all following static variables added by njensen static jmethodID xMethod = 0; static jmethodID yMethod = 0; -static jmethodID getMethod = 0; +static jmethodID getNumpyMethod = 0; -// added by njensen -static jclass floatarrayclass = NULL; -static jclass bytearrayclass = NULL; -static jclass intarrayclass = NULL; -static jclass stringclass = NULL; - -// added by njensen static jmethodID classGetName = 0; static PyObject* classnamePyJMethodsDict = NULL; @@ -739,35 +733,35 @@ static PyObject* pyjobject_getattr(PyJobject_Object *obj, // added by njensen static PyObject* pyjobject_numpy(PyJobject_Object *obj) { - int i=0; - /* updated by bkowal */ - npy_intp *dims = NULL; - jfloat *dataFloat = NULL; - jbyte *dataByte = NULL; - jint *dataInt = NULL; - const char *message = NULL; - jobjectArray objarray = NULL; - PyObject *resultList = NULL; - jint xsize = 0; - jint ysize = 0; - jsize listSize =0; + int i=0; + /* updated by bkowal */ + npy_intp *dims = NULL; + jobjectArray objarray = NULL; + PyObject *resultList = NULL; + jint xsize = 0; + jint ysize = 0; + jsize listSize =0; - JNIEnv *env = pyembed_get_env(); + JNIEnv *env = pyembed_get_env(); + // methods are forever but classes are fleeting jclass numpyable = (*env)->FindClass(env, "jep/INumpyable"); if((*env)->IsInstanceOf(env, obj->object, numpyable)) { - xMethod = (*env)->GetMethodID(env, numpyable, "getNumpyX", "()I"); + if(xMethod == NULL) + xMethod = (*env)->GetMethodID(env, numpyable, "getNumpyX", "()I"); xsize = (jint) (*env)->CallIntMethod(env, obj->object, xMethod); - yMethod = (*env)->GetMethodID(env, numpyable, "getNumpyY", "()I"); + if(yMethod == NULL) + yMethod = (*env)->GetMethodID(env, numpyable, "getNumpyY", "()I"); ysize = (jint) (*env)->CallIntMethod(env, obj->object, yMethod); dims = malloc(2 * sizeof(npy_intp)); dims[0] = ysize; dims[1] = xsize; - getMethod = (*env)->GetMethodID(env, numpyable, "getNumPy", "()[Ljava/lang/Object;"); - objarray = (jobjectArray) (*env)->CallObjectMethod(env, obj->object, getMethod); + if(getNumpyMethod == NULL) + getNumpyMethod = (*env)->GetMethodID(env, numpyable, "getNumpy", "()[Ljava/lang/Object;"); + objarray = (jobjectArray) (*env)->CallObjectMethod(env, obj->object, getNumpyMethod); if(process_java_exception(env) || !objarray) { Py_INCREF(Py_None); @@ -775,59 +769,19 @@ static PyObject* pyjobject_numpy(PyJobject_Object *obj) { } listSize = (*env)->GetArrayLength(env, objarray); - - initNumpy(); - - resultList = PyList_New(listSize); - - if(floatarrayclass == NULL) - floatarrayclass = (*env)->FindClass(env, "[F"); - if(bytearrayclass == NULL) - bytearrayclass = (*env)->FindClass(env, "[B"); - if(intarrayclass == NULL) - intarrayclass = (*env)->FindClass(env, "[I"); - if(stringclass == NULL) - stringclass = (*env)->FindClass(env, "java/lang/String"); - + resultList = PyList_New(listSize); for(i=0; i < listSize; i=i+1) { - PyObject *pyjob; + PyObject *pyjob = NULL; jobject jo = (*env)->GetObjectArrayElement(env, objarray, i); - if((*env)->IsInstanceOf(env, jo, floatarrayclass)) + pyjob = javaToNumpyArray(env, jo, dims); + if(pyjob == NULL) { - pyjob = PyArray_SimpleNew(2, dims, NPY_FLOAT32); - dataFloat = (*env)->GetFloatArrayElements(env, jo, 0); - memcpy(((PyArrayObject *)pyjob)->data, - dataFloat, ysize * xsize * sizeof(float)); - (*env)->ReleaseFloatArrayElements(env, jo, dataFloat, 0); - } - else if((*env)->IsInstanceOf(env, jo, bytearrayclass)) - { - pyjob = PyArray_SimpleNew(2, dims, NPY_BYTE); - dataByte = (*env)->GetByteArrayElements(env, jo, 0); - memcpy(((PyArrayObject *)pyjob)->data, - dataByte, ysize * xsize * 1); - (*env)->ReleaseByteArrayElements(env, jo, dataByte, 0); - } - else if((*env)->IsInstanceOf(env, jo, intarrayclass)) - { - pyjob = PyArray_SimpleNew(2, dims, NPY_INT32); - dataInt = (*env)->GetIntArrayElements(env, jo, 0); - memcpy(((PyArrayObject *)pyjob)->data, - dataInt, ysize * xsize * sizeof(int)); - (*env)->ReleaseIntArrayElements(env, jo, dataInt, 0); - } - else if((*env)->IsInstanceOf(env, jo, stringclass)) - { - message = jstring2char(env, jo); - pyjob = PyString_FromString(message); - release_utf_char(env, jo, message); - } - else - { - Py_INCREF(Py_None); - pyjob = Py_None; - } + PyErr_Format(PyExc_TypeError, "Cannot transform INumpyable.getNumpy()[%i] java object to numpy array", i); + free(dims); + Py_DECREF(resultList); + return NULL; + } PyList_SetItem(resultList, i, pyjob); (*env)->DeleteLocalRef(env, jo); } @@ -837,20 +791,11 @@ static PyObject* pyjobject_numpy(PyJobject_Object *obj) { } else { - Py_INCREF(Py_None); - return Py_None; + PyErr_Format(PyExc_TypeError, "Object does not implement INumpyable and therefore cannot be transformed to numpy array"); + return NULL; } } -// added by njensen -static void initNumpy(void) -{ - if (!numpyInit) - { - import_array(); - numpyInit = 1; - } -} // set attribute v for object. // uses obj->attr dictionary for storage. diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.h b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.h index fb1b8b52e8..97c3b03f46 100644 --- a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.h +++ b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.h @@ -69,7 +69,6 @@ int pyjobject_check(PyObject *obj); //added by njensen static PyObject* pyjobject_numpy(PyJobject_Object *obj); -static void initNumpy(void); -static int numpyInit = 0; + #endif // ndef pyjobject diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/util.c b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/util.c index d42ecf7d5e..d63c800bbc 100644 --- a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/util.c +++ b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/util.c @@ -95,6 +95,7 @@ jclass JBOOLEAN_ARRAY_TYPE = NULL; jclass JDOUBLE_ARRAY_TYPE = NULL; jclass JFLOAT_ARRAY_TYPE = NULL; jclass JBYTE_ARRAY_TYPE = NULL; +jclass JSHORT_ARRAY_TYPE = NULL; // cached methodids jmethodID objectToString = 0; @@ -905,6 +906,15 @@ int cache_primitive_classes(JNIEnv *env) { (*env)->DeleteLocalRef(env, clazz); } + if(JSHORT_ARRAY_TYPE == NULL) { + clazz = (*env)->FindClass(env, "[S"); + if((*env)->ExceptionOccurred(env)) + return 0; + + JSHORT_ARRAY_TYPE = (*env)->NewGlobalRef(env, clazz); + (*env)->DeleteLocalRef(env, clazz); + } + return 1; } @@ -985,6 +995,11 @@ void unref_cache_primitive_classes(JNIEnv *env) { (*env)->DeleteGlobalRef(env, JDOUBLE_ARRAY_TYPE); JDOUBLE_ARRAY_TYPE = NULL; } + if(JSHORT_ARRAY_TYPE != NULL) { + (*env)->DeleteGlobalRef(env, JSHORT_ARRAY_TYPE); + JSHORT_ARRAY_TYPE = NULL; + } + } @@ -1402,7 +1417,7 @@ jvalue convert_pynumpyarg_jvalue(JNIEnv *env, arr = NULL; if(param != Py_None && !pyjarray_check(param)) { - initUtil(); + initNumpy(); if(PyArray_Check(param)) { @@ -1580,7 +1595,7 @@ jvalue convert_pyarg_jvalue(JNIEnv *env, } else { //added by njensen - initUtil(); + initNumpy(); if(PyArray_Check(param)) { ret.l = numpyToJavaArray(env, param, NULL); @@ -1723,7 +1738,7 @@ jarray numpyToJavaArray(JNIEnv* env, PyObject *param, jclass desiredType) PyArrayObject *pa = NULL; int minDim = 0; int maxDim = 0; - initUtil(); + initNumpy(); sz = PyArray_Size(param); if(desiredType == NULL) @@ -1732,6 +1747,8 @@ jarray numpyToJavaArray(JNIEnv* env, PyObject *param, jclass desiredType) desiredType = JBOOLEAN_ARRAY_TYPE; else if(((PyArrayObject *) param)->descr->type_num == NPY_BYTE) desiredType = JBYTE_ARRAY_TYPE; + else if(((PyArrayObject *) param)->descr->type_num == NPY_INT16) + desiredType = JSHORT_ARRAY_TYPE; else if(((PyArrayObject *) param)->descr->type_num == NPY_INT32) desiredType = JINT_ARRAY_TYPE; else if(((PyArrayObject *) param)->descr->type_num == NPY_INT64) @@ -1762,6 +1779,15 @@ jarray numpyToJavaArray(JNIEnv* env, PyObject *param, jclass desiredType) pa = (PyArrayObject *) nvalue; (*env)->SetByteArrayRegion(env, arr, 0, sz, (const jbyte *)pa->data); } + else if((*env)->IsSameObject(env, desiredType, JSHORT_ARRAY_TYPE) + && (((PyArrayObject *) param)->descr->type_num == NPY_INT16)) + { + arr = (*env)->NewShortArray(env, sz); + nobj = PyArray_ContiguousFromObject(param, NPY_INT16, minDim, maxDim); + nvalue = (PyObject *)PyArray_Cast((PyArrayObject *)nobj, NPY_INT16); + pa = (PyArrayObject *) nvalue; + (*env)->SetShortArrayRegion(env, arr, 0, sz, (const jshort *)pa->data); + } else if((*env)->IsSameObject(env, desiredType, JINT_ARRAY_TYPE) && (((PyArrayObject *) param)->descr->type_num == NPY_INT32)) { @@ -1808,6 +1834,75 @@ jarray numpyToJavaArray(JNIEnv* env, PyObject *param, jclass desiredType) return arr; } +// added by njensen +PyObject* javaToNumpyArray(JNIEnv* env, jobject jo, npy_intp *dims) +{ + PyObject *pyjob = NULL; + int ysize, xsize; + ysize = dims[0]; + xsize = dims[1]; + initNumpy(); + + if((*env)->IsInstanceOf(env, jo, JBOOLEAN_ARRAY_TYPE)) + { + jboolean *dataBool = NULL; + pyjob = PyArray_SimpleNew(2, dims, NPY_BOOL); + dataBool = (*env)->GetBooleanArrayElements(env, jo, 0); + memcpy(((PyArrayObject *)pyjob)->data, dataBool, ysize * xsize * 1); + (*env)->ReleaseBooleanArrayElements(env, jo, dataBool, 0); + } + else if((*env)->IsInstanceOf(env, jo, JBYTE_ARRAY_TYPE)) + { + jbyte *dataByte = NULL; + pyjob = PyArray_SimpleNew(2, dims, NPY_BYTE); + dataByte = (*env)->GetByteArrayElements(env, jo, 0); + memcpy(((PyArrayObject *)pyjob)->data, dataByte, ysize * xsize * 1); + (*env)->ReleaseByteArrayElements(env, jo, dataByte, 0); + } + else if((*env)->IsInstanceOf(env, jo, JSHORT_ARRAY_TYPE)) + { + jshort *dataShort = NULL; + pyjob = PyArray_SimpleNew(2, dims, NPY_INT16); + dataShort = (*env)->GetShortArrayElements(env, jo, 0); + memcpy(((PyArrayObject *)pyjob)->data, dataShort, ysize * xsize * 2); + (*env)->ReleaseShortArrayElements(env, jo, dataShort, 0); + } + else if((*env)->IsInstanceOf(env, jo, JINT_ARRAY_TYPE)) + { + jint *dataInt = NULL; + pyjob = PyArray_SimpleNew(2, dims, NPY_INT32); + dataInt = (*env)->GetIntArrayElements(env, jo, 0); + memcpy(((PyArrayObject *)pyjob)->data, dataInt, ysize * xsize * 4); + (*env)->ReleaseIntArrayElements(env, jo, dataInt, 0); + } + else if((*env)->IsInstanceOf(env, jo, JLONG_ARRAY_TYPE)) + { + jlong *dataLong = NULL; + pyjob = PyArray_SimpleNew(2, dims, NPY_INT64); + dataLong = (*env)->GetLongArrayElements(env, jo, 0); + memcpy(((PyArrayObject *)pyjob)->data, dataLong, ysize * xsize * 8); + (*env)->ReleaseLongArrayElements(env, jo, dataLong, 0); + } + else if((*env)->IsInstanceOf(env, jo, JFLOAT_ARRAY_TYPE)) + { + jfloat *dataFloat = NULL; + pyjob = PyArray_SimpleNew(2, dims, NPY_FLOAT32); + dataFloat = (*env)->GetFloatArrayElements(env, jo, 0); + memcpy(((PyArrayObject *)pyjob)->data, dataFloat, ysize * xsize * 4); + (*env)->ReleaseFloatArrayElements(env, jo, dataFloat, 0); + } + else if((*env)->IsInstanceOf(env, jo, JDOUBLE_ARRAY_TYPE)) + { + jdouble *dataDouble = NULL; + pyjob = PyArray_SimpleNew(2, dims, NPY_FLOAT64); + dataDouble = (*env)->GetDoubleArrayElements(env, jo, 0); + memcpy(((PyArrayObject *)pyjob)->data, dataDouble, ysize * xsize * 8); + (*env)->ReleaseDoubleArrayElements(env, jo, dataDouble, 0); + } + + return pyjob; +} + // added by njensen, code from brockwoo jarray pylistToJStringList(JNIEnv* env, PyObject* plist) { @@ -1827,12 +1922,12 @@ jarray pylistToJStringList(JNIEnv* env, PyObject* plist) } // added by njensen -static void initUtil(void) +static void initNumpy(void) { - if (!utilInit) + if (!numpyInited) { import_array(); - utilInit = 1; + numpyInited = 1; } } diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/util.h b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/util.h index 8972695a4f..603090bb09 100755 --- a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/util.h +++ b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/util.h @@ -37,6 +37,9 @@ #endif #include +// added by njensen +#include "numpy/arrayobject.h" + #ifndef _Included_util #define _Included_util @@ -106,11 +109,12 @@ int process_py_exception(JNIEnv*, int); // added by njensen char *PyTraceback_AsString(PyObject*); -static void initUtil(void); -static int utilInit = 0; +static void initNumpy(void); +static int numpyInited = 0; jstring javaStacktrace_tostring(JNIEnv*, jthrowable); jarray numpyToJavaArray(JNIEnv*, PyObject*, jclass); jarray pylistToJStringList(JNIEnv*, PyObject*); +PyObject* javaToNumpyArray(JNIEnv*, jobject, npy_intp*); // convert java exception to pyerr. // true (1) if an exception was processed. diff --git a/tests/unit/com/raytheon/viz/gfe/contours/TestContourAnalyzer.java b/tests/unit/com/raytheon/viz/gfe/contours/TestContourAnalyzer.java index f7e8a7da12..34bad84ad6 100644 --- a/tests/unit/com/raytheon/viz/gfe/contours/TestContourAnalyzer.java +++ b/tests/unit/com/raytheon/viz/gfe/contours/TestContourAnalyzer.java @@ -202,8 +202,8 @@ public class TestContourAnalyzer { String label) { assertEquals(label + ":getXdim()", expected.getXdim(), result.getXdim()); assertEquals(label + ":getYdim()", expected.getYdim(), result.getYdim()); - assertArrayEquals(label + ":values", expected.getNumPy(), - result.getNumPy()); + assertArrayEquals(label + ":values", expected.getNumpy(), + result.getNumpy()); } /**