# Copyright 2020-2021 Huawei Technologies Co., Ltd # # 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 numpy as np import pytest import mindspore.context as context import mindspore.nn as nn from mindspore import Tensor, Parameter from mindspore.ops import operations as P from mindspore.ops.operations import _inner_ops as inner context.set_context(mode=context.GRAPH_MODE, device_target="GPU") # all cases tested against dchip func_map = { "update": P.ScatterUpdate, "add": P.ScatterAdd, "sub": P.ScatterSub, } class TestScatterFuncNet(nn.Cell): def __init__(self, func, lock, inputx, indices, updates): super(TestScatterFuncNet, self).__init__() self.scatter_func = func_map[func](use_locking=lock) self.inputx = Parameter(inputx, name="inputx") self.indices = Parameter(indices, name="indices") self.updates = Parameter(updates, name="updates") def construct(self): out = self.scatter_func(self.inputx, self.indices, self.updates) return out def scatter_func_net(func, inputx, indices, updates): lock = True net = TestScatterFuncNet(func, lock, inputx, indices, updates) return net() def scatter_func_use_locking_false_net(func, inputx, indices, updates): lock = False net = TestScatterFuncNet(func, lock, inputx, indices, updates) return net() class TestScatterFuncDynamicNet(nn.Cell): def __init__(self, func, inputx, indices, updates): super(TestScatterFuncDynamicNet, self).__init__() self.scatter_func = func_map[func]() self.test_dynamic = inner.GpuConvertToDynamicShape() self.inputx = Parameter(inputx, name="inputx") self.indices = Parameter(indices, name="indices") self.updates = Parameter(updates, name="updates") def construct(self): indices = self.test_dynamic(self.indices) updates = self.test_dynamic(self.updates) out = self.scatter_func(self.inputx, indices, updates) return out def scatter_func_d_net(func, inputx, indices, updates): context.set_context(mode=context.GRAPH_MODE, device_target="GPU") net = TestScatterFuncDynamicNet(func, inputx, indices, updates) return net() class TestScatterFuncDynamicNet2(nn.Cell): def __init__(self, func, inputx): super(TestScatterFuncDynamicNet2, self).__init__() self.scatter_func = func_map[func]() self.test_dynamic = inner.GpuConvertToDynamicShape() self.inputx = Parameter(inputx, name="inputx") def construct(self, indices, updates): indices = self.test_dynamic(indices) updates = self.test_dynamic(updates) out = self.scatter_func(self.inputx, indices, updates) return out def scatter_func_d2_net(func, inputx, indices_1, updates_1, indices_2, updates_2): context.set_context(mode=context.GRAPH_MODE, device_target="GPU") net = TestScatterFuncDynamicNet2(func, inputx) out1 = net(indices_1, updates_1) out2 = net(indices_2, updates_2) return (out1, out2) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_small_float32(): inputx = Tensor(np.zeros((2, 3)).astype(np.float32)) indices = Tensor(np.array([[0, 1], [0, 1]]).astype(np.int32)) updates = Tensor(np.arange(12).reshape((2, 2, 3)).astype(np.float32)) # update output = scatter_func_net("update", inputx, indices, updates) expected = np.array([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0]]) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_net("add", inputx, indices, updates) expected = np.array([[6.0, 8.0, 10.0], [12.0, 14.0, 16.0]]) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_net("sub", inputx, indices, updates) expected = np.array([[-6.0, -8.0, -10.0], [-12.0, -14.0, -16.0]]) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_input_updated(): inputx = Tensor(np.zeros((2, 3)).astype(np.float32)) indices = Tensor(np.array([[0, 1], [0, 1]]).astype(np.int32)) updates = Tensor(np.arange(12).reshape((2, 2, 3)).astype(np.float32)) lock = True # update net = TestScatterFuncNet("update", lock, inputx, indices, updates) net() expected = np.array([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0]]) np.testing.assert_array_almost_equal(net.inputx.asnumpy(), expected) # add net = TestScatterFuncNet("add", lock, inputx, indices, updates) net() expected = np.array([[6.0, 8.0, 10.0], [12.0, 14.0, 16.0]]) np.testing.assert_array_almost_equal(net.inputx.asnumpy(), expected) # sub net = TestScatterFuncNet("sub", lock, inputx, indices, updates) net() expected = np.array([[-6.0, -8.0, -10.0], [-12.0, -14.0, -16.0]]) np.testing.assert_array_almost_equal(net.inputx.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_large_shape_float32(): inputx = Tensor(np.ones((4, 2, 3, 4)).astype(np.float32)) indices = Tensor(np.array([[0, 2], [3, 1]]).astype(np.int32)) updates = Tensor(np.arange(96).reshape((2, 2, 2, 3, 4)).astype(np.float32)) # update output = scatter_func_net("update", inputx, indices, updates) expected = np.array( [ [ [[0.0, 1.0, 2.0, 3.0], [4.0, 5.0, 6.0, 7.0], [8.0, 9.0, 10.0, 11.0]], [[12.0, 13.0, 14.0, 15.0], [16.0, 17.0, 18.0, 19.0], [20.0, 21.0, 22.0, 23.0]], ], [ [[72.0, 73.0, 74.0, 75.0], [76.0, 77.0, 78.0, 79.0], [80.0, 81.0, 82.0, 83.0]], [[84.0, 85.0, 86.0, 87.0], [88.0, 89.0, 90.0, 91.0], [92.0, 93.0, 94.0, 95.0]], ], [ [[24.0, 25.0, 26.0, 27.0], [28.0, 29.0, 30.0, 31.0], [32.0, 33.0, 34.0, 35.0]], [[36.0, 37.0, 38.0, 39.0], [40.0, 41.0, 42.0, 43.0], [44.0, 45.0, 46.0, 47.0]], ], [ [[48.0, 49.0, 50.0, 51.0], [52.0, 53.0, 54.0, 55.0], [56.0, 57.0, 58.0, 59.0]], [[60.0, 61.0, 62.0, 63.0], [64.0, 65.0, 66.0, 67.0], [68.0, 69.0, 70.0, 71.0]], ], ] ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_net("add", inputx, indices, updates) expected = np.array( [ [ [[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], [9.0, 10.0, 11.0, 12.0]], [[13.0, 14.0, 15.0, 16.0], [17.0, 18.0, 19.0, 20.0], [21.0, 22.0, 23.0, 24.0]], ], [ [[73.0, 74.0, 75.0, 76.0], [77.0, 78.0, 79.0, 80.0], [81.0, 82.0, 83.0, 84.0]], [[85.0, 86.0, 87.0, 88.0], [89.0, 90.0, 91.0, 92.0], [93.0, 94.0, 95.0, 96.0]], ], [ [[25.0, 26.0, 27.0, 28.0], [29.0, 30.0, 31.0, 32.0], [33.0, 34.0, 35.0, 36.0]], [[37.0, 38.0, 39.0, 40.0], [41.0, 42.0, 43.0, 44.0], [45.0, 46.0, 47.0, 48.0]], ], [ [[49.0, 50.0, 51.0, 52.0], [53.0, 54.0, 55.0, 56.0], [57.0, 58.0, 59.0, 60.0]], [[61.0, 62.0, 63.0, 64.0], [65.0, 66.0, 67.0, 68.0], [69.0, 70.0, 71.0, 72.0]], ], ] ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_net("sub", inputx, indices, updates) expected = np.array( [ [ [[1.0, 0.0, -1.0, -2.0], [-3.0, -4.0, -5.0, -6.0], [-7.0, -8.0, -9.0, -10.0]], [ [-11.0, -12.0, -13.0, -14.0], [-15.0, -16.0, -17.0, -18.0], [-19.0, -20.0, -21.0, -22.0], ], ], [ [ [-71.0, -72.0, -73.0, -74.0], [-75.0, -76.0, -77.0, -78.0], [-79.0, -80.0, -81.0, -82.0], ], [ [-83.0, -84.0, -85.0, -86.0], [-87.0, -88.0, -89.0, -90.0], [-91.0, -92.0, -93.0, -94.0], ], ], [ [ [-23.0, -24.0, -25.0, -26.0], [-27.0, -28.0, -29.0, -30.0], [-31.0, -32.0, -33.0, -34.0], ], [ [-35.0, -36.0, -37.0, -38.0], [-39.0, -40.0, -41.0, -42.0], [-43.0, -44.0, -45.0, -46.0], ], ], [ [ [-47.0, -48.0, -49.0, -50.0], [-51.0, -52.0, -53.0, -54.0], [-55.0, -56.0, -57.0, -58.0], ], [ [-59.0, -60.0, -61.0, -62.0], [-63.0, -64.0, -65.0, -66.0], [-67.0, -68.0, -69.0, -70.0], ], ], ] ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_small_float32_use_locking_false(): inputx = Tensor(np.zeros((2, 3)).astype(np.float32)) indices = Tensor(np.array([1, 0]).astype(np.int32)) updates = Tensor(np.arange(6).reshape((2, 3)).astype(np.float32)) # update output = scatter_func_use_locking_false_net("update", inputx, indices, updates) expected = np.array([[3.0, 4.0, 5.0], [0.0, 1.0, 2.0]]) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_use_locking_false_net("add", inputx, indices, updates) expected = np.array([[3.0, 4.0, 5.0], [0.0, 1.0, 2.0]]) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_use_locking_false_net("sub", inputx, indices, updates) expected = np.array([[-3.0, -4.0, -5.0], [0.0, -1.0, -2.0]]) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_input_less_than_1_float32(): inputx = Tensor( np.array( [ [0.214141, 0.415151, 0.51516], [0.876542, 0.451611, 0.55112], [0.111244, 0.633333, 0.34444], ] ).astype(np.float32) ) indices = Tensor(np.array([[[1, 0, 2], [2, 2, 0]], [[1, 0, 1], [2, 1, 2]]]).astype(np.int32)) updates = Tensor(np.arange(34, 70).reshape((2, 2, 3, 3)).astype(np.float32)) # update output = scatter_func_net("update", inputx, indices, updates) expected = np.array( [[37.0, 38.0, 39.0], [34.0, 35.0, 66.0], [67.0, 68.0, 69.0],], dtype=np.float32, ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_net("add", inputx, indices, updates) expected = np.array( [ [141.21414, 144.41515, 147.51517], [208.87654, 212.45161, 216.55112], [257.11124, 262.63333, 267.34442], ], dtype=np.float32, ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_net("sub", inputx, indices, updates) expected = np.array( [ [-140.78586, -143.58485, -146.48483], [-207.12346, -211.54839, -215.44888], [-256.88876, -261.36667, -266.65558], ], dtype=np.float32, ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_float16(): inputx = Tensor(np.zeros((2, 3)).astype(np.float16)) indices = Tensor(np.array([[0, 1], [0, 1]]).astype(np.int32)) updates = Tensor(np.arange(12).reshape((2, 2, 3)).astype(np.float16)) # update output = scatter_func_net("update", inputx, indices, updates) expected = np.array([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0]]) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_net("add", inputx, indices, updates) expected = np.array([[6.0, 8.0, 10.0], [12.0, 14.0, 16.0]]) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_net("sub", inputx, indices, updates) expected = np.array([[-6.0, -8.0, -10.0], [-12.0, -14.0, -16.0]]) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_large_float16(): inputx = Tensor(np.zeros((2, 3, 4)).astype(np.float16)) indices = Tensor(np.array([[0, 0], [1, 1]]).astype(np.int32)) updates = Tensor(np.arange(63, 111).reshape((2, 2, 3, 4)).astype(np.float16)) # update output = scatter_func_net("update", inputx, indices, updates) expected = np.array( [ [[63.0, 64.0, 65.0, 66.0], [67.0, 68.0, 69.0, 70.0], [71.0, 72.0, 73.0, 74.0],], [[99.0, 100.0, 101.0, 102.0], [103.0, 104.0, 105.0, 106.0], [95.0, 96.0, 97.0, 98.0],], ] ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_net("add", inputx, indices, updates) expected = np.array( [ [ [138.0, 140.0, 142.0, 144.0], [146.0, 148.0, 150.0, 152.0], [154.0, 156.0, 158.0, 160.0], ], [ [186.0, 188.0, 190.0, 192.0], [194.0, 196.0, 198.0, 200.0], [202.0, 204.0, 206.0, 208.0], ], ] ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_net("sub", inputx, indices, updates) expected = np.array( [ [ [-138.0, -140.0, -142.0, -144.0], [-146.0, -148.0, -150.0, -152.0], [-154.0, -156.0, -158.0, -160.0], ], [ [-186.0, -188.0, -190.0, -192.0], [-194.0, -196.0, -198.0, -200.0], [-202.0, -204.0, -206.0, -208.0], ], ] ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_disordered_float16(): inputx = Tensor(np.flip(np.arange(34, 46).reshape(3, 4).astype(np.float16))) indices = Tensor(np.array([[[0, 1, 2], [2, 1, 0]], [[0, 0, 0], [2, 2, 2]]]).astype(np.int32)) updates = Tensor(np.arange(63, 111).reshape((2, 2, 3, 4)).astype(np.float16)) # update output = scatter_func_net("update", inputx, indices, updates) expected = np.array( [[95.0, 96.0, 97.0, 98.0], [67.0, 68.0, 69.0, 70.0], [99.0, 100.0, 101.0, 102.0]] ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_net("add", inputx, indices, updates) expected = np.array( [[464.0, 468.0, 472.0, 476.0], [187.0, 188.0, 189.0, 190.0], [492.0, 496.0, 500.0, 504.0]] ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_net("sub", inputx, indices, updates) expected = np.array( [ [-374.0, -380.0, -386.0, -392.0], [-105.0, -108.0, -111.0, -114.0], [-418.0, -424.0, -430.0, -436.0], ] ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_large_int32(): inputx = Tensor(np.zeros((2, 3, 4)).astype(np.int32)) indices = Tensor(np.array([[0, 0], [1, 1]]).astype(np.int32)) updates = Tensor(np.arange(63, 111).reshape((2, 2, 3, 4)).astype(np.int32)) # update output = scatter_func_net("update", inputx, indices, updates) expected = np.array( [ [[63.0, 64.0, 65.0, 66.0], [67.0, 68.0, 69.0, 70.0], [71.0, 72.0, 73.0, 74.0],], [[99.0, 100.0, 101.0, 102.0], [103.0, 104.0, 105.0, 106.0], [95.0, 96.0, 97.0, 98.0],], ] ).astype(np.int32) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_net("add", inputx, indices, updates) expected = np.array( [ [ [138.0, 140.0, 142.0, 144.0], [146.0, 148.0, 150.0, 152.0], [154.0, 156.0, 158.0, 160.0], ], [ [186.0, 188.0, 190.0, 192.0], [194.0, 196.0, 198.0, 200.0], [202.0, 204.0, 206.0, 208.0], ], ] ).astype(np.int32) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_net("sub", inputx, indices, updates) expected = np.array( [ [ [-138.0, -140.0, -142.0, -144.0], [-146.0, -148.0, -150.0, -152.0], [-154.0, -156.0, -158.0, -160.0], ], [ [-186.0, -188.0, -190.0, -192.0], [-194.0, -196.0, -198.0, -200.0], [-202.0, -204.0, -206.0, -208.0], ], ] ).astype(np.int32) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_disordered_int32(): inputx = Tensor(np.flip(np.arange(34, 46).reshape(3, 4).astype(np.int32))) indices = Tensor(np.array([[[0, 1, 2], [2, 1, 0]], [[0, 0, 0], [2, 2, 2]]]).astype(np.int32)) updates = Tensor(np.arange(63, 111).reshape((2, 2, 3, 4)).astype(np.int32)) # update output = scatter_func_net("update", inputx, indices, updates) expected = np.array( [[95.0, 96.0, 97.0, 98.0], [67.0, 68.0, 69.0, 70.0], [99.0, 100.0, 101.0, 102.0]] ).astype(np.int32) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_net("add", inputx, indices, updates) expected = np.array( [[464.0, 468.0, 472.0, 476.0], [187.0, 188.0, 189.0, 190.0], [492.0, 496.0, 500.0, 504.0]] ).astype(np.int32) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_net("sub", inputx, indices, updates) expected = np.array( [ [-374.0, -380.0, -386.0, -392.0], [-105.0, -108.0, -111.0, -114.0], [-418.0, -424.0, -430.0, -436.0], ] ).astype(np.int32) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_disordered_dynamic_int32(): inputx = Tensor(np.flip(np.arange(34, 46).reshape(3, 4).astype(np.int32))) indices = Tensor(np.array([[[0, 1, 2], [2, 1, 0]], [[0, 0, 0], [2, 2, 2]]]).astype(np.int32)) updates = Tensor(np.arange(63, 111).reshape((2, 2, 3, 4)).astype(np.int32)) # update output = scatter_func_d_net("update", inputx, indices, updates) expected = np.array( [[95.0, 96.0, 97.0, 98.0], [67.0, 68.0, 69.0, 70.0], [99.0, 100.0, 101.0, 102.0]] ).astype(np.int32) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_d_net("add", inputx, indices, updates) expected = np.array( [[464.0, 468.0, 472.0, 476.0], [187.0, 188.0, 189.0, 190.0], [492.0, 496.0, 500.0, 504.0]] ).astype(np.int32) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_d_net("sub", inputx, indices, updates) expected = np.array( [ [-374.0, -380.0, -386.0, -392.0], [-105.0, -108.0, -111.0, -114.0], [-418.0, -424.0, -430.0, -436.0], ] ).astype(np.int32) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_disordered_dynamic_int8(): inputx = Tensor(np.flip(np.arange(34, 46).reshape(3, 4).astype(np.int8))) indices = Tensor(np.array([[[0, 1, 2], [2, 1, 0]], [[0, 0, 0], [2, 2, 2]]]).astype(np.int32)) updates = Tensor(np.arange(63, 111).reshape((2, 2, 3, 4)).astype(np.int8)) # update output = scatter_func_d_net("update", inputx, indices, updates) expected = np.array( [[95.0, 96.0, 97.0, 98.0], [67.0, 68.0, 69.0, 70.0], [99.0, 100.0, 101.0, 102.0]] ).astype(np.int8) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_d_net("add", inputx, indices, updates) expected = np.array( [[464.0, 468.0, 472.0, 476.0], [187.0, 188.0, 189.0, 190.0], [492.0, 496.0, 500.0, 504.0]] ).astype(np.int8) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_d_net("sub", inputx, indices, updates) expected = np.array( [ [-118.0, -124.0, 126.0, 120.0], [-105.0, -108.0, -111.0, -114.0], [94.0, 88.0, 82.0, 76.0], ] ).astype(np.int8) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_disordered_dynamic_uint8(): inputx = Tensor(np.flip(np.arange(34, 46).reshape(3, 4).astype(np.uint8))) indices = Tensor(np.array([[[0, 1, 2], [2, 1, 0]], [[0, 0, 0], [2, 2, 2]]]).astype(np.int32)) updates = Tensor(np.arange(63, 111).reshape((2, 2, 3, 4)).astype(np.uint8)) # update output = scatter_func_d_net("update", inputx, indices, updates) expected = np.array( [[95.0, 96.0, 97.0, 98.0], [67.0, 68.0, 69.0, 70.0], [99.0, 100.0, 101.0, 102.0]] ).astype(np.uint8) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_d_net("add", inputx, indices, updates) expected = np.array( [[464.0, 468.0, 472.0, 476.0], [187.0, 188.0, 189.0, 190.0], [492.0, 496.0, 500.0, 504.0]] ).astype(np.uint8) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_d_net("sub", inputx, indices, updates) expected = np.array( [[138.0, 132.0, 126.0, 120.0], [151.0, 148.0, 145.0, 142.0], [94.0, 88.0, 82.0, 76.0]] ).astype(np.uint8) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_input_less_than_1_dynamic_float32(): inputx = Tensor( np.array( [ [0.214141, 0.415151, 0.51516], [0.876542, 0.451611, 0.55112], [0.111244, 0.633333, 0.34444], ] ).astype(np.float32) ) indices = Tensor(np.array([[[1, 0, 2], [2, 2, 0]], [[1, 0, 1], [2, 1, 2]]]).astype(np.int32)) updates = Tensor(np.arange(34, 70).reshape((2, 2, 3, 3)).astype(np.float32)) # update output = scatter_func_d_net("update", inputx, indices, updates) expected = np.array( [[37.0, 38.0, 39.0], [34.0, 35.0, 66.0], [67.0, 68.0, 69.0],], dtype=np.float32, ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # add output = scatter_func_d_net("add", inputx, indices, updates) expected = np.array( [ [141.21414, 144.41515, 147.51517], [208.87654, 212.45161, 216.55112], [257.11124, 262.63333, 267.34442], ], dtype=np.float32, ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) # sub output = scatter_func_d_net("sub", inputx, indices, updates) expected = np.array( [ [-140.78586, -143.58485, -146.48483], [-207.12346, -211.54839, -215.44888], [-256.88876, -261.36667, -266.65558], ], dtype=np.float32, ) np.testing.assert_array_almost_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_scatter_func_dynamic_two_inputs(): inputx = Tensor(np.zeros((2, 3)).astype(np.float32)) indices_1 = Tensor(np.array([[0, 1], [0, 1]]).astype(np.int32)) updates_1 = Tensor(np.arange(12).reshape((2, 2, 3)).astype(np.float32)) indices_2 = Tensor(np.array([[0, 0], [1, 1], [1, 0]]).astype(np.int32)) updates_2 = Tensor(np.flip(np.arange(18).reshape((3, 2, 3)).astype(np.float32))) # update output_1, output_2 = scatter_func_d2_net( "update", inputx, indices_1, updates_1, indices_2, updates_2 ) expected_1 = np.array([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0]]) expected_2 = np.array([[17.0, 16.0, 15.0], [11.0, 10.0, 9.0]]) np.testing.assert_array_almost_equal(output_1.asnumpy(), expected_1) np.testing.assert_array_almost_equal(output_2.asnumpy(), expected_2) # add output_1, output_2 = scatter_func_d2_net( "add", inputx, indices_1, updates_1, indices_2, updates_2 ) expected_1 = np.array([[6.0, 8.0, 10.0], [12.0, 14.0, 16.0]]) expected_2 = np.array([[39.0, 38.0, 37.0], [36.0, 35.0, 34.0]]) np.testing.assert_array_almost_equal(output_1.asnumpy(), expected_1) np.testing.assert_array_almost_equal(output_2.asnumpy(), expected_2) # sub output_1, output_2 = scatter_func_d2_net( "sub", inputx, indices_1, updates_1, indices_2, updates_2 ) expected_1 = np.array([[-6.0, -8.0, -10.0], [-12.0, -14.0, -16.0]]) expected_2 = np.array([[-39.0, -38.0, -37.0], [-36.0, -35.0, -34.0]]) np.testing.assert_array_almost_equal(output_1.asnumpy(), expected_1) np.testing.assert_array_almost_equal(output_2.asnumpy(), expected_2)