def _transformed_t(self, info, t, consumer_op): """Return tre transformed tensor of `t`.""" if t in info.transformed_ts: # If op is in the subgraph, just return its transformed counterpart. return info.transformed_ts[t] if t in info.sgv_inputs_set: # `t` is an input of the subgraph. return self.transform_external_input_handler(info, t) elif t.op in info.ops: # `t` is an internal tensor but is not transformed yet because it # belongs to a graph cycle. logging.debug("Cyclic tensor: t.name = %s", t.name) # Try to find an existing tensor we can use for now, # otherwise create one. We'll rewire this later. if consumer_op.type == "Merge": first_input = consumer_op.inputs[0] tmp_t_ = self._transformed_t(info, first_input, consumer_op) elif t.op.type == "Enter": enter_input = t.op.inputs[0] tmp_t_ = self._transformed_t(info, enter_input, consumer_op) else: with info.graph_.as_default(): tmp_t_ = util.make_placeholder_from_tensor(t, scope=info.scope_, prefix="geph_tmp") logging.debug("Created temporary placeholder: %s.", tmp_t_.name) # Register as temporary and return. info.tmp_cyclic_ts.append((t, tmp_t_, consumer_op)) return tmp_t_ else: # `t` is a hidden input of the subgraph. return self.transform_external_hidden_input_handler(info, t)
def detach_outputs(sgv): """Detach the outputa of a subgraph view. Args: sgv: the subgraph view to be detached. This argument is converted to a subgraph using the same rules than the function subgraph.make_view. Returns: A new subgraph view of the detached subgraph. Note that sgv is also modified in place. Raises: StandardError: if sgv cannot be converted to a SubGraphView using the same rules than the function subgraph.make_view. """ sgv = subgraph.make_view(sgv) # only select outputs with consumers sgv_ = sgv.remap_outputs([output_id for output_id, output_t in enumerate(sgv.outputs) if output_t.consumers()]) # create consumer subgraph and remap consumers_sgv = subgraph.SubGraphView(sgv_.consumers()) consumers_sgv = consumers_sgv.remap_inputs( [input_id for input_id, input_t in enumerate(consumers_sgv.inputs) if input_t in sgv_.outputs]) with sgv_.graph.as_default(): output_placeholders = [ util.make_placeholder_from_tensor(input_t) for input_t in consumers_sgv.inputs ] return swap_outputs(sgv_, output_placeholders)
def detach_outputs(sgv): """Detach the outputa of a subgraph view. Args: sgv: the subgraph view to be detached. This argument is converted to a subgraph using the same rules than the function subgraph.make_view. Returns: A new subgraph view of the detached subgraph. Note that sgv is also modified in place. Raises: StandardError: if sgv cannot be converted to a SubGraphView using the same rules than the function subgraph.make_view. """ sgv = subgraph.make_view(sgv) # only select outputs with consumers sgv_ = sgv.remap_outputs([ output_id for output_id, output_t in enumerate(sgv.outputs) if output_t.consumers() ]) # create consumer subgraph and remap consumers_sgv = subgraph.SubGraphView(sgv_.consumers()) consumers_sgv = consumers_sgv.remap_inputs([ input_id for input_id, input_t in enumerate(consumers_sgv.inputs) if input_t in sgv_.outputs ]) with sgv_.graph.as_default(): output_placeholders = [ util.make_placeholder_from_tensor(input_t) for input_t in consumers_sgv.inputs ] return swap_outputs(sgv_, output_placeholders)
def replace_t_with_placeholder_handler(info, t): """Transform a tensor into a placeholder tensor. This handler is typically used to transform a subgraph input tensor into a placeholder. Args: info: Transform._Info instance. t: tensor whose input must be transformed into a place holder. Returns: The tensor generated by the newly created place holder. """ with info.graph_.as_default(): t_ = util.make_placeholder_from_tensor(t, scope=info.scope_) return t_
def replace_t_with_placeholder_handler(info, t): """Transform a tensor into a placeholder tensor. This handler is typically used to transform a subgraph input tensor into a placeholder. Args: info: Transform._TmpInfo instance. t: tensor whose input must be transformed into a place holder. Returns: The tensor generated by the newly created place holder. """ with info.graph_.as_default(): t_ = util.make_placeholder_from_tensor(t, scope=info.scope_) return t_
def detach_outputs(sgv, control_outputs=None): """Detach the output of a subgraph view. Args: sgv: the subgraph view to be detached. This argument is converted to a subgraph using the same rules as the function subgraph.make_view. Note that sgv is modified in place. control_outputs: a util.ControlOutputs instance or None. If not None the control outputs are also detached. Returns: A tuple `(sgv, output_placeholders)` where `sgv` is a new subgraph view of the detached subgraph; `output_placeholders` is a list of the created output placeholders. Raises: StandardError: if sgv cannot be converted to a SubGraphView using the same rules than the function subgraph.make_view. """ sgv = subgraph.make_view(sgv) # only select outputs with consumers sgv_ = sgv.remap_outputs([ output_id for output_id, output_t in enumerate(sgv.outputs) if output_t.consumers() ]) # create consumer subgraph and remap consumers_sgv = subgraph.SubGraphView(sgv_.consumers()) consumers_sgv = consumers_sgv.remap_inputs([ input_id for input_id, input_t in enumerate(consumers_sgv.inputs) if input_t in sgv_.outputs ]) with sgv_.graph.as_default(): output_placeholders = [ util.make_placeholder_from_tensor(input_t) for input_t in consumers_sgv.inputs ] reroute.swap_outputs(sgv_, output_placeholders) if control_outputs is not None: detach_control_outputs(sgv_, control_outputs) return sgv_, output_placeholders
def detach_outputs(sgv, control_outputs=None): """Detach the outputa of a subgraph view. Args: sgv: the subgraph view to be detached. This argument is converted to a subgraph using the same rules as the function subgraph.make_view. Note that sgv is modified in place. control_outputs: a util.ControlOutputs instance or None. If not None the control outputs are also detached. Returns: A tuple `(sgv, output_placeholders)` where `sgv` is a new subgraph view of the detached subgraph; `output_placeholders` is a list of the created output placeholders. Raises: StandardError: if sgv cannot be converted to a SubGraphView using the same rules than the function subgraph.make_view. """ sgv = subgraph.make_view(sgv) # only select outputs with consumers sgv_ = sgv.remap_outputs([output_id for output_id, output_t in enumerate(sgv.outputs) if output_t.consumers()]) # create consumer subgraph and remap consumers_sgv = subgraph.SubGraphView(sgv_.consumers()) consumers_sgv = consumers_sgv.remap_inputs( [input_id for input_id, input_t in enumerate(consumers_sgv.inputs) if input_t in sgv_.outputs]) with sgv_.graph.as_default(): output_placeholders = [ util.make_placeholder_from_tensor(input_t) for input_t in consumers_sgv.inputs ] reroute.swap_outputs(sgv_, output_placeholders) if control_outputs is not None: detach_control_outputs(sgv_, control_outputs) return sgv_, output_placeholders