import pytest import numpy as np import mindspore.context as context import mindspore.nn as nn from mindspore import Tensor from mindspore.common.api import ms_function from mindspore.ops import operations as P class Net(nn.Cell): def __init__(self, seq_dim, batch_dim): super(Net, self).__init__() self.reverse_sequence = P.ReverseSequence( seq_dim=seq_dim, batch_dim=batch_dim) @ms_function def construct(self, x, seq_lengths): return self.reverse_sequence(x, seq_lengths) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_net_int8(): context.set_context(mode=context.GRAPH_MODE, device_target="GPU") x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]).astype(np.int8) seq_lengths = np.array([1, 2, 3]).astype(np.int32) seq_dim = 0 batch_dim = 1 net = Net(seq_dim, batch_dim) output = net(Tensor(x), Tensor(seq_lengths)) expected = np.array([[1, 5, 9], [4, 2, 6], [7, 8, 3]]).astype(np.int8) assert np.array_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_net_int32(): context.set_context(mode=context.PYNATIVE_MODE, device_target="GPU") x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]).astype(np.int32) seq_lengths = np.array([1, 2, 3]).astype(np.int64) seq_dim = 1 batch_dim = 0 net = Net(seq_dim, batch_dim) output = net(Tensor(x), Tensor(seq_lengths)) expected = np.array([[1, 2, 3], [5, 4, 6], [9, 8, 7]]).astype(np.int32) assert np.array_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_net_float32(): context.set_context(mode=context.GRAPH_MODE, device_target="GPU") x = 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, 28]], [[29, 30], [31, 21]]]]).astype(np.float32) seq_lengths = np.array([2, 2, 2, 2]).astype(np.int64) seq_dim = 0 batch_dim = 1 net = Net(seq_dim, batch_dim) output = net(Tensor(x), Tensor(seq_lengths)) expected = np.array([[[[17., 18.], [19., 20.]], [[21., 22.], [23., 24.]], [[25., 26.], [27., 28.]], [[29., 30.], [31., 21.]]], [[[1., 2.], [3., 4.]], [[5., 6.], [7., 8.]], [[9., 10.], [11., 12.]], [[13., 14.], [15., 16.]]]]).astype(np.float32) assert np.array_equal(output.asnumpy(), expected) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_net_float64_0_dim(): """ Test added to test for 0 seq len edge case """ context.set_context(mode=context.GRAPH_MODE, device_target="GPU") x = 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, 28]], [[29, 30], [31, 21]]]]).astype(np.float32) seq_lengths = np.array([2, 2, 0, 0]).astype(np.int64) seq_dim = 2 batch_dim = 1 net = Net(seq_dim, batch_dim) output = net(Tensor(x), Tensor(seq_lengths)) expected = np.array([[[[3., 4.], [1., 2.]], [[7., 8.], [5., 6.]], [[9., 10.], [11., 12.]], [[13., 14.], [15., 16.]]], [[[19., 20.], [17., 18.]], [[23., 24.], [21., 22.]], [[25., 26.], [27., 28.]], [[29., 30.], [31., 21.]]]]).astype(np.float32) assert np.array_equal(output.asnumpy(), expected)