blob: 2fdda5e7595c9d2fc1561116a03527331dc353b3 [file] [log] [blame]
//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include <boost/test/unit_test.hpp>
#include <armnn/ArmNN.hpp>
#include <Graph.hpp>
#include <SubgraphView.hpp>
#include <SubgraphViewSelector.hpp>
#include <backendsCommon/OptimizationViews.hpp>
#include <Network.hpp>
#include "CommonTestUtils.hpp"
using namespace armnn;
BOOST_AUTO_TEST_SUITE(OptimizationViewsTestSuite)
BOOST_AUTO_TEST_CASE(OptimizedViewsSubgraphLayerCount)
{
OptimizationViews view;
// Construct a graph with 3 layers
Graph& baseGraph = view.GetGraph();
Layer* const inputLayer = baseGraph.AddLayer<InputLayer>(0, "input");
Convolution2dDescriptor convDescriptor;
PreCompiledDescriptor substitutionLayerDescriptor(1, 1);
Layer* const convLayer1 = baseGraph.AddLayer<Convolution2dLayer>(convDescriptor, "conv1");
Layer* const convLayer2 = baseGraph.AddLayer<Convolution2dLayer>(convDescriptor, "conv2");
Layer* const substitutableCompiledLayer =
baseGraph.AddLayer<PreCompiledLayer>(substitutionLayerDescriptor, "pre-compiled");
Layer* const outputLayer = baseGraph.AddLayer<OutputLayer>(0, "output");
inputLayer->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(0));
convLayer1->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(0));
convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
// Subgraph for a failed layer
SubgraphViewSelector::SubgraphViewPtr failedSubgraph =
CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}),
CreateOutputsFrom({convLayer1}),
{convLayer1});
// Subgraph for an untouched layer
SubgraphViewSelector::SubgraphViewPtr untouchedSubgraph =
CreateSubgraphViewFrom(CreateInputsFrom({convLayer2}),
CreateOutputsFrom({convLayer2}),
{convLayer2});
// Subgraph for a substitutable layer
SubgraphViewSelector::SubgraphViewPtr substitutableSubgraph =
CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}),
CreateOutputsFrom({convLayer2}),
{substitutableCompiledLayer});
// Create a Graph containing a layer to substitute in
Graph substitutableGraph;
Layer* const substitutionpreCompiledLayer =
substitutableGraph.AddLayer<PreCompiledLayer>(substitutionLayerDescriptor, "pre-compiled");
// Subgraph for a substitution layer
SubgraphViewSelector::SubgraphViewPtr substitutionSubgraph =
CreateSubgraphViewFrom(CreateInputsFrom({substitutionpreCompiledLayer}),
CreateOutputsFrom({substitutionpreCompiledLayer}),
{substitutionpreCompiledLayer});
// Sub in the graph
baseGraph.SubstituteSubgraph(*substitutableSubgraph, *substitutionSubgraph);
view.AddFailedSubgraph(SubgraphView(*failedSubgraph));
view.AddUntouchedSubgraph(SubgraphView(*untouchedSubgraph));
SubgraphViewSelector::SubgraphViewPtr baseSubgraph =
CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}),
CreateOutputsFrom({convLayer2}),
{substitutionpreCompiledLayer});
view.AddSubstitution({*baseSubgraph, *substitutionSubgraph});
// Construct original subgraph to compare against
SubgraphViewSelector::SubgraphViewPtr originalSubgraph =
CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}),
CreateOutputsFrom({convLayer2}),
{convLayer1, convLayer2, substitutionpreCompiledLayer});
BOOST_CHECK(view.Validate(*originalSubgraph));
}
BOOST_AUTO_TEST_CASE(OptimizedViewsSubgraphLayerCountFailValidate)
{
OptimizationViews view;
// Construct a graph with 3 layers
Graph& baseGraph = view.GetGraph();
Layer* const inputLayer = baseGraph.AddLayer<InputLayer>(0, "input");
Convolution2dDescriptor convDescriptor;
PreCompiledDescriptor substitutionLayerDescriptor(1, 1);
Layer* const convLayer1 = baseGraph.AddLayer<Convolution2dLayer>(convDescriptor, "conv1");
Layer* const convLayer2 = baseGraph.AddLayer<Convolution2dLayer>(convDescriptor, "conv2");
Layer* const substitutableCompiledLayer =
baseGraph.AddLayer<PreCompiledLayer>(substitutionLayerDescriptor, "pre-compiled");
Layer* const outputLayer = baseGraph.AddLayer<OutputLayer>(0, "output");
inputLayer->GetOutputSlot(0).Connect(convLayer1->GetInputSlot(0));
convLayer1->GetOutputSlot(0).Connect(convLayer2->GetInputSlot(0));
convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
// Subgraph for an untouched layer
SubgraphViewSelector::SubgraphViewPtr untouchedSubgraph =
CreateSubgraphViewFrom(CreateInputsFrom({convLayer2}),
CreateOutputsFrom({convLayer2}),
{convLayer2});
// Subgraph for a substitutable layer
SubgraphViewSelector::SubgraphViewPtr substitutableSubgraph =
CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}),
CreateOutputsFrom({convLayer2}),
{substitutableCompiledLayer});
// Create a Graph containing a layer to substitute in
Graph substitutableGraph;
Layer* const substitutionpreCompiledLayer =
substitutableGraph.AddLayer<PreCompiledLayer>(substitutionLayerDescriptor, "pre-compiled");
// Subgraph for a substitution layer
SubgraphViewSelector::SubgraphViewPtr substitutionSubgraph =
CreateSubgraphViewFrom(CreateInputsFrom({substitutionpreCompiledLayer}),
CreateOutputsFrom({substitutionpreCompiledLayer}),
{substitutionpreCompiledLayer});
// Sub in the graph
baseGraph.SubstituteSubgraph(*substitutableSubgraph, *substitutionSubgraph);
view.AddUntouchedSubgraph(SubgraphView(*untouchedSubgraph));
SubgraphViewSelector::SubgraphViewPtr baseSubgraph =
CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}),
CreateOutputsFrom({convLayer2}),
{substitutionpreCompiledLayer});
view.AddSubstitution({*baseSubgraph, *substitutionSubgraph});
// Construct original subgraph to compare against
SubgraphViewSelector::SubgraphViewPtr originalSubgraph =
CreateSubgraphViewFrom(CreateInputsFrom({convLayer1}),
CreateOutputsFrom({convLayer2}),
{convLayer1, convLayer2, substitutionpreCompiledLayer});
// Validate should fail as convLayer1 is not counted
BOOST_CHECK(!view.Validate(*originalSubgraph));
}
BOOST_AUTO_TEST_SUITE_END()