Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add cirq.testing.assert_same_diagram. #917

Merged
merged 6 commits into from
Sep 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions cirq/circuits/circuit_dag_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,17 +228,17 @@ def test_larger_circuit():
assert circuit.device == dag.to_circuit().device
# Operation order within a moment is non-deterministic
# but text diagrams still look the same.
assert (circuit.to_text_diagram() ==
dag.to_circuit().to_text_diagram() ==
"""
desired = """
(0, 5): ───X───@───Y───Z───X───Y───@───
│ │
(1, 5): ───@───@───@───────────────@───
│ │
(2, 5): ───@───────@───────────────────

(3, 5): ───T───────────────────────────
""".strip())
"""
cirq.testing.assert_has_diagram(circuit, desired)
cirq.testing.assert_has_diagram(dag.to_circuit(), desired)

cirq.testing.assert_allclose_up_to_global_phase(
circuit.to_unitary_matrix(),
Expand Down
131 changes: 55 additions & 76 deletions cirq/circuits/circuit_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -459,15 +459,13 @@ def optimization_at(self, circuit, index, op):

prepend_two_Xs_append_one_Y.optimize_circuit(circuit)

actual_text_diagram = circuit.to_text_diagram().strip()
expected_text_diagram = """
cirq.testing.assert_has_diagram(circuit, """
a: ───Z───Z───@───Y───────────────Z───Z───@───Y───
│ │
b: ───────────@───Z───Z───@───Y───────────@───────
c: ───────────────────────@───────────────────────
""".strip()
assert actual_text_diagram == expected_text_diagram
""")

prepender = lambda op: (cirq.X(op.qubits[0]),) * 3 + (op,)
prepend_3_Xs = Replacer(prepender)
Expand All @@ -477,15 +475,13 @@ def optimization_at(self, circuit, index, op):
Moment([cirq.CNOT(c, b)])
])
prepend_3_Xs.optimize_circuit(circuit)
actual_text_diagram = circuit.to_text_diagram().strip()
expected_text_diagram = """
cirq.testing.assert_has_diagram(circuit, """
a: ───X───X───X───@───────────────────────────────────
b: ───────────────X───X───X───X───@───────────────X───
│ │
c: ───────────────────────────────X───X───X───X───@───
""".strip()
assert actual_text_diagram == expected_text_diagram
""")

duplicate = Replacer(lambda op: (op,) * 2)
circuit = Circuit([
Expand All @@ -494,8 +490,7 @@ def optimization_at(self, circuit, index, op):
for i in range(4)])

duplicate.optimize_circuit(circuit)
actual_text_diagram = circuit.to_text_diagram().strip()
expected_text_diagram = """
cirq.testing.assert_has_diagram(circuit, """
a: ───@───@───────────@───@───────────
│ │ │ │
b: ───@───@───@───@───@───@───@───@───
Expand All @@ -507,40 +502,35 @@ def optimization_at(self, circuit, index, op):
e: ───@───@───@───@───@───@───@───@───
│ │ │ │
f: ───@───@───────────@───@───────────
""".strip()
assert actual_text_diagram == expected_text_diagram
""")

circuit = Circuit([
Moment([cirq.CZ(*qubits[2:4]), cirq.CNOT(*qubits[:2])]),
Moment([cirq.CNOT(*qubits[1::-1])])
])

duplicate.optimize_circuit(circuit)
actual_text_diagram = circuit.to_text_diagram().strip()
expected_text_diagram = """
cirq.testing.assert_has_diagram(circuit, """
a: ───@───@───X───X───
│ │ │ │
b: ───X───X───@───@───

c: ───@───────@───────
│ │
d: ───@───────@───────
""".strip()
assert actual_text_diagram == expected_text_diagram
""")


def test_insert_into_range():
x = cirq.NamedQubit('x')
y = cirq.NamedQubit('y')
c = Circuit([Moment([cirq.X(x)])] * 4)
c.insert_into_range([cirq.Z(x), cirq.CZ(x, y)], 2, 2)
actual_text_diagram = c.to_text_diagram().strip()
expected_text_diagram = """
cirq.testing.assert_has_diagram(c, """
x: ───X───X───Z───@───X───X───
y: ───────────────@───────────
""".strip()
assert actual_text_diagram == expected_text_diagram
""")


def test_next_moment_operating_on():
Expand Down Expand Up @@ -1000,27 +990,27 @@ def test_to_text_diagram_teleportation_to_diagram():
Moment([cirq.CZ(bob, tmp)]),
])

