| # Copyright © 2020 Arm Ltd. All rights reserved. | |
| # SPDX-License-Identifier: MIT | |
| import pytest | |
| import pyarmnn as ann | |
| @pytest.fixture(scope="function") | |
| def network(): | |
| return ann.INetwork() | |
| class TestIInputIOutputIConnectable: | |
| def test_input_slot(self, network): | |
| # Create input, addition & output layer | |
| input1 = network.AddInputLayer(0, "input1") | |
| input2 = network.AddInputLayer(1, "input2") | |
| add = network.AddAdditionLayer("addition") | |
| output = network.AddOutputLayer(0, "output") | |
| # Connect the input/output slots for each layer | |
| input1.GetOutputSlot(0).Connect(add.GetInputSlot(0)) | |
| input2.GetOutputSlot(0).Connect(add.GetInputSlot(1)) | |
| add.GetOutputSlot(0).Connect(output.GetInputSlot(0)) | |
| # Check IInputSlot GetConnection() | |
| input_slot = add.GetInputSlot(0) | |
| input_slot_connection = input_slot.GetConnection() | |
| assert isinstance(input_slot_connection, ann.IOutputSlot) | |
| del input_slot_connection | |
| assert input_slot.GetConnection() | |
| assert isinstance(input_slot.GetConnection(), ann.IOutputSlot) | |
| del input_slot | |
| assert add.GetInputSlot(0) | |
| def test_output_slot(self, network): | |
| # Create input, addition & output layer | |
| input1 = network.AddInputLayer(0, "input1") | |
| input2 = network.AddInputLayer(1, "input2") | |
| add = network.AddAdditionLayer("addition") | |
| output = network.AddOutputLayer(0, "output") | |
| # Connect the input/output slots for each layer | |
| input1.GetOutputSlot(0).Connect(add.GetInputSlot(0)) | |
| input2.GetOutputSlot(0).Connect(add.GetInputSlot(1)) | |
| add.GetOutputSlot(0).Connect(output.GetInputSlot(0)) | |
| # Check IInputSlot GetConnection() | |
| add_get_input_connection = add.GetInputSlot(0).GetConnection() | |
| output_get_input_connection = output.GetInputSlot(0).GetConnection() | |
| # Check IOutputSlot GetConnection() | |
| add_get_output_connect = add.GetOutputSlot(0).GetConnection(0) | |
| assert isinstance(add_get_output_connect.GetConnection(), ann.IOutputSlot) | |
| # Test IOutputSlot GetNumConnections() & CalculateIndexOnOwner() | |
| assert add_get_input_connection.GetNumConnections() == 1 | |
| assert len(add_get_input_connection) == 1 | |
| assert add_get_input_connection[0] | |
| assert add_get_input_connection.CalculateIndexOnOwner() == 0 | |
| # Check GetOwningLayerGuid(). Check that it is different for add and output layer | |
| assert add_get_input_connection.GetOwningLayerGuid() != output_get_input_connection.GetOwningLayerGuid() | |
| # Set TensorInfo | |
| test_tensor_info = ann.TensorInfo(ann.TensorShape((2, 3)), ann.DataType_Float32) | |
| # Check IsTensorInfoSet() | |
| assert not add_get_input_connection.IsTensorInfoSet() | |
| add_get_input_connection.SetTensorInfo(test_tensor_info) | |
| assert add_get_input_connection.IsTensorInfoSet() | |
| # Check GetTensorInfo() | |
| output_tensor_info = add_get_input_connection.GetTensorInfo() | |
| assert 2 == output_tensor_info.GetNumDimensions() | |
| assert 6 == output_tensor_info.GetNumElements() | |
| # Check Disconnect() | |
| assert output_get_input_connection.GetNumConnections() == 1 # 1 connection to Outputslot0 from input1 | |
| add.GetOutputSlot(0).Disconnect(output.GetInputSlot(0)) # disconnect add.OutputSlot0 from Output.InputSlot0 | |
| assert output_get_input_connection.GetNumConnections() == 0 | |
| def test_output_slot__out_of_range(self, network): | |
| # Create input layer to check output slot get item handling | |
| input1 = network.AddInputLayer(0, "input1") | |
| outputSlot = input1.GetOutputSlot(0) | |
| with pytest.raises(ValueError) as err: | |
| outputSlot[1] | |
| assert "Invalid index 1 provided" in str(err.value) | |
| def test_iconnectable_guid(self, network): | |
| # Check IConnectable GetGuid() | |
| # Note Guid can change based on which tests are run so | |
| # checking here that each layer does not have the same guid | |
| add_id = network.AddAdditionLayer().GetGuid() | |
| output_id = network.AddOutputLayer(0).GetGuid() | |
| assert add_id != output_id | |
| def test_iconnectable_layer_functions(self, network): | |
| # Create input, addition & output layer | |
| input1 = network.AddInputLayer(0, "input1") | |
| input2 = network.AddInputLayer(1, "input2") | |
| add = network.AddAdditionLayer("addition") | |
| output = network.AddOutputLayer(0, "output") | |
| # Check GetNumInputSlots(), GetName() & GetNumOutputSlots() | |
| assert input1.GetNumInputSlots() == 0 | |
| assert input1.GetName() == "input1" | |
| assert input1.GetNumOutputSlots() == 1 | |
| assert input2.GetNumInputSlots() == 0 | |
| assert input2.GetName() == "input2" | |
| assert input2.GetNumOutputSlots() == 1 | |
| assert add.GetNumInputSlots() == 2 | |
| assert add.GetName() == "addition" | |
| assert add.GetNumOutputSlots() == 1 | |
| assert output.GetNumInputSlots() == 1 | |
| assert output.GetName() == "output" | |
| assert output.GetNumOutputSlots() == 0 | |
| # Check GetOutputSlot() | |
| input1_get_output = input1.GetOutputSlot(0) | |
| assert input1_get_output.GetNumConnections() == 0 | |
| assert len(input1_get_output) == 0 | |
| # Check GetInputSlot() | |
| add_get_input = add.GetInputSlot(0) | |
| add_get_input.GetConnection() | |
| assert isinstance(add_get_input, ann.IInputSlot) |