Ejemplo n.º 1
0
 def sample(
     self,
     qubits: List[ops.Qid],
     repetitions: int = 1,
     seed: 'cirq.RANDOM_STATE_OR_SEED_LIKE' = None,
 ) -> np.ndarray:
     indices = [self._qubit_map[q] for q in qubits]
     return density_matrix_utils.sample_density_matrix(
         self._simulator_state().density_matrix,
         indices,
         qid_shape=self._qid_shape,
         repetitions=repetitions,
         seed=seed,
     )
Ejemplo n.º 2
0
def _compute_samples_display_value(display: ops.SamplesDisplay,
                                   state: np.ndarray,
                                   qubit_order: ops.QubitOrder,
                                   qubit_map: Dict[ops.Qid, int]):
    n = len(qubit_map)
    state = np.reshape(state, (2, ) * n * 2)
    basis_change = ops.flatten_op_tree(display.measurement_basis_change())
    for op in basis_change:
        # TODO: Use apply_channel similar to apply_unitary.
        indices = [qubit_map[qubit] for qubit in op.qubits]
        gate = cast(ops.GateOperation, op).gate
        unitary = protocols.unitary(gate)
        krauss_tensor = np.reshape(unitary, (2, ) * gate.num_qubits() * 2)
        state = linalg.targeted_left_multiply(krauss_tensor, state, indices)
        # TODO add a test that fails if the below is not performed
        state = linalg.targeted_left_multiply(np.conjugate(krauss_tensor),
                                              state, [x + n for x in indices])
    state = state.reshape((2**n, 2**n))
    indices = [qubit_map[qubit] for qubit in display.qubits]
    samples = density_matrix_utils.sample_density_matrix(
        state, indices, display.num_samples)
    return display.value_derived_from_samples(samples)
Ejemplo n.º 3
0
 def sample(self,
            qubits: List[ops.Qid],
            repetitions: int = 1) -> np.ndarray:
     indices = [self._qubit_map[q] for q in qubits]
     return density_matrix_utils.sample_density_matrix(
         self.simulator_state().density_matrix, indices, repetitions)