예제 #1
0
 def test_expand_both_unitary_standard_gates(self):
     """Test expand of two unitary standard gate errors"""
     unitaries0 = [standard_gate_unitary('id'), standard_gate_unitary('z')]
     probs0 = [0.9, 0.1]
     unitaries1 = [standard_gate_unitary('x'), standard_gate_unitary('y')]
     probs1 = [0.6, 0.4]
     error0 = QuantumError([
         np.sqrt(probs0[0]) * unitaries0[0],
         np.sqrt(probs0[1]) * unitaries0[1]
     ],
                           standard_gates=True)
     error1 = QuantumError([
         np.sqrt(probs1[0]) * unitaries1[0],
         np.sqrt(probs1[1]) * unitaries1[1]
     ],
                           standard_gates=True)
     error = error0.expand(error1)
     # Kronecker product probabilities
     target_probs = [
         probs1[0] * probs0[0], probs1[0] * probs0[1],
         probs1[1] * probs0[0], probs1[1] * probs0[1]
     ]
     # Target circuits
     target_circs = [[{
         'name': 'x',
         'qubits': [1]
     }], [{
         'name': 'y',
         'qubits': [1]
     }], [{
         'name': 'z',
         'qubits': [0]
     }, {
         'name': 'x',
         'qubits': [1]
     }], [{
         'name': 'z',
         'qubits': [0]
     }, {
         'name': 'y',
         'qubits': [1]
     }]]
     for j in range(4):
         circ, prob = error.error_term(j)
         # Remove prob from target if it is found
         # later we will check that target_probs is empty so all
         # the required ones have been removed
         self.remove_if_found(prob, target_probs)
         self.remove_if_found(circ, target_circs)
     # Check we had all the correct target probs and unitaries
     # by seeing if these lists are empty
     # Note that this doesn't actually check that the correct
     # prob was assigned to the correct unitary.
     self.assertEqual(target_probs, [],
                      msg="Incorrect expand probabilities")
     self.assertEqual(target_circs, [], msg="Incorrect expand circuits")
예제 #2
0
    def test_expand_both_unitary_instruction(self):
        """Test expand of two unitary instruction errors."""
        unitaries0 = [standard_gate_unitary('z'), standard_gate_unitary('s')]
        probs0 = [0.9, 0.1]
        unitaries1 = [standard_gate_unitary('x'), standard_gate_unitary('y')]
        probs1 = [0.6, 0.4]
        error0 = QuantumError([
            np.sqrt(probs0[0]) * unitaries0[0],
            np.sqrt(probs0[1]) * unitaries0[1]
        ],
                              standard_gates=False)
        error1 = QuantumError([
            np.sqrt(probs1[0]) * unitaries1[0],
            np.sqrt(probs1[1]) * unitaries1[1]
        ],
                              standard_gates=False)
        error = error0.expand(error1)
        # Kronecker product unitaries
        target_unitaries = [
            np.kron(unitaries1[0], unitaries0[0]),
            np.kron(unitaries1[0], unitaries0[1]),
            np.kron(unitaries1[1], unitaries0[0]),
            np.kron(unitaries1[1], unitaries0[1])
        ]
        # Kronecker product probabilities
        target_probs = [
            probs1[0] * probs0[0], probs1[0] * probs0[1],
            probs1[1] * probs0[0], probs1[1] * probs0[1]
        ]

        for j in range(4):
            circ, prob = error.error_term(j)
            unitary = circ[0]['params'][0]
            self.assertEqual(circ[0]['name'], 'unitary')
            self.assertEqual(circ[0]['qubits'], [0, 1])
            # Remove prob from target if it is found
            # later we will check that target_probs is empty so all
            # the required ones have been removed
            self.remove_if_found(prob, target_probs)
            self.remove_if_found(unitary, target_unitaries)
        # Check we had all the correct target probs and unitaries
        # by seeing if these lists are empty
        # Note that this doesn't actually check that the correct
        # prob was assigned to the correct unitary.
        self.assertEqual(target_probs, [],
                         msg="Incorrect expand probabilities")
        self.assertEqual(target_unitaries, [],
                         msg="Incorrect expand unitaries")