Remove Provenance tags (#8101)
This commit is contained in:
parent
4f203b9a2e
commit
88f56669e2
@ -108,7 +108,7 @@ std::shared_ptr<Node> make_constant(const element::Type& type, const Shape& shap
|
||||
val = builder::opset1::make_broadcast(val, shape, axes).get_node_shared_ptr();
|
||||
}
|
||||
|
||||
return val->add_provenance_group_members_above({});
|
||||
return val;
|
||||
}
|
||||
|
||||
/// \brief Create constant filled with double value
|
||||
|
@ -45,7 +45,7 @@ shared_ptr<Node> lp_norm(const Output<Node>& value,
|
||||
// Get outer part of equation: raise values to 1/p_norm exponent.
|
||||
shared_ptr<Node> inv_p_node = ngraph::opset1::Constant::create(values->get_element_type(), Shape{}, {1.f / p_norm});
|
||||
|
||||
return {make_shared<ngraph::opset1::Power>(values, inv_p_node)->add_provenance_group_members_above({value})};
|
||||
return {make_shared<ngraph::opset1::Power>(values, inv_p_node)};
|
||||
}
|
||||
} // namespace opset1
|
||||
} // namespace detail
|
||||
@ -61,8 +61,7 @@ shared_ptr<Node> builder::opset1::l0_norm(const Output<Node>& value,
|
||||
make_shared<ngraph::opset1::Convert>(make_shared<ngraph::opset1::NotEqual>(value, zero_node),
|
||||
value.get_element_type());
|
||||
|
||||
return make_shared<ngraph::opset1::ReduceSum>(non_zero_values, reduction_axes, keep_dims)
|
||||
->add_provenance_group_members_above({value});
|
||||
return make_shared<ngraph::opset1::ReduceSum>(non_zero_values, reduction_axes, keep_dims);
|
||||
}
|
||||
|
||||
shared_ptr<Node> builder::opset1::l1_norm(const Output<Node>& value,
|
||||
@ -74,7 +73,7 @@ shared_ptr<Node> builder::opset1::l1_norm(const Output<Node>& value,
|
||||
|
||||
const shared_ptr<Node> bias_node{ngraph::opset1::Constant::create(values->get_element_type(), Shape{}, {bias})};
|
||||
|
||||
return make_shared<ngraph::opset1::Add>(values, bias_node)->add_provenance_group_members_above({value});
|
||||
return make_shared<ngraph::opset1::Add>(values, bias_node);
|
||||
}
|
||||
|
||||
shared_ptr<Node> builder::opset1::l2_norm(const Output<Node>& value,
|
||||
@ -98,7 +97,7 @@ shared_ptr<Node> builder::opset1::l2_norm(const Output<Node>& value,
|
||||
default:
|
||||
result = make_shared<ngraph::opset1::Sqrt>(make_shared<ngraph::opset1::Add>(values, bias_node));
|
||||
}
|
||||
return result->add_provenance_group_members_above({value});
|
||||
return result;
|
||||
}
|
||||
|
||||
shared_ptr<Node> builder::opset1::lp_norm(const Output<Node>& value,
|
||||
|
@ -52,8 +52,7 @@ std::shared_ptr<Node> builder::opset1::mean(const Output<Node>& value, const Axi
|
||||
elems_number = std::make_shared<ngraph::opset1::Convert>(elems_number, value_elem_type);
|
||||
}
|
||||
|
||||
return std::make_shared<ngraph::opset1::Divide>(value_elems_sum, elems_number)
|
||||
->add_provenance_group_members_above({value});
|
||||
return std::make_shared<ngraph::opset1::Divide>(value_elems_sum, elems_number);
|
||||
}
|
||||
|
||||
std::shared_ptr<Node> builder::opset1::mean(const Output<Node>& value,
|
||||
@ -65,8 +64,7 @@ std::shared_ptr<Node> builder::opset1::mean(const Output<Node>& value,
|
||||
elems_number = get_num_elements(value, reduction_axes);
|
||||
elems_number = std::make_shared<ngraph::opset1::Convert>(elems_number, value_elem_type);
|
||||
|
||||
return std::make_shared<ngraph::opset1::Divide>(value_elems_sum, elems_number)
|
||||
->add_provenance_group_members_above({value});
|
||||
return std::make_shared<ngraph::opset1::Divide>(value_elems_sum, elems_number);
|
||||
}
|
||||
|
||||
std::shared_ptr<Node> builder::opset1::variance(const Output<Node>& value,
|
||||
@ -93,7 +91,7 @@ std::shared_ptr<Node> builder::opset1::variance(const Output<Node>& value,
|
||||
const auto Nconst = ngraph::opset1::Constant::create(et, Shape{}, {N});
|
||||
result = std::make_shared<ngraph::opset1::Divide>(diff, Nconst);
|
||||
}
|
||||
return result->add_provenance_group_members_above({value});
|
||||
return result;
|
||||
}
|
||||
|
||||
std::shared_ptr<Node> builder::opset1::variance(const Output<Node>& value,
|
||||
@ -119,7 +117,7 @@ std::shared_ptr<Node> builder::opset1::variance(const Output<Node>& value,
|
||||
}
|
||||
|
||||
result = std::make_shared<ngraph::opset1::Divide>(diff, N);
|
||||
return result->add_provenance_group_members_above({value});
|
||||
return result;
|
||||
}
|
||||
|
||||
} // namespace builder
|
||||
|
@ -38,8 +38,7 @@ shared_ptr<Node> builder::opset1::reshape(const Output<Node>& value, const Shape
|
||||
auto out_pattern =
|
||||
op::Constant::create(element::i64, Shape{shape.size()}, vector<int64_t>(shape.begin(), shape.end()));
|
||||
|
||||
return make_shared<ngraph::opset1::Reshape>(value, out_pattern, false)
|
||||
->add_provenance_group_members_above({value});
|
||||
return make_shared<ngraph::opset1::Reshape>(value, out_pattern, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,7 +46,7 @@ shared_ptr<Node> builder::opset1::reorder_axes(const Output<Node>& value, vector
|
||||
const auto axes_order_const = op::Constant::create(element::i64,
|
||||
Shape{axes_order.size()},
|
||||
vector<int64_t>(axes_order.begin(), axes_order.end()));
|
||||
return make_shared<ngraph::opset1::Transpose>(value, axes_order_const)->add_provenance_group_members_above({value});
|
||||
return make_shared<ngraph::opset1::Transpose>(value, axes_order_const);
|
||||
}
|
||||
|
||||
shared_ptr<Node> builder::opset1::transpose(const Output<Node>& value) {
|
||||
@ -65,8 +64,7 @@ shared_ptr<Node> builder::opset1::transpose(const Output<Node>& value) {
|
||||
const auto reverse_axes_order = std::make_shared<ngraph::opset1::Range>(reshape(start_node, Shape{}), // start
|
||||
neg_one, // stop (exclusive)
|
||||
neg_one); // step
|
||||
return std::make_shared<ngraph::opset1::Transpose>(value, reverse_axes_order)
|
||||
->add_provenance_group_members_above({value});
|
||||
return std::make_shared<ngraph::opset1::Transpose>(value, reverse_axes_order);
|
||||
}
|
||||
|
||||
namespace ngraph {
|
||||
@ -128,7 +126,7 @@ shared_ptr<Node> builder::opset1::flatten(const Output<Node>& value, int axis) {
|
||||
output_shape =
|
||||
make_shared<ngraph::opset1::Concat>(OutputVector{first_part_dims_length, remaining_part_length}, 0);
|
||||
}
|
||||
return make_shared<ngraph::opset1::Reshape>(value, output_shape, true)->add_provenance_group_members_above({value});
|
||||
return make_shared<ngraph::opset1::Reshape>(value, output_shape, true);
|
||||
}
|
||||
|
||||
shared_ptr<Node> builder::opset1::expand_dims(const Output<Node>& value, size_t axis) {
|
||||
|
@ -1,17 +0,0 @@
|
||||
// Copyright (C) 2018-2021 Intel Corporation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstdlib>
|
||||
|
||||
#include "ngraph/env_util.hpp"
|
||||
#include "ngraph/ngraph_visibility.hpp"
|
||||
|
||||
namespace ngraph {
|
||||
NGRAPH_API
|
||||
void set_provenance_enabled(bool enabled);
|
||||
NGRAPH_API
|
||||
bool get_provenance_enabled();
|
||||
} // namespace ngraph
|
@ -186,7 +186,6 @@ void replace_node(const std::shared_ptr<Node>& target,
|
||||
const std::vector<int64_t>& output_order);
|
||||
|
||||
/// Replace target.outputs[i] with replacement_values[i] and transfer control dependents and
|
||||
/// provenance from target to the node(s) in replacement_values.
|
||||
OPENVINO_API
|
||||
void replace_node(const std::shared_ptr<Node>& target, const OutputVector& replacement_values);
|
||||
|
||||
|
@ -408,36 +408,6 @@ public:
|
||||
const RTMap& get_rt_info() const {
|
||||
return m_rt_info;
|
||||
}
|
||||
const std::unordered_set<std::string>& get_provenance_tags() const;
|
||||
void add_provenance_tag(const std::string& tag);
|
||||
template <typename T>
|
||||
void add_provenance_tags(T tag_set) {
|
||||
for (auto tag : tag_set) {
|
||||
add_provenance_tag(tag);
|
||||
}
|
||||
}
|
||||
/// \brief Adds tag_set to this node and all intermediate nodes above base
|
||||
void add_provenance_tags_above(const OutputVector& base, const std::unordered_set<std::string>& tag_set);
|
||||
void remove_provenance_tag(const std::string& tag);
|
||||
/// \brief Add node to additional nodes that receive tags
|
||||
void add_provenance_group_member(const std::shared_ptr<Node>& node);
|
||||
/// \brief Remove node to additional nodes that receive tags
|
||||
void remove_provenance_group_member(const std::shared_ptr<Node>& node);
|
||||
/// \brief Replace current_node with replacement_node and transfer tags
|
||||
void replace_provenance_group_member(const std::shared_ptr<Node>& current_node,
|
||||
const std::shared_ptr<Node>& replacement_node);
|
||||
/// \return Provenance group nodes
|
||||
const std::set<std::shared_ptr<Node>>& get_provenance_group_members() const;
|
||||
|
||||
/// \brief Add all nodes between this node and nodes in base as additional nodes to receive
|
||||
/// provenance tags.
|
||||
std::shared_ptr<Node> add_provenance_group_members_above(const OutputVector& base);
|
||||
|
||||
// to be used when nodes are replaced
|
||||
void merge_provenance_tags_from(const std::shared_ptr<const Node>& source);
|
||||
|
||||
/// Transfer provenance tags to replacement
|
||||
void transfer_provenance_tags(const std::shared_ptr<Node>& replacement);
|
||||
|
||||
/// Get all the nodes that uses the current node
|
||||
NodeVector get_users(bool check_is_used = false) const;
|
||||
@ -516,8 +486,6 @@ private:
|
||||
mutable std::string m_unique_name;
|
||||
mutable std::atomic_bool m_name_changing{false};
|
||||
static std::atomic<size_t> m_next_instance_id;
|
||||
std::unordered_set<std::string> m_provenance_tags;
|
||||
std::set<std::shared_ptr<Node>> m_provenance_group;
|
||||
std::deque<descriptor::Input> m_inputs;
|
||||
std::deque<descriptor::Output> m_outputs;
|
||||
OPENVINO_SUPPRESS_DEPRECATED_START
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include "ngraph/opsets/opset8.hpp"
|
||||
#include "ngraph/pass/manager.hpp"
|
||||
#include "ngraph/pass/visualize_tree.hpp"
|
||||
#include "ngraph/provenance.hpp"
|
||||
#include "ngraph/rt_info.hpp"
|
||||
#include "ngraph/util.hpp"
|
||||
|
||||
@ -127,27 +126,6 @@ void ov::replace_node(const std::shared_ptr<Node>& target,
|
||||
// Fix input/output descriptors
|
||||
NGRAPH_CHECK(target->get_output_size() == replacement->get_output_size());
|
||||
|
||||
if (ngraph::get_provenance_enabled()) {
|
||||
auto common_args = ngraph::find_common_args(target, replacement);
|
||||
|
||||
std::set<string> removed_subgraph_tags;
|
||||
|
||||
auto set_replacement_prov = [&removed_subgraph_tags](const std::shared_ptr<Node>& node) {
|
||||
for (const auto& tag : node->get_provenance_tags()) {
|
||||
removed_subgraph_tags.insert(tag);
|
||||
}
|
||||
};
|
||||
|
||||
traverse_nodes({target}, set_replacement_prov, common_args);
|
||||
replacement->add_provenance_tags(removed_subgraph_tags);
|
||||
|
||||
auto set_prov_new_nodes = [&removed_subgraph_tags](const std::shared_ptr<Node>& node) {
|
||||
node->add_provenance_tags(removed_subgraph_tags);
|
||||
};
|
||||
|
||||
traverse_nodes({replacement}, set_prov_new_nodes, common_args);
|
||||
}
|
||||
|
||||
// For each of target's output O with replacement output O_rep:
|
||||
// For each O's connected downstream input I:
|
||||
// Change I's connected upstream output to O_rep
|
||||
@ -177,7 +155,6 @@ void ov::replace_node(const std::shared_ptr<Node>& target, const OutputVector& r
|
||||
if (replacement_nodes.find(replacement_node) == replacement_nodes.end()) {
|
||||
replacement_node->add_node_control_dependents(target);
|
||||
replacement_node->add_node_control_dependencies(target);
|
||||
target->transfer_provenance_tags(replacement_node);
|
||||
replacement_nodes.insert(replacement_node);
|
||||
}
|
||||
target->output(i).replace(replacement_values.at(i));
|
||||
@ -269,9 +246,6 @@ std::vector<std::shared_ptr<ngraph::Node>> ngraph::clone_nodes(const std::vector
|
||||
new_output.get_rt_info() = output_rt_info;
|
||||
}
|
||||
|
||||
for (const auto& tag : node->get_provenance_tags()) {
|
||||
cloned_node->add_provenance_tag(tag);
|
||||
}
|
||||
cloned_node->set_op_annotations(node->get_op_annotations());
|
||||
|
||||
node_map[node.get()] = cloned_node;
|
||||
@ -318,10 +292,6 @@ std::list<std::shared_ptr<ngraph::Node>> ngraph::clone_nodes(const std::vector<s
|
||||
cloned_node->set_friendly_name(node->get_friendly_name());
|
||||
auto rt_info = node->get_rt_info();
|
||||
cloned_node->get_rt_info() = rt_info;
|
||||
|
||||
for (const auto& tag : node->get_provenance_tags()) {
|
||||
cloned_node->add_provenance_tag(tag);
|
||||
}
|
||||
cloned_node->set_op_annotations(node->get_op_annotations());
|
||||
for (const auto& cloned_value : cloned_node->outputs()) {
|
||||
auto original_value = node_outputs.at(cloned_value.get_index());
|
||||
|
@ -32,8 +32,6 @@ ov::Node::Node(const Node& node)
|
||||
m_friendly_name(node.m_friendly_name)
|
||||
// skip m_unique_name -- will be generated automatically
|
||||
,
|
||||
m_provenance_tags(node.m_provenance_tags),
|
||||
m_provenance_group(node.m_provenance_group),
|
||||
m_inputs(node.m_inputs) // will be modified in the body
|
||||
// skip m_outputs -- should be initialized outside
|
||||
,
|
||||
@ -51,8 +49,6 @@ ov::Node& ov::Node::operator=(const Node& node) {
|
||||
this->m_control_dependencies = node.m_control_dependencies;
|
||||
this->m_instance_id = m_next_instance_id.fetch_add(1);
|
||||
this->m_friendly_name = node.m_friendly_name;
|
||||
this->m_provenance_tags = node.m_provenance_tags;
|
||||
this->m_provenance_group = node.m_provenance_group;
|
||||
this->m_inputs = node.m_inputs;
|
||||
this->m_op_annotations = node.m_op_annotations;
|
||||
this->m_rt_info = node.m_rt_info;
|
||||
@ -251,125 +247,6 @@ void ov::Node::set_friendly_name(const string& name) {
|
||||
m_friendly_name = name;
|
||||
}
|
||||
|
||||
void ov::Node::add_provenance_group_member(const shared_ptr<Node>& node) {
|
||||
m_provenance_group.insert(node);
|
||||
}
|
||||
|
||||
void ov::Node::remove_provenance_group_member(const shared_ptr<Node>& node) {
|
||||
m_provenance_group.erase(node);
|
||||
}
|
||||
|
||||
void ov::Node::replace_provenance_group_member(const shared_ptr<Node>& current_node,
|
||||
const shared_ptr<Node>& replacement_node) {
|
||||
// Catch up with the current state of the group
|
||||
replacement_node->add_provenance_tags(get_provenance_tags());
|
||||
if (current_node != nullptr) {
|
||||
remove_provenance_group_member(current_node);
|
||||
// Catch up with what was added to the current node
|
||||
replacement_node->add_provenance_tags(current_node->get_provenance_tags());
|
||||
}
|
||||
add_provenance_group_member(replacement_node);
|
||||
}
|
||||
|
||||
const set<shared_ptr<ov::Node>>& ov::Node::get_provenance_group_members() const {
|
||||
return m_provenance_group;
|
||||
}
|
||||
|
||||
shared_ptr<ov::Node> ov::Node::add_provenance_group_members_above(const OutputVector& base) {
|
||||
set<Node*> base_set;
|
||||
for (auto& output : base) {
|
||||
Node* node = output.get_node();
|
||||
if (node == this) {
|
||||
// A builder did nothing
|
||||
return shared_from_this();
|
||||
}
|
||||
base_set.insert(node);
|
||||
}
|
||||
vector<Node*> todo;
|
||||
for (const auto& value : input_values()) {
|
||||
todo.push_back(value.get_node());
|
||||
}
|
||||
while (!todo.empty()) {
|
||||
Node* node = todo.back();
|
||||
todo.pop_back();
|
||||
if (base_set.count(node) > 0) {
|
||||
continue;
|
||||
}
|
||||
add_provenance_group_member(node->shared_from_this());
|
||||
for (const auto& value : node->input_values()) {
|
||||
if (m_provenance_group.count(value.get_node_shared_ptr()) == 0) {
|
||||
todo.push_back(value.get_node());
|
||||
}
|
||||
}
|
||||
base_set.insert(node);
|
||||
}
|
||||
return shared_from_this();
|
||||
}
|
||||
|
||||
void ov::Node::add_provenance_tags_above(const OutputVector& base, const std::unordered_set<std::string>& tag_set) {
|
||||
set<Node*> base_set;
|
||||
for (auto& output : base) {
|
||||
base_set.insert(output.get_node());
|
||||
}
|
||||
vector<Node*> todo{this};
|
||||
while (!todo.empty()) {
|
||||
Node* node = todo.back();
|
||||
todo.pop_back();
|
||||
if (base_set.count(node) > 0) {
|
||||
continue;
|
||||
}
|
||||
node->add_provenance_tags(tag_set);
|
||||
for (const auto& value : node->input_values()) {
|
||||
todo.push_back(value.get_node());
|
||||
}
|
||||
base_set.insert(node);
|
||||
}
|
||||
}
|
||||
|
||||
const std::unordered_set<std::string>& ov::Node::get_provenance_tags() const {
|
||||
return m_provenance_tags;
|
||||
}
|
||||
|
||||
void ov::Node::add_provenance_tag(const std::string& tag) {
|
||||
m_provenance_tags.insert(tag);
|
||||
for (const auto& node : m_provenance_group) {
|
||||
node->add_provenance_tag(tag);
|
||||
}
|
||||
}
|
||||
|
||||
void ov::Node::remove_provenance_tag(const std::string& tag) {
|
||||
m_provenance_tags.erase(tag);
|
||||
}
|
||||
|
||||
void ov::Node::merge_provenance_tags_from(const std::shared_ptr<const Node>& source) {
|
||||
for (auto& tag : source->get_provenance_tags()) {
|
||||
add_provenance_tag(tag);
|
||||
}
|
||||
}
|
||||
|
||||
void ov::Node::transfer_provenance_tags(const shared_ptr<Node>& replacement) {
|
||||
NGRAPH_SUPPRESS_DEPRECATED_START
|
||||
auto common_args = ngraph::find_common_args(shared_from_this(), replacement);
|
||||
|
||||
std::set<string> removed_subgraph_tags;
|
||||
|
||||
auto set_replacement_prov = [&removed_subgraph_tags](const std::shared_ptr<Node>& node) {
|
||||
for (const auto& tag : node->get_provenance_tags()) {
|
||||
removed_subgraph_tags.insert(tag);
|
||||
}
|
||||
};
|
||||
|
||||
ngraph::traverse_nodes({shared_from_this()}, set_replacement_prov, common_args);
|
||||
replacement->add_provenance_tags(removed_subgraph_tags);
|
||||
|
||||
auto set_prov_new_nodes = [&removed_subgraph_tags](const std::shared_ptr<Node>& node) {
|
||||
node->add_provenance_tags(removed_subgraph_tags);
|
||||
};
|
||||
|
||||
ngraph::traverse_nodes({replacement}, set_prov_new_nodes, common_args);
|
||||
NGRAPH_SUPPRESS_DEPRECATED_END
|
||||
}
|
||||
|
||||
ov::Node* ov::Node::get_input_node_ptr(size_t index) const {
|
||||
NGRAPH_CHECK(index < m_inputs.size(), "index '", index, "' out of range in get_argument(size_t index)");
|
||||
return m_inputs[index].get_output().get_node().get();
|
||||
|
@ -17,9 +17,7 @@ using namespace ngraph;
|
||||
BWDCMP_RTTI_DEFINITION(op::v0::LRN);
|
||||
|
||||
op::LRN::LRN(const Output<Node>& arg, double alpha, double beta, double bias, size_t size)
|
||||
: LRN(arg, op::v0::Constant::create(element::i64, ov::Shape{1}, {1}), alpha, beta, bias, size) {
|
||||
add_provenance_group_member(input_value(1).get_node_shared_ptr());
|
||||
}
|
||||
: LRN(arg, op::v0::Constant::create(element::i64, ov::Shape{1}, {1}), alpha, beta, bias, size) {}
|
||||
|
||||
op::LRN::LRN(const Output<Node>& arg, const Output<Node>& axes, double alpha, double beta, double bias, size_t size)
|
||||
: Op({arg, axes}),
|
||||
|
@ -20,9 +20,7 @@ op::util::LogicalReduction::LogicalReduction(const Output<Node>& arg, const Axis
|
||||
: ReductionBase(
|
||||
arg,
|
||||
ngraph::op::Constant::create(element::i64, ov::Shape{reduction_axes.size()}, reduction_axes.to_vector())
|
||||
->output(0)) {
|
||||
add_provenance_group_member(input_value(1).get_node_shared_ptr());
|
||||
}
|
||||
->output(0)) {}
|
||||
|
||||
op::util::LogicalReduction::LogicalReduction(const Output<Node>& arg, const Output<Node>& reduction_axes)
|
||||
: ReductionBase(arg, reduction_axes) {}
|
||||
|
@ -1,18 +0,0 @@
|
||||
// Copyright (C) 2018-2021 Intel Corporation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
|
||||
#include "ngraph/provenance.hpp"
|
||||
|
||||
#include <cstdlib>
|
||||
|
||||
namespace ngraph {
|
||||
static bool s_provenance_enabled = getenv_bool("NGRAPH_PROVENANCE_ENABLE");
|
||||
|
||||
void set_provenance_enabled(bool enabled) {
|
||||
s_provenance_enabled = enabled;
|
||||
}
|
||||
bool get_provenance_enabled() {
|
||||
return s_provenance_enabled;
|
||||
}
|
||||
} // namespace ngraph
|
@ -9,7 +9,6 @@
|
||||
| NGRAPH_GRAPH_REWRITE_RERUN_DYNAMIC_CHECK | |
|
||||
| NGRAPH_GTEST_INFO | |
|
||||
| NGRAPH_PROFILE_PASS_ENABLE | |
|
||||
| NGRAPH_PROVENANCE_ENABLE | |
|
||||
| NGRAPH_VISUALIZE_EDGE_JUMP_DISTANCE | |
|
||||
| NGRAPH_VISUALIZE_EDGE_LABELS | |
|
||||
| NGRAPH_VISUALIZE_TRACING_FORMAT | |
|
||||
|
@ -14,12 +14,10 @@
|
||||
#include "exceptions.hpp"
|
||||
#include "ngraph/log.hpp"
|
||||
#include "ngraph/node.hpp"
|
||||
#include "ngraph/provenance.hpp"
|
||||
#include "onnx_framework_node.hpp"
|
||||
#include "onnx_import/core/node.hpp"
|
||||
#include "onnx_import/core/null_node.hpp"
|
||||
#include "utils/common.hpp"
|
||||
#include "utils/provenance_tag.hpp"
|
||||
|
||||
namespace ngraph {
|
||||
namespace onnx_import {
|
||||
@ -47,42 +45,6 @@ static std::string get_op_domain_and_name(const ONNX_NAMESPACE::NodeProto& node_
|
||||
std::string domain = get_node_domain(node_proto);
|
||||
return (domain.empty() ? "" : domain + ".") + node_proto.op_type();
|
||||
}
|
||||
|
||||
void add_provenance_tag_to_initializer(const Tensor& tensor, std::shared_ptr<default_opset::Constant> node) {
|
||||
if (!ngraph::get_provenance_enabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const std::string tag = detail::build_input_provenance_tag(tensor.get_name(), tensor.get_shape());
|
||||
|
||||
node->add_provenance_tag(tag);
|
||||
}
|
||||
|
||||
void add_provenance_tag_to_input(const ValueInfo& input, std::shared_ptr<ngraph::Node> node) {
|
||||
if (!ngraph::get_provenance_enabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const std::string tag = detail::build_input_provenance_tag(input.get_name(), input.get_shape());
|
||||
|
||||
node->add_provenance_tag(tag);
|
||||
}
|
||||
|
||||
void add_provenance_tags(const Node& onnx_node, const OutputVector& ng_node_vector) {
|
||||
if (!ngraph::get_provenance_enabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto tag = detail::build_op_provenance_tag(onnx_node);
|
||||
const auto ng_inputs = onnx_node.get_ng_inputs();
|
||||
|
||||
ngraph::traverse_nodes(
|
||||
as_node_vector(ng_node_vector),
|
||||
[&tag](std::shared_ptr<ngraph::Node> ng_node) {
|
||||
ng_node->add_provenance_tag(tag);
|
||||
},
|
||||
as_node_vector(ng_inputs));
|
||||
}
|
||||
} // namespace detail
|
||||
|
||||
Graph::Graph(std::shared_ptr<ONNX_NAMESPACE::ModelProto> model_proto)
|
||||
@ -116,7 +78,6 @@ Graph::Graph(std::shared_ptr<ONNX_NAMESPACE::ModelProto> model_proto, std::uniqu
|
||||
}
|
||||
|
||||
initializers.emplace(initializer_tensor.name(), tensor);
|
||||
detail::add_provenance_tag_to_initializer(tensor, ng_constant);
|
||||
m_cache->emplace_node(initializer_tensor.name(), std::move(ng_constant));
|
||||
}
|
||||
}
|
||||
@ -130,7 +91,6 @@ Graph::Graph(std::shared_ptr<ONNX_NAMESPACE::ModelProto> model_proto, std::uniqu
|
||||
|
||||
ValueInfo value_info{input};
|
||||
auto ng_node = value_info.get_ng_node(m_parameters, initializers);
|
||||
detail::add_provenance_tag_to_input(value_info, ng_node);
|
||||
m_cache->emplace_node(input.name(), std::move(ng_node));
|
||||
}
|
||||
|
||||
@ -290,7 +250,6 @@ OutputVector Graph::make_ng_nodes(const Node& onnx_node) const {
|
||||
std::rethrow_exception(std::current_exception());
|
||||
}
|
||||
set_friendly_names(onnx_node, ng_node_vector);
|
||||
detail::add_provenance_tags(onnx_node, ng_node_vector);
|
||||
|
||||
for (std::size_t i{0}; i < onnx_node.get_outputs_size(); ++i) {
|
||||
auto ng_node = ng_node_vector.at(i);
|
||||
|
@ -124,8 +124,7 @@ Output<ngraph::Node> get_prepared_bias(const Output<ngraph::Node>& bias, const O
|
||||
std::make_shared<default_opset::Concat>(OutputVector{one_node, C_dim, remaining_bias_shape_ones}, 0);
|
||||
}
|
||||
|
||||
return std::make_shared<default_opset::Reshape>(bias, bias_shape_node, false)
|
||||
->add_provenance_group_members_above({bias});
|
||||
return std::make_shared<default_opset::Reshape>(bias, bias_shape_node, false);
|
||||
}
|
||||
} // namespace
|
||||
|
||||
|
@ -1,38 +0,0 @@
|
||||
// Copyright (C) 2018-2021 Intel Corporation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
|
||||
#include "utils/provenance_tag.hpp"
|
||||
|
||||
#include <functional>
|
||||
#include <numeric>
|
||||
#include <sstream>
|
||||
|
||||
namespace ngraph {
|
||||
namespace onnx_import {
|
||||
namespace detail {
|
||||
std::string concat_strings(const std::vector<std::reference_wrapper<const std::string>>& strings) {
|
||||
const auto concat_with_comma = [](const std::string& accumulator,
|
||||
std::reference_wrapper<const std::string> next_string) {
|
||||
return accumulator + ", " + next_string.get();
|
||||
};
|
||||
|
||||
return std::accumulate(strings.begin() + 1, strings.end(), strings.begin()->get(), concat_with_comma);
|
||||
}
|
||||
|
||||
std::string build_input_provenance_tag(const std::string& input_name, const PartialShape& shape) {
|
||||
std::stringstream tag_builder;
|
||||
tag_builder << "<ONNX Input (" << input_name << ") Shape:" << shape << ">";
|
||||
return tag_builder.str();
|
||||
}
|
||||
|
||||
std::string build_op_provenance_tag(const Node& onnx_node) {
|
||||
const auto output_names = concat_strings(onnx_node.get_output_names());
|
||||
const auto node_name = onnx_node.get_name().empty() ? "" : onnx_node.get_name() + " ";
|
||||
|
||||
return std::string{"<ONNX " + onnx_node.op_type() + " (" + node_name + "-> " + output_names + ")>"};
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
} // namespace onnx_import
|
||||
} // namespace ngraph
|
@ -1,24 +0,0 @@
|
||||
// Copyright (C) 2018-2021 Intel Corporation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "ngraph/partial_shape.hpp"
|
||||
#include "onnx_import/core/node.hpp"
|
||||
|
||||
namespace ngraph {
|
||||
namespace onnx_import {
|
||||
namespace detail {
|
||||
std::string concat_strings(const std::vector<std::reference_wrapper<const std::string>>& strings);
|
||||
|
||||
std::string build_input_provenance_tag(const std::string& input_name, const PartialShape& shape);
|
||||
|
||||
std::string build_op_provenance_tag(const Node& onnx_node);
|
||||
|
||||
} // namespace detail
|
||||
} // namespace onnx_import
|
||||
} // namespace ngraph
|
@ -7,7 +7,6 @@
|
||||
void ov::frontend::tf::SetTracingInfo(const std::string& op_name, const ov::Output<ov::Node>& ng_node) {
|
||||
auto node = ng_node.get_node_shared_ptr();
|
||||
node->set_friendly_name(op_name);
|
||||
node->add_provenance_tag(op_name);
|
||||
}
|
||||
|
||||
void ov::frontend::tf::TFTensorShapeToNGraphShape(const tensorflow::TensorShapeProto& tf_shape,
|
||||
|
@ -89,7 +89,6 @@ set(SRC
|
||||
pass/serialization/serialize.cpp
|
||||
pattern.cpp
|
||||
preprocess.cpp
|
||||
provenance.cpp
|
||||
replace_node.cpp
|
||||
reshape_opt_kernel.cpp
|
||||
shape.cpp
|
||||
@ -554,7 +553,6 @@ if (NGRAPH_ONNX_FRONTEND_ENABLE)
|
||||
onnx/onnx_import_dyn_shapes.in.cpp
|
||||
onnx/onnx_import_external_data.in.cpp
|
||||
onnx/onnx_import_org_openvino.in.cpp
|
||||
onnx/onnx_import_provenance.in.cpp
|
||||
onnx/onnx_import_reshape.in.cpp
|
||||
onnx/onnx_import_rnn.in.cpp
|
||||
onnx/onnx_import_quant.in.cpp)
|
||||
|
@ -1,91 +0,0 @@
|
||||
// Copyright (C) 2018-2021 Intel Corporation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
|
||||
#include "default_opset.hpp"
|
||||
#include "gtest/gtest.h"
|
||||
#include "ngraph/file_util.hpp"
|
||||
#include "ngraph/pass/manager.hpp"
|
||||
#include "ngraph/provenance.hpp"
|
||||
#include "onnx_import/onnx.hpp"
|
||||
#include "util/provenance_enabler.hpp"
|
||||
#include "util/test_control.hpp"
|
||||
#include "util/type_prop.hpp"
|
||||
|
||||
NGRAPH_SUPPRESS_DEPRECATED_START
|
||||
|
||||
using namespace ngraph;
|
||||
using namespace ngraph::onnx_import;
|
||||
|
||||
static std::string s_manifest = "${MANIFEST}";
|
||||
|
||||
NGRAPH_TEST(${BACKEND_NAME}, onnx_provenance_tag_text) {
|
||||
const auto function =
|
||||
onnx_import::import_onnx_model(file_util::path_join(SERIALIZED_ZOO, "onnx/provenance_tag_add.onnx"));
|
||||
|
||||
const auto ng_nodes = function->get_ordered_ops();
|
||||
for (auto ng_node : ng_nodes) {
|
||||
for (auto tag : ng_node->get_provenance_tags()) {
|
||||
EXPECT_HAS_SUBSTRING(tag, "ONNX");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// the NodeToCheck parameter of this template is used to find a node in the whole subgraph
|
||||
// that a particular unit test is supposed to check against the expected provenance tag
|
||||
template <typename NodeToCheck>
|
||||
void test_provenance_tags(const std::shared_ptr<Function> function, const std::string& expected_provenance_tag) {
|
||||
int node_count = 0;
|
||||
for (auto ng_node : function->get_ordered_ops()) {
|
||||
if (as_type_ptr<NodeToCheck>(ng_node)) {
|
||||
++node_count;
|
||||
const auto tags = ng_node->get_provenance_tags();
|
||||
ASSERT_TRUE(tags.size() > 0) << "Node " << ng_node->get_friendly_name()
|
||||
<< " should have at least one provenance tag.";
|
||||
EXPECT_TRUE(tags.find(expected_provenance_tag) != tags.end());
|
||||
}
|
||||
}
|
||||
EXPECT_TRUE(node_count > 0) << "Expected type of node doesn't exist in graph.";
|
||||
}
|
||||
|
||||
NGRAPH_TEST(${BACKEND_NAME}, onnx_provenance_only_output) {
|
||||
test::ProvenanceEnabler provenance_enabler;
|
||||
|
||||
// the Add node in the model does not have a name,
|
||||
// only its output name should be found in the provenance tags
|
||||
const auto function =
|
||||
onnx_import::import_onnx_model(file_util::path_join(SERIALIZED_ZOO, "onnx/provenance_only_outputs.onnx"));
|
||||
test_provenance_tags<default_opset::Add>(function, "<ONNX Add (-> output_of_add)>");
|
||||
}
|
||||
|
||||
NGRAPH_TEST(${BACKEND_NAME}, onnx_provenance_node_name_and_outputs) {
|
||||
test::ProvenanceEnabler provenance_enabler;
|
||||
|
||||
const auto function = onnx_import::import_onnx_model(
|
||||
file_util::path_join(SERIALIZED_ZOO, "onnx/provenance_node_name_and_outputs.onnx"));
|
||||
test_provenance_tags<default_opset::Add>(function, "<ONNX Add (Add_node -> output_of_add)>");
|
||||
}
|
||||
|
||||
NGRAPH_TEST(${BACKEND_NAME}, onnx_provenance_multiple_outputs_op) {
|
||||
test::ProvenanceEnabler provenance_enabler;
|
||||
|
||||
const auto function = onnx_import::import_onnx_model(
|
||||
file_util::path_join(SERIALIZED_ZOO, "onnx/provenance_multiple_outputs_op.onnx"));
|
||||
test_provenance_tags<default_opset::TopK>(function, "<ONNX TopK (TOPK -> values, indices)>");
|
||||
}
|
||||
|
||||
NGRAPH_TEST(${BACKEND_NAME}, onnx_provenance_tagging_constants) {
|
||||
test::ProvenanceEnabler provenance_enabler;
|
||||
|
||||
const auto function =
|
||||
onnx_import::import_onnx_model(file_util::path_join(SERIALIZED_ZOO, "onnx/provenance_input_tags.onnx"));
|
||||
test_provenance_tags<default_opset::Constant>(function, "<ONNX Input (initializer_of_A) Shape:{1}>");
|
||||
}
|
||||
|
||||
NGRAPH_TEST(${BACKEND_NAME}, onnx_provenance_tagging_parameters) {
|
||||
test::ProvenanceEnabler provenance_enabler;
|
||||
|
||||
const auto function =
|
||||
onnx_import::import_onnx_model(file_util::path_join(SERIALIZED_ZOO, "onnx/provenance_input_tags.onnx"));
|
||||
test_provenance_tags<default_opset::Parameter>(function, "<ONNX Input (input_B) Shape:{}>");
|
||||
}
|
@ -34,20 +34,6 @@ TEST(op, is_parameter) {
|
||||
EXPECT_FALSE(op::is_parameter(t0));
|
||||
}
|
||||
|
||||
TEST(op, provenance_tag) {
|
||||
auto node = make_shared<op::Parameter>(element::f32, Shape{1});
|
||||
auto tag1 = "parameter node";
|
||||
auto tag2 = "f32 node";
|
||||
node->add_provenance_tag(tag1);
|
||||
node->add_provenance_tag(tag2);
|
||||
|
||||
node->remove_provenance_tag(tag1);
|
||||
|
||||
auto tags = node->get_provenance_tags();
|
||||
ASSERT_TRUE(tags.find(tag1) == tags.end());
|
||||
ASSERT_TRUE(tags.find(tag2) != tags.end());
|
||||
}
|
||||
|
||||
TEST(op, opset_multi_thread) {
|
||||
auto doTest = [&](std::function<const ngraph::OpSet&()> fun) {
|
||||
std::atomic<const ngraph::OpSet*> opset{nullptr};
|
||||
|
@ -1,389 +0,0 @@
|
||||
// Copyright (C) 2018-2021 Intel Corporation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
|
||||
#include "ngraph/provenance.hpp"
|
||||
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
#include "ngraph/builder/norm.hpp"
|
||||
#include "ngraph/graph_util.hpp"
|
||||
#include "ngraph/ngraph.hpp"
|
||||
#include "ngraph/pass/manager.hpp"
|
||||
#include "util/provenance_enabler.hpp"
|
||||
|
||||
NGRAPH_SUPPRESS_DEPRECATED_START
|
||||
using namespace std;
|
||||
using namespace ngraph;
|
||||
using ::testing::Return;
|
||||
|
||||
using ProvSet = std::unordered_set<std::string>;
|
||||
|
||||
TEST(provenance, provenance) {
|
||||
test::ProvenanceEnabler provenance_enabler;
|
||||
|
||||
//
|
||||
// Before:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// C{tag_c}
|
||||
//
|
||||
// Replacement:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// C := D{}
|
||||
//
|
||||
// After:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// D{tag_c}
|
||||
//
|
||||
// Comment:
|
||||
// * D is the replacement root, and its insertion kills C. We should not, however, consider
|
||||
// A and B to be killed, because they are not post-dominated by D until after C is cut out
|
||||
// of the graph.
|
||||
//
|
||||
{
|
||||
auto x = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
auto y = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
|
||||
auto a = make_shared<op::v1::Add>(x, y);
|
||||
a->add_provenance_tag("tag_a");
|
||||
auto b = make_shared<op::v1::Multiply>(y, x);
|
||||
b->add_provenance_tag("tag_b");
|
||||
auto c = make_shared<op::v1::Subtract>(a, b);
|
||||
c->add_provenance_tag("tag_c");
|
||||
|
||||
auto f = make_shared<Function>(c, ParameterVector{x, y});
|
||||
|
||||
auto new_c = make_shared<op::v1::Subtract>(a, b);
|
||||
replace_node(c, new_c);
|
||||
|
||||
EXPECT_EQ(new_c->get_provenance_tags(), ProvSet{"tag_c"});
|
||||
}
|
||||
|
||||
//
|
||||
// Before:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// C{tag_c}
|
||||
//
|
||||
// Replacement:
|
||||
//
|
||||
//
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// C -> D{tag_d}
|
||||
//
|
||||
// After:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// D{tag_c,tag_d}
|
||||
//
|
||||
// Comment:
|
||||
// * D is the replacement root, and its insertion kills C. We should not, however, consider
|
||||
// A and B to be killed, because they are not post-dominated by D until after C is cut out
|
||||
// of the graph.
|
||||
//
|
||||
{
|
||||
auto x = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
auto y = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
|
||||
auto a = make_shared<op::v1::Add>(x, y);
|
||||
a->add_provenance_tag("tag_a");
|
||||
auto b = make_shared<op::v1::Multiply>(y, x);
|
||||
b->add_provenance_tag("tag_b");
|
||||
auto c = make_shared<op::v1::Subtract>(a, b);
|
||||
c->add_provenance_tag("tag_c");
|
||||
|
||||
auto f = make_shared<Function>(c, ParameterVector{x, y});
|
||||
|
||||
auto d = make_shared<op::v1::Subtract>(a, b);
|
||||
d->add_provenance_tag("tag_d");
|
||||
replace_node(c, d);
|
||||
|
||||
EXPECT_EQ(d->get_provenance_tags(), (ProvSet{"tag_c", "tag_d"}));
|
||||
}
|
||||
|
||||
//
|
||||
// Before:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// C{tag_c}
|
||||
//
|
||||
// Replacement:
|
||||
//
|
||||
// C -> D{tag_d}
|
||||
//
|
||||
// After:
|
||||
//
|
||||
// D{tag_a,tag_b,tag_c,tag_d}
|
||||
//
|
||||
// Comment:
|
||||
// * D is the replacement root, and its insertion kills A, B, and C.
|
||||
//
|
||||
{
|
||||
auto x = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
auto y = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
|
||||
auto a = make_shared<op::v1::Add>(x, y);
|
||||
a->add_provenance_tag("tag_a");
|
||||
auto b = make_shared<op::v1::Multiply>(y, x);
|
||||
b->add_provenance_tag("tag_b");
|
||||
auto c = make_shared<op::v1::Subtract>(a, b);
|
||||
c->add_provenance_tag("tag_c");
|
||||
|
||||
auto f = make_shared<Function>(c, ParameterVector{x, y});
|
||||
|
||||
auto d = make_zero(element::i32, Shape{2, 3, 4});
|
||||
d->add_provenance_tag("tag_d");
|
||||
replace_node(c, d);
|
||||
|
||||
EXPECT_EQ(d->get_provenance_tags(), (ProvSet{"tag_a", "tag_b", "tag_c", "tag_d"}));
|
||||
}
|
||||
|
||||
//
|
||||
// Before:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// C{tag_c}
|
||||
//
|
||||
// Replacement:
|
||||
//
|
||||
// C -> D{}
|
||||
//
|
||||
// After:
|
||||
//
|
||||
// D{tag_a,tag_b,tag_c}
|
||||
//
|
||||
// Comment:
|
||||
// * D is the replacement root, and its insertion kills A, B, and C.
|
||||
//
|
||||
{
|
||||
auto x = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
auto y = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
|
||||
auto a = make_shared<op::v1::Add>(x, y);
|
||||
a->add_provenance_tag("tag_a");
|
||||
auto b = make_shared<op::v1::Multiply>(y, x);
|
||||
b->add_provenance_tag("tag_b");
|
||||
auto c = make_shared<op::v1::Subtract>(a, b);
|
||||
c->add_provenance_tag("tag_c");
|
||||
|
||||
auto f = make_shared<Function>(c, ParameterVector{x, y});
|
||||
|
||||
auto d = make_zero(element::i32, Shape{2, 3, 4});
|
||||
replace_node(c, d);
|
||||
|
||||
EXPECT_EQ(d->get_provenance_tags(), (ProvSet{"tag_a", "tag_b", "tag_c"}));
|
||||
}
|
||||
|
||||
//
|
||||
// Before:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// C{tag_c}
|
||||
//
|
||||
//
|
||||
// Replacement:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// E{} |
|
||||
// | |
|
||||
// C -> D{tag_d}
|
||||
//
|
||||
//
|
||||
// After:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// E{tag_c} |
|
||||
// | |
|
||||
// D{tag_c, tag_d}
|
||||
//
|
||||
// Comment:
|
||||
// * D is the replacement root replacing C and creating a new argument node E
|
||||
//
|
||||
{
|
||||
auto x = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
auto y = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
|
||||
auto a = make_shared<op::v1::Add>(x, y);
|
||||
a->add_provenance_tag("tag_a");
|
||||
auto b = make_shared<op::v1::Multiply>(y, x);
|
||||
b->add_provenance_tag("tag_b");
|
||||
auto c = make_shared<op::v1::Subtract>(a, b);
|
||||
c->add_provenance_tag("tag_c");
|
||||
|
||||
auto f = make_shared<Function>(c, ParameterVector{x, y});
|
||||
|
||||
auto e = make_shared<op::v1::Subtract>(a, x);
|
||||
auto d = make_shared<op::v1::Subtract>(e, b);
|
||||
d->add_provenance_tag("tag_d");
|
||||
|
||||
replace_node(c, d);
|
||||
|
||||
EXPECT_EQ(d->get_provenance_tags(), (ProvSet{"tag_c", "tag_d"}));
|
||||
EXPECT_EQ(e->get_provenance_tags(), (ProvSet{"tag_c"}));
|
||||
}
|
||||
|
||||
//
|
||||
// Before:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// C{tag_c}
|
||||
//
|
||||
//
|
||||
// Replacement:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// | |
|
||||
// E{tag_e} |
|
||||
// | |
|
||||
// C -> D{tag_d}
|
||||
//
|
||||
//
|
||||
// After:
|
||||
//
|
||||
// A{tag_a} B{tag_b}
|
||||
// \ /
|
||||
// E{tag_c, tag_d, tag_e} /
|
||||
// \ /
|
||||
// D{tag_c, tag_d}
|
||||
//
|
||||
// Comment:
|
||||
// * D is the replacement root replacing C and creating a new argument node E
|
||||
//
|
||||
{
|
||||
auto x = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
auto y = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
|
||||
auto a = make_shared<op::v1::Add>(x, y);
|
||||
a->add_provenance_tag("tag_a");
|
||||
auto b = make_shared<op::v1::Multiply>(y, x);
|
||||
b->add_provenance_tag("tag_b");
|
||||
auto c = make_shared<op::v1::Subtract>(a, b);
|
||||
c->add_provenance_tag("tag_c");
|
||||
|
||||
auto f = make_shared<Function>(c, ParameterVector{x, y});
|
||||
|
||||
auto e = make_shared<op::v1::Subtract>(a, x);
|
||||
e->add_provenance_tag("tag_e");
|
||||
auto d = make_shared<op::v1::Subtract>(e, b);
|
||||
d->add_provenance_tag("tag_d");
|
||||
|
||||
replace_node(c, d);
|
||||
|
||||
EXPECT_EQ(d->get_provenance_tags(), (ProvSet{"tag_c", "tag_d"}));
|
||||
EXPECT_EQ(e->get_provenance_tags(), (ProvSet{"tag_c", "tag_e"}));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(provenance, add_group_above) {
|
||||
auto p1 = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
p1->add_provenance_tag("P1");
|
||||
auto p2 = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
p2->add_provenance_tag("P2");
|
||||
auto a1 = make_shared<op::v1::Add>(p1, p2);
|
||||
auto m1 = make_shared<op::v1::Multiply>(a1, a1)->add_provenance_group_members_above({p1, p2});
|
||||
m1->add_provenance_tag("m1");
|
||||
EXPECT_EQ(p1->get_provenance_tags(), (ProvSet{"P1"}));
|
||||
EXPECT_EQ(p2->get_provenance_tags(), (ProvSet{"P2"}));
|
||||
EXPECT_EQ(a1->get_provenance_tags(), (ProvSet{"m1"}));
|
||||
EXPECT_EQ(m1->get_provenance_tags(), (ProvSet{"m1"}));
|
||||
}
|
||||
|
||||
TEST(provenance, add_tags_above) {
|
||||
auto x = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
auto y = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
|
||||
auto a = make_shared<op::v1::Add>(x, y);
|
||||
auto b = make_shared<op::v1::Multiply>(x, y);
|
||||
auto c = make_shared<op::v1::Subtract>(a, b);
|
||||
auto d = make_shared<op::Abs>(c);
|
||||
|
||||
// Add tags to Subtract and all nodes until Parameters (all above c, until params x, y)
|
||||
c->add_provenance_tags_above(OutputVector{x, y}, {"tag_above_c - until_params"});
|
||||
// Add tags to Abs and Subtract (above d, until c inputs)
|
||||
d->add_provenance_tags_above(c->input_values(), {"tag_above_d - until_c_inputs"});
|
||||
// Add tags to Abs and all nodes above
|
||||
d->add_provenance_tags_above(OutputVector{}, {"tag_all_above_d"});
|
||||
|
||||
auto x_tags = x->get_provenance_tags();
|
||||
EXPECT_EQ(x_tags.size(), 1);
|
||||
EXPECT_TRUE(x_tags.find("tag_all_above_d") != x_tags.end());
|
||||
|
||||
auto y_tags = y->get_provenance_tags();
|
||||
EXPECT_EQ(y_tags.size(), 1);
|
||||
EXPECT_TRUE(y_tags.find("tag_all_above_d") != y_tags.end());
|
||||
|
||||
auto a_tags = a->get_provenance_tags();
|
||||
EXPECT_EQ(a_tags.size(), 2);
|
||||
EXPECT_TRUE(a_tags.find("tag_above_c - until_params") != a_tags.end());
|
||||
EXPECT_FALSE(a_tags.find("tag_above_d - until_c_inputs") != a_tags.end());
|
||||
EXPECT_TRUE(a_tags.find("tag_all_above_d") != a_tags.end());
|
||||
|
||||
auto b_tags = b->get_provenance_tags();
|
||||
EXPECT_EQ(b_tags.size(), 2);
|
||||
EXPECT_TRUE(b_tags.find("tag_above_c - until_params") != b_tags.end());
|
||||
EXPECT_FALSE(b_tags.find("tag_above_d - until_c_inputs") != b_tags.end());
|
||||
EXPECT_TRUE(b_tags.find("tag_all_above_d") != b_tags.end());
|
||||
|
||||
auto c_tags = c->get_provenance_tags();
|
||||
EXPECT_EQ(c_tags.size(), 3);
|
||||
EXPECT_TRUE(c_tags.find("tag_above_c - until_params") != c_tags.end());
|
||||
EXPECT_TRUE(c_tags.find("tag_above_d - until_c_inputs") != c_tags.end());
|
||||
EXPECT_TRUE(c_tags.find("tag_all_above_d") != c_tags.end());
|
||||
|
||||
auto d_tags = d->get_provenance_tags();
|
||||
EXPECT_EQ(d_tags.size(), 2);
|
||||
EXPECT_FALSE(d_tags.find("tag_above_c - until_params") != d_tags.end());
|
||||
EXPECT_TRUE(d_tags.find("tag_above_d - until_c_inputs") != d_tags.end());
|
||||
EXPECT_TRUE(d_tags.find("tag_all_above_d") != d_tags.end());
|
||||
}
|
||||
|
||||
TEST(provenance, builder) {
|
||||
auto p1 = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
p1->add_provenance_tag("P1");
|
||||
auto norm = builder::opset1::lp_norm(p1, op::Constant::create(element::i64, {}, {0}), 1, 0);
|
||||
norm->add_provenance_tag("norm");
|
||||
for (auto node : topological_sort(NodeVector{norm})) {
|
||||
if (node == p1) {
|
||||
EXPECT_EQ(node->get_provenance_tags(), (ProvSet{"P1"}));
|
||||
} else {
|
||||
EXPECT_EQ(node->get_provenance_tags(), (ProvSet{"norm"}));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST(provenance, empty_group) {
|
||||
auto p1 = make_shared<op::Parameter>(element::i32, PartialShape{2, 3, 4});
|
||||
p1->add_provenance_tag("P1");
|
||||
auto abs = make_shared<op::Abs>(p1);
|
||||
// Make sure group is empty
|
||||
abs->add_provenance_group_members_above({abs});
|
||||
abs->add_provenance_tag("abs");
|
||||
for (auto node : topological_sort(NodeVector{abs})) {
|
||||
if (node == p1) {
|
||||
EXPECT_EQ(node->get_provenance_tags(), (ProvSet{"P1"}));
|
||||
} else {
|
||||
EXPECT_EQ(node->get_provenance_tags(), (ProvSet{"abs"}));
|
||||
}
|
||||
}
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
// Copyright (C) 2018-2021 Intel Corporation
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
//
|
||||
|
||||
#include "ngraph/provenance.hpp"
|
||||
|
||||
namespace ngraph {
|
||||
namespace test {
|
||||
/// \brief Enable provenance for the duration of a unit test.
|
||||
///
|
||||
/// During creation this object activates provenance support, when it's destroyed
|
||||
/// it returns the provenance support to previous state.
|
||||
class ProvenanceEnabler {
|
||||
public:
|
||||
ProvenanceEnabler() {
|
||||
saved_enable_state = get_provenance_enabled();
|
||||
set_provenance_enabled(true);
|
||||
}
|
||||
~ProvenanceEnabler() {
|
||||
set_provenance_enabled(saved_enable_state);
|
||||
}
|
||||
|
||||
private:
|
||||
bool saved_enable_state;
|
||||
};
|
||||
} // namespace test
|
||||
} // namespace ngraph
|
Loading…
Reference in New Issue
Block a user