Add `op` to the current context. We move any external control dependencies of the op to the loop pivot, to ensure they get executed.
(self, op)
| 1716 | self._AddOpInternal(op) |
| 1717 | |
| 1718 | def _AddOpInternal(self, op): |
| 1719 | """Add `op` to the current context. |
| 1720 | |
| 1721 | We move any external control dependencies of the op to the loop pivot, to |
| 1722 | ensure they get executed. |
| 1723 | """ |
| 1724 | if not op.inputs: |
| 1725 | # Remove any external control dependency on this op |
| 1726 | control_inputs, external_inputs = self._RemoveExternalControlEdges(op) |
| 1727 | # Add a control edge from the control pivot to this op. |
| 1728 | if not control_inputs: |
| 1729 | # pylint: disable=protected-access |
| 1730 | op._add_control_input(self.GetControlPivot().op) |
| 1731 | # pylint: enable=protected-access |
| 1732 | for x in op.outputs: |
| 1733 | self._values.add(x.name) |
| 1734 | else: |
| 1735 | for index in range(len(op.inputs)): |
| 1736 | x = op.inputs[index] |
| 1737 | real_x = self.AddValue(x) |
| 1738 | if real_x != x: |
| 1739 | op._update_input(index, real_x) # pylint: disable=protected-access |
| 1740 | # Remove any external control dependency on this op. |
| 1741 | _, external_inputs = self._RemoveExternalControlEdges(op) |
| 1742 | # Add a control dependency to prevent loop invariants from |
| 1743 | # enabling ops that should not be executed. |
| 1744 | self._MaybeAddControlDependency(op) |
| 1745 | for x in op.outputs: |
| 1746 | self._values.add(x.name) |
| 1747 | if external_inputs: |
| 1748 | # Use an identity to pull control inputs as data inputs. Note that we |
| 1749 | # ignore ops which don't have outputs. TODO(apassos): fix that |
| 1750 | with ops.control_dependencies(None): |
| 1751 | self.Enter() |
| 1752 | external_inputs = [ |
| 1753 | array_ops.identity(x.outputs[0]).op |
| 1754 | for x in external_inputs |
| 1755 | if x.outputs |
| 1756 | ] |
| 1757 | self.Exit() |
| 1758 | op._add_control_inputs(external_inputs) # pylint: disable=protected-access |
| 1759 | if self._outer_context or not util.IsLoopExit(op): |
| 1760 | op.graph.prevent_fetching(op) |
| 1761 | for x in op.outputs: |
| 1762 | op.graph.prevent_feeding(x) |
| 1763 | |
| 1764 | if self._outer_context: |
| 1765 | self._outer_context.AddInnerOp(op) |
| 1766 | |
| 1767 | def _MaybeAddControlDependency(self, op): |
| 1768 | """Add a control input to the op if it only depends on loop invariants.""" |
no test coverage detected