test_var_base.py 70.0 KB
Newer Older
L
Leo Chen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#   Copyright (c) 2018 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
16
import numpy as np
17
import copy
18

19
import paddle
L
Leo Chen 已提交
20 21
import paddle.fluid as fluid
import paddle.fluid.core as core
J
Jiabin Yang 已提交
22
from paddle.fluid.framework import _test_eager_guard, _in_legacy_dygraph
L
Leo Chen 已提交
23 24 25 26 27 28 29 30


class TestVarBase(unittest.TestCase):
    def setUp(self):
        self.shape = [512, 1234]
        self.dtype = np.float32
        self.array = np.random.uniform(0.1, 1, self.shape).astype(self.dtype)

31
    def func_test_to_tensor(self):
32
        def check_with_place(place):
33
            with fluid.dygraph.guard():
34
                paddle.set_default_dtype('float32')
35
                # set_default_dtype should not take effect on int
36
                x = paddle.to_tensor(1, place=place, stop_gradient=False)
37
                np.testing.assert_array_equal(x.numpy(), [1])
38 39
                self.assertNotEqual(x.dtype, core.VarDesc.VarType.FP32)

40 41 42
                y = paddle.to_tensor(2, place=x.place)
                self.assertEqual(str(x.place), str(y.place))

43
                # set_default_dtype should not take effect on numpy
44 45 46 47 48 49 50 51
                x = paddle.to_tensor(
                    np.array([1.2]).astype('float16'),
                    place=place,
                    stop_gradient=False,
                )
                np.testing.assert_array_equal(
                    x.numpy(), np.array([1.2], 'float16')
                )
52 53
                self.assertEqual(x.dtype, core.VarDesc.VarType.FP16)

54 55 56 57
                # set_default_dtype take effect on int
                x = paddle.to_tensor(1, place=place)
                self.assertTrue(x.dtype, core.VarDesc.VarType.INT64)

58
                # set_default_dtype take effect on float
59
                x = paddle.to_tensor(1.2, place=place, stop_gradient=False)
60 61 62
                np.testing.assert_array_equal(
                    x.numpy(), np.array([1.2]).astype('float32')
                )
63
                self.assertEqual(x.dtype, core.VarDesc.VarType.FP32)
Z
Zhou Wei 已提交
64
                clone_x = x.clone()
65 66 67
                np.testing.assert_array_equal(
                    clone_x.numpy(), np.array([1.2]).astype('float32')
                )
Z
Zhou Wei 已提交
68 69 70
                self.assertEqual(clone_x.dtype, core.VarDesc.VarType.FP32)
                y = clone_x**2
                y.backward()
71 72 73
                np.testing.assert_array_equal(
                    x.grad.numpy(), np.array([2.4]).astype('float32')
                )
74
                y = x.cpu()
75
                self.assertEqual(y.place.__repr__(), "Place(cpu)")
76 77
                if core.is_compiled_with_cuda():
                    y = x.pin_memory()
78
                    self.assertEqual(y.place.__repr__(), "Place(gpu_pinned)")
79
                    y = x.cuda()
80
                    self.assertEqual(y.place.__repr__(), "Place(gpu:0)")
81
                    y = x.cuda(None)
82
                    self.assertEqual(y.place.__repr__(), "Place(gpu:0)")
83
                    y = x.cuda(device_id=0)
84
                    self.assertEqual(y.place.__repr__(), "Place(gpu:0)")
85
                    y = x.cuda(blocking=False)
86
                    self.assertEqual(y.place.__repr__(), "Place(gpu:0)")
87
                    y = x.cuda(blocking=True)
88
                    self.assertEqual(y.place.__repr__(), "Place(gpu:0)")
89 90
                    with self.assertRaises(ValueError):
                        y = x.cuda("test")
91

92 93 94 95 96
                # support 'dtype' is core.VarType
                x = paddle.rand((2, 2))
                y = paddle.to_tensor([2, 2], dtype=x.dtype)
                self.assertEqual(y.dtype, core.VarDesc.VarType.FP32)

97
                # set_default_dtype take effect on complex
98
                x = paddle.to_tensor(1 + 2j, place=place, stop_gradient=False)
99
                np.testing.assert_array_equal(x.numpy(), [1 + 2j])
C
chentianyu03 已提交
100
                self.assertEqual(x.dtype, core.VarDesc.VarType.COMPLEX64)
101 102 103

                paddle.set_default_dtype('float64')
                x = paddle.to_tensor(1.2, place=place, stop_gradient=False)
104
                np.testing.assert_array_equal(x.numpy(), [1.2])
105 106 107
                self.assertEqual(x.dtype, core.VarDesc.VarType.FP64)

                x = paddle.to_tensor(1 + 2j, place=place, stop_gradient=False)
108
                np.testing.assert_array_equal(x.numpy(), [1 + 2j])
C
chentianyu03 已提交
109
                self.assertEqual(x.dtype, core.VarDesc.VarType.COMPLEX128)
110

111 112 113
                x = paddle.to_tensor(
                    1, dtype='float32', place=place, stop_gradient=False
                )
114
                np.testing.assert_array_equal(x.numpy(), [1.0])
115 116 117 118 119
                self.assertEqual(x.dtype, core.VarDesc.VarType.FP32)
                self.assertEqual(x.shape, [1])
                self.assertEqual(x.stop_gradient, False)
                self.assertEqual(x.type, core.VarDesc.VarType.LOD_TENSOR)

120 121 122 123 124 125
                x = paddle.to_tensor(
                    (1, 2), dtype='float32', place=place, stop_gradient=False
                )
                x = paddle.to_tensor(
                    [1, 2], dtype='float32', place=place, stop_gradient=False
                )
126
                np.testing.assert_array_equal(x.numpy(), [1.0, 2.0])
127
                self.assertEqual(x.dtype, core.VarDesc.VarType.FP32)
128
                self.assertIsNone(x.grad)
129 130 131 132
                self.assertEqual(x.shape, [2])
                self.assertEqual(x.stop_gradient, False)
                self.assertEqual(x.type, core.VarDesc.VarType.LOD_TENSOR)

133 134 135 136 137 138
                x = paddle.to_tensor(
                    self.array,
                    dtype='float32',
                    place=place,
                    stop_gradient=False,
                )
139
                np.testing.assert_array_equal(x.numpy(), self.array)
140 141 142 143 144 145 146
                self.assertEqual(x.dtype, core.VarDesc.VarType.FP32)
                self.assertEqual(x.shape, self.shape)
                self.assertEqual(x.stop_gradient, False)
                self.assertEqual(x.type, core.VarDesc.VarType.LOD_TENSOR)

                y = paddle.to_tensor(x)
                y = paddle.to_tensor(y, dtype='float64', place=place)
147
                np.testing.assert_array_equal(y.numpy(), self.array)
148 149 150 151 152
                self.assertEqual(y.dtype, core.VarDesc.VarType.FP64)
                self.assertEqual(y.shape, self.shape)
                self.assertEqual(y.stop_gradient, True)
                self.assertEqual(y.type, core.VarDesc.VarType.LOD_TENSOR)
                z = x + y
153
                np.testing.assert_array_equal(z.numpy(), 2 * self.array)
154

155 156 157
                x = paddle.to_tensor(
                    [1 + 2j, 1 - 2j], dtype='complex64', place=place
                )
158
                y = paddle.to_tensor(x)
159
                np.testing.assert_array_equal(x.numpy(), [1 + 2j, 1 - 2j])
C
chentianyu03 已提交
160
                self.assertEqual(y.dtype, core.VarDesc.VarType.COMPLEX64)
161 162
                self.assertEqual(y.shape, [2])

163 164 165 166 167
                paddle.set_default_dtype('float32')
                x = paddle.randn([3, 4])
                x_array = np.array(x)
                self.assertEqual(x_array.shape, x.numpy().shape)
                self.assertEqual(x_array.dtype, x.numpy().dtype)
168
                np.testing.assert_array_equal(x_array, x.numpy())
169 170 171 172 173 174 175 176 177

                x = paddle.to_tensor(1.0)
                self.assertEqual(x.item(), 1.0)
                self.assertTrue(isinstance(x.item(), float))

                x = paddle.randn([3, 2, 2])
                self.assertTrue(isinstance(x.item(5), float))
                self.assertTrue(isinstance(x.item(1, 0, 1), float))
                self.assertEqual(x.item(5), x.item(1, 0, 1))
178 179 180
                np.testing.assert_array_equal(
                    x.item(1, 0, 1), x.numpy().item(1, 0, 1)
                )
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212

                x = paddle.to_tensor([[1.111111, 2.222222, 3.333333]])
                self.assertEqual(x.item(0, 2), x.item(2))
                self.assertAlmostEqual(x.item(2), 3.333333)
                self.assertTrue(isinstance(x.item(0, 2), float))

                x = paddle.to_tensor(1.0, dtype='float64')
                self.assertEqual(x.item(), 1.0)
                self.assertTrue(isinstance(x.item(), float))

                x = paddle.to_tensor(1.0, dtype='float16')
                self.assertEqual(x.item(), 1.0)
                self.assertTrue(isinstance(x.item(), float))

                x = paddle.to_tensor(1, dtype='uint8')
                self.assertEqual(x.item(), 1)
                self.assertTrue(isinstance(x.item(), int))

                x = paddle.to_tensor(1, dtype='int8')
                self.assertEqual(x.item(), 1)
                self.assertTrue(isinstance(x.item(), int))

                x = paddle.to_tensor(1, dtype='int16')
                self.assertEqual(x.item(), 1)
                self.assertTrue(isinstance(x.item(), int))

                x = paddle.to_tensor(1, dtype='int32')
                self.assertEqual(x.item(), 1)
                self.assertTrue(isinstance(x.item(), int))

                x = paddle.to_tensor(1, dtype='int64')
                self.assertEqual(x.item(), 1)
T
tianshuo78520a 已提交
213
                self.assertTrue(isinstance(x.item(), int))
214 215 216 217 218 219 220 221 222

                x = paddle.to_tensor(True)
                self.assertEqual(x.item(), True)
                self.assertTrue(isinstance(x.item(), bool))

                x = paddle.to_tensor(1 + 1j)
                self.assertEqual(x.item(), 1 + 1j)
                self.assertTrue(isinstance(x.item(), complex))

223 224 225 226 227
                # empty tensor
                x = paddle.to_tensor([])
                self.assertEqual(x.shape, [0])
                expected_result = np.array([], dtype='float32')
                self.assertEqual(x.numpy().shape, expected_result.shape)
228
                np.testing.assert_array_equal(x.numpy(), expected_result)
229

