summaryrefslogtreecommitdiff
path: root/inference-engine/thirdparty/clDNN/src/include/convolution_inst.h
diff options
context:
space:
mode:
Diffstat (limited to 'inference-engine/thirdparty/clDNN/src/include/convolution_inst.h')
-rw-r--r--inference-engine/thirdparty/clDNN/src/include/convolution_inst.h176
1 files changed, 176 insertions, 0 deletions
diff --git a/inference-engine/thirdparty/clDNN/src/include/convolution_inst.h b/inference-engine/thirdparty/clDNN/src/include/convolution_inst.h
new file mode 100644
index 000000000..c4a175b1e
--- /dev/null
+++ b/inference-engine/thirdparty/clDNN/src/include/convolution_inst.h
@@ -0,0 +1,176 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma once
+#include "api/CPP/convolution.hpp"
+#include "primitive_inst.h"
+
+#include <memory>
+
+namespace cldnn
+{
+
+template <>
+struct typed_program_node<convolution> : public typed_program_node_base<convolution>
+{
+ using parent = typed_program_node_base<convolution>;
+
+public:
+ typed_program_node(std::shared_ptr<primitive> prim, program_impl& prog)
+ : parent(prim, prog)
+ , split(this->get_primitive()->split())
+ , depthwise_sep_opt(false)
+ , transposed(false)
+ , input_qf(this->get_primitive()->input_quantization_factor)
+ , output_qf(this->get_primitive()->output_quantization_factor)
+ {
+ }
+
+ void set_split(int32_t node_split) { split = node_split; }
+ int32_t get_split() const { return split; }
+
+ void set_depthwise_sep_opt(bool node_depthwise_sep_opt) { depthwise_sep_opt = node_depthwise_sep_opt; }
+ bool get_depthwise_sep_opt() const { return depthwise_sep_opt; }
+
+ void set_transposed(bool node_transposed) { transposed = node_transposed; }
+ bool get_transposed() const { return transposed; }
+
+ decltype(auto) input() const { return get_dependency(0); }
+
+ decltype(auto) weights(size_t idx = 0) const
+ {
+ if (static_cast<int32_t>(idx) >= this->get_split())
+ throw std::range_error("weights offset too big");
+
+ return get_dependency(1 + idx);
+ }
+
+ decltype(auto) bias(size_t idx = 0) const
+ {
+ if (static_cast<int32_t>(idx) >= this->get_split())
+ throw std::range_error("bias offset too big");
+
+ return get_dependency(1 + this->get_split() + idx);
+ }
+
+ decltype(auto) weights_quantization_factors(size_t idx = 0) const
+ {
+ if (static_cast<int32_t>(idx) >= this->get_split())
+ throw std::range_error("quantization factor offset too big");
+
+ return get_dependency(1 + 2*this->get_split() + idx);
+ }
+
+ decltype(auto) output_calibration_factors(size_t idx = 0) const
+ {
+ if (static_cast<int32_t>(idx) >= this->get_split())
+ throw std::range_error("calibration factor offset too big");
+
+ return get_dependency(1 + 3 * this->get_split() + idx);
+ }
+
+ bool bias_term() const
+ {
+ return get_primitive()->bias.size() > 0;
+ }
+
+ bool weights_quantization_term() const
+ {
+ return get_primitive()->weights_quantization_factors.size() > 0;
+ }
+
+ bool output_calibration_term() const
+ {
+ return get_primitive()->output_calibration_factors.size() > 0;
+ }
+
+ float get_input_qf() const { return input_qf; }
+ float get_output_qf() const { return output_qf; }
+
+private:
+ int32_t split;
+ bool depthwise_sep_opt;
+ bool transposed;
+ float input_qf;
+ float output_qf;
+};
+
+using convolution_node = typed_program_node<convolution>;
+
+template <>
+class typed_primitive_inst<convolution> : public typed_primitive_inst_base<convolution>
+{
+ using parent = typed_primitive_inst_base<convolution>;
+
+public:
+ static layout calc_output_layout(convolution_node const& node);
+ static std::string to_string(convolution_node const& node);
+
+public:
+ typed_primitive_inst(network_impl& network, convolution_node const& node);
+
+ decltype(auto)weights_memory(size_t index) const
+ {
+ if (static_cast<int32_t>(index) >= node.get_split())
+ throw std::range_error("weights offset too big");
+
+ return dep_memory(1 + index);
+ }
+
+ decltype(auto) bias_memory(size_t index) const
+ {
+ if (static_cast<int32_t>(index) >= node.get_split())
+ throw std::range_error("bias offset too big");
+
+ return dep_memory(1 + node.get_split() + index);
+ }
+
+ decltype(auto) weights_quantization_factors_memory(size_t index) const
+ {
+ if (static_cast<int32_t>(index) >= node.get_split())
+ throw std::range_error("quantization factors offset too big");
+
+ return dep_memory(1 + 2*node.get_split() + index);
+ }
+
+ decltype(auto) output_calibration_factors_memory(size_t index) const
+ {
+ if (static_cast<int32_t>(index) >= node.get_split())
+ throw std::range_error("quantization factors offset too big");
+
+ return dep_memory(1 + 3 * node.get_split() + index);
+ }
+
+ bool bias_term() const
+ {
+ return node.bias_term();
+ }
+
+ bool weights_quantization_factors_term() const
+ {
+ return node.weights_quantization_term();
+ }
+
+ bool output_calibration_factors_term() const
+ {
+ return node.output_calibration_term();
+ }
+};
+
+using convolution_inst = typed_primitive_inst<convolution>;
+
+}