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
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
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