1
- // Copyright (C) 2023 Intel Corporation
1
+ // Copyright (C) 2023-2024 Intel Corporation
2
2
// SPDX-License-Identifier: Apache-2.0
3
3
//
4
4
@@ -104,6 +104,61 @@ ov::NodeVector LinearIR::get_ordered_ops(const std::shared_ptr<ov::Model>& m) {
104
104
return ov::topological_sort (nodes);
105
105
}
106
106
107
+ namespace {
108
+ using NodeMap = std::unordered_map<ov::Node*, std::shared_ptr<ov::Node>>;
109
+
110
+ std::vector<std::shared_ptr<ov::Node>> clone_nodes (const std::vector<std::shared_ptr<ov::Node>>& nodes,
111
+ NodeMap& node_map) {
112
+ // for each node in topological order
113
+ auto sorted_nodes = topological_sort (nodes);
114
+ for (const auto & node : sorted_nodes) {
115
+ if (node_map.count (node.get ()) == 0 ) {
116
+ // get (already) cloned arguments and clone the node
117
+ OutputVector cloned_args;
118
+ for (auto input : node->inputs ()) {
119
+ ov::Output<Node> output = input.get_source_output ();
120
+ cloned_args.push_back (output.for_node (node_map.at (output.get_node ())));
121
+ }
122
+ std::vector<std::shared_ptr<Node>> cloned_dependencies;
123
+ for (auto & dependency : node->get_control_dependencies ()) {
124
+ std::shared_ptr<Node>& dependent = node_map.at (dependency.get ());
125
+ if (find (cloned_dependencies.begin (), cloned_dependencies.end (), dependent) ==
126
+ cloned_dependencies.end ()) {
127
+ cloned_dependencies.push_back (dependent);
128
+ }
129
+ }
130
+ auto cloned_node = node->copy_with_new_inputs (cloned_args, cloned_dependencies);
131
+ // There is a friendly name for this node so copy it
132
+ cloned_node->set_friendly_name (node->get_friendly_name ());
133
+ auto rt_info = node->get_rt_info ();
134
+ cloned_node->get_rt_info () = rt_info;
135
+
136
+ for (auto output : node->outputs ()) {
137
+ const auto & output_rt_info = output.get_rt_info ();
138
+ auto new_output = output.for_node (cloned_node);
139
+ new_output.get_rt_info () = output_rt_info;
140
+ }
141
+
142
+ for (auto input : node->inputs ()) {
143
+ const auto & output_rt_info = input.get_rt_info ();
144
+ auto new_input = cloned_node->input (input.get_index ());
145
+ new_input.get_rt_info () = output_rt_info;
146
+ }
147
+
148
+ node_map[node.get ()] = cloned_node;
149
+ }
150
+ }
151
+
152
+ // create and return vector of cloned nodes
153
+ // order matches input vector (not necessarily topological)
154
+ std::vector<std::shared_ptr<ov::Node>> cloned_nodes;
155
+ for (const auto & node : nodes) {
156
+ cloned_nodes.push_back (node_map.at (node.get ()));
157
+ }
158
+ return cloned_nodes;
159
+ }
160
+ } // namespace
161
+
107
162
LinearIR::container LinearIR::deep_copy_range (LinearIR::container::const_iterator begin,
108
163
LinearIR::container::const_iterator end,
109
164
ExressionMap& expression_map) {
@@ -115,10 +170,8 @@ LinearIR::container LinearIR::deep_copy_range(LinearIR::container::const_iterato
115
170
}
116
171
117
172
// node_map and expr_map map original node pointer (expression) to a new pointer (expression)
118
- ngraph::NodeMap node_map;
119
- OPENVINO_SUPPRESS_DEPRECATED_START
120
- ngraph::clone_nodes (original_nodes, node_map);
121
- OPENVINO_SUPPRESS_DEPRECATED_END
173
+ NodeMap node_map;
174
+ clone_nodes (original_nodes, node_map);
122
175
123
176
for (auto it = begin; it != end; it++) {
124
177
const auto & expr = *it;
0 commit comments