assert c.to_text_diagram().strip() == """
cirq.testing.assert_has_diagram(c, """
(0, 0): ───H───@───────────X───────M───@───────────
│ │ │
(0, 1): ───────X───────────┼───────────X───────@───
│ │
(1, 0): ───────────X^0.5───@───H───M───────@───┼───
│ │
(1, 1): ───────────────────────────────────X───@───
""".strip()
assert c.to_text_diagram(use_unicode_characters=False).strip() == """
""")

cirq.testing.assert_has_diagram(c, """
(0, 0): ---H---@-----------X-------M---@-----------
| | |
(0, 1): -------X-----------|-----------X-------@---
| |
(1, 0): -----------X^0.5---@---H---M-------@---|---
| |
(1, 1): -----------------------------------X---@---
""".strip()
""", use_unicode_characters=False)

assert c.to_text_diagram(transpose=True,
use_unicode_characters=False).strip() == """
cirq.testing.assert_has_diagram(c, """
(0, 0) (0, 1) (1, 0) (1, 1)
| | | |
H | | |
Expand All @@ -1041,7 +1031,7 @@ def test_to_text_diagram_teleportation_to_diagram():
| | | |
| @-------------@
| | | |
""".strip()
""", use_unicode_characters=False, transpose=True)


def test_diagram_with_unknown_exponent():
Expand All @@ -1063,7 +1053,7 @@ def text_diagram_info(self, args: cirq.TextDiagramInfoArgs
)

# The hyphen in the exponent should cause parens to appear.
assert c.to_text_diagram() == 'q: ───B^fancy───W^(fancy-that)───'
cirq.testing.assert_has_diagram(c, 'q: ───B^fancy───W^(fancy-that)───')


def test_to_text_diagram_extended_gate():
Expand All @@ -1081,24 +1071,22 @@ def __repr__(self):
])

# Fallback to repr without extension.
diagram = Circuit([
cirq.testing.assert_has_diagram(Circuit([
Moment([f.on(q)]),
]).to_text_diagram(use_unicode_characters=False)
assert diagram.strip() == """
]), """
(0, 0): ---python-object-FGate:arbitrary-digits---
""".strip()
""", use_unicode_characters=False)

# When used on multiple qubits, show the qubit order as a digit suffix.
diagram = Circuit([
cirq.testing.assert_has_diagram(Circuit([
Moment([f.on(q, q3, q2)]),
]).to_text_diagram(use_unicode_characters=False)
assert diagram.strip() == """
]), """
(0, 0): ---python-object-FGate:arbitrary-digits:0---
|
(0, 1): ---python-object-FGate:arbitrary-digits:2---
|
(0, 2): ---python-object-FGate:arbitrary-digits:1---
""".strip()
""", use_unicode_characters=False)

# Succeeds with extension.
class FGateAsText(cirq.Gate, cirq.TextDiagrammable):
Expand All @@ -1110,38 +1098,36 @@ def text_diagram_info(self, args: cirq.TextDiagramInfoArgs):

ext = cirq.Extensions()
ext.add_cast(cirq.TextDiagrammable, FGate, FGateAsText)
diagram = c.to_text_diagram(ext, use_unicode_characters=False)

assert diagram.strip() == """
cirq.testing.assert_has_diagram(c, """
(0, 0): ---F---
""".strip()
""", ext=ext, use_unicode_characters=False)


def test_to_text_diagram_multi_qubit_gate():
q1 = cirq.NamedQubit('(0, 0)')
q2 = cirq.NamedQubit('(0, 1)')
q3 = cirq.NamedQubit('(0, 2)')
c = Circuit.from_ops(cirq.measure(q1, q2, q3, key='msg'))
assert c.to_text_diagram().strip() == """
cirq.testing.assert_has_diagram(c, """
(0, 0): ───M('msg')───
(0, 1): ───M──────────
(0, 2): ───M──────────
""".strip()
assert c.to_text_diagram(use_unicode_characters=False).strip() == """
""")
cirq.testing.assert_has_diagram(c, """
(0, 0): ---M('msg')---
|
(0, 1): ---M----------
|
(0, 2): ---M----------
""".strip()
assert c.to_text_diagram(transpose=True).strip() == """
""", use_unicode_characters=False)
cirq.testing.assert_has_diagram(c, """
(0, 0) (0, 1) (0, 2)
│ │ │
M('msg')─M──────M
│ │ │
""".strip()
""", transpose=True)


def test_to_text_diagram_many_qubits_gate_but_multiple_wire_symbols():
Expand Down Expand Up @@ -1183,67 +1169,60 @@ def test_to_text_diagram_custom_order():
qc = cirq.NamedQubit('4')

c = Circuit([Moment([cirq.X(qa), cirq.X(qb), cirq.X(qc)])])
diagram = c.to_text_diagram(
qubit_order=cirq.QubitOrder.sorted_by(lambda e: int(str(e)) % 3),
use_unicode_characters=False)
assert diagram.strip() == """
cirq.testing.assert_has_diagram(c, """
3: ---X---

4: ---X---

2: ---X---
""".strip()
""", qubit_order=cirq.QubitOrder.sorted_by(lambda e: int(str(e)) % 3),
use_unicode_characters=False)


def test_overly_precise_diagram():
# Test default precision of 3
qa = cirq.NamedQubit('a')
c = Circuit([Moment([cirq.X(qa)**0.12345678])])
diagram = c.to_text_diagram(use_unicode_characters=False)
assert diagram.strip() == """
cirq.testing.assert_has_diagram(c, """
a: ---X^0.123---
""".strip()
""", use_unicode_characters=False)


