// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #include "OptimizationViews.hpp" namespace armnn { bool OptimizationViews::Validate(const armnn::SubgraphView& originalSubgraph) const { //This needs to verify that: // 1) the sum of m_SuccesfulOptimizations & m_FailedOptimizations & m_UntouchedSubgraphs contains subgraphviews // which cover the entire space of the originalSubgraph. // 2) Each SubstitutionPair contains matching inputs and outputs bool valid = true; // Create a copy of the layer list from the original subgraph and sort it SubgraphView::Layers originalLayers = originalSubgraph.GetLayers(); originalLayers.sort(); // Create a new list based on the sum of all the subgraphs and sort it SubgraphView::Layers countedLayers; for (auto& failed : m_FailedOptimizations) { countedLayers.insert(countedLayers.end(), failed.GetLayers().begin(), failed.GetLayers().end()); } for (auto& untouched : m_UntouchedSubgraphs) { countedLayers.insert(countedLayers.end(), untouched.GetLayers().begin(), untouched.GetLayers().end()); } for (auto& successful : m_SuccesfulOptimizations) { countedLayers.insert(countedLayers.end(), successful.m_SubstitutableSubgraph.GetLayers().begin(), successful.m_SubstitutableSubgraph.GetLayers().end()); } countedLayers.sort(); // Compare the two lists to make sure they match valid &= originalLayers.size() == countedLayers.size(); auto oIt = originalLayers.begin(); auto cIt = countedLayers.begin(); for (size_t i=0; i < originalLayers.size() && valid; ++i, ++oIt, ++cIt) { valid &= (*oIt == *cIt); } // Compare the substitution subgraphs to ensure they are compatible if (valid) { for (auto& substitution : m_SuccesfulOptimizations) { bool validSubstitution = true; const SubgraphView& replacement = substitution.m_ReplacementSubgraph; const SubgraphView& old = substitution.m_SubstitutableSubgraph; validSubstitution &= replacement.GetInputSlots().size() == old.GetInputSlots().size(); validSubstitution &= replacement.GetOutputSlots().size() == old.GetOutputSlots().size(); valid &= validSubstitution; } } return valid; } } //namespace armnn