1# Copyright 2021 Huawei Technologies Co., Ltd 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14# ============================================================================ 15import numpy as np 16import pytest 17 18import mindspore.common.dtype as mstype 19import mindspore.context as context 20import mindspore.nn as nn 21from mindspore import Tensor 22from mindspore.ops import operations as P 23 24context.set_context(mode=context.GRAPH_MODE, device_target="GPU") 25 26 27class RangeNet(nn.Cell): 28 def __init__(self, maxlen=50): 29 super(RangeNet, self).__init__() 30 self.range = P.Range(maxlen) 31 32 def construct(self, start, limit, delta): 33 return self.range(start, limit, delta) 34 35 36@pytest.mark.level0 37@pytest.mark.platform_x86_gpu_training 38@pytest.mark.env_onecard 39def test_range_precision_end_equals_last_element(): 40 range_net = RangeNet(100) 41 ms_out = range_net(Tensor(1000.04, mstype.float32), 42 Tensor(1001.04, mstype.float32), 43 Tensor(0.01, mstype.float32)).asnumpy() 44 np_expected = np.arange(1000.04, 1001.04, 0.01, dtype=np.float32) 45 np.testing.assert_allclose(ms_out, np_expected, rtol=1e-5) 46 47 range_net = RangeNet(1000) 48 ms_out = range_net(Tensor(100, mstype.float32), 49 Tensor(101, mstype.float32), 50 Tensor(0.001, mstype.float32)).asnumpy() 51 np_expected = np.arange(100, 101, 0.001, dtype=np.float32) 52 np.testing.assert_allclose(ms_out, np_expected, rtol=1e-5) 53 54 range_net = RangeNet(799900) 55 ms_out = range_net(Tensor(1, mstype.float32), 56 Tensor(8000, mstype.float32), 57 Tensor(0.01, mstype.float32)).asnumpy() 58 np_expected = np.arange(1, 8000, 0.01, dtype=np.float32) 59 np.testing.assert_allclose(ms_out, np_expected, rtol=1e-5) 60 61 range_net = RangeNet(53) 62 ms_out = range_net(Tensor(-12000, mstype.float32), 63 Tensor(-12053, mstype.float32), 64 Tensor(-1, mstype.float32)).asnumpy() 65 np_expected = np.arange(-12000, -12053, -1, dtype=np.float32) 66 np.testing.assert_allclose(ms_out, np_expected, rtol=1e-5) 67 68@pytest.mark.level0 69@pytest.mark.platform_x86_gpu_training 70@pytest.mark.env_onecard 71def test_range_int(): 72 range_net = RangeNet() 73 ms_out = range_net(Tensor(2, mstype.int32), Tensor(5, mstype.int32), Tensor(1, mstype.int32)).asnumpy() 74 np_expected = np.array([2, 3, 4]) 75 np.testing.assert_array_equal(ms_out, np_expected) 76 77 range_net = RangeNet() 78 ms_out = range_net(Tensor(-24, mstype.int32), Tensor(1, mstype.int32), Tensor(4, mstype.int32)).asnumpy() 79 np_expected = np.array([-24, -20, -16, -12, -8, -4, 0]) 80 np.testing.assert_array_equal(ms_out, np_expected) 81 82 range_net = RangeNet() 83 ms_out = range_net(Tensor(8, mstype.int32), Tensor(1, mstype.int32), Tensor(-1, mstype.int32)).asnumpy() 84 np_expected = np.array([8, 7, 6, 5, 4, 3, 2]) 85 np.testing.assert_array_equal(ms_out, np_expected) 86 87 range_net = RangeNet() 88 ms_out = range_net(Tensor(3, mstype.int32), Tensor(-11, mstype.int32), Tensor(-5, mstype.int32)).asnumpy() 89 np_expected = np.array([3, -2, -7]) 90 np.testing.assert_array_equal(ms_out, np_expected) 91 92@pytest.mark.level0 93@pytest.mark.platform_x86_gpu_training 94@pytest.mark.env_onecard 95def test_range_float(): 96 range_net = RangeNet() 97 ms_out = range_net(Tensor(2.3, mstype.float32), Tensor(5.5, mstype.float32), Tensor(1.2, mstype.float32)).asnumpy() 98 np_expected = np.array([2.3, 3.5, 4.7]) 99 np.testing.assert_array_almost_equal(ms_out, np_expected) 100 101 range_net = RangeNet() 102 ms_out = range_net(Tensor(-4, mstype.float32), Tensor(-1, mstype.float32), Tensor(1.5, mstype.float32)).asnumpy() 103 np_expected = np.array([-4.0, -2.5]) 104 np.testing.assert_array_almost_equal(ms_out, np_expected) 105 106 range_net = RangeNet() 107 ms_out = range_net(Tensor(8.0, mstype.float32), Tensor(1.0, mstype.float32), Tensor(-1.0, mstype.float32)).asnumpy() 108 np_expected = np.array([8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0]) 109 np.testing.assert_array_almost_equal(ms_out, np_expected) 110 111 range_net = RangeNet() 112 ms_out = range_net(Tensor(1.5, mstype.float32), Tensor(-1, mstype.float32), Tensor(-18.9, mstype.float32)).asnumpy() 113 np_expected = np.array([1.5]) 114 np.testing.assert_array_almost_equal(ms_out, np_expected) 115 116@pytest.mark.level0 117@pytest.mark.platform_x86_gpu_training 118@pytest.mark.env_onecard 119def test_range_invalid_max_output_length(): 120 with pytest.raises(ValueError): 121 _ = P.Range(0) 122 _ = P.Range(-1) 123 _ = P.Range(None) 124 _ = P.Range('5') 125 126@pytest.mark.level0 127@pytest.mark.platform_x86_gpu_training 128@pytest.mark.env_onecard 129def test_range_invalid_input(): 130 with pytest.raises(RuntimeError) as info: 131 range_net = RangeNet() 132 _ = range_net(Tensor(0, mstype.int32), Tensor(5, mstype.int32), Tensor(0, mstype.int32)).asnumpy() 133 assert "delta cannot be equal to zero" in str(info.value) 134 135 with pytest.raises(RuntimeError) as info: 136 range_net = RangeNet(2) 137 _ = range_net(Tensor(2, mstype.int32), Tensor(5, mstype.int32), Tensor(1, mstype.int32)).asnumpy() 138 assert "number of elements in the output exceeds maxlen" in str(info.value) 139 140 with pytest.raises(RuntimeError) as info: 141 range_net = RangeNet() 142 _ = range_net(Tensor(20, mstype.int32), Tensor(5, mstype.int32), Tensor(1, mstype.int32)).asnumpy() 143 assert "delta cannot be positive when limit < start" in str(info.value) 144 145 with pytest.raises(RuntimeError) as info: 146 range_net = RangeNet() 147 _ = range_net(Tensor(2, mstype.int32), Tensor(5, mstype.int32), Tensor(-4, mstype.int32)).asnumpy() 148 assert "delta cannot be negative when limit > start" in str(info.value) 149