
    z	iT              #          S r SSKJrJrJrJrJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SSKJrJrJr  SSKJr  \" S	S
SSS9\" SSSSS9SSSSSSSS\R*                  R,                  R.                  SSS4SSS.S\R0                  S\\\\4      S\\\4   S\\R6                     S\\   S
\\   S\\   S\\   S\S\\   S\\   S\\   S\\
   S	\\   S\\   4S jjj5       5       rg)a  Qiskit timeline drawer.

This module provides a common user interface to the timeline drawer.
The `draw` function takes a scheduled circuit to visualize, as well as a style sheet
along with several control arguments.
The drawer canvas object is internally initialized from the input data and
the configured canvas is passed to one of the plotter APIs to generate a visualization data.
    )OptionalDictAnyListTuple)circuit)Target)MissingOptionalLibraryError)VisualizationError)typescore
stylesheet)deprecate_arg	show_idle
idle_wiresz1.1.0T)	new_aliassincependingshow_barriersplot_barriersN)r   r   programstyle
time_rangedisable_bitsshow_clbitsshow_delaysshow_labelsplotteraxisfilenametargetc                   AA[         R                  " 5       nUR                  U=(       d    [         R                  " 5       5        Uc  [	        S5      eUb  X_S'   Ub  XOS'   Ub  XoS'   Ub  XS'   [
        R                  " US9nUR                  XS9  U(       a  UR                  " U6   U(       a  U H  nUR                  US	S
9  M     U(       df  [        R                  R                  [        R                  R                  [        R                  R                  /nU H  nUR                  US	S
9  M     UR                  5         U	[        R                   R"                  R$                  :X  a   SSKJn  U" UU
S9nUR/                  5         O[	        SU	 S35      eU(       a  UR1                  US9  UR3                  5       $ ! [*         a  n[-        SSSS9UeSnAff = f)ut?  Generate visualization data for scheduled circuit programs.

.. deprecated:: 1.3
   The ``target`` parameter needs to be specified in Qiskit 2.0 in order to get the
   instruction durations.

Args:
    program: Program to visualize. This program should be a `QuantumCircuit` which is
        transpiled with a scheduling_method, thus containing gate time information.
    style: Stylesheet options. This can be dictionary or preset stylesheet classes. See
        :py:class:`~qiskit.visualization.timeline.stylesheets.IQXStandard`,
        :py:class:`~qiskit.visualization.timeline.stylesheets.IQXSimple`, and
        :py:class:`~qiskit.visualization.timeline.stylesheets.IQXDebugging` for details of
        preset stylesheets. See also the stylesheet section for details of configuration keys.
    time_range: Set horizontal axis limit.
    disable_bits: List of qubits of classical bits not shown in the output image.
    show_clbits: A control property to show classical bits.
        Set `True` to show classical bits.
    idle_wires: A control property to show idle timeline.
        Set `True` to show timeline without gates.
    plot_barriers: A control property to show barrier instructions.
        Set `True` to show barrier instructions.
    show_delays: A control property to show delay instructions.
        Set `True` to show delay instructions.
    show_labels: A control property to show annotations, i.e. name, of gates.
        Set `True` to show annotations.
    plotter: Name of plotter API to generate an output image.
        One of following APIs should be specified::

            mpl: Matplotlib API
                Matplotlib API to generate 2D image. Timelines are placed along y axis with
                vertical offset. This API takes matplotlib.axes.Axes as `axis` input.

        `axis` and `style` kwargs may depend on the plotter.
    axis: Arbitrary object passed to the plotter. If this object is provided,
        the plotters uses given `axis` instead of internally initializing a figure object.
        This object format depends on the plotter. See plotters section for details.
    filename: If provided the output image is dumped into a file under the filename.
    target: The target for the backend the timeline is being generated for.
    show_idle: DEPRECATED.
    show_barriers: DEPRECATED.

Returns:
    Visualization output data.

    The returned data type depends on the `plotter`.
    If matplotlib family is specified, this will be a `matplotlib.pyplot.Figure` data.
    The returned data is generated by the `.get_image` method of the specified plotter API.

Raises:
    MissingOptionalLibraryError: When required visualization package is not installed.
    VisualizationError: When invalid plotter API is specified.

.. _style-dict-doc:

**Style Dict Details**

The stylesheet kwarg contains numerous options that define the style of the
output timeline visualization.
The stylesheet options can be classified into `formatter`, `generator` and `layout`.
Those options available in the stylesheet are defined below:

Args:
    formatter.general.fig_width: Width of output image (default `14`).
    formatter.general.fig_unit_height: Height of output image per timeline.
        The sum of all timeline becomes the height of the output image (default `0.8`).
    formatter.general.dpi: Dot per inch of image if `filename` is set (default `150`).
    formatter.margin.top: Margin from the top boundary of the figure canvas to
        the zero line of the first time slot (default `0.5`).
    formatter.margin.bottom: Margin from the bottom boundary of the figure canvas to
        the zero lien of the last time slot (default `0.5`).
    formatter.margin.left_percent:  Margin from the left boundary of the figure canvas to
        the left limit of the horizontal axis. The value is in units of percentage of
        the whole program duration. If the duration is 100 and the value of 0.5 is set,
        this keeps left margin of 5 (default `0.02`).
    formatter.margin.right_percent: Margin from the right boundary of the figure canvas to
        the right limit of the horizontal axis. The value is in units of percentage of
        the whole program duration. If the duration is 100 and the value of 0.5 is set,
        this keeps right margin of 5 (default `0.02`).
    formatter.margin.link_interval_percent: Allowed overlap of gate links.
        If multiple gate links are drawing within this range, links are horizontally
        shifted not to overlap with each other. The value is in units of percentage of
        the whole program duration (default `0.01`).
    formatter.time_bucket.edge_dt: The length of round edge of gate boxes. Gate boxes are
        smoothly faded in and out from the zero line. This value is in units of
        the system cycle time dt (default `10`).
    formatter.margin.minimum_duration: Minimum scheduled circuit duration.
        If the duration of input circuit is below this value, horizontal limit is
        set based on this value. This value is in units of
        the system cycle time dt (default `50`).
    formatter.color.background: Color code of the face color of canvas (default `#FFFFFF`).
    formatter.color.timeslot: Face color of the time slot box (default `#DDDDDD`).
    formatter.color.gate_name: Text color of the gate name annotations (default `#000000`).
    formatter.color.bit_name: Text color of the bit label annotations (default `#000000`).
    formatter.color.barrier: Line color of barriers (default `#222222`).
    formatter.color.gates: A dictionary of the gate box or gate symbol colors
        to use for each element type in the output visualization. The default
        values are::

            {
                'u0': '#FA74A6',
                'u1': '#000000',
                'u2': '#FA74A6',
                'u3': '#FA74A6',
                'id': '#05BAB6',
                'sx': '#FA74A6',
                'sxdg': '#FA74A6',
                'x': '#05BAB6',
                'y': '#05BAB6',
                'z': '#05BAB6',
                'h': '#6FA4FF',
                'cx': '#6FA4FF',
                'cy': '#6FA4FF',
                'cz': '#6FA4FF',
                'swap': '#6FA4FF',
                's': '#6FA4FF',
                'sdg': '#6FA4FF',
                'dcx': '#6FA4FF',
                'iswap': '#6FA4FF',
                't': '#BB8BFF',
                'tdg': '#BB8BFF',
                'r': '#BB8BFF',
                'rx': '#BB8BFF',
                'ry': '#BB8BFF',
                'rz': '#000000',
                'reset': '#808080',
                'measure': '#808080'
            }

        You must specify all the necessary values if using this. If a gate name is not
        specified, the color in `formatter.color.default_gate` is applied.
    formatter.color.default_gate: Default gate color. This color is applied when
        a gate name to visualize is not contained in the dictionary of
        `formatter.color.gates` (default `#BB8BFF`).
    formatter.latex_symbol.gates: A dictionary of latex representation of gate names
        to use for each element type in the output visualization. The default
        values are::

            {
                'u0': r'{\rm U}_0',
                'u1': r'{\rm U}_1',
                'u2': r'{\rm U}_2',
                'u3': r'{\rm U}_3',
                'id': r'{\rm Id}',
                'x': r'{\rm X}',
                'y': r'{\rm Y}',
                'z': r'{\rm Z}',
                'h': r'{\rm H}',
                'cx': r'{\rm CX}',
                'cy': r'{\rm CY}',
                'cz': r'{\rm CZ}',
                'swap': r'{\rm SWAP}',
                's': r'{\rm S}',
                'sdg': r'{\rm S}^\dagger',
                'sx': r'{\rm √X}',
                'sxdg': r'{\rm √X}^\dagger',
                'dcx': r'{\rm DCX}',
                'iswap': r'{\rm iSWAP}',
                't': r'{\rm T}',
                'tdg': r'{\rm T}^\dagger',
                'r': r'{\rm R}',
                'rx': r'{\rm R}_x',
                'ry': r'{\rm R}_y',
                'rz': r'{\rm R}_z',
                'reset': r'|0\rangle',
                'measure': r'{\rm Measure}'
            }

        You must specify all the necessary values if using this. There is
        no provision for passing an incomplete dict in.
    formatter.latex_symbol.frame_change: Latex representation of
        the frame change symbol (default r`\circlearrowleft`).
    formatter.unicode_symbol.frame_change: Unicode representation of
        the frame change symbol (default u'\u21BA').
    formatter.box_height.gate: Height of gate box (default `0.5`).
    formatter.box_height.timeslot: Height of time slot (default `0.6`).
    formatter.layer.gate: Layer index of gate boxes. Larger number comes
        in the front of the output image (default `3`).
    formatter.layer.timeslot: Layer index of time slots. Larger number comes
        in the front of the output image (default `0`).
    formatter.layer.gate_name: Layer index of gate name annotations. Larger number comes
        in the front of the output image (default `5`).
    formatter.layer.bit_name: Layer index of bit labels. Larger number comes
        in the front of the output image (default `5`).
    formatter.layer.frame_change: Layer index of frame change symbols. Larger number comes
        in the front of the output image (default `4`).
    formatter.layer.barrier: Layer index of barrier lines. Larger number comes
        in the front of the output image (default `1`).
    formatter.layer.gate_link: Layer index of gate link lines. Larger number comes
        in the front of the output image (default `2`).
    formatter.alpha.gate: Transparency of gate boxes. A value in the range from
        `0` to `1`. The value `0` gives completely transparent boxes (default `1.0`).
    formatter.alpha.timeslot: Transparency of time slots. A value in the range from
        `0` to `1`. The value `0` gives completely transparent boxes (default `0.7`).
    formatter.alpha.barrier: Transparency of barrier lines. A value in the range from
        `0` to `1`. The value `0` gives completely transparent lines (default `0.5`).
    formatter.alpha.gate_link: Transparency of gate link lines. A value in the range from
        `0` to `1`. The value `0` gives completely transparent lines (default `0.8`).
    formatter.line_width.gate: Line width of the fringe of gate boxes (default `0`).
    formatter.line_width.timeslot: Line width of the fringe of time slots (default `0`).
    formatter.line_width.barrier: Line width of barrier lines (default `3`).
    formatter.line_width.gate_link: Line width of gate links (default `3`).
    formatter.line_style.barrier: Line style of barrier lines. This
        conforms to the line style spec of matplotlib (default `'-'`).
    formatter.line_style.gate_link: Line style of gate link lines. This
        conforms to the line style spec of matplotlib (default `'-'`).
    formatter.text_size.gate_name: Text size of gate name annotations (default `12`).
    formatter.text_size.bit_name: Text size of bit labels (default `15`).
    formatter.text_size.frame_change: Text size of frame change symbols (default `18`).
    formatter.text_size.axis_label: Text size of axis labels (default `13`).
    formatter.label_offset.frame_change: Offset of zero duration gate name annotations
        from the zero line of time slot (default `0.25`).
    formatter.control.show_idle: Set `True` to show time slots without gate (default `True`).
    formatter.control.show_clbits: Set `True` to show time slots of
        classical bits (default `True`).
    formatter.control.show_barriers: Set `True` to show barriers (default `True`).
    formatter.control.show_delays: Set `True` to show delay boxes (default `True`).
    generator.gates: List of callback functions that generates drawings
        for gates. Arbitrary callback functions satisfying the generator format
        can be set here. There are some default generators in the timeline drawer. See
        :py:mod:`~qiskit.visualization.timeline.generators` for more details.
        No default generator is set (default `[]`).
    generator.bits: List of callback functions that generates drawings for bit labels
        and time slots. Arbitrary callback functions satisfying the generator format
        can be set here. There are some default generators in the timeline drawer. See
        :py:mod:`~qiskit.visualization.timeline.generators` for more details.
        No default generator is set (default `[]`).
    generator.barriers: List of callback functions that generates drawings
        for barriers. Arbitrary callback functions satisfying the generator format
        can be set here. There are some default generators in the timeline drawer. See
        :py:mod:`~qiskit.visualization.timeline.generators` for more details.
        No default generator is set (default `[]`).
    generator.gate_links: List of callback functions that generates drawings
        for gate links. Arbitrary callback functions satisfying the generator format
        can be set here. There are some default generators in the timeline drawer. See
        :py:mod:`~qiskit.visualization.timeline.generators` for more details.
        No default generator is set (default `[]`).
    layout.bit_arrange: Callback function that sorts bits. See
        :py:mod:`~qiskit.visualization.timeline.layouts` for more details.
        No default layout is set. (default `None`).
    layout.time_axis_map: Callback function that determines the layout of
        horizontal axis labels. See :py:mod:`~qiskit.visualization.timeline.layouts`
        for more details. No default layout is set. (default `None`).

Examples:
    To visualize a scheduled circuit program, you can call this function with a set of
    control arguments. Most of the appearance of the output image can be controlled by the
    stylesheet.

    Drawing with the default stylesheet.

    .. plot::
       :alt: Output from the previous code.
       :include-source:

        from qiskit import QuantumCircuit, transpile
        from qiskit.visualization.timeline import draw
        from qiskit.providers.fake_provider import GenericBackendV2

        qc = QuantumCircuit(2)
        qc.h(0)
        qc.cx(0,1)

        backend = GenericBackendV2(5)

        qc = transpile(qc, backend, scheduling_method='alap', layout_method='trivial')
        draw(qc, target=backend.target)

    Drawing with the simple stylesheet.

    .. plot::
       :alt: Output from the previous code.
       :include-source:

        from qiskit import QuantumCircuit, transpile
        from qiskit.visualization.timeline import draw, IQXSimple
        from qiskit.providers.fake_provider import GenericBackendV2

        qc = QuantumCircuit(2)
        qc.h(0)
        qc.cx(0,1)

        backend = GenericBackendV2(5)

        qc = transpile(qc, backend, scheduling_method='alap', layout_method='trivial')
        draw(qc, style=IQXSimple(), target=backend.target)

    Drawing with the stylesheet suited for program debugging.

    .. plot::
       :alt: Output from the previous code.
       :include-source:

        from qiskit import QuantumCircuit, transpile
        from qiskit.visualization.timeline import draw, IQXDebugging
        from qiskit.providers.fake_provider import GenericBackendV2

        qc = QuantumCircuit(2)
        qc.h(0)
        qc.cx(0,1)

        backend = GenericBackendV2(5)
        qc = transpile(qc, backend, scheduling_method='alap', layout_method='trivial')
        draw(qc, style=IQXDebugging(), target=backend.target)

    You can partially customize a preset stylesheet when call it::

        my_style = {
            'formatter.general.fig_width': 16,
            'formatter.general.fig_unit_height': 1
        }
        style = IQXStandard(**my_style)

        # draw
        draw(qc, style=style)

    In the same way as above, you can create custom generator or layout functions
    and update existing stylesheet with custom functions.
    This feature enables you to control the most of the appearance of the output image
    without modifying the codebase of the scheduled circuit drawer.
NzMNo target is specified, this is required to get the duration of instructions.zformatter.control.show_idlezformatter.control.show_clbitszformatter.control.show_barrierszformatter.control.show_delays)r   )r   r!   T)remover   )
MplPlotter
Matplotlibztimeline drawerzpip install matplotlib)libnamenamepip_install)canvasr   zPlotter API z is not supported.)r    )r   QiskitTimelineStyleupdateIQXStandardr   r   DrawerCanvasload_programset_time_rangeset_disable_bitsr   	LabelTypeDELAY
GATE_PARAM	GATE_NAMEset_disable_typePlotterMPLvalue&qiskit.visualization.timeline.plottersr$   ImportErrorr
   draw	save_file	get_image)r   r   r   r   r   r   r   r   r   r   r   r    r!   r   r   
temp_styler)   bitlabelslabelr$   explotter_apis                          a/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/visualization/timeline/interface.pyr;   r;       s   j
 	//1Je7z5578~ [
 	

 4>016A23 8E456A23 *5F
7 z* C##C#5   //'')C)CU__E^E^_E##E$#7  MMO %--##)))	I !T: <y8J!KLL x0  ""  	-$&4 		s   .G 
GGG)__doc__typingr   r   r   r   r   qiskitr   qiskit.transpiler.targetr	   qiskit.exceptionsr
   qiskit.visualization.exceptionsr   qiskit.visualization.timeliner   r   r   qiskit.utilsr   r6   r7   r8   QuantumCircuitstrintBitsboolr;        rD   <module>rT      s   4 3  + 9 > A A & {l'4P/RVW '+"&%)"&!%$("&"]]..44"#Z# !%$(!Z###Z#DcN#Z# c3hZ# uzz"	Z#
 $Z# Z# D>Z# $Z# Z# c]Z# 3-Z# smZ# VZ# ~Z#  D>!Z# X QZ#rS   