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