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)
Exemplo n.º 2
0
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')