def apply_channel(self, action: Any, axes: Sequence[int]) -> bool:
        """Apply channel to state.

        Args:
            action: The value with a channel to apply.
            axes: The axes on which to apply the channel.
        Returns:
            True if the action succeeded.
        """
        result = protocols.apply_channel(
            action,
            args=protocols.ApplyChannelArgs(
                target_tensor=self._density_matrix,
                out_buffer=self._buffer[0],
                auxiliary_buffer0=self._buffer[1],
                auxiliary_buffer1=self._buffer[2],
                left_axes=axes,
                right_axes=[e + len(self._qid_shape) for e in axes],
            ),
            default=None,
        )
        if result is None:
            return False
        for i in range(len(self._buffer)):
            if result is self._buffer[i]:
                self._buffer[i] = self._density_matrix
        self._density_matrix = result
        return True
Ejemplo n.º 2
0
 def _apply_op_channel(self, op: ops.Operation, state: _StateAndBuffers,
                       indices: List[int]) -> None:
     """Apply channel to state."""
     result = protocols.apply_channel(
         op,
         args=protocols.ApplyChannelArgs(
             target_tensor=state.tensor,
             out_buffer=state.buffers[0],
             auxiliary_buffer0=state.buffers[1],
             auxiliary_buffer1=state.buffers[2],
             left_axes=indices,
             right_axes=[e + state.num_qubits for e in indices]))
     for i in range(3):
         if result is state.buffers[i]:
             state.buffers[i] = state.tensor
     state.tensor = result
Ejemplo n.º 3
0
def _strat_apply_channel_to_state(action: Any, args: ActOnDensityMatrixArgs,
                                  qubits: Sequence['cirq.Qid']) -> bool:
    """Apply channel to state."""
    axes = args.get_axes(qubits)
    result = protocols.apply_channel(
        action,
        args=protocols.ApplyChannelArgs(
            target_tensor=args.target_tensor,
            out_buffer=args.available_buffer[0],
            auxiliary_buffer0=args.available_buffer[1],
            auxiliary_buffer1=args.available_buffer[2],
            left_axes=axes,
            right_axes=[e + len(args.qid_shape) for e in axes],
        ),
        default=None,
    )
    if result is None:
        return NotImplemented
    for i in range(3):
        if result is args.available_buffer[i]:
            args.available_buffer[i] = args.target_tensor
    args.target_tensor = result
    return True