Issue #1497 ported python fillEditArea to Java to boost speed
Change-Id: Idbc2a027914e1a584d36551781df21ed9bf63c36 Former-commit-id: 32cf1236638c64a3e047398ca829d79d3b7cb5ef
This commit is contained in:
parent
037dabb683
commit
15e1731ef3
2 changed files with 190 additions and 0 deletions
|
@ -0,0 +1,80 @@
|
||||||
|
##
|
||||||
|
# This software was developed and / or modified by Raytheon Company,
|
||||||
|
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||||
|
#
|
||||||
|
# U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||||
|
# This software product contains export-restricted data whose
|
||||||
|
# export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||||
|
# to non-U.S. persons whether in the United States or abroad requires
|
||||||
|
# an export license or other authorization.
|
||||||
|
#
|
||||||
|
# Contractor Name: Raytheon Company
|
||||||
|
# Contractor Address: 6825 Pine Street, Suite 340
|
||||||
|
# Mail Stop B8
|
||||||
|
# Omaha, NE 68106
|
||||||
|
# 402.291.0100
|
||||||
|
#
|
||||||
|
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||||
|
# further licensing information.
|
||||||
|
##
|
||||||
|
|
||||||
|
#
|
||||||
|
# Provides Java implementations of common smart utility functions
|
||||||
|
# to boost performance.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# SOFTWARE HISTORY
|
||||||
|
#
|
||||||
|
# Date Ticket# Engineer Description
|
||||||
|
# ------------ ---------- ----------- --------------------------
|
||||||
|
# 01/14/13 njensen Initial Creation.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
import jep
|
||||||
|
from com.raytheon.uf.common.dataplugin.gfe.util import SmartUtils as JavaSmartUtils
|
||||||
|
import numpy
|
||||||
|
|
||||||
|
|
||||||
|
def __getMaskIndiciesForJava(mask):
|
||||||
|
flatMask = mask.flat #flatten the array
|
||||||
|
flatIndicies = numpy.nonzero(flatMask) # get the indicies of the set cells
|
||||||
|
ysize = mask.shape[1]
|
||||||
|
indexes = []
|
||||||
|
# convert the flat incicies to the x, y indicies
|
||||||
|
for i in flatIndicies:
|
||||||
|
indexes.append((i / ysize, i % ysize))
|
||||||
|
|
||||||
|
# Make two new jarrays to hold the final coordinate tuples
|
||||||
|
size = len(indexes[0][0])
|
||||||
|
xcoords = jep.jarray(size, jep.JINT_ID)
|
||||||
|
ycoords = jep.jarray(size, jep.JINT_ID)
|
||||||
|
|
||||||
|
#===================================================================
|
||||||
|
# Convert the coordinates from a tuple of numpy arrays to a list of
|
||||||
|
# coordinate tuples
|
||||||
|
|
||||||
|
for index in xrange(size):
|
||||||
|
try:
|
||||||
|
x = indexes[0][0][index]
|
||||||
|
y = indexes[0][1][index]
|
||||||
|
xcoords[index] = int(x)
|
||||||
|
ycoords[index] = int(y)
|
||||||
|
except Exception, e:
|
||||||
|
print e
|
||||||
|
|
||||||
|
return xcoords, ycoords
|
||||||
|
|
||||||
|
|
||||||
|
def fillEditArea(grid, fillMask, borderMask):
|
||||||
|
editPointsX, editPointsY = __getMaskIndiciesForJava(fillMask)
|
||||||
|
borderPointsX, borderPointsY = __getMaskIndiciesForJava(borderMask)
|
||||||
|
|
||||||
|
gridObj = JavaSmartUtils.fillEditArea(grid, grid.shape[1], grid.shape[0], \
|
||||||
|
editPointsY, editPointsX, borderPointsY, borderPointsX)
|
||||||
|
|
||||||
|
retObj = gridObj.__numpy__[0]
|
||||||
|
return retObj
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,110 @@
|
||||||
|
/**
|
||||||
|
* This software was developed and / or modified by Raytheon Company,
|
||||||
|
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
||||||
|
*
|
||||||
|
* U.S. EXPORT CONTROLLED TECHNICAL DATA
|
||||||
|
* This software product contains export-restricted data whose
|
||||||
|
* export/transfer/disclosure is restricted by U.S. law. Dissemination
|
||||||
|
* to non-U.S. persons whether in the United States or abroad requires
|
||||||
|
* an export license or other authorization.
|
||||||
|
*
|
||||||
|
* Contractor Name: Raytheon Company
|
||||||
|
* Contractor Address: 6825 Pine Street, Suite 340
|
||||||
|
* Mail Stop B8
|
||||||
|
* Omaha, NE 68106
|
||||||
|
* 402.291.0100
|
||||||
|
*
|
||||||
|
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
||||||
|
* further licensing information.
|
||||||
|
**/
|
||||||
|
package com.raytheon.uf.common.dataplugin.gfe.util;
|
||||||
|
|
||||||
|
import jep.INumpyable;
|
||||||
|
|
||||||
|
import com.raytheon.uf.common.python.PythonNumpyFloatArray;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Java port of python utility functions. Ported to Java to boost performance to
|
||||||
|
* surpass python's poor looping performance.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
*
|
||||||
|
* SOFTWARE HISTORY
|
||||||
|
*
|
||||||
|
* Date Ticket# Engineer Description
|
||||||
|
* ------------ ---------- ----------- --------------------------
|
||||||
|
* Jan 11, 2013 njensen Initial creation
|
||||||
|
*
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @author njensen
|
||||||
|
* @version 1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class SmartUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define a method to fill the specified edit area. Ported from python.
|
||||||
|
*
|
||||||
|
* @param grid
|
||||||
|
* @param gridNx
|
||||||
|
* @param gridNy
|
||||||
|
* @param editPointsX
|
||||||
|
* @param editPointsY
|
||||||
|
* @param borderPointsX
|
||||||
|
* @param borderPointsY
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static INumpyable fillEditArea(float[] grid, int gridNx, int gridNy,
|
||||||
|
int[] editPointsX, int[] editPointsY, int[] borderPointsX,
|
||||||
|
int[] borderPointsY) {
|
||||||
|
// edit points and border points are a list of (x,y) indices
|
||||||
|
int[] e = new int[2];
|
||||||
|
int[] b = new int[2];
|
||||||
|
|
||||||
|
for (int i = 0; i < editPointsX.length; i++) {
|
||||||
|
e[0] = editPointsX[i];
|
||||||
|
e[1] = editPointsY[i];
|
||||||
|
double numSum = 0.0;
|
||||||
|
double denomSum = 0.0;
|
||||||
|
|
||||||
|
for (int k = 0; k < borderPointsX.length; k++) {
|
||||||
|
b[0] = borderPointsX[k];
|
||||||
|
b[1] = borderPointsY[k];
|
||||||
|
|
||||||
|
// points in the same row, column or diagonal
|
||||||
|
int xdiff = e[0] - b[0];
|
||||||
|
int ydiff = e[1] - b[1];
|
||||||
|
int absXdiff = (xdiff < 0) ? -xdiff : xdiff;
|
||||||
|
int absYdiff = (ydiff < 0) ? -ydiff : ydiff;
|
||||||
|
if (e[0] == b[0] || e[1] == b[1] || absXdiff == absYdiff) {
|
||||||
|
|
||||||
|
double xdist = xdiff;
|
||||||
|
double ydist = ydiff;
|
||||||
|
|
||||||
|
// calculate the distance to the border point
|
||||||
|
double dist = Math.sqrt(xdist * xdist + ydist * ydist);
|
||||||
|
|
||||||
|
// value = grid[b[0], b[1]]
|
||||||
|
float value = grid[b[0] + (gridNx * b[1])];
|
||||||
|
|
||||||
|
// Accumulate the distance-weighted average
|
||||||
|
numSum = numSum + value / dist;
|
||||||
|
denomSum = denomSum + 1 / dist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int eIndex = e[0] + (gridNx * e[1]);
|
||||||
|
if (denomSum > 0.0f) {
|
||||||
|
// grid[e[0], e[1]] = numSum / denomSum;
|
||||||
|
grid[eIndex] = (float) (numSum / denomSum);
|
||||||
|
} else {
|
||||||
|
// grid[e[0], e[1]] = 0.0;
|
||||||
|
grid[eIndex] = 0.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return completed grid
|
||||||
|
return new PythonNumpyFloatArray(grid, gridNx, gridNy);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue