# 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 Converter""" from mindinsight.mindconverter.converter import Converter from mindinsight.mindconverter.config import NN_MAPPING class TestConverter: """Test Converter""" converter_ins = Converter() # test convert_api with nn ops def test_convert_api_nn_layernorm(self): """Test convert_api function work ok when convert api nn.LayerNorm""" code = "nn.LayerNorm((5, 10, 10), elementwise_affine=False)" api_name = 'nn.LayerNorm' layer_norm_info = NN_MAPPING.get(api_name) expected_ms_api_name = 'nn.LayerNorm' epsilon = layer_norm_info.pt_api.params.get('eps') replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('nn.LayerNorm((5, 10, 10), elementwise_affine=False)', '{}(normalized_shape=(5, 10, 10), epsilon={})'.format( expected_ms_api_name, epsilon)) def test_convert_api_nn_leaky_relu(self): """Test convert_api function work ok when convert api nn.LeakyReLU""" code = "nn.LeakyReLU(0.3)" expected_ms_api_name = 'nn.LeakyReLU' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('nn.LeakyReLU(0.3)', '{}(alpha=0.3)'.format(expected_ms_api_name)) def test_convert_api_nn_prelu(self): """Test convert_api function work ok when convert api nn.PReLU""" code = "nn.PReLU()(input)" expected_ms_api_name = 'nn.PReLU' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('nn.PReLU()(input)', '{}()(input)'.format(expected_ms_api_name)) def test_convert_api_nn_softmax(self): """Test convert_api function work ok when convert api nn.Softmax""" code = "nn.Softmax(dim=1)" expected_ms_api_name = 'nn.Softmax' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('nn.Softmax(dim=1)', '{}(axis=1)'.format(expected_ms_api_name)) def test_convert_api_nn_dropout(self): """Test convert_api function work ok when convert api nn.Dropout""" code = """nn.Dropout(0.3)""" expected_ms_api_name = 'nn.Dropout' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('nn.Dropout(0.3)', "{}(keep_prob=0.7)".format(expected_ms_api_name)) # test convert_api with torch dot ops def test_convert_api_torch_dot_abs(self): """Test convert_api function work ok when convert api torch.abs""" code = "torch.abs(input)" expected_ms_api_name = 'P.Abs' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.abs(input)', '{}()(input)'.format(expected_ms_api_name)) def test_convert_api_torch_dot_acos(self): """Test convert_api function work ok when convert api torch.acos""" code = "torch.acos(input)" expected_ms_api_name = 'P.ACos' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.acos(input)', '{}()(input)'.format(expected_ms_api_name)) def test_convert_api_torch_dot_cos(self): """Test convert_api function work ok when convert api torch.cos""" code = "torch.cos(input)" expected_ms_api_name = 'P.Cos' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.cos(input)', '{}()(input)'.format(expected_ms_api_name)) def test_convert_api_torch_dot_exp(self): """Test convert_api function work ok when convert api torch.exp""" code = "torch.exp(input)" expected_ms_api_name = 'P.Exp' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.exp(input)', '{}()(input)'.format(expected_ms_api_name)) def test_convert_api_torch_dot_log(self): """Test convert_api function work ok when convert api torch.log""" code = "torch.log(input)" expected_ms_api_name = 'P.Log' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.log(input)', '{}()(input)'.format(expected_ms_api_name)) def test_convert_api_torch_dot_pow(self): """Test convert_api function work ok when convert api torch.pow""" code = "torch.pow(a, exp)" expected_ms_api_name = 'P.Pow' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.pow(a, exp)', '{}()(a, exp)'.format(expected_ms_api_name)) def test_convert_api_torch_dot_div(self): """Test convert_api function work ok when convert api torch.div""" code = "torch.div(input, other)" expected_ms_api_name = 'P.Div' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.div(input, other)', '{}()(input, other)'.format(expected_ms_api_name)) def test_convert_api_torch_dot_sin(self): """Test convert_api function work ok when convert api torch.sin""" code = "torch.sin(input)" expected_ms_api_name = 'P.Sin' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.sin(input)', '{}()(input)'.format(expected_ms_api_name)) def test_convert_api_torch_dot_sqrt(self): """Test convert_api function work ok when convert api torch.sqrt""" code = "torch.sqrt(input)" expected_ms_api_name = 'P.Sqrt' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.sqrt(input)', '{}()(input)'.format(expected_ms_api_name)) def test_convert_api_torch_dot_eye_with_n(self): """Test convert_api function work ok when convert api torch.eye""" code = "torch.eye(3)" expected_ms_api_name = 'P.Eye' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.eye(3)', '{}()(3, 3, mindspore.int32)'.format(expected_ms_api_name)) def test_convert_api_torch_dot_eye_with_m(self): """Test convert_api function work ok when convert api torch.eye""" code = "torch.eye(3, 4)" expected_ms_api_name = 'P.Eye' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.eye(3, 4)', '{}()(3, 4, mindspore.int32)'.format(expected_ms_api_name)) def test_convert_api_torch_dot_add_with_alpha_default(self): """Test convert_api function work ok when convert api torch.add""" code = "torch.add(input, value)" expected_ms_api_name = 'P.TensorAdd' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.add(input, value)', '{}()(input, value)'.format(expected_ms_api_name)) def test_convert_api_torch_dot_add_with_alpha_not_default(self): """Test convert_api function work ok when convert api torch.add""" code = "torch.add(input, value, 3)" expected_ms_api_name = 'P.TensorAdd' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('torch.add(input, value, 3)', '{}()(input, value*3)'.format(expected_ms_api_name)) # test convert_api with F ops def test_convert_api_f_normalize(self): """Test convert_api function work ok when convert api F.normalize""" code = "F.normalize(input)" expected_ms_api_name = 'P.L2Normalize' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('F.normalize(input)', '{}(1, 1e-12)(input)'.format(expected_ms_api_name)) def test_convert_api_f_sigmoid(self): """Test convert_api function work ok when convert api F.sigmoid""" code = "F.sigmoid(input)" expected_ms_api_name = 'P.Sigmoid' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('F.sigmoid(input)', '{}()(input)'.format(expected_ms_api_name)) def test_convert_api_f_max_pool2d(self): """Test convert_api function work ok when convert api F.max_pool2d""" code = """F.max_pool2d(out, 2)""" expected_ms_api_name = 'P.MaxPool' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('F.max_pool2d(out, 2)', "{}(2, 2, 'valid')(out)".format(expected_ms_api_name)) def test_convert_api_f_avg_pool2d_without_strides(self): """Test convert_api function work ok when convert api F.avg_pool2d""" code = """F.avg_pool2d(out, 2)""" expected_ms_api_name = 'P.AvgPool' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('F.avg_pool2d(out, 2)', "{}(2, 2, 'valid')(out)".format(expected_ms_api_name)) def test_convert_api_f_avg_pool2d_with_strides(self): """Test convert_api function work ok when convert api F.avg_pool2d""" code = """F.avg_pool2d(out, 2, 3)""" expected_ms_api_name = 'P.AvgPool' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('F.avg_pool2d(out, 2, 3)', "{}(2, 3, 'valid')(out)".format(expected_ms_api_name)) # test convert_api with tensor dot ops def test_convert_api_tensor_dot_repeat(self): """Test convert_api function work ok when convert api .repeat""" code = "x.repeat(4, 2)" expected_ms_api_name = 'P.Tile' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('x.repeat(4, 2)', '{}()(x, {})'.format(expected_ms_api_name, '(4, 2,)')) def test_convert_api_tensor_dot_permute(self): """Test convert_api function work ok when convert api .permute""" code = "x.permute(2, 0, 1)" expected_ms_api_name = 'P.Transpose' replaced_code = self.converter_ins.convert_api(code) assert replaced_code == code.replace('x.permute(2, 0, 1)', '{}()(x, (2, 0, 1,))'.format(expected_ms_api_name))