IVGCVSW-5200 Update pyarmnn

 * Add HalfPixelCenters to Resize
 * Update pyarmnn version to semantic versioning
 * Add fill operator
 * Add Bf16 optimization
 * Add Gather operator
 * Update TransposeConvolution2d descriptor
 * Add Rank operator
 * Add load dynamic tensor support of TfLiteParser

Signed-off-by: Jan Eilers <jan.eilers@arm.com>
Change-Id: I7e76ed286ab87bd97a65ff62868ba7db7967376f
diff --git a/python/pyarmnn/test/test_descriptors.py b/python/pyarmnn/test/test_descriptors.py
index 6d49747d..b0574a1 100644
--- a/python/pyarmnn/test/test_descriptors.py
+++ b/python/pyarmnn/test/test_descriptors.py
@@ -143,6 +143,16 @@
     np.allclose(-6, desc.m_Min)
 
 
+def test_fill_descriptor_default_values():
+    desc = ann.FillDescriptor()
+    np.allclose(0, desc.m_Value)
+
+
+def test_gather_descriptor_default_values():
+    desc = ann.GatherDescriptor()
+    assert desc.m_Axis == 0
+
+
 def test_fully_connected_descriptor_default_values():
     desc = ann.FullyConnectedDescriptor()
     assert desc.m_BiasEnabled == False
@@ -370,7 +380,7 @@
 
 
 def test_transpose_convolution2d_descriptor_default_values():
-    desc = ann.DepthwiseConvolution2dDescriptor()
+    desc = ann.TransposeConvolution2dDescriptor()
     assert desc.m_PadLeft == 0
     assert desc.m_PadTop == 0
     assert desc.m_PadRight == 0
@@ -379,6 +389,7 @@
     assert desc.m_StrideY == 0
     assert desc.m_BiasEnabled == False
     assert desc.m_DataLayout == ann.DataLayout_NCHW
+    assert desc.m_OutputShapeEnabled == False
 
 
 def test_view_descriptor_default_values():
@@ -480,7 +491,9 @@
                                        'StackDescriptor',
                                        'StridedSliceDescriptor',
                                        'TransposeConvolution2dDescriptor',
-                                       'ElementwiseUnaryDescriptor'])
+                                       'ElementwiseUnaryDescriptor',
+                                       'FillDescriptor',
+                                       'GatherDescriptor'])
 class TestDescriptorMassChecks:
 
     def test_desc_implemented(self, desc_name):
@@ -522,7 +535,9 @@
                                        'StackDescriptor',
                                        'StridedSliceDescriptor',
                                        'TransposeConvolution2dDescriptor',
-                                       'ElementwiseUnaryDescriptor'])
+                                       'ElementwiseUnaryDescriptor',
+                                       'FillDescriptor',
+                                       'GatherDescriptor'])
 class TestDescriptorMassChecks:
 
     def test_desc_implemented(self, desc_name):
diff --git a/python/pyarmnn/test/test_network.py b/python/pyarmnn/test/test_network.py
index fc2591c..679e640 100644
--- a/python/pyarmnn/test/test_network.py
+++ b/python/pyarmnn/test/test_network.py
@@ -6,6 +6,23 @@
 import pytest
 import pyarmnn as ann
 
+def test_optimizer_options_default_values():
+    opt = ann.OptimizerOptions()
+    assert opt.m_ReduceFp32ToFp16 == False
+    assert opt.m_Debug == False
+    assert opt.m_ReduceFp32ToBf16 == False
+
+def test_optimizer_options_set_values1():
+    opt = ann.OptimizerOptions(True, True)
+    assert opt.m_ReduceFp32ToFp16 == True
+    assert opt.m_Debug == True
+    assert opt.m_ReduceFp32ToBf16 == False
+
+def test_optimizer_options_set_values2():
+    opt = ann.OptimizerOptions(False, False, True)
+    assert opt.m_ReduceFp32ToFp16 == False
+    assert opt.m_Debug == False
+    assert opt.m_ReduceFp32ToBf16 == True
 
 @pytest.fixture(scope="function")
 def get_runtime(shared_data_folder, network_file):
@@ -166,6 +183,7 @@
     'AddDivisionLayer',
     'AddElementwiseUnaryLayer',
     'AddFloorLayer',
+    'AddFillLayer',
     'AddFullyConnectedLayer',
     'AddGatherLayer',
     'AddInputLayer',
@@ -186,6 +204,7 @@
     'AddPreluLayer',
     'AddQuantizeLayer',
     'AddQuantizedLstmLayer',
+    'AddRankLayer',
     'AddReshapeLayer',
     'AddResizeLayer',
     'AddSliceLayer',
diff --git a/python/pyarmnn/test/test_tflite_parser.py b/python/pyarmnn/test/test_tflite_parser.py
index 344ec7c..8735eef 100644
--- a/python/pyarmnn/test/test_tflite_parser.py
+++ b/python/pyarmnn/test/test_tflite_parser.py
@@ -7,6 +7,12 @@
 import numpy as np
 
 
+def test_TfLiteParserOptions_default_values():
+    parserOptions = ann.TfLiteParserOptions()
+    assert parserOptions.m_InferAndValidate == False
+    assert parserOptions.m_StandInLayerForUnsupported == False
+
+
 @pytest.fixture()
 def parser(shared_data_folder):
     """
@@ -30,6 +36,42 @@
     assert parser.thisown
 
 
+def test_tflite_parser_with_optional_options():
+    parserOptions = ann.TfLiteParserOptions()
+    parserOptions.m_InferAndValidate = True
+    parser = ann.ITfLiteParser(parserOptions)
+    assert parser.thisown
+
+
+def create_with_opt() :
+    parserOptions = ann.TfLiteParserOptions()
+    parserOptions.m_InferAndValidate = True
+    return ann.ITfLiteParser(parserOptions)
+
+def test_tflite_parser_with_optional_options_out_of_scope(shared_data_folder):
+    parser = create_with_opt()
+    network = parser.CreateNetworkFromBinaryFile(os.path.join(shared_data_folder, "mock_model.tflite"))
+
+    graphs_count = parser.GetSubgraphCount()
+    graph_id = graphs_count - 1
+
+    input_names = parser.GetSubgraphInputTensorNames(graph_id)
+    input_binding_info = parser.GetNetworkInputBindingInfo(graph_id, input_names[0])
+
+    output_names = parser.GetSubgraphOutputTensorNames(graph_id)
+
+    preferred_backends = [ann.BackendId('CpuAcc'), ann.BackendId('CpuRef')]
+
+    options = ann.CreationOptions()
+    runtime = ann.IRuntime(options)
+
+    opt_network, messages = ann.Optimize(network, preferred_backends, runtime.GetDeviceSpec(), ann.OptimizerOptions())
+    assert 0 == len(messages)
+
+    net_id, messages = runtime.LoadNetwork(opt_network)
+    assert "" == messages
+
+
 def test_tflite_get_sub_graph_count(parser):
     graphs_count = parser.GetSubgraphCount()
     assert graphs_count == 1