예제 #1
0
def test_circuit_diagram_info_args_eq():
    eq = cirq.testing.EqualsTester()
    eq.add_equality_group(cirq.CircuitDiagramInfoArgs.UNINFORMED_DEFAULT)
    eq.add_equality_group(cirq.CircuitDiagramInfoArgs(
        known_qubits=None,
        known_qubit_count=None,
        use_unicode_characters=False,
        precision=None,
        qubit_map=None))
    eq.add_equality_group(cirq.CircuitDiagramInfoArgs(
        known_qubits=None,
        known_qubit_count=None,
        use_unicode_characters=True,
        precision=None,
        qubit_map=None))
    eq.add_equality_group(cirq.CircuitDiagramInfoArgs(
        known_qubits=cirq.LineQubit.range(3),
        known_qubit_count=3,
        use_unicode_characters=False,
        precision=None,
        qubit_map=None))
    eq.add_equality_group(cirq.CircuitDiagramInfoArgs(
        known_qubits=cirq.LineQubit.range(2),
        known_qubit_count=2,
        use_unicode_characters=False,
        precision=None,
        qubit_map=None))
    eq.add_equality_group(cirq.CircuitDiagramInfoArgs(
        known_qubits=cirq.LineQubit.range(2),
        known_qubit_count=2,
        use_unicode_characters=False,
        precision=None,
        qubit_map={cirq.LineQubit(0): 5, cirq.LineQubit(1): 7}))
def test_get_qcircuit_diagram_info():
    qubits = cirq.NamedQubit('x'), cirq.NamedQubit('y')

    gate = cirq.SwapPowGate(exponent=0.5)
    op = gate(*qubits)
    qubit_map = {q: i for i, q in enumerate(qubits)}
    args = cirq.CircuitDiagramInfoArgs(
        known_qubits=qubits,
        known_qubit_count=None,
        use_unicode_characters=True,
        precision=3,
        label_map=qubit_map,
    )
    actual_info = ccq.get_qcircuit_diagram_info(op, args)
    name = r'{\text{SWAP}^{0.5}}'
    expected_info = cirq.CircuitDiagramInfo(
        (r'\multigate{1}' + name, r'\ghost' + name),
        exponent=1,
        connected=False)
    assert actual_info == expected_info

    gate = cirq.SWAP
    op = gate(*qubits)
    qubit_map = {q: i for q, i in zip(qubits, (4, 3))}
    args = cirq.CircuitDiagramInfoArgs(
        known_qubits=qubits,
        known_qubit_count=None,
        use_unicode_characters=True,
        precision=3,
        label_map=qubit_map,
    )
    actual_info = ccq.get_qcircuit_diagram_info(op, args)
    expected_info = cirq.CircuitDiagramInfo(
        (r'\ghost{\text{SWAP}}', r'\multigate{1}{\text{SWAP}}'),
        connected=False)
    assert actual_info == expected_info

    qubit_map = {q: i for q, i in zip(qubits, (2, 5))}
    args = cirq.CircuitDiagramInfoArgs(
        known_qubits=qubits,
        known_qubit_count=None,
        use_unicode_characters=True,
        precision=3,
        label_map=qubit_map,
    )
    actual_info = ccq.get_qcircuit_diagram_info(op, args)
    expected_info = cirq.CircuitDiagramInfo((r'\gate{\text{Swap}}', ) * 2)
    assert actual_info == expected_info

    actual_info = ccq.get_qcircuit_diagram_info(
        op, cirq.CircuitDiagramInfoArgs.UNINFORMED_DEFAULT)
    assert actual_info == expected_info
예제 #3
0
def test_circuit_diagram():
    class TaggyTag:
        """Tag with a custom repr function to test circuit diagrams."""

        def __repr__(self):
            return 'TaggyTag()'

    h = cirq.H(cirq.GridQubit(1, 1))
    tagged_h = h.with_tags('tag1')
    non_string_tag_h = h.with_tags(TaggyTag())

    expected = cirq.CircuitDiagramInfo(
        wire_symbols=("H['tag1']",),
        exponent=1.0,
        connected=True,
        exponent_qubit_index=None,
        auto_exponent_parens=True,
    )
    args = cirq.CircuitDiagramInfoArgs(None, None, None, None, None, False)
    assert cirq.circuit_diagram_info(tagged_h) == expected
    assert cirq.circuit_diagram_info(tagged_h, args) == cirq.circuit_diagram_info(h)

    c = cirq.Circuit(tagged_h)
    diagram_with_tags = "(1, 1): ───H['tag1']───"
    diagram_without_tags = "(1, 1): ───H───"
    assert str(cirq.Circuit(tagged_h)) == diagram_with_tags
    assert c.to_text_diagram() == diagram_with_tags
    assert c.to_text_diagram(include_tags=False) == diagram_without_tags

    c = cirq.Circuit(non_string_tag_h)
    diagram_with_non_string_tag = "(1, 1): ───H[TaggyTag()]───"
    assert c.to_text_diagram() == diagram_with_non_string_tag
    assert c.to_text_diagram(include_tags=False) == diagram_without_tags