230 231 232 233 234 235
                numpy_array = np.random.randn(3, 4)
                # covert core.LoDTensor to paddle.Tensor
                lod_tensor = paddle.fluid.core.LoDTensor()
                place = paddle.fluid.framework._current_expected_place()
                lod_tensor.set(numpy_array, place)
                x = paddle.to_tensor(lod_tensor)
236
                np.testing.assert_array_equal(x.numpy(), numpy_array)
237 238 239 240 241 242 243 244
                self.assertEqual(x.type, core.VarDesc.VarType.LOD_TENSOR)
                self.assertEqual(str(x.place), str(place))

                # covert core.Tensor to paddle.Tensor
                x = paddle.to_tensor(numpy_array)
                dlpack = x.value().get_tensor()._to_dlpack()
                tensor_from_dlpack = paddle.fluid.core.from_dlpack(dlpack)
                x = paddle.to_tensor(tensor_from_dlpack)
245
                np.testing.assert_array_equal(x.numpy(), numpy_array)
246 247
                self.assertEqual(x.type, core.VarDesc.VarType.LOD_TENSOR)

248 249 250 251 252 253 254 255
                with self.assertRaises(ValueError):
                    paddle.randn([3, 2, 2]).item()
                with self.assertRaises(ValueError):
                    paddle.randn([3, 2, 2]).item(18)
                with self.assertRaises(ValueError):
                    paddle.randn([3, 2, 2]).item(1, 2)
                with self.assertRaises(ValueError):
                    paddle.randn([3, 2, 2]).item(2, 1, 2)
256 257 258 259 260 261 262 263 264 265 266
                with self.assertRaises(TypeError):
                    paddle.to_tensor('test')
                with self.assertRaises(TypeError):
                    paddle.to_tensor(1, dtype='test')
                with self.assertRaises(ValueError):
                    paddle.to_tensor([[1], [2, 3]])
                with self.assertRaises(ValueError):
                    paddle.to_tensor([[1], [2, 3]], place='test')
                with self.assertRaises(ValueError):
                    paddle.to_tensor([[1], [2, 3]], place=1)

267 268
        check_with_place(core.CPUPlace())
        check_with_place("cpu")
269
        if core.is_compiled_with_cuda():
270 271 272 273
            check_with_place(core.CUDAPinnedPlace())
            check_with_place("gpu_pinned")
            check_with_place(core.CUDAPlace(0))
            check_with_place("gpu:0")
274
        if core.is_compiled_with_npu():
275 276
            check_with_place(core.NPUPlace(0))
            check_with_place("npu:0")
277

278 279 280 281 282 283
    def test_to_tensor(self):
        with _test_eager_guard():
            self.func_test_to_tensor()
        self.func_test_to_tensor()

    def func_test_to_tensor_not_change_input_stop_gradient(self):
284 285 286 287 288 289 290
        with paddle.fluid.dygraph.guard(core.CPUPlace()):
            a = paddle.zeros([1024])
            a.stop_gradient = False
            b = paddle.to_tensor(a)
            self.assertEqual(a.stop_gradient, False)
            self.assertEqual(b.stop_gradient, True)

291 292 293 294 295 296
    def test_to_tensor_not_change_input_stop_gradient(self):
        with _test_eager_guard():
            self.func_test_to_tensor_not_change_input_stop_gradient()
        self.func_test_to_tensor_not_change_input_stop_gradient()

    def func_test_to_tensor_change_place(self):
297 298 299 300 301
        if core.is_compiled_with_cuda():
            a_np = np.random.rand(1024, 1024)
            with paddle.fluid.dygraph.guard(core.CPUPlace()):
                a = paddle.to_tensor(a_np, place=paddle.CUDAPinnedPlace())
                a = paddle.to_tensor(a)
302
                self.assertEqual(a.place.__repr__(), "Place(cpu)")
303 304 305 306

            with paddle.fluid.dygraph.guard(core.CUDAPlace(0)):
                a = paddle.to_tensor(a_np, place=paddle.CUDAPinnedPlace())
                a = paddle.to_tensor(a)
307
                self.assertEqual(a.place.__repr__(), "Place(gpu:0)")
308 309 310 311

            with paddle.fluid.dygraph.guard(core.CUDAPlace(0)):
                a = paddle.to_tensor(a_np, place=paddle.CPUPlace())
                a = paddle.to_tensor(a, place=paddle.CUDAPinnedPlace())
312
                self.assertEqual(a.place.__repr__(), "Place(gpu_pinned)")
313

314 315 316 317 318 319
    def test_to_tensor_change_place(self):
        with _test_eager_guard():
            self.func_test_to_tensor_change_place()
        self.func_test_to_tensor_change_place()

    def func_test_to_tensor_with_lodtensor(self):
320 321 322 323 324 325
        if core.is_compiled_with_cuda():
            a_np = np.random.rand(1024, 1024)
            with paddle.fluid.dygraph.guard(core.CPUPlace()):
                lod_tensor = core.LoDTensor()
                lod_tensor.set(a_np, core.CPUPlace())
                a = paddle.to_tensor(lod_tensor)
326
                np.testing.assert_array_equal(a_np, a.numpy())
327 328 329 330

            with paddle.fluid.dygraph.guard(core.CUDAPlace(0)):
                lod_tensor = core.LoDTensor()
                lod_tensor.set(a_np, core.CUDAPlace(0))
331
                a = paddle.to_tensor(lod_tensor, place=core.CPUPlace())
332
                np.testing.assert_array_equal(a_np, a.numpy())
333
                self.assertTrue(a.place.__repr__(), "Place(cpu)")
334

335 336 337 338 339 340
    def test_to_tensor_with_lodtensor(self):
        with _test_eager_guard():
            self.func_test_to_tensor_with_lodtensor()
        self.func_test_to_tensor_with_lodtensor()

    def func_test_to_variable(self):
L
Leo Chen 已提交
341 342
        with fluid.dygraph.guard():
            var = fluid.dygraph.to_variable(self.array, name="abc")
343
            np.testing.assert_array_equal(var.numpy(), self.array)
L
Leo Chen 已提交
344 345 346 347 348 349 350
            self.assertEqual(var.name, 'abc')
            # default value
            self.assertEqual(var.persistable, False)
            self.assertEqual(var.stop_gradient, True)
            self.assertEqual(var.shape, self.shape)
            self.assertEqual(var.dtype, core.VarDesc.VarType.FP32)
            self.assertEqual(var.type, core.VarDesc.VarType.LOD_TENSOR)
351 352 353 354 355 356 357
            # The type of input must be 'ndarray' or 'Variable', it will raise TypeError
            with self.assertRaises(TypeError):
                var = fluid.dygraph.to_variable("test", name="abc")
            # test to_variable of LayerObjectHelper(LayerHelperBase)
            with self.assertRaises(TypeError):
                linear = fluid.dygraph.Linear(32, 64)
                var = linear._helper.to_variable("test", name="abc")
L
Leo Chen 已提交
358

359 360 361 362 363 364
    def test_to_variable(self):
        with _test_eager_guard():
            self.func_test_to_variable()
        self.func_test_to_variable()

    def func_test_list_to_variable(self):
365 366 367
        with fluid.dygraph.guard():
            array = [[[1, 2], [1, 2], [1.0, 2]], [[1, 2], [1, 2], [1, 2]]]
            var = fluid.dygraph.to_variable(array, dtype='int32')
368
            np.testing.assert_array_equal(var.numpy(), array)
369 370 371 372
            self.assertEqual(var.shape, [2, 3, 2])
            self.assertEqual(var.dtype, core.VarDesc.VarType.INT32)
            self.assertEqual(var.type, core.VarDesc.VarType.LOD_TENSOR)

373 374 375 376 377 378
    def test_list_to_variable(self):
        with _test_eager_guard():
            self.func_test_list_to_variable()
        self.func_test_list_to_variable()

    def func_test_tuple_to_variable(self):
379 380 381
        with fluid.dygraph.guard():
            array = (((1, 2), (1, 2), (1, 2)), ((1, 2), (1, 2), (1, 2)))
            var = fluid.dygraph.to_variable(array, dtype='float32')
382
            np.testing.assert_array_equal(var.numpy(), array)
383 384 385 386
            self.assertEqual(var.shape, [2, 3, 2])
            self.assertEqual(var.dtype, core.VarDesc.VarType.FP32)
            self.assertEqual(var.type, core.VarDesc.VarType.LOD_TENSOR)

387 388 389 390 391 392
    def test_tuple_to_variable(self):
        with _test_eager_guard():
            self.func_test_tuple_to_variable()
        self.func_test_tuple_to_variable()

    def func_test_tensor_to_variable(self):
393 394
        with fluid.dygraph.guard():
            t = fluid.Tensor()
L
Leo Chen 已提交
395
            t.set(np.random.random((1024, 1024)), fluid.CPUPlace())
396
            var = fluid.dygraph.to_variable(t)
397
            np.testing.assert_array_equal(t, var.numpy())
398

399 400 401 402 403 404
    def test_tensor_to_variable(self):
        with _test_eager_guard():
            self.func_test_tensor_to_variable()
        self.func_test_tensor_to_variable()

    def func_test_leaf_tensor(self):
405 406 407 408 409 410
        with fluid.dygraph.guard():
            x = paddle.to_tensor(np.random.uniform(-1, 1, size=[10, 10]))
            self.assertTrue(x.is_leaf)
            y = x + 1
            self.assertTrue(y.is_leaf)

411 412 413
            x = paddle.to_tensor(
                np.random.uniform(-1, 1, size=[10, 10]), stop_gradient=False
            )
414 415 416 417 418
            self.assertTrue(x.is_leaf)
            y = x + 1
            self.assertFalse(y.is_leaf)

            linear = paddle.nn.Linear(10, 10)
419 420 421 422
            input = paddle.to_tensor(
                np.random.uniform(-1, 1, size=[10, 10]).astype('float32'),
                stop_gradient=False,
            )
423 424 425 426 427 428 429
            self.assertTrue(input.is_leaf)

            out = linear(input)
            self.assertTrue(linear.weight.is_leaf)
            self.assertTrue(linear.bias.is_leaf)
            self.assertFalse(out.is_leaf)

430 431 432 433 434 435
    def test_leaf_tensor(self):
        with _test_eager_guard():
            self.func_test_leaf_tensor()
        self.func_test_leaf_tensor()

    def func_test_detach(self):
Z
Zhou Wei 已提交
436 437 438 439 440
        with fluid.dygraph.guard():
            x = paddle.to_tensor(1.0, dtype="float64", stop_gradient=False)
            detach_x = x.detach()
            self.assertTrue(detach_x.stop_gradient, True)

441 442 443
            cmp_float = (
                np.allclose if core.is_compiled_with_rocm() else np.array_equal
            )
Z
Zhou Wei 已提交
444
            detach_x[:] = 10.0
