Files
paddlepaddle--paddle/test/legacy_test/test_api_compatibility_part2.py
2026-07-13 12:40:42 +08:00

3231 lines
116 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) 2025 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 unittest
import numpy as np
import paddle
# Test flex_attention mask helpers compatibility
class TestFlexAttentionMasksAPI(unittest.TestCase):
def setUp(self):
self.np_b = np.array([[0, 1, 0], [1, 0, 1]], dtype='int64')
self.np_h = np.array([[0, 1, 1], [0, 0, 1]], dtype='int64')
self.np_q_idx = np.array([[0, 2, 4], [3, 5, 7]], dtype='int64')
self.np_kv_idx = np.array([[1, 2, 3], [4, 4, 8]], dtype='int64')
self.ref_ge = self.np_q_idx >= self.np_kv_idx
self.ref_h_zero = self.np_h == 0
def mask_q_ge_kv(self, b, h, q_idx, kv_idx):
return q_idx >= kv_idx
def mask_h_zero(self, b, h, q_idx, kv_idx):
return h == 0
def test_dygraph_Compatibility(self):
paddle.disable_static()
b = paddle.to_tensor(self.np_b)
h = paddle.to_tensor(self.np_h)
q_idx = paddle.to_tensor(self.np_q_idx)
kv_idx = paddle.to_tensor(self.np_kv_idx)
# 1. PyTorch positional arguments
out1 = paddle.nn.attention.flex_attention.or_masks(
self.mask_q_ge_kv, self.mask_h_zero
)(b, h, q_idx, kv_idx)
out2 = paddle.nn.attention.flex_attention.and_masks(
self.mask_q_ge_kv, self.mask_h_zero
)(b, h, q_idx, kv_idx)
out3 = paddle.nn.attention.flex_attention.or_masks(self.mask_q_ge_kv)(
b, h, q_idx, kv_idx
)
out4 = paddle.nn.attention.flex_attention.and_masks(self.mask_h_zero)(
b, h, q_idx, kv_idx
)
out5 = paddle.nn.attention.flex_attention.or_masks()(
b, h, q_idx, kv_idx
)
out6 = paddle.nn.attention.flex_attention.and_masks()(
b, h, q_idx, kv_idx
)
refs = [
np.logical_or(self.ref_ge, self.ref_h_zero),
np.logical_and(self.ref_ge, self.ref_h_zero),
self.ref_ge,
self.ref_h_zero,
np.array(False),
np.array(True),
]
for out, ref in zip([out1, out2, out3, out4, out5, out6], refs):
np.testing.assert_array_equal(out.numpy(), ref)
with self.assertRaises(RuntimeError):
paddle.nn.attention.flex_attention.or_masks(self.mask_q_ge_kv, 1)
with self.assertRaises(RuntimeError):
paddle.nn.attention.flex_attention.and_masks(1, self.mask_h_zero)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
b = paddle.static.data(name="b", shape=[2, 3], dtype='int64')
h = paddle.static.data(name="h", shape=[2, 3], dtype='int64')
q_idx = paddle.static.data(
name="q_idx", shape=[2, 3], dtype='int64'
)
kv_idx = paddle.static.data(
name="kv_idx", shape=[2, 3], dtype='int64'
)
# 1. PyTorch positional arguments
out1 = paddle.nn.attention.flex_attention.or_masks(
self.mask_q_ge_kv, self.mask_h_zero
)(b, h, q_idx, kv_idx)
out2 = paddle.nn.attention.flex_attention.and_masks(
self.mask_q_ge_kv, self.mask_h_zero
)(b, h, q_idx, kv_idx)
out3 = paddle.nn.attention.flex_attention.or_masks(
self.mask_q_ge_kv
)(b, h, q_idx, kv_idx)
out4 = paddle.nn.attention.flex_attention.and_masks(
self.mask_h_zero
)(b, h, q_idx, kv_idx)
out5 = paddle.nn.attention.flex_attention.or_masks()(
b, h, q_idx, kv_idx
)
out6 = paddle.nn.attention.flex_attention.and_masks()(
b, h, q_idx, kv_idx
)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={
"b": self.np_b,
"h": self.np_h,
"q_idx": self.np_q_idx,
"kv_idx": self.np_kv_idx,
},
fetch_list=[out1, out2, out3, out4, out5, out6],
)
refs = [
np.logical_or(self.ref_ge, self.ref_h_zero),
np.logical_and(self.ref_ge, self.ref_h_zero),
self.ref_ge,
self.ref_h_zero,
np.array(False),
np.array(True),
]
for out, ref in zip(fetches, refs):
np.testing.assert_array_equal(out, ref)
# Test block_diag compatibility
class TestBlockDiagAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(2, 3).astype('float32')
self.np_y = np.random.rand(3, 4).astype('float32')
self.np_z = np.random.rand(1, 2).astype('float32')
def _ref_block_diag(self, *arrays):
import scipy.linalg
return scipy.linalg.block_diag(*arrays)
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
y = paddle.to_tensor(self.np_y)
z = paddle.to_tensor(self.np_z)
# 1. Paddle positional arguments
out1 = paddle.block_diag([x, y, z])
# 2. Paddle keyword arguments
out2 = paddle.block_diag(inputs=[x, y, z])
# 3. PyTorch positional arguments
out3 = paddle.block_diag(x, y, z)
ref_out = self._ref_block_diag(self.np_x, self.np_y, self.np_z)
for out in [out1, out2, out3]:
np.testing.assert_allclose(ref_out, out.numpy(), rtol=1e-5)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[2, 3], dtype='float32')
y = paddle.static.data(name="y", shape=[3, 4], dtype='float32')
z = paddle.static.data(name="z", shape=[1, 2], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.block_diag([x, y, z])
# 2. Paddle keyword arguments
out2 = paddle.block_diag(inputs=[x, y, z])
# 3. PyTorch positional arguments
out3 = paddle.block_diag(x, y, z)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x, "y": self.np_y, "z": self.np_z},
fetch_list=[out1, out2, out3],
)
ref_out = self._ref_block_diag(self.np_x, self.np_y, self.np_z)
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5)
# Test broadcast_tensors compatibility
class TestBroadcastTensorsAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(3, 1).astype('float32')
self.np_y = np.random.rand(1, 4).astype('float32')
self.np_z = np.random.rand(3, 4).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
y = paddle.to_tensor(self.np_y)
z = paddle.to_tensor(self.np_z)
# 1. Paddle positional arguments
outs1 = paddle.broadcast_tensors([x, y, z])
# 2. Paddle keyword arguments
outs2 = paddle.broadcast_tensors(input=[x, y, z])
# 3. PyTorch positional arguments
outs3 = paddle.broadcast_tensors(x, y, z)
# Verify all outputs
ref_x = np.broadcast_to(self.np_x, [3, 4])
ref_y = np.broadcast_to(self.np_y, [3, 4])
ref_z = np.broadcast_to(self.np_z, [3, 4])
refs = [ref_x, ref_y, ref_z]
for outs in [outs1, outs2, outs3]:
self.assertEqual(len(outs), 3)
for i, ref in enumerate(refs):
np.testing.assert_allclose(ref, outs[i].numpy())
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[3, 1], dtype='float32')
y = paddle.static.data(name="y", shape=[1, 4], dtype='float32')
z = paddle.static.data(name="z", shape=[3, 4], dtype='float32')
# 1. Paddle positional arguments
outs1 = paddle.broadcast_tensors([x, y, z])
# 2. Paddle keyword arguments
outs2 = paddle.broadcast_tensors(input=[x, y, z])
# 3. PyTorch positional arguments
outs3 = paddle.broadcast_tensors(x, y, z)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x, "y": self.np_y, "z": self.np_z},
fetch_list=[
outs1[0],
outs1[1],
outs1[2],
outs2[0],
outs2[1],
outs2[2],
outs3[0],
outs3[1],
outs3[2],
],
)
ref_x = np.broadcast_to(self.np_x, [3, 4])
ref_y = np.broadcast_to(self.np_y, [3, 4])
ref_z = np.broadcast_to(self.np_z, [3, 4])
refs = [ref_x, ref_y, ref_z] * 3
for i, ref in enumerate(refs):
np.testing.assert_allclose(fetches[i], ref)
# Test cartesian_prod compatibility
class TestCartesianProdAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array([1, 2, 3], dtype='int64')
self.np_y = np.array([4, 5, 6, 7], dtype='int64')
def compute_ref_output(self):
# Compute cartesian product
x_grid, y_grid = np.meshgrid(self.np_x, self.np_y, indexing='ij')
return np.stack([x_grid.ravel(), y_grid.ravel()], axis=-1)
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
y = paddle.to_tensor(self.np_y)
# 1. Paddle positional arguments
out1 = paddle.cartesian_prod([x, y])
# 2. Paddle keyword arguments
out2 = paddle.cartesian_prod(x=[x, y])
# 3. PyTorch positional arguments
out3 = paddle.cartesian_prod(x, y)
# Verify outputs
ref_out = self.compute_ref_output()
for out in [out1, out2, out3]:
np.testing.assert_array_equal(ref_out, out.numpy())
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[3], dtype='int64')
y = paddle.static.data(name="y", shape=[4], dtype='int64')
# 1. Paddle positional arguments
out1 = paddle.cartesian_prod([x, y])
# 2. Paddle keyword arguments
out2 = paddle.cartesian_prod(x=[x, y])
# 3. PyTorch positional arguments
out3 = paddle.cartesian_prod(x, y)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x, "y": self.np_y},
fetch_list=[out1, out2, out3],
)
ref_out = self.compute_ref_output()
for out in fetches:
np.testing.assert_array_equal(out, ref_out)
# Test copysign compatibility
class TestCopysignAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.randn(3, 4).astype('float32')
self.np_y = np.random.randn(3, 4).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
y = paddle.to_tensor(self.np_y)
# 1. Paddle positional arguments
out1 = paddle.copysign(x, y)
# 2. Paddle keyword arguments
out2 = paddle.copysign(x=x, y=y)
# 3. PyTorch keyword arguments
out3 = paddle.copysign(input=x, other=y)
# 4. Mixed arguments
out4 = paddle.copysign(x, other=y)
# 5-6. out parameter test
out5 = paddle.empty_like(x)
out6 = paddle.copysign(x, y, out=out5)
# 7. Class method positional arguments
out7 = x.copysign(y)
# 8. Class method keyword arguments
out8 = x.copysign(y=y)
# Verify all outputs
ref_out = np.copysign(self.np_x, self.np_y)
for out in [out1, out2, out3, out4, out5, out6, out7, out8]:
np.testing.assert_allclose(ref_out, out.numpy(), rtol=1e-5)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[3, 4], dtype='float32')
y = paddle.static.data(name="y", shape=[3, 4], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.copysign(x, y)
# 2. Paddle keyword arguments
out2 = paddle.copysign(x=x, y=y)
# 3. PyTorch keyword arguments
out3 = paddle.copysign(input=x, other=y)
# 4. Class method positional arguments
out4 = x.copysign(y)
# 5. Class method keyword arguments
out5 = x.copysign(y=y)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x, "y": self.np_y},
fetch_list=[out1, out2, out3, out4, out5],
)
ref_out = np.copysign(self.np_x, self.np_y)
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5)
# Test Tensor.copysign_ inplace compatibility
class TestTensorCopysignInplaceAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.randn(3, 4).astype('float32')
self.np_y = np.random.randn(3, 4).astype('float32')
def test_dygraph_inplace_Compatibility(self):
paddle.disable_static()
y = paddle.to_tensor(self.np_y)
ref_out = np.copysign(self.np_x, self.np_y)
# 1. Class method positional arguments
out1 = paddle.to_tensor(self.np_x)
out1.copysign_(y)
# 2. Class method keyword arguments
out2 = paddle.to_tensor(self.np_x)
out2.copysign_(y=y)
# 3. PyTorch keyword arguments
out3 = paddle.to_tensor(self.np_x)
out3.copysign_(other=y)
for out in [out1, out2, out3]:
np.testing.assert_allclose(ref_out, out.numpy(), rtol=1e-5)
paddle.enable_static()
# Test Tensor.geometric_ inplace compatibility
class TestTensorGeometricInplaceAPI(unittest.TestCase):
def test_dygraph_inplace_Compatibility(self):
paddle.disable_static()
# 1. Class method positional arguments
out1 = paddle.empty([10000], dtype='float32')
out1.geometric_(0.3)
# 2. Class method keyword arguments
out2 = paddle.empty([10000], dtype='float32')
out2.geometric_(p=0.3)
# 3. PyTorch keyword arguments
out3 = paddle.empty([10000], dtype='float32')
out3.geometric_(probs=0.3)
for out in [out1, out2, out3]:
self.assertEqual(out.shape, [10000])
self.assertTrue((out.numpy() > 0).all())
paddle.enable_static()
# Test Tensor.hypot_ inplace compatibility
class TestTensorHypotInplaceAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(3, 4).astype('float32') + 1.0
self.np_y = np.random.rand(3, 4).astype('float32') + 1.0
def test_dygraph_inplace_Compatibility(self):
paddle.disable_static()
y = paddle.to_tensor(self.np_y)
ref_out = np.hypot(self.np_x, self.np_y)
# 1. Class method positional arguments
out1 = paddle.to_tensor(self.np_x)
out1.hypot_(y)
# 2. Class method keyword arguments
out2 = paddle.to_tensor(self.np_x)
out2.hypot_(y=y)
# 3. PyTorch keyword arguments
out3 = paddle.to_tensor(self.np_x)
out3.hypot_(other=y)
for out in [out1, out2, out3]:
np.testing.assert_allclose(ref_out, out.numpy(), rtol=1e-5)
paddle.enable_static()
# Test index_fill compatibility
class TestIndexFillAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(5, 6).astype('float32')
self.np_index = np.array([1, 3, 4], dtype='int64')
def compute_ref_output(self):
ref = self.np_x.copy()
ref[:, self.np_index] = -1.0
return ref
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
index = paddle.to_tensor(self.np_index)
# 1. Paddle positional arguments
out1 = paddle.index_fill(x, index, 1, -1.0)
# 2. Paddle keyword arguments
out2 = paddle.index_fill(x=x, index=index, axis=1, value=-1.0)
# 3. PyTorch positional arguments
out3 = paddle.index_fill(x, 1, index, -1.0)
# 4. PyTorch keyword arguments
out4 = paddle.index_fill(input=x, dim=1, index=index, value=-1.0)
# 5. Mixed arguments
out5 = paddle.index_fill(x, index, axis=1, value=-1.0)
# 6. Class method positional arguments
out6 = x.index_fill(index, 1, -1.0)
# 7. Class method keyword arguments
out7 = x.index_fill(index=index, axis=1, value=-1.0)
# Verify all outputs
ref_out = self.compute_ref_output()
for out in [out1, out2, out3, out4, out5, out6, out7]:
np.testing.assert_allclose(ref_out, out.numpy(), rtol=1e-5)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[5, 6], dtype='float32')
index = paddle.static.data(name="index", shape=[3], dtype='int64')
# 1. Paddle positional arguments
out1 = paddle.index_fill(x, index, 1, -1.0)
# 2. Paddle keyword arguments
out2 = paddle.index_fill(x=x, index=index, axis=1, value=-1.0)
# 3. PyTorch positional arguments
out3 = paddle.index_fill(x, 1, index, -1.0)
# 4. PyTorch keyword arguments
out4 = paddle.index_fill(input=x, dim=1, index=index, value=-1.0)
# 5. Class method positional arguments
out5 = x.index_fill(index, 1, -1.0)
# 6. Class method keyword arguments
out6 = x.index_fill(index=index, axis=1, value=-1.0)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x, "index": self.np_index},
fetch_list=[out1, out2, out3, out4, out5, out6],
)
ref_out = self.compute_ref_output()
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5)
@unittest.skipIf(
paddle.is_compiled_with_xpu(),
"skip xpu which not support index_fill_ (which use stride)",
)
# Test Tensor.index_fill_ inplace compatibility
class TestTensorIndexFillInplaceAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(5, 6).astype('float32')
self.np_index = np.array([1, 3, 4], dtype='int64')
def compute_ref_output(self):
ref = self.np_x.copy()
ref[:, self.np_index] = -1.0
return ref
def test_dygraph_inplace_Compatibility(self):
paddle.disable_static()
index = paddle.to_tensor(self.np_index)
ref_out = self.compute_ref_output()
# 1. Class method positional arguments
out1 = paddle.to_tensor(self.np_x)
out1.index_fill_(index, 1, -1.0)
# 2. Class method keyword arguments
out2 = paddle.to_tensor(self.np_x)
out2.index_fill_(index=index, axis=1, value=-1.0)
# 3. PyTorch positional arguments
out3 = paddle.to_tensor(self.np_x)
out3.index_fill_(1, index, -1.0)
# 4. PyTorch keyword arguments
out4 = paddle.to_tensor(self.np_x)
out4.index_fill_(dim=1, index=index, value=-1.0)
# 5. Mixed arguments
out5 = paddle.to_tensor(self.np_x)
out5.index_fill_(index, axis=1, value=-1.0)
for out in [out1, out2, out3, out4, out5]:
np.testing.assert_allclose(ref_out, out.numpy(), rtol=1e-5)
# Test cross compatibility
class TestCrossAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(3, 3, 3).astype('float32')
self.np_y = np.random.rand(3, 3, 3).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
y = paddle.to_tensor(self.np_y)
# 1. Paddle positional arguments (all positional: x, y, axis
out1 = paddle.cross(x, y, 1)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.cross(x=x, y=y, axis=1)
# 3. PyTorch keyword arguments (using aliases input, other, dim)
out3 = paddle.cross(input=x, other=y, dim=1)
# 4. Mixed arguments
out4 = paddle.cross(x, y=y, axis=1)
# 5. Class method positional arguments
out5 = x.cross(y, 1)
# 6. Class method keyword arguments
out6 = x.cross(y=y, axis=1)
# Verify all outputs
ref_out = np.cross(self.np_x, self.np_y, axisa=1, axisb=1, axisc=1)
for out in [out1, out2, out3, out4, out5, out6]:
np.testing.assert_allclose(out.numpy(), ref_out, rtol=1e-5)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[3, 3, 3], dtype='float32')
y = paddle.static.data(name="y", shape=[3, 3, 3], dtype='float32')
# 1. Paddle positional arguments (all positional: x, y, axis
out1 = paddle.cross(x, y, 1)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.cross(x=x, y=y, axis=1)
# 3. PyTorch keyword arguments (using aliases input, other, dim)
out3 = paddle.cross(input=x, other=y, dim=1)
# 4. Class method positional arguments
out4 = x.cross(y, 1)
# 5. Class method keyword arguments
out5 = x.cross(y=y, axis=1)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x, "y": self.np_y},
fetch_list=[out1, out2, out3, out4, out5],
)
# Verify all outputs
ref_out = np.cross(self.np_x, self.np_y, axisa=1, axisb=1, axisc=1)
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5)
class TestLinalgCrossAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
# Shape [3, 2, 3] ensures default dim=-1 (last dim=2) is distinct from auto-axis (first len-3 dim=0)
# Both dim 0 and dim 2 have size 3, so cross is valid on both
self.np_x = np.random.rand(3, 2, 3).astype('float32')
self.np_y = np.random.rand(3, 2, 3).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
y = paddle.to_tensor(self.np_y)
# 1. linalg.cross with default dim=-1
out1 = paddle.linalg.cross(x, y)
# 2. linalg.cross with explicit dim=-1
out2 = paddle.linalg.cross(x, y, dim=-1)
# 3. linalg.cross using input/other/dim PyTorch-style keywords, dim=2
out3 = paddle.linalg.cross(input=x, other=y, dim=2)
# 4. Mixed arguments
out4 = paddle.linalg.cross(x, other=y, dim=0)
# Verify default is equivalent to dim=-1
ref_out_neg1 = np.cross(
self.np_x, self.np_y, axisa=-1, axisb=-1, axisc=-1
)
np.testing.assert_allclose(out1.numpy(), ref_out_neg1, rtol=1e-5)
np.testing.assert_allclose(out2.numpy(), ref_out_neg1, rtol=1e-5)
# Verify dim=2 is same as dim=-1 (last dim)
np.testing.assert_allclose(out3.numpy(), ref_out_neg1, rtol=1e-5)
# Verify dim=0 gives different result
ref_out_0 = np.cross(self.np_x, self.np_y, axisa=0, axisb=0, axisc=0)
np.testing.assert_allclose(out4.numpy(), ref_out_0, rtol=1e-5)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[3, 2, 3], dtype='float32')
y = paddle.static.data(name="y", shape=[3, 2, 3], dtype='float32')
# 1. linalg.cross with default dim=-1
out1 = paddle.linalg.cross(x, y)
# 2. linalg.cross with explicit dim=0
out2 = paddle.linalg.cross(x, y, dim=0)
# 3. linalg.cross using input/other/dim keywords with dim=2
out3 = paddle.linalg.cross(input=x, other=y, dim=2)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x, "y": self.np_y},
fetch_list=[out1, out2, out3],
)
# Verify default is equivalent to dim=-1
ref_out_neg1 = np.cross(
self.np_x, self.np_y, axisa=-1, axisb=-1, axisc=-1
)
np.testing.assert_allclose(fetches[0], ref_out_neg1, rtol=1e-5)
# Verify dim=0
ref_out_0 = np.cross(
self.np_x, self.np_y, axisa=0, axisb=0, axisc=0
)
np.testing.assert_allclose(fetches[1], ref_out_0, rtol=1e-5)
# Verify dim=2
ref_out_2 = np.cross(
self.np_x, self.np_y, axisa=2, axisb=2, axisc=2
)
np.testing.assert_allclose(fetches[2], ref_out_2, rtol=1e-5)
# Test dist compatibility
class TestDistAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(2, 2).astype('float32')
self.np_y = np.random.rand(2, 2).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
y = paddle.to_tensor(self.np_y)
# 1. Paddle positional arguments (all positional: x, y, p
out1 = paddle.dist(x, y, 2.0)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.dist(x=x, y=y, p=2.0)
# 3. PyTorch keyword arguments (using aliases input and other)
out3 = paddle.dist(input=x, other=y, p=2.0)
# 4. Mixed arguments
out4 = paddle.dist(x, y, p=2.0)
# 5. Class method positional arguments
out5 = x.dist(y, 2.0)
# 6. Class method keyword arguments
out6 = x.dist(y=y, p=2.0)
# Verify all outputs
ref_out = float(np.linalg.norm((self.np_x - self.np_y).flatten()))
for out in [out1, out2, out3, out4, out5, out6]:
np.testing.assert_allclose(out.numpy(), ref_out, rtol=1e-5)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[2, 2], dtype='float32')
y = paddle.static.data(name="y", shape=[2, 2], dtype='float32')
# 1. Paddle positional arguments (all positional: x, y, p
out1 = paddle.dist(x, y, 2.0)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.dist(x=x, y=y, p=2.0)
# 3. PyTorch keyword arguments (using aliases input and other)
out3 = paddle.dist(input=x, other=y, p=2.0)
# 4. Class method positional arguments
out4 = x.dist(y, 2.0)
# 5. Class method keyword arguments
out5 = x.dist(y=y, p=2.0)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x, "y": self.np_y},
fetch_list=[out1, out2, out3, out4, out5],
)
# Verify all outputs
ref_out = float(np.linalg.norm((self.np_x - self.np_y).flatten()))
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5)
# Test flip compatibility
class TestFlipAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(3, 2, 2).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle positional arguments
out1 = paddle.flip(x, [0, 1])
# 2. Paddle keyword arguments
out2 = paddle.flip(x=x, axis=[0, 1])
# 3. PyTorch keyword arguments (using aliases input and dims)
out3 = paddle.flip(input=x, dims=[0, 1])
# 4. Mixed arguments
out4 = paddle.flip(x, axis=[0, 1])
# 5. Class method positional arguments
out5 = x.flip([0, 1])
# 6. Class method keyword arguments
out6 = x.flip(axis=[0, 1])
# Verify all outputs
ref_out = np.flip(self.np_x, axis=[0, 1])
for out in [out1, out2, out3, out4, out5, out6]:
np.testing.assert_allclose(out.numpy(), ref_out, rtol=1e-5)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[3, 2, 2], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.flip(x, [0, 1])
# 2. Paddle keyword arguments
out2 = paddle.flip(x=x, axis=[0, 1])
# 3. PyTorch keyword arguments (using aliases input and dims)
out3 = paddle.flip(input=x, dims=[0, 1])
# 4. Class method positional arguments
out4 = x.flip([0, 1])
# 5. Class method keyword arguments
out5 = x.flip(axis=[0, 1])
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3, out4, out5],
)
# Verify all outputs
ref_out = np.flip(self.np_x, axis=[0, 1])
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5)
# Test count_nonzero compatibility
class TestCountNonzeroAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.randint(-1, 2, [3, 4, 5]).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
ref_axis = np.count_nonzero(self.np_x, axis=1, keepdims=True)
# 1. Paddle positional arguments
out1 = paddle.count_nonzero(x, 1, True)
# 2. Paddle keyword arguments
out2 = paddle.count_nonzero(x=x, axis=1, keepdim=True)
# 3. PyTorch keyword arguments
out3 = paddle.count_nonzero(input=x, dim=1, keepdim=True)
# 4. Mixed arguments
out4 = paddle.count_nonzero(x, axis=1, keepdim=True)
# 5. Class method positional arguments
out5 = x.count_nonzero(1, True)
# 6. Class method keyword arguments
out6 = x.count_nonzero(dim=1, keepdim=True)
for out in [out1, out2, out3, out4, out5, out6]:
np.testing.assert_allclose(out.numpy(), ref_axis)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[3, 4, 5], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.count_nonzero(x, 1, True)
# 2. Paddle keyword arguments
out2 = paddle.count_nonzero(x=x, axis=1, keepdim=True)
# 3. PyTorch keyword arguments
out3 = paddle.count_nonzero(input=x, dim=1, keepdim=True)
# 4. Class method positional arguments
out4 = x.count_nonzero(1, True)
# 5. Class method keyword arguments
out5 = x.count_nonzero(dim=1, keepdim=True)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3, out4, out5],
)
ref = np.count_nonzero(self.np_x, axis=1, keepdims=True)
for out in fetches:
np.testing.assert_allclose(out, ref)
# Test renorm compatibility
class TestRenormAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(2, 2, 3).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle positional arguments (all positional: x, p, axis, max_norm
out1 = paddle.renorm(x, 1.0, 2, 2.05)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.renorm(x=x, p=1.0, axis=2, max_norm=2.05)
# 3. PyTorch keyword arguments (using aliases input, dim, maxnorm)
out3 = paddle.renorm(input=x, p=1.0, dim=2, maxnorm=2.05)
# 4. Mixed arguments
out4 = paddle.renorm(x, p=1.0, axis=2, max_norm=2.05)
# 5. Class method positional arguments
out5 = x.renorm(1.0, 2, 2.05)
# 6. Class method keyword arguments
out6 = x.renorm(p=1.0, axis=2, max_norm=2.05)
# Verify all outputs
for out in [out1, out2, out3, out4, out5, out6]:
np.testing.assert_allclose(out.numpy(), out1.numpy(), rtol=1e-5)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[2, 2, 3], dtype='float32')
# 1. Paddle positional arguments (all positional: x, p, axis, max_norm
out1 = paddle.renorm(x, 1.0, 2, 2.05)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.renorm(x=x, p=1.0, axis=2, max_norm=2.05)
# 3. PyTorch keyword arguments (using aliases input, dim, maxnorm)
out3 = paddle.renorm(input=x, p=1.0, dim=2, maxnorm=2.05)
# 4. Class method positional arguments
out4 = x.renorm(1.0, 2, 2.05)
# 5. Class method keyword arguments
out5 = x.renorm(p=1.0, axis=2, max_norm=2.05)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3, out4, out5],
)
# Verify all outputs
for out in fetches[1:]:
np.testing.assert_allclose(out, fetches[0], rtol=1e-5)
# Test renorm_ inplace compatibility
class TestRenormInplaceAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(2, 2, 3).astype('float32')
def test_dygraph_inplace_Compatibility(self):
paddle.disable_static()
ref_x = self.np_x.copy()
# 1. Class method positional arguments
out1 = paddle.to_tensor(ref_x)
out1.renorm_(1.0, 2, 2.05)
# 2. Class method keyword arguments
out2 = paddle.to_tensor(ref_x)
out2.renorm_(p=1.0, axis=2, max_norm=2.05)
# 3. PyTorch keyword arguments
out3 = paddle.to_tensor(ref_x)
out3.renorm_(p=1.0, dim=2, maxnorm=2.05)
for out in [out1, out2, out3]:
np.testing.assert_allclose(out.numpy(), out1.numpy(), rtol=1e-5)
paddle.enable_static()
# Test unique compatibility
class TestUniqueAPI(unittest.TestCase):
def setUp(self):
self.x_1d = np.array([3, 1, 2, 1, 3]).astype('int64')
self.x_2d = np.array([[2, 1, 3], [3, 0, 1], [2, 1, 3]]).astype('int64')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.x_1d)
# 1. Paddle positional arguments (all positional: x, return_index, return_inverse, return_counts, axis, dtype, sorted
out1 = paddle.unique(x, False, False, False, None, 'int64', True)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.unique(
x=x,
return_index=False,
return_inverse=False,
return_counts=False,
axis=None,
dtype='int64',
sorted=True,
)
# 3. PyTorch keyword arguments (using aliases input and dim)
out3 = paddle.unique(input=x, sorted=True)
# 4. Mixed arguments (positional + keyword)
out4 = paddle.unique(x, sorted=False)
# 5. Class method positional arguments
out5 = x.unique()
# 6. Class method keyword arguments
out6 = x.unique(sorted=True)
for out in [out1, out2, out3, out4, out5, out6]:
np.testing.assert_array_equal(out1.numpy(), out.numpy())
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[5], dtype='int64')
# 1. Paddle positional arguments (all positional arguments)
out1 = paddle.unique(x, False, False, False, None, 'int64', True)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.unique(
x=x,
return_index=False,
return_inverse=False,
return_counts=False,
axis=None,
dtype='int64',
sorted=True,
)
# 3. PyTorch keyword arguments (using aliases)
out3 = paddle.unique(input=x, sorted=True)
# 4. Class method positional arguments
out4 = x.unique()
# 5. Class method keyword arguments
out5 = x.unique(sorted=True)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.x_1d},
fetch_list=[out1, out2, out3, out4, out5],
)
for i in range(1, len(fetches)):
np.testing.assert_array_equal(fetches[0], fetches[i])
class TestCloneAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(3, 4).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle positional arguments
out1 = paddle.clone(x)
# 2. Paddle keyword arguments
out2 = paddle.clone(x=x)
# 3. PyTorch keyword arguments
out3 = paddle.clone(input=x)
# 4. Mixed arguments
# clone only has one parameter x, mixed arguments not applicable
# 5. Class method positional arguments
out4 = x.clone()
# 6. Class method keyword arguments
# clone class method has no parameters, keyword arguments not applicable
for out in [out1, out2, out3, out4]:
np.testing.assert_allclose(out.numpy(), self.np_x)
self.assertIsNot(out, x)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[3, 4], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.clone(x)
# 2. Paddle keyword arguments
out2 = paddle.clone(x=x)
# 3. PyTorch keyword arguments
out3 = paddle.clone(input=x)
# 4. Class method positional arguments
out4 = x.clone()
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3, out4],
)
# Verify all outputs match input
for out in fetches:
np.testing.assert_allclose(out, self.np_x)
# Edit By AI Agent
# Test _assert compatibility
class TestAssertAPI(unittest.TestCase):
def test_dygraph_non_tensor_pass(self):
"""Test _assert with non-tensor condition that passes."""
paddle.disable_static()
paddle._assert(True, "should pass")
paddle._assert(1, "should pass")
paddle._assert(1 == 1, "should pass")
paddle.enable_static()
def test_dygraph_non_tensor_fail(self):
"""Test _assert with non-tensor condition that fails."""
paddle.disable_static()
with self.assertRaises(AssertionError) as ctx:
paddle._assert(False, "error message")
self.assertEqual(str(ctx.exception), "error message")
with self.assertRaises(AssertionError) as ctx:
paddle._assert(0, "zero is falsy")
self.assertEqual(str(ctx.exception), "zero is falsy")
paddle.enable_static()
def test_dygraph_tensor_pass(self):
"""Test _assert with tensor condition that passes."""
paddle.disable_static()
cond = paddle.to_tensor([True])
paddle._assert(cond, "tensor assert should pass")
paddle.enable_static()
def test_dygraph_tensor_fail(self):
"""Test _assert with tensor condition that fails."""
paddle.disable_static()
cond = paddle.to_tensor([False])
with self.assertRaises(AssertionError):
paddle._assert(cond, "tensor assert should fail")
paddle.enable_static()
def test_dygraph_default_message(self):
"""Test _assert with default empty message."""
paddle.disable_static()
with self.assertRaises(AssertionError) as ctx:
paddle._assert(False)
self.assertEqual(str(ctx.exception), "")
paddle.enable_static()
def test_dygraph_compatibility_with_torch(self):
"""Test that paddle._assert matches torch._assert calling convention."""
paddle.disable_static()
# Positional args (matching torch._assert(condition, message))
paddle._assert(True, "positional args")
# Keyword args (matching torch._assert(condition=..., message=...))
paddle._assert(condition=True, message="keyword args")
# Mixed args
paddle._assert(True, message="mixed args")
paddle.enable_static()
def test_static_tensor_condition(self):
"""Test _assert with tensor condition in static graph mode."""
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.base.program_guard(main, startup):
cond = paddle.full(shape=[1], fill_value=True, dtype='bool')
paddle._assert(cond, "static assert")
exe = paddle.base.Executor(paddle.CPUPlace())
exe.run(main)
class TestHsplitAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x_2d = np.random.rand(7, 8).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x_2d = paddle.to_tensor(self.np_x_2d)
# 1. Paddle positional arguments
out1 = paddle.hsplit(x_2d, 2)
# 2. Paddle keyword arguments
out2 = paddle.hsplit(x=x_2d, num_or_indices=2)
# 3. PyTorch keyword arguments
out3 = paddle.hsplit(input=x_2d, indices=2)
# 4. Mixed arguments
out4 = paddle.hsplit(x_2d, num_or_indices=2)
# 5. Class method positional arguments
out5 = x_2d.hsplit(2)
# 6. Class method keyword arguments
out6 = x_2d.hsplit(num_or_indices=2)
ref_out = np.array_split(self.np_x_2d, 2, axis=1)
for out in [out1, out2, out3, out4, out5, out6]:
self.assertEqual(len(out), 2)
for ref, out_item in zip(ref_out, out):
np.testing.assert_allclose(ref, out_item.numpy())
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x_2d = paddle.static.data(
name="x_2d", shape=[7, 8], dtype='float32'
)
# 1. Paddle positional arguments
out1 = paddle.hsplit(x_2d, 2)
# 2. Paddle keyword arguments
out2 = paddle.hsplit(x=x_2d, num_or_indices=2)
# 3. PyTorch keyword arguments
out3 = paddle.hsplit(input=x_2d, indices=2)
# 4. Class method positional arguments
out4 = x_2d.hsplit(2)
# 5. Class method keyword arguments
out5 = x_2d.hsplit(num_or_indices=2)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x_2d": self.np_x_2d},
fetch_list=[
out1[0],
out1[1],
out2[0],
out2[1],
out3[0],
out3[1],
out4[0],
out4[1],
out5[0],
out5[1],
],
)
ref_out = np.array_split(self.np_x_2d, 2, axis=1)
for i in range(0, 10, 2):
np.testing.assert_allclose(fetches[i], ref_out[0])
np.testing.assert_allclose(fetches[i + 1], ref_out[1])
class TestDsplitAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x_3d = np.random.rand(7, 6, 8).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x_3d = paddle.to_tensor(self.np_x_3d)
# 1. Paddle positional arguments
out1 = paddle.dsplit(x_3d, 2)
# 2. Paddle keyword arguments
out2 = paddle.dsplit(x=x_3d, num_or_indices=2)
# 3. PyTorch keyword arguments
out3 = paddle.dsplit(input=x_3d, indices=2)
# 4. Mixed arguments
out4 = paddle.dsplit(x_3d, num_or_indices=2)
# 5. Class method positional arguments
out5 = x_3d.dsplit(2)
# 6. Class method keyword arguments
out6 = x_3d.dsplit(num_or_indices=2)
ref_out = np.array_split(self.np_x_3d, 2, axis=2)
for out in [out1, out2, out3, out4, out5, out6]:
self.assertEqual(len(out), 2)
for ref, out_item in zip(ref_out, out):
np.testing.assert_allclose(ref, out_item.numpy())
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x_3d = paddle.static.data(
name="x_3d", shape=[7, 6, 8], dtype='float32'
)
# 1. Paddle positional arguments
out1 = paddle.dsplit(x_3d, 2)
# 2. Paddle keyword arguments
out2 = paddle.dsplit(x=x_3d, num_or_indices=2)
# 3. PyTorch keyword arguments
out3 = paddle.dsplit(input=x_3d, indices=2)
# 4. Class method positional arguments
out4 = x_3d.dsplit(2)
# 5. Class method keyword arguments
out5 = x_3d.dsplit(num_or_indices=2)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x_3d": self.np_x_3d},
fetch_list=[
out1[0],
out1[1],
out2[0],
out2[1],
out3[0],
out3[1],
out4[0],
out4[1],
out5[0],
out5[1],
],
)
ref_out = np.array_split(self.np_x_3d, 2, axis=2)
for i in range(0, 10, 2):
np.testing.assert_allclose(fetches[i], ref_out[0])
np.testing.assert_allclose(fetches[i + 1], ref_out[1])
class TestVsplitAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x_2d = np.random.rand(8, 6).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x_2d = paddle.to_tensor(self.np_x_2d)
# 1. Paddle positional arguments
out1 = paddle.vsplit(x_2d, 2)
# 2. Paddle keyword arguments
out2 = paddle.vsplit(x=x_2d, num_or_indices=2)
# 3. PyTorch keyword arguments
out3 = paddle.vsplit(input=x_2d, indices=2)
# 4. Mixed arguments
out4 = paddle.vsplit(x_2d, num_or_indices=2)
# 5. Class method positional arguments
out5 = x_2d.vsplit(2)
# 6. Class method keyword arguments
out6 = x_2d.vsplit(num_or_indices=2)
ref_out = np.array_split(self.np_x_2d, 2, axis=0)
for out in [out1, out2, out3, out4, out5, out6]:
self.assertEqual(len(out), 2)
for ref, out_item in zip(ref_out, out):
np.testing.assert_allclose(ref, out_item.numpy())
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x_2d = paddle.static.data(
name="x_2d", shape=[8, 6], dtype='float32'
)
# 1. Paddle positional arguments
out1 = paddle.vsplit(x_2d, 2)
# 2. Paddle keyword arguments
out2 = paddle.vsplit(x=x_2d, num_or_indices=2)
# 3. PyTorch keyword arguments
out3 = paddle.vsplit(input=x_2d, indices=2)
# 4. Class method positional arguments
out4 = x_2d.vsplit(2)
# 5. Class method keyword arguments
out5 = x_2d.vsplit(num_or_indices=2)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x_2d": self.np_x_2d},
fetch_list=[
out1[0],
out1[1],
out2[0],
out2[1],
out3[0],
out3[1],
out4[0],
out4[1],
out5[0],
out5[1],
],
)
ref_out = np.array_split(self.np_x_2d, 2, axis=0)
for i in range(0, 10, 2):
np.testing.assert_allclose(fetches[i], ref_out[0])
np.testing.assert_allclose(fetches[i + 1], ref_out[1])
# Test hstack compatibility
class TestHstackAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.inputs = [
np.random.rand(2, 3).astype('float32'),
np.random.rand(2, 4).astype('float32'),
]
def test_dygraph_Compatibility(self):
paddle.disable_static()
tensors = [paddle.to_tensor(inp) for inp in self.inputs]
# 1. Paddle positional arguments
out1 = paddle.hstack(tensors)
# 2. Paddle keyword arguments
out2 = paddle.hstack(x=tensors)
# 3. PyTorch keyword arguments
out3 = paddle.hstack(tensors=tensors)
# 4. Mixed arguments (only one parameter, mixed not applicable)
ref_out = np.hstack(tuple(inp for inp in self.inputs))
for out in [out1, out2, out3]:
np.testing.assert_allclose(
ref_out, out.numpy(), rtol=1e-5, atol=1e-8
)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
shapes = [[2, 3], [2, 4]]
with paddle.static.program_guard(main, startup):
static_tensors = []
feed_dict = {}
for i, (shape, inp) in enumerate(zip(shapes, self.inputs)):
static_tensor = paddle.static.data(
name=f"x{i}", shape=shape, dtype='float32'
)
static_tensors.append(static_tensor)
feed_dict[f"x{i}"] = inp
# 1. Paddle positional arguments
out1 = paddle.hstack(static_tensors)
# 2. Paddle keyword arguments
out2 = paddle.hstack(x=static_tensors)
# 3. PyTorch keyword arguments
out3 = paddle.hstack(tensors=static_tensors)
exe = paddle.static.Executor()
fetches = exe.run(
main, feed=feed_dict, fetch_list=[out1, out2, out3]
)
ref_out = np.hstack(tuple(inp for inp in self.inputs))
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5, atol=1e-8)
class TestVstackAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.inputs = [
np.random.rand(2, 3).astype('float32'),
np.random.rand(3, 3).astype('float32'),
]
def test_dygraph_Compatibility(self):
paddle.disable_static()
tensors = [paddle.to_tensor(inp) for inp in self.inputs]
# 1. Paddle positional arguments
out1 = paddle.vstack(tensors)
# 2. Paddle keyword arguments
out2 = paddle.vstack(x=tensors)
# 3. PyTorch keyword arguments
out3 = paddle.vstack(tensors=tensors)
ref_out = np.vstack(tuple(inp for inp in self.inputs))
for out in [out1, out2, out3]:
np.testing.assert_allclose(
ref_out, out.numpy(), rtol=1e-5, atol=1e-8
)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
shapes = [[2, 3], [3, 3]]
with paddle.static.program_guard(main, startup):
static_tensors = []
feed_dict = {}
for i, (shape, inp) in enumerate(zip(shapes, self.inputs)):
static_tensor = paddle.static.data(
name=f"x{i}", shape=shape, dtype='float32'
)
static_tensors.append(static_tensor)
feed_dict[f"x{i}"] = inp
# 1. Paddle positional arguments
out1 = paddle.vstack(static_tensors)
# 2. Paddle keyword arguments
out2 = paddle.vstack(x=static_tensors)
# 3. PyTorch keyword arguments
out3 = paddle.vstack(tensors=static_tensors)
exe = paddle.static.Executor()
fetches = exe.run(
main, feed=feed_dict, fetch_list=[out1, out2, out3]
)
ref_out = np.vstack(tuple(inp for inp in self.inputs))
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5, atol=1e-8)
# Test dstack compatibility
class TestDstackAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.inputs = [
np.random.rand(2, 3, 4).astype('float32'),
np.random.rand(2, 3, 4).astype('float32'),
]
def test_dygraph_Compatibility(self):
paddle.disable_static()
tensors = [paddle.to_tensor(inp) for inp in self.inputs]
# 1. Paddle positional arguments
out1 = paddle.dstack(tensors)
# 2. Paddle keyword arguments
out2 = paddle.dstack(x=tensors)
# 3. PyTorch keyword arguments
out3 = paddle.dstack(tensors=tensors)
# Verify all outputs
ref_out = np.dstack(tuple(inp for inp in self.inputs))
for out in [out1, out2, out3]:
np.testing.assert_allclose(
ref_out, out.numpy(), rtol=1e-5, atol=1e-8
)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
shapes = [[2, 3, 4], [2, 3, 4]]
with paddle.static.program_guard(main, startup):
static_tensors = []
feed_dict = {}
for i, (shape, inp) in enumerate(zip(shapes, self.inputs)):
static_tensor = paddle.static.data(
name=f"x{i}", shape=shape, dtype='float32'
)
static_tensors.append(static_tensor)
feed_dict[f"x{i}"] = inp
# 1. Paddle positional arguments
out1 = paddle.dstack(static_tensors)
# 2. Paddle keyword arguments
out2 = paddle.dstack(x=static_tensors)
# 3. PyTorch keyword arguments
out3 = paddle.dstack(tensors=static_tensors)
exe = paddle.static.Executor()
fetches = exe.run(
main, feed=feed_dict, fetch_list=[out1, out2, out3]
)
ref_out = np.dstack(tuple(inp for inp in self.inputs))
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5, atol=1e-8)
# Test column_stack compatibility
class TestColumnStackAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.inputs = [
np.random.rand(3, 2).astype('float32'),
np.random.rand(3, 3).astype('float32'),
]
def test_dygraph_Compatibility(self):
paddle.disable_static()
tensors = [paddle.to_tensor(inp) for inp in self.inputs]
# 1. Paddle positional arguments
out1 = paddle.column_stack(tensors)
# 2. Paddle keyword arguments
out2 = paddle.column_stack(x=tensors)
# 3. PyTorch keyword arguments
out3 = paddle.column_stack(tensors=tensors)
# Verify all outputs
ref_out = np.column_stack(tuple(inp for inp in self.inputs))
for out in [out1, out2, out3]:
np.testing.assert_allclose(
ref_out, out.numpy(), rtol=1e-5, atol=1e-8
)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
shapes = [[3, 2], [3, 3]]
with paddle.static.program_guard(main, startup):
static_tensors = []
feed_dict = {}
for i, (shape, inp) in enumerate(zip(shapes, self.inputs)):
static_tensor = paddle.static.data(
name=f"x{i}", shape=shape, dtype='float32'
)
static_tensors.append(static_tensor)
feed_dict[f"x{i}"] = inp
# 1. Paddle positional arguments
out1 = paddle.column_stack(static_tensors)
# 2. Paddle keyword arguments
out2 = paddle.column_stack(x=static_tensors)
# 3. PyTorch keyword arguments
out3 = paddle.column_stack(tensors=static_tensors)
exe = paddle.static.Executor()
fetches = exe.run(
main, feed=feed_dict, fetch_list=[out1, out2, out3]
)
ref_out = np.column_stack(tuple(inp for inp in self.inputs))
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5, atol=1e-8)
# Test row_stack compatibility
class TestRowStackAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.inputs = [
np.random.rand(2, 3).astype('float32'),
np.random.rand(4, 3).astype('float32'),
]
def test_dygraph_Compatibility(self):
paddle.disable_static()
tensors = [paddle.to_tensor(inp) for inp in self.inputs]
# 1. Paddle positional arguments
out1 = paddle.row_stack(tensors)
# 2. Paddle keyword arguments
out2 = paddle.row_stack(x=tensors)
# 3. PyTorch keyword arguments
out3 = paddle.row_stack(tensors=tensors)
# Verify all outputs
ref_out = np.vstack(tuple(inp for inp in self.inputs))
for out in [out1, out2, out3]:
np.testing.assert_allclose(
ref_out, out.numpy(), rtol=1e-5, atol=1e-8
)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
shapes = [[2, 3], [4, 3]]
with paddle.static.program_guard(main, startup):
static_tensors = []
feed_dict = {}
for i, (shape, inp) in enumerate(zip(shapes, self.inputs)):
static_tensor = paddle.static.data(
name=f"x{i}", shape=shape, dtype='float32'
)
static_tensors.append(static_tensor)
feed_dict[f"x{i}"] = inp
# 1. Paddle positional arguments
out1 = paddle.row_stack(static_tensors)
# 2. Paddle keyword arguments
out2 = paddle.row_stack(x=static_tensors)
# 3. PyTorch keyword arguments
out3 = paddle.row_stack(tensors=static_tensors)
exe = paddle.static.Executor()
fetches = exe.run(
main, feed=feed_dict, fetch_list=[out1, out2, out3]
)
ref_out = np.vstack(tuple(inp for inp in self.inputs))
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5, atol=1e-8)
# Test bernoulli compatibility
class TestBernoulliAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(2, 3).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle positional arguments
out1 = paddle.bernoulli(x)
# 2. Paddle keyword arguments
out2 = paddle.bernoulli(x=x)
# 3. PyTorch keyword arguments
out3 = paddle.bernoulli(input=x)
# 4. Mixed arguments
out4 = paddle.bernoulli(x, p=0.5)
# 5-6. out parameter test
out5 = paddle.empty_like(x)
out6 = paddle.bernoulli(x, out=out5)
# 7. Class method positional arguments
out7 = x.bernoulli()
# 8. Class method keyword arguments
out8 = x.bernoulli(p=0.5)
# Verify outputs have correct shape
for out in [out1, out2, out3, out4, out5, out6, out7, out8]:
self.assertEqual(out.shape, x.shape)
self.assertEqual(out.dtype, x.dtype)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[2, 3], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.bernoulli(x)
# 2. Paddle keyword arguments
out2 = paddle.bernoulli(x=x)
# 3. PyTorch keyword arguments
out3 = paddle.bernoulli(input=x)
exe = paddle.static.Executor()
exe.run(startup)
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3],
)
# Verify outputs have correct shape
for out in fetches:
self.assertEqual(out.shape, (2, 3))
# Test combinations compatibility
class TestCombinationsAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array([1, 2, 3, 4]).astype('int32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle positional arguments (all positional: x, r, with_replacement
out1 = paddle.combinations(x, 2, False)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.combinations(x=x, r=2, with_replacement=False)
# 3. PyTorch keyword arguments
out3 = paddle.combinations(input=x, r=2)
# 4. Mixed arguments (with with_replacement parameter)
out4 = paddle.combinations(x, r=3, with_replacement=True)
# Verify all outputs
for out in [out1, out2, out3, out4]:
self.assertIsInstance(out, paddle.Tensor)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[4], dtype='int32')
# 1. Paddle positional arguments (all positional: x, r, with_replacement
out1 = paddle.combinations(x, 2, False)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.combinations(x=x, r=2, with_replacement=False)
# 3. PyTorch keyword arguments
out3 = paddle.combinations(input=x, r=2)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3],
)
# Verify all outputs
for out in fetches:
self.assertIsInstance(out, np.ndarray)
# Test trapezoid compatibility
class TestTrapezoidAPI(unittest.TestCase):
def setUp(self):
self.np_y = np.array([4.0, 5.0, 6.0, 7.0, 8.0], dtype='float32')
self.np_x = np.array([1.0, 2.0, 3.0, 4.0, 5.0], dtype='float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
y = paddle.to_tensor(self.np_y)
# 1. Paddle positional arguments (all positional: y, x, dx, axis
out1 = paddle.trapezoid(y, None, None, -1)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.trapezoid(y=y, x=None, dx=None, axis=-1)
# 3. PyTorch keyword arguments (using alias dim)
out3 = paddle.trapezoid(y, dim=-1)
# 4-5. out parameter test
out4 = paddle.empty([])
out5 = paddle.trapezoid(y, out=out4)
assert out4 is out5
# Verify outputs
ref_out = out1.numpy()
for out in [out1, out2, out3, out4, out5]:
np.testing.assert_allclose(out.numpy(), ref_out, rtol=1e-5)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
y = paddle.static.data(name="y", shape=[5], dtype='float32')
# 1. Paddle positional arguments (all positional: y, x, dx, axis
out1 = paddle.trapezoid(y, None, None, -1)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.trapezoid(y=y, x=None, dx=None, axis=-1)
# 3. PyTorch keyword arguments (using alias dim)
out3 = paddle.trapezoid(y, dim=-1)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"y": self.np_y},
fetch_list=[out1, out2, out3],
)
ref_out = fetches[0]
for out in fetches[1:]:
np.testing.assert_allclose(out, ref_out, rtol=1e-5)
# Test cumulative_trapezoid compatibility
class TestCumulativeTrapezoidAPI(unittest.TestCase):
def setUp(self):
self.np_y = np.array([4.0, 5.0, 6.0, 7.0, 8.0], dtype='float32')
self.np_x = np.array([1.0, 2.0, 3.0, 4.0, 5.0], dtype='float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
y = paddle.to_tensor(self.np_y)
# 1. Paddle positional arguments (all positional: y, x, dx, axis
out1 = paddle.cumulative_trapezoid(y, None, None, -1)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.cumulative_trapezoid(y=y, x=None, dx=None, axis=-1)
# 3. PyTorch keyword arguments (using alias dim)
out3 = paddle.cumulative_trapezoid(y, dim=-1)
# 4. Mixed arguments (with dx parameter)
out4 = paddle.cumulative_trapezoid(y, dx=2.0)
# 5-6. out parameter test
out5 = paddle.empty([4])
out6 = paddle.cumulative_trapezoid(y, out=out5)
assert out5 is out6
# Verify outputs
ref_out = np.array([4.5, 10.0, 16.5, 24.0])
for out in [out1, out2, out3, out5, out6]:
np.testing.assert_allclose(out.numpy(), ref_out, rtol=1e-5)
# Output with dx=2.0
ref_out_dx = np.array([9.0, 20.0, 33.0, 48.0])
np.testing.assert_allclose(out4.numpy(), ref_out_dx, rtol=1e-5)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
y = paddle.static.data(name="y", shape=[5], dtype='float32')
# 1. Paddle positional arguments (all positional: y, x, dx, axis
out1 = paddle.cumulative_trapezoid(y, None, None, -1)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.cumulative_trapezoid(y=y, x=None, dx=None, axis=-1)
# 3. PyTorch keyword arguments (using alias dim)
out3 = paddle.cumulative_trapezoid(y, dim=-1)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"y": self.np_y},
fetch_list=[out1, out2, out3],
)
ref_out = np.array([4.5, 10.0, 16.5, 24.0])
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5)
# Test frexp compatibility
class TestFrexpAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array(
[[10.0, -2.5, 0.0, 3.14], [128.0, 64.0, -32.0, 16.0]],
dtype='float32',
)
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle positional arguments
out1 = paddle.frexp(x)
# 2. Paddle keyword arguments
out2 = paddle.frexp(x=x)
# 3. PyTorch keyword arguments
out3 = paddle.frexp(input=x)
# 4. out parameter (tuple)
out4 = (paddle.empty_like(x), paddle.empty_like(x))
paddle.frexp(input=x, out=out4)
# 5. out parameter (list)
out5 = [paddle.empty_like(x), paddle.empty_like(x)]
paddle.frexp(input=x, out=out5)
# 5. Tensor method
out6 = x.frexp()
# Verify all outputs are consistent
ref_mantissa = out1[0].numpy()
ref_exponent = out1[1].numpy()
for out in [out2, out3, out4, out5, out6]:
np.testing.assert_allclose(out[0].numpy(), ref_mantissa, rtol=1e-5)
np.testing.assert_allclose(out[1].numpy(), ref_exponent, rtol=1e-5)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[2, 4], dtype='float32')
# 1. Paddle positional arguments
mantissa1, exponent1 = paddle.frexp(x)
# 2. Paddle keyword arguments
mantissa2, exponent2 = paddle.frexp(x=x)
# 3. PyTorch keyword arguments
mantissa3, exponent3 = paddle.frexp(input=x)
# 4. Mixed arguments (only one parameter, mixed not applicable)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[
mantissa1,
exponent1,
mantissa2,
exponent2,
mantissa3,
exponent3,
],
)
# Verify all outputs are consistent
for i in range(0, len(fetches), 2):
np.testing.assert_allclose(fetches[i], fetches[0], rtol=1e-5)
np.testing.assert_allclose(
fetches[i + 1], fetches[1], rtol=1e-5
)
# Test lgamma compatibility
class TestLgammaAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array([-0.4, -0.2, 0.1, 0.3]).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle positional arguments
out1 = paddle.lgamma(x)
# 2. Paddle keyword arguments
out2 = paddle.lgamma(x=x)
# 3. PyTorch keyword arguments
out3 = paddle.lgamma(input=x)
# 4-5. out parameter test
out4 = paddle.empty_like(x)
out5 = paddle.lgamma(x, out=out4)
# 6. Class method positional arguments
out6 = x.lgamma()
# Verify all outputs
ref_out = np.array(
[1.31452465, 1.76149750, 2.25271273, 1.09579802], dtype=np.float32
)
for out in [out1, out2, out3, out4, out5, out6]:
np.testing.assert_allclose(out.numpy(), ref_out, rtol=1e-5)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[4], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.lgamma(x)
# 2. Paddle keyword arguments
out2 = paddle.lgamma(x=x)
# 3. PyTorch keyword arguments
out3 = paddle.lgamma(input=x)
# 4. Mixed arguments (only one parameter, mixed not applicable)
# 5. Class method positional arguments
out4 = x.lgamma()
# 6. Class method keyword arguments (no parameters, not applicable)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3, out4],
)
ref_out = np.array(
[1.31452465, 1.76149750, 2.25271273, 1.09579802],
dtype=np.float32,
)
for out in fetches:
np.testing.assert_allclose(out, ref_out, rtol=1e-5)
# Test kron compatibility
class TestKronAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array([[1, 2], [3, 4]], dtype='int64')
self.np_y = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype='int64')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
y = paddle.to_tensor(self.np_y)
# 1. Paddle positional arguments
out1 = paddle.kron(x, y)
# 2. Paddle keyword arguments
out2 = paddle.kron(x=x, y=y)
# 3. PyTorch keyword arguments
out3 = paddle.kron(input=x, other=y)
# 4. Mixed arguments
out4 = paddle.kron(x, other=y)
# 5-6. out parameter test
out5 = paddle.empty([6, 6], dtype='int64')
out6 = paddle.kron(x, y, out=out5)
# 7. Class method positional arguments
out7 = x.kron(y)
# 8. Class method keyword arguments
out8 = x.kron(y=y)
# Verify all outputs
ref_out = np.array(
[
[1, 2, 3, 2, 4, 6],
[4, 5, 6, 8, 10, 12],
[7, 8, 9, 14, 16, 18],
[3, 6, 9, 4, 8, 12],
[12, 15, 18, 16, 20, 24],
[21, 24, 27, 28, 32, 36],
],
dtype=np.int64,
)
for out in [out1, out2, out3, out4, out5, out6, out7, out8]:
np.testing.assert_array_equal(out.numpy(), ref_out)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[2, 2], dtype='int64')
y = paddle.static.data(name="y", shape=[3, 3], dtype='int64')
# 1. Paddle positional arguments
out1 = paddle.kron(x, y)
# 2. Paddle keyword arguments
out2 = paddle.kron(x=x, y=y)
# 3. PyTorch keyword arguments
out3 = paddle.kron(input=x, other=y)
# 4. Class method positional arguments
out4 = x.kron(y)
# 5. Class method keyword arguments
out5 = x.kron(y=y)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x, "y": self.np_y},
fetch_list=[out1, out2, out3, out4, out5],
)
ref_out = np.array(
[
[1, 2, 3, 2, 4, 6],
[4, 5, 6, 8, 10, 12],
[7, 8, 9, 14, 16, 18],
[3, 6, 9, 4, 8, 12],
[12, 15, 18, 16, 20, 24],
[21, 24, 27, 28, 32, 36],
],
dtype=np.int64,
)
for out in fetches:
np.testing.assert_array_equal(out, ref_out)
# Test kthvalue compatibility
class TestKthvalueAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array(
[
[
[0.11855337, -0.30557564],
[-0.09968963, 0.41220093],
[1.24004936, 1.50014710],
],
[
[0.08612321, -0.92485696],
[-0.09276631, 1.15149164],
[-1.46587241, 1.22873247],
],
]
).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
k = 2
# 1. Paddle positional arguments (all positional: x, k, axis, keepdim
out1 = paddle.kthvalue(x, k, 1, False)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.kthvalue(x=x, k=k, axis=1, keepdim=False)
# 3. PyTorch keyword arguments
out3 = paddle.kthvalue(input=x, k=k, dim=1)
# 4. Mixed arguments (with keepdim parameter)
out4 = paddle.kthvalue(x, k, axis=1, keepdim=True)
# 5. out parameter test (tuple)
out5 = (
paddle.empty([2, 2], dtype='float32'),
paddle.empty([2, 2], dtype='int64'),
)
paddle.kthvalue(x, k, axis=1, out=out5)
# 6. out parameter test (list)
# TODO(zhwesky2010): should fix out is list
# out6 = [
# paddle.empty([2, 2], dtype='float32'),
# paddle.empty([2, 2], dtype='int64'),
# ]
# paddle.kthvalue(x, k, axis=1, out=out6)
# 7. Class method positional arguments
out7 = x.kthvalue(k, 1)
# 8. Class method keyword arguments
out8 = x.kthvalue(k, axis=1, keepdim=True)
# Verify outputs
ref_values = np.array(
[[[0.11855337, 0.41220093], [-0.09276631, 1.15149164]]],
dtype=np.float32,
).reshape(2, 2)
ref_indices = np.array([[0, 1], [1, 1]], dtype=np.int64)
for out in [out1, out2, out3, out5, out7]:
np.testing.assert_allclose(out[0].numpy(), ref_values, rtol=1e-5)
np.testing.assert_array_equal(out[1].numpy(), ref_indices)
# Verify keepdim=True
for out in [out4, out8]:
np.testing.assert_allclose(
out[0].numpy(), ref_values.reshape(2, 1, 2), rtol=1e-5
)
np.testing.assert_array_equal(
out[1].numpy(), ref_indices.reshape(2, 1, 2)
)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[2, 3, 2], dtype='float32')
k = 2
# 1. Paddle positional arguments (all positional: x, k, axis, keepdim
values1, indices1 = paddle.kthvalue(x, k, 1, False)
# 2. Paddle keyword arguments (all keyword arguments)
values2, indices2 = paddle.kthvalue(x=x, k=k, axis=1, keepdim=False)
# 3. PyTorch keyword arguments
values3, indices3 = paddle.kthvalue(input=x, k=k, dim=1)
# 4. Class method positional arguments
values4, indices4 = x.kthvalue(k, 1)
# 5. Class method keyword arguments
values5, indices5 = x.kthvalue(k, axis=1, keepdim=True)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[
values1,
indices1,
values2,
indices2,
values3,
indices3,
values4,
indices4,
values5,
indices5,
],
)
ref_values = np.array(
[[0.11855337, 0.41220093], [-0.09276631, 1.15149164]],
dtype=np.float32,
)
ref_indices = np.array([[0, 1], [1, 1]], dtype=np.int64)
# Verify all values outputs (no keepdim)
for i in [0, 2, 4, 6]:
np.testing.assert_allclose(fetches[i], ref_values, rtol=1e-5)
# Verify keepdim=True values
np.testing.assert_allclose(
fetches[8], ref_values.reshape(2, 1, 2), rtol=1e-5
)
# Verify all indices outputs (no keepdim)
for i in [1, 3, 5, 7]:
np.testing.assert_array_equal(fetches[i], ref_indices)
# Verify keepdim=True indices
np.testing.assert_array_equal(
fetches[9], ref_indices.reshape(2, 1, 2)
)
# Test logcumsumexp compatibility
class TestLogcumsumexpAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.arange(12, dtype=np.float32).reshape(3, 4)
self.ref_out_axis0 = np.array(
[
[0.0, 1.0, 2.0, 3.0],
[4.01814993, 5.01814993, 6.01814993, 7.01814993],
[8.01847930, 9.01847930, 10.01847930, 11.01847930],
]
)
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle positional arguments (all positional: x, axis, dtype
out1 = paddle.logcumsumexp(x, 0, None)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.logcumsumexp(x=x, axis=0, dtype=None)
# 3. PyTorch keyword arguments (using alias dim)
out3 = paddle.logcumsumexp(input=x, dim=0)
# 4. Mixed arguments (with dtype parameter)
out4 = paddle.logcumsumexp(x, axis=0, dtype='float32')
# 5-6. out parameter test
out5 = paddle.empty([3, 4], dtype='float32')
out6 = paddle.logcumsumexp(x, axis=0, out=out5)
# 7. Class method positional arguments
out7 = x.logcumsumexp(0)
# 8. Class method keyword arguments
out8 = x.logcumsumexp(axis=0)
for out in [out1, out2, out3, out4, out5, out6, out7, out8]:
np.testing.assert_allclose(
out.numpy(), self.ref_out_axis0, rtol=1e-5
)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[3, 4], dtype='float32')
# 1. Paddle positional arguments (all positional: x, axis, dtype
out1 = paddle.logcumsumexp(x, 0, None)
# 2. Paddle keyword arguments (all keyword arguments)
out2 = paddle.logcumsumexp(x=x, axis=0, dtype=None)
# 3. PyTorch keyword arguments (using alias dim)
out3 = paddle.logcumsumexp(input=x, dim=0)
# 4. Class method positional arguments
out4 = x.logcumsumexp(0)
# 5. Class method keyword arguments
out5 = x.logcumsumexp(axis=0)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3, out4, out5],
)
for out in fetches:
np.testing.assert_allclose(out, self.ref_out_axis0, rtol=1e-5)
# Test poisson compatibility
class TestPoissonAPI(unittest.TestCase):
def setUp(self):
np.random.seed(2025)
self.np_x = np.random.rand(3, 4).astype('float32') + 0.5
def test_dygraph_Compatibility(self):
paddle.disable_static()
paddle.seed(100)
x = paddle.to_tensor(self.np_x)
# 1. Paddle positional arguments
out1 = paddle.poisson(x)
# 2. Paddle keyword arguments
out2 = paddle.poisson(x=x)
# 3. PyTorch keyword arguments
out3 = paddle.poisson(input=x)
# 4. Mixed arguments (only one parameter, mixed not applicable)
# Verify all outputs have same shape
for out in [out1, out2, out3]:
self.assertEqual(out.shape, (3, 4))
self.assertEqual(out.dtype, x.dtype)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[3, 4], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.poisson(x)
# 2. Paddle keyword arguments
out2 = paddle.poisson(x=x)
# 3. PyTorch keyword arguments
out3 = paddle.poisson(input=x)
# 4. Mixed arguments (only one parameter, mixed not applicable)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3],
)
# Verify all outputs have correct shape
for out in fetches:
self.assertEqual(out.shape, (3, 4))
# Test cummax compatibility
class TestCummaxAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array([[-1, 5, 0], [-2, -3, 2]], dtype='float32')
self.ref_values = np.array([[-1, 5, 5], [-2, -2, 2]], dtype='float32')
self.ref_indices = np.array([[0, 1, 1], [0, 0, 2]], dtype=np.int64)
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle positional arguments
out1 = paddle.cummax(x, 1, 'int64')
# 2. Paddle keyword arguments
out2 = paddle.cummax(x=x, axis=1, dtype='int64')
# 3. PyTorch keyword arguments (alias)
out3 = paddle.cummax(input=x, dim=1)
# 4. Mixed arguments
out4 = paddle.cummax(x, axis=1, dtype='int64')
# 5. out parameter (tuple)
out5 = (
paddle.empty([2, 3], dtype='float32'),
paddle.empty([2, 3], dtype='int64'),
)
paddle.cummax(x, 1, out=out5)
# 6. out parameter (list)
out6 = [
paddle.empty([2, 3], dtype='float32'),
paddle.empty([2, 3], dtype='int64'),
]
paddle.cummax(x, 1, out=out6)
# 7. Tensor method - positional
out7 = x.cummax(1)
# 8. Tensor method - keyword
out8 = x.cummax(axis=1, dtype='int64')
# Verify all outputs
for out in [out1, out2, out3, out4, out7, out8]:
np.testing.assert_array_equal(out.values.numpy(), self.ref_values)
np.testing.assert_array_equal(out.indices.numpy(), self.ref_indices)
for out in [out5, out6]:
np.testing.assert_array_equal(out[0].numpy(), self.ref_values)
np.testing.assert_array_equal(out[1].numpy(), self.ref_indices)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main, startup = paddle.static.Program(), paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[2, 3], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.cummax(x, 1, 'int64')
# 2. Paddle keyword arguments
out2 = paddle.cummax(x=x, axis=1, dtype='int64')
# 3. PyTorch keyword arguments
out3 = paddle.cummax(input=x, dim=1)
# 4. Tensor method - positional
out4 = x.cummax(1)
# 5. Tensor method - keyword
out5 = x.cummax(axis=1)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[
out1[0],
out1[1],
out2[0],
out2[1],
out3[0],
out3[1],
out4[0],
out4[1],
out5[0],
out5[1],
],
)
for i in range(0, len(fetches), 2):
np.testing.assert_array_equal(fetches[i], self.ref_values)
np.testing.assert_array_equal(fetches[i + 1], self.ref_indices)
# Test cummin compatibility
class TestCumminAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array([[-1, 5, 0], [-2, -3, 2]], dtype='float32')
self.ref_values = np.array(
[[-1, -1, -1], [-2, -3, -3]], dtype='float32'
)
self.ref_indices = np.array([[0, 0, 0], [0, 1, 1]], dtype=np.int64)
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle positional arguments
out1 = paddle.cummin(x, 1, 'int64')
# 2. Paddle keyword arguments
out2 = paddle.cummin(x=x, axis=1, dtype='int64')
# 3. PyTorch keyword arguments (alias)
out3 = paddle.cummin(input=x, dim=1)
# 4. Mixed arguments
out4 = paddle.cummin(x, axis=1, dtype='int64')
# 5. out parameter (tuple)
out5 = (
paddle.empty([2, 3], dtype='float32'),
paddle.empty([2, 3], dtype='int64'),
)
out5 = paddle.cummin(x, 1, out=out5)
# 6. out parameter (list)
out6 = [
paddle.empty([2, 3], dtype='float32'),
paddle.empty([2, 3], dtype='int64'),
]
paddle.cummin(x, 1, out=out6)
# 7. Tensor method - positional
out7 = x.cummin(1)
# 8. Tensor method - keyword
out8 = x.cummin(axis=1, dtype='int64')
# Verify all outputs
for out in [out1, out2, out3, out4, out7, out8]:
np.testing.assert_array_equal(out.values.numpy(), self.ref_values)
np.testing.assert_array_equal(out.indices.numpy(), self.ref_indices)
for out in [out5, out6]:
np.testing.assert_array_equal(out[0].numpy(), self.ref_values)
np.testing.assert_array_equal(out[1].numpy(), self.ref_indices)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main, startup = paddle.static.Program(), paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[2, 3], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.cummin(x, 1, 'int64')
# 2. Paddle keyword arguments
out2 = paddle.cummin(x=x, axis=1, dtype='int64')
# 3. PyTorch keyword arguments
out3 = paddle.cummin(input=x, dim=1)
# 4. Tensor method - positional
out4 = x.cummin(1)
# 5. Tensor method - keyword
out5 = x.cummin(axis=1)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[
out1[0],
out1[1],
out2[0],
out2[1],
out3[0],
out3[1],
out4[0],
out4[1],
out5[0],
out5[1],
],
)
for i in range(0, len(fetches), 2):
np.testing.assert_array_equal(fetches[i], self.ref_values)
np.testing.assert_array_equal(fetches[i + 1], self.ref_indices)
# Test mode compatibility
class TestModeAPI(unittest.TestCase):
def setUp(self):
# Use fixed data for precise comparison
self.np_x = np.array(
[
[
[0.5, 0.3, 0.7, 0.2],
[0.5, 0.8, 0.7, 0.9],
[0.1, 0.3, 0.4, 0.2],
],
[
[0.6, 0.4, 0.5, 0.3],
[0.6, 0.2, 0.5, 0.7],
[0.9, 0.4, 0.8, 0.3],
],
]
).astype('float32')
self.ref_values = np.array(
[[0.5, 0.3, 0.7, 0.2], [0.6, 0.4, 0.5, 0.3]], dtype='float32'
)
self.ref_indices = np.array(
[[1, 2, 1, 2], [1, 2, 1, 2]], dtype=np.int64
)
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle positional arguments
out1 = paddle.mode(x, 1, False)
# 2. Paddle keyword arguments
out2 = paddle.mode(x=x, axis=1, keepdim=False)
# 3. PyTorch keyword arguments
out3 = paddle.mode(input=x, dim=1)
# 4. Mixed arguments (with keepdim parameter)
out4 = paddle.mode(x, axis=1, keepdim=True)
# 5. out parameter (tuple)
out5 = (
paddle.empty([2, 4], dtype='float32'),
paddle.empty([2, 4], dtype='int64'),
)
paddle.mode(x, 1, out=out5)
# 6. out parameter (list)
out6 = [
paddle.empty([2, 4], dtype='float32'),
paddle.empty([2, 4], dtype='int64'),
]
paddle.mode(x, 1, out=out6)
# 7. Class method positional arguments
out7 = x.mode(1)
# 8. Class method keyword arguments
out8 = x.mode(axis=1, keepdim=True)
# Verify outputs with keepdim=False
for out in [out1, out2, out3, out7]:
np.testing.assert_array_equal(out.values.numpy(), self.ref_values)
np.testing.assert_array_equal(out.indices.numpy(), self.ref_indices)
# Verify outputs with out parameter
for out in [out5, out6]:
np.testing.assert_array_equal(out[0].numpy(), self.ref_values)
np.testing.assert_array_equal(out[1].numpy(), self.ref_indices)
# Verify outputs with keepdim=True
for out in [out4, out8]:
np.testing.assert_array_equal(
out[0].numpy(), self.ref_values.reshape(2, 1, 4)
)
np.testing.assert_array_equal(
out[1].numpy(), self.ref_indices.reshape(2, 1, 4)
)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[2, 3, 4], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.mode(x, 1, False)
# 2. Paddle keyword arguments
out2 = paddle.mode(x=x, axis=1, keepdim=False)
# 3. PyTorch keyword arguments
out3 = paddle.mode(input=x, dim=1)
# 4. Class method positional arguments
out4 = x.mode(1)
# 5. Class method keyword arguments
out5 = x.mode(axis=1, keepdim=True)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[
out1[0],
out1[1],
out2[0],
out2[1],
out3[0],
out3[1],
out4[0],
out4[1],
out5[0],
out5[1],
],
)
# Verify outputs with keepdim=False: out1, out2, out3, out4
for i in [0, 2, 4, 6]:
np.testing.assert_allclose(
fetches[i], self.ref_values, rtol=1e-5, atol=1e-5
)
np.testing.assert_array_equal(fetches[i + 1], self.ref_indices)
# Verify output with keepdim=True: out5
np.testing.assert_allclose(
fetches[8],
self.ref_values.reshape(2, 1, 4),
rtol=1e-5,
atol=1e-5,
)
np.testing.assert_array_equal(
fetches[9], self.ref_indices.reshape(2, 1, 4)
)
# Test topk compatibility
class TestTopkAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array(
[[0.5, 0.3, 0.9, 0.2], [0.6, 0.8, 0.4, 0.7], [0.1, 0.4, 0.3, 0.5]]
).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# Reference: top 2 values along axis=1
ref_values = np.array(
[[0.9, 0.5], [0.8, 0.7], [0.5, 0.4]], dtype='float32'
)
ref_indices = np.array([[2, 0], [1, 3], [3, 1]], dtype=np.int64)
# 1. Paddle positional arguments
out1 = paddle.topk(x, 2, 1)
# 2. Paddle keyword arguments
out2 = paddle.topk(x=x, k=2, axis=1)
# 3. PyTorch keyword arguments
out3 = paddle.topk(input=x, k=2, dim=1)
# 4. Mixed arguments
out4 = paddle.topk(x, k=2, axis=1)
# 5. out parameter (tuple)
out5 = (
paddle.empty([3, 2], dtype='float32'),
paddle.empty([3, 2], dtype='int64'),
)
paddle.topk(x, 2, 1, out=out5)
# 6. out parameter (list)
out6 = [
paddle.empty([3, 2], dtype='float32'),
paddle.empty([3, 2], dtype='int64'),
]
paddle.topk(x, 2, 1, out=out6)
# 7. Class method positional arguments
out7 = x.topk(2, 1)
# 8. Class method keyword arguments
out8 = x.topk(k=2, axis=1)
# Verify all outputs
for out in [out1, out2, out3, out4, out7, out8]:
np.testing.assert_array_equal(out.values.numpy(), ref_values)
np.testing.assert_array_equal(out.indices.numpy(), ref_indices)
for out in [out5, out6]:
np.testing.assert_array_equal(out[0].numpy(), ref_values)
np.testing.assert_array_equal(out[1].numpy(), ref_indices)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[3, 4], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.topk(x, 2, 1)
# 2. Paddle keyword arguments
out2 = paddle.topk(x=x, k=2, axis=1)
# 3. PyTorch keyword arguments
out3 = paddle.topk(input=x, k=2, dim=1)
# 4. Class method positional arguments
out4 = x.topk(2, 1)
# 5. Class method keyword arguments
out5 = x.topk(k=2, axis=1)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[
out1[0],
out1[1],
out2[0],
out2[1],
out3[0],
out3[1],
out4[0],
out4[1],
out5[0],
out5[1],
],
)
ref_values = np.array(
[[0.9, 0.5], [0.8, 0.7], [0.5, 0.4]], dtype='float32'
)
ref_indices = np.array([[2, 0], [1, 3], [3, 1]], dtype=np.int64)
# Verify all outputs
for i in range(0, len(fetches), 2):
np.testing.assert_array_equal(fetches[i], ref_values)
np.testing.assert_array_equal(fetches[i + 1], ref_indices)
# Test nansum compatibility
class TestNansumAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array(
[[float('nan'), 0.3, 0.5, 0.9], [0.1, 0.2, float('-nan'), 0.7]]
).astype('float32')
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
ref_value = np.nansum(x, axis=1, keepdims=True)
# 1. Paddle positional arguments
out1 = paddle.nansum(x, 1, None, True)
# 2. Paddle keyword arguments
out2 = paddle.nansum(x=x, axis=1, keepdim=True)
# 3. PyTorch positional arguments
out3 = paddle.nansum(x, 1, True)
# 4. PyTorch keyword arguments
out4 = paddle.nansum(input=x, dim=1, keepdim=True)
# 5. Mixed arguments & out parameter
out5 = paddle.empty([])
out6 = paddle.nansum(input=x, axis=1, keepdim=True, out=out5)
# 7. Class method positional arguments
out7 = x.nansum(1, None, True)
# 8. Class method keyword arguments
out8 = x.nansum(axis=1, keepdim=True)
for out in [out1, out2, out3, out4, out5, out6, out7, out8]:
np.testing.assert_array_equal(out.numpy(), ref_value)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
ref_value = np.nansum(self.np_x, axis=1, keepdims=True)
with paddle.static.program_guard(main, startup):
x = paddle.static.data(name="x", shape=[2, 4], dtype='float32')
# 1. Paddle positional arguments
out1 = paddle.nansum(x, 1, None, True)
# 2. Paddle keyword arguments
out2 = paddle.nansum(x=x, axis=1, keepdim=True)
# 3. PyTorch positional arguments
out3 = paddle.nansum(x, 1, True)
# 4. PyTorch keyword arguments
out4 = paddle.nansum(input=x, dim=1, keepdim=True)
# 5. Mixed arguments
out5 = paddle.nansum(input=x, axis=1, keepdim=True)
# 6. Class method positional arguments
out6 = x.nansum(1, None, True)
# 7. Class method keyword arguments
out7 = x.nansum(axis=1, keepdim=True)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[
out1,
out2,
out3,
out4,
out5,
out6,
out7,
],
)
for i in range(0, len(fetches)):
np.testing.assert_array_equal(fetches[i], ref_value)
def test_nansum_compat_decorator_raise(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
with self.assertRaises(ValueError):
out1 = paddle.nansum(x=x, input=x)
with self.assertRaises(ValueError):
out2 = paddle.nansum(x, dim=1, axis=1)
paddle.enable_static()
class TestHardswishAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array(
[[-4.0, -3.0, -1.5], [0.0, 2.5, 5.0]], dtype="float32"
)
def _expected(self):
return (
self.np_x * np.minimum(np.maximum(self.np_x + 3.0, 0.0), 6.0) / 6.0
)
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle keyword arguments
out1 = paddle.nn.Hardswish(name="hard_name")(x)
# 2. PyTorch Positional arguments
out2 = paddle.nn.Hardswish(False)(x)
# 3. PyTorch keyword arguments (alias)
out3 = paddle.nn.Hardswish(inplace=False)(input=x)
# 4. Mixed arguments
out4 = paddle.nn.Hardswish(False, name="hard_name")(x)
# 5. Functional Paddle positional arguments
out5 = paddle.nn.functional.hardswish(x)
# 6. Functional Paddle keyword arguments
out6 = paddle.nn.functional.hardswish(x=x, name="hard_func")
# 7. Functional PyTorch keyword arguments (alias)
out7 = paddle.nn.functional.hardswish(input=x, inplace=False)
self.assertEqual(
paddle.nn.Hardswish(True, name="hard_name").extra_repr(),
"inplace=True, name=hard_name",
)
expected = self._expected()
for out in [out1, out2, out3, out4, out5, out6, out7]:
np.testing.assert_allclose(out.numpy(), expected, rtol=1e-6)
paddle.enable_static()
def test_dygraph_inplace(self):
paddle.disable_static()
expected = self._expected()
x = paddle.to_tensor(self.np_x)
out = paddle.nn.Hardswish(inplace=True)(x)
self.assertIs(out, x)
np.testing.assert_allclose(x.numpy(), expected, rtol=1e-6)
x = paddle.to_tensor(self.np_x)
out = paddle.nn.functional.hardswish(x, inplace=True)
self.assertIs(out, x)
np.testing.assert_allclose(x.numpy(), expected, rtol=1e-6)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(
name="x", shape=self.np_x.shape, dtype=str(self.np_x.dtype)
)
# 1. Paddle keyword arguments
out1 = paddle.nn.Hardswish(name="hard_name")(x)
# 2. PyTorch Positional arguments
out2 = paddle.nn.Hardswish(False)(x)
# 3. PyTorch keyword arguments (alias)
out3 = paddle.nn.Hardswish(inplace=False)(input=x)
# 4. Functional Paddle positional arguments
out4 = paddle.nn.functional.hardswish(x)
# 5. Functional Paddle keyword arguments
out5 = paddle.nn.functional.hardswish(x=x, name="hard_func")
# 6. Functional PyTorch keyword arguments (alias)
out6 = paddle.nn.functional.hardswish(input=x, inplace=False)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3, out4, out5, out6],
)
expected = self._expected()
for out in fetches:
np.testing.assert_allclose(out, expected, rtol=1e-6)
class TestReLU6API(unittest.TestCase):
def setUp(self):
self.np_x = np.array(
[[-2.0, 0.0, 0.5], [5.0, 6.0, 7.5]], dtype="float32"
)
def _expected(self):
return np.minimum(np.maximum(self.np_x, 0.0), 6.0)
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle keyword arguments
out1 = paddle.nn.ReLU6(name="relu_name")(x)
# 2. PyTorch Positional arguments
out2 = paddle.nn.ReLU6(False)(x)
# 3. PyTorch keyword arguments (alias)
out3 = paddle.nn.ReLU6(inplace=False)(input=x)
# 4. Mixed arguments
out4 = paddle.nn.ReLU6(False, name="relu_name")(x)
# 5. Functional Paddle positional arguments
out5 = paddle.nn.functional.relu6(x)
# 6. Functional Paddle keyword arguments
out6 = paddle.nn.functional.relu6(x=x, name="relu_func")
# 7. Functional PyTorch keyword arguments (alias)
out7 = paddle.nn.functional.relu6(input=x, inplace=False)
self.assertEqual(
paddle.nn.ReLU6(True, name="relu_name").extra_repr(),
"inplace=True, name=relu_name",
)
expected = self._expected()
for out in [out1, out2, out3, out4, out5, out6, out7]:
np.testing.assert_allclose(out.numpy(), expected, rtol=1e-6)
paddle.enable_static()
def test_dygraph_inplace(self):
paddle.disable_static()
expected = self._expected()
x = paddle.to_tensor(self.np_x)
out = paddle.nn.ReLU6(inplace=True)(x)
self.assertIs(out, x)
np.testing.assert_allclose(x.numpy(), expected, rtol=1e-6)
x = paddle.to_tensor(self.np_x)
out = paddle.nn.functional.relu6(x, inplace=True)
self.assertIs(out, x)
np.testing.assert_allclose(x.numpy(), expected, rtol=1e-6)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(
name="x", shape=self.np_x.shape, dtype=str(self.np_x.dtype)
)
# 1. Paddle keyword arguments
out1 = paddle.nn.ReLU6(name="relu_name")(x)
# 2. PyTorch Positional arguments
out2 = paddle.nn.ReLU6(False)(x)
# 3. PyTorch keyword arguments (alias)
out3 = paddle.nn.ReLU6(inplace=False)(input=x)
# 4. Functional Paddle positional arguments
out4 = paddle.nn.functional.relu6(x)
# 5. Functional Paddle keyword arguments
out5 = paddle.nn.functional.relu6(x=x, name="relu_func")
# 6. Functional PyTorch keyword arguments (alias)
out6 = paddle.nn.functional.relu6(input=x, inplace=False)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3, out4, out5, out6],
)
expected = self._expected()
for out in fetches:
np.testing.assert_allclose(out, expected, rtol=1e-6)
class TestELUAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array([-1.0, 0.0, 1.0, 2.0], dtype="float32")
def _expected(self):
return np.where(
self.np_x > 0, self.np_x, 1.0 * (np.exp(self.np_x) - 1.0)
)
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle keyword arguments
out1 = paddle.nn.ELU()(x)
# 2. PyTorch positional arguments
out2 = paddle.nn.ELU(1.0)(x)
# 3. PyTorch keyword arguments (alias)
out3 = paddle.nn.ELU(alpha=1.0)(input=x)
# 4. Mixed arguments
out4 = paddle.nn.ELU(alpha=1.0)(x)
# 5. Functional Paddle positional arguments
out5 = paddle.nn.functional.elu(x)
# 6. Functional Paddle keyword arguments
out6 = paddle.nn.functional.elu(x=x, alpha=1.0)
# 7. Functional PyTorch keyword arguments (alias)
out7 = paddle.nn.functional.elu(input=x, alpha=1.0)
expected = self._expected()
for out in [out1, out2, out3, out4, out5, out6, out7]:
np.testing.assert_allclose(out.numpy(), expected, rtol=1e-6)
paddle.enable_static()
def test_dygraph_inplace(self):
paddle.disable_static()
expected = self._expected()
x = paddle.to_tensor(self.np_x)
out = paddle.nn.ELU(inplace=True)(x)
self.assertIs(out, x)
np.testing.assert_allclose(x.numpy(), expected, rtol=1e-6)
x = paddle.to_tensor(self.np_x)
out = paddle.nn.functional.elu(x, inplace=True)
self.assertIs(out, x)
np.testing.assert_allclose(x.numpy(), expected, rtol=1e-6)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(
name="x", shape=self.np_x.shape, dtype=str(self.np_x.dtype)
)
# 1. Paddle keyword arguments
out1 = paddle.nn.ELU()(x)
# 2. PyTorch keyword arguments (alias)
out2 = paddle.nn.ELU(alpha=1.0)(input=x)
# 3. Functional Paddle positional arguments
out3 = paddle.nn.functional.elu(x)
# 4. Functional PyTorch keyword arguments (alias)
out4 = paddle.nn.functional.elu(input=x, alpha=1.0)
exe = paddle.static.Executor()
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3, out4],
)
expected = self._expected()
for out in fetches:
np.testing.assert_allclose(out, expected, rtol=1e-6)
class TestPReLUAPI(unittest.TestCase):
def setUp(self):
self.np_x = np.array(
[[[[-2.0, 3.0], [4.0, -5.0]], [[1.0, -2.0], [-3.0, 4.0]]]],
dtype="float32",
)
self.np_x64 = self.np_x.astype("float64")
def _expected(self, x):
return np.where(x >= 0, x, 0.5 * x)
def test_dygraph_Compatibility(self):
paddle.disable_static()
x = paddle.to_tensor(self.np_x)
# 1. Paddle Positional arguments
out1 = paddle.nn.PReLU(2, 0.5)(x)
# 2. Paddle keyword arguments
out2 = paddle.nn.PReLU(num_parameters=2, init=0.5)(x)
# 3. PyTorch keyword arguments
out3 = paddle.nn.PReLU(
num_parameters=2, init=0.5, device="cpu", dtype="float32"
)(input=x)
# 4. Mixed arguments
out4 = paddle.nn.PReLU(2, init=0.5, device="cpu", dtype="float32")(x)
expected = self._expected(self.np_x)
for out in [out1, out2, out3, out4]:
np.testing.assert_allclose(out.numpy(), expected, rtol=1e-6)
x64 = paddle.to_tensor(self.np_x64)
layer64 = paddle.nn.PReLU(2, 0.5, device="cpu", dtype="float64")
out5 = layer64(input=x64)
self.assertEqual(layer64._weight.dtype, paddle.float64)
np.testing.assert_allclose(
out5.numpy(), self._expected(self.np_x64), rtol=1e-6
)
paddle.enable_static()
def test_static_Compatibility(self):
paddle.enable_static()
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
x = paddle.static.data(
name="x", shape=self.np_x.shape, dtype=str(self.np_x.dtype)
)
# 1. Paddle Positional arguments
out1 = paddle.nn.PReLU(2, 0.5)(x)
# 2. Paddle keyword arguments
out2 = paddle.nn.PReLU(num_parameters=2, init=0.5)(x)
# 3. PyTorch keyword arguments
out3 = paddle.nn.PReLU(
num_parameters=2, init=0.5, device="cpu", dtype="float32"
)(input=x)
# 4. Mixed arguments
out4 = paddle.nn.PReLU(2, init=0.5, device="cpu", dtype="float32")(
x
)
exe = paddle.static.Executor()
exe.run(startup)
fetches = exe.run(
main,
feed={"x": self.np_x},
fetch_list=[out1, out2, out3, out4],
)
expected = self._expected(self.np_x)
for out in fetches:
np.testing.assert_allclose(out, expected, rtol=1e-6)
if __name__ == '__main__':
unittest.main()