def test_tensor_both_unitary_standard_gates(self): """Test tensor 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 = error1.tensor(error0) # 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 tensor probabilities") self.assertEqual(target_circs, [], msg="Incorrect tensor circuits")
def test_tensor_both_unitary_instruction(self): """Test tensor 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 = error1.tensor(error0) # 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 tensor probabilities") self.assertEqual(target_unitaries, [], msg="Incorrect tensor unitaries")