| 1616 | typedef std::map<const Node*, Node*> map_node; |
| 1617 | |
| 1618 | edge_list DuplicateEdges(Graph* dest, map_node_list& duplicated_nodes, |
| 1619 | map_node& margin_nodes) { |
| 1620 | edge_list edges; |
| 1621 | for (const Edge* e : dest->edges()) { |
| 1622 | auto src = e->src(); |
| 1623 | auto dst = e->dst(); |
| 1624 | |
| 1625 | auto src_dup_nodes = duplicated_nodes[src]; |
| 1626 | auto dst_dup_nodes = duplicated_nodes[dst]; |
| 1627 | |
| 1628 | //duplicate inner edges between duplicated nodes |
| 1629 | if (!src_dup_nodes.empty() && !dst_dup_nodes.empty()) { |
| 1630 | for (size_t i = 0; i < src_dup_nodes.size(); ++i) { |
| 1631 | edges.emplace_back(src_dup_nodes[i], e->src_output(), |
| 1632 | dst_dup_nodes[i], e->dst_input()); |
| 1633 | } |
| 1634 | continue; |
| 1635 | } |
| 1636 | |
| 1637 | //duplicate edges from duplicated nodes to margin node |
| 1638 | if (!src_dup_nodes.empty()) { |
| 1639 | auto margin_node = margin_nodes[dst]; |
| 1640 | if (margin_node != nullptr) { |
| 1641 | for (size_t i = 0; i < src_dup_nodes.size(); ++i) { |
| 1642 | edges.emplace_back(src_dup_nodes[i], e->src_output(), |
| 1643 | margin_node, e->dst_input()); |
| 1644 | } |
| 1645 | } |
| 1646 | continue; |
| 1647 | } |
| 1648 | |
| 1649 | //duplicate edges from margin node to duplicated nodes |
| 1650 | if (!dst_dup_nodes.empty()) { |
| 1651 | auto margin_node = margin_nodes[src]; |
| 1652 | if (margin_node != nullptr) { |
| 1653 | for (size_t i = 0; i < dst_dup_nodes.size(); ++i) { |
| 1654 | edges.emplace_back(margin_node, e->src_output(), |
| 1655 | dst_dup_nodes[i], e->dst_input()); |
| 1656 | } |
| 1657 | } |
| 1658 | } |
| 1659 | } |
| 1660 | return edges; |
| 1661 | } |
| 1662 | |
| 1663 | void AggregateForApply(Graph* dest, Node* n, |
| 1664 | map_node_list& duplicated_nodes, int grad_input) { |
no test coverage detected