def test_kron_both_unitary(self): """Test kronecker product of two unitary qobj 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.kron(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, p = error.error_term(j) unitary = circ[0]['params'] 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(p, 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 kron probabilities") self.assertEqual(target_unitaries, [], msg="Incorrect kron unitaries")
def test_kron_both_qobj(self): """Test kronecker product of two unitary 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.kron(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': 'id', 'qubits': [0]}, {'name': 'x', 'qubits': [1]}], [{'name': 'id', 'qubits': [0]}, {'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, p = 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(p, 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 kron probabilities") self.assertEqual(target_circs, [], msg="Incorrect kron circuits")