IVGCVSW-2843 Support QSymm16 via Command-line quantizer tool

 * Added quantization scheme support to ArmnnQuantizer

Change-Id: Ia0202bfcd8cac0695aa3b18f9447a19b27f74f67
Signed-off-by: Sadik Armagan <sadik.armagan@arm.com>
diff --git a/src/armnnQuantizer/ArmNNQuantizerMain.cpp b/src/armnnQuantizer/ArmNNQuantizerMain.cpp
index d7fc932..9ac8966 100644
--- a/src/armnnQuantizer/ArmNNQuantizerMain.cpp
+++ b/src/armnnQuantizer/ArmNNQuantizerMain.cpp
@@ -32,8 +32,14 @@
         }
     }
     inputFileStream.close();
+
+    armnn::QuantizerOptions quantizerOptions;
+    quantizerOptions.m_ActivationFormat = cmdline.GetQuantizationScheme() == "QSymm16"
+                                          ? armnn::DataType::QuantisedSymm16
+                                          : armnn::DataType::QuantisedAsymm8;
+
     armnn::INetworkPtr network = parser->CreateNetworkFromBinary(binaryContent);
-    armnn::INetworkQuantizerPtr quantizer = armnn::INetworkQuantizer::Create(network.get());
+    armnn::INetworkQuantizerPtr quantizer = armnn::INetworkQuantizer::Create(network.get(), quantizerOptions);
 
     std::string csvFileName = cmdline.GetCsvFileName();
     if (csvFileName != "")
diff --git a/src/armnnQuantizer/CommandLineProcessor.cpp b/src/armnnQuantizer/CommandLineProcessor.cpp
index a7baa5c..16afe28 100644
--- a/src/armnnQuantizer/CommandLineProcessor.cpp
+++ b/src/armnnQuantizer/CommandLineProcessor.cpp
@@ -59,6 +59,29 @@
     return true;
 }
 
+bool ValidateQuantizationScheme(const std::string& scheme)
+{
+    if (scheme.empty())
+    {
+        std::cerr << "No Quantization Scheme specified" << std::endl;
+        return false;
+    }
+
+    std::vector<std::string> supportedSchemes = {
+        "QAsymm8",
+        "QSymm16"
+    };
+
+    auto iterator = std::find(supportedSchemes.begin(), supportedSchemes.end(), scheme);
+    if (iterator == supportedSchemes.end())
+    {
+        std::cerr << "Quantization Scheme [" << scheme << "] is not supported" << std::endl;
+        return false;
+    }
+
+    return true;
+}
+
 bool CommandLineProcessor::ProcessCommandLine(int argc, char* argv[])
 {
     namespace po = boost::program_options;
@@ -70,6 +93,8 @@
                 ("help,h", "Display help messages")
                 ("infile,f", po::value<std::string>(&m_InputFileName)->required(),
                              "Input file containing float 32 ArmNN Input Graph")
+                ("scheme,s", po::value<std::string>(&m_QuantizationScheme)->default_value("QAsymm8"),
+                              "Quantization scheme, \"QAsymm8\" or \"QSymm16\", default value QAsymm8")
                 ("csvfile,c", po::value<std::string>(&m_CsvFileName)->default_value(""),
                              "CSV file containing paths for RAW input tensors")
                 ("outdir,d", po::value<std::string>(&m_OutputDirectory)->required(),
@@ -108,6 +133,11 @@
         return false;
     }
 
+    if (!ValidateQuantizationScheme(m_QuantizationScheme))
+    {
+        return false;
+    }
+
     if (m_CsvFileName != "")
     {
         if (!armnnQuantizer::ValidateProvidedFile(m_CsvFileName))
diff --git a/src/armnnQuantizer/CommandLineProcessor.hpp b/src/armnnQuantizer/CommandLineProcessor.hpp
index 852fcd4..7e366a7 100644
--- a/src/armnnQuantizer/CommandLineProcessor.hpp
+++ b/src/armnnQuantizer/CommandLineProcessor.hpp
@@ -30,12 +30,14 @@
     std::string GetCsvFileDirectory() {return m_CsvFileDirectory;}
     std::string GetOutputDirectoryName() {return m_OutputDirectory;}
     std::string GetOutputFileName() {return m_OutputFileName;}
+    std::string GetQuantizationScheme() {return m_QuantizationScheme;}
 private:
     std::string m_InputFileName;
     std::string m_CsvFileName;
     std::string m_CsvFileDirectory;
     std::string m_OutputDirectory;
     std::string m_OutputFileName;
+    std::string m_QuantizationScheme;
 };
 
 } // namespace armnnQuantizer