| # Copyright © 2021 Arm Ltd and Contributors. All rights reserved. | |
| # SPDX-License-Identifier: MIT | |
| import pytest | |
| from pyarmnn import BackendOptions, BackendOption, BackendId, OptimizerOptions, ShapeInferenceMethod_InferAndValidate | |
| @pytest.mark.parametrize("data", (True, -100, 128, 0.12345, 'string')) | |
| def test_backend_option_ctor(data): | |
| bo = BackendOption("name", data) | |
| assert "name" == bo.GetName() | |
| def test_backend_options_ctor(): | |
| backend_id = BackendId('a') | |
| bos = BackendOptions(backend_id) | |
| assert 'a' == str(bos.GetBackendId()) | |
| another_bos = BackendOptions(bos) | |
| assert 'a' == str(another_bos.GetBackendId()) | |
| def test_backend_options_add(): | |
| backend_id = BackendId('a') | |
| bos = BackendOptions(backend_id) | |
| bo = BackendOption("name", 1) | |
| bos.AddOption(bo) | |
| assert 1 == bos.GetOptionCount() | |
| assert 1 == len(bos) | |
| assert 'name' == bos[0].GetName() | |
| assert 'name' == bos.GetOption(0).GetName() | |
| for option in bos: | |
| assert 'name' == option.GetName() | |
| bos.AddOption(BackendOption("name2", 2)) | |
| assert 2 == bos.GetOptionCount() | |
| assert 2 == len(bos) | |
| def test_backend_option_ownership(): | |
| backend_id = BackendId('b') | |
| bos = BackendOptions(backend_id) | |
| bo = BackendOption('option', True) | |
| bos.AddOption(bo) | |
| assert bo.thisown | |
| del bo | |
| assert 1 == bos.GetOptionCount() | |
| option = bos[0] | |
| assert not option.thisown | |
| assert 'option' == option.GetName() | |
| del option | |
| option_again = bos[0] | |
| assert not option_again.thisown | |
| assert 'option' == option_again.GetName() | |
| def test_optimizer_options_with_model_opt(): | |
| a = BackendOptions(BackendId('a')) | |
| oo = OptimizerOptions(True, | |
| False, | |
| False, | |
| ShapeInferenceMethod_InferAndValidate, | |
| True, | |
| [a], | |
| True) | |
| mo = oo.m_ModelOptions | |
| assert 1 == len(mo) | |
| assert 'a' == str(mo[0].GetBackendId()) | |
| b = BackendOptions(BackendId('b')) | |
| c = BackendOptions(BackendId('c')) | |
| oo.m_ModelOptions = (a, b, c) | |
| mo = oo.m_ModelOptions | |
| assert 3 == len(oo.m_ModelOptions) | |
| assert 'a' == str(mo[0].GetBackendId()) | |
| assert 'b' == str(mo[1].GetBackendId()) | |
| assert 'c' == str(mo[2].GetBackendId()) | |
| def test_optimizer_option_default(): | |
| oo = OptimizerOptions(True, | |
| False, | |
| False, | |
| ShapeInferenceMethod_InferAndValidate, | |
| True) | |
| assert 0 == len(oo.m_ModelOptions) | |
| def test_optimizer_options_fail(): | |
| a = BackendOptions(BackendId('a')) | |
| with pytest.raises(TypeError) as err: | |
| OptimizerOptions(True, | |
| False, | |
| False, | |
| ShapeInferenceMethod_InferAndValidate, | |
| True, | |
| a, | |
| True) | |
| assert "Wrong number or type of arguments" in str(err.value) | |
| with pytest.raises(RuntimeError) as err: | |
| OptimizerOptions(True, | |
| False, | |
| True, | |
| ShapeInferenceMethod_InferAndValidate, | |
| True, | |
| [a], | |
| True) | |
| assert "BFloat16 and Float16 optimization cannot be enabled at the same time" in str(err.value) | |
| with pytest.raises(TypeError) as err: | |
| oo = OptimizerOptions(True, | |
| False, | |
| False, | |
| ShapeInferenceMethod_InferAndValidate, | |
| True) | |
| oo.m_ModelOptions = 'nonsense' | |
| assert "in method 'OptimizerOptions_m_ModelOptions_set', argument 2" in str(err.value) | |
| with pytest.raises(TypeError) as err: | |
| oo = OptimizerOptions(True, | |
| False, | |
| False, | |
| ShapeInferenceMethod_InferAndValidate, | |
| True) | |
| oo.m_ModelOptions = ['nonsense', a] | |
| assert "in method 'OptimizerOptions_m_ModelOptions_set', argument 2" in str(err.value) |