| 1121 | } |
| 1122 | |
| 1123 | Status MutableGraphView::RemoveRegularFaninByPort(absl::string_view node_name, |
| 1124 | int port) { |
| 1125 | auto error_status = [node_name, port](absl::string_view msg) { |
| 1126 | string params = |
| 1127 | absl::Substitute("node_name='$0', port=$1", node_name, port); |
| 1128 | return MutationError("RemoveRegularFaninByPort", params, msg); |
| 1129 | }; |
| 1130 | |
| 1131 | NodeDef* node = GetNode(node_name); |
| 1132 | TF_RETURN_IF_ERROR(CheckNodeExists(node_name, node, error_status)); |
| 1133 | const int last_regular_fanin_port = |
| 1134 | gtl::FindWithDefault(max_regular_input_port(), node, -1); |
| 1135 | TF_RETURN_IF_ERROR( |
| 1136 | CheckPortRange(port, /*min=*/0, last_regular_fanin_port, error_status)); |
| 1137 | |
| 1138 | TensorId tensor_id = ParseTensorName(node->input(port)); |
| 1139 | OutputPort fanin_port(nodes()[tensor_id.node()], tensor_id.index()); |
| 1140 | fanouts()[fanin_port].erase({node, port}); |
| 1141 | auto mutable_inputs = node->mutable_input(); |
| 1142 | for (int i = port + 1; i <= last_regular_fanin_port; ++i) { |
| 1143 | TensorId tensor_id = ParseTensorName(node->input(i)); |
| 1144 | OutputPort fanin_port(nodes()[tensor_id.node()], tensor_id.index()); |
| 1145 | absl::flat_hash_set<InputPort>* fanouts_set = &fanouts()[fanin_port]; |
| 1146 | fanouts_set->erase({node, i}); |
| 1147 | fanouts_set->insert({node, i - 1}); |
| 1148 | mutable_inputs->SwapElements(i - 1, i); |
| 1149 | } |
| 1150 | const int last_node_input = node->input_size() - 1; |
| 1151 | if (last_regular_fanin_port < last_node_input) { |
| 1152 | mutable_inputs->SwapElements(last_regular_fanin_port, last_node_input); |
| 1153 | } |
| 1154 | mutable_inputs->RemoveLast(); |
| 1155 | |
| 1156 | const int updated_last_regular_input_port = last_regular_fanin_port - 1; |
| 1157 | if (updated_last_regular_input_port < 0) { |
| 1158 | max_regular_input_port().erase(node); |
| 1159 | } else { |
| 1160 | max_regular_input_port()[node] = updated_last_regular_input_port; |
| 1161 | } |
| 1162 | |
| 1163 | return Status::OK(); |
| 1164 | } |
| 1165 | |
| 1166 | bool MutableGraphView::RemoveControllingFaninInternal(NodeDef* node, |
| 1167 | NodeDef* fanin_node) { |