Example #1
0
def _render(diagram: circuits.TextDiagramDrawer) -> str:
    w = diagram.width()
    h = diagram.height()

    qwx = {(x, y + 1)
           for x, y1, y2 in diagram.vertical_lines for y in range(y1, y2)}

    qw = {(x, y)
          for y, x1, x2 in diagram.horizontal_lines for x in range(x1, x2)}

    rows = []
    for y in range(h):
        row = []
        for x in range(w):
            cell = []
            key = (x, y)
            v = diagram.entries.get(key)
            if v is not None:
                cell.append(' ' + v + ' ')
            if key in qw:
                cell.append('\\qw ')
            if key in qwx:
                cell.append('\\qwx ')
            row.append(''.join(cell))
        rows.append('&'.join(row) + '\qw')

    grid = '\\\\\n'.join(rows)

    output = '\Qcircuit @R=1em @C=0.75em { \\\\ \n' + grid + ' \\\\ \n \\\\ }'

    return output
Example #2
0
def _render(diagram: circuits.TextDiagramDrawer) -> str:
    w = diagram.width()
    h = diagram.height()

    qwx = {(x, y + 1)
           for x, y1, y2, _ in diagram.vertical_lines for y in range(y1, y2)}

    qw = {(x, y)
          for y, x1, x2, _ in diagram.horizontal_lines for x in range(x1, x2)}

    diagram2 = circuits.TextDiagramDrawer()
    for y in range(h):
        for x in range(max(0, w - 1)):
            key = (x, y)
            diagram_text = diagram.entries.get(key)
            v = '&' + (diagram_text.text if diagram_text else '') + ' '
            diagram2.write(2 * x + 1, y, v)
            post1 = '\\qw' if key in qw else ''
            post2 = '\\qwx' if key in qwx else ''
            diagram2.write(2 * x + 2, y, post1 + post2)
        diagram2.write(2 * w - 1, y, '&\\qw\\\\')
    grid = diagram2.render(horizontal_spacing=0, vertical_spacing=0)

    output = '\Qcircuit @R=1em @C=0.75em {\n \\\\\n' + grid + '\n \\\\\n}'

    return output
Example #3
0
def _render(diagram: circuits.TextDiagramDrawer) -> str:
    w = diagram.width()
    h = diagram.height()

    qwx = {(x, y + 1)
           for x, y1, y2, _ in diagram.vertical_lines
           for y in range(y1, y2)}

    qw = {(x, y)
          for y, x1, x2, _ in diagram.horizontal_lines
          for x in range(x1, x2)}

    rows = []
    for y in range(h):
        row = []
        for x in range(w):
            cell = []
            key = (x, y)
            v = diagram.entries.get(key)
            if v is not None:
                cell.append(' ' + v + ' ')
            if key in qw:
                cell.append('\\qw ')
            if key in qwx:
                cell.append('\\qwx ')
            row.append(''.join(cell))
        rows.append('&'.join(row) + '\qw')

    grid = '\\\\\n'.join(rows)

    output = '\Qcircuit @R=1em @C=0.75em { \\\\ \n' + grid + ' \\\\ \n \\\\ }'

    return output
Example #4
0
def assert_has_rendering(actual: TextDiagramDrawer, desired: str,
                         **kwargs) -> None:
    """Determines if a given diagram has the desired rendering.

    Args:
        actual: The text diagram.
        desired: The desired rendering as a string.
        **kwargs: Keyword arguments to be passed to actual.render.
    """
    actual_diagram = actual.render(**kwargs)
    desired_diagram = desired
    assert actual_diagram == desired_diagram, (
        "Diagram's rendering differs from the desired rendering.\n"
        '\n'
        'Actual rendering:\n'
        '{}\n'
        '\n'
        'Desired rendering:\n'
        '{}\n'
        '\n'
        'Highlighted differences:\n'
        '{}\n'.format(
            actual_diagram,
            desired_diagram,
            ct.highlight_text_differences(actual_diagram, desired_diagram),
        ))
Example #5
0
def test_draw_entries_and_lines_with_emphasize():
    d = TextDiagramDrawer()
    d.write(0, 0, '!')
    d.write(6, 2, 'span')
    d.grid_line(2, 3, 8, 3, True)
    d.grid_line(7, 1, 7, 4, True)
    print(d.render().strip())
    assert d.render().strip() == """
!

                 ┃
                 ┃
            span ┃
                 ┃
    ━━━━━━━━━━━━━━━
                 ┃
    """.strip()
