Exemple #1
0
def test_partial_trace_gate_errors(backend):
    gate = gates.PartialTrace(0, 1)
    # attempt to create unitary matrix
    with pytest.raises(ValueError):
        gate._construct_unitary()
    # attempt to call on state vector
    state = np.random.random(16) + 1j * np.random.random(16)
    with pytest.raises(RuntimeError):
        gate(state)
Exemple #2
0
 def nqubits(self, n: int):
     from qibo import gates
     self._nqubits = n
     if self.partition is None:
         self.partition = list(range(n // 2 + n % 2))
     if len(self.partition) <= self.nqubits // 2:
         self.partition = [
             i for i in range(self.nqubits) if i not in set(self.partition)
         ]
     self.partial_trace = gates.PartialTrace(*self.partition)
     self.partial_trace.nqubits = n
     self.partial_trace.density_matrix = self.density_matrix
Exemple #3
0
def test_partial_trace_gate(backend, qubit):
    gate = gates.PartialTrace(qubit)
    gate.density_matrix = True
    initial_rho = random_density_matrix(3)
    final_state = gate(np.copy(initial_rho))

    zero_state = np.array([[1, 0], [0, 0]])
    target_state = np.reshape(initial_rho, 6 * (2,))
    if qubit == 0:
        target_state = np.einsum("aBCabc,Dd->DBCdbc", target_state, zero_state)
    elif qubit == 1:
        target_state = np.einsum("AbCabc,Dd->ADCadc", target_state, zero_state)
    elif qubit == 2:
        target_state = np.einsum("ABcabc,Dd->ABDabd", target_state, zero_state)
    target_state = np.reshape(target_state, (8, 8))
    K.assert_allclose(final_state, target_state)
Exemple #4
0
 def nqubits(self, n: int):
     from qibo import gates
     if self._nqubits is not None and self._nqubits != n:
         raise_error(
             RuntimeError,
             f"Changing EntanglementEntropy nqubits from {self._nqubits} to {n}."
         )
     self._nqubits = n
     if self.partition is None:
         self.partition = list(range(n // 2 + n % 2))
     if len(self.partition) <= self.nqubits // 2:
         self.partition = [
             i for i in range(self.nqubits) if i not in set(self.partition)
         ]
     self.partial_trace = gates.PartialTrace(*self.partition)
     self.partial_trace.nqubits = n
     self.partial_trace.density_matrix = self.density_matrix