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

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()