Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/gapi/src/api/gkernel.cpp
16339 views
1
// This file is part of OpenCV project.
2
// It is subject to the license terms in the LICENSE file found in the top-level directory
3
// of this distribution and at http://opencv.org/license.html.
4
//
5
// Copyright (C) 2018 Intel Corporation
6
7
8
#include "precomp.hpp"
9
#include <iostream> // cerr
10
#include <functional> // hash
11
#include <numeric> // accumulate
12
13
#include <ade/util/algorithm.hpp>
14
15
#include "logger.hpp"
16
#include "opencv2/gapi/gkernel.hpp"
17
18
#include "api/gbackend_priv.hpp"
19
20
// GKernelPackage public implementation ////////////////////////////////////////
21
void cv::gapi::GKernelPackage::remove(const cv::gapi::GBackend& backend)
22
{
23
m_backend_kernels.erase(backend);
24
}
25
26
bool cv::gapi::GKernelPackage::includesAPI(const std::string &id) const
27
{
28
// In current form not very efficient (n * log n)
29
auto it = std::find_if(m_backend_kernels.begin(),
30
m_backend_kernels.end(),
31
[&id](const M::value_type &p) {
32
return ade::util::contains(p.second, id);
33
});
34
return (it != m_backend_kernels.end());
35
}
36
37
std::size_t cv::gapi::GKernelPackage::size() const
38
{
39
return std::accumulate(m_backend_kernels.begin(),
40
m_backend_kernels.end(),
41
static_cast<std::size_t>(0u),
42
[](std::size_t acc, const M::value_type& v) {
43
return acc + v.second.size();
44
});
45
}
46
47
cv::gapi::GKernelPackage cv::gapi::combine(const GKernelPackage &lhs,
48
const GKernelPackage &rhs,
49
const cv::unite_policy policy)
50
{
51
52
if (policy == cv::unite_policy::REPLACE)
53
{
54
// REPLACE policy: if there is a collision, prefer RHS
55
// to LHS
56
// since OTHER package has a prefernece, start with its copy
57
GKernelPackage result(rhs);
58
// now iterate over LHS package and put kernel if and only
59
// if there's no such one
60
for (const auto &backend : lhs.m_backend_kernels)
61
{
62
for (const auto &kimpl : backend.second)
63
{
64
if (!result.includesAPI(kimpl.first))
65
result.m_backend_kernels[backend.first].insert(kimpl);
66
}
67
}
68
return result;
69
}
70
else if (policy == cv::unite_policy::KEEP)
71
{
72
// KEEP policy: if there is a collision, just keep two versions
73
// of a kernel
74
GKernelPackage result(lhs);
75
for (const auto &p : rhs.m_backend_kernels)
76
{
77
result.m_backend_kernels[p.first].insert(p.second.begin(),
78
p.second.end());
79
}
80
return result;
81
}
82
else GAPI_Assert(false);
83
return GKernelPackage();
84
}
85
86
std::pair<cv::gapi::GBackend, cv::GKernelImpl>
87
cv::gapi::GKernelPackage::lookup(const std::string &id,
88
const GLookupOrder &order) const
89
{
90
if (order.empty())
91
{
92
// If order is empty, return what comes first
93
auto it = std::find_if(m_backend_kernels.begin(),
94
m_backend_kernels.end(),
95
[&id](const M::value_type &p) {
96
return ade::util::contains(p.second, id);
97
});
98
if (it != m_backend_kernels.end())
99
{
100
// FIXME: Two lookups!
101
return std::make_pair(it->first, it->second.find(id)->second);
102
}
103
}
104
else
105
{
106
// There is order, so:
107
// 1. Limit search scope only to specified backends
108
// FIXME: Currently it is not configurable if search can fall-back
109
// to other backends (not listed in order) if kernel hasn't been found
110
// in the look-up list
111
// 2. Query backends in the specified order
112
for (const auto &selected_backend : order)
113
{
114
const auto kernels_it = m_backend_kernels.find(selected_backend);
115
if (kernels_it == m_backend_kernels.end())
116
{
117
GAPI_LOG_WARNING(NULL,
118
"Backend "
119
<< &selected_backend.priv() // FIXME: name instead
120
<< " was listed in lookup list but was not found "
121
"in the package");
122
continue;
123
}
124
if (ade::util::contains(kernels_it->second, id))
125
{
126
// FIXME: two lookups!
127
return std::make_pair(selected_backend, kernels_it->second.find(id)->second);
128
}
129
}
130
}
131
132
// If reached here, kernel was not found among selected backends.
133
util::throw_error(std::logic_error("Kernel " + id + " was not found"));
134
}
135
136
std::vector<cv::gapi::GBackend> cv::gapi::GKernelPackage::backends() const
137
{
138
std::vector<cv::gapi::GBackend> result;
139
for (const auto &p : m_backend_kernels) result.emplace_back(p.first);
140
return result;
141
}
142
143