# 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 os import subprocess import sys import textwrap import unittest import numpy as np import paddle import paddle.nn.functional as F # Edit By AI Agent # Test nextafter compatibility @unittest.skipIf( paddle.is_compiled_with_custom_device('iluvatar_gpu'), "skip iluvatar_gpu which not register nextafter kernel", ) class TestNextafterAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [5, 6]).astype('float32') self.np_y = np.random.randint(0, 8, [5, 6]).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.nextafter(x, y) # 2. Paddle keyword arguments out2 = paddle.nextafter(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.nextafter(input=x, other=y) # 4. Mixed arguments out4 = paddle.nextafter(x, y=y) # 5-6. out parameter test out5 = paddle.empty_like(x) out6 = paddle.nextafter(x, y, out=out5) # 7. Tensor method - args out7 = x.nextafter(y) # 8. Tensor method - kwargs (PyTorch alias) out8 = x.nextafter(other=y) ref_out = np.nextafter(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()) 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') y = paddle.static.data(name="y", shape=[5, 6], dtype='float32') # 1. Paddle positional arguments out1 = paddle.nextafter(x, y) # 2. Paddle keyword arguments out2 = paddle.nextafter(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.nextafter(input=x, other=y) # 4. Tensor method - args out4 = x.nextafter(y) # 5. Tensor method - kwargs (PyTorch alias) out5 = x.nextafter(other=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.nextafter(self.np_x, self.np_y) for out in fetches: np.testing.assert_allclose(out, ref_out) # Test round_ compatibility (inplace API) class TestRoundInplaceAPI(unittest.TestCase): def setUp(self): self.np_x = np.array([1.5, 2.3, 3.7, -1.2, -2.8]).astype('float32') def test_dygraph_InplaceCompatibility(self): """Test round_ inplace API in dynamic mode""" paddle.disable_static() x = paddle.to_tensor(self.np_x) # 1. Tensor method - Paddle positional args x1 = x.clone() out1 = x1.round_(0) assert out1 is x1 # 2. Tensor method - Paddle keyword args x2 = x.clone() out2 = x2.round_(decimals=1) assert out2 is x2 # 3. Paddle function - positional args x3 = x.clone() out3 = paddle.round_(x3, 1) assert out3 is x3 # 4. Paddle function - keyword args x4 = x.clone() out4 = paddle.round_(x4, decimals=-1) assert out4 is x4 # Verify all outputs np.testing.assert_allclose(out1.numpy(), np.round(self.np_x), rtol=1e-6) np.testing.assert_allclose( out2.numpy(), np.around(self.np_x, decimals=1), rtol=1e-6 ) np.testing.assert_allclose( out3.numpy(), np.around(self.np_x, decimals=1), rtol=1e-6 ) np.testing.assert_allclose( out4.numpy(), np.around(self.np_x, decimals=-1), rtol=1e-6 ) paddle.enable_static() # Test erf compatibility class TestErfAPI(unittest.TestCase): def setUp(self): self.np_x = np.array([-0.4, -0.2, 0.0, 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.erf(x) # 2. Paddle keyword arguments out2 = paddle.erf(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.erf(input=x) # 4-5. out parameter test out4 = paddle.empty_like(x) out5 = paddle.erf(x, out=out4) # 6. Tensor method - positional args out6 = x.erf() # Verify all outputs ref_out = np.array( [-0.42839241, -0.22270259, 0.0, 0.11246292, 0.32862678] ).astype('float32') for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose( out.numpy(), ref_out, rtol=1e-5, atol=1e-5 ) paddle.enable_static() def test_static_Compatibility(self): """Test erf API in static mode""" 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='float32') # 1. Paddle positional arguments out1 = paddle.erf(x) # 2. Paddle keyword arguments out2 = paddle.erf(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.erf(input=x) # 4. Tensor method - positional args out4 = x.erf() exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out1, out2, out3, out4], ) # Verify all outputs match with loop ref_out = np.array( [-0.42839241, -0.22270259, 0.0, 0.11246292, 0.32862678] ).astype('float32') for out in fetches: np.testing.assert_allclose(out, ref_out, rtol=1e-5) # Test erf_ inplace compatibility class TestErfInplaceAPI(unittest.TestCase): def setUp(self): self.np_x = np.array([-0.4, -0.2, 0.0, 0.1, 0.3]).astype('float32') def test_dygraph_InplaceCompatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) ref_out = np.array( [-0.42839241, -0.22270259, 0.0, 0.11246292, 0.32862678] ).astype('float32') # 1. Tensor method - positional args x1 = x.clone() out1 = x1.erf_() assert out1 is x1 # 2. Paddle function - positional args x2 = x.clone() out2 = paddle.erf_(x2) assert out2 is x2 # Verify all outputs with loop for out in [out1, out2]: np.testing.assert_allclose(out.numpy(), ref_out, rtol=1e-5) paddle.enable_static() # Test iinfo compatibility class TestIinfoAPI(unittest.TestCase): def test_dygraph_Compatibility(self): paddle.disable_static() # 1. Paddle positional arguments out1 = paddle.iinfo(paddle.int32) # 2. Paddle keyword arguments out2 = paddle.iinfo(dtype=paddle.int32) # 3. PyTorch keyword arguments (alias) out3 = paddle.iinfo(type=paddle.int32) # Verify all outputs for out in [out1, out2, out3]: assert out.min == -2147483648 assert out.max == 2147483647 assert out.bits == 32 assert str(out.dtype) == 'int32' 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): # iinfo is a compile-time function, same in static mode out1 = paddle.iinfo(paddle.int32) out2 = paddle.iinfo(dtype=paddle.int32) out3 = paddle.iinfo(type=paddle.int32) for out in [out1, out2, out3]: assert out.min == -2147483648 assert out.max == 2147483647 # Test additional paddle.dtype.itemsize compatibility. class TestDtypeItemsizeExtendedAPI(unittest.TestCase): EXPECTED = ( 'float16', 'bfloat16', 'float32', 'float64', 'complex64', 'complex128', 'int8', 'int16', 'int32', 'int64', 'uint8', 'uint16', 'uint32', 'uint64', 'bool', 'float8_e4m3fn', 'float8_e5m2', ) def test_dtype_str(self): for name in self.EXPECTED: with self.subTest(dtype=name): self.assertEqual(str(getattr(paddle, name)), f'paddle.{name}') def test_int_alias_matches(self): self.assertEqual(paddle.int.itemsize, paddle.int32.itemsize) class TestFloatingDtypeAPI(unittest.TestCase): EXPECTED = { 'float16': (16, 0.0009765625, -65504.0, 65504.0, 6.103515625e-05), 'bfloat16': ( 16, 0.0078125, -3.3895313892515355e38, 3.3895313892515355e38, 1.1754943508222875e-38, ), 'float32': ( 32, 1.1920928955078125e-07, -3.4028234663852886e38, 3.4028234663852886e38, 1.1754943508222875e-38, ), 'float64': ( 64, 2.220446049250313e-16, -1.7976931348623157e308, 1.7976931348623157e308, 2.2250738585072014e-308, ), 'float8_e4m3fn': (8, 0.125, -448.0, 448.0, 0.015625), 'float8_e5m2': (8, 0.25, -57344.0, 57344.0, 6.103515625e-05), } def check_finfo(self, info, name): bits, eps, min_value, max_value, tiny = self.EXPECTED[name] self.assertEqual(info.bits, bits) self.assertEqual(str(info.dtype), name) self.assertEqual(info.eps, eps) self.assertEqual(info.min, min_value) self.assertEqual(info.max, max_value) self.assertEqual(info.smallest_normal, tiny) self.assertEqual(info.tiny, tiny) def test_dygraph_Compatibility(self): paddle.disable_static() for name in self.EXPECTED: dtype = getattr(paddle, name) with self.subTest(dtype=name): # 1. Paddle Positional arguments out1 = paddle.finfo(dtype) # 2. Paddle keyword arguments out2 = paddle.finfo(dtype=dtype) # 3. PyTorch keyword arguments (alias) out3 = paddle.finfo(type=dtype) # Verify all outputs for out in [out1, out2, out3]: self.check_finfo(out, name) 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): for name in self.EXPECTED: dtype = getattr(paddle, name) with self.subTest(dtype=name): # 1. Paddle Positional arguments out1 = paddle.finfo(dtype) # 2. Paddle keyword arguments out2 = paddle.finfo(dtype=dtype) # 3. PyTorch keyword arguments (alias) out3 = paddle.finfo(type=dtype) # Verify all outputs for out in [out1, out2, out3]: self.check_finfo(out, name) class TestIntegerDtypeAPI(unittest.TestCase): EXPECTED = { 'uint8': (0, 255, 8), 'uint16': (0, 65535, 16), 'uint32': (0, 4294967295, 32), 'uint64': (0, 18446744073709551615, 64), 'int8': (-128, 127, 8), 'int16': (-32768, 32767, 16), 'int32': (-2147483648, 2147483647, 32), 'int64': (-9223372036854775808, 9223372036854775807, 64), } def check_iinfo(self, info, name): min_value, max_value, bits = self.EXPECTED[name] self.assertEqual(info.min, min_value) self.assertEqual(info.max, max_value) self.assertEqual(info.bits, bits) self.assertEqual(str(info.dtype), name) self.assertIn(f'max={max_value}', repr(info)) def test_dygraph_Compatibility(self): paddle.disable_static() for name in self.EXPECTED: dtype = getattr(paddle, name) with self.subTest(dtype=name): # 1. Paddle Positional arguments out1 = paddle.iinfo(dtype) # 2. Paddle keyword arguments out2 = paddle.iinfo(dtype=dtype) # 3. PyTorch keyword arguments (alias) out3 = paddle.iinfo(type=dtype) out4 = paddle.iinfo(name) out5 = paddle.iinfo(np.dtype(name)) out6 = paddle.iinfo(getattr(np, name)) out7 = paddle.iinfo(name.upper()) out8 = paddle.iinfo(f" {name} ") # Verify all outputs for out in [out1, out2, out3, out4, out5, out6, out7, out8]: self.check_iinfo(out, name) 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): for name in self.EXPECTED: dtype = getattr(paddle, name) with self.subTest(dtype=name): # 1. Paddle Positional arguments out1 = paddle.iinfo(dtype) # 2. Paddle keyword arguments out2 = paddle.iinfo(dtype=dtype) # 3. PyTorch keyword arguments (alias) out3 = paddle.iinfo(type=dtype) out4 = paddle.iinfo(name) out5 = paddle.iinfo(np.dtype(name)) out6 = paddle.iinfo(getattr(np, name)) out7 = paddle.iinfo(name.upper()) out8 = paddle.iinfo(f" {name} ") # Verify all outputs for out in [out1, out2, out3, out4, out5, out6, out7, out8]: self.check_iinfo(out, name) class TestLegacyVarTypeDtypeAPI(unittest.TestCase): def test_uint_iinfo_with_pir_disabled(self): code = textwrap.dedent( """ import numpy as np import paddle expected = { 'uint16': (0, 65535, 16), 'uint32': (0, 4294967295, 32), 'uint64': (0, 18446744073709551615, 64), } assert str(paddle.bfloat16) == 'paddle.bfloat16' for name, (min_value, max_value, bits) in expected.items(): dtype = getattr(paddle, name) assert str(dtype) == f'paddle.{name}' for arg in ( dtype, name, np.dtype(name), getattr(np, name), name.upper(), f" {name} ", ): info = paddle.iinfo(arg) assert info.min == min_value assert info.max == max_value assert info.bits == bits assert str(info.dtype) == name """ ) env = os.environ.copy() env["FLAGS_enable_pir_api"] = "0" subprocess.run( [sys.executable, "-c", code], check=True, env=env, capture_output=True, text=True, ) # Test angle compatibility class TestAngleAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) np_x_real = np.random.randn(5, 6).astype('float32') np_x_imag = np.random.randn(5, 6).astype('float32') self.np_x = np_x_real + 1j * np_x_imag def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) # 1. Paddle positional arguments out1 = paddle.angle(x) # 2. Paddle keyword arguments out2 = paddle.angle(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.angle(input=x) # 4-5. out parameter test out4 = paddle.empty_like(out1) out5 = paddle.angle(x, out=out4) # 6. Tensor method out6 = x.angle() # Verify all outputs ref_out = np.angle(self.np_x) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose( ref_out, out.numpy(), rtol=1e-5, atol=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='complex64') # 1. Paddle positional arguments out1 = paddle.angle(x) # 2. Paddle keyword arguments out2 = paddle.angle(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.angle(input=x) # 4. Tensor method out4 = x.angle() exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out1, out2, out3, out4], ) ref_out = np.angle(self.np_x) for out in fetches: np.testing.assert_allclose(out, ref_out, rtol=1e-5, atol=1e-5) # Test atan compatibility class TestAtanAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randn(5, 6).astype('float32') def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) # 1. Paddle positional arguments out1 = paddle.atan(x) # 2. Paddle keyword arguments out2 = paddle.atan(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.atan(input=x) # 4-5. out parameter test out4 = paddle.empty_like(x) out5 = paddle.atan(x, out=out4) # 6. Tensor method out6 = x.atan() ref_out = np.arctan(self.np_x) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose(ref_out, out.numpy(), 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=[5, 6], dtype='float32') out1 = paddle.atan(x) out2 = paddle.atan(x=x) out3 = paddle.atan(input=x) out4 = x.atan() exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out1, out2, out3, out4], ) ref_out = np.arctan(self.np_x) for out in fetches: np.testing.assert_allclose(out, ref_out, rtol=1e-6) class TestAtan2API(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randn(5, 6).astype('float32') self.np_y = np.random.randn(5, 6).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.atan2(x, y) # 2. Paddle keyword arguments out2 = paddle.atan2(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.atan2(input=x, other=y) # 4. Mixed arguments out4 = paddle.atan2(x, y=y) # 5-6. out parameter test out5 = paddle.empty_like(out1) out6 = paddle.atan2(x, y, out=out5) # 7. Tensor method - args out7 = x.atan2(y) # 8. Tensor method - kwargs (PyTorch alias) out8 = x.atan2(other=y) # Verify all outputs ref_out = np.arctan2(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-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=[5, 6], dtype='float32') y = paddle.static.data(name="y", shape=[5, 6], dtype='float32') # 1. Paddle positional arguments out1 = paddle.atan2(x, y) # 2. Paddle keyword arguments out2 = paddle.atan2(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.atan2(input=x, other=y) # 4. Tensor method - args out4 = x.atan2(y) # 5. Tensor method - kwargs (PyTorch alias) out5 = x.atan2(other=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.arctan2(self.np_x, self.np_y) for out in fetches: np.testing.assert_allclose(out, ref_out, rtol=1e-6) class TestHypotAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randn(5, 6).astype('float32') self.np_y = np.random.randn(5, 6).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.hypot(x, y) # 2. Paddle keyword arguments out2 = paddle.hypot(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.hypot(input=x, other=y) # 4. Mixed arguments out4 = paddle.hypot(x, y=y) # 5-6. out parameter test out5 = paddle.empty_like(x) out6 = paddle.hypot(x, y, out=out5) assert out5 is out6 # 7. Tensor method - positional args out7 = x.hypot(y) # 8. Tensor method - keyword args (PyTorch alias) out8 = x.hypot(other=y) ref_out = np.hypot(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(), atol=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=[5, 6], dtype='float32') y = paddle.static.data(name="y", shape=[5, 6], dtype='float32') # 1. Paddle positional arguments out1 = paddle.hypot(x, y) # 2. Paddle keyword arguments out2 = paddle.hypot(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.hypot(input=x, other=y) # 4. Tensor method - positional args out4 = x.hypot(y) # 5. Tensor method - keyword args (PyTorch alias) out5 = x.hypot(other=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.hypot(self.np_x, self.np_y) for out in fetches: np.testing.assert_allclose(out, ref_out, atol=1e-6) class TestHypotInplaceAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randn(5, 6).astype('float32') self.np_y = np.random.randn(5, 6).astype('float32') def test_dygraph_InplaceCompatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) ref_out = np.hypot(self.np_x, self.np_y) # 1. Tensor method - positional args out1 = x.clone().hypot_(y) # 2. Tensor method - Paddle keyword args out2 = x.clone().hypot_(y=y) # 3. Tensor method - PyTorch keyword args (alias) out3 = x.clone().hypot_(other=y) # 4. Paddle function - positional args out4 = paddle.hypot_(x.clone(), y) # 5. Paddle function - Paddle keyword args out5 = paddle.hypot_(x=x.clone(), y=y) # 6. Paddle function - PyTorch keyword args (alias) out6 = paddle.hypot_(input=x.clone(), other=y) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose(ref_out, out.numpy(), atol=1e-6) # Test fmax compatibility class TestFmaxAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randn(5, 6).astype('float32') self.np_y = np.random.randn(5, 6).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.fmax(x, y) # 2. Paddle keyword arguments out2 = paddle.fmax(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.fmax(input=x, other=y) # 4. Mixed arguments out4 = paddle.fmax(x, y=y) # 5-6. out parameter test out5 = paddle.empty_like(x) out6 = paddle.fmax(x, y, out=out5) # 7. Tensor method - positional args out7 = x.fmax(y) # 8. Tensor method - keyword args (PyTorch alias) out8 = x.fmax(other=y) ref_out = np.fmax(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()) 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') y = paddle.static.data(name="y", shape=[5, 6], dtype='float32') # 1. Paddle positional arguments out1 = paddle.fmax(x, y) # 2. Paddle keyword arguments out2 = paddle.fmax(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.fmax(input=x, other=y) # 4. Tensor method - positional args out4 = x.fmax(y) # 5. Tensor method - keyword args (PyTorch alias) out5 = x.fmax(other=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.fmax(self.np_x, self.np_y) for out in fetches: np.testing.assert_allclose(out, ref_out) # Test fmin compatibility class TestFminAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randn(5, 6).astype('float32') self.np_y = np.random.randn(5, 6).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.fmin(x, y) # 2. Paddle keyword arguments out2 = paddle.fmin(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.fmin(input=x, other=y) # 4. Mixed arguments out4 = paddle.fmin(x, y=y) # 5-6. out parameter test out5 = paddle.empty_like(x) out6 = paddle.fmin(x, y, out=out5) # 7. Tensor method - positional args out7 = x.fmin(y) # 8. Tensor method - keyword args (PyTorch alias) out8 = x.fmin(other=y) ref_out = np.fmin(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()) 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') y = paddle.static.data(name="y", shape=[5, 6], dtype='float32') # 1. Paddle positional arguments out1 = paddle.fmin(x, y) # 2. Paddle keyword arguments out2 = paddle.fmin(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.fmin(input=x, other=y) # 4. Tensor method - positional args out4 = x.fmin(y) # 5. Tensor method - keyword args (PyTorch alias) out5 = x.fmin(other=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.fmin(self.np_x, self.np_y) for out in fetches: np.testing.assert_allclose(out, ref_out) # Test bincount compatibility class TestBincountAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [10]).astype('int64') self.np_weights = np.random.random([10]).astype('float32') def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) weights = paddle.to_tensor(self.np_weights) # 1. Paddle positional arguments out1 = paddle.bincount(x, weights, 6) # 2. Paddle keyword arguments out2 = paddle.bincount(x=x, weights=weights, minlength=6) # 3. PyTorch keyword arguments (alias) out3 = paddle.bincount(input=x, weights=weights, minlength=6) # 4. Mixed arguments out4 = paddle.bincount(x, weights=weights, minlength=6) ref_out = np.bincount(self.np_x, weights=self.np_weights, minlength=6) for out in [out1, out2, out3, out4]: np.testing.assert_allclose(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=[10], dtype='int64') weights = paddle.static.data( name="weights", shape=[10], dtype='float32' ) # 1. Paddle positional arguments out1 = paddle.bincount(x, weights, 6) # 2. Paddle keyword arguments out2 = paddle.bincount(x=x, weights=weights, minlength=6) # 3. PyTorch keyword arguments (alias) out3 = paddle.bincount(input=x, weights=weights, minlength=6) exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x, "weights": self.np_weights}, fetch_list=[out1, out2, out3], ) ref_out = np.bincount( self.np_x, weights=self.np_weights, minlength=6 ) for out in fetches: np.testing.assert_allclose(ref_out, out) # Test diag compatibility class TestDiagAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randn(3, 3).astype('float32') self.np_v = np.random.randn(3).astype('float32') def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) v = paddle.to_tensor(self.np_v) # 1. Paddle positional arguments out1 = paddle.diag(x, 1) # 2. Paddle keyword arguments out2 = paddle.diag(x=x, offset=1) # 3. PyTorch keyword arguments (alias) out3 = paddle.diag(input=x, diagonal=1) # 4. Mixed arguments out4 = paddle.diag(x, offset=1) # 5-6. out parameter test out5 = paddle.empty_like(v) out6 = paddle.diag(v, out=out5) # 7. Tensor method - positional args out7 = x.diag(1) # 8. Tensor method - keyword args (PyTorch alias) out8 = x.diag(diagonal=1) ref_diag_v = np.diag(self.np_v) ref_diag_x_offset = np.diag(self.np_x, 1) for out in [out1, out2, out3, out4, out7, out8]: np.testing.assert_allclose(ref_diag_x_offset, out.numpy()) np.testing.assert_allclose(ref_diag_v, out5.numpy()) np.testing.assert_allclose(ref_diag_v, out6.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, 3], dtype='float32') # 1. Paddle positional arguments out1 = paddle.diag(x, 1) # 2. Paddle keyword arguments out2 = paddle.diag(x=x, offset=1) # 3. PyTorch keyword arguments (alias) out3 = paddle.diag(input=x, diagonal=1) # 4. Tensor method - positional args out4 = x.diag(1) # 5. Tensor method - keyword args (PyTorch alias) out5 = x.diag(diagonal=1) exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out1, out2, out3, out4, out5], ) ref_out = np.diag(self.np_x, 1) for out in fetches: np.testing.assert_allclose(out, ref_out) # Test heaviside compatibility class TestHeavisideAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randn(5, 6).astype('float32') self.np_y = np.random.randn(5, 6).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.heaviside(x, y) # 2. Paddle keyword arguments out2 = paddle.heaviside(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.heaviside(input=x, values=y) # 4. Mixed arguments out4 = paddle.heaviside(x, y=y) # 5-6. out parameter test out5 = paddle.empty_like(out1) out6 = paddle.heaviside(x, y, out=out5) # 7. Tensor method - positional args out7 = x.heaviside(y) # 8. Tensor method - keyword args (PyTorch alias) out8 = x.heaviside(values=y) # Verify all outputs ref_out = np.heaviside(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()) 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') y = paddle.static.data(name="y", shape=[5, 6], dtype='float32') # 1. Paddle positional arguments out1 = paddle.heaviside(x, y) # 2. Paddle keyword arguments out2 = paddle.heaviside(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.heaviside(input=x, values=y) # 4. Tensor method - args out4 = x.heaviside(y) # 5. Tensor method - kwargs (PyTorch alias) out5 = x.heaviside(values=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.heaviside(self.np_x, self.np_y) for out in fetches: np.testing.assert_allclose(out, ref_out) class TestAsinhAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [5, 6]).astype('float32') def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) # 1. Paddle positional arguments out1 = paddle.asinh(x) # 2. Paddle keyword arguments out2 = paddle.asinh(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.asinh(input=x) # 4-5. out parameter test out4 = paddle.empty_like(out1) out5 = paddle.asinh(x, out=out4) # 6. Tensor method out6 = x.asinh() # Verify all outputs ref_out = np.arcsinh(self.np_x) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose(ref_out, out.numpy(), 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=[5, 6], dtype='float32') # 1. Paddle positional arguments out1 = paddle.asinh(x) # 2. Paddle keyword arguments out2 = paddle.asinh(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.asinh(input=x) # 4. Tensor method out4 = x.asinh() exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out1, out2, out3, out4], ) ref_out = np.arcsinh(self.np_x) for out in fetches: np.testing.assert_allclose(out, ref_out, rtol=1e-6) class TestReciprocalAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(1, 8, [5, 6]).astype('float32') def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) # 1. Paddle positional arguments out1 = paddle.reciprocal(x) # 2. Paddle keyword arguments out2 = paddle.reciprocal(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.reciprocal(input=x) # 4-5. out parameter test out4 = paddle.empty_like(out1) out5 = paddle.reciprocal(x, out=out4) # 6. Tensor method out6 = x.reciprocal() # Verify all outputs ref_out = 1.0 / self.np_x for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose(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=[5, 6], dtype='float32') # 1. Paddle positional arguments out1 = paddle.reciprocal(x) # 2. Paddle keyword arguments out2 = paddle.reciprocal(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.reciprocal(input=x) # 4. Tensor method out4 = x.reciprocal() exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out1, out2, out3, out4], ) ref_out = 1.0 / self.np_x for out in fetches: np.testing.assert_allclose(out, ref_out) class TestSquareAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [5, 6]).astype('float32') def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) # 1. Paddle positional arguments out1 = paddle.square(x) # 2. Paddle keyword arguments out2 = paddle.square(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.square(input=x) # 4-5. out parameter test out4 = paddle.empty_like(out1) out5 = paddle.square(x, out=out4) # 6. Tensor method out6 = x.square() # Verify all outputs ref_out = np.square(self.np_x) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose(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=[5, 6], dtype='float32') # 1. Paddle positional arguments out1 = paddle.square(x) # 2. Paddle keyword arguments out2 = paddle.square(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.square(input=x) # 4. Tensor method out4 = x.square() exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out1, out2, out3, out4], ) ref_out = np.square(self.np_x) for out in fetches: np.testing.assert_allclose(out, ref_out) # Test masked_fill compatibility class TestMaskedFillAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(1, 10, [3, 3]).astype('float32') self.np_mask = np.random.randint(0, 2, [3, 3]).astype(bool) def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) mask = paddle.to_tensor(self.np_mask) # 1. Paddle positional arguments out1 = paddle.masked_fill(x, mask, 0.0) # 2. Paddle keyword arguments out2 = paddle.masked_fill(x=x, mask=mask, value=0.0) # 3. PyTorch keyword arguments (alias) out3 = paddle.masked_fill(input=x, mask=mask, value=0.0) # 4. Mixed arguments out4 = paddle.masked_fill(x, mask=mask, value=0.0) # 5. Tensor method - positional args out5 = x.masked_fill(mask, 0.0) # 6. Tensor method - keyword args (PyTorch alias) out6 = x.masked_fill(mask=mask, value=0.0) # Verify all outputs are equal for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose(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=[3, 3], dtype='float32') mask = paddle.static.data(name="mask", shape=[3, 3], dtype='bool') # Position args out1 = paddle.masked_fill(x, mask, 0.0) # Paddle keyword args out2 = paddle.masked_fill(x=x, mask=mask, value=0.0) # Torch keyword args (input alias) out3 = paddle.masked_fill(input=x, mask=mask, value=0.0) # Tensor method out4 = x.masked_fill(mask, 0.0) exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x, "mask": self.np_mask}, fetch_list=[out1, out2, out3, out4], ) # Verify all outputs are equal for i in range(1, len(fetches)): np.testing.assert_allclose(fetches[0], fetches[i]) class TestTanAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [5, 6]).astype('float32') def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) # 1. Paddle positional arguments out1 = paddle.tan(x) # 2. Paddle keyword arguments out2 = paddle.tan(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.tan(input=x) # 4-5. out parameter test out4 = paddle.empty_like(out1) out5 = paddle.tan(x, out=out4) # 6. Tensor method out6 = x.tan() # Verify all outputs ref_out = np.tan(self.np_x) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose(ref_out, out.numpy(), 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=[5, 6], dtype='float32') # 1. Paddle positional arguments out1 = paddle.tan(x) # 2. Paddle keyword arguments out2 = paddle.tan(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.tan(input=x) # 4. Tensor method out4 = x.tan() exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out1, out2, out3, out4], ) ref_out = np.tan(self.np_x) for out in fetches: np.testing.assert_allclose(out, ref_out, rtol=1e-6) # Test bitwise_and compatibility class TestBitwiseAndAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [5, 6]).astype('int32') self.np_y = np.random.randint(0, 8, [5, 6]).astype('int32') 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.bitwise_and(x, y) # 2. Paddle keyword arguments out2 = paddle.bitwise_and(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.bitwise_and(input=x, other=y) # 4. Mixed arguments out4 = paddle.bitwise_and(x, y=y) # 5-6. out parameter test out5 = paddle.empty_like(x) out6 = paddle.bitwise_and(x, y, out=out5) # 7. Tensor method - args out7 = x.bitwise_and(y) # 8. Tensor method - kwargs (PyTorch alias) out8 = x.bitwise_and(other=y) ref_out = np.bitwise_and(self.np_x, self.np_y) for out in [out1, out2, out3, out4, out5, out6, out7, out8]: 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=[5, 6], dtype='int32') y = paddle.static.data(name="y", shape=[5, 6], dtype='int32') # 1. Paddle positional arguments out1 = paddle.bitwise_and(x, y) # 2. Paddle keyword arguments out2 = paddle.bitwise_and(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.bitwise_and(input=x, other=y) # 4. Tensor method - args out4 = x.bitwise_and(y) # 5. Tensor method - kwargs (PyTorch alias) out5 = x.bitwise_and(other=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.bitwise_and(self.np_x, self.np_y) for out in fetches: np.testing.assert_array_equal(out, ref_out) # Test bitwise_or compatibility class TestBitwiseOrAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [5, 6]).astype('int32') self.np_y = np.random.randint(0, 8, [5, 6]).astype('int32') 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.bitwise_or(x, y) # 2. Paddle keyword arguments out2 = paddle.bitwise_or(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.bitwise_or(input=x, other=y) # 4. Mixed arguments out4 = paddle.bitwise_or(x, y=y) # 5-6. out parameter test out5 = paddle.empty_like(out1) out6 = paddle.bitwise_or(x, y, out=out5) # 7. Tensor method - args out7 = x.bitwise_or(y) # 8. Tensor method - kwargs (PyTorch alias) out8 = x.bitwise_or(other=y) ref_out = np.bitwise_or(self.np_x, self.np_y) for out in [out1, out2, out3, out4, out5, out6, out7, out8]: 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=[5, 6], dtype='int32') y = paddle.static.data(name="y", shape=[5, 6], dtype='int32') # 1. Paddle positional arguments out1 = paddle.bitwise_or(x, y) # 2. Paddle keyword arguments out2 = paddle.bitwise_or(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.bitwise_or(input=x, other=y) # 4. Tensor method - args out4 = x.bitwise_or(y) # 5. Tensor method - kwargs (PyTorch alias) out5 = x.bitwise_or(other=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.bitwise_or(self.np_x, self.np_y) for out in fetches: np.testing.assert_array_equal(out, ref_out) # Test bitwise_not compatibility class TestBitwiseNotAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [5, 6]).astype('int32') def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) # 1. Paddle positional arguments out1 = paddle.bitwise_not(x) # 2. Paddle keyword arguments out2 = paddle.bitwise_not(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.bitwise_not(input=x) # 4-5. out parameter test out4 = paddle.empty_like(out1) out5 = paddle.bitwise_not(x, out=out4) # 6. Tensor method out6 = x.bitwise_not() ref_out = np.bitwise_not(self.np_x) for out in [out1, out2, out3, out4, out5, out6]: 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=[5, 6], dtype='int32') # 1. Paddle positional arguments out1 = paddle.bitwise_not(x) # 2. Paddle keyword arguments out2 = paddle.bitwise_not(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.bitwise_not(input=x) # 4. Tensor method out4 = x.bitwise_not() exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out1, out2, out3, out4], ) ref_out = np.bitwise_not(self.np_x) for out in fetches: np.testing.assert_array_equal(out, ref_out) # Test bitwise_xor compatibility class TestBitwiseXorAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [5, 6]).astype('int32') self.np_y = np.random.randint(0, 8, [5, 6]).astype('int32') 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.bitwise_xor(x, y) # 2. Paddle keyword arguments out2 = paddle.bitwise_xor(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.bitwise_xor(input=x, other=y) # 4. Mixed arguments out4 = paddle.bitwise_xor(x, y=y) # 5-6. out parameter test out5 = paddle.empty_like(out1) out6 = paddle.bitwise_xor(x, y, out=out5) # 7. Tensor method - args out7 = x.bitwise_xor(y) # 8. Tensor method - kwargs (PyTorch alias) out8 = x.bitwise_xor(other=y) ref_out = np.bitwise_xor(self.np_x, self.np_y) for out in [out1, out2, out3, out4, out5, out6, out7, out8]: 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=[5, 6], dtype='int32') y = paddle.static.data(name="y", shape=[5, 6], dtype='int32') # 1. Paddle positional arguments out1 = paddle.bitwise_xor(x, y) # 2. Paddle keyword arguments out2 = paddle.bitwise_xor(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.bitwise_xor(input=x, other=y) # 4. Tensor method - args out4 = x.bitwise_xor(y) # 5. Tensor method - kwargs (PyTorch alias) out5 = x.bitwise_xor(other=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.bitwise_xor(self.np_x, self.np_y) for out in fetches: np.testing.assert_array_equal(out, ref_out) # Test bitwise_and_ inplace compatibility class TestBitwiseAndInplaceAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [5, 6]).astype('int32') self.np_y = np.random.randint(0, 8, [5, 6]).astype('int32') def test_dygraph_InplaceCompatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) ref_out = np.bitwise_and(self.np_x, self.np_y) # 1. Tensor method - positional args out1 = x.clone().bitwise_and_(y) # 2. Tensor method - Paddle keyword args out2 = x.clone().bitwise_and_(y=y) # 3. Tensor method - PyTorch keyword args (alias) out3 = x.clone().bitwise_and_(other=y) # 4. Paddle function - positional args out4 = paddle.bitwise_and_(x.clone(), y) # 5. Paddle function - Paddle keyword args out5 = paddle.bitwise_and_(x=x.clone(), y=y) # 6. Paddle function - PyTorch keyword args (alias) out6 = paddle.bitwise_and_(input=x.clone(), other=y) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_array_equal(ref_out, out.numpy()) # Test bitwise_or_ inplace compatibility class TestBitwiseOrInplaceAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [5, 6]).astype('int32') self.np_y = np.random.randint(0, 8, [5, 6]).astype('int32') def test_dygraph_InplaceCompatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) ref_out = np.bitwise_or(self.np_x, self.np_y) # 1. Tensor method - positional args out1 = x.clone().bitwise_or_(y) # 2. Tensor method - Paddle keyword args out2 = x.clone().bitwise_or_(y=y) # 3. Tensor method - PyTorch keyword args (alias) out3 = x.clone().bitwise_or_(other=y) # 4. Paddle function - positional args out4 = paddle.bitwise_or_(x.clone(), y) # 5. Paddle function - Paddle keyword args out5 = paddle.bitwise_or_(x=x.clone(), y=y) # 6. Paddle function - PyTorch keyword args (alias) out6 = paddle.bitwise_or_(input=x.clone(), other=y) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_array_equal(ref_out, out.numpy()) # Test bitwise_xor_ inplace compatibility class TestBitwiseXorInplaceAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [5, 6]).astype('int32') self.np_y = np.random.randint(0, 8, [5, 6]).astype('int32') def test_dygraph_InplaceCompatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) ref_out = np.bitwise_xor(self.np_x, self.np_y) # 1. Tensor method - positional args out1 = x.clone().bitwise_xor_(y) # 2. Tensor method - Paddle keyword args out2 = x.clone().bitwise_xor_(y=y) # 3. Tensor method - PyTorch keyword args (alias) out3 = x.clone().bitwise_xor_(other=y) # 4. Paddle function - positional args out4 = paddle.bitwise_xor_(x.clone(), y) # 5. Paddle function - Paddle keyword args out5 = paddle.bitwise_xor_(x=x.clone(), y=y) # 6. Paddle function - PyTorch keyword args (alias) out6 = paddle.bitwise_xor_(input=x.clone(), other=y) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_array_equal(ref_out, out.numpy()) # Test bitwise_not_ inplace compatibility class TestBitwiseNotInplaceAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(0, 8, [5, 6]).astype('int32') def test_dygraph_InplaceCompatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) ref_out = np.bitwise_not(self.np_x) # 1. Tensor method - positional args out1 = x.clone().bitwise_not_() # 2. Tensor method - keyword args out2 = x.clone().bitwise_not_() # 3. Paddle function - positional args out3 = paddle.bitwise_not_(x.clone()) # 4. Paddle function - keyword args (PyTorch alias) out4 = paddle.bitwise_not_(input=x.clone()) for out in [out1, out2, out3, out4]: np.testing.assert_array_equal(ref_out, out.numpy()) class TestCdistAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.rand(3, 5, 4).astype('float32') self.np_y = np.random.rand(3, 2, 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) out1 = paddle.cdist(x, y) out2 = paddle.cdist(x=x, y=y) out3 = paddle.cdist(x1=x, x2=y) out4 = paddle.cdist(x, y, p=2.0) out5 = paddle.cdist( x1=x, x2=y, p=2.0, compute_mode='use_mm_for_euclid_dist_if_necessary', ) for out in [out2, out3, out4, out5]: np.testing.assert_allclose(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=[3, 5, 4], dtype='float32') y = paddle.static.data(name="y", shape=[3, 2, 4], dtype='float32') out1 = paddle.cdist(x, y) out2 = paddle.cdist(x=x, y=y) out3 = paddle.cdist(x1=x, x2=y) out4 = paddle.cdist(x, y, p=2.0) out5 = paddle.cdist( x1=x, x2=y, p=2.0, compute_mode='use_mm_for_euclid_dist_if_necessary', ) exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x, "y": self.np_y}, fetch_list=[out1, out2, out3, out4, out5], ) for out in fetches: np.testing.assert_allclose(fetches[0], out) def test_zero_size(self): """Test edge cases: r1==0, r2==0, c1==0.""" paddle.disable_static() # r1==0 (3D batched) x1 = paddle.to_tensor(np.random.rand(2, 0, 4).astype('float32')) y1 = paddle.to_tensor(np.random.rand(2, 3, 4).astype('float32')) out1 = paddle.cdist(x1, y1) self.assertEqual(out1.shape, [2, 0, 3]) # r2==0 (2D non-batched) x2 = paddle.to_tensor(np.random.rand(3, 4).astype('float32')) y2 = paddle.to_tensor(np.random.rand(0, 4).astype('float32')) out2 = paddle.cdist(x2, y2) self.assertEqual(out2.shape, [3, 0]) # c1==0 (3D batched, should return zeros) x3 = paddle.to_tensor(np.random.rand(2, 3, 0).astype('float32')) y3 = paddle.to_tensor(np.random.rand(2, 2, 0).astype('float32')) out3 = paddle.cdist(x3, y3) self.assertEqual(out3.shape, [2, 3, 2]) np.testing.assert_allclose(out3.numpy(), 0.0) paddle.enable_static() class TestAddmmAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_input = np.random.rand(2, 3).astype('float32') self.np_x = np.random.rand(2, 4).astype('float32') self.np_y = np.random.rand(4, 3).astype('float32') def test_dygraph_Compatibility(self): paddle.disable_static() input = paddle.to_tensor(self.np_input) x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) ref_out = 1.0 * self.np_input + 1.0 * self.np_x @ self.np_y # 1. Paddle positional arguments out1 = paddle.addmm(input, x, y, 1.0, 1.0) # 2. Paddle keyword arguments out2 = paddle.addmm(input=input, x=x, y=y, beta=1.0, alpha=1.0) # 3. PyTorch keyword arguments (alias) out3 = paddle.addmm(beta=1.0, alpha=1.0, input=input, mat1=x, mat2=y) # 4. Mixed arguments out4 = paddle.addmm(input, x, y, beta=1.0, alpha=1.0) # 5-6. out parameter test out5 = paddle.empty_like(input) out6 = paddle.addmm(input, x, y, out=out5) # 7. Tensor method - args out7 = input.addmm(x, y, beta=1.0, alpha=1.0) # 8. Tensor method - kwargs (PyTorch alias) out8 = input.addmm(mat1=x, mat2=y, beta=1.0, alpha=1.0) for out in [out1, out2, out3, out4, out5, out6, out7, out8]: np.testing.assert_allclose(ref_out, out.numpy(), rtol=1e-6) paddle.enable_static() def test_error(self): """Test invalid input dimensions that should raise ValueError.""" paddle.disable_static() x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) # Test 3D input (invalid) input_3d = paddle.to_tensor(np.random.rand(2, 2, 3).astype('float32')) with self.assertRaises(ValueError): paddle.addmm(input_3d, x, y) 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): input = paddle.static.data( name="input", shape=[2, 3], dtype='float32' ) x = paddle.static.data(name="x", shape=[2, 4], dtype='float32') y = paddle.static.data(name="y", shape=[4, 3], dtype='float32') # 1. Paddle positional arguments out1 = paddle.addmm(input, x, y, 1.0, 1.0) # 2. Paddle keyword arguments out2 = paddle.addmm(input=input, x=x, y=y, beta=1.0, alpha=1.0) # 3. PyTorch keyword arguments (alias) out3 = paddle.addmm(beta=1, alpha=1, input=input, mat1=x, mat2=y) # 4. Tensor method - args out4 = input.addmm(x, y, beta=1.0, alpha=1.0) # 5. Tensor method - kwargs (PyTorch alias) out5 = input.addmm(mat1=x, mat2=y, beta=1.0, alpha=1.0) exe = paddle.static.Executor() fetches = exe.run( main, feed={"input": self.np_input, "x": self.np_x, "y": self.np_y}, fetch_list=[out1, out2, out3, out4, out5], ) ref_out = 1.0 * self.np_input + 1.0 * self.np_x @ self.np_y for out in fetches: np.testing.assert_allclose(ref_out, out, rtol=1e-6) class TestAddmmInplaceAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_input = np.random.rand(2, 3).astype('float32') self.np_x = np.random.rand(2, 4).astype('float32') self.np_y = np.random.rand(4, 3).astype('float32') def test_dygraph_Compatibility(self): paddle.disable_static() input = paddle.to_tensor(self.np_input) x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) out1 = paddle.addmm_(input.clone(), x, y, beta=1.0, alpha=1.0) out2 = paddle.addmm_(input=input.clone(), x=x, y=y, beta=1.0, alpha=1.0) out3 = paddle.addmm_( input=input.clone(), mat1=x, mat2=y, beta=1.0, alpha=1.0 ) out4 = input.clone().addmm_(x, y, beta=1.0, alpha=1.0) out5 = input.clone().addmm_(x=x, y=y, beta=1.0, alpha=1.0) out6 = input.clone().addmm_(mat1=x, mat2=y, beta=1.0, alpha=1.0) ref_out = 1.0 * self.np_input + 1.0 * self.np_x @ self.np_y # Verify all outputs for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose(ref_out, out.numpy(), rtol=1e-6) paddle.enable_static() class TestLdexpInplaceAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randn(3, 4).astype('float32') self.np_y = np.random.randint(-3, 4, [3, 4]).astype('int32') def test_dygraph_InplaceCompatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) ref_out = np.ldexp(self.np_x, self.np_y) # 1. Tensor method - positional args out1 = x.clone().ldexp_(y) # 2. Tensor method - Paddle keyword args out2 = x.clone().ldexp_(y=y) # 3. Tensor method - PyTorch keyword args (alias) out3 = x.clone().ldexp_(other=y) # 4. Paddle function - positional args out4 = paddle.ldexp_(x.clone(), y) # 5. Paddle function - Paddle keyword args out5 = paddle.ldexp_(input=x.clone(), y=y) # 6. Paddle function - PyTorch keyword args (alias) out6 = paddle.ldexp_(input=x.clone(), other=y) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose(ref_out, out.numpy(), rtol=1e-6) paddle.enable_static() # Test imag property compatibility (PyTorch-style property access) class TestImagPropertyAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) np_x_real = np.random.randn(5, 6).astype('float32') np_x_imag = np.random.randn(5, 6).astype('float32') self.np_x = np_x_real + 1j * np_x_imag # will support future def _test_dygraph_Compatibility(self): """Test imag as property (PyTorch style: x.imag)""" paddle.disable_static() x = paddle.to_tensor(self.np_x) # PyTorch style: property access imag_result = x.imag self.assertIsInstance(imag_result, paddle.Tensor) np.testing.assert_allclose(imag_result.numpy(), np.imag(self.np_x)) paddle.enable_static() # will support future 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='complex64') out = x.imag exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out], ) np.testing.assert_allclose(fetches[0], np.imag(self.np_x)) # Test real property compatibility (PyTorch-style property access) class TestRealPropertyAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) np_x_real = np.random.randn(5, 6).astype('float32') np_x_imag = np.random.randn(5, 6).astype('float32') self.np_x = np_x_real + 1j * np_x_imag # will support future def _test_dygraph_Compatibility(self): """Test real as property (PyTorch style: x.real)""" paddle.disable_static() x = paddle.to_tensor(self.np_x) real_result = x.real self.assertIsInstance(real_result, paddle.Tensor) np.testing.assert_allclose(real_result.numpy(), np.real(self.np_x)) paddle.enable_static() # will support future 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='complex64') out = x.real exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out], ) np.testing.assert_allclose(fetches[0], np.real(self.np_x)) # Test baddbmm API compatibility (paddle.baddbmm and paddle.Tensor.baddbmm) class TestBaddbmmAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_input = np.random.rand(3, 2, 3).astype('float32') self.np_x = np.random.rand(3, 2, 4).astype('float32') self.np_y = np.random.rand(3, 4, 3).astype('float32') def test_dygraph_Compatibility(self): paddle.disable_static() input = paddle.to_tensor(self.np_input) x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) # 1. Paddle positional arguments out1 = paddle.baddbmm(input, x, y, 1.0, 1.0) # 2. Paddle keyword arguments out2 = paddle.baddbmm(input=input, x=x, y=y, beta=1.0, alpha=1.0) # 3. PyTorch keyword arguments (alias) out3 = paddle.baddbmm( beta=1.0, alpha=1.0, input=input, batch1=x, batch2=y ) # 4. Mixed arguments out4 = paddle.baddbmm(input, x, y, beta=1.0, alpha=1.0) # 5-6. out parameter test out5 = paddle.empty_like(input) out6 = paddle.baddbmm(input, x, y, out=out5) # 7. Tensor method - args out7 = input.baddbmm(x, y, beta=1.0, alpha=1.0) # 8. Tensor method - kwargs (PyTorch alias) out8 = input.baddbmm(batch1=x, batch2=y, beta=1.0, alpha=1.0) ref_out = 1.0 * self.np_input + 1.0 * 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-6) # 2D input (1,1) broadcasts to result shape [3, 2, 3] input_2d = paddle.to_tensor(np.array([[0.5]]).astype('float32')) out8 = paddle.baddbmm(input_2d, x, y) ref_out_2d = 0.5 + self.np_x @ self.np_y np.testing.assert_allclose(ref_out_2d, out8.numpy(), rtol=1e-6) paddle.enable_static() def test_error(self): """Test invalid input dimensions that should raise ValueError.""" paddle.disable_static() x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) # Test 1D input (invalid) input_1d = paddle.to_tensor(np.random.rand(3).astype('float32')) with self.assertRaises(ValueError): paddle.baddbmm(input_1d, x, y) 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): input = paddle.static.data( name="input", shape=[3, 2, 3], dtype='float32' ) x = paddle.static.data(name="x", shape=[3, 2, 4], dtype='float32') y = paddle.static.data(name="y", shape=[3, 4, 3], dtype='float32') # 1. Paddle positional arguments out1 = paddle.baddbmm(input, x, y, 1.0, 1.0) # 2. Paddle keyword arguments out2 = paddle.baddbmm(input=input, x=x, y=y, beta=1.0, alpha=1.0) # 3. PyTorch keyword arguments (alias) out3 = paddle.baddbmm( beta=1, alpha=1, input=input, batch1=x, batch2=y ) # 4. Tensor method - args out4 = input.baddbmm(x, y, beta=1.0, alpha=1.0) # 5. Tensor method - kwargs (PyTorch alias) out5 = input.baddbmm(batch1=x, batch2=y, beta=1.0, alpha=1.0) exe = paddle.static.Executor() fetches = exe.run( main, feed={"input": self.np_input, "x": self.np_x, "y": self.np_y}, fetch_list=[out1, out2, out3, out4, out5], ) ref_out = 1.0 * self.np_input + 1.0 * self.np_x @ self.np_y for out in fetches: np.testing.assert_allclose(ref_out, out, rtol=1e-6) # Test baddbmm_ API compatibility (paddle.baddbmm_ and paddle.Tensor.baddbmm_) class TestBaddbmmInplaceAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_input = np.random.rand(3, 2, 3).astype('float32') self.np_x = np.random.rand(3, 2, 4).astype('float32') self.np_y = np.random.rand(3, 4, 3).astype('float32') def test_dygraph_Compatibility(self): paddle.disable_static() input = paddle.to_tensor(self.np_input) x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) out1 = paddle.baddbmm_(input.clone(), x, y, beta=0.5, alpha=0.7) out2 = paddle.baddbmm_( input=input.clone(), x=x, y=y, beta=0.5, alpha=0.7 ) out3 = paddle.baddbmm_( input=input.clone(), batch1=x, batch2=y, beta=0.5, alpha=0.7 ) out4 = input.clone().baddbmm_(x, y, beta=0.5, alpha=0.7) out5 = input.clone().baddbmm_(x=x, y=y, beta=0.5, alpha=0.7) out6 = input.clone().baddbmm_(batch1=x, batch2=y, beta=0.5, alpha=0.7) ref_out = 0.5 * self.np_input + 0.7 * self.np_x @ self.np_y # Verify all outputs for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose(ref_out, out.numpy(), rtol=1e-6) paddle.enable_static() # Test bitwise_left_shift compatibility class TestBitwiseLeftShiftAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(1, 10, [5, 6]).astype('int32') self.np_y = np.random.randint(1, 5, [5, 6]).astype('int32') 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.bitwise_left_shift(x, y) # 2. Paddle keyword arguments out2 = paddle.bitwise_left_shift(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.bitwise_left_shift(input=x, other=y) # 4. Mixed arguments out4 = paddle.bitwise_left_shift(x, y=y) # 5-6. out parameter test out5 = paddle.empty([5, 6], dtype='int32') out6 = paddle.bitwise_left_shift(x, y, out=out5) # 7. Tensor method - args out7 = x.bitwise_left_shift(y) # 8. Tensor method - kwargs (PyTorch alias) out8 = x.bitwise_left_shift(other=y) ref_out = np.left_shift(self.np_x, self.np_y) for out in [out1, out2, out3, out4, out5, out6, out7, out8]: 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=[5, 6], dtype='int32') y = paddle.static.data(name="y", shape=[5, 6], dtype='int32') # 1. Paddle positional arguments out1 = paddle.bitwise_left_shift(x, y) # 2. Paddle keyword arguments out2 = paddle.bitwise_left_shift(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.bitwise_left_shift(input=x, other=y) # 4. Tensor method - args out4 = x.bitwise_left_shift(y) # 5. Tensor method - kwargs (PyTorch alias) out5 = x.bitwise_left_shift(other=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.left_shift(self.np_x, self.np_y) for out in fetches: np.testing.assert_array_equal(out, ref_out) # Test bitwise_left_shift_ inplace compatibility class TestBitwiseLeftShiftInplaceAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(1, 10, [5, 6]).astype('int32') self.np_y = np.random.randint(1, 5, [5, 6]).astype('int32') def test_dygraph_InplaceCompatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) ref_out = np.left_shift(self.np_x, self.np_y) # 1. Tensor method - positional args out1 = x.clone().bitwise_left_shift_(y) # 2. Tensor method - Paddle keyword args out2 = x.clone().bitwise_left_shift_(y=y) # 3. Tensor method - PyTorch keyword args (alias) out3 = x.clone().bitwise_left_shift_(other=y) # 4. Paddle function - positional args out4 = paddle.bitwise_left_shift_(x.clone(), y) # 5. Paddle function - Paddle keyword args out5 = paddle.bitwise_left_shift_(x=x.clone(), y=y) # 6. Paddle function - PyTorch keyword args (alias) out6 = paddle.bitwise_left_shift_(input=x.clone(), other=y) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_array_equal(ref_out, out.numpy()) # Test bitwise_right_shift compatibility class TestBitwiseRightShiftAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(10, 100, [5, 6]).astype('int32') self.np_y = np.random.randint(1, 5, [5, 6]).astype('int32') 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.bitwise_right_shift(x, y) # 2. Paddle keyword arguments out2 = paddle.bitwise_right_shift(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.bitwise_right_shift(input=x, other=y) # 4. Mixed arguments out4 = paddle.bitwise_right_shift(x, y=y) # 5-6. out parameter test out5 = paddle.empty([5, 6], dtype='int32') out6 = paddle.bitwise_right_shift(x, y, out=out5) # 7. Tensor method - args out7 = x.bitwise_right_shift(y) # 8. Tensor method - kwargs (PyTorch alias) out8 = x.bitwise_right_shift(other=y) ref_out = np.right_shift(self.np_x, self.np_y) for out in [out1, out2, out3, out4, out5, out6, out7, out8]: 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=[5, 6], dtype='int32') y = paddle.static.data(name="y", shape=[5, 6], dtype='int32') # 1. Paddle positional arguments out1 = paddle.bitwise_right_shift(x, y) # 2. Paddle keyword arguments out2 = paddle.bitwise_right_shift(x=x, y=y) # 3. PyTorch keyword arguments (alias) out3 = paddle.bitwise_right_shift(input=x, other=y) # 4. Tensor method - args out4 = x.bitwise_right_shift(y) # 5. Tensor method - kwargs (PyTorch alias) out5 = x.bitwise_right_shift(other=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.right_shift(self.np_x, self.np_y) for out in fetches: np.testing.assert_array_equal(out, ref_out) # Test bitwise_right_shift_ inplace compatibility class TestBitwiseRightShiftInplaceAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(10, 100, [5, 6]).astype('int32') self.np_y = np.random.randint(1, 5, [5, 6]).astype('int32') def test_dygraph_InplaceCompatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) y = paddle.to_tensor(self.np_y) ref_out = np.right_shift(self.np_x, self.np_y) # 1. Tensor method - positional args out1 = x.clone().bitwise_right_shift_(y) # 2. Tensor method - Paddle keyword args out2 = x.clone().bitwise_right_shift_(y=y) # 3. Tensor method - PyTorch keyword args (alias) out3 = x.clone().bitwise_right_shift_(other=y) # 4. Paddle function - positional args out4 = paddle.bitwise_right_shift_(x.clone(), y) # 5. Paddle function - Paddle keyword args out5 = paddle.bitwise_right_shift_(x=x.clone(), y=y) # 6. Paddle function - PyTorch keyword args (alias) out6 = paddle.bitwise_right_shift_(input=x.clone(), other=y) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_array_equal(ref_out, out.numpy()) # Test cauchy_ inplace compatibility class TestCauchyInplaceAPI(unittest.TestCase): def test_dygraph_InplaceCompatibility(self): paddle.disable_static() # 1. Tensor method - positional args out1 = paddle.randn([3, 4], dtype='float32') out1.cauchy_(1.0, 2.0) # 2. Tensor method - Paddle keyword args out2 = paddle.randn([3, 4], dtype='float32') out2.cauchy_(loc=1.0, scale=2.0) # 3. Tensor method - PyTorch keyword args (alias) out3 = paddle.randn([3, 4], dtype='float32') out3.cauchy_(median=1.0, sigma=2.0) # 4. Paddle function - positional args out4 = paddle.randn([3, 4], dtype='float32') paddle.cauchy_(out4, 1.0, 2.0) # 5. Paddle function - Paddle keyword args out5 = paddle.randn([3, 4], dtype='float32') paddle.cauchy_(out5, loc=1.0, scale=2.0) # 6. Paddle function - PyTorch keyword args (alias) out6 = paddle.randn([3, 4], dtype='float32') paddle.cauchy_(out6, median=1.0, sigma=2.0) for out in [out1, out2, out3, out4, out5, out6]: self.assertEqual(out.shape, [3, 4]) class TestTensorCumsumInplaceAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randint(1, 5, size=(3, 4)).astype('int64') def test_dygraph_InplaceCompatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) # 1. Tensor method - positional args out1 = x.clone() out1.cumsum_(1) # 2. Tensor method - Paddle keyword args out2 = x.clone() out2.cumsum_(axis=1) # 3. Tensor method - PyTorch keyword args (alias) out3 = x.clone() out3.cumsum_(dim=1) # 4. Paddle function - positional args out4 = x.clone() paddle.cumsum_(out4, 1) # 5. Paddle function - Paddle keyword args out5 = x.clone() paddle.cumsum_(out5, axis=1) # 6. Paddle function - PyTorch keyword args (alias) out6 = x.clone() paddle.cumsum_(out6, dim=1) ref = np.cumsum(self.np_x, axis=1) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose(ref, out.numpy()) # Test real compatibility class TestRealAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) np_x_real = np.random.randn(5, 6).astype('float32') np_x_imag = np.random.randn(5, 6).astype('float32') self.np_x = np_x_real + 1j * np_x_imag def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) # 1. Paddle positional arguments out1 = paddle.real(x) # 2. Paddle keyword arguments out2 = paddle.real(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.real(input=x) # 4-5. out parameter test out4 = paddle.empty([5, 6], dtype='float32') out5 = paddle.real(x, out=out4) # 6. Tensor method out6 = x.real() # Verify all outputs ref_out = np.real(self.np_x) for out in [out1, out2, out3, out4, out5, out6]: np.testing.assert_allclose(ref_out, out.numpy(), 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=[5, 6], dtype='complex64') # 1. Paddle positional arguments out1 = paddle.real(x) # 2. Paddle keyword arguments out2 = paddle.real(x=x) # 3. PyTorch keyword arguments (alias) out3 = paddle.real(input=x) # 4. Tensor method out4 = x.real() exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out1, out2, out3, out4], ) ref_out = np.real(self.np_x) for out in fetches: np.testing.assert_allclose(ref_out, out, rtol=1e-6) # Test pixel_shuffle compatibility class TestPixelShuffleAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) self.np_x = np.random.randn(2, 9, 4, 4).astype('float32') def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) # 1. Paddle positional arguments out1 = F.pixel_shuffle(x, 3) # 2. Paddle keyword arguments out2 = F.pixel_shuffle(x=x, upscale_factor=3) # 3. PyTorch keyword arguments (alias) out3 = F.pixel_shuffle(input=x, upscale_factor=3) # 4. Mixed arguments out4 = F.pixel_shuffle(x, upscale_factor=3) # Verify all outputs match for out in [out2, out3, out4]: 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=[2, 9, 4, 4], dtype='float32' ) # 1. Paddle positional arguments out1 = F.pixel_shuffle(x, 3) # 2. Paddle keyword arguments out2 = F.pixel_shuffle(x=x, upscale_factor=3) # 3. PyTorch keyword arguments (alias) out3 = F.pixel_shuffle(input=x, upscale_factor=3) exe = paddle.static.Executor() fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out1, out2, out3], ) for out in fetches[1:]: np.testing.assert_array_equal(fetches[0], out) # Test paddle.set_rng_state compatibility class TestSetRngStateAPI(unittest.TestCase): def test_Compatibility(self): states = paddle.get_rng_state() # 1. positional argument paddle.set_rng_state(states) # 2. paddle-style keyword argument paddle.set_rng_state(state_list=states) # 3. torch-style keyword argument paddle.set_rng_state(new_state=states) class _CompatBatchNormBase: api = None alias = None alias_name = None original_api = None x_shape = None invalid_shape = None axes = None def setUp(self): np.random.seed(2025) self.num_features = 3 self.eps = 1e-5 self.np_x = np.random.rand(*self.x_shape).astype("float32") * 2 - 1 self.np_x_alt = np.random.rand(*self.x_shape).astype("float32") * 2 - 1 def _expected(self, x=None, eps=None): x = self.np_x if x is None else x eps = self.eps if eps is None else eps mean = np.mean(x, axis=self.axes, keepdims=True) var = np.var(x, axis=self.axes, keepdims=True) return (x - mean) / np.sqrt(var + eps) def _check_outputs(self, outputs, expected=None, rtol=1e-5): expected = self._expected() if expected is None else expected for out in outputs: np.testing.assert_allclose(out.numpy(), expected, rtol=rtol) def test_dygraph_Compatibility(self): paddle.disable_static() x = paddle.to_tensor(self.np_x) # 1. Paddle positional arguments layer1 = self.alias(self.num_features) out1 = layer1(x) # 2. Paddle keyword arguments layer2 = self.alias(num_features=self.num_features, eps=self.eps) out2 = layer2(x) # 3. PyTorch positional arguments layer3 = self.alias( self.num_features, self.eps, 0.2, False, False, None, "float64" ) x64 = paddle.to_tensor(self.np_x.astype("float64")) out3 = layer3(x64) # 4. PyTorch keyword arguments layer4 = self.alias( dtype="float32", device=None, track_running_stats=True, affine=True, momentum=0.2, eps=self.eps, num_features=self.num_features, ) out4 = layer4(x) # 5. Mixed arguments layer5 = self.alias(self.num_features, eps=self.eps) out5 = layer5(x) self._check_outputs([out1, out2, out4, out5]) np.testing.assert_allclose( out3.numpy(), self._expected(self.np_x.astype("float64")), rtol=1e-5, ) self.assertEqual(layer4._momentum, 0.8) self.assertIsNone(layer4._use_global_stats) self.assertIs(self.api, self.alias) layer6 = self.alias(self.num_features, track_running_stats=False) layer6.eval() out6 = layer6(x) self.assertFalse(layer6._use_global_stats) self._check_outputs([out6]) layer7 = self.alias(self.num_features, momentum=None) out7 = layer7(x) self._check_outputs([out7]) self.assertIsNone(layer7.momentum) self.assertEqual(layer7._num_batches_tracked, 1) self.assertIsNone(layer7._momentum) layer7(paddle.to_tensor(self.np_x_alt)) self.assertEqual(layer7._num_batches_tracked, 2) self.assertIsNone(layer7._momentum) layer8 = self.alias(self.num_features) layer8.eval() out8 = layer8(x) np.testing.assert_allclose( out8.numpy(), self.np_x / np.sqrt(1.0 + self.eps), rtol=1e-5, ) bad_x = paddle.ones(self.invalid_shape, dtype="float32") with self.assertRaises(ValueError): layer1(bad_x) original_layer = self.original_api(self.num_features) original_layer(x) self.assertEqual(original_layer._momentum, 0.9) original_none = self.original_api(self.num_features, momentum=None) original_none(x) self.assertEqual(original_none._num_batches_tracked, 1) self.assertIsNone(original_none._momentum) original_none(paddle.to_tensor(self.np_x_alt)) self.assertEqual(original_none._num_batches_tracked, 2) self.assertIsNone(original_none._momentum) original_eps = self.original_api(self.num_features, eps=self.eps) self.assertEqual(original_eps._epsilon, self.eps) original_affine = self.original_api(self.num_features, affine=False) self.assertIsNone(original_affine.weight) self.assertIsNone(original_affine.bias) original_dtype = self.original_api(self.num_features, dtype="float64") self.assertEqual(original_dtype._dtype, "float64") self.assertFalse(hasattr(paddle.nn, self.alias_name)) 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.x_shape, dtype=str(self.np_x.dtype) ) # 1. Paddle positional arguments layer1 = self.alias(self.num_features) out1 = layer1(x) # 2. Paddle keyword arguments layer2 = self.alias(num_features=self.num_features, eps=self.eps) out2 = layer2(x) # 3. PyTorch positional arguments layer3 = self.alias( self.num_features, self.eps, 0.2, False, False, None, "float32" ) out3 = layer3(x) # 4. PyTorch keyword arguments layer4 = self.alias( dtype="float32", device=None, track_running_stats=False, affine=True, momentum=0.2, eps=self.eps, num_features=self.num_features, ) out4 = layer4(x) # 5. Mixed arguments layer5 = self.alias(self.num_features, momentum=None) out5 = layer5(x) self.assertFalse(layer4._use_global_stats) self.assertEqual(layer4._momentum, 0.8) self.assertIsNone(layer5._momentum) exe = paddle.static.Executor() exe.run(startup) fetches = exe.run( main, feed={"x": self.np_x}, fetch_list=[out1, out2, out3, out4, out5], ) expected = self._expected() for out in fetches: np.testing.assert_allclose(out, expected, rtol=1e-5) class TestCompatBatchNorm1dAPI(_CompatBatchNormBase, unittest.TestCase): api = paddle.compat.nn.BatchNorm1D alias = paddle.compat.nn.BatchNorm1d alias_name = "BatchNorm1d" original_api = paddle.nn.BatchNorm1D x_shape = (4, 3, 5) invalid_shape = (2, 3, 4, 5) axes = (0, 2) def test_dygraph_2DInput(self): paddle.disable_static() x_np = np.random.rand(4, self.num_features).astype("float32") * 2 - 1 x = paddle.to_tensor(x_np) out = self.alias(self.num_features)(x) expected = (x_np - np.mean(x_np, axis=0)) / np.sqrt( np.var(x_np, axis=0) + self.eps ) np.testing.assert_allclose(out.numpy(), expected, rtol=1e-5) paddle.enable_static() class TestCompatBatchNorm2dAPI(_CompatBatchNormBase, unittest.TestCase): api = paddle.compat.nn.BatchNorm2D alias = paddle.compat.nn.BatchNorm2d alias_name = "BatchNorm2d" original_api = paddle.nn.BatchNorm2D x_shape = (2, 3, 4, 5) invalid_shape = (2, 3, 4) axes = (0, 2, 3) class TestCompatBatchNorm3dAPI(_CompatBatchNormBase, unittest.TestCase): api = paddle.compat.nn.BatchNorm3D alias = paddle.compat.nn.BatchNorm3d alias_name = "BatchNorm3d" original_api = paddle.nn.BatchNorm3D x_shape = (2, 3, 2, 4, 5) invalid_shape = (2, 3, 4, 5) axes = (0, 2, 3, 4) # Test DistributedSampler compatibility class TestDistributedSamplerAPI(unittest.TestCase): def setUp(self): np.random.seed(2025) class SimpleDataset: def __init__(self, size): self.size = size def __getitem__(self, idx): x = idx y = 2 * idx return x, y def __len__(self): return self.size self.dataset = SimpleDataset(100) def test_dygraph_Compatibility(self): """Test DistributedSampler as alias for DistributedBatchSampler""" # 1. positional arguments sampler1 = paddle.utils.data.DistributedSampler( self.dataset, 2, 0, False, 2026, False ) # 2. keyword arguments sampler2 = paddle.utils.data.DistributedSampler( dataset=self.dataset, num_replicas=2, rank=0, shuffle=False, seed=2026, drop_last=False, ) # Verify both samplers produce same batches batches1 = list(sampler1) batches2 = list(sampler2) self.assertEqual(len(batches1), len(batches2)) for b1, b2 in zip(batches1, batches2): self.assertEqual(b1, b2) def test_set_epoch(self): """Test set_epoch method""" sampler = paddle.utils.data.DistributedSampler( self.dataset, num_replicas=2, rank=0, shuffle=True ) # Collect samples from epoch 0 sampler.set_epoch(0) batches0 = list(sampler) # Collect samples from epoch 1 sampler.set_epoch(1) batches1 = list(sampler) self.assertEqual(len(batches0), len(batches1)) # Edit By AI Agent # Test expand_copy compatibility class TestExpandCopyAPI(unittest.TestCase): def setUp(self): paddle.disable_static() self.x = paddle.to_tensor([1, 2, 3], dtype='int32') def test_dygraph(self): paddle.disable_static() # Test 1: positional arguments out1 = paddle.expand_copy(self.x, shape=[2, 3]) self.assertEqual(out1.shape, [2, 3]) # Test 2: keyword arguments (PyTorch alias) out2 = paddle.expand_copy(x=self.x, shape=[2, 3]) self.assertEqual(out2.shape, [2, 3]) # Test 3: Tensor method out3 = self.x.expand_copy(shape=[2, 3]) self.assertEqual(out3.shape, [2, 3]) # Test 4: expand_copy with -1 (keep dim) out4 = paddle.expand_copy(self.x, shape=[2, -1]) self.assertEqual(out4.shape, [2, 3]) # Test 5: expand_copy with same shape (no-op) out5 = paddle.expand_copy(self.x, shape=[3]) self.assertEqual(out5.shape, [3]) # Verify that result equals expand ref = paddle.expand(self.x, shape=[2, 3]) self.assertTrue(paddle.equal_all(out1, ref)) # Verify stop_gradient x = paddle.to_tensor([1.0, 2.0, 3.0], stop_gradient=False) out = paddle.expand_copy(x, shape=[2, 3]) self.assertFalse(out.stop_gradient) # Test 6: expand_decorator alias: input -> x out6 = paddle.expand_copy(input=self.x, shape=[2, 3]) self.assertEqual(out6.shape, [2, 3]) self.assertTrue(paddle.equal_all(out1, out6)) # Test 7: expand_decorator alias: size -> shape out7 = paddle.expand_copy(self.x, size=[2, 3]) self.assertEqual(out7.shape, [2, 3]) self.assertTrue(paddle.equal_all(out1, out7)) # Test 8: expand_decorator alias: both input and size aliases out8 = paddle.expand_copy(input=self.x, size=[2, 3]) self.assertEqual(out8.shape, [2, 3]) self.assertTrue(paddle.equal_all(out1, out8)) # Test 9: expand_decorator variable positional int args out9 = paddle.expand_copy(self.x, 2, 3) self.assertEqual(out9.shape, [2, 3]) self.assertTrue(paddle.equal_all(out1, out9)) 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="int32") out1 = paddle.expand_copy(x, shape=[2, 3]) out2 = paddle.expand_copy(input=x, shape=[2, 3]) out3 = paddle.expand_copy(x, size=[2, 3]) exe = paddle.static.Executor() np_x = np.array([1, 2, 3]).astype("int32") fetches = exe.run( main, feed={"x": np_x}, fetch_list=[out1, out2, out3], ) expected = np.broadcast_to(np_x, (2, 3)) for out in fetches: np.testing.assert_array_equal(out, expected) if __name__ == '__main__': unittest.main()