Z
zhulei 已提交
445
            self.assertTrue(cmp_float(x.numpy(), [10.0]))
Z
Zhou Wei 已提交
446 447 448

            y = x**2
            y.backward()
Z
zhulei 已提交
449
            self.assertTrue(cmp_float(x.grad.numpy(), [20.0]))
450
            self.assertIsNone(detach_x.grad)
Z
Zhou Wei 已提交
451

452 453 454
            detach_x.stop_gradient = (
                False  # Set stop_gradient to be False, supported auto-grad
            )
Z
Zhou Wei 已提交
455 456
            z = 3 * detach_x**2
            z.backward()
Z
zhulei 已提交
457 458
            self.assertTrue(cmp_float(x.grad.numpy(), [20.0]))
            self.assertTrue(cmp_float(detach_x.grad.numpy(), [60.0]))
459

460 461 462 463 464
            with self.assertRaises(ValueError):
                detach_x[:] = 5.0

            detach_x.stop_gradient = True

Z
Zhou Wei 已提交
465
            # Due to sharing of data with origin Tensor, There are some unsafe operations:
466 467 468 469
            with self.assertRaises(RuntimeError):
                y = 2**x
                detach_x[:] = 5.0
                y.backward()
Z
Zhou Wei 已提交
470

471 472 473 474 475 476
    def test_detach(self):
        with _test_eager_guard():
            self.func_test_detach()
        self.func_test_detach()

    def func_test_write_property(self):
L
Leo Chen 已提交
477 478 479
        with fluid.dygraph.guard():
            var = fluid.dygraph.to_variable(self.array)

480
            self.assertEqual(var.name, 'generated_tensor_0')
L
Leo Chen 已提交
481 482 483 484 485 486 487 488 489 490 491
            var.name = 'test'
            self.assertEqual(var.name, 'test')

            self.assertEqual(var.persistable, False)
            var.persistable = True
            self.assertEqual(var.persistable, True)

            self.assertEqual(var.stop_gradient, True)
            var.stop_gradient = False
            self.assertEqual(var.stop_gradient, False)

492 493 494 495 496 497
    def test_write_property(self):
        with _test_eager_guard():
            self.func_test_write_property()
        self.func_test_write_property()

    def func_test_deep_copy(self):
498
        with fluid.dygraph.guard():
499 500 501 502
            if _in_legacy_dygraph():
                empty_var = core.VarBase()
            else:
                empty_var = core.eager.Tensor()
503
            empty_var_copy = copy.deepcopy(empty_var)
504 505 506
            self.assertEqual(
                empty_var.stop_gradient, empty_var_copy.stop_gradient
            )
507 508 509 510
            self.assertEqual(empty_var.persistable, empty_var_copy.persistable)
            self.assertEqual(empty_var.type, empty_var_copy.type)
            self.assertEqual(empty_var.dtype, empty_var_copy.dtype)

511 512
            x = paddle.to_tensor([2.0], stop_gradient=False)
            y = paddle.to_tensor([3.0], stop_gradient=False)
513 514 515 516 517 518 519 520 521
            z = x * y
            memo = {}
            x_copy = copy.deepcopy(x, memo)
            y_copy = copy.deepcopy(y, memo)

            self.assertEqual(x_copy.stop_gradient, y_copy.stop_gradient)
            self.assertEqual(x_copy.persistable, y_copy.persistable)
            self.assertEqual(x_copy.type, y_copy.type)
            self.assertEqual(x_copy.dtype, y_copy.dtype)
522 523
            np.testing.assert_array_equal(x.numpy(), x_copy.numpy())
            np.testing.assert_array_equal(y.numpy(), y_copy.numpy())
524 525

            self.assertNotEqual(id(x), id(x_copy))
526
            np.testing.assert_array_equal(x.numpy(), [2.0])
527

528
            with self.assertRaises(ValueError):
529
                x_copy[:] = 5.0
530

531 532 533 534 535 536 537 538 539
            with self.assertRaises(RuntimeError):
                copy.deepcopy(z)

            x_copy2 = copy.deepcopy(x, memo)
            y_copy2 = copy.deepcopy(y, memo)
            self.assertEqual(id(x_copy), id(x_copy2))
            self.assertEqual(id(y_copy), id(y_copy2))

            # test copy selected rows
540
            if _in_legacy_dygraph():
541 542 543 544 545 546 547
                x = core.VarBase(
                    core.VarDesc.VarType.FP32,
                    [3, 100],
                    "selected_rows",
                    core.VarDesc.VarType.SELECTED_ROWS,
                    True,
                )
548
            else:
549 550 551 552 553 554 555
                x = core.eager.Tensor(
                    core.VarDesc.VarType.FP32,
                    [3, 100],
                    "selected_rows",
                    core.VarDesc.VarType.SELECTED_ROWS,
                    True,
                )
556

557
            selected_rows = x.value().get_selected_rows()
558 559 560
            selected_rows.get_tensor().set(
                np.random.rand(3, 100), core.CPUPlace()
            )
561 562 563 564 565 566 567 568 569 570
            selected_rows.set_height(10)
            selected_rows.set_rows([3, 5, 7])
            x_copy = copy.deepcopy(x)

            self.assertEqual(x_copy.stop_gradient, x.stop_gradient)
            self.assertEqual(x_copy.persistable, x.persistable)
            self.assertEqual(x_copy.type, x.type)
            self.assertEqual(x_copy.dtype, x.dtype)

            copy_selected_rows = x_copy.value().get_selected_rows()
571 572 573
            self.assertEqual(
                copy_selected_rows.height(), selected_rows.height()
            )
574
            self.assertEqual(copy_selected_rows.rows(), selected_rows.rows())
575 576
            np.testing.assert_array_equal(
                np.array(copy_selected_rows.get_tensor()),
577 578
                np.array(selected_rows.get_tensor()),
            )
579

580 581 582 583 584
    def test_deep_copy(self):
        with _test_eager_guard():
            self.func_test_deep_copy()
        self.func_test_deep_copy()

L
Leo Chen 已提交
585
    # test some patched methods
586
    def func_test_set_value(self):
L
Leo Chen 已提交
587 588 589 590 591 592 593
        with fluid.dygraph.guard():
            var = fluid.dygraph.to_variable(self.array)
            tmp1 = np.random.uniform(0.1, 1, [2, 2, 3]).astype(self.dtype)
            self.assertRaises(AssertionError, var.set_value, tmp1)

            tmp2 = np.random.uniform(0.1, 1, self.shape).astype(self.dtype)
            var.set_value(tmp2)
594
            np.testing.assert_array_equal(var.numpy(), tmp2)
L
Leo Chen 已提交
595

596 597 598 599 600 601
    def test_set_value(self):
        with _test_eager_guard():
            self.func_test_set_value()
        self.func_test_set_value()

    def func_test_to_string(self):
L
Leo Chen 已提交
602 603
        with fluid.dygraph.guard():
            var = fluid.dygraph.to_variable(self.array)
604
            self.assertTrue(isinstance(str(var), str))
L
Leo Chen 已提交
605

606 607 608 609 610 611
    def test_to_string(self):
        with _test_eager_guard():
            self.func_test_to_string()
        self.func_test_to_string()

    def func_test_element_size(self):
612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
        with fluid.dygraph.guard():
            x = paddle.to_tensor(1, dtype='bool')
            self.assertEqual(x.element_size(), 1)

            x = paddle.to_tensor(1, dtype='float16')
            self.assertEqual(x.element_size(), 2)

            x = paddle.to_tensor(1, dtype='float32')
            self.assertEqual(x.element_size(), 4)

            x = paddle.to_tensor(1, dtype='float64')
            self.assertEqual(x.element_size(), 8)

            x = paddle.to_tensor(1, dtype='int8')
            self.assertEqual(x.element_size(), 1)

            x = paddle.to_tensor(1, dtype='int16')
            self.assertEqual(x.element_size(), 2)

            x = paddle.to_tensor(1, dtype='int32')
            self.assertEqual(x.element_size(), 4)

            x = paddle.to_tensor(1, dtype='int64')
            self.assertEqual(x.element_size(), 8)

            x = paddle.to_tensor(1, dtype='uint8')
            self.assertEqual(x.element_size(), 1)

            x = paddle.to_tensor(1, dtype='complex64')
            self.assertEqual(x.element_size(), 8)

            x = paddle.to_tensor(1, dtype='complex128')
            self.assertEqual(x.element_size(), 16)

646 647 648 649 650 651
    def test_element_size(self):
        with _test_eager_guard():
            self.func_test_element_size()
        self.func_test_element_size()

    def func_test_backward(self):
L
Leo Chen 已提交
652 653 654 655 656 657 658 659
        with fluid.dygraph.guard():
            var = fluid.dygraph.to_variable(self.array)
            var.stop_gradient = False
            loss = fluid.layers.relu(var)
            loss.backward()
            grad_var = var._grad_ivar()
            self.assertEqual(grad_var.shape, self.shape)

660 661 662 663 664 665
    def test_backward(self):
        with _test_eager_guard():
            self.func_test_backward()
        self.func_test_backward()

    def func_test_gradient(self):
L
Leo Chen 已提交
666 667 668 669 670 671 672 673
        with fluid.dygraph.guard():
            var = fluid.dygraph.to_variable(self.array)
            var.stop_gradient = False
            loss = fluid.layers.relu(var)
            loss.backward()
            grad_var = var.gradient()
            self.assertEqual(grad_var.shape, self.array.shape)

674 675 676 677 678 679
    def test_gradient(self):
        with _test_eager_guard():
            self.func_test_gradient()
        self.func_test_gradient()

    def func_test_block(self):
L
Leo Chen 已提交
680 681
        with fluid.dygraph.guard():
            var = fluid.dygraph.to_variable(self.array)
682 683 684
            self.assertEqual(
                var.block, fluid.default_main_program().global_block()
            )
L
Leo Chen 已提交
685

686 687 688 689 690
    def test_block(self):
        with _test_eager_guard():
            self.func_test_block()
        self.func_test_block()

691 692
    def _test_slice(self):
        w = fluid.dygraph.to_variable(
693 694
            np.random.random((784, 100, 100)).astype('float64')
        )
695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716

        for i in range(3):
            nw = w[i]
            self.assertEqual((100, 100), tuple(nw.shape))

        nw = w[:]
        self.assertEqual((784, 100, 100), tuple(nw.shape))

        nw = w[:, :]
        self.assertEqual((784, 100, 100), tuple(nw.shape))

        nw = w[:, :, -1]
        self.assertEqual((784, 100), tuple(nw.shape))

        nw = w[1, 1, 1]

        self.assertEqual(len(nw.shape), 1)
        self.assertEqual(nw.shape[0], 1)

        nw = w[:, :, :-1]
        self.assertEqual((784, 100, 99), tuple(nw.shape))

