Files
2026-07-13 12:40:42 +08:00

1098 lines
46 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import inspect
import unittest
import warnings
import numpy as np
from op_test import get_device, is_custom_device
from utils import dygraph_guard, static_guard
import paddle
from paddle import base
paddle.enable_static()
paddle.device.set_device("cpu")
def new_program():
# TODO(gouzil): Optimize program code
main_program = paddle.static.Program()
startup_program = paddle.static.Program()
place = paddle.CPUPlace()
exe = base.Executor(place)
return (
main_program,
exe,
paddle.static.program_guard(
main_program=main_program, startup_program=startup_program
),
)
class TestMathOpPatchesPir(unittest.TestCase):
def test_pow(self):
# Calculate results in dynamic graphs
paddle.disable_static()
x_np = np.random.random([10, 1024]).astype('float32')
y_np = np.random.random([10, 1024]).astype('float32')
res_np_b = x_np**y_np
res_np_c = paddle.pow(paddle.to_tensor(x_np), 2)
res_np_d = x_np.__pow__(2)
res_np_e = x_np.__rpow__(2)
paddle.enable_static()
# Calculate results under pir
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(
name='x', shape=[10, 1024], dtype='float32'
)
y = paddle.static.data(
name='y', shape=[10, 1024], dtype='float32'
)
b = x**y
c = x.pow(2)
d = x.__pow__(2)
e = x.__rpow__(2)
# TODO(gouzil): Why not use `paddle.static.default_main_program()`
# Because different case do not isolate parameters (This is a known problem)
(b_np, c_np, d_np, e_np) = exe.run(
main_program,
feed={"x": x_np, "y": y_np},
fetch_list=[b, c, d, e],
)
np.testing.assert_allclose(res_np_b, b_np, rtol=1e-05)
np.testing.assert_allclose(res_np_c, c_np, rtol=1e-05)
np.testing.assert_allclose(res_np_d, d_np, rtol=1e-05)
np.testing.assert_allclose(res_np_e, e_np, rtol=1e-05)
def test_mod(self):
paddle.disable_static()
x_np = np.random.randint(1, 100, size=[10, 1024], dtype=np.int64)
y_np = np.random.randint(1, 100, size=[10, 1024], dtype=np.int64)
res_np_b = x_np % y_np
res_np_c = paddle.mod(paddle.to_tensor(x_np), paddle.to_tensor(y_np))
res_np_d = x_np.__mod__(y_np)
res_np_e = x_np.__rmod__(y_np)
paddle.enable_static()
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(
name='x', shape=[10, 1024], dtype='int64'
)
y = paddle.static.data(
name='y', shape=[10, 1024], dtype='int64'
)
b = x % y
c = x.mod(y)
d = x.__mod__(y)
e = x.__rmod__(y)
(b_np, c_np, d_np, e_np) = exe.run(
main_program,
feed={"x": x_np, "y": y_np},
fetch_list=[b, c, d, e],
)
np.testing.assert_allclose(res_np_b, b_np, atol=1e-05)
np.testing.assert_allclose(res_np_c, c_np, atol=1e-05)
np.testing.assert_allclose(res_np_d, d_np, atol=1e-05)
np.testing.assert_allclose(res_np_e, e_np, rtol=1e-05)
def test_matmul(self):
paddle.disable_static()
x_np = np.random.uniform(-1, 1, [2, 3]).astype('float32')
y_np = np.random.uniform(-1, 1, [3, 5]).astype('float32')
res_np_b = x_np @ y_np # __matmul__
res_np_c = paddle.matmul(paddle.to_tensor(x_np), paddle.to_tensor(y_np))
res_np_d = x_np.__matmul__(y_np)
res_np_e = y_np.__rmatmul__(x_np)
paddle.enable_static()
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(name='x', shape=[2, 3], dtype='float32')
y = paddle.static.data(name='y', shape=[3, 5], dtype='float32')
b = x @ y
c = x.matmul(y)
d = x.__matmul__(y)
e = y.__rmatmul__(x)
(b_np, c_np, d_np, e_np) = exe.run(
main_program,
feed={"x": x_np, "y": y_np},
fetch_list=[b, c, d, e],
)
np.testing.assert_allclose(res_np_b, b_np, atol=1e-05)
np.testing.assert_allclose(res_np_c, c_np, atol=1e-05)
np.testing.assert_allclose(res_np_d, d_np, atol=1e-05)
np.testing.assert_allclose(res_np_e, e_np, atol=1e-05)
def test_floordiv(self):
paddle.disable_static()
x_np = np.full([10, 1024], 10, np.int64)
y_np = np.full([10, 1024], 2, np.int64)
res_np_b = x_np // y_np
res_np_c = paddle.floor_divide(
paddle.to_tensor(x_np), paddle.to_tensor(y_np)
)
res_np_d = x_np.__floordiv__(y_np)
res_np_e = x_np.__rfloordiv__(y_np)
paddle.enable_static()
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(
name='x', shape=[10, 1024], dtype='int64'
)
y = paddle.static.data(
name='y', shape=[10, 1024], dtype='int64'
)
b = x // y
c = x.floor_divide(y)
d = x.__floordiv__(y)
e = x.__rfloordiv__(y)
(b_np, c_np, d_np, e_np) = exe.run(
main_program,
feed={"x": x_np, "y": y_np},
fetch_list=[b, c, d, e],
)
np.testing.assert_allclose(res_np_b, b_np, atol=1e-05)
np.testing.assert_allclose(res_np_c, c_np, atol=1e-05)
np.testing.assert_allclose(res_np_d, d_np, atol=1e-05)
np.testing.assert_allclose(res_np_e, e_np, rtol=1e-05)
def test_bitwise_not(self):
paddle.disable_static()
x_np = np.random.randint(-100, 100, [2, 3, 5]).astype("int32")
res_np_b = ~x_np
res_np_c = paddle.bitwise_not(paddle.to_tensor(x_np))
res_np_d = x_np.__invert__()
res_np_e = res_np_d
paddle.enable_static()
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(name='x', shape=[2, 3, 5], dtype='int32')
b = ~x
c = x.bitwise_not()
d = x.__invert__()
e = x.bitwise_invert()
(b_np, c_np, d_np, e_np) = exe.run(
main_program,
feed={"x": x_np},
fetch_list=[b, c, d, e],
)
np.testing.assert_array_equal(res_np_b, b_np)
np.testing.assert_array_equal(res_np_c, c_np)
np.testing.assert_array_equal(res_np_d, d_np)
np.testing.assert_array_equal(res_np_e, e_np)
def test_bitwise_xor(self):
paddle.disable_static()
x_np = np.random.randint(-100, 100, [2, 3, 5]).astype("int32")
y_np = np.random.randint(-100, 100, [2, 3, 5]).astype("int32")
res_np_b = x_np ^ y_np
res_np_c = paddle.bitwise_xor(
paddle.to_tensor(x_np), paddle.to_tensor(y_np)
)
res_np_d = x_np.__xor__(y_np)
paddle.enable_static()
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(name="x", shape=[2, 3, 5], dtype="int32")
y = paddle.static.data(name="y", shape=[2, 3, 5], dtype="int32")
b = x ^ y
c = x.bitwise_xor(y)
d = x.__xor__(y)
(b_np, c_np, d_np) = exe.run(
main_program,
feed={"x": x_np, "y": y_np},
fetch_list=[b, c, d],
)
np.testing.assert_array_equal(res_np_b, b_np)
np.testing.assert_array_equal(res_np_c, c_np)
np.testing.assert_array_equal(res_np_d, d_np)
def test_rxor(self):
with dygraph_guard():
x_int32 = 5
x_bool = True
y_np = np.random.randint(0, 2, [2, 3, 5]).astype("int32")
y_tensor = paddle.to_tensor(y_np)
res_ror_int32 = x_int32 ^ y_tensor
res_py_int32 = x_int32 ^ y_tensor.numpy()
np.testing.assert_array_equal(res_py_int32, res_ror_int32.numpy())
res_ror_bool = x_bool ^ y_tensor
res_py_bool = x_bool ^ y_tensor.numpy()
np.testing.assert_array_equal(res_py_bool, res_ror_bool.numpy())
for x_np in (
np.float32(5.0),
np.float64(5.0),
np.complex64(5),
np.complex128(5.0 + 2j),
):
with self.assertRaises(TypeError):
x_np ^ y_tensor
with (
static_guard(),
paddle.pir_utils.IrGuard(),
):
main_program, exe, program_guard = new_program()
with program_guard:
x_int = 5
y_np = np.random.randint(-100, 100, [2, 3, 5]).astype("int32")
y = paddle.static.data("y", y_np.shape, dtype=y_np.dtype)
z = x_int ^ y
out = exe.run(
main_program,
feed={'y': y_np},
fetch_list=[z],
)
out_ref = x_int ^ y_np
np.testing.assert_array_equal(out[0], out_ref)
x_bool = True
res_rxor_bool = x_bool ^ y
out_bool = exe.run(
main_program,
feed={'y': y_np},
fetch_list=[res_rxor_bool],
)
res_py_bool = x_bool ^ y_np
np.testing.assert_array_equal(out_bool[0], res_py_bool)
for x_invalid in (
np.float32(5.0),
np.float64(5.0),
np.complex64(5),
np.complex128(5.0 + 2j),
):
with self.assertRaises(TypeError):
x_invalid ^ y
def test_bitwise_or(self):
paddle.disable_static()
x_np = np.random.randint(-100, 100, [2, 3, 5]).astype("int32")
y_np = np.random.randint(-100, 100, [2, 3, 5]).astype("int32")
res_np_b = x_np | y_np
res_np_c = paddle.bitwise_or(
paddle.to_tensor(x_np), paddle.to_tensor(y_np)
)
res_np_d = x_np.__or__(y_np)
paddle.enable_static()
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(name="x", shape=[2, 3, 5], dtype="int32")
y = paddle.static.data(name="y", shape=[2, 3, 5], dtype="int32")
b = x | y
c = x.bitwise_or(y)
d = x.__or__(y)
(b_np, c_np, d_np) = exe.run(
main_program,
feed={"x": x_np, "y": y_np},
fetch_list=[b, c, d],
)
np.testing.assert_array_equal(res_np_b, b_np)
np.testing.assert_array_equal(res_np_c, c_np)
np.testing.assert_array_equal(res_np_d, d_np)
def test_ror(self):
with dygraph_guard():
x_int32 = 5
x_bool = True
y_np = np.random.randint(0, 2, [2, 3, 5]).astype("int32")
y_tensor = paddle.to_tensor(y_np)
res_ror_int32 = x_int32 | y_tensor
res_py_int32 = x_int32 | y_tensor.numpy()
np.testing.assert_array_equal(res_py_int32, res_ror_int32.numpy())
res_ror_bool = x_bool | y_tensor
res_py_bool = x_bool | y_tensor.numpy()
np.testing.assert_array_equal(res_py_bool, res_ror_bool.numpy())
for x_np in (
np.float32(5.0),
np.float64(5.0),
np.complex64(5),
np.complex128(5.0 + 2j),
):
with self.assertRaises(TypeError):
x_np | y_tensor
with (
static_guard(),
paddle.pir_utils.IrGuard(),
):
main_program, exe, program_guard = new_program()
with program_guard:
x_int = 5
y_np = np.random.randint(-100, 100, [2, 3, 5]).astype("int32")
y = paddle.static.data("y", y_np.shape, dtype=y_np.dtype)
z = x_int | y
out = exe.run(
main_program,
feed={'y': y_np},
fetch_list=[z],
)
out_ref = x_int | y_np
np.testing.assert_array_equal(out[0], out_ref)
x_bool = True
res_ror_bool = x_bool | y
out_bool = exe.run(
main_program,
feed={'y': y_np},
fetch_list=[res_ror_bool],
)
res_py_bool = x_bool | y_np
np.testing.assert_array_equal(out_bool[0], res_py_bool)
for x_invalid in (
np.float32(5.0),
np.float64(5.0),
np.complex64(5),
np.complex128(5.0 + 2j),
):
with self.assertRaises(TypeError):
x_invalid | y
def test_bitwise_and(self):
paddle.disable_static()
x_np = np.random.randint(-100, 100, [2, 3, 5]).astype("int32")
y_np = np.random.randint(-100, 100, [2, 3, 5]).astype("int32")
res_np_b = x_np & y_np
res_np_c = paddle.bitwise_and(
paddle.to_tensor(x_np), paddle.to_tensor(y_np)
)
res_np_d = x_np.__and__(y_np)
temp = 2
res_np_e = temp & y_np
paddle.enable_static()
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(name="x", shape=[2, 3, 5], dtype="int32")
y = paddle.static.data(name="y", shape=[2, 3, 5], dtype="int32")
b = x & y
c = x.bitwise_and(y)
d = x.__and__(y)
e = temp & y
(b_np, c_np, d_np, e_np) = exe.run(
main_program,
feed={"x": x_np, "y": y_np},
fetch_list=[b, c, d, e],
)
np.testing.assert_array_equal(res_np_b, b_np)
np.testing.assert_array_equal(res_np_c, c_np)
np.testing.assert_array_equal(res_np_d, d_np)
np.testing.assert_array_equal(res_np_e, e_np)
def test_positive(self):
paddle.disable_static()
x_np = np.random.random([10, 1024]).astype('float32')
res_np_b = +x_np
res_np_c = paddle.positive(paddle.to_tensor(x_np))
res_np_d = x_np.__pos__()
paddle.enable_static()
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(
name='x', shape=[10, 1024], dtype='float32'
)
b = +x
c = paddle.positive(x)
d = x.__pos__()
(b_np, c_np, d_np) = exe.run(
main_program,
feed={"x": x_np},
fetch_list=[b, c, d],
)
np.testing.assert_allclose(res_np_b, b_np, atol=1e-05)
np.testing.assert_allclose(res_np_c, c_np, atol=1e-05)
np.testing.assert_allclose(res_np_d, d_np, atol=1e-05)
# for logical compare
def test_equal_and_nequal(self):
def _test(x_np, y_np, input_dtype):
paddle.disable_static()
# TODO(gouzil): Open after deleting c++ logic
# res_np_b = x_np == y_np
# res_np_c = paddle.equal(paddle.to_tensor(x_np), paddle.to_tensor(y_np))
# res_np_d = x_np.__eq__(y_np)
res_np_e = x_np != y_np
res_np_f = paddle.not_equal(
paddle.to_tensor(x_np), paddle.to_tensor(y_np)
)
res_np_g = x_np.__ne__(y_np)
paddle.enable_static()
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(
name="x", shape=[-1, 1], dtype=input_dtype
)
y = paddle.static.data(
name="y", shape=[-1, 1], dtype=input_dtype
)
# b = x == y
# c = x.equal(y)
# d = x.__eq__(y)
e = x != y
f = x.not_equal(y)
g = x.__ne__(y)
self.assertFalse(x == None) # noqa: E711
self.assertTrue(x != None) # noqa: E711
(e_np, f_np, g_np) = exe.run(
main_program,
feed={"x": x_np, "y": y_np},
fetch_list=[e, f, g],
)
# np.testing.assert_array_equal(res_np_b, b_np)
# np.testing.assert_array_equal(res_np_c, c_np)
# np.testing.assert_array_equal(res_np_d, d_np)
np.testing.assert_array_equal(res_np_e, e_np)
np.testing.assert_array_equal(res_np_f, f_np)
np.testing.assert_array_equal(res_np_g, g_np)
x_np_1 = np.array([3, 4, 10, 14, 9, 18]).astype('float32')
y_np_2 = np.array([3, 4, 11, 15, 8, 18]).astype('float32')
x_np_3 = np.random.rand(0).astype("complex64")
y_np_4 = 4 + 5j
_test(x_np_1, y_np_2, 'float32')
_test(x_np_3, y_np_4, 'complex64')
def test_less(self):
paddle.disable_static()
x_np = np.array([3, 4, 10, 14, 9, 18]).astype('float32')
y_np = np.array([3, 4, 11, 15, 8, 18]).astype('float32')
z_np = np.array([3, 4, 10, 14, 9, 18]).astype('float32')
res_np_b = x_np < y_np
res_np_c = paddle.less_than(
paddle.to_tensor(x_np), paddle.to_tensor(y_np)
)
res_np_c_ = paddle.less(paddle.to_tensor(x_np), paddle.to_tensor(y_np))
res_np_d = x_np.__lt__(y_np)
res_np_e = x_np <= y_np
res_np_f = paddle.less_equal(
paddle.to_tensor(x_np), paddle.to_tensor(y_np)
)
res_np_g = x_np.__le__(y_np)
res_np_h = x_np <= z_np
paddle.enable_static()
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(name="x", shape=[-1, 1], dtype='float32')
y = paddle.static.data(name="y", shape=[-1, 1], dtype='float32')
z = paddle.static.data(name="z", shape=[-1, 1], dtype='float32')
b = x < y
c = x.less_than(y)
c_ = x.less(y)
d = x.__lt__(y)
e = x <= y
f = x.less_equal(y)
g = x.__le__(y)
h = x <= z
(b_np, c_np, c_np_, d_np, e_np, f_np, g_np, h_np) = exe.run(
main_program,
feed={"x": x_np, "y": y_np, "z": z_np},
fetch_list=[b, c, c_, d, e, f, g, h],
)
np.testing.assert_array_equal(res_np_b, b_np)
np.testing.assert_array_equal(res_np_c, c_np)
np.testing.assert_array_equal(res_np_c_, c_np_)
np.testing.assert_array_equal(res_np_d, d_np)
np.testing.assert_array_equal(res_np_e, e_np)
np.testing.assert_array_equal(res_np_f, f_np)
np.testing.assert_array_equal(res_np_g, g_np)
np.testing.assert_array_equal(res_np_h, h_np)
def test_greater(self):
paddle.disable_static()
x_np = np.array([3, 4, 10, 14, 9, 18]).astype('float32')
y_np = np.array([3, 4, 11, 15, 8, 18]).astype('float32')
z_np = np.array([3, 4, 10, 14, 9, 18]).astype('float32')
res_np_b = x_np > y_np
res_np_c = paddle.greater_than(
paddle.to_tensor(x_np), paddle.to_tensor(y_np)
)
res_np_d = x_np.__gt__(y_np)
res_np_e = x_np >= y_np
res_np_f = paddle.greater_equal(
paddle.to_tensor(x_np), paddle.to_tensor(y_np)
)
res_np_g = x_np.__ge__(y_np)
res_np_h = x_np >= z_np
paddle.enable_static()
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(name="x", shape=[-1, 1], dtype='float32')
y = paddle.static.data(name="y", shape=[-1, 1], dtype='float32')
z = paddle.static.data(name="z", shape=[-1, 1], dtype='float32')
b = x > y
c = x.greater_than(y)
d = x.__gt__(y)
e = x >= y
f = x.greater_equal(y)
g = x.__ge__(y)
h = x >= z
(b_np, c_np, d_np, e_np, f_np, g_np, h_np) = exe.run(
main_program,
feed={"x": x_np, "y": y_np, "z": z_np},
fetch_list=[b, c, d, e, f, g, h],
)
np.testing.assert_array_equal(res_np_b, b_np)
np.testing.assert_array_equal(res_np_c, c_np)
np.testing.assert_array_equal(res_np_d, d_np)
np.testing.assert_array_equal(res_np_e, e_np)
np.testing.assert_array_equal(res_np_f, f_np)
np.testing.assert_array_equal(res_np_g, g_np)
np.testing.assert_array_equal(res_np_h, h_np)
def test_item(self):
with paddle.pir_utils.IrGuard():
x = paddle.static.data(name='x', shape=[3, 2, 1])
y = paddle.static.data(name='y', shape=[1])
with self.assertRaises(ValueError):
x.item()
def test_place(self):
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
with paddle.pir_utils.IrGuard():
x = paddle.static.data(name='x', shape=[3, 2, 1])
_ = x.place
self.assertTrue(len(w) == 1)
self.assertTrue("place" in str(w[-1].message))
def test_cpu(self):
with paddle.pir_utils.IrGuard():
x = paddle.static.data(name='x', shape=[3, 2, 1])
x.cpu()
def test_cuda(self):
if base.is_compiled_with_cuda() or is_custom_device():
paddle.device.set_device(get_device())
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
with paddle.pir_utils.IrGuard():
x = paddle.static.data(name='x', shape=[3, 2, 1])
x.cpu()
x.cuda(1, False)
self.assertTrue(len(w) == 2)
self.assertTrue(
"device_id is not supported" in str(w[-2].message)
)
self.assertTrue(
"blocking is not supported" in str(w[-1].message)
)
paddle.device.set_device("cpu")
def test_some_dim(self):
with paddle.pir_utils.IrGuard():
x = paddle.static.data(name='x', shape=[3, 2, 1])
self.assertEqual(x.dim(), 3)
self.assertEqual(x.ndimension(), 3)
self.assertEqual(x.ndim, 3)
def test_size(self):
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.assign(np.random.rand(2, 3, 4).astype("float32"))
(output_x,) = exe.run(main_program, fetch_list=[x.size])
self.assertEqual(output_x, 24)
def test_T(self):
with paddle.pir_utils.IrGuard():
for ndim in range(5):
# shape is [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4]
shape = list(range(1, ndim + 1))
out_shape = list(reversed(shape))
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.rand(shape, dtype="float32")
x_T = x.T
self.assertEqual(x_T.shape, out_shape)
(output_x,) = exe.run(main_program, fetch_list=[x_T])
self.assertEqual(output_x.shape, tuple(out_shape))
def test_astype_zero_copy_if_same_dtype(self):
with paddle.pir_utils.IrGuard():
x = paddle.static.data(name='x', shape=[3, 2, 1])
y = x.astype(x.dtype)
self.assertTrue(x.is_same(y))
def test_mT(self):
with paddle.pir_utils.IrGuard():
shape = [1]
x = paddle.rand(shape, dtype="float32")
self.assertRaises(ValueError, getattr, x, 'mT')
for ndim in range(2, 5):
# shape is [1, 2], [1, 2, 3], [1, 2, 3, 4]
shape = list(range(1, ndim + 1))
out_shape = list(shape)
out_shape[-2], out_shape[-1] = out_shape[-1], out_shape[-2]
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.rand(shape, dtype="float32")
x_mT = x.mT
self.assertEqual(x_mT.shape, out_shape)
(output_x,) = exe.run(main_program, fetch_list=[x_mT])
self.assertEqual(output_x.shape, tuple(out_shape))
shape = [1, 2, 3, 0, 1]
out_shape = list(shape)
out_shape[-2], out_shape[-1] = out_shape[-1], out_shape[-2]
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.rand(shape, dtype="float32")
x_mT = x.mT
self.assertEqual(x_mT.shape, out_shape)
(output_x,) = exe.run(main_program, fetch_list=[x_mT])
self.assertEqual(output_x.shape, tuple(out_shape))
shape = [1, 2, 3, 1, 0]
out_shape = list(shape)
out_shape[-2], out_shape[-1] = out_shape[-1], out_shape[-2]
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.rand(shape, dtype="float32")
x_mT = x.mT
self.assertEqual(x_mT.shape, out_shape)
(output_x,) = exe.run(main_program, fetch_list=[x_mT])
self.assertEqual(output_x.shape, tuple(out_shape))
shape = [1, 2, 3, 0, 0]
out_shape = list(shape)
out_shape[-2], out_shape[-1] = out_shape[-1], out_shape[-2]
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.rand(shape, dtype="float32")
x_mT = x.mT
self.assertEqual(x_mT.shape, out_shape)
(output_x,) = exe.run(main_program, fetch_list=[x_mT])
self.assertEqual(output_x.shape, tuple(out_shape))
shape = [0, 2, 3, 0, 0]
out_shape = list(shape)
out_shape[-2], out_shape[-1] = out_shape[-1], out_shape[-2]
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.rand(shape, dtype="float32")
x_mT = x.mT
self.assertEqual(x_mT.shape, out_shape)
(output_x,) = exe.run(main_program, fetch_list=[x_mT])
self.assertEqual(output_x.shape, tuple(out_shape))
# test mT with dynamic shape
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(name="x", shape=[-1, 5], dtype='float32')
y = paddle.static.data(
name="y", shape=[2, -1, -1], dtype='float32'
)
z = paddle.static.data(
name="z", shape=[-1, 5, -1, -1], dtype='float32'
)
x_mT = x.mT
y_mT = y.mT
z_mT = z.mT
x_np = np.random.randn(12, 5).astype('float32')
y_np = np.random.randn(2, 3, 4).astype('float32')
z_np = np.random.randn(100, 5, 12, 13).astype('float32')
(x_mT_np, y_mT_np, z_mT_np) = exe.run(
main_program,
feed={"x": x_np, "y": y_np, "z": z_np},
fetch_list=[x_mT, y_mT, z_mT],
)
np.testing.assert_array_equal(x_mT_np.shape, (5, 12))
np.testing.assert_array_equal(y_mT_np.shape, (2, 4, 3))
np.testing.assert_array_equal(z_mT_np.shape, (100, 5, 13, 12))
def test_new_xxx(self):
with paddle.pir_utils.IrGuard():
shape = [1]
x = paddle.rand(shape, dtype="float32")
self.assertRaises(ValueError, getattr, x, 'mT')
for ndim in range(2, 5):
# shape is [1, 2], [1, 2, 3], [1, 2, 3, 4]
shape = list(range(1, ndim + 1))
out_shape = list(shape)
out_shape[-2], out_shape[-1] = out_shape[-1], out_shape[-2]
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.rand(shape, dtype="float32")
x_new = x.new_full([7], 1.0)
self.assertEqual(x_new.shape, [7])
(output_x,) = exe.run(main_program, fetch_list=[x_new])
self.assertEqual(output_x.shape, (7,))
shape = [1, 2, 3, 0, 1]
out_shape = list(shape)
out_shape[-2], out_shape[-1] = out_shape[-1], out_shape[-2]
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.rand(shape, dtype="float32")
x_new = x.new_full([3, 0], 4.0)
self.assertEqual(x_new.shape, [3, 0])
(output_x,) = exe.run(main_program, fetch_list=[x_new])
self.assertEqual(output_x.shape, (3, 0))
shape = [1, 2, 3, 1, 0]
out_shape = list(shape)
out_shape[-2], out_shape[-1] = out_shape[-1], out_shape[-2]
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.rand(shape, dtype="float32")
x_new = x.new_empty([2, 2])
self.assertEqual(x_new.shape, [2, 2])
(output_x,) = exe.run(main_program, fetch_list=[x_new])
self.assertEqual(output_x.shape, (2, 2))
shape = [1, 2, 3, 0, 0]
out_shape = list(shape)
out_shape[-2], out_shape[-1] = out_shape[-1], out_shape[-2]
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.rand(shape, dtype="float32")
x_new = x.new_ones([2, 2])
self.assertEqual(x_new.shape, [2, 2])
(output_x,) = exe.run(main_program, fetch_list=[x_new])
self.assertEqual(output_x.shape, (2, 2))
shape = [0, 2, 3, 0, 0]
out_shape = list(shape)
out_shape[-2], out_shape[-1] = out_shape[-1], out_shape[-2]
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.rand(shape, dtype="float32")
x_new = x.new_zeros([2, 3])
self.assertEqual(x_new.shape, [2, 3])
(output_x,) = exe.run(main_program, fetch_list=[x_new])
self.assertEqual(output_x.shape, (2, 3))
x_new = x.new_zeros(2, 3)
self.assertEqual(x_new.shape, [2, 3])
(output_x,) = exe.run(main_program, fetch_list=[x_new])
self.assertEqual(output_x.shape, (2, 3))
# test mT with dynamic shape
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(name="x", shape=[-1, 5], dtype='float32')
x_new = x.new_ones([2, 2])
x_np = np.random.randn(12, 5).astype('float32')
(x_new_np,) = exe.run(
main_program,
feed={"x": x_np},
fetch_list=[x_new],
)
np.testing.assert_array_equal(x_new_np.shape, (2, 2))
def test_hash(self):
with paddle.pir_utils.IrGuard():
_, _, program_guard = new_program()
with program_guard:
x = paddle.static.data('x', [2, 3])
self.assertEqual(hash(x), hash(id(x)))
def test_clone(self):
x_np = np.random.random(size=[100, 10]).astype('float64')
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(
name='x', shape=[100, 10], dtype="float64"
)
a = x.clone()
(a_np,) = exe.run(
main_program,
feed={"x": x_np},
fetch_list=[a],
)
np.testing.assert_array_equal(x_np, a_np)
self.assertNotEqual(id(x), id(a))
def test_append_pop(self):
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
item_1 = paddle.static.data(
name='item_1', shape=[2, 3], dtype="float32"
)
item_2 = paddle.static.data(
name='item_2', shape=[3, 3], dtype="float32"
)
item_3 = paddle.static.data(
name='item_3', shape=[4, 3], dtype="float32"
)
item_1_np = np.random.random(size=[2, 3]).astype('float32')
item_2_np = np.random.random(size=[3, 3]).astype('float32')
item_3_np = np.random.random(size=[4, 3]).astype('float32')
array = paddle.tensor.create_array('float32')
array.append(item_1)
array.append(item_2)
array.append(item_3)
sliced_item_1 = array[0]
popped_item_3 = array.pop()
final_length = paddle.tensor.array_length(array)
(
sliced_item_1_out,
popped_item_3_out,
final_length_out,
) = exe.run(
main_program,
feed={
"item_1": item_1_np,
"item_2": item_2_np,
"item_3": item_3_np,
},
fetch_list=[sliced_item_1, popped_item_3, final_length],
)
np.testing.assert_array_equal(sliced_item_1_out, item_1_np)
np.testing.assert_array_equal(popped_item_3_out, item_3_np)
np.testing.assert_array_equal(final_length_out.item(), 2)
with self.assertRaises(TypeError):
item_1.append(array)
def test_neg(self):
x_np = np.random.uniform(-1, 1, [10, 1024]).astype(np.float32)
res = -x_np
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(
name='x', shape=[10, 1024], dtype="float32"
)
a = -x
b = x.__neg__()
(a_np, b_np) = exe.run(
main_program,
feed={"x": x_np},
fetch_list=[a, b],
)
np.testing.assert_array_equal(res, a_np)
np.testing.assert_array_equal(res, b_np)
def test_negative(self):
x_np = np.random.uniform(-1, 1, [10, 1024]).astype(np.float32)
res = -x_np
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(
name='x', shape=[10, 1024], dtype="float32"
)
a = -x
b = x.negative()
c = paddle.negative(x)
(a_np, b_np, c_np) = exe.run(
main_program,
feed={"x": x_np},
fetch_list=[a, b, c],
)
np.testing.assert_array_equal(res, a_np)
np.testing.assert_array_equal(res, b_np)
np.testing.assert_array_equal(res, c_np)
def test_abs(self):
# test for real number
x_np = np.random.uniform(-1, 1, [10, 1024]).astype(np.float32)
res = abs(x_np)
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(
name='x', shape=[10, 1024], dtype="float32"
)
a = abs(x)
b = x.__abs__()
(a_np, b_np) = exe.run(
main_program,
feed={"x": x_np},
fetch_list=[a, b],
)
np.testing.assert_array_equal(res, a_np)
np.testing.assert_array_equal(res, b_np)
def test_abs_complex(self):
# test for complex number
x_np = np.random.uniform(-1, 1, [10, 1024]).astype(
np.float32
) + 1j * np.random.uniform(-1, 1, [10, 1024]).astype(np.float32)
res = abs(x_np)
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x = paddle.static.data(
name='x', shape=[10, 1024], dtype="complex64"
)
a = abs(x)
b = x.__abs__()
(a_np, b_np) = exe.run(
main_program,
feed={"x": x_np},
fetch_list=[a, b],
)
np.testing.assert_allclose(res, a_np, rtol=2e-7, atol=0.0)
np.testing.assert_allclose(res, b_np, rtol=2e-7, atol=0.0)
def test_builtin_type_conversion(self):
with paddle.pir_utils.IrGuard():
_, _, program_guard = new_program()
with program_guard:
x = paddle.static.data(name='x', shape=[], dtype="float32")
with self.assertRaises(TypeError):
int(x)
with self.assertRaises(TypeError):
float(x)
with self.assertRaises(TypeError):
bool(x)
with self.assertRaises(TypeError):
complex(x)
def test_builtin_type_conversion_old_ir(self):
with paddle.pir_utils.DygraphOldIrGuard():
_, _, program_guard = new_program()
with program_guard:
x = paddle.static.data(name='x', shape=[], dtype="float32")
with self.assertRaises(TypeError):
int(x)
with self.assertRaises(TypeError):
float(x)
with self.assertRaises(TypeError):
complex(x)
def test_math_exists(self):
with paddle.pir_utils.IrGuard():
a = paddle.static.data(name='a', shape=[1], dtype='float32')
self.assertTrue(isinstance(a, paddle.pir.Value))
self.assertTrue(inspect.ismethod(a.dot))
self.assertTrue(inspect.ismethod(a.logsumexp))
self.assertTrue(inspect.ismethod(a.multiplex))
self.assertTrue(inspect.ismethod(a.prod))
self.assertTrue(inspect.ismethod(a.scale))
self.assertTrue(inspect.ismethod(a.stanh))
self.assertTrue(inspect.ismethod(a.add_n))
self.assertTrue(inspect.ismethod(a.max))
self.assertTrue(inspect.ismethod(a.maximum))
self.assertTrue(inspect.ismethod(a.min))
self.assertTrue(inspect.ismethod(a.minimum))
self.assertTrue(inspect.ismethod(a.floor_divide))
self.assertTrue(inspect.ismethod(a.remainder))
self.assertTrue(inspect.ismethod(a.floor_mod))
self.assertTrue(inspect.ismethod(a.multiply))
self.assertTrue(inspect.ismethod(a.inverse))
self.assertTrue(inspect.ismethod(a.log1p))
self.assertTrue(inspect.ismethod(a.erf))
self.assertTrue(inspect.ismethod(a.addmm))
self.assertTrue(inspect.ismethod(a.clip))
self.assertTrue(inspect.ismethod(a.trace))
self.assertTrue(inspect.ismethod(a.kron))
self.assertTrue(inspect.ismethod(a.isinf))
self.assertTrue(inspect.ismethod(a.isnan))
self.assertTrue(inspect.ismethod(a.concat))
self.assertTrue(inspect.ismethod(a.broadcast_to))
self.assertTrue(inspect.ismethod(a.scatter_nd_add))
self.assertTrue(inspect.ismethod(a.scatter_nd))
self.assertTrue(inspect.ismethod(a.shard_index))
self.assertTrue(inspect.ismethod(a.chunk))
self.assertTrue(inspect.ismethod(a.stack))
self.assertTrue(inspect.ismethod(a.strided_slice))
self.assertTrue(inspect.ismethod(a.unsqueeze))
self.assertTrue(inspect.ismethod(a.unstack))
self.assertTrue(inspect.ismethod(a.argmax))
self.assertTrue(inspect.ismethod(a.argmin))
self.assertTrue(inspect.ismethod(a.argsort))
self.assertTrue(inspect.ismethod(a.masked_select))
self.assertTrue(inspect.ismethod(a.topk))
self.assertTrue(inspect.ismethod(a.index_select))
self.assertTrue(inspect.ismethod(a.nonzero))
self.assertTrue(inspect.ismethod(a.sort))
self.assertTrue(inspect.ismethod(a.index_sample))
self.assertTrue(inspect.ismethod(a.mean))
self.assertTrue(inspect.ismethod(a.std))
self.assertTrue(inspect.ismethod(a.numel))
self.assertTrue(inspect.ismethod(a.asin_))
self.assertTrue(inspect.ismethod(a.atan2))
self.assertTrue(inspect.ismethod(a.atanh_))
self.assertTrue(inspect.ismethod(a.diagflat))
self.assertTrue(inspect.ismethod(a.multinomial))
self.assertTrue(inspect.ismethod(a.pinv))
self.assertTrue(inspect.ismethod(a.renorm))
self.assertTrue(inspect.ismethod(a.renorm_))
self.assertTrue(inspect.ismethod(a.tan))
self.assertTrue(inspect.ismethod(a.tan_))
self.assertTrue(inspect.ismethod(a.tril))
self.assertTrue(inspect.ismethod(a.tril_))
self.assertTrue(inspect.ismethod(a.triu))
self.assertTrue(inspect.ismethod(a.triu_))
self.assertTrue(inspect.ismethod(a.stft))
self.assertTrue(inspect.ismethod(a.istft))
self.assertTrue(inspect.ismethod(a.abs_))
self.assertTrue(inspect.ismethod(a.acos_))
self.assertTrue(inspect.ismethod(a.atan_))
self.assertTrue(inspect.ismethod(a.cos_))
self.assertTrue(inspect.ismethod(a.cosh_))
self.assertTrue(inspect.ismethod(a.sin_))
self.assertTrue(inspect.ismethod(a.sinh_))
self.assertTrue(inspect.ismethod(a.acosh_))
self.assertTrue(inspect.ismethod(a.asinh_))
self.assertTrue(inspect.ismethod(a.diag))
def test_binary_op_with_scalar(self):
with paddle.pir_utils.IrGuard():
main_program, exe, program_guard = new_program()
with program_guard:
x_np = np.array(10, dtype=np.int32)
x = paddle.static.data(name='x', shape=[], dtype="int32")
y1 = x / 2
y2 = x / 5.0
y3 = x // 2
y4 = x * 8.0
self.assertEqual(y1.dtype, paddle.pir.core.DataType.FLOAT32)
self.assertEqual(y2.dtype, paddle.pir.core.DataType.FLOAT32)
self.assertEqual(y3.dtype, paddle.pir.core.DataType.INT32)
self.assertEqual(y4.dtype, paddle.pir.core.DataType.FLOAT32)
(y1_out, y2_out, y3_out, y4_out) = exe.run(
main_program,
feed={
"x": x_np,
},
fetch_list=[y1, y2, y3, y4],
)
np.testing.assert_allclose(x_np / 2, y1_out, rtol=1e-05)
np.testing.assert_allclose(x_np / 5.0, y2_out, rtol=1e-05)
np.testing.assert_allclose(x_np // 2, y3_out, atol=1e-05)
np.testing.assert_allclose(x_np * 8.0, y4_out, rtol=1e-05)
if __name__ == '__main__':
unittest.main()