Example #6
0
    def __str__(self):
        diagram = TextDiagramDrawer()

        for q in self.qubits:
            diagram.write(q.col, q.row, str(q))
            for q2 in self.neighbors_of(q):
                if q2.col != q.col:
                    diagram.horizontal_line(q.row, q.col, q2.col)
                else:
                    diagram.vertical_line(q.col, q.row, q2.row)

        return diagram.render(
            horizontal_spacing=3,
            vertical_spacing=2,
            use_unicode_characters=True)
Example #7
0
def test_drawer_superimposed():
    empty_drawer = TextDiagramDrawer()
    assert not empty_drawer
    drawer_with_something = TextDiagramDrawer()
    drawer_with_something.write(0, 0, 'A')
    assert drawer_with_something
    superimposed_drawer = empty_drawer.superimposed(drawer_with_something)
    assert superimposed_drawer == drawer_with_something
    assert not empty_drawer
Example #8
0
    def __str__(self) -> str:
        diagram = TextDiagramDrawer()
        dx = min(q.col for q in self)
        dy = min(q.row for q in self)

        for q in self:
            diagram.write(q.col - dx, q.row - dy, str(q))

        for q1, q2 in zip(self, self[1:]):
            diagram.grid_line(q1.col - dx, q1.row - dy, q2.col - dx,
                              q2.row - dy, True)

        return diagram.render(horizontal_spacing=2,
                              vertical_spacing=1,
                              use_unicode_characters=True)
Example #9
0
    def __str__(self):
        diagram = TextDiagramDrawer()

        for q in self.qubits:
            diagram.write(q.col, q.row, str(q))
            for q2 in self.neighbors_of(q):
                diagram.grid_line(q.col, q.row, q2.col, q2.row)

        return diagram.render(
            horizontal_spacing=3,
            vertical_spacing=2,
            use_unicode_characters=True)
Example #10
0
def test_drawer_copy():
    orig_entries = {(0, 0): _DiagramText('entry', '')}
    orig_vertical_lines = [_VerticalLine(1, 1, 3, True)]
    orig_horizontal_lines = [_HorizontalLine(0, 0, 3, False)]
    orig_vertical_padding = {0: 2}
    orig_horizontal_padding = {1: 3}
    kwargs = {
        'entries': orig_entries,
        'vertical_lines': orig_vertical_lines,
        'horizontal_lines': orig_horizontal_lines,
        'vertical_padding': orig_vertical_padding,
        'horizontal_padding': orig_horizontal_padding
    }
    orig_drawer = TextDiagramDrawer(**kwargs)

    same_drawer = TextDiagramDrawer(**kwargs)
    assert orig_drawer == same_drawer

    copy_drawer = orig_drawer.copy()
    assert orig_drawer == copy_drawer

    copy_drawer.write(0, 1, 'new_entry')
    assert copy_drawer != orig_drawer

    copy_drawer = orig_drawer.copy()
    copy_drawer.vertical_line(2, 1, 3)
    assert copy_drawer != orig_drawer

    copy_drawer = orig_drawer.copy()
    copy_drawer.horizontal_line(2, 1, 3)
    assert copy_drawer != orig_drawer

    copy_drawer = orig_drawer.copy()
    copy_drawer.force_horizontal_padding_after(1, 4)
    assert copy_drawer != orig_drawer

    copy_drawer = orig_drawer.copy()
    copy_drawer.force_vertical_padding_after(1, 4)
    assert copy_drawer != orig_drawer
Example #11
0
    def __str__(self):
        diagram = TextDiagramDrawer()
        dx = min(q.col for q in self)
        dy = min(q.row for q in self)

        for q in self:
            diagram.write(q.col - dx, q.row - dy, str(q))

        for q1, q2 in zip(self, self[1:]):
            diagram.grid_line(q1.col - dx, q1.row - dy,
                              q2.col - dx, q2.row - dy,
                              True)

        return diagram.render(horizontal_spacing=2,
                              vertical_spacing=1,
                              use_unicode_characters=True)
def test_draw_entries_and_lines_with_options():
    d = TextDiagramDrawer()
    d.write(0, 0, '!')
    d.write(6, 2, 'span')
    d.horizontal_line(y=3, x1=2, x2=8)
    d.vertical_line(x=7, y1=1, y2=4)
    assert d.render().strip() == """
!

                 │
                 │
            span │
                 │
    ─────────────┼─
                 │
    """.strip()

    assert d.render(use_unicode_characters=False).strip() == """
!

                 |
                 |
            span |
                 |
    -------------+-
                 |
    """.strip()

    assert d.render(crossing_char='@').strip() == """
!

                 │
                 │
            span │
                 │
    ─────────────@─
                 │
    """.strip()

    assert d.render(horizontal_spacing=0).strip() == """
!

          │
          │
      span│
          │
  ────────┼
          │
    """.strip()

    assert d.render(vertical_spacing=0).strip() == """
!
                 │
            span │
    ─────────────┼─
    """.strip()
