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))
Example #2
0
    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))
Example #3
0
    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)
Example #5
0
    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)
Example #6
0
    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)
Example #7
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+"))
Example #8
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+'))
Example #9
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+"))
Example #10
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+'))
Example #11
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)