|
- # Copyright 2020 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.
- # ============================================================================
- """ test control ops """
- import os
- import numpy as np
- import pytest
-
- import mindspore as ms
- from mindspore import Tensor
- from mindspore import context
- from mindspore import nn
- from mindspore.common import dtype as mstype
- from mindspore.ops import composite as C
- from mindspore.ops import operations as P
- from mindspore.common.parameter import Parameter
-
- context.set_context(mode=context.GRAPH_MODE)
-
- grad_by_list = C.GradOperation(get_by_list=True)
- grad_all = C.GradOperation(get_all=True)
- grad_all_with_sens = C.GradOperation(get_all=True, sens_param=True)
-
-
- def if_compile_test(x_init, y_init):
- """
- Feature: if compile test.
- Description: if compile test
- Expectation: compile done without error.
- """
- class Net(nn.Cell):
- def __init__(self):
- """"""
- super(Net, self).__init__()
- self.square = P.Square()
- self.add = P.Add()
- self.value = Tensor(3, dtype=ms.float32)
- self.switch = P.GeSwitch()
- self.merge = P.Merge()
- self.less = P.Less()
-
- def construct(self, x, y):
- cond = self.less(x, y)
- ret = self.value
- if cond:
- ret = self.add(x, ret)
- ret = self.add(y, ret)
- else:
- ret = self.square(self.value)
- return ret
-
- x = Tensor(x_init, dtype=ms.float32)
- y = Tensor(y_init, dtype=ms.float32)
- net = Net()
- output = net(x, y)
- return output
-
-
- def test_if_nested_compile():
- """
- Feature: if nested compile test.
- Description: if nested compile test
- Expectation: compile done without error.
- """
- class Net(nn.Cell):
- def __init__(self, auto_prefix=True):
- """"""
- super().__init__(auto_prefix=auto_prefix)
- self.squre = P.Square()
- self.value = Tensor(3, dtype=ms.float32)
-
- def construct(self, x, y):
- res = self.value
- if x <= y:
- res = x + res
- res = y + res
- else:
- if x == y:
- res = self.squre(self.value * y)
- else:
- res = self.squre(self.value)
- return res
-
- x = Tensor(1.0, dtype=ms.float32)
- y = Tensor(2.0, dtype=ms.float32)
- net = Net()
- net(x, y)
-
-
- def test_if_inside_for():
- """
- Feature: if inside test.
- Description: if inside test
- Expectation: compile done without error.
- """
- class Net(nn.Cell):
- def __init__(self, auto_prefix=True):
- """"""
- super().__init__(auto_prefix=auto_prefix)
- self.squre = P.Square()
- self.value = Tensor(3, dtype=ms.float32)
- self.count = 4
-
- def construct(self, x, y):
- res = 0
- for i in range(self.count):
- if i == x:
- res = res + x
- else:
- res = res - y
- return res
-
- c1 = Tensor(1, dtype=ms.int32)
- c2 = Tensor(1, dtype=ms.int32)
- net = Net()
- net(c1, c2)
-
-
- def test_while_with_weight_in_condition():
- """
- Feature: while with weight in condition test.
- Description: while with weight in condition test
- Expectation: compile done without error.
- """
- class Net(nn.Cell):
- def __init__(self):
- """"""
- super(Net, self).__init__()
- self.loop = Parameter(Tensor(1, dtype=ms.float32), name="loop")
-
- def construct(self, x):
- while self.loop < 5:
- self.loop += 1
- x += 1
- return x
-
- net = Net()
- x = Tensor(-1, dtype=ms.float32)
- grad_all(net)(x)
-
-
- def test_while_add():
- """
- Feature: while add test.
- Description: while add test
- Expectation: compile done without error.
- """
- class Net(nn.Cell):
- def __init__(self, data):
- """"""
- super(Net, self).__init__()
- self.start = Tensor(0, dtype=mstype.int32)
- self.end = Tensor(2, dtype=mstype.int32)
- self.out = Tensor(np.zeros([2, 3], dtype=np.float32))
- self.add = P.Add()
-
- def construct(self, inputs):
- idx = self.start
- end = self.end
- out = self.out
- while idx < end:
- xi = inputs[idx, :, :]
- out = self.add(out, xi)
- idx = idx + 1
- return out
-
- x = Tensor(np.arange(10 * 2 * 3).reshape(10, 2, 3).astype(np.float32))
- net = Net(x)
- net(x)
-
-
- def test_tensor_all_construct_lack_branch():
- """
- Feature: tensor all construct lack test.
- Description: tensor all construct lack test
- Expectation: compile done without error.
- """
- class NetConditionLackBranch(nn.Cell):
- def __init__(self):
- """"""
- super(NetConditionLackBranch, self).__init__()
- self.logicaland = P.LogicalAnd()
- self.logicalor = P.LogicalOr()
-
- def construct(self, input1, input2):
- if input1.all():
- return self.logicaland(input1, input2)
- while input1.any():
- return self.logicalor(input1, input2)
- # NOTICE: here missing return statement, default return None
-
- input_np_1 = np.random.choice([True], size=(2, 3, 4, 5))
- input_tensor_1 = Tensor(input_np_1)
- input_np_2 = np.random.choice([True, False], size=(2, 3, 4, 5))
- input_tensor_2 = Tensor(input_np_2)
- net = NetConditionLackBranch()
- with pytest.raises(Exception):
- net(input_tensor_1, input_tensor_2)
-
-
- def test_parser_switch_layer_func_primitive():
- """
- Feature: parser switch layer func primitive test.
- Description: parser switch layer func primitive test
- Expectation: compile done without error.
- """
- class FinalNet(nn.Cell):
- def __init__(self, funcs):
- """"""
- super().__init__()
- self.funcs = funcs
-
- def construct(self, i, input1):
- x = self.funcs[i](input1)
- return x
-
- func1 = P.ReLU()
- func2 = P.Softmax()
- funcs = (func1, func2)
- net = FinalNet(funcs)
-
- input1 = Tensor(np.random.randn(2, 3, 4, 5).astype(np.float32))
- i = Tensor(1, mstype.int32)
-
- with pytest.raises(ValueError):
- net(i, input1)
-
-
- def test_large_for_loop():
- """
- Feature: large for loop test.
- Description: large for loop test
- Expectation: compile done without error.
- """
- class Net(nn.Cell):
- def __init__(self):
- """"""
- super(Net, self).__init__()
- self.flatten = P.ReLU() # nn.Flatten()
-
- def construct(self, x):
- for elem in range(1, 1900):
- x = self.flatten(x + elem)
- return x
-
- t = Tensor(np.ones([2, 3], dtype=np.float32))
- net = Net()
- os.environ['MS_DEV_RECURSIVE_EVAL'] = '1'
- old_max_call_depth = context.get_context('max_call_depth')
- context.set_context(max_call_depth=60)
- with pytest.raises(RuntimeError) as err:
- net(t)
- context.set_context(max_call_depth=old_max_call_depth)
- os.environ['MS_DEV_RECURSIVE_EVAL'] = '0'
- assert 'Exceed function call depth limit 60' in str(err.value)
-
-
- def test_large_for_loop_with_continue_break():
- """
- Feature: large for loop with continue break test.
- Description: large for loop with continue break test
- Expectation: compile done without error.
- """
- class Net(nn.Cell):
- def __init__(self):
- """"""
- super(Net, self).__init__()
- self.flatten = P.ReLU() # nn.Flatten()
-
- def construct(self, x):
- idx = 0
- for elem1 in range(200):
- idx = idx + 1
- if idx < 10:
- x = x + 0.5
- continue
- if idx > 500:
- break
- x = self.flatten(x + elem1)
- return x
-
- os.environ['MS_DEV_RECURSIVE_EVAL'] = '1'
- old_max_call_depth = context.get_context('max_call_depth')
- context.set_context(max_call_depth=2000)
- t = Tensor(np.ones([2, 3], dtype=np.float32))
- net = Net()
- net(t)
- os.environ['MS_DEV_RECURSIVE_EVAL'] = '0'
- context.set_context(max_call_depth=old_max_call_depth)
-
-
- def test_recursive_call():
- """
- Feature: recursive call test.
- Description: recursive call test
- Expectation: compile done without error.
- """
- class Net(nn.Cell):
- """ Net definition """
- def __init__(self):
- """"""
- super(Net, self).__init__()
- self.fc = nn.Dense(10, 10) # padding=0
- # self.net2 = Net2()
-
- def construct(self, x):
- net2 = Net2()
- x = net2(x)
- out = self.fc(x)
- return out
-
- class Net2(nn.Cell):
- def __init__(self):
- super(Net2, self).__init__()
- self.net = Net()
- self.fc = nn.Dense(10, 10)
-
- def construct(self, x):
- x = self.net(x)
- out = self.fc(x)
- return out
-
- context.set_context(mode=context.GRAPH_MODE)
- os.environ['MS_DEV_RECURSIVE_EVAL'] = '1'
- old_max_call_depth = context.get_context('max_call_depth')
- context.set_context(max_call_depth=80)
- input_data = Tensor(np.identity(10).astype(np.float32))
- net = Net2()
- with pytest.raises(RuntimeError):
- net(input_data)
- os.environ['MS_DEV_RECURSIVE_EVAL'] = '0'
- context.set_context(max_call_depth=old_max_call_depth)
-
-
- def test_pow():
- """
- Feature: pow test.
- Description: pow test
- Expectation: compile done without error.
- """
- input_tensor = Tensor(np.array([[2, 2], [3, 3]]))
- power = Tensor(np.array(3.0, np.int64))
- testpow = P.Pow()
- expect = np.array([[8, 8], [27, 27]])
- result = testpow(input_tensor, power)
- assert np.all(result.asnumpy() == expect)
-
-
- def test_pow1():
- """
- Feature: pow one test.
- Description: pow one test
- Expectation: compile done without error.
- """
- input_tensor = Tensor(np.array([[2, 2], [2, 2]]))
- power = Tensor(np.array(3.0, np.int64))
- testpow = P.Pow()
- expect = np.array([[8, 8], [8, 8]])
- result = testpow(input_tensor, power)
- assert np.all(result.asnumpy() == expect)
-
-
- def test_pow2():
- """
- Feature: pow two test.
- Description: pow two test
- Expectation: compile done without error.
- """
- input_tensor = Tensor(np.array([[1, 1], [2, 2]]))
- power = Tensor(np.array(3.0, np.int64))
- testpow = P.Pow()
- expect = np.array([[1, 1], [8, 8]])
- result = testpow(input_tensor, power)
- assert np.all(result.asnumpy() == expect)
-
-
- def test_pow3():
- """
- Feature: pow three test.
- Description: pow three test
- Expectation: compile done without error.
- """
- input_tensor = Tensor(np.array([[2, 2], [1, 1]]))
- power = Tensor(np.array(3.0, np.int64))
- testpow = P.Pow()
- expect = np.array([[8, 8], [1, 1]])
- result = testpow(input_tensor, power)
- assert np.all(result.asnumpy() == expect)
-
-
- def test_exp():
- """
- Feature: exp test.
- Description: exp test
- Expectation: compile done without error.
- """
- input_tensor = Tensor(np.array([[2, 2], [3, 3]]))
- testexp = P.Exp()
- result = testexp(input_tensor)
- expect = np.exp(np.array([[2, 2], [3, 3]]))
- assert np.all(result.asnumpy() == expect)
-
-
- def test_exp1():
- """
- Feature: exp one test.
- Description: exp one test
- Expectation: compile done without error.
- """
- input_tensor = Tensor(np.array([[2, 2], [3, 3]]))
- testexp = P.Exp()
- result = testexp(input_tensor)
- expect = np.exp(np.array([[2, 2], [3, 3]]))
- assert np.all(result.asnumpy() == expect)
-
-
- def test_realdiv():
- """
- Feature: realdiv test.
- Description: realdiv test
- Expectation: compile done without error.
- """
- x = Tensor(2048.0)
- y = Tensor(128.0)
- div = P.RealDiv()
- result = div(x, y)
- x = x.asnumpy()
- y = y.asnumpy()
- expect = x / y
- assert np.all(result.asnumpy() == expect)
-
-
- def test_realdiv1():
- """
- Feature: realdiv one test.
- Description: realdiv one test
- Expectation: compile done without error.
- """
- x = Tensor(256.0)
- y = Tensor(128.0)
- div = P.RealDiv()
- result = div(x, y)
- x = x.asnumpy()
- y = y.asnumpy()
- expect = x / y
- assert np.all(result.asnumpy() == expect)
-
-
- def test_eye():
- """
- Feature: eye test.
- Description: eye test
- Expectation: compile done without error.
- """
- x = np.arange(3)
- expect = np.ones_like(x)
- expect = np.diag(expect)
- eye = P.Eye()
- eye_output = eye(3, 3, ms.float32)
- assert np.all(eye_output.asnumpy() == expect)
-
-
- def test_sub():
- """
- Feature: sub test.
- Description: sub test
- Expectation: compile done without error.
- """
- input_x = Tensor(np.ones(shape=[3]))
- input_y = Tensor(np.zeros(shape=[3]))
-
- sub = P.Sub()
- result = sub(input_x, input_y)
- expect = np.ones(shape=[3])
- assert np.all(result.asnumpy() == expect)
-
-
- def test_square():
- """
- Feature: square test.
- Description: square test
- Expectation: compile done without error.
- """
- input_tensor = Tensor(np.array([[1, 2, 3], [4, 5, 6]]))
- square = P.Square()
- result = square(input_tensor)
- expect = np.array([[1, 4, 9], [16, 25, 36]])
- assert np.all(result.asnumpy() == expect)
-
-
- def test_sqrt():
- """
- Feature: sqrt test.
- Description: sqrt test
- Expectation: compile done without error.
- """
- input_tensor = Tensor(np.array([[4, 4], [9, 9]]))
-
- sqrt = P.Sqrt()
- expect = np.array([[2, 2], [3, 3]])
- result = sqrt(input_tensor)
- assert np.all(result.asnumpy() == expect)
|