Example #13
0
def test_drawer_eq():
    assert TextDiagramDrawer().__eq__(23) == NotImplemented

    eq = ct.EqualsTester()

    d = TextDiagramDrawer()
    d.write(0, 0, 'A')
    d.write(1, 0, 'B')
    d.write(1, 1, 'C')

    alt_d = TextDiagramDrawer()
    alt_d.write(0, 0, 'A')
    alt_d.write(1, 0, 'B')
    alt_d.write(1, 1, 'C')
    eq.add_equality_group(d, alt_d)

    dd = TextDiagramDrawer()
    dd.write(0, 0, 'D')
    dd.write(0, 1, 'E')
    dd.write(1, 1, 'F')

    eq.add_equality_group(dd)
Example #14
0
def test_drawer_stack():
    d = TextDiagramDrawer()
    d.write(0, 0, 'A')
    d.write(1, 0, 'B')
    d.write(1, 1, 'C')
    dd = TextDiagramDrawer()
    dd.write(0, 0, 'D')
    dd.write(0, 1, 'E')
    dd.write(1, 1, 'F')

    vstacked = TextDiagramDrawer.vstack((dd, d))
    expected = """
D

E F

A B

  C
    """.strip()
    assert_has_rendering(vstacked, expected)

    hstacked = TextDiagramDrawer.hstack((d, dd))
    expected = """
A B D

  C E F
    """.strip()
    assert_has_rendering(hstacked, expected)

    d.force_horizontal_padding_after(0, 0)

    with pytest.raises(ValueError):
        TextDiagramDrawer.vstack((dd, d))

    dd.force_horizontal_padding_after(0, 0)
    expected = """
D

EF

AB

 C
    """.strip()
    vstacked = TextDiagramDrawer.vstack((dd, d))
    assert_has_rendering(vstacked, expected)

    d.force_vertical_padding_after(0, 0)
    with pytest.raises(ValueError):
        print(d.vertical_padding)
        print(dd.vertical_padding)
        TextDiagramDrawer.hstack((d, dd))

    dd.force_vertical_padding_after(0, 0)
    expected = """
AB D
 C EF
    """.strip()
    hstacked = TextDiagramDrawer.hstack((d, dd))
    assert_has_rendering(hstacked, expected)

    d.force_horizontal_padding_after(0, 0)
    dd.force_horizontal_padding_after(0, 2)
    d.force_vertical_padding_after(0, 1)
    dd.force_vertical_padding_after(0, 3)

    with pytest.raises(ValueError):
        TextDiagramDrawer.vstack((d, dd))

    vstacked = TextDiagramDrawer.vstack((dd, d), padding_resolver=max)
    expected = """
D



E  F

A  B

   C
    """.strip()
    assert_has_rendering(vstacked, expected)

    hstacked = TextDiagramDrawer.hstack((d, dd), padding_resolver=max)
    expected = """
AB D



 C E  F
    """.strip()
    assert_has_rendering(hstacked, expected)

    vstacked_min = TextDiagramDrawer.vstack((dd, d), padding_resolver=min)
    expected = """
D



EF

AB

 C
    """.strip()
    assert_has_rendering(vstacked_min, expected)

    hstacked_min = TextDiagramDrawer.hstack((d, dd), padding_resolver=min)
    expected = """
AB D

 C E  F
    """.strip()
    assert_has_rendering(hstacked_min, expected)
Example #15
0
def test_multiline_entries():
    d = TextDiagramDrawer()
    d.write(0, 0, 'hello\nthere')
    d.write(0, 1, 'next')
    d.write(5, 1, '1\n2\n3')
    d.write(5, 2, '4n')
    d.vertical_line(x=5, y1=1, y2=2)
    d.horizontal_line(y=1, x1=0, x2=8)
    _assert_same_diagram(
        d.render().strip(), """
hello
there

              1
next──────────2──────
              3
              │
              4n
    """.strip())

    d = TextDiagramDrawer()
    d.vertical_line(x=0, y1=0, y2=3)
    d.vertical_line(x=1, y1=0, y2=3)
    d.vertical_line(x=2, y1=0, y2=3)
    d.vertical_line(x=3, y1=0, y2=3)
    d.write(0, 0, 'long line\nshort')
    d.write(2, 2, 'short\nlong line')
    _assert_same_diagram(
        d.render().strip(), """
long line ╷ ╷         ╷
short     │ │         │
│         │ │         │
│         │ │         │
│         │ │         │
│         │ short     │
│         │ long line │
│         │ │         │
    """.strip())
