| 1374 | } |
| 1375 | |
| 1376 | Status MutableGraphView::SwapRegularFaninsByPorts(absl::string_view node_name, |
| 1377 | int from_port, int to_port) { |
| 1378 | auto error_status = [node_name, from_port, to_port](absl::string_view msg) { |
| 1379 | string params = absl::Substitute("node_name='$0', from_port=$1, to_port=$2", |
| 1380 | node_name, from_port, to_port); |
| 1381 | return MutationError("SwapRegularFaninsByPorts", params, msg); |
| 1382 | }; |
| 1383 | |
| 1384 | NodeDef* node = GetNode(node_name); |
| 1385 | TF_RETURN_IF_ERROR(CheckNodeExists(node_name, node, error_status)); |
| 1386 | const int last_regular_fanin_port = |
| 1387 | gtl::FindWithDefault(max_regular_input_port(), node, -1); |
| 1388 | TF_RETURN_IF_ERROR(CheckPortRange(from_port, /*min=*/0, |
| 1389 | last_regular_fanin_port, error_status)); |
| 1390 | TF_RETURN_IF_ERROR(CheckPortRange(to_port, /*min=*/0, last_regular_fanin_port, |
| 1391 | error_status)); |
| 1392 | |
| 1393 | if (from_port == to_port) { |
| 1394 | return Status::OK(); |
| 1395 | } |
| 1396 | TensorId from_fanin = ParseTensorName(node->input(from_port)); |
| 1397 | TensorId to_fanin = ParseTensorName(node->input(to_port)); |
| 1398 | if (from_fanin == to_fanin) { |
| 1399 | return Status::OK(); |
| 1400 | } |
| 1401 | |
| 1402 | InputPort from_input(node, from_port); |
| 1403 | InputPort to_input(node, to_port); |
| 1404 | NodeDef* from_fanin_node = GetNode(from_fanin.node()); |
| 1405 | absl::flat_hash_set<InputPort>* from_fanouts = |
| 1406 | &fanouts()[{from_fanin_node, from_fanin.index()}]; |
| 1407 | from_fanouts->erase(from_input); |
| 1408 | from_fanouts->insert(to_input); |
| 1409 | NodeDef* to_fanin_node = GetNode(to_fanin.node()); |
| 1410 | absl::flat_hash_set<InputPort>* to_fanouts = |
| 1411 | &fanouts()[{to_fanin_node, to_fanin.index()}]; |
| 1412 | to_fanouts->erase(to_input); |
| 1413 | to_fanouts->insert(from_input); |
| 1414 | |
| 1415 | node->mutable_input()->SwapElements(from_port, to_port); |
| 1416 | |
| 1417 | return Status::OK(); |
| 1418 | } |
| 1419 | |
| 1420 | Status MutableGraphView::UpdateAllRegularFaninsToControlling( |
| 1421 | absl::string_view node_name) { |