diff --git a/examples/graph_vgg_vdsr.cpp b/examples/graph_vgg_vdsr.cpp
index 3fe28e0..a6cd337 100644
--- a/examples/graph_vgg_vdsr.cpp
+++ b/examples/graph_vgg_vdsr.cpp
@@ -22,6 +22,7 @@
  * SOFTWARE.
  */
 #include "arm_compute/graph.h"
+
 #include "support/ToolchainSupport.h"
 #include "utils/CommonGraphOptions.h"
 #include "utils/GraphUtils.h"
@@ -36,8 +37,7 @@
 class GraphVDSRExample : public Example
 {
 public:
-    GraphVDSRExample()
-        : cmd_parser(), common_opts(cmd_parser), common_params(), graph(0, "VDSR")
+    GraphVDSRExample() : cmd_parser(), common_opts(cmd_parser), common_params(), graph(0, "VDSR")
     {
         model_input_width  = cmd_parser.add_option<SimpleOption<unsigned int>>("image-width", 192);
         model_input_height = cmd_parser.add_option<SimpleOption<unsigned int>>("image-height", 192);
@@ -46,7 +46,7 @@
         model_input_width->set_help("Input image width.");
         model_input_height->set_help("Input image height.");
     }
-    GraphVDSRExample(const GraphVDSRExample &) = delete;
+    GraphVDSRExample(const GraphVDSRExample &)            = delete;
     GraphVDSRExample &operator=(const GraphVDSRExample &) = delete;
     ~GraphVDSRExample() override                          = default;
     bool do_setup(int argc, char **argv) override
@@ -59,7 +59,7 @@
         common_params = consume_common_graph_parameters(common_opts);
 
         // Return when help menu is requested
-        if(common_params.help)
+        if (common_params.help)
         {
             cmd_parser.print_help(argv[0]);
             return false;
@@ -82,15 +82,17 @@
         std::unique_ptr<IPreprocessor> preprocessor = std::make_unique<TFPreproccessor>();
 
         // Create input descriptor
-        const TensorShape tensor_shape     = permute_shape(TensorShape(image_width, image_height, 1U, common_params.batches), DataLayout::NCHW, common_params.data_layout);
-        TensorDescriptor  input_descriptor = TensorDescriptor(tensor_shape, common_params.data_type).set_layout(common_params.data_layout);
+        const TensorShape tensor_shape =
+            permute_shape(TensorShape(image_width, image_height, 1U, common_params.batches), DataLayout::NCHW,
+                          common_params.data_layout);
+        TensorDescriptor input_descriptor =
+            TensorDescriptor(tensor_shape, common_params.data_type).set_layout(common_params.data_layout);
 
         // Set weights trained layout
         const DataLayout weights_layout = DataLayout::NCHW;
 
         // Note: Quantization info are random and used only for benchmarking purposes
-        graph << common_params.target
-              << common_params.fast_math_hint
+        graph << common_params.target << common_params.fast_math_hint
               << InputLayer(input_descriptor.set_quantization_info(QuantizationInfo(0.0078125f, 128)),
                             get_input_accessor(common_params, std::move(preprocessor), false));
 
@@ -98,37 +100,34 @@
         SubStream right(graph);
 
         // Layer 1
-        right << ConvolutionLayer(
-                  3U, 3U, 64U,
-                  get_weights_accessor(data_path, "conv0_w.npy", weights_layout),
-                  get_weights_accessor(data_path, "conv0_b.npy"),
-                  PadStrideInfo(1, 1, 1, 1), 1, QuantizationInfo(0.031778190285f, 156), QuantizationInfo(0.0784313753247f, 128))
-              .set_name("conv0")
-              << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name("conv0/Relu");
+        right << ConvolutionLayer(3U, 3U, 64U, get_weights_accessor(data_path, "conv0_w.npy", weights_layout),
+                                  get_weights_accessor(data_path, "conv0_b.npy"), PadStrideInfo(1, 1, 1, 1), 1,
+                                  QuantizationInfo(0.031778190285f, 156), QuantizationInfo(0.0784313753247f, 128))
+                     .set_name("conv0")
+              << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
+                     .set_name("conv0/Relu");
 
         // Rest 17 layers
-        for(unsigned int i = 1; i < 19; ++i)
+        for (unsigned int i = 1; i < 19; ++i)
         {
             const std::string conv_w_path = "conv" + arm_compute::support::cpp11::to_string(i) + "_w.npy";
             const std::string conv_b_path = "conv" + arm_compute::support::cpp11::to_string(i) + "_b.npy";
             const std::string conv_name   = "conv" + arm_compute::support::cpp11::to_string(i);
-            right << ConvolutionLayer(
-                      3U, 3U, 64U,
-                      get_weights_accessor(data_path, conv_w_path, weights_layout),
-                      get_weights_accessor(data_path, conv_b_path),
-                      PadStrideInfo(1, 1, 1, 1), 1, QuantizationInfo(0.015851572156f, 93))
-                  .set_name(conv_name)
-                  << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name(conv_name + "/Relu");
+            right << ConvolutionLayer(3U, 3U, 64U, get_weights_accessor(data_path, conv_w_path, weights_layout),
+                                      get_weights_accessor(data_path, conv_b_path), PadStrideInfo(1, 1, 1, 1), 1,
+                                      QuantizationInfo(0.015851572156f, 93))
+                         .set_name(conv_name)
+                  << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
+                         .set_name(conv_name + "/Relu");
         }
 
         // Final layer
-        right << ConvolutionLayer(
-                  3U, 3U, 1U,
-                  get_weights_accessor(data_path, "conv20_w.npy", weights_layout),
-                  get_weights_accessor(data_path, "conv20_b.npy"),
-                  PadStrideInfo(1, 1, 1, 1), 1, QuantizationInfo(0.015851572156f, 93))
-              .set_name("conv20")
-              << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name("conv20/Relu");
+        right << ConvolutionLayer(3U, 3U, 1U, get_weights_accessor(data_path, "conv20_w.npy", weights_layout),
+                                  get_weights_accessor(data_path, "conv20_b.npy"), PadStrideInfo(1, 1, 1, 1), 1,
+                                  QuantizationInfo(0.015851572156f, 93))
+                     .set_name("conv20")
+              << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
+                     .set_name("conv20/Relu");
 
         // Add residual to input
         graph << EltwiseLayer(std::move(left), std::move(right), EltwiseOperation::Add).set_name("add")
@@ -157,8 +156,8 @@
 private:
     CommandLineParser           cmd_parser;
     CommonGraphOptions          common_opts;
-    SimpleOption<unsigned int> *model_input_width{ nullptr };
-    SimpleOption<unsigned int> *model_input_height{ nullptr };
+    SimpleOption<unsigned int> *model_input_width{nullptr};
+    SimpleOption<unsigned int> *model_input_height{nullptr};
     CommonGraphParams           common_params;
     Stream                      graph;
 };
