def test_from_label(self): """Test initialization from a label""" x_p = DensityMatrix(np.array([[0.5, 0.5], [0.5, 0.5]])) x_m = DensityMatrix(np.array([[0.5, -0.5], [-0.5, 0.5]])) y_p = DensityMatrix(np.array([[0.5, -0.5j], [0.5j, 0.5]])) y_m = DensityMatrix(np.array([[0.5, 0.5j], [-0.5j, 0.5]])) z_p = DensityMatrix(np.diag([1, 0])) z_m = DensityMatrix(np.diag([0, 1])) label = '0+r' target = z_p.tensor(x_p).tensor(y_p) self.assertEqual(target, DensityMatrix.from_label(label)) label = '-l1' target = x_m.tensor(y_m).tensor(z_m) self.assertEqual(target, DensityMatrix.from_label(label))
def test_probabilities_product(self): """Test probabilities method for product state""" state = DensityMatrix.from_label("+0") # 2-qubit qargs with self.subTest(msg="P(None)"): probs = state.probabilities() target = np.array([0.5, 0, 0.5, 0]) self.assertTrue(np.allclose(probs, target)) with self.subTest(msg="P([0, 1])"): probs = state.probabilities([0, 1]) target = np.array([0.5, 0, 0.5, 0]) self.assertTrue(np.allclose(probs, target)) with self.subTest(msg="P([1, 0]"): probs = state.probabilities([1, 0]) target = np.array([0.5, 0.5, 0, 0]) self.assertTrue(np.allclose(probs, target)) # 1-qubit qargs with self.subTest(msg="P([0])"): probs = state.probabilities([0]) target = np.array([1, 0]) self.assertTrue(np.allclose(probs, target)) with self.subTest(msg="P([1])"): probs = state.probabilities([1]) target = np.array([0.5, 0.5]) self.assertTrue(np.allclose(probs, target))
def test_probabilities_dict_product(self): """Test probabilities_dict method for product state""" state = DensityMatrix.from_label("+0") # 2-qubit qargs with self.subTest(msg="P(None)"): probs = state.probabilities_dict() target = {"00": 0.5, "10": 0.5} self.assertDictAlmostEqual(probs, target) with self.subTest(msg="P([0, 1])"): probs = state.probabilities_dict([0, 1]) target = {"00": 0.5, "10": 0.5} self.assertDictAlmostEqual(probs, target) with self.subTest(msg="P([1, 0]"): probs = state.probabilities_dict([1, 0]) target = {"00": 0.5, "01": 0.5} self.assertDictAlmostEqual(probs, target) # 1-qubit qargs with self.subTest(msg="P([0])"): probs = state.probabilities_dict([0]) target = {"0": 1} self.assertDictAlmostEqual(probs, target) with self.subTest(msg="P([1])"): probs = state.probabilities_dict([1]) target = {"0": 0.5, "1": 0.5} self.assertDictAlmostEqual(probs, target)
def test_probabilities_dict_product(self): """Test probabilities_dict method for product state""" state = DensityMatrix.from_label('+0') # 2-qubit qargs with self.subTest(msg='P(None)'): probs = state.probabilities_dict() target = {'00': 0.5, '10': 0.5} self.assertDictAlmostEqual(probs, target) with self.subTest(msg='P([0, 1])'): probs = state.probabilities_dict([0, 1]) target = {'00': 0.5, '10': 0.5} self.assertDictAlmostEqual(probs, target) with self.subTest(msg='P([1, 0]'): probs = state.probabilities_dict([1, 0]) target = {'00': 0.5, '01': 0.5} self.assertDictAlmostEqual(probs, target) # 1-qubit qargs with self.subTest(msg='P([0])'): probs = state.probabilities_dict([0]) target = {'0': 1} self.assertDictAlmostEqual(probs, target) with self.subTest(msg='P([1])'): probs = state.probabilities_dict([1]) target = {'0': 0.5, '1': 0.5} self.assertDictAlmostEqual(probs, target)
def test_from_circuit(self): """Test initialization from a circuit.""" # random unitaries u0 = random_unitary(2).data u1 = random_unitary(2).data # add to circuit qr = QuantumRegister(2) circ = QuantumCircuit(qr) circ.unitary(u0, [qr[0]]) circ.unitary(u1, [qr[1]]) # Test decomposition of controlled-H gate circuit = QuantumCircuit(2) circ.x(0) circuit.ch(0, 1) target = DensityMatrix.from_label("00").evolve(Operator(circuit)) rho = DensityMatrix.from_instruction(circuit) self.assertEqual(rho, target) # Test initialize instruction init = Statevector([1, 0, 0, 1j]) / np.sqrt(2) target = DensityMatrix(init) circuit = QuantumCircuit(2) circuit.initialize(init.data, [0, 1]) rho = DensityMatrix.from_instruction(circuit) self.assertEqual(rho, target) # Test reset instruction target = DensityMatrix([1, 0]) circuit = QuantumCircuit(1) circuit.h(0) circuit.reset(0) rho = DensityMatrix.from_instruction(circuit) self.assertEqual(rho, target)
def test_from_circuit(self): """Test initialization from a circuit.""" # random unitaries u0 = random_unitary(2).data u1 = random_unitary(2).data # add to circuit qr = QuantumRegister(2) circ = QuantumCircuit(qr) circ.unitary(u0, [qr[0]]) circ.unitary(u1, [qr[1]]) target_vec = Statevector(np.kron(u1, u0).dot([1, 0, 0, 0])) target = DensityMatrix(target_vec) rho = DensityMatrix.from_instruction(circ) self.assertEqual(rho, target) # Test tensor product of 1-qubit gates circuit = QuantumCircuit(3) circuit.h(0) circuit.x(1) circuit.ry(np.pi / 2, 2) target = DensityMatrix.from_label('000').evolve(Operator(circuit)) rho = DensityMatrix.from_instruction(circuit) self.assertEqual(rho, target) # Test decomposition of Controlled-u1 gate lam = np.pi / 4 circuit = QuantumCircuit(2) circuit.h(0) circuit.h(1) circuit.cu1(lam, 0, 1) target = DensityMatrix.from_label('00').evolve(Operator(circuit)) rho = DensityMatrix.from_instruction(circuit) self.assertEqual(rho, target) # Test decomposition of controlled-H gate circuit = QuantumCircuit(2) circ.x(0) circuit.ch(0, 1) target = DensityMatrix.from_label('00').evolve(Operator(circuit)) rho = DensityMatrix.from_instruction(circuit) self.assertEqual(rho, target)
def test_density_matrix_partial_trace(self): """Test partial_trace function on density matrices""" rho = DensityMatrix.from_label("10+") self.assertEqual(partial_trace(rho, [0, 1]), DensityMatrix.from_label("1")) self.assertEqual(partial_trace(rho, [0, 2]), DensityMatrix.from_label("0")) self.assertEqual(partial_trace(rho, [1, 2]), DensityMatrix.from_label("+")) self.assertEqual(partial_trace(rho, [0]), DensityMatrix.from_label("10")) self.assertEqual(partial_trace(rho, [1]), DensityMatrix.from_label("1+")) self.assertEqual(partial_trace(rho, [2]), DensityMatrix.from_label("0+"))
def test_density_matrix_partial_trace(self): """Test partial_trace function on density matrices""" rho = DensityMatrix.from_label('10+') self.assertEqual(partial_trace(rho, [0, 1]), DensityMatrix.from_label('1')) self.assertEqual(partial_trace(rho, [0, 2]), DensityMatrix.from_label('0')) self.assertEqual(partial_trace(rho, [1, 2]), DensityMatrix.from_label('+')) self.assertEqual(partial_trace(rho, [0]), DensityMatrix.from_label('10')) self.assertEqual(partial_trace(rho, [1]), DensityMatrix.from_label('1+')) self.assertEqual(partial_trace(rho, [2]), DensityMatrix.from_label('0+'))
def test_statevector_partial_trace(self): """Test partial_trace function on statevectors""" psi = Statevector.from_label("10+") self.assertEqual(partial_trace(psi, [0, 1]), DensityMatrix.from_label("1")) self.assertEqual(partial_trace(psi, [0, 2]), DensityMatrix.from_label("0")) self.assertEqual(partial_trace(psi, [1, 2]), DensityMatrix.from_label("+")) self.assertEqual(partial_trace(psi, [0]), DensityMatrix.from_label("10")) self.assertEqual(partial_trace(psi, [1]), DensityMatrix.from_label("1+")) self.assertEqual(partial_trace(psi, [2]), DensityMatrix.from_label("0+"))
def test_statevector_partial_trace(self): """Test partial_trace function on statevectors""" psi = Statevector.from_label('10+') self.assertEqual(partial_trace(psi, [0, 1]), DensityMatrix.from_label('1')) self.assertEqual(partial_trace(psi, [0, 2]), DensityMatrix.from_label('0')) self.assertEqual(partial_trace(psi, [1, 2]), DensityMatrix.from_label('+')) self.assertEqual(partial_trace(psi, [0]), DensityMatrix.from_label('10')) self.assertEqual(partial_trace(psi, [1]), DensityMatrix.from_label('1+')) self.assertEqual(partial_trace(psi, [2]), DensityMatrix.from_label('0+'))
def test_measure_2qubit(self): """Test measure method for 2-qubit state""" state = DensityMatrix.from_label("+0") seed = 200 shots = 100 with self.subTest(msg="measure"): for i in range(shots): rho = state.copy() rho.seed(seed + i) outcome, value = rho.measure() self.assertIn(outcome, ["00", "10"]) if outcome == "00": target = DensityMatrix.from_label("00") self.assertEqual(value, target) else: target = DensityMatrix.from_label("10") self.assertEqual(value, target) with self.subTest(msg="measure [0, 1]"): for i in range(shots): rho = state.copy() outcome, value = rho.measure([0, 1]) self.assertIn(outcome, ["00", "10"]) if outcome == "00": target = DensityMatrix.from_label("00") self.assertEqual(value, target) else: target = DensityMatrix.from_label("10") self.assertEqual(value, target) with self.subTest(msg="measure [1, 0]"): for i in range(shots): rho = state.copy() outcome, value = rho.measure([1, 0]) self.assertIn(outcome, ["00", "01"]) if outcome == "00": target = DensityMatrix.from_label("00") self.assertEqual(value, target) else: target = DensityMatrix.from_label("10") self.assertEqual(value, target) with self.subTest(msg="measure [0]"): for i in range(shots): rho = state.copy() outcome, value = rho.measure([0]) self.assertEqual(outcome, "0") target = DensityMatrix.from_label("+0") self.assertEqual(value, target) with self.subTest(msg="measure [1]"): for i in range(shots): rho = state.copy() outcome, value = rho.measure([1]) self.assertIn(outcome, ["0", "1"]) if outcome == "0": target = DensityMatrix.from_label("00") self.assertEqual(value, target) else: target = DensityMatrix.from_label("10") self.assertEqual(value, target)
def test_measure_2qubit(self): """Test measure method for 2-qubit state""" state = DensityMatrix.from_label('+0') seed = 200 shots = 100 with self.subTest(msg='measure'): for i in range(shots): rho = state.copy() rho.seed(seed + i) outcome, value = rho.measure() self.assertIn(outcome, ['00', '10']) if outcome == '00': target = DensityMatrix.from_label('00') self.assertEqual(value, target) else: target = DensityMatrix.from_label('10') self.assertEqual(value, target) with self.subTest(msg='measure [0, 1]'): for i in range(shots): rho = state.copy() outcome, value = rho.measure([0, 1]) self.assertIn(outcome, ['00', '10']) if outcome == '00': target = DensityMatrix.from_label('00') self.assertEqual(value, target) else: target = DensityMatrix.from_label('10') self.assertEqual(value, target) with self.subTest(msg='measure [1, 0]'): for i in range(shots): rho = state.copy() outcome, value = rho.measure([1, 0]) self.assertIn(outcome, ['00', '01']) if outcome == '00': target = DensityMatrix.from_label('00') self.assertEqual(value, target) else: target = DensityMatrix.from_label('10') self.assertEqual(value, target) with self.subTest(msg='measure [0]'): for i in range(shots): rho = state.copy() outcome, value = rho.measure([0]) self.assertEqual(outcome, '0') target = DensityMatrix.from_label('+0') self.assertEqual(value, target) with self.subTest(msg='measure [1]'): for i in range(shots): rho = state.copy() outcome, value = rho.measure([1]) self.assertIn(outcome, ['0', '1']) if outcome == '0': target = DensityMatrix.from_label('00') self.assertEqual(value, target) else: target = DensityMatrix.from_label('10') self.assertEqual(value, target)