mirror of
https://github.com/opencv/opencv.git
synced 2025-06-21 19:07:04 +08:00
99 lines
2.9 KiB
C++
99 lines
2.9 KiB
C++
// This file is part of OpenCV project.
|
|
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
|
// of this distribution and at http://opencv.org/license.html.
|
|
//
|
|
// Copyright (C) 2019 Intel Corporation
|
|
|
|
|
|
#ifndef OPENCV_GAPI_PATTERN_MATCHING_HPP
|
|
#define OPENCV_GAPI_PATTERN_MATCHING_HPP
|
|
|
|
#include <unordered_map>
|
|
#include <unordered_set>
|
|
#include <vector>
|
|
#include <list>
|
|
|
|
#include "compiler/gmodel.hpp"
|
|
|
|
namespace cv {
|
|
namespace gimpl {
|
|
|
|
struct SubgraphMatch {
|
|
using M = std::unordered_map< ade::NodeHandle // Pattern graph node
|
|
, ade::NodeHandle // Test graph node
|
|
, ade::HandleHasher<ade::Node>
|
|
>;
|
|
using S = std::unordered_set< ade::NodeHandle
|
|
, ade::HandleHasher<ade::Node>
|
|
>;
|
|
M inputDataNodes;
|
|
M startOpNodes;
|
|
M finishOpNodes;
|
|
M outputDataNodes;
|
|
|
|
std::vector<ade::NodeHandle> inputTestDataNodes;
|
|
std::vector<ade::NodeHandle> outputTestDataNodes;
|
|
|
|
std::list<ade::NodeHandle> internalLayers;
|
|
|
|
// FIXME: switch to operator bool() instead
|
|
bool ok() const {
|
|
return !inputDataNodes.empty() && !startOpNodes.empty()
|
|
&& !finishOpNodes.empty() && !outputDataNodes.empty()
|
|
&& !inputTestDataNodes.empty() && !outputTestDataNodes.empty();
|
|
|
|
}
|
|
|
|
S nodes() const {
|
|
S allNodes {};
|
|
|
|
allNodes.insert(inputTestDataNodes.begin(), inputTestDataNodes.end());
|
|
|
|
for (const auto& startOpMatch : startOpNodes) {
|
|
allNodes.insert(startOpMatch.second);
|
|
}
|
|
|
|
for (const auto& finishOpMatch : finishOpNodes) {
|
|
allNodes.insert(finishOpMatch.second);
|
|
}
|
|
|
|
allNodes.insert(outputTestDataNodes.begin(), outputTestDataNodes.end());
|
|
|
|
allNodes.insert(internalLayers.begin(), internalLayers.end());
|
|
|
|
return allNodes;
|
|
}
|
|
|
|
S startOps() {
|
|
S sOps;
|
|
for (const auto& opMatch : startOpNodes) {
|
|
sOps.insert(opMatch.second);
|
|
}
|
|
return sOps;
|
|
}
|
|
|
|
S finishOps() {
|
|
S fOps;
|
|
for (const auto& opMatch : finishOpNodes) {
|
|
fOps.insert(opMatch.second);
|
|
}
|
|
return fOps;
|
|
}
|
|
|
|
std::vector<ade::NodeHandle> protoIns() {
|
|
return inputTestDataNodes;
|
|
}
|
|
|
|
|
|
std::vector<ade::NodeHandle> protoOuts() {
|
|
return outputTestDataNodes;
|
|
}
|
|
};
|
|
|
|
GAPI_EXPORTS SubgraphMatch findMatches(const cv::gimpl::GModel::Graph& patternGraph,
|
|
const cv::gimpl::GModel::Graph& compGraph);
|
|
|
|
} //namespace gimpl
|
|
} //namespace cv
|
|
#endif // OPENCV_GAPI_PATTERN_MATCHING_HPP
|