def test_readout_confusion_matrix_repr_and_equality(): mat1 = cirq.testing.random_orthogonal(4, random_state=1234) mat2 = cirq.testing.random_orthogonal(2, random_state=1234) q = cirq.LineQubit.range(3) a = cirq.TensoredConfusionMatrices([mat1, mat2], [q[:2], q[2:]], repetitions=0, timestamp=0) b = cirq.TensoredConfusionMatrices(mat1, q[:2], repetitions=0, timestamp=0) c = cirq.TensoredConfusionMatrices(mat2, q[2:], repetitions=0, timestamp=0) for x in [a, b, c]: cirq.testing.assert_equivalent_repr(x) assert cirq.approx_eq(x, x) assert x._approx_eq_(mat1, 1e-6) is NotImplemented eq = cirq.testing.EqualsTester() eq.add_equality_group(a, a) eq.add_equality_group(b, b) eq.add_equality_group(c, c)
def test_from_measurement(): qubits = cirq.LineQubit.range(3) confuse_02 = np.array([[0, 1, 0, 0], [0, 0, 0, 1], [1, 0, 0, 0], [0, 0, 1, 0]]) confuse_1 = np.array([[0, 1], [1, 0]]) op = cirq.measure( *qubits, key='a', invert_mask=(True, False), confusion_map={ (0, 2): confuse_02, (1, ): confuse_1 }, ) tcm = cirq.TensoredConfusionMatrices.from_measurement(op.gate, op.qubits) expected_tcm = cirq.TensoredConfusionMatrices([confuse_02, confuse_1], ((qubits[0], qubits[2]), (qubits[1], )), repetitions=0, timestamp=0) assert tcm == expected_tcm no_cm_op = cirq.measure(*qubits, key='a') with pytest.raises(ValueError, match="Measurement has no confusion matrices"): _ = cirq.TensoredConfusionMatrices.from_measurement( no_cm_op.gate, no_cm_op.qubits)
def test_readout_confusion_matrix_raises(): num_qubits = 2 confusion_matrix = get_expected_cm(num_qubits, 0.1, 0.2) qubits = cirq.LineQubit.range(4) with pytest.raises(ValueError, match=r"measure_qubits cannot be empty"): _ = cirq.TensoredConfusionMatrices([], [], repetitions=0, timestamp=0) with pytest.raises(ValueError, match=r"len\(confusion_matrices\)"): _ = cirq.TensoredConfusionMatrices([confusion_matrix], [qubits[:2], qubits[2:]], repetitions=0, timestamp=0) with pytest.raises(ValueError, match="Shape mismatch for confusion matrix"): _ = cirq.TensoredConfusionMatrices(confusion_matrix, qubits, repetitions=0, timestamp=0) with pytest.raises(ValueError, match="Repeated qubits not allowed"): _ = cirq.TensoredConfusionMatrices( [confusion_matrix, confusion_matrix], [qubits[:2], qubits[1:3]], repetitions=0, timestamp=0, ) readout_cm = cirq.TensoredConfusionMatrices( [confusion_matrix, confusion_matrix], [qubits[:2], qubits[2:]], repetitions=0, timestamp=0) with pytest.raises(ValueError, match="should be a subset of"): _ = readout_cm.confusion_matrix([cirq.NamedQubit("a")]) with pytest.raises(ValueError, match="should be a subset of"): _ = readout_cm.correction_matrix([cirq.NamedQubit("a")]) with pytest.raises(ValueError, match="result.shape .* should be"): _ = readout_cm.apply(np.asarray([100]), qubits[:2]) with pytest.raises(ValueError, match="method.* should be"): _ = readout_cm.apply(np.asarray([1 / 16] * 16), method='l1norm')