Skip to content

Commit

Permalink
test changes
Browse files Browse the repository at this point in the history
  • Loading branch information
petewa committed Aug 10, 2016
1 parent f564587 commit 0270b43
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 26 deletions.
27 changes: 19 additions & 8 deletions datacube/ndexpr/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,11 @@ def __init__(self):
"!=": operator.ne,
"|": operator.or_,
"&": operator.and_,
"!": operator.inv}
"!": operator.inv,
"^": operator.pow,
"**": operator.pow,
"<<": np.left_shift,
">>": np.right_shift}

# Define xarray DataArray operators with 1 input parameter
self.xfn1 = {"angle": xr.ufuncs.angle,
Expand Down Expand Up @@ -143,7 +147,8 @@ def __init__(self):
"nextafter": xr.ufuncs.nextafter}

# Define non-xarray DataArray operators with 2 input parameter
self.fn2 = {"percentile": np.percentile}
self.fn2 = {"percentile": np.percentile,
"pow": np.power}

# Define xarray DataArray reduction operators
self.xrfn = {"all": xr.DataArray.all,
Expand Down Expand Up @@ -176,6 +181,8 @@ def __init__(self):
minus = Literal("-")
mult = Literal("*")
div = Literal("/")
ls = Literal("<<")
rs = Literal(">>")
gt = Literal(">")
gte = Literal(">=")
lt = Literal("<")
Expand All @@ -198,13 +205,14 @@ def __init__(self):
addop = plus | minus
multop = mult | div
sliceop = colon
shiftop = ls | rs
compop = gte | lte | gt | lt
eqop = eq | neq
bitcompop = b_or | b_and
bitnotop = b_not
logicalnotop = l_not
assignop = seq
expop = Literal("^")
expop = Literal("^") | Literal("**")

expr = Forward()
indexexpr = Forward()
Expand Down Expand Up @@ -242,11 +250,12 @@ def __init__(self):
factor << atom + ZeroOrMore((expop + factor).setParseAction(self.push_op))
term = factor + ZeroOrMore((multop + factor).setParseAction(self.push_op))
term2 = term + ZeroOrMore((addop + term).setParseAction(self.push_op))
term3 = term2 + ZeroOrMore((sliceop + term2).setParseAction(self.push_op))
term4 = term3 + ZeroOrMore((compop + term3).setParseAction(self.push_op))
term5 = term4 + ZeroOrMore((eqop + term4).setParseAction(self.push_op))
term6 = term5 + ZeroOrMore((bitcompop + term5).setParseAction(self.push_op))
expr << term6 + ZeroOrMore((assignop + term6).setParseAction(self.push_op))
term3 = term2 + ZeroOrMore((shiftop + term2).setParseAction(self.push_op))
term4 = term3 + ZeroOrMore((sliceop + term3).setParseAction(self.push_op))
term5 = term4 + ZeroOrMore((compop + term4).setParseAction(self.push_op))
term6 = term5 + ZeroOrMore((eqop + term5).setParseAction(self.push_op))
term7 = term6 + ZeroOrMore((bitcompop + term6).setParseAction(self.push_op))
expr << term7 + ZeroOrMore((assignop + term7).setParseAction(self.push_op))

# Define index operators

Expand Down Expand Up @@ -360,6 +369,8 @@ def evaluate_stack(self, s):
if op == '+' and isinstance(op2, xr.DataArray) and \
op2.dtype.type == np.bool_:
return xr.DataArray.where(op1, op2)
elif op == "<<" or op == ">>":
return self.opn[op](op1, int(op2))
return self.opn[op](op1, op2)
elif op == "::":
return slice(None, None, None)
Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
'toolz',
'xarray',
'scipy',
'pyparsing==2.1.5',
'matplotlib',
'numexpr',
'future',
Expand Down
32 changes: 14 additions & 18 deletions tests/analytics_execution_engine/test_ndexpr.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import sys
import xarray as xr
import numpy as np
import numexpr
import pytest

from datacube.ndexpr import NDexpr
Expand Down Expand Up @@ -66,6 +65,10 @@ def test_2():
assert ne.test("log10(z1)", xr.ufuncs.log10(z1))
assert ne.test("log1p(z1)", xr.ufuncs.log1p(z1))
assert ne.test("log2(z1)", xr.ufuncs.log2(z1))
assert ne.test("pow(z1, 2.0)", np.power(z1, 2.0))
assert ne.test("pow(z1, 2)", np.power(z1, 2))
assert ne.test("z1^2", np.power(z1, 2))
assert ne.test("z1**2", np.power(z1, 2))
assert ne.test("rad2deg(z1)", xr.ufuncs.rad2deg(z1))
assert ne.test("radians(z1)", xr.ufuncs.radians(z1))
assert ne.test("real(z1)", xr.ufuncs.real(z1))
Expand Down Expand Up @@ -159,9 +162,15 @@ def test_2():

assert ne.test("percentile(z1, 50)", np.percentile(z1, 50))
assert ne.test("percentile(z1, 50)+percentile(z1, 50)", np.percentile(z1, 50) + np.percentile(z1, 50))

assert ne.test("percentile(z1, (50))", np.percentile(z1, (50)))
assert ne.test("percentile(z1, (50, 60))", np.percentile(z1, (50, 60)))
assert ne.test("percentile(z1, (50, 60, 70))", np.percentile(z1, (50, 60, 70)))
assert ne.test("percentile(z1, (50, 60, 70)) + percentile(z1, (50, 60, 70))",
np.percentile(z1, (50, 60, 70)) + np.percentile(z1, (50, 60, 70)))
assert ne.test("1 + var(z1, 0, 0+1, 2) + 1", 1+xr.DataArray.var(z1, axis=(0, 0+1, 2))+1)

assert ne.test("1 + ((z1+z1)*0.0005)**2 + 1", 1 + np.power((z1+z1)*0.0005, 2) + 1)

assert ne.test("z1{mask1}", xr.DataArray.where(z1, mask1))
assert ne.test("z1{z1>2}", xr.DataArray.where(z1, z1 > 2))
assert ne.test("z1{z1>=2}", xr.DataArray.where(z1, z1 >= 2))
Expand All @@ -187,6 +196,9 @@ def test_2():
assert ne.test("-z1", -z1)
assert ne.test("z1{!(z1<2)}", xr.DataArray.where(z1, xr.ufuncs.logical_not(z1 < 2)))

assert ne.test("z1>>1", np.right_shift(z1, 1))
assert ne.test("z1<<1", np.left_shift(z1, 1))


@pytest.mark.xfail(xr.__version__ >= '0.8', reason='xarray 0.8.0 api changes')
def test_broken_frexp():
Expand All @@ -198,22 +210,6 @@ def test_broken_frexp():
assert ne.test("frexp(z3)", xr.DataArray(xr.ufuncs.frexp(z3))) # FIXME TODO Fails with xarray >= 0.8


@pytest.mark.xfail(numexpr.__version__ >= '2.6.0', reason='broken with numexpr >= 2.6.0')
def test_broken_percentile_tuple():
ne = NDexpr()
ne.set_ae(False)
z1 = xr.DataArray(np.array([[[0, 1, 2], [3, 4, 5], [6, 7, 8]],
[[9, 10, 11], [12, 13, 14], [15, 16, 17]],
[[18, 19, 20], [21, 22, 23], [24, 25, 26]]
]))

assert ne.test("percentile(z1, (50))", np.percentile(z1, (50)))
assert ne.test("percentile(z1, (50, 60))", np.percentile(z1, (50, 60)))
assert ne.test("percentile(z1, (50, 60, 70))", np.percentile(z1, (50, 60, 70)))
assert ne.test("percentile(z1, (50, 60, 70)) + percentile(z1, (50, 60, 70))",
np.percentile(z1, (50, 60, 70)) + np.percentile(z1, (50, 60, 70)))


def test_3():
# perform assignment stack level testing

Expand Down

0 comments on commit 0270b43

Please sign in to comment.