717 718 719 720 721 722 723
        tensor_array = np.array(
            [
                [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
                [[10, 11, 12], [13, 14, 15], [16, 17, 18]],
                [[19, 20, 21], [22, 23, 24], [25, 26, 27]],
            ]
        ).astype('float32')
724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740
        var = fluid.dygraph.to_variable(tensor_array)
        var1 = var[0, 1, 1]
        var2 = var[1:]
        var3 = var[0:1]
        var4 = var[::-1]
        var5 = var[1, 1:, 1:]
        var_reshape = fluid.layers.reshape(var, [3, -1, 3])
        var6 = var_reshape[:, :, -1]
        var7 = var[:, :, :-1]
        var8 = var[:1, :1, :1]
        var9 = var[:-1, :-1, :-1]
        var10 = var[::-1, :1, :-1]
        var11 = var[:-1, ::-1, -1:]
        var12 = var[1:2, 2:, ::-1]
        var13 = var[2:10, 2:, -2:-1]
        var14 = var[1:-1, 0:2, ::-1]
        var15 = var[::-1, ::-1, ::-1]
741
        var16 = var[-4:4]
742 743
        var17 = var[:, 0, 0:0]
        var18 = var[:, 1:1:2]
744 745

        vars = [
746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764
            var,
            var1,
            var2,
            var3,
            var4,
            var5,
            var6,
            var7,
            var8,
            var9,
            var10,
            var11,
            var12,
            var13,
            var14,
            var15,
            var16,
            var17,
            var18,
765 766 767
        ]
        local_out = [var.numpy() for var in vars]

768 769 770 771 772 773
        np.testing.assert_array_equal(local_out[1], tensor_array[0, 1, 1:2])
        np.testing.assert_array_equal(local_out[2], tensor_array[1:])
        np.testing.assert_array_equal(local_out[3], tensor_array[0:1])
        np.testing.assert_array_equal(local_out[4], tensor_array[::-1])
        np.testing.assert_array_equal(local_out[5], tensor_array[1, 1:, 1:])
        np.testing.assert_array_equal(
774 775
            local_out[6], tensor_array.reshape((3, -1, 3))[:, :, -1]
        )
776 777 778
        np.testing.assert_array_equal(local_out[7], tensor_array[:, :, :-1])
        np.testing.assert_array_equal(local_out[8], tensor_array[:1, :1, :1])
        np.testing.assert_array_equal(local_out[9], tensor_array[:-1, :-1, :-1])
779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796
        np.testing.assert_array_equal(
            local_out[10], tensor_array[::-1, :1, :-1]
        )
        np.testing.assert_array_equal(
            local_out[11], tensor_array[:-1, ::-1, -1:]
        )
        np.testing.assert_array_equal(
            local_out[12], tensor_array[1:2, 2:, ::-1]
        )
        np.testing.assert_array_equal(
            local_out[13], tensor_array[2:10, 2:, -2:-1]
        )
        np.testing.assert_array_equal(
            local_out[14], tensor_array[1:-1, 0:2, ::-1]
        )
        np.testing.assert_array_equal(
            local_out[15], tensor_array[::-1, ::-1, ::-1]
        )
797 798 799
        np.testing.assert_array_equal(local_out[16], tensor_array[-4:4])
        np.testing.assert_array_equal(local_out[17], tensor_array[:, 0, 0:0])
        np.testing.assert_array_equal(local_out[18], tensor_array[:, 1:1:2])
800

801
    def _test_slice_for_tensor_attr(self):
802 803 804 805 806 807 808
        tensor_array = np.array(
            [
                [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
                [[10, 11, 12], [13, 14, 15], [16, 17, 18]],
                [[19, 20, 21], [22, 23, 24], [25, 26, 27]],
            ]
        ).astype('float32')
809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836

        var = paddle.to_tensor(tensor_array)

        one = paddle.ones(shape=[1], dtype="int32")
        two = paddle.full(shape=[1], fill_value=2, dtype="int32")
        negative_one = paddle.full(shape=[1], fill_value=-1, dtype="int32")
        four = paddle.full(shape=[1], fill_value=4, dtype="int32")

        var = fluid.dygraph.to_variable(tensor_array)
        var1 = var[0, one, one]
        var2 = var[one:]
        var3 = var[0:one]
        var4 = var[::negative_one]
        var5 = var[one, one:, one:]
        var_reshape = fluid.layers.reshape(var, [3, negative_one, 3])
        var6 = var_reshape[:, :, negative_one]
        var7 = var[:, :, :negative_one]
        var8 = var[:one, :one, :1]
        var9 = var[:-1, :negative_one, :negative_one]
        var10 = var[::negative_one, :one, :negative_one]
        var11 = var[:negative_one, ::-1, negative_one:]
        var12 = var[one:2, 2:, ::negative_one]
        var13 = var[two:10, 2:, -2:negative_one]
        var14 = var[1:negative_one, 0:2, ::negative_one]
        var15 = var[::negative_one, ::-1, ::negative_one]
        var16 = var[-4:4]

        vars = [
837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853
            var,
            var1,
            var2,
            var3,
            var4,
            var5,
            var6,
            var7,
            var8,
            var9,
            var10,
            var11,
            var12,
            var13,
            var14,
            var15,
            var16,
854 855 856
        ]
        local_out = [var.numpy() for var in vars]

857 858 859 860 861 862
        np.testing.assert_array_equal(local_out[1], tensor_array[0, 1, 1:2])
        np.testing.assert_array_equal(local_out[2], tensor_array[1:])
        np.testing.assert_array_equal(local_out[3], tensor_array[0:1])
        np.testing.assert_array_equal(local_out[4], tensor_array[::-1])
        np.testing.assert_array_equal(local_out[5], tensor_array[1, 1:, 1:])
        np.testing.assert_array_equal(
863 864
            local_out[6], tensor_array.reshape((3, -1, 3))[:, :, -1]
        )
865 866 867
        np.testing.assert_array_equal(local_out[7], tensor_array[:, :, :-1])
        np.testing.assert_array_equal(local_out[8], tensor_array[:1, :1, :1])
        np.testing.assert_array_equal(local_out[9], tensor_array[:-1, :-1, :-1])
868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
        np.testing.assert_array_equal(
            local_out[10], tensor_array[::-1, :1, :-1]
        )
        np.testing.assert_array_equal(
            local_out[11], tensor_array[:-1, ::-1, -1:]
        )
        np.testing.assert_array_equal(
            local_out[12], tensor_array[1:2, 2:, ::-1]
        )
        np.testing.assert_array_equal(
            local_out[13], tensor_array[2:10, 2:, -2:-1]
        )
        np.testing.assert_array_equal(
            local_out[14], tensor_array[1:-1, 0:2, ::-1]
        )
        np.testing.assert_array_equal(
            local_out[15], tensor_array[::-1, ::-1, ::-1]
        )
886
        np.testing.assert_array_equal(local_out[16], tensor_array[-4:4])
887

888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908
    def _test_for_getitem_ellipsis_index(self):
        shape = (64, 3, 5, 256)
        np_fp32_value = np.random.random(shape).astype('float32')
        np_int_value = np.random.randint(1, 100, shape)

        var_fp32 = paddle.to_tensor(np_fp32_value)
        var_int = paddle.to_tensor(np_int_value)

        def assert_getitem_ellipsis_index(var_tensor, var_np):
            var = [
                var_tensor[..., 0].numpy(),
                var_tensor[..., 1, 0].numpy(),
                var_tensor[0, ..., 1, 0].numpy(),
                var_tensor[1, ..., 1].numpy(),
                var_tensor[2, ...].numpy(),
                var_tensor[2, 0, ...].numpy(),
                var_tensor[2, 0, 1, ...].numpy(),
                var_tensor[...].numpy(),
                var_tensor[:, ..., 100].numpy(),
            ]

909 910 911 912 913 914 915 916 917
            np.testing.assert_array_equal(var[0], var_np[..., 0])
            np.testing.assert_array_equal(var[1], var_np[..., 1, 0])
            np.testing.assert_array_equal(var[2], var_np[0, ..., 1, 0])
            np.testing.assert_array_equal(var[3], var_np[1, ..., 1])
            np.testing.assert_array_equal(var[4], var_np[2, ...])
            np.testing.assert_array_equal(var[5], var_np[2, 0, ...])
            np.testing.assert_array_equal(var[6], var_np[2, 0, 1, ...])
            np.testing.assert_array_equal(var[7], var_np[...])
            np.testing.assert_array_equal(var[8], var_np[:, ..., 100])
918 919 920 921 922 923 924

        var_fp32 = paddle.to_tensor(np_fp32_value)
        var_int = paddle.to_tensor(np_int_value)

        assert_getitem_ellipsis_index(var_fp32, np_fp32_value)
        assert_getitem_ellipsis_index(var_int, np_int_value)

925 926
        # test 1 dim tensor
        var_one_dim = paddle.to_tensor([1, 2, 3, 4])
927 928 929
        np.testing.assert_array_equal(
            var_one_dim[..., 0].numpy(), np.array([1])
        )
930

931 932 933 934 935 936 937 938 939 940 941 942 943 944 945
    def _test_none_index(self):
        shape = (8, 64, 5, 256)
        np_value = np.random.random(shape).astype('float32')
        var_tensor = paddle.to_tensor(np_value)

        var = [
            var_tensor[1, 0, None].numpy(),
            var_tensor[None, ..., 1, 0].numpy(),
            var_tensor[:, :, :, None].numpy(),
            var_tensor[1, ..., 1, None].numpy(),
            var_tensor[2, ..., None, None].numpy(),
            var_tensor[None, 2, 0, ...].numpy(),
            var_tensor[None, 2, None, 1].numpy(),
            var_tensor[None].numpy(),
            var_tensor[0, 0, None, 0, 0, None].numpy(),
946
            var_tensor[None, None, 0, ..., None].numpy(),
947
            var_tensor[..., None, :, None].numpy(),
948 949 950
            var_tensor[0, 1:10:2, None, None, ...].numpy(),
        ]

951 952 953 954 955 956 957 958 959
        np.testing.assert_array_equal(var[0], np_value[1, 0, None])
        np.testing.assert_array_equal(var[1], np_value[None, ..., 1, 0])
        np.testing.assert_array_equal(var[2], np_value[:, :, :, None])
        np.testing.assert_array_equal(var[3], np_value[1, ..., 1, None])
        np.testing.assert_array_equal(var[4], np_value[2, ..., None, None])
        np.testing.assert_array_equal(var[5], np_value[None, 2, 0, ...])
        np.testing.assert_array_equal(var[6], np_value[None, 2, None, 1])
        np.testing.assert_array_equal(var[7], np_value[None])
        np.testing.assert_array_equal(var[8], np_value[0, 0, None, 0, 0, None])
960 961 962
        np.testing.assert_array_equal(
            var[9], np_value[None, None, 0, ..., None]
        )
963
        np.testing.assert_array_equal(var[10], np_value[..., None, :, None])
964

965 966
        # TODO(zyfncg) there is a bug of dimensions when slice step > 1 and
        #              indexs has int type
967
        # self.assertTrue(
968
        #     np.array_equal(var[11], np_value[0, 1:10:2, None, None, ...]))
969

Z
zyfncg 已提交
970 971 972 973
    def _test_bool_index(self):
        shape = (4, 2, 5, 64)
        np_value = np.random.random(shape).astype('float32')
        var_tensor = paddle.to_tensor(np_value)
974 975 976 977 978 979 980 981 982 983
        index = [
            [True, True, True, True],
            [True, False, True, True],
            [True, False, False, True],
            [False, 0, 1, True, True],
            [False, False, False, False],
        ]
        index2d = np.array(
            [[True, True], [False, False], [True, False], [True, True]]
        )
Z
zyfncg 已提交
984 985
        tensor_index = paddle.to_tensor(index2d)
        var = [
986 987 988 989
            var_tensor[index[0]].numpy(),
            var_tensor[index[1]].numpy(),
            var_tensor[index[2]].numpy(),
            var_tensor[index[3]].numpy(),
Z
zyfncg 已提交
990 991
            var_tensor[paddle.to_tensor(index[0])].numpy(),
            var_tensor[tensor_index].numpy(),
992
            var_tensor[paddle.to_tensor(index[4])].numpy(),
Z
zyfncg 已提交
993
        ]
994 995 996 997 998 999 1000
        np.testing.assert_array_equal(var[0], np_value[index[0]])
        np.testing.assert_array_equal(var[1], np_value[index[1]])
        np.testing.assert_array_equal(var[2], np_value[index[2]])
        np.testing.assert_array_equal(var[3], np_value[index[3]])
        np.testing.assert_array_equal(var[4], np_value[index[0]])
        np.testing.assert_array_equal(var[5], np_value[index2d])
        np.testing.assert_array_equal(var[6], np_value[index[4]])
1001 1002 1003 1004 1005 1006
        np.testing.assert_array_equal(
            var_tensor[var_tensor > 0.67], np_value[np_value > 0.67]
        )
        np.testing.assert_array_equal(
            var_tensor[var_tensor < 0.55], np_value[np_value < 0.55]
        )
Z
zyfncg 已提交
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016

        with self.assertRaises(ValueError):
            var_tensor[[False, False, False, False]]
        with self.assertRaises(ValueError):
            var_tensor[[True, False]]
        with self.assertRaises(ValueError):
            var_tensor[[True, False, False, False, False]]
        with self.assertRaises(IndexError):
            var_tensor[paddle.to_tensor([[True, False, False, False]])]

1017 1018 1019 1020 1021 1022
    def _test_scalar_bool_index(self):
        shape = (1, 2, 5, 64)
        np_value = np.random.random(shape).astype('float32')
        var_tensor = paddle.to_tensor(np_value)
        index = [True]
        tensor_index = paddle.to_tensor(index)
1023 1024 1025
        var = [
            var_tensor[tensor_index].numpy(),
        ]
1026
        np.testing.assert_array_equal(var[0], np_value[index])
1027

H
hong 已提交
1028 1029 1030 1031 1032
    def _test_for_var(self):
        np_value = np.random.random((30, 100, 100)).astype('float32')
        w = fluid.dygraph.to_variable(np_value)

        for i, e in enumerate(w):
1033
            np.testing.assert_array_equal(e.numpy(), np_value[i])
H
hong 已提交
1034

1035 1036 1037
    def _test_numpy_index(self):
        array = np.arange(120).reshape([4, 5, 6])
        t = paddle.to_tensor(array)
1038 1039
        np.testing.assert_array_equal(t[np.longlong(0)].numpy(), array[0])
        np.testing.assert_array_equal(
1040 1041 1042
            t[np.longlong(0) : np.longlong(4) : np.longlong(2)].numpy(),
            array[0:4:2],
        )
1043 1044
        np.testing.assert_array_equal(t[np.int64(0)].numpy(), array[0])
        np.testing.assert_array_equal(
1045 1046
            t[np.int32(1) : np.int32(4) : np.int32(2)].numpy(), array[1:4:2]
        )
1047
        np.testing.assert_array_equal(
1048 1049
            t[np.int16(0) : np.int16(4) : np.int16(2)].numpy(), array[0:4:2]
        )
1050 1051 1052 1053 1054 1055 1056

    def _test_list_index(self):
        # case1:
        array = np.arange(120).reshape([6, 5, 4])
        x = paddle.to_tensor(array)
        py_idx = [[0, 2, 0, 1, 3], [0, 0, 1, 2, 0]]
        idx = [paddle.to_tensor(py_idx[0]), paddle.to_tensor(py_idx[1])]
1057 1058
        np.testing.assert_array_equal(x[idx].numpy(), array[py_idx])
        np.testing.assert_array_equal(x[py_idx].numpy(), array[py_idx])
1059 1060
        # case2:
        tensor_x = paddle.to_tensor(
1061 1062
            np.zeros(12).reshape(2, 6).astype(np.float32)
        )
1063 1064
        tensor_y1 = paddle.zeros([1], dtype='int32') + 2
        tensor_y2 = paddle.zeros([1], dtype='int32') + 5
1065 1066
        tensor_x[:, tensor_y1:tensor_y2] = 42
        res = tensor_x.numpy()
1067 1068 1069 1070 1071 1072
        exp = np.array(
            [
                [0.0, 0.0, 42.0, 42.0, 42.0, 0.0],
                [0.0, 0.0, 42.0, 42.0, 42.0, 0.0],
            ]
        )
1073
        np.testing.assert_array_equal(res, exp)
1074

W
WeiXin 已提交
1075 1076 1077
        # case3:
        row = np.array([0, 1, 2])
        col = np.array([2, 1, 3])
1078
        np.testing.assert_array_equal(array[row, col], x[row, col].numpy())
W
WeiXin 已提交
1079

W
wanghuancoder 已提交
1080
    def func_test_slice(self):
L
Leo Chen 已提交
1081
        with fluid.dygraph.guard():
1082
            self._test_slice()
1083
            self._test_slice_for_tensor_attr()
H
hong 已提交
1084
            self._test_for_var()
1085
            self._test_for_getitem_ellipsis_index()
1086
            self._test_none_index()
Z
zyfncg 已提交
1087
            self._test_bool_index()
1088
            self._test_scalar_bool_index()
1089 1090
            self._test_numpy_index()
            self._test_list_index()
1091

L
Leo Chen 已提交
1092
            var = fluid.dygraph.to_variable(self.array)
1093 1094
            np.testing.assert_array_equal(var[1, :].numpy(), self.array[1, :])
            np.testing.assert_array_equal(var[::-1].numpy(), self.array[::-1])
L
Leo Chen 已提交
1095

H
hong 已提交
1096 1097 1098
            with self.assertRaises(IndexError):
                y = var[self.shape[0]]

1099 1100 1101
            with self.assertRaises(IndexError):
                y = var[0 - self.shape[0] - 1]

W
WeiXin 已提交
1102 1103 1104 1105
            with self.assertRaises(IndexError):
                mask = np.array([1, 0, 1, 0], dtype=bool)
                var[paddle.to_tensor([0, 1]), mask]

W
wanghuancoder 已提交
1106 1107 1108 1109 1110
    def test_slice(self):
        with _test_eager_guard():
            self.func_test_slice()
        self.func_test_slice()

1111
    def func_test_var_base_to_np(self):
L
Leo Chen 已提交
1112 1113
        with fluid.dygraph.guard():
            var = fluid.dygraph.to_variable(self.array)
1114 1115 1116
            np.testing.assert_array_equal(
                var.numpy(), fluid.framework._var_base_to_np(var)
            )
L
Leo Chen 已提交
1117

1118 1119 1120 1121 1122 1123
    def test_var_base_to_np(self):
        with _test_eager_guard():
            self.func_test_var_base_to_np()
        self.func_test_var_base_to_np()

    def func_test_var_base_as_np(self):
1124 1125
        with fluid.dygraph.guard():
            var = fluid.dygraph.to_variable(self.array)
1126
            np.testing.assert_array_equal(var.numpy(), np.array(var))
1127 1128 1129
            np.testing.assert_array_equal(
                var.numpy(), np.array(var, dtype=np.float32)
            )
1130

1131 1132 1133 1134 1135 1136
    def test_var_base_as_np(self):
        with _test_eager_guard():
            self.func_test_var_base_as_np()
        self.func_test_var_base_as_np()

    def func_test_if(self):
1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149
        with fluid.dygraph.guard():
            var1 = fluid.dygraph.to_variable(np.array([[[0]]]))
            var2 = fluid.dygraph.to_variable(np.array([[[1]]]))

            var1_bool = False
            var2_bool = False

            if var1:
                var1_bool = True

            if var2:
                var2_bool = True

1150 1151 1152 1153
            assert not var1_bool, "if var1 should be false"
            assert var2_bool, "if var2 should be true"
            assert not bool(var1), "bool(var1) is False"
            assert bool(var2), "bool(var2) is True"
1154

1155 1156 1157 1158 1159 1160
    def test_if(self):
        with _test_eager_guard():
            self.func_test_if()
        self.func_test_if()

    def func_test_to_static_var(self):
1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177
        with fluid.dygraph.guard():
            # Convert VarBase into Variable or Parameter
            var_base = fluid.dygraph.to_variable(self.array, name="var_base_1")
            static_var = var_base._to_static_var()
            self._assert_to_static(var_base, static_var)

            var_base = fluid.dygraph.to_variable(self.array, name="var_base_2")
            static_param = var_base._to_static_var(to_parameter=True)
            self._assert_to_static(var_base, static_param, True)

            # Convert ParamBase into Parameter
            fc = fluid.dygraph.Linear(
                10,
                20,
                param_attr=fluid.ParamAttr(
                    learning_rate=0.001,
                    do_model_average=True,
1178 1179 1180
                    regularizer=fluid.regularizer.L1Decay(),
                ),
            )
1181 1182 1183 1184
            weight = fc.parameters()[0]
            static_param = weight._to_static_var()
            self._assert_to_static(weight, static_param, True)

1185 1186 1187 1188 1189
    def test_to_static_var(self):
        with _test_eager_guard():
            self.func_test_to_static_var()
        self.func_test_to_static_var()

1190 1191 1192 1193 1194 1195
    def _assert_to_static(self, var_base, static_var, is_param=False):
        if is_param:
            self.assertTrue(isinstance(static_var, fluid.framework.Parameter))
            self.assertTrue(static_var.persistable, True)
            if isinstance(var_base, fluid.framework.ParamBase):
                for attr in ['trainable', 'is_distributed', 'do_model_average']:
1196 1197 1198
                    self.assertEqual(
                        getattr(var_base, attr), getattr(static_var, attr)
                    )
1199

1200 1201 1202
                self.assertEqual(
                    static_var.optimize_attr['learning_rate'], 0.001
                )
1203
                self.assertTrue(
1204 1205 1206 1207
                    isinstance(
                        static_var.regularizer, fluid.regularizer.L1Decay
                    )
                )
1208 1209 1210 1211 1212 1213 1214 1215 1216
        else:
            self.assertTrue(isinstance(static_var, fluid.framework.Variable))

        attr_keys = ['block', 'dtype', 'type', 'name']
        for attr in attr_keys:
            self.assertEqual(getattr(var_base, attr), getattr(static_var, attr))

        self.assertListEqual(list(var_base.shape), list(static_var.shape))

1217
    def func_test_tensor_str(self):
Z
Zhou Wei 已提交
1218
        paddle.enable_static()
1219
        paddle.disable_static(paddle.CPUPlace())
C
cnn 已提交
1220
        paddle.seed(10)
1221 1222 1223 1224
        a = paddle.rand([10, 20])
        paddle.set_printoptions(4, 100, 3)
        a_str = str(a)

1225
        expected = '''Tensor(shape=[10, 20], dtype=float32, place=Place(cpu), stop_gradient=True,
1226 1227 1228 1229 1230 1231 1232 1233 1234 1235
       [[0.2727, 0.5489, 0.8655, ..., 0.2916, 0.8525, 0.9000],
        [0.3806, 0.8996, 0.0928, ..., 0.9535, 0.8378, 0.6409],
        [0.1484, 0.4038, 0.8294, ..., 0.0148, 0.6520, 0.4250],
        ...,
        [0.3426, 0.1909, 0.7240, ..., 0.4218, 0.2676, 0.5679],
        [0.5561, 0.2081, 0.0676, ..., 0.9778, 0.3302, 0.9559],
        [0.2665, 0.8483, 0.5389, ..., 0.4956, 0.6862, 0.9178]])'''

        self.assertEqual(a_str, expected)

1236 1237 1238 1239 1240 1241
    def test_tensor_str(self):
        with _test_eager_guard():
            self.func_test_tensor_str()
        self.func_test_tensor_str()

    def func_test_tensor_str2(self):
1242 1243 1244 1245
        paddle.disable_static(paddle.CPUPlace())
        a = paddle.to_tensor([[1.5111111, 1.0], [0, 0]])
        a_str = str(a)

1246
        expected = '''Tensor(shape=[2, 2], dtype=float32, place=Place(cpu), stop_gradient=True,
1247 1248 1249 1250 1251
       [[1.5111, 1.    ],
        [0.    , 0.    ]])'''

        self.assertEqual(a_str, expected)

1252 1253 1254 1255 1256 1257
    def test_tensor_str2(self):
        with _test_eager_guard():
            self.func_test_tensor_str2()
        self.func_test_tensor_str2()

    def func_test_tensor_str3(self):
1258 1259 1260 1261
        paddle.disable_static(paddle.CPUPlace())
        a = paddle.to_tensor([[-1.5111111, 1.0], [0, -0.5]])
        a_str = str(a)

1262
        expected = '''Tensor(shape=[2, 2], dtype=float32, place=Place(cpu), stop_gradient=True,
1263 1264 1265 1266 1267
       [[-1.5111,  1.    ],
        [ 0.    , -0.5000]])'''

        self.assertEqual(a_str, expected)

1268 1269 1270 1271 1272 1273
    def test_tensor_str3(self):
        with _test_eager_guard():
            self.func_test_tensor_str3()
        self.func_test_tensor_str3()

    def func_test_tensor_str_scaler(self):
1274 1275 1276 1277
        paddle.disable_static(paddle.CPUPlace())
        a = paddle.to_tensor(np.array(False))
        a_str = str(a)

1278
        expected = '''Tensor(shape=[], dtype=bool, place=Place(cpu), stop_gradient=True,
1279 1280 1281 1282
       False)'''

        self.assertEqual(a_str, expected)

1283 1284 1285 1286 1287 1288
    def test_tensor_str_scaler(self):
        with _test_eager_guard():
            self.func_test_tensor_str_scaler()
        self.func_test_tensor_str_scaler()

    def func_test_tensor_str_shape_with_zero(self):
1289 1290 1291 1292 1293
        paddle.disable_static(paddle.CPUPlace())
        x = paddle.ones((10, 10))
        y = paddle.fluid.layers.where(x == 0)
        a_str = str(y)

1294
        expected = '''Tensor(shape=[0, 2], dtype=int64, place=Place(cpu), stop_gradient=True,
1295 1296 1297 1298
       [])'''

        self.assertEqual(a_str, expected)

1299 1300 1301 1302 1303 1304
    def test_tensor_str_shape_with_zero(self):
        with _test_eager_guard():
            self.func_test_tensor_str_shape_with_zero()
        self.func_test_tensor_str_shape_with_zero()

    def func_test_tensor_str_linewidth(self):
1305 1306 1307
        paddle.disable_static(paddle.CPUPlace())
        paddle.seed(2021)
        x = paddle.rand([128])
1308 1309 1310
        paddle.set_printoptions(
            precision=4, threshold=1000, edgeitems=3, linewidth=80
        )
1311 1312
        a_str = str(x)

1313
        expected = '''Tensor(shape=[128], dtype=float32, place=Place(cpu), stop_gradient=True,
1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331
       [0.3759, 0.0278, 0.2489, 0.3110, 0.9105, 0.7381, 0.1905, 0.4726, 0.2435,
        0.9142, 0.3367, 0.7243, 0.7664, 0.9915, 0.2921, 0.1363, 0.8096, 0.2915,
        0.9564, 0.9972, 0.2573, 0.2597, 0.3429, 0.2484, 0.9579, 0.7003, 0.4126,
        0.4274, 0.0074, 0.9686, 0.9910, 0.0144, 0.6564, 0.2932, 0.7114, 0.9301,
        0.6421, 0.0538, 0.1273, 0.5771, 0.9336, 0.6416, 0.1832, 0.9311, 0.7702,
        0.7474, 0.4479, 0.3382, 0.5579, 0.0444, 0.9802, 0.9874, 0.3038, 0.5640,
        0.2408, 0.5489, 0.8866, 0.1006, 0.5881, 0.7560, 0.7928, 0.8604, 0.4670,
        0.9285, 0.1482, 0.4541, 0.1307, 0.6221, 0.4902, 0.1147, 0.4415, 0.2987,
        0.7276, 0.2077, 0.7551, 0.9652, 0.4369, 0.2282, 0.0047, 0.2934, 0.4308,
        0.4190, 0.1442, 0.3650, 0.3056, 0.6535, 0.1211, 0.8721, 0.7408, 0.4220,
        0.5937, 0.3123, 0.9198, 0.0275, 0.5338, 0.4622, 0.7521, 0.3609, 0.4703,
        0.1736, 0.8976, 0.7616, 0.3756, 0.2416, 0.2907, 0.3246, 0.4305, 0.5717,
        0.0735, 0.0361, 0.5534, 0.4399, 0.9260, 0.6525, 0.3064, 0.4573, 0.9210,
        0.8269, 0.2424, 0.7494, 0.8945, 0.7098, 0.8078, 0.4707, 0.5715, 0.7232,
        0.4678, 0.5047])'''

        self.assertEqual(a_str, expected)

1332 1333 1334 1335 1336 1337
    def test_tensor_str_linewidth(self):
        with _test_eager_guard():
            self.func_test_tensor_str_linewidth()
        self.func_test_tensor_str_linewidth()

    def func_test_tensor_str_linewidth2(self):
1338 1339 1340 1341 1342 1343
        paddle.disable_static(paddle.CPUPlace())
        paddle.seed(2021)
        x = paddle.rand([128])
        paddle.set_printoptions(precision=4, linewidth=160, sci_mode=True)
        a_str = str(x)

1344
        expected = '''Tensor(shape=[128], dtype=float32, place=Place(cpu), stop_gradient=True,
1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358
       [3.7587e-01, 2.7798e-02, 2.4891e-01, 3.1097e-01, 9.1053e-01, 7.3811e-01, 1.9045e-01, 4.7258e-01, 2.4354e-01, 9.1415e-01, 3.3666e-01, 7.2428e-01,
        7.6640e-01, 9.9146e-01, 2.9215e-01, 1.3625e-01, 8.0957e-01, 2.9153e-01, 9.5642e-01, 9.9718e-01, 2.5732e-01, 2.5973e-01, 3.4292e-01, 2.4841e-01,
        9.5794e-01, 7.0029e-01, 4.1260e-01, 4.2737e-01, 7.3788e-03, 9.6863e-01, 9.9102e-01, 1.4416e-02, 6.5640e-01, 2.9318e-01, 7.1136e-01, 9.3008e-01,
        6.4209e-01, 5.3849e-02, 1.2730e-01, 5.7712e-01, 9.3359e-01, 6.4155e-01, 1.8320e-01, 9.3110e-01, 7.7021e-01, 7.4736e-01, 4.4793e-01, 3.3817e-01,
        5.5794e-01, 4.4412e-02, 9.8023e-01, 9.8735e-01, 3.0376e-01, 5.6397e-01, 2.4082e-01, 5.4893e-01, 8.8659e-01, 1.0065e-01, 5.8812e-01, 7.5600e-01,
        7.9280e-01, 8.6041e-01, 4.6701e-01, 9.2852e-01, 1.4821e-01, 4.5410e-01, 1.3074e-01, 6.2210e-01, 4.9024e-01, 1.1466e-01, 4.4154e-01, 2.9868e-01,
        7.2758e-01, 2.0766e-01, 7.5508e-01, 9.6522e-01, 4.3688e-01, 2.2823e-01, 4.7394e-03, 2.9342e-01, 4.3083e-01, 4.1902e-01, 1.4416e-01, 3.6500e-01,
        3.0560e-01, 6.5350e-01, 1.2115e-01, 8.7206e-01, 7.4081e-01, 4.2203e-01, 5.9372e-01, 3.1230e-01, 9.1979e-01, 2.7486e-02, 5.3383e-01, 4.6224e-01,
        7.5211e-01, 3.6094e-01, 4.7034e-01, 1.7355e-01, 8.9763e-01, 7.6165e-01, 3.7557e-01, 2.4157e-01, 2.9074e-01, 3.2458e-01, 4.3049e-01, 5.7171e-01,
        7.3509e-02, 3.6087e-02, 5.5341e-01, 4.3993e-01, 9.2601e-01, 6.5248e-01, 3.0640e-01, 4.5727e-01, 9.2104e-01, 8.2688e-01, 2.4243e-01, 7.4937e-01,
        8.9448e-01, 7.0981e-01, 8.0783e-01, 4.7065e-01, 5.7154e-01, 7.2319e-01, 4.6777e-01, 5.0465e-01])'''

        self.assertEqual(a_str, expected)

1359 1360 1361 1362 1363 1364
    def test_tensor_str_linewidth2(self):
        with _test_eager_guard():
            self.func_test_tensor_str_linewidth2()
        self.func_test_tensor_str_linewidth2()

    def func_tensor_str_bf16(self):
1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376
        paddle.disable_static(paddle.CPUPlace())
        a = paddle.to_tensor([[1.5, 1.0], [0, 0]])
        a = paddle.cast(a, dtype=core.VarDesc.VarType.BF16)
        paddle.set_printoptions(precision=4)
        a_str = str(a)

        expected = '''Tensor(shape=[2, 2], dtype=bfloat16, place=Place(cpu), stop_gradient=True,
       [[1.5000, 1.    ],
        [0.    , 0.    ]])'''

        self.assertEqual(a_str, expected)

1377 1378 1379 1380 1381
    def test_tensor_str_bf16(self):
        with _test_eager_guard():
            self.func_tensor_str_bf16()
        self.func_tensor_str_bf16()

1382 1383 1384 1385 1386 1387
    def test_tensor_str_bf16(self):
        with _test_eager_guard():
            self.func_tensor_str_bf16()
        self.func_tensor_str_bf16()

    def func_test_print_tensor_dtype(self):
L
Leo Chen 已提交
1388 1389 1390 1391 1392 1393 1394
        paddle.disable_static(paddle.CPUPlace())
        a = paddle.rand([1])
        a_str = str(a.dtype)

        expected = 'paddle.float32'

        self.assertEqual(a_str, expected)
1395 1396 1397 1398 1399

    def test_print_tensor_dtype(self):
        with _test_eager_guard():
            self.func_test_print_tensor_dtype()
        self.func_test_print_tensor_dtype()
L
Leo Chen 已提交
1400

L
Leo Chen 已提交
1401

1402
class TestVarBaseSetitem(unittest.TestCase):
1403
    def func_setUp(self):
1404 1405 1406
        self.set_dtype()
        self.tensor_x = paddle.to_tensor(np.ones((4, 2, 3)).astype(self.dtype))
        self.np_value = np.random.random((2, 3)).astype(self.dtype)
1407 1408
        self.tensor_value = paddle.to_tensor(self.np_value)

1409 1410 1411
    def set_dtype(self):
        self.dtype = "int32"

1412
    def _test(self, value):
J
Jiabin Yang 已提交
1413
        if _in_legacy_dygraph():
W
wanghuancoder 已提交
1414
            self.assertEqual(self.tensor_x.inplace_version, 0)
1415

1416
        id_origin = id(self.tensor_x)
1417
        self.tensor_x[0] = value
J
Jiabin Yang 已提交
1418
        if _in_legacy_dygraph():
W
wanghuancoder 已提交
1419
            self.assertEqual(self.tensor_x.inplace_version, 1)
1420

1421
        if isinstance(value, (int, float)):
1422
            result = np.zeros((2, 3)).astype(self.dtype) + value
1423 1424 1425 1426

        else:
            result = self.np_value

1427
        np.testing.assert_array_equal(self.tensor_x[0].numpy(), result)
1428 1429 1430
        self.assertEqual(id_origin, id(self.tensor_x))

        self.tensor_x[1:2] = value
J
Jiabin Yang 已提交
1431
        if _in_legacy_dygraph():
W
wanghuancoder 已提交
1432
            self.assertEqual(self.tensor_x.inplace_version, 2)
1433
        np.testing.assert_array_equal(self.tensor_x[1].numpy(), result)
1434 1435 1436
        self.assertEqual(id_origin, id(self.tensor_x))

        self.tensor_x[...] = value
J
Jiabin Yang 已提交
1437
        if _in_legacy_dygraph():
W
wanghuancoder 已提交
1438
            self.assertEqual(self.tensor_x.inplace_version, 3)
1439
        np.testing.assert_array_equal(self.tensor_x[3].numpy(), result)
1440 1441
        self.assertEqual(id_origin, id(self.tensor_x))

W
wanghuancoder 已提交
1442
    def func_test_value_tensor(self):
1443 1444
        self._test(self.tensor_value)

W
wanghuancoder 已提交
1445 1446
    def test_value_tensor(self):
        with _test_eager_guard():
1447
            self.func_setUp()
W
wanghuancoder 已提交
1448
            self.func_test_value_tensor()
1449
        self.func_setUp()
W
wanghuancoder 已提交
1450 1451 1452
        self.func_test_value_tensor()

    def func_test_value_numpy(self):
1453 1454
        self._test(self.np_value)

W
wanghuancoder 已提交
1455 1456
    def test_value_numpy(self):
        with _test_eager_guard():
1457
            self.func_setUp()
W
wanghuancoder 已提交
1458
            self.func_test_value_numpy()
1459
        self.func_setUp()
W
wanghuancoder 已提交
1460 1461 1462
        self.func_test_value_numpy()

    def func_test_value_int(self):
1463 1464
        self._test(10)

W
wanghuancoder 已提交
1465 1466
    def test_value_int(self):
        with _test_eager_guard():
1467
            self.func_setUp()
W
wanghuancoder 已提交
1468
            self.func_test_value_int()
1469
        self.func_setUp()
W
wanghuancoder 已提交
1470 1471
        self.func_test_value_int()

1472 1473 1474 1475 1476 1477 1478 1479 1480 1481

class TestVarBaseSetitemInt64(TestVarBaseSetitem):
    def set_dtype(self):
        self.dtype = "int64"


class TestVarBaseSetitemFp32(TestVarBaseSetitem):
    def set_dtype(self):
        self.dtype = "float32"

1482
    def func_test_value_float(self):
1483 1484 1485
        paddle.disable_static()
        self._test(3.3)

1486 1487 1488 1489 1490 1491 1492
    def test_value_float(self):
        with _test_eager_guard():
            self.func_setUp()
            self.func_test_value_float()
        self.func_setUp()
        self.func_test_value_float()

1493

1494 1495 1496 1497 1498
class TestVarBaseSetitemFp64(TestVarBaseSetitem):
    def set_dtype(self):
        self.dtype = "float64"


1499
class TestVarBaseSetitemBoolIndex(unittest.TestCase):
1500
    def func_setUp(self):
1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521
        paddle.disable_static()
        self.set_dtype()
        self.set_input()

    def set_input(self):
        self.tensor_x = paddle.to_tensor(np.ones((4, 2, 3)).astype(self.dtype))
        self.np_value = np.random.random((2, 3)).astype(self.dtype)
        self.tensor_value = paddle.to_tensor(self.np_value)

    def set_dtype(self):
        self.dtype = "int32"

    def _test(self, value):
        paddle.disable_static()
        self.assertEqual(self.tensor_x.inplace_version, 0)

        id_origin = id(self.tensor_x)
        index_1 = paddle.to_tensor(np.array([True, False, False, False]))
        self.tensor_x[index_1] = value
        self.assertEqual(self.tensor_x.inplace_version, 1)

1522
        if isinstance(value, (int, float)):
1523 1524 1525 1526 1527
            result = np.zeros((2, 3)).astype(self.dtype) + value

        else:
            result = self.np_value

1528
        np.testing.assert_array_equal(self.tensor_x[0].numpy(), result)
1529 1530 1531 1532 1533
        self.assertEqual(id_origin, id(self.tensor_x))

        index_2 = paddle.to_tensor(np.array([False, True, False, False]))
        self.tensor_x[index_2] = value
        self.assertEqual(self.tensor_x.inplace_version, 2)
1534
        np.testing.assert_array_equal(self.tensor_x[1].numpy(), result)
1535 1536 1537 1538 1539
        self.assertEqual(id_origin, id(self.tensor_x))

        index_3 = paddle.to_tensor(np.array([True, True, True, True]))
        self.tensor_x[index_3] = value
        self.assertEqual(self.tensor_x.inplace_version, 3)
1540
        np.testing.assert_array_equal(self.tensor_x[3].numpy(), result)
1541 1542
        self.assertEqual(id_origin, id(self.tensor_x))

1543
    def func_test_value_tensor(self):
1544 1545 1546
        paddle.disable_static()
        self._test(self.tensor_value)

1547 1548 1549 1550 1551 1552 1553 1554
    def test_value_tensor(self):
        with _test_eager_guard():
            self.func_setUp()
            self.func_test_value_tensor()
        self.func_setUp()
        self.func_test_value_tensor()

    def func_test_value_numpy(self):
1555 1556 1557
        paddle.disable_static()
        self._test(self.np_value)

1558 1559 1560 1561 1562 1563 1564 1565
    def test_value_numpy(self):
        with _test_eager_guard():
            self.func_setUp()
            self.func_test_value_numpy()
        self.func_setUp()
        self.func_test_value_numpy()

    def func_test_value_int(self):
1566 1567 1568
        paddle.disable_static()
        self._test(10)

1569 1570 1571 1572 1573 1574 1575
    def test_value_int(self):
        with _test_eager_guard():
            self.func_setUp()
            self.func_test_value_int()
        self.func_setUp()
        self.func_test_value_int()

1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591

class TestVarBaseSetitemBoolScalarIndex(unittest.TestCase):
    def set_input(self):
        self.tensor_x = paddle.to_tensor(np.ones((1, 2, 3)).astype(self.dtype))
        self.np_value = np.random.random((2, 3)).astype(self.dtype)
        self.tensor_value = paddle.to_tensor(self.np_value)

    def _test(self, value):
        paddle.disable_static()
        self.assertEqual(self.tensor_x.inplace_version, 0)

        id_origin = id(self.tensor_x)
        index = paddle.to_tensor(np.array([True]))
        self.tensor_x[index] = value
        self.assertEqual(self.tensor_x.inplace_version, 1)

1592
        if isinstance(value, (int, float)):
1593 1594 1595 1596 1597
            result = np.zeros((2, 3)).astype(self.dtype) + value

        else:
            result = self.np_value

1598
        np.testing.assert_array_equal(self.tensor_x[0].numpy(), result)
1599 1600 1601
        self.assertEqual(id_origin, id(self.tensor_x))


1602
class TestVarBaseInplaceVersion(unittest.TestCase):
1603
    def func_test_setitem(self):
1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614
        paddle.disable_static()

        var = paddle.ones(shape=[4, 2, 3], dtype="float32")
        self.assertEqual(var.inplace_version, 0)

        var[1] = 1
        self.assertEqual(var.inplace_version, 1)

        var[1:2] = 1
        self.assertEqual(var.inplace_version, 2)

1615 1616 1617 1618 1619 1620
    def test_setitem(self):
        with _test_eager_guard():
            self.func_test_setitem()
        self.func_test_setitem()

    def func_test_bump_inplace_version(self):
1621 1622 1623 1624 1625 1626 1627 1628 1629 1630
        paddle.disable_static()
        var = paddle.ones(shape=[4, 2, 3], dtype="float32")
        self.assertEqual(var.inplace_version, 0)

        var._bump_inplace_version()
        self.assertEqual(var.inplace_version, 1)

        var._bump_inplace_version()
        self.assertEqual(var.inplace_version, 2)

1631 1632 1633 1634 1635
    def test_bump_inplace_version(self):
        with _test_eager_guard():
            self.func_test_bump_inplace_version()
        self.func_test_bump_inplace_version()

1636

1637
class TestVarBaseSlice(unittest.TestCase):
1638
    def func_test_slice(self):
1639 1640 1641 1642 1643 1644 1645
        paddle.disable_static()
        np_x = np.random.random((3, 8, 8))
        x = paddle.to_tensor(np_x, dtype="float64")
        actual_x = x._slice(0, 1)
        actual_x = paddle.to_tensor(actual_x)
        self.assertEqual(actual_x.numpy().all(), np_x[0:1].all())

1646 1647 1648 1649 1650
    def test_slice(self):
        with _test_eager_guard():
            self.func_test_slice()
        self.func_test_slice()

1651 1652

class TestVarBaseClear(unittest.TestCase):
1653
    def func_test_clear(self):
1654 1655 1656 1657 1658 1659
        paddle.disable_static()
        np_x = np.random.random((3, 8, 8))
        x = paddle.to_tensor(np_x, dtype="float64")
        x._clear()
        self.assertEqual(str(x), "Tensor(Not initialized)")

1660 1661 1662 1663 1664
    def test_clear(self):
        with _test_eager_guard():
            self.func_test_clear()
        self.func_test_clear()

1665 1666

class TestVarBaseOffset(unittest.TestCase):
1667
    def func_offset(self):
1668 1669 1670 1671 1672 1673 1674 1675
        paddle.disable_static()
        np_x = np.random.random((3, 8, 8))
        x = paddle.to_tensor(np_x, dtype="float64")
        expected_offset = 0
        actual_x = x._slice(expected_offset, 1)
        actual_x = paddle.to_tensor(actual_x)
        self.assertEqual(actual_x._offset(), expected_offset)

1676 1677 1678 1679 1680
    def test_offset(self):
        with _test_eager_guard():
            self.func_offset()
        self.func_offset()

1681

1682
class TestVarBaseShareBufferTo(unittest.TestCase):
1683
    def func_test_share_buffer_To(self):
1684
        paddle.disable_static()
1685 1686 1687
        np_src = np.random.random((3, 8, 8))
        src = paddle.to_tensor(np_src, dtype="float64")
        # empty_var
1688 1689 1690 1691
        if _in_legacy_dygraph():
            dst = core.VarBase()
        else:
            dst = core.eager.Tensor()
1692 1693
        src._share_buffer_to(dst)
        self.assertEqual(src._is_shared_buffer_with(dst), True)
1694

1695 1696 1697 1698 1699
    def test_share_buffer_To(self):
        with _test_eager_guard():
            self.func_test_share_buffer_To()
        self.func_test_share_buffer_To()

1700 1701

class TestVarBaseTo(unittest.TestCase):
1702
    def func_setUp(self):
1703 1704 1705 1706
        paddle.disable_static()
        self.np_x = np.random.random((3, 8, 8))
        self.x = paddle.to_tensor(self.np_x, dtype="float32")

1707
    def func_test_to_api(self):
1708 1709
        x_double = self.x._to(dtype='double')
        self.assertEqual(x_double.dtype, paddle.fluid.core.VarDesc.VarType.FP64)
1710
        np.testing.assert_allclose(self.np_x, x_double, rtol=1e-05)
1711 1712 1713

        x_ = self.x._to()
        self.assertEqual(self.x.dtype, paddle.fluid.core.VarDesc.VarType.FP64)
1714
        np.testing.assert_allclose(self.np_x, x_, rtol=1e-05)
1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727

        if paddle.fluid.is_compiled_with_cuda():
            x_gpu = self.x._to(device=paddle.CUDAPlace(0))
            self.assertTrue(x_gpu.place.is_gpu_place())
            self.assertEqual(x_gpu.place.gpu_device_id(), 0)

            x_gpu0 = self.x._to(device='gpu:0')
            self.assertTrue(x_gpu0.place.is_gpu_place())
            self.assertEqual(x_gpu0.place.gpu_device_id(), 0)

            x_gpu1 = self.x._to(device='gpu:0', dtype="float64")
            self.assertTrue(x_gpu1.place.is_gpu_place())
            self.assertEqual(x_gpu1.place.gpu_device_id(), 0)
1728 1729 1730
            self.assertEqual(
                x_gpu1.dtype, paddle.fluid.core.VarDesc.VarType.FP64
            )
1731 1732 1733 1734

            x_gpu2 = self.x._to(device='gpu:0', dtype="float16")
            self.assertTrue(x_gpu2.place.is_gpu_place())
            self.assertEqual(x_gpu2.place.gpu_device_id(), 0)
1735 1736 1737
            self.assertEqual(
                x_gpu2.dtype, paddle.fluid.core.VarDesc.VarType.FP16
            )
1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755

        x_cpu = self.x._to(device=paddle.CPUPlace())
        self.assertTrue(x_cpu.place.is_cpu_place())

        x_cpu0 = self.x._to(device='cpu')
        self.assertTrue(x_cpu0.place.is_cpu_place())

        x_cpu1 = self.x._to(device=paddle.CPUPlace(), dtype="float64")
        self.assertTrue(x_cpu1.place.is_cpu_place())
        self.assertEqual(x_cpu1.dtype, paddle.fluid.core.VarDesc.VarType.FP64)

        x_cpu2 = self.x._to(device='cpu', dtype="float16")
        self.assertTrue(x_cpu2.place.is_cpu_place())
        self.assertEqual(x_cpu2.dtype, paddle.fluid.core.VarDesc.VarType.FP16)

        self.assertRaises(ValueError, self.x._to, device=1)
        self.assertRaises(AssertionError, self.x._to, blocking=1)

1756 1757 1758 1759 1760 1761 1762
    def test_to_api(self):
        with _test_eager_guard():
            self.func_setUp()
            self.func_test_to_api()
        self.func_setUp()
        self.func_test_to_api()

1763 1764

class TestVarBaseInitVarBaseFromTensorWithDevice(unittest.TestCase):
1765
    def func_test_varbase_init(self):
1766 1767 1768 1769 1770 1771 1772
        paddle.disable_static()
        t = fluid.Tensor()
        np_x = np.random.random((3, 8, 8))
        t.set(np_x, fluid.CPUPlace())

        if paddle.fluid.is_compiled_with_cuda():
            device = paddle.CUDAPlace(0)
1773 1774 1775 1776
            if _in_legacy_dygraph():
                tmp = fluid.core.VarBase(t, device)
            else:
                tmp = fluid.core.eager.Tensor(t, device)
1777 1778 1779 1780
            self.assertTrue(tmp.place.is_gpu_place())
            self.assertEqual(tmp.numpy().all(), np_x.all())

        device = paddle.CPUPlace()
1781 1782 1783 1784
        if _in_legacy_dygraph():
            tmp = fluid.core.VarBase(t, device)
        else:
            tmp = fluid.core.eager.Tensor(t, device)
1785 1786
        self.assertEqual(tmp.numpy().all(), np_x.all())

1787 1788 1789 1790 1791
    def test_varbase_init(self):
        with _test_eager_guard():
            self.func_test_varbase_init()
        self.func_test_varbase_init()

1792 1793

class TestVarBaseNumel(unittest.TestCase):
1794
    def func_test_numel_normal(self):
1795 1796 1797 1798 1799 1800 1801
        paddle.disable_static()
        np_x = np.random.random((3, 8, 8))
        x = paddle.to_tensor(np_x, dtype="float64")
        x_actual_numel = x._numel()
        x_expected_numel = np.product((3, 8, 8))
        self.assertEqual(x_actual_numel, x_expected_numel)

1802 1803 1804 1805 1806 1807
    def test_numel_normal(self):
        with _test_eager_guard():
            self.func_test_numel_normal()
        self.func_test_numel_normal()

    def func_test_numel_without_holder(self):
1808
        paddle.disable_static()
1809 1810 1811 1812
        if _in_legacy_dygraph():
            x_without_holder = core.VarBase()
        else:
            x_without_holder = core.eager.Tensor()
1813 1814 1815
        x_actual_numel = x_without_holder._numel()
        self.assertEqual(x_actual_numel, 0)

1816 1817 1818 1819 1820
    def ttest_numel_without_holder(self):
        with _test_eager_guard():
            self.func_test_numel_without_holder()
        self.func_test_numel_without_holder()

1821 1822

class TestVarBaseCopyGradientFrom(unittest.TestCase):
1823
    def func_test_copy_gradient_from(self):
1824 1825 1826 1827 1828 1829 1830 1831 1832 1833
        paddle.disable_static()
        np_x = np.random.random((2, 2))
        np_y = np.random.random((2, 2))
        x = paddle.to_tensor(np_x, dtype="float64", stop_gradient=False)
        y = paddle.to_tensor(np_y, dtype="float64")
        out = x + x
        out.backward()
        x._copy_gradient_from(y)
        self.assertEqual(x.grad.numpy().all(), np_y.all())

1834 1835 1836 1837 1838
    def test_copy_gradient_from(self):
        with _test_eager_guard():
            self.func_test_copy_gradient_from()
        self.func_test_copy_gradient_from()

1839

1840 1841 1842 1843 1844 1845 1846
class TestEagerTensorGradNameValue(unittest.TestCase):
    def test_eager_tensor_grad_name_value(self):
        with _test_eager_guard():
            a_np = np.array([2, 3]).astype('float32')
            a = paddle.to_tensor(a_np)
            a.stop_gradient = False
            b = a**2
1847
            self.assertIsNone(a._grad_value())
1848
            b.backward()
1849
            # Note, for new dygraph, there are no generated grad name, so we skip the name check.
1850
            self.assertIsNotNone(a._grad_value())
1851 1852


L
Leo Chen 已提交
1853 1854
if __name__ == '__main__':
    unittest.main()