Example #16
0
def test_line_fails_when_not_aligned():
    d = TextDiagramDrawer()
    with pytest.raises(ValueError):
        d.grid_line(1, 2, 3, 4)
Example #17
0
def test_line_detects_vertical():
    d = TextDiagramDrawer()
    with mock.patch.object(d, 'horizontal_line') as horizontal_line:
        d.grid_line(2, 1, 5, 1, True)
        horizontal_line.assert_called_once_with(1, 2, 5, True)
Example #18
0
def test_draw_entries_and_lines_with_emphasize():
    d = TextDiagramDrawer()
    d.write(0, 0, '!')
    d.write(6, 2, 'span')
    d.horizontal_line(y=3, x1=2, x2=8, emphasize=True)
    d.horizontal_line(y=5, x1=2, x2=9, emphasize=False)
    d.vertical_line(x=7, y1=1, y2=6, emphasize=True)
    d.vertical_line(x=5, y1=1, y2=7, emphasize=False)
    _assert_same_diagram(
        d.render().strip(), """
!

          ╷      ╻
          │      ┃
          │ span ┃
          │      ┃
    ╺━━━━━┿━━━━━━╋━╸
          │      ┃
          │      ┃
          │      ┃
    ╶─────┼──────╂───
          │      ┃
          │      ╹
          │
    """.strip())
def test_line_detects_horizontal():
    d = TextDiagramDrawer()
    with mock.patch.object(d, 'vertical_line') as vertical_line:
        d.grid_line(1, 2, 1, 5, True)
        vertical_line.assert_called_once_with(1, 2, 5, True)
Example #20
0
def test_draw_entries_and_lines_with_options():
    d = TextDiagramDrawer()
    d.write(0, 0, '!')
    d.write(6, 2, 'span')
    d.horizontal_line(y=3, x1=2, x2=8)
    d.vertical_line(x=7, y1=1, y2=4)
    _assert_same_diagram(
        d.render().strip(), """
!

                 ╷
                 │
            span │
                 │
    ╶────────────┼─
                 │
    """.strip())

    _assert_same_diagram(
        d.render(use_unicode_characters=False).strip(), """
!


                 |
            span |
                 |
     ------------+-
                 |
    """.strip())

    _assert_same_diagram(
        d.render(crossing_char='@').strip(), """
!

                 ╷
                 │
            span │
                 │
    ╶────────────@─
                 │
    """.strip())

    _assert_same_diagram(
        d.render(horizontal_spacing=0).strip(), """
!

          ╷
          │
      span│
          │
  ╶───────┼
          │
    """.strip())

    _assert_same_diagram(
        d.render(vertical_spacing=0).strip(), """
!
                 ╷
            span │
    ╶────────────┼─
    """.strip())
Example #21
0
def test_draw_entries_and_lines_with_emphasize():
    d = TextDiagramDrawer()
    d.write(0, 0, '!')
    d.write(6, 2, 'span')
    d.horizontal_line(y=3, x1=2, x2=8, emphasize=True)
    d.horizontal_line(y=5, x1=2, x2=9, emphasize=False)
    d.vertical_line(x=7, y1=1, y2=6, emphasize=True)
    d.vertical_line(x=5, y1=1, y2=7, emphasize=False)
    assert d.render().strip() == """
!

          │      ┃
          │      ┃
          │ span ┃
          │      ┃
    ━━━━━━┿━━━━━━╋━
          │      ┃
          │      ┃
          │      ┃
    ──────┼──────╂───
          │      ┃
          │
          │
    """.strip()
def test_line_fails_when_not_aligned():
    d = TextDiagramDrawer()
    with pytest.raises(ValueError):
        d.grid_line(1, 2, 3, 4)
Example #23
0
def _describe_bad_arithmetic_changed_const(registers: Sequence[Union[
    int, Sequence['cirq.Qid']]], inputs: List[int], outputs: List[int]) -> str:
    from cirq.circuits import TextDiagramDrawer

    drawer = TextDiagramDrawer()
    drawer.write(0, 0, 'Register Data')
    drawer.write(1, 0, 'Register Type')
    drawer.write(2, 0, 'Input Value')
    drawer.write(3, 0, 'Output Value')
    for i in range(len(registers)):
        drawer.write(0, i + 1, str(registers[i]))
        drawer.write(1, i + 1,
                     'constant' if isinstance(registers[i], int) else 'qureg')
        drawer.write(2, i + 1, str(inputs[i]))
        drawer.write(3, i + 1, str(outputs[i]))
    return (
        "A register cannot be set to an int (a classical constant) unless its "
        "value is not affected by the operation.\n"
        "\nExample case where a constant changed:\n" +
        drawer.render(horizontal_spacing=1, vertical_spacing=0))