IVGCVSW-5648 Adding serializer support for m_DimensionsSpecificity

The field m_DimensionsSpecificity in TensorShape was not being serialized
and deserialized following implementation of type 1 dynamic tensors.

* Update schema.
* Add to Serializer and Deserializer.

Signed-off-by: Colm Donelan <Colm.Donelan@arm.com>
Change-Id: I7ddbdaf54c8f4b988c6cb300f90ba848a94bdad0
diff --git a/src/armnnDeserializer/Deserializer.cpp b/src/armnnDeserializer/Deserializer.cpp
index cbc4758..9b4cbe9 100644
--- a/src/armnnDeserializer/Deserializer.cpp
+++ b/src/armnnDeserializer/Deserializer.cpp
@@ -608,45 +608,63 @@
         }
     }
 
+    float quantizationScale = tensorPtr->quantizationScale();
+    int32_t quantizationOffset = tensorPtr->quantizationOffset();
+
     if (tensorPtr->dimensionality() == static_cast<unsigned int>(Dimensionality::Scalar))
     {
-        float quantizationScale = tensorPtr->quantizationScale();
-        int32_t quantizationOffset = tensorPtr->quantizationOffset();
-
-        return armnn::TensorInfo(armnn::TensorShape{armnn::Dimensionality::Scalar},
+        return armnn::TensorInfo(TensorShape{armnn::Dimensionality::Scalar},
                                  type,
                                  quantizationScale,
                                  quantizationOffset);
     }
+    else if (tensorPtr->dimensionality() == static_cast<unsigned int>(Dimensionality::NotSpecified))
+    {
+        armnn::TensorInfo result(TensorShape{Dimensionality::NotSpecified},
+                                 type,
+                                 quantizationScale,
+                                 quantizationOffset);
+        return result;
+    }
 
     auto dimensions = tensorPtr->dimensions();
     unsigned int size = dimensions->size();
     std::vector<unsigned int> outputDims(dimensions->begin(), dimensions->begin() + size);
+    bool dimensionsSpecificity[armnn::MaxNumOfTensorDimensions];
+    std::fill_n(dimensionsSpecificity, armnn::MaxNumOfTensorDimensions, true);
+    // For backwards compatibility check if the dimensionSpecificity vector is present first.
+    // The default is to have dimensionSpecificity set to all true's anyway.
+    if (tensorPtr->dimensionSpecificity() != nullptr)
+    {
+        auto dimensionSpecificity = tensorPtr->dimensionSpecificity();
+        size = dimensionSpecificity->size();
+        for (unsigned int i = 0; i < size; ++i)
+        {
+            dimensionsSpecificity[i] = dimensionSpecificity->Get(i);
+        }
+    }
+    // Construct a TensorShape
+    TensorShape shape(size, outputDims.data(), dimensionsSpecificity);
 
     auto quantizationScales = tensorPtr->quantizationScales();
-
     if (quantizationScales)
     {
         unsigned int quantizationScalesSize = quantizationScales->size();
         std::vector<float> scales(quantizationScales->begin(), quantizationScales->begin() + quantizationScalesSize);
         unsigned int quantizationDim = tensorPtr->quantizationDim();
-        armnn::TensorInfo result(size,
-                                 outputDims.data(),
+        armnn::TensorInfo result(shape,
                                  type,
                                  scales,
                                  quantizationDim);
         return result;
     }
 
-    float quantizationScale = tensorPtr->quantizationScale();
-    int32_t quantizationOffset = tensorPtr->quantizationOffset();
-
     // two statements (on purpose) for easier debugging:
-    armnn::TensorInfo result(size,
-                             outputDims.data(),
+    armnn::TensorInfo result(shape,
                              type,
                              quantizationScale,
                              quantizationOffset);
+    
     return result;
 }