| 883 | } |
| 884 | |
| 885 | void MutableGraphView::FixRenamedNodes( |
| 886 | std::vector<RenamedOrOverwrittenNode>* renamed_nodes, |
| 887 | absl::flat_hash_map<string, NodeViewFanouts>* renamed_fanouts, |
| 888 | std::vector<bool>* overwritten_name_removed_nodes) { |
| 889 | // Extract all renamed node fanouts. |
| 890 | renamed_fanouts->reserve(renamed_nodes->size()); |
| 891 | for (auto& renamed : *renamed_nodes) { |
| 892 | auto& diff = mutation_.updated_nodes_[renamed.renamed_update_index_]; |
| 893 | // Remove node index by name from graph. |
| 894 | node_index_by_name_.erase(nodes_[diff.node_index].GetName()); |
| 895 | MutableNodeView& renamed_node = nodes_[diff.node_index]; |
| 896 | renamed_fanouts->try_emplace( |
| 897 | renamed_node.GetName(), |
| 898 | std::move(renamed_node.regular_fanouts_by_port_), |
| 899 | renamed_node.num_regular_fanouts_, |
| 900 | std::move(renamed_node.controlled_fanouts_)); |
| 901 | } |
| 902 | |
| 903 | // Replace renamed node fanouts with fanouts associated with updated name. |
| 904 | for (auto& renamed : *renamed_nodes) { |
| 905 | auto& diff = mutation_.updated_nodes_[renamed.renamed_update_index_]; |
| 906 | MutableNodeView& renamed_node = nodes_[diff.node_index]; |
| 907 | auto fanouts_it = renamed_fanouts->find(diff.name); |
| 908 | if (fanouts_it != renamed_fanouts->end()) { |
| 909 | // Another renamed node's fanout. |
| 910 | auto& fanouts = fanouts_it->second; |
| 911 | ReplaceNodeFanouts(&renamed_node, &fanouts); |
| 912 | renamed_fanouts->erase(fanouts_it); |
| 913 | // Node to be overwritten is being renamed, so it won't be overwritten. |
| 914 | renamed.overwritten_node_index_ = internal::kMissingIndex; |
| 915 | } else if (renamed.overwritten_node_index_ != internal::kMissingIndex) { |
| 916 | // Existing node in graph. |
| 917 | MutableNodeView& node_to_overwrite = |
| 918 | nodes_[renamed.overwritten_node_index_]; |
| 919 | ReplaceNodeFanouts(&renamed_node, &node_to_overwrite); |
| 920 | node_index_by_name_.erase(node_to_overwrite.GetName()); |
| 921 | if (mutation_.removed_nodes_[node_to_overwrite.node_index_]) { |
| 922 | (*overwritten_name_removed_nodes)[node_to_overwrite.node_index_] = true; |
| 923 | } |
| 924 | } else { |
| 925 | // No existing fanouts. |
| 926 | renamed_node.num_regular_fanouts_ = 0; |
| 927 | } |
| 928 | |
| 929 | // Update node name. |
| 930 | renamed_node.node()->set_name(diff.name); |
| 931 | diff.update_name = false; |
| 932 | diff.name.clear(); |
| 933 | // Rehash renamed nodes with updated name. |
| 934 | node_index_by_name_.emplace(renamed_node.GetName(), diff.node_index); |
| 935 | } |
| 936 | } |
| 937 | |
| 938 | void MutableGraphView::AddNewNodes( |
| 939 | absl::flat_hash_map<string, NodeViewFanouts>* renamed_fanouts, |