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

364 lines
15 KiB
Python

# 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
from paddle import static
from paddle.compat import equal
from paddle.static import Program, program_guard
class TestCompatEqualDygraph(unittest.TestCase):
def setUp(self):
self.places = [paddle.CPUPlace()]
if paddle.is_compiled_with_cuda():
self.places.append(paddle.CUDAPlace(0))
def test_equal_tensors(self):
"""Test equal tensors return True"""
for place in self.places:
with self.subTest(place=place):
x = paddle.to_tensor([1.0, 2.0, 3.0])
y = paddle.to_tensor([1.0, 2.0, 3.0])
self.assertTrue(equal(x, y))
x_int = paddle.to_tensor([1, 2, 3], dtype='int32')
y_int = paddle.to_tensor([1, 2, 3], dtype='int32')
self.assertTrue(equal(x_int, y_int))
def test_unequal_tensors(self):
"""Test unequal tensors return False"""
for place in self.places:
with self.subTest(place=place):
x = paddle.to_tensor([1.0, 2.0, 3.0])
y = paddle.to_tensor([1.0, 2.0, 4.0])
self.assertFalse(equal(x, y))
x = paddle.to_tensor([1.0, 2.0, 3.0])
y = paddle.to_tensor([4.0, 5.0, 6.0])
self.assertFalse(equal(x, y))
x_2d_int = paddle.to_tensor([[1, 2], [3, 4]], dtype='int32')
y_1d_float = paddle.to_tensor(
[1.0, 2.0, 3.0, 4.0], dtype='float32'
)
self.assertFalse(equal(x_2d_int, y_1d_float))
x_3d_int64 = paddle.to_tensor([[[1, 2], [3, 4]]], dtype='int64')
y_2d_float32 = paddle.to_tensor(
[[1.0, 2.0, 3.0, 4.0]], dtype='float32'
)
self.assertFalse(equal(x_3d_int64, y_2d_float32))
def test_different_dtypes(self):
"""Test tensors with different dtypes"""
for place in self.places:
with self.subTest(place=place):
x_float32 = paddle.to_tensor([1.0, 2.0, 3.0], dtype='float32')
y_float64 = paddle.to_tensor([1.0, 2.0, 3.0], dtype='float64')
self.assertTrue(equal(x_float32, y_float64))
x_int32 = paddle.to_tensor([1, 2, 3], dtype='int32')
y_float32 = paddle.to_tensor([1.0, 2.0, 3.0], dtype='float32')
self.assertTrue(equal(x_int32, y_float32))
x_int64 = paddle.to_tensor([1, 2, 3], dtype='int64')
y_float64 = paddle.to_tensor([1.0, 2.0, 3.0], dtype='float64')
self.assertTrue(equal(x_int64, y_float64))
x_int32 = paddle.to_tensor([1, 2, 3], dtype='int32')
y_int64 = paddle.to_tensor([1, 2, 3], dtype='int64')
self.assertTrue(equal(x_int32, y_int64))
def test_different_ndim(self):
"""Test tensors with different number of dimensions"""
for place in self.places:
with self.subTest(place=place):
x_1d = paddle.to_tensor([1.0, 2.0, 3.0])
x_2d = paddle.to_tensor([[1.0, 2.0, 3.0]])
self.assertFalse(equal(x_1d, x_2d))
def test_different_shapes(self):
"""Test tensors with same ndim but different shapes"""
for place in self.places:
with self.subTest(place=place):
x = paddle.to_tensor([[1.0, 2.0, 3.0]])
y = paddle.to_tensor([[1.0, 2.0], [3.0, 4.0]])
self.assertFalse(equal(x, y))
x = paddle.rand([2, 3, 4])
y = paddle.rand([2, 4, 3])
self.assertFalse(equal(x, y))
x_2d = paddle.to_tensor(
[[1.0, 2.0], [3.0, 4.0]], dtype='float32'
)
y_1d = paddle.to_tensor([1.0, 2.0, 3.0, 4.0], dtype='float32')
self.assertFalse(equal(x_2d, y_1d))
x_2x3 = paddle.to_tensor([[1, 2, 3], [4, 5, 6]], dtype='int32')
y_3x2 = paddle.to_tensor(
[[1, 2], [3, 4], [5, 6]], dtype='int32'
)
self.assertFalse(equal(x_2x3, y_3x2))
def test_empty_tensors(self):
"""Test empty tensors"""
for place in self.places:
with self.subTest(place=place):
x_empty = paddle.to_tensor([], dtype='float32')
y_empty = paddle.to_tensor([], dtype='float32')
self.assertTrue(equal(x_empty, y_empty))
x_empty_1d = paddle.to_tensor([], dtype='float32')
y_empty_2d = paddle.to_tensor([[]], dtype='float32')
self.assertFalse(equal(x_empty_1d, y_empty_2d))
def test_broadcast_shapes(self):
"""Test tensors that could be broadcast but have different shapes"""
for place in self.places:
with self.subTest(place=place):
x = paddle.to_tensor([1.0, 2.0, 3.0])
y = paddle.to_tensor([[1.0, 2.0, 3.0]])
self.assertFalse(equal(x, y))
def test_complex_tensors(self):
"""Test with complex tensor structures"""
for place in self.places:
with self.subTest(place=place):
x = paddle.arange(24).reshape([2, 3, 4]).astype('float32')
y = paddle.arange(24).reshape([2, 3, 4]).astype('float32')
self.assertTrue(equal(x, y))
z = x.clone()
z[0, 0, 0] = 100.0
self.assertFalse(equal(x, z))
def test_nan_and_inf(self):
"""Test with NaN and Inf values"""
for place in self.places:
with self.subTest(place=place):
x_nan = paddle.to_tensor([1.0, float('nan'), 3.0])
y_nan = paddle.to_tensor([1.0, float('nan'), 3.0])
self.assertFalse(equal(x_nan, y_nan))
x_inf = paddle.to_tensor([1.0, float('inf'), 3.0])
y_inf = paddle.to_tensor([1.0, float('inf'), 3.0])
self.assertTrue(equal(x_inf, y_inf))
x_neg_inf = paddle.to_tensor([1.0, float('-inf'), 3.0])
y_neg_inf = paddle.to_tensor([1.0, float('-inf'), 3.0])
self.assertTrue(equal(x_neg_inf, y_neg_inf))
def test_very_large_tensors(self):
"""Test with very large tensors"""
for place in self.places:
with self.subTest(place=place):
x_large = paddle.ones([100, 100])
y_large = paddle.ones([100, 100])
self.assertTrue(equal(x_large, y_large))
z_large = x_large.clone()
z_large[50, 50] = 2.0
self.assertFalse(equal(x_large, z_large))
def test_error_cases(self):
"""Test error handling"""
for place in self.places:
with self.subTest(place=place):
with self.assertRaises(AttributeError):
equal([1, 2, 3], paddle.to_tensor([1, 2, 3]))
with self.assertRaises(AttributeError):
equal(paddle.to_tensor([1, 2, 3]), [1, 2, 3])
with self.assertRaises(TypeError):
x = paddle.to_tensor([1.0, 2.0, 3.0])
y = paddle.to_tensor([1.0, 2.0, 3.0])
equal(x=x, y=y)
class TestCompatEqualStatic(unittest.TestCase):
def setUp(self):
paddle.enable_static()
self.places = [paddle.CPUPlace()]
if paddle.is_compiled_with_cuda():
self.places.append(paddle.CUDAPlace(0))
def run_static_test(self, place, input1_data, input2_data):
main_program = Program()
startup_program = Program()
with program_guard(main_program, startup_program):
input1 = static.data(
name='input1',
shape=input1_data.shape,
dtype=str(input1_data.dtype),
)
input2 = static.data(
name='input2',
shape=input2_data.shape,
dtype=str(input2_data.dtype),
)
res = paddle.compat.equal(input1, input2)
exe = paddle.static.Executor(place)
exe.run(startup_program)
result = exe.run(
main_program,
feed={'input1': input1_data, 'input2': input2_data},
fetch_list=[res],
)
return result[0]
def test_equal_tensors_static(self):
"""Test equal tensors return True on all devices"""
for place in self.places:
with self.subTest(place=place):
input1_data = np.array([1.0, 2.0, 3.0], dtype='float32')
input2_data = np.array([1.0, 2.0, 3.0], dtype='float32')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
input1_data = np.array([1, 2, 3], dtype='int32')
input2_data = np.array([1, 2, 3], dtype='int32')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
def test_unequal_tensors_static(self):
"""Test unequal tensors return False on all devices"""
for place in self.places:
with self.subTest(place=place):
input1_data = np.array([1.0, 2.0, 3.0], dtype='float32')
input2_data = np.array([1.0, 2.0, 4.0], dtype='float32')
result = self.run_static_test(place, input1_data, input2_data)
self.assertFalse(result)
def test_different_dtypes_static(self):
"""Test tensors with different dtypes on all devices"""
for place in self.places:
with self.subTest(place=place):
input1_data = np.array([1.0, 2.0, 3.0], dtype='float32')
input2_data = np.array([1, 2, 3], dtype='float64')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
input1_data = np.array([1.0, 2.0, 3.0], dtype='float32')
input2_data = np.array([1.0, 2.0, 3.0], dtype='float64')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
input1_data = np.array([1, 2, 3], dtype='int32')
input2_data = np.array([1.0, 2.0, 3.0], dtype='float32')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
input1_data = np.array([1, 2, 3], dtype='int64')
input2_data = np.array([1.0, 2.0, 3.0], dtype='float64')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
input1_data = np.array([1, 2, 3], dtype='int32')
input2_data = np.array([1, 2, 3], dtype='int64')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
def test_complex_tensors_static(self):
"""Test with complex tensor structures on all devices"""
for place in self.places:
with self.subTest(place=place):
input1_data = np.arange(24).reshape([2, 3, 4]).astype('float32')
input2_data = np.arange(24).reshape([2, 3, 4]).astype('float32')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
input2_data_modified = input2_data.copy()
input2_data_modified[0, 0, 0] = 100.0
result = self.run_static_test(
place, input1_data, input2_data_modified
)
self.assertFalse(result)
def test_nan_and_inf_static(self):
"""Test with NaN and Inf values on all devices"""
for place in self.places:
with self.subTest(place=place):
input1_data = np.array([1.0, np.nan, 3.0], dtype='float32')
input2_data = np.array([1.0, np.nan, 3.0], dtype='float32')
result = self.run_static_test(place, input1_data, input2_data)
self.assertFalse(result)
input1_data = np.array([1.0, np.inf, 3.0], dtype='float32')
input2_data = np.array([1.0, np.inf, 3.0], dtype='float32')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
def test_large_tensors_static(self):
"""Test with large tensors on all devices"""
for place in self.places:
with self.subTest(place=place):
input1_data = np.ones([50, 50], dtype='float32')
input2_data = np.ones([50, 50], dtype='float32')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
input2_data_modified = input2_data.copy()
input2_data_modified[25, 25] = 2.0
result = self.run_static_test(
place, input1_data, input2_data_modified
)
self.assertFalse(result)
def test_broadcast_comparison_static(self):
"""Test broadcast comparison in static graph on all devices"""
for place in self.places:
with self.subTest(place=place):
input1_data = np.array([[1.0, 2.0, 3.0]], dtype='float32')
input2_data = np.array([[1.0, 2.0, 3.0]], dtype='float32')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
def test_multi_dimensional_static(self):
"""Test multi-dimensional tensors on all devices"""
for place in self.places:
with self.subTest(place=place):
input1_data = np.array([1.0, 2.0, 3.0], dtype='float32')
input2_data = np.array([1.0, 2.0, 3.0], dtype='float32')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
input1_data = np.array(
[[1.0, 2.0], [3.0, 4.0]], dtype='float32'
)
input2_data = np.array(
[[1.0, 2.0], [3.0, 4.0]], dtype='float32'
)
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
input1_data = np.ones([2, 3, 4], dtype='float32')
input2_data = np.ones([2, 3, 4], dtype='float32')
result = self.run_static_test(place, input1_data, input2_data)
self.assertTrue(result)
if __name__ == '__main__':
unittest.main()