def test_none_precision_diagram():
# Test default precision of 3
qa = cirq.NamedQubit('a')
c = Circuit([Moment([cirq.X(qa)**0.4921875])])
diagram = c.to_text_diagram(use_unicode_characters=False, precision=None)
assert diagram.strip() == """
cirq.testing.assert_has_diagram(c, """
a: ---X^0.4921875---
""".strip()
""", use_unicode_characters=False, precision=None)


def test_diagram_custom_precision():
qa = cirq.NamedQubit('a')
c = Circuit([Moment([cirq.X(qa)**0.12341234])])
diagram = c.to_text_diagram(use_unicode_characters=False, precision=5)
assert diagram.strip() == """
cirq.testing.assert_has_diagram(c, """
a: ---X^0.12341---
""".strip()
""", use_unicode_characters=False, precision=5)


def test_diagram_wgate():
qa = cirq.NamedQubit('a')
test_wgate = cg.ExpWGate(
half_turns=0.12341234, axis_half_turns=0.43214321)
c = Circuit([Moment([test_wgate.on(qa)])])
diagram = c.to_text_diagram(use_unicode_characters=False, precision=2)
assert diagram.strip() == """
cirq.testing.assert_has_diagram(c, """
a: ---W(0.43)^0.12---
""".strip()
""", use_unicode_characters=False, precision=2)


def test_diagram_wgate_none_precision():
qa = cirq.NamedQubit('a')
test_wgate = cg.ExpWGate(
half_turns=0.12341234, axis_half_turns=0.43214321)
c = Circuit([Moment([test_wgate.on(qa)])])
diagram = c.to_text_diagram(use_unicode_characters=False, precision=None)
assert diagram.strip() == """
cirq.testing.assert_has_diagram(c, """
a: ---W(0.43214321)^0.12341234---
""".strip()
""", use_unicode_characters=False, precision=None)


def test_text_diagram_jupyter():
Expand Down Expand Up @@ -1472,23 +1451,23 @@ def text_diagram_info(self,
t1 = cirq.Circuit.from_ops(MultiTargetCZ().on(c, a))
t2 = cirq.Circuit.from_ops(MultiTargetCZ().on(c, a, b))

assert t0.to_text_diagram().strip() == """
cirq.testing.assert_has_diagram(t0, """
c: ───@───
""".strip()
""")

assert t1.to_text_diagram().strip() == """
cirq.testing.assert_has_diagram(t1, """
a: ───Z───
c: ───@───
""".strip()
""")

assert t2.to_text_diagram().strip() == """
cirq.testing.assert_has_diagram(t2, """
a: ───Z───
b: ───Z───
c: ───@───
""".strip()
""")


def test_transposed_diagram_exponent_order():
Expand All @@ -1498,7 +1477,7 @@ def test_transposed_diagram_exponent_order():
cirq.CZ(a, c)**0.5,
cirq.CZ(b, c)**0.125,
)
assert circuit.to_text_diagram(transpose=True).strip() == """
cirq.testing.assert_has_diagram(circuit, """
0 1 2
│ │ │
@─@^-0.5 │
Expand All @@ -1507,7 +1486,7 @@ def test_transposed_diagram_exponent_order():
│ │ │
│ @──────@^0.125
│ │ │
""".strip()
""", transpose=True)


def test_insert_moments():
Expand Down Expand Up @@ -1671,11 +1650,11 @@ def test_with_parameters_resolved_by():
)
resolved_circuit = circuit.with_parameters_resolved_by(
cirq.ParamResolver({'u': 0.1, 'v': 0.3, 'w': 0.2}))
assert resolved_circuit.to_text_diagram().strip() == """
cirq.testing.assert_has_diagram(resolved_circuit, """
0: ───@───────X^0.3───
1: ───@^0.1───Y^0.2───
""".strip()
""")


def test_items():
Expand Down
Loading