1126 lines
35 KiB
Python
1126 lines
35 KiB
Python
# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
import unittest
|
|
|
|
import numpy as np
|
|
from op_test import get_device, is_custom_device
|
|
|
|
import paddle
|
|
from paddle.pir_utils import DygraphPirGuard
|
|
|
|
|
|
def ref_view_as_real(x):
|
|
return np.stack([x.real, x.imag], -1)
|
|
|
|
|
|
def ref_view_as_complex(x):
|
|
real, imag = np.take(x, 0, axis=-1), np.take(x, 1, axis=-1)
|
|
return real + 1j * imag
|
|
|
|
|
|
class TestStride(unittest.TestCase):
|
|
def call_transpose(self):
|
|
x_np = np.random.random(size=[2, 3, 4]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
x_transposed1 = paddle.transpose(x, perm=[1, 0, 2])
|
|
x_np_transposed1 = x_np.transpose(1, 0, 2)
|
|
np.testing.assert_allclose(x_transposed1.numpy(), x_np_transposed1)
|
|
self.assertFalse(x_transposed1.is_contiguous())
|
|
self.assertTrue(x._is_shared_buffer_with(x_transposed1))
|
|
|
|
x_c = x_transposed1.contiguous()
|
|
np.testing.assert_allclose(x_c.numpy(), x_np_transposed1)
|
|
|
|
x_transposed2 = paddle.transpose(x_transposed1, perm=[2, 0, 1])
|
|
x_np_transposed2 = x_np_transposed1.transpose(2, 0, 1)
|
|
np.testing.assert_allclose(x_transposed2.numpy(), x_np_transposed2)
|
|
self.assertFalse(x_transposed2.is_contiguous())
|
|
|
|
y = x_transposed2 + 2
|
|
y_np = x_np_transposed2 + 2
|
|
np.testing.assert_allclose(y.numpy(), y_np)
|
|
self.assertFalse(x._is_shared_buffer_with(y))
|
|
|
|
def call_diagonal(self):
|
|
x_np = np.random.random(size=[2, 3, 4]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.diagonal(x)
|
|
out2 = paddle.diagonal(x, offset=0, axis1=2, axis2=1)
|
|
out3 = paddle.diagonal(x, offset=1, axis1=0, axis2=1)
|
|
out4 = paddle.diagonal(x, offset=0, axis1=1, axis2=2)
|
|
|
|
np_out = np.diagonal(x_np)
|
|
np_out2 = np.diagonal(x_np, offset=0, axis1=2, axis2=1)
|
|
np_out3 = np.diagonal(x_np, offset=1, axis1=0, axis2=1)
|
|
np_out4 = np.diagonal(x_np, offset=0, axis1=1, axis2=2)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
np.testing.assert_allclose(out2.numpy(), np_out2)
|
|
np.testing.assert_allclose(out3.numpy(), np_out3)
|
|
np.testing.assert_allclose(out4.numpy(), np_out4)
|
|
|
|
self.assertFalse(out.is_contiguous())
|
|
self.assertFalse(out2.is_contiguous())
|
|
self.assertFalse(out3.is_contiguous())
|
|
self.assertFalse(out4.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
self.assertTrue(x._is_shared_buffer_with(out2))
|
|
self.assertTrue(x._is_shared_buffer_with(out3))
|
|
self.assertTrue(x._is_shared_buffer_with(out4))
|
|
|
|
out_c = out.contiguous()
|
|
out2_c = out2.contiguous()
|
|
out3_c = out3.contiguous()
|
|
out4_c = out4.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
np.testing.assert_allclose(out2_c.numpy(), np_out2)
|
|
np.testing.assert_allclose(out3_c.numpy(), np_out3)
|
|
np.testing.assert_allclose(out4_c.numpy(), np_out4)
|
|
|
|
def call_slice(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = x[1:10, 0:10, 0:10, 0:20]
|
|
|
|
np_out = x_np[1:10, 0:10, 0:10, 0:20]
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_strided_slice(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = x[1:10:2, 0:10:2, 0:10:2, 0:20:2]
|
|
|
|
np_out = x_np[1:10:2, 0:10:2, 0:10:2, 0:20:2]
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertFalse(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
def call_index_select(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = x[:, :, :, 5]
|
|
np_out = x_np[:, :, :, 5]
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertFalse(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
def call_reshape(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.reshape(x, [10, 100, 20])
|
|
np_out = x_np.reshape(10, 100, 20)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_real(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('complex64')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.real(x)
|
|
np_out = np.real(x_np)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertFalse(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
def call_imag(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('complex128')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.imag(x)
|
|
np_out = np.imag(x_np)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertFalse(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
def call_as_real(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('complex128')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.as_real(x)
|
|
np_out = ref_view_as_real(x_np)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_as_complex(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 2]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.as_complex(x)
|
|
np_out = ref_view_as_complex(x_np)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_flatten(self):
|
|
x_np = np.random.random(size=[2, 3, 4, 4]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.flatten(x, start_axis=1, stop_axis=2)
|
|
np_out = x_np.reshape(2, 12, 4)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_squeeze(self):
|
|
x_np = np.random.random(size=[5, 1, 10]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.squeeze(x, axis=1)
|
|
np_out = x_np.reshape(5, 10)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_unsqueeze(self):
|
|
x_np = np.random.random(size=[5, 10]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.unsqueeze(x, axis=0)
|
|
np_out = x_np.reshape(1, 5, 10)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_split(self):
|
|
x_np = np.random.random(size=[3, 9, 5]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out0, out1, out2 = paddle.split(x, num_or_sections=3, axis=1)
|
|
np_out0, np_out1, np_out2 = np.split(x_np, 3, 1)
|
|
|
|
np.testing.assert_allclose(out0.numpy(), np_out0)
|
|
np.testing.assert_allclose(out1.numpy(), np_out1)
|
|
np.testing.assert_allclose(out2.numpy(), np_out2)
|
|
|
|
self.assertFalse(out0.is_contiguous())
|
|
self.assertFalse(out1.is_contiguous())
|
|
self.assertFalse(out2.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out0))
|
|
self.assertTrue(x._is_shared_buffer_with(out1))
|
|
self.assertTrue(x._is_shared_buffer_with(out2))
|
|
|
|
out0_c = out0.contiguous()
|
|
out1_c = out1.contiguous()
|
|
out2_c = out2.contiguous()
|
|
|
|
np.testing.assert_allclose(out0_c.numpy(), np_out0)
|
|
np.testing.assert_allclose(out1_c.numpy(), np_out1)
|
|
np.testing.assert_allclose(out2_c.numpy(), np_out2)
|
|
|
|
def call_split2(self):
|
|
x_np = np.random.random(size=[3, 9, 5]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out0, out1, out2 = paddle.split(x, num_or_sections=[2, 3, 4], axis=1)
|
|
out = np.split(x_np, [2, 5], 1)
|
|
np_out0 = out[0]
|
|
np_out1 = out[1]
|
|
np_out2 = out[2]
|
|
|
|
np.testing.assert_allclose(out0.numpy(), np_out0)
|
|
np.testing.assert_allclose(out1.numpy(), np_out1)
|
|
np.testing.assert_allclose(out2.numpy(), np_out2)
|
|
|
|
self.assertFalse(out0.is_contiguous())
|
|
self.assertFalse(out1.is_contiguous())
|
|
self.assertFalse(out2.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out0))
|
|
self.assertTrue(x._is_shared_buffer_with(out1))
|
|
self.assertTrue(x._is_shared_buffer_with(out2))
|
|
|
|
out0_c = out0.contiguous()
|
|
out1_c = out1.contiguous()
|
|
out2_c = out2.contiguous()
|
|
|
|
np.testing.assert_allclose(out0_c.numpy(), np_out0)
|
|
np.testing.assert_allclose(out1_c.numpy(), np_out1)
|
|
np.testing.assert_allclose(out2_c.numpy(), np_out2)
|
|
|
|
def call_split3(self):
|
|
x_np = np.random.random(size=[9, 3, 5]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out0, out1, out2 = paddle.split(x, num_or_sections=3, axis=0)
|
|
np_out0, np_out1, np_out2 = np.split(x_np, 3, 0)
|
|
|
|
np.testing.assert_allclose(out0.numpy(), np_out0)
|
|
np.testing.assert_allclose(out1.numpy(), np_out1)
|
|
np.testing.assert_allclose(out2.numpy(), np_out2)
|
|
|
|
self.assertTrue(out0.is_contiguous())
|
|
self.assertTrue(out1.is_contiguous())
|
|
self.assertTrue(out2.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out0))
|
|
self.assertTrue(x._is_shared_buffer_with(out1))
|
|
self.assertTrue(x._is_shared_buffer_with(out2))
|
|
|
|
out0_c = out0.contiguous()
|
|
out1_c = out1.contiguous()
|
|
out2_c = out2.contiguous()
|
|
|
|
np.testing.assert_allclose(out0_c.numpy(), np_out0)
|
|
np.testing.assert_allclose(out1_c.numpy(), np_out1)
|
|
np.testing.assert_allclose(out2_c.numpy(), np_out2)
|
|
|
|
self.assertTrue(out0_c._is_shared_buffer_with(out0))
|
|
self.assertTrue(out1_c._is_shared_buffer_with(out1))
|
|
self.assertTrue(out2_c._is_shared_buffer_with(out2))
|
|
|
|
def call_split4(self):
|
|
x_np = np.random.random(size=[9, 3, 5]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out0, out1, out2 = paddle.split(x, num_or_sections=[2, 3, 4], axis=0)
|
|
out = np.split(x_np, [2, 5], 0)
|
|
np_out0 = out[0]
|
|
np_out1 = out[1]
|
|
np_out2 = out[2]
|
|
|
|
np.testing.assert_allclose(out0.numpy(), np_out0)
|
|
np.testing.assert_allclose(out1.numpy(), np_out1)
|
|
np.testing.assert_allclose(out2.numpy(), np_out2)
|
|
|
|
self.assertTrue(out0.is_contiguous())
|
|
self.assertTrue(out1.is_contiguous())
|
|
self.assertTrue(out2.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out0))
|
|
self.assertTrue(x._is_shared_buffer_with(out1))
|
|
self.assertTrue(x._is_shared_buffer_with(out2))
|
|
|
|
out0_c = out0.contiguous()
|
|
out1_c = out1.contiguous()
|
|
out2_c = out2.contiguous()
|
|
|
|
np.testing.assert_allclose(out0_c.numpy(), np_out0)
|
|
np.testing.assert_allclose(out1_c.numpy(), np_out1)
|
|
np.testing.assert_allclose(out2_c.numpy(), np_out2)
|
|
|
|
self.assertTrue(out0_c._is_shared_buffer_with(out0))
|
|
self.assertTrue(out1_c._is_shared_buffer_with(out1))
|
|
self.assertTrue(out2_c._is_shared_buffer_with(out2))
|
|
|
|
def call_chunk(self):
|
|
x_np = np.random.random(size=[3, 9, 5]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out0, out1, out2 = paddle.chunk(x, chunks=3, axis=1)
|
|
np_out0, np_out1, np_out2 = np.split(x_np, 3, 1)
|
|
|
|
np.testing.assert_allclose(out0.numpy(), np_out0)
|
|
np.testing.assert_allclose(out1.numpy(), np_out1)
|
|
np.testing.assert_allclose(out2.numpy(), np_out2)
|
|
|
|
self.assertFalse(out0.is_contiguous())
|
|
self.assertFalse(out1.is_contiguous())
|
|
self.assertFalse(out2.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out0))
|
|
self.assertTrue(x._is_shared_buffer_with(out1))
|
|
self.assertTrue(x._is_shared_buffer_with(out2))
|
|
|
|
out0_c = out0.contiguous()
|
|
out1_c = out1.contiguous()
|
|
out2_c = out2.contiguous()
|
|
|
|
np.testing.assert_allclose(out0_c.numpy(), np_out0)
|
|
np.testing.assert_allclose(out1_c.numpy(), np_out1)
|
|
np.testing.assert_allclose(out2_c.numpy(), np_out2)
|
|
|
|
def call_unbind(self):
|
|
x_np = np.random.random(size=[3, 9, 5]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out0, out1, out2 = paddle.unbind(x, axis=0)
|
|
np_out0 = x_np[0, 0:100, 0:100]
|
|
np_out1 = x_np[1, 0:100, 0:100]
|
|
np_out2 = x_np[2, 0:100, 0:100]
|
|
|
|
np.testing.assert_allclose(out0.numpy(), np_out0)
|
|
np.testing.assert_allclose(out1.numpy(), np_out1)
|
|
np.testing.assert_allclose(out2.numpy(), np_out2)
|
|
|
|
self.assertTrue(out0.is_contiguous())
|
|
self.assertTrue(out1.is_contiguous())
|
|
self.assertTrue(out2.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out0))
|
|
self.assertTrue(x._is_shared_buffer_with(out1))
|
|
self.assertTrue(x._is_shared_buffer_with(out2))
|
|
|
|
out0_c = out0.contiguous()
|
|
out1_c = out1.contiguous()
|
|
out2_c = out2.contiguous()
|
|
|
|
np.testing.assert_allclose(out0_c.numpy(), np_out0)
|
|
np.testing.assert_allclose(out1_c.numpy(), np_out1)
|
|
np.testing.assert_allclose(out2_c.numpy(), np_out2)
|
|
|
|
self.assertTrue(out0_c._is_shared_buffer_with(out0))
|
|
self.assertTrue(out1_c._is_shared_buffer_with(out1))
|
|
self.assertTrue(out2_c._is_shared_buffer_with(out2))
|
|
|
|
def call_as_strided(self):
|
|
x_np = np.random.random(size=[2, 4, 6]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.as_strided(x, [8, 6], [6, 1])
|
|
np_out = x_np.reshape(8, 6)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_view(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.view(x, [10, 100, 20])
|
|
np_out = x_np.reshape(10, 100, 20)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_view2(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.view(x, "uint8")
|
|
np_out = x_np.view(np.uint8)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_view3(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
# shape inference
|
|
out = paddle.view(x, [10, 100, -1])
|
|
np_out = x_np.reshape(10, 100, 20)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_view4(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.view(x, paddle.uint8)
|
|
np_out = x_np.view(np.uint8)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
# dim4 -> dim2
|
|
def call_view5(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
# shape inference
|
|
out = paddle.view(x, [1000, -1])
|
|
np_out = x_np.reshape(1000, 20)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
# dim4 -> dim1
|
|
def call_view6(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
# shape inference
|
|
out = paddle.view(x, [-1])
|
|
np_out = x_np.reshape(20000)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
# dim4 -> dim5
|
|
def call_view7(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
# shape inference
|
|
out = paddle.view(x, [10, 10, 10, 10, -1])
|
|
np_out = x_np.reshape(10, 10, 10, 10, 2)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
# test invoke of view_reshape_grad for high order derivative
|
|
def call_view8(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
x.stop_gradient = False
|
|
y = x.view([10, -1]).tanh()
|
|
dx = paddle.grad(y, x, create_graph=True)[0]
|
|
np.testing.assert_allclose(
|
|
dx.numpy(), (1 - y**2).reshape(x.shape).numpy(), 1e-6, 1e-6
|
|
)
|
|
dxx = paddle.grad(dx, x, create_graph=True)[0]
|
|
np.testing.assert_allclose(
|
|
dxx.numpy(),
|
|
(-2 * y * (1 - y**2)).reshape(x.shape).numpy(),
|
|
1e-6,
|
|
1e-6,
|
|
)
|
|
dxxx = paddle.grad(dxx, x, create_graph=True)[0]
|
|
np.testing.assert_allclose(
|
|
dxxx.numpy(),
|
|
(-2 * (1 - y**2) ** 2 + -2 * y * (-2 * y) * (1 - y**2))
|
|
.reshape(x.shape)
|
|
.numpy(),
|
|
1e-6,
|
|
1e-6,
|
|
)
|
|
|
|
def call_view_as(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
np_out = x_np.reshape(10, 100, 20)
|
|
tmp = paddle.to_tensor(np_out)
|
|
out = paddle.view_as(x, tmp)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_unfold(self):
|
|
x_np = np.random.random(size=[9]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.unfold(x, 0, 2, 4)
|
|
np_out = np.stack((x_np[0:2], x_np[4:6]))
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertFalse(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
def call_view9(self):
|
|
x_np = np.random.random(size=[16, 12, 8]).astype('float16')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.view(x, paddle.float32)
|
|
np_out = x_np.view(np.float32)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_view10(self):
|
|
x_np = np.random.random(size=[16, 12, 8]).astype('float16')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.view(x, paddle.float64)
|
|
np_out = x_np.view(np.float64)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_view11(self):
|
|
x_np = np.random.randint(0, 256, size=[16, 12, 8]).astype('uint8')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.view(x, paddle.int16)
|
|
np_out = x_np.view(np.int16)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_view12(self):
|
|
x_np = np.random.randint(0, 256, size=[16, 12, 8]).astype('uint8')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.view(x, paddle.int32)
|
|
np_out = x_np.view(np.int32)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_view13(self):
|
|
x_np = np.random.randint(0, 256, size=[16, 12, 8]).astype('uint8')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.view(x, paddle.int64)
|
|
np_out = x_np.view(np.int64)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_view14(self):
|
|
x_np = np.random.randint(0, 256, size=[16, 12, 8]).astype('uint8')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.view(x, paddle.float16)
|
|
np_out = x_np.view(np.float16)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_view15(self):
|
|
x_np = np.random.randint(0, 256, size=[16, 12, 8]).astype('uint8')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.view(x, paddle.float32)
|
|
np_out = x_np.view(np.float32)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_view16(self):
|
|
x_np = np.random.randint(0, 256, size=[16, 12, 8]).astype('uint8')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.view(x, paddle.float64)
|
|
np_out = x_np.view(np.float64)
|
|
|
|
np.testing.assert_allclose(out.numpy(), np_out)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
out_c = out.contiguous()
|
|
|
|
np.testing.assert_allclose(out_c.numpy(), np_out)
|
|
|
|
self.assertTrue(out_c._is_shared_buffer_with(out))
|
|
|
|
def call_view_equal(self):
|
|
x_np = np.random.random(size=[16, 12, 8]).astype('float16')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
out = paddle.view(x, paddle.float16)
|
|
|
|
np.testing.assert_allclose(out.numpy(), x_np)
|
|
|
|
self.assertTrue(out.is_contiguous())
|
|
|
|
self.assertTrue(x._is_shared_buffer_with(out))
|
|
|
|
def call_view_alias1(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
np_out = x_np.reshape(10, 100, 20)
|
|
|
|
out1 = x.view([10, 100, 20])
|
|
np.testing.assert_allclose(out1.numpy(), np_out)
|
|
self.assertTrue(out1.is_contiguous())
|
|
self.assertTrue(x._is_shared_buffer_with(out1))
|
|
out_c1 = out1.contiguous()
|
|
np.testing.assert_allclose(out_c1.numpy(), np_out)
|
|
self.assertTrue(out_c1._is_shared_buffer_with(out1))
|
|
|
|
out2 = x.view(10, 100, 20)
|
|
np.testing.assert_allclose(out2.numpy(), np_out)
|
|
self.assertTrue(out2.is_contiguous())
|
|
self.assertTrue(x._is_shared_buffer_with(out2))
|
|
out_c2 = out2.contiguous()
|
|
np.testing.assert_allclose(out_c2.numpy(), np_out)
|
|
self.assertTrue(out_c2._is_shared_buffer_with(out2))
|
|
|
|
out3 = x.view(size=[10, 100, 20])
|
|
np.testing.assert_allclose(out3.numpy(), np_out)
|
|
self.assertTrue(out3.is_contiguous())
|
|
self.assertTrue(x._is_shared_buffer_with(out3))
|
|
out_c1 = out3.contiguous()
|
|
np.testing.assert_allclose(out_c1.numpy(), np_out)
|
|
self.assertTrue(out_c1._is_shared_buffer_with(out3))
|
|
|
|
def call_view_alias2(self):
|
|
x_np = np.random.random(size=[10, 10, 10, 20]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
np.testing.assert_allclose(x.numpy(), x_np)
|
|
|
|
np_out = x_np.view(np.uint8)
|
|
|
|
out1 = paddle.view(x, dtype="uint8")
|
|
np.testing.assert_allclose(out1.numpy(), np_out)
|
|
self.assertTrue(out1.is_contiguous())
|
|
self.assertTrue(x._is_shared_buffer_with(out1))
|
|
out_c1 = out1.contiguous()
|
|
np.testing.assert_allclose(out_c1.numpy(), np_out)
|
|
self.assertTrue(out_c1._is_shared_buffer_with(out1))
|
|
|
|
out2 = x.view(dtype="uint8")
|
|
np.testing.assert_allclose(out2.numpy(), np_out)
|
|
self.assertTrue(out2.is_contiguous())
|
|
self.assertTrue(x._is_shared_buffer_with(out2))
|
|
out_c1 = out2.contiguous()
|
|
np.testing.assert_allclose(out_c1.numpy(), np_out)
|
|
self.assertTrue(out_c1._is_shared_buffer_with(out2))
|
|
|
|
def call_stride(self):
|
|
self.call_transpose()
|
|
self.call_diagonal()
|
|
self.call_slice()
|
|
self.call_strided_slice()
|
|
self.call_index_select()
|
|
self.call_reshape()
|
|
self.call_real()
|
|
self.call_imag()
|
|
self.call_as_real()
|
|
self.call_as_complex()
|
|
self.call_flatten()
|
|
self.call_squeeze()
|
|
self.call_unsqueeze()
|
|
# self.call_split()
|
|
# self.call_split2()
|
|
# self.call_split3()
|
|
# self.call_split4()
|
|
# self.call_chunk()
|
|
self.call_unbind()
|
|
self.call_as_strided()
|
|
self.call_view()
|
|
self.call_view2()
|
|
self.call_view3()
|
|
self.call_view4()
|
|
self.call_view5()
|
|
self.call_view6()
|
|
self.call_view7()
|
|
self.call_view8()
|
|
self.call_view9()
|
|
self.call_view10()
|
|
self.call_view11()
|
|
self.call_view12()
|
|
self.call_view13()
|
|
self.call_view14()
|
|
self.call_view15()
|
|
self.call_view16()
|
|
self.call_view_equal()
|
|
self.call_view_alias1()
|
|
self.call_view_alias2()
|
|
self.call_view_as()
|
|
self.call_unfold()
|
|
|
|
|
|
class TestStrideCPU(TestStride):
|
|
def test_stride_cpu(self):
|
|
paddle.set_device('cpu')
|
|
self.call_stride()
|
|
|
|
|
|
@unittest.skipIf(
|
|
not (paddle.base.core.is_compiled_with_cuda() or is_custom_device()),
|
|
"core is not compiled with CUDA",
|
|
)
|
|
class TestStrideGPU(TestStride):
|
|
def test_stride_gpu(self):
|
|
paddle.set_device(get_device())
|
|
self.call_stride()
|
|
|
|
|
|
class TestToStaticCheck(unittest.TestCase):
|
|
def test_error(self):
|
|
@paddle.jit.to_static(full_graph=True)
|
|
def func1():
|
|
x_np = np.random.random(size=[2, 3, 4]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
y = paddle.transpose(x, perm=[1, 0, 2])
|
|
z = paddle.ones([3, 2, 4])
|
|
y.add_(z)
|
|
|
|
self.assertRaises(ValueError, func1)
|
|
|
|
@paddle.jit.to_static(full_graph=True)
|
|
def func2():
|
|
x_np = np.random.random(size=[2, 3, 4]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
y = paddle.transpose(x, perm=[1, 0, 2])
|
|
z = paddle.ones([2, 3, 4])
|
|
x.add_(z)
|
|
|
|
self.assertRaises(ValueError, func2)
|
|
|
|
def test_error_with_program(self):
|
|
with DygraphPirGuard():
|
|
|
|
@paddle.jit.to_static(full_graph=True)
|
|
def func1():
|
|
x = paddle.ones((4, 3)) * 2
|
|
y = paddle.transpose(x, [1, 0])
|
|
z = paddle.ones((3,))
|
|
paddle.tensor.manipulation.fill_diagonal_tensor_(y, z)
|
|
|
|
self.assertRaises(ValueError, func1)
|
|
|
|
@paddle.jit.to_static(full_graph=True)
|
|
def func2():
|
|
x = paddle.ones((4, 3)) * 2
|
|
y = paddle.transpose(x, [1, 0])
|
|
z = paddle.ones((3,))
|
|
paddle.tensor.manipulation.fill_diagonal_tensor_(x, z)
|
|
|
|
self.assertRaises(ValueError, func2)
|
|
|
|
def test_no_error_with_program(self):
|
|
with DygraphPirGuard():
|
|
|
|
@paddle.jit.to_static(full_graph=True)
|
|
def func1():
|
|
x = paddle.ones((4, 3)) * 2
|
|
y = paddle.transpose(x, [1, 0])
|
|
yy = paddle.assign(y)
|
|
z = paddle.ones((3,))
|
|
paddle.tensor.manipulation.fill_diagonal_tensor_(yy, z)
|
|
|
|
func1()
|
|
|
|
@paddle.jit.to_static(full_graph=True)
|
|
def func2():
|
|
x = paddle.ones((4, 3)) * 2
|
|
y = paddle.transpose(x, [1, 0])
|
|
xx = paddle.assign(x)
|
|
z = paddle.ones((3,))
|
|
paddle.tensor.manipulation.fill_diagonal_tensor_(xx, z)
|
|
|
|
func2()
|
|
|
|
def test_no_error(self):
|
|
@paddle.jit.to_static(full_graph=True)
|
|
def func1():
|
|
x_np = np.random.random(size=[2, 3, 4]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
z = paddle.ones([3, 2, 4])
|
|
y = paddle.transpose(x, perm=[1, 0, 2])
|
|
yy = paddle.assign(y)
|
|
yy.add_(z)
|
|
|
|
func1()
|
|
|
|
@paddle.jit.to_static(full_graph=True)
|
|
def func2():
|
|
x_np = np.random.random(size=[2, 3, 4]).astype('float32')
|
|
x = paddle.to_tensor(x_np)
|
|
y = paddle.transpose(x, perm=[1, 0, 2])
|
|
xx = paddle.assign(x)
|
|
z = paddle.ones([2, 3, 4])
|
|
xx.add_(z)
|
|
|
|
func2()
|
|
|
|
|
|
class TestViewGrad(unittest.TestCase):
|
|
def test_dygraph(self):
|
|
paddle.disable_static()
|
|
x = paddle.randn(2, 12, requires_grad=True)
|
|
|
|
y = x.view(2, 3, 4)
|
|
z = y.transpose(1, 2)
|
|
|
|
loss = z.sum()
|
|
loss.backward()
|
|
|
|
x_grad_expected = paddle.full_like(x, 1.0)
|
|
self.assertEqual((x.grad == x_grad_expected).all(), True)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|