예제 #4
0
def test_bad_args():
    gate = cca.BipartiteSwapNetworkGate(cca.BipartiteGraphType.COMPLETE, 2)
    qubits = cirq.LineQubit.range(4)
    gate.subgraph = 'not a subgraph'
    args = cirq.CircuitDiagramInfoArgs(
        known_qubits=None,
        known_qubit_count=None,
        use_unicode_characters=True,
        precision=3,
        qubit_map=None,
    )
    with pytest.raises(NotImplementedError):
        gate._circuit_diagram_info_(args)

    args.known_qubit_count = 3
    with pytest.raises(ValueError):
        gate._circuit_diagram_info_(args)

    with pytest.raises(ValueError):
        gate._decompose_(qubits[:3])

    gate.subgraph = 'unimplemented subgraph'
    with pytest.raises(NotImplementedError):
        gate._decompose_(qubits)

    args.known_qubit_count = None
    with pytest.raises(NotImplementedError):
        gate._circuit_diagram_info_(args)
def test_format_radians_with_precision():
    args = cirq.CircuitDiagramInfoArgs(
        known_qubits=None,
        known_qubit_count=None,
        use_unicode_characters=False,
        precision=3,
        label_map=None,
    )
    assert args.format_radians(np.pi) == 'pi'
    assert args.format_radians(-np.pi) == '-pi'
    assert args.format_radians(np.pi / 2) == '0.5pi'
    assert args.format_radians(-3 * np.pi / 4) == '-0.75pi'
    assert args.format_radians(1.1) == '0.35pi'
    assert args.format_radians(1.234567) == '0.393pi'
    assert args.format_radians(sympy.Symbol('t')) == 't'
    assert args.format_radians(sympy.Symbol('t') * 2 + 1) == '2*t + 1'

    args.use_unicode_characters = True
    assert args.format_radians(np.pi) == 'π'
    assert args.format_radians(-np.pi) == '-π'
    assert args.format_radians(np.pi / 2) == '0.5π'
    assert args.format_radians(-3 * np.pi / 4) == '-0.75π'
    assert args.format_radians(1.1) == '0.35π'
    assert args.format_radians(1.234567) == '0.393π'
    assert args.format_radians(sympy.Symbol('t')) == 't'
    assert args.format_radians(sympy.Symbol('t') * 2 + 1) == '2*t + 1'
예제 #6
0
def test_text_to_qcircuit_diagrammable():
    qubits = cirq.NamedQubit('x'), cirq.NamedQubit('y')

    g = cirq.SwapPowGate(exponent=0.5)
    f = _TextToQCircuitDiagrammable(g)
    qubit_map = {q: i for i, q in enumerate(qubits)}
    actual_info = f.qcircuit_diagram_info(
        cirq.CircuitDiagramInfoArgs(known_qubits=qubits,
                                    known_qubit_count=None,
                                    use_unicode_characters=True,
                                    precision=3,
                                    qubit_map=qubit_map))
    name = '{\\text{SWAP}^{0.5}}'
    expected_info = cirq.CircuitDiagramInfo(
        ('\multigate{1}' + name, '\ghost' + name),
        exponent=0.5,
        connected=False)
    assert actual_info == expected_info

    g = cirq.SWAP
    f = _TextToQCircuitDiagrammable(g)
    qubit_map = {q: i for q, i in zip(qubits, (4, 3))}
    actual_info = f.qcircuit_diagram_info(
        cirq.CircuitDiagramInfoArgs(known_qubits=qubits,
                                    known_qubit_count=None,
                                    use_unicode_characters=True,
                                    precision=3,
                                    qubit_map=qubit_map))
    expected_info = cirq.CircuitDiagramInfo(
        ('\ghost{\\text{SWAP}}', '\multigate{1}{\\text{SWAP}}'),
        connected=False)
    assert actual_info == expected_info

    qubit_map = {q: i for q, i in zip(qubits, (2, 5))}
    actual_info = f.qcircuit_diagram_info(
        cirq.CircuitDiagramInfoArgs(known_qubits=qubits,
                                    known_qubit_count=None,
                                    use_unicode_characters=True,
                                    precision=3,
                                    qubit_map=qubit_map))
    expected_info = cirq.CircuitDiagramInfo(('\\gate{\\text{×}}', ) * 2)
    assert actual_info == expected_info

    actual_info = f.qcircuit_diagram_info(
        cirq.CircuitDiagramInfoArgs.UNINFORMED_DEFAULT)
    assert actual_info == expected_info
예제 #7
0
def test_circuit_diagram_info_args_repr():
    cirq.testing.assert_equivalent_repr(
        cirq.CircuitDiagramInfoArgs(
            known_qubits=cirq.LineQubit.range(2),
            known_qubit_count=2,
            use_unicode_characters=True,
            precision=5,
            qubit_map={cirq.LineQubit(0): 5, cirq.LineQubit(1): 7}))
예제 #8
0
def test_measurement_gate_diagram():
    # Shows key.
    assert cirq.circuit_diagram_info(cirq.MeasurementGate(1)) == cirq.CircuitDiagramInfo(("M('')",))
    assert cirq.circuit_diagram_info(
        cirq.MeasurementGate(1, key='test')
    ) == cirq.CircuitDiagramInfo(("M('test')",))

    # Uses known qubit count.
    assert (
        cirq.circuit_diagram_info(
            cirq.MeasurementGate(3),
            cirq.CircuitDiagramInfoArgs(
                known_qubits=None,
                known_qubit_count=3,
                use_unicode_characters=True,
                precision=None,
                qubit_map=None,
            ),
        )
        == cirq.CircuitDiagramInfo(("M('')", 'M', 'M'))
    )

    # Shows invert mask.
    assert cirq.circuit_diagram_info(
        cirq.MeasurementGate(2, invert_mask=(False, True))
    ) == cirq.CircuitDiagramInfo(("M('')", "!M"))

    # Omits key when it is the default.
    a = cirq.NamedQubit('a')
    b = cirq.NamedQubit('b')
    cirq.testing.assert_has_diagram(
        cirq.Circuit(cirq.measure(a, b)),
        """
a: ───M───
      │
b: ───M───
""",
    )
    cirq.testing.assert_has_diagram(
        cirq.Circuit(cirq.measure(a, b, invert_mask=(True,))),
        """
a: ───!M───
      │
b: ───M────
""",
    )
    cirq.testing.assert_has_diagram(
        cirq.Circuit(cirq.measure(a, b, key='test')),
        """
a: ───M('test')───
      │
b: ───M───────────
""",
    )
예제 #9
0
def test_circuit_diagram():
    h = cirq.H(cirq.GridQubit(1, 1))
    tagged_h = h.with_tags('tag1')
    expected = cirq.CircuitDiagramInfo(wire_symbols=("H['tag1']", ),
                                       exponent=1.0,
                                       connected=True,
                                       exponent_qubit_index=None,
                                       auto_exponent_parens=True)
    args = cirq.CircuitDiagramInfoArgs(None, None, None, None, None, False)
    assert cirq.circuit_diagram_info(tagged_h) == expected
    assert (cirq.circuit_diagram_info(tagged_h,
                                      args) == cirq.circuit_diagram_info(h))

    c = cirq.Circuit(tagged_h)
    diagram_with_tags = "(1, 1): ───H['tag1']───"
    diagram_without_tags = "(1, 1): ───H───"
    assert str(cirq.Circuit(tagged_h)) == diagram_with_tags
    assert c.to_text_diagram() == diagram_with_tags
    assert c.to_text_diagram(include_tags=False) == diagram_without_tags
def test_format_radians_without_precision():
    args = cirq.CircuitDiagramInfoArgs(known_qubits=None,
                                       known_qubit_count=None,
                                       use_unicode_characters=False,
                                       precision=None,
                                       qubit_map=None)
    assert args.format_radians(np.pi) == 'pi'
    assert args.format_radians(-np.pi) == '-pi'
    assert args.format_radians(1.1) == '1.1'
    assert args.format_radians(1.234567) == '1.234567'
    assert args.format_radians(1 / 7) == repr(1 / 7)
    assert args.format_radians(sympy.Symbol('t')) == 't'
    assert args.format_radians(sympy.Symbol('t') * 2 + 1) == '2*t + 1'

    args.use_unicode_characters = True
    assert args.format_radians(np.pi) == 'π'
    assert args.format_radians(-np.pi) == '-π'
    assert args.format_radians(1.1) == '1.1'
    assert args.format_radians(1.234567) == '1.234567'
    assert args.format_radians(1 / 7) == repr(1 / 7)
    assert args.format_radians(sympy.Symbol('t')) == 't'
    assert args.format_radians(sympy.Symbol('t') * 2 + 1) == '2*t + 1'
예제 #11
0
import re

import numpy as np
import pytest

import cirq

X = np.array([[0, 1], [1, 0]])
Y = np.array([[0, -1j], [1j, 0]])
Z = np.array([[1, 0], [0, -1]])

no_precision = cirq.CircuitDiagramInfoArgs(
    known_qubits=None,
    known_qubit_count=None,
    use_unicode_characters=True,
    precision=None,
    qubit_map=None,
)

round_to_6_prec = cirq.CircuitDiagramInfoArgs(
    known_qubits=None,
    known_qubit_count=None,
    use_unicode_characters=True,
    precision=6,
    qubit_map=None,
)

round_to_2_prec = cirq.CircuitDiagramInfoArgs(
    known_qubits=None,
    known_qubit_count=None,