§
    º³Ùg†*  ã                  ó0  — d Z ddlmZ ddlZddlZddlZddlmZ ddl	m
Z
mZ ddlmZ ddlmZmZ dd	lmZ ed
ediZej        j        ej        j        dd„¦   «         ¦   «         Zd„ Zej        j        ej        j        dd„¦   «         ¦   «         Zd„ Zd„ ZdS )z‡
Visualization function for a pass manager. Passes are grouped based on their
flow controller, and coloured based on the type of pass.
é    )ÚannotationsN)Ú	optionals)ÚBaseControllerÚGenericPass)ÚFlowControllerLinear)ÚAnalysisPassÚTransformationPassé   )ÚVisualizationErrorÚredÚblueFc                ó"  — ddl }|st          }|                     ¦   «         }d}d}t          |                      ¦   «         j        ¦  «        D ]1\  }}	t          |	||||¦  «        \  }
}}|                     |
¦  «         Œ2t          |||¦  «        }|S )a™  
    Draws the pass manager.

    This function needs `pydot <https://github.com/pydot/pydot>`__, which in turn needs
    `Graphviz <https://www.graphviz.org/>`__ to be installed.

    Args:
        pass_manager (PassManager): the pass manager to be drawn
        filename (str): file path to save image to
        style (dict or OrderedDict): keys are the pass classes and the values are
            the colors to make them. An example can be seen in the DEFAULT_STYLE. An ordered
            dict can be used to ensure a priority coloring when pass falls into multiple
            categories. Any values not included in the provided dict will be filled in from
            the default dict
        raw (Bool) : True if you want to save the raw Dot output not an image. The
            default is False.
    Returns:
        PIL.Image or None: an in-memory representation of the pass manager. Or None if
        no image was generated or PIL is not installed.
    Raises:
        MissingOptionalLibraryError: when nxpd or pydot not installed.
        VisualizationError: If raw=True and filename=None.

    Example:
        .. code-block::

            from qiskit import QuantumCircuit
            from qiskit.transpiler import generate_preset_pass_manager
            from qiskit.visualization import pass_manager_drawer

            pm = generate_preset_pass_manager(optimization_level=0)
            pass_manager_drawer(pm)
    r   N)	ÚpydotÚDEFAULT_STYLEÚDotÚ	enumerateÚto_flow_controllerÚtasksÚdraw_subgraphÚadd_subgraphÚmake_output)Úpass_managerÚfilenameÚstyleÚrawr   ÚgraphÚcomponent_idÚ	prev_nodeÚindexÚcontroller_groupÚsubgraphÚoutputs               úe/granary/edev/quantum/lib/python3.11/site-packages/qiskit/visualization/pass_manager_visualization.pyÚpass_manager_drawerr$       s²   € ðH €L€L€Làð Ýˆð �IŠI‰KŒK€Eð
 €Là€Iå#,¨\×-LÒ-LÑ-NÔ-NÔ-TÑ#UÔ#Uð %ð %ÑˆÐÝ,9Ø˜l¨E°9¸eñ-
ô -
Ñ)ˆ�, 	ð 	×Ò˜8Ñ$Ô$Ð$Ð$å˜  XÑ.Ô.€FØ€Mó    c                óÈ   — |                      ¦   «         D ]\  }}t          | |¦  «        r|c S Œt                                ¦   «         D ]\  }}t          | |¦  «        r|c S ŒdS )NÚblack)ÚitemsÚ
isinstancer   )Úpssr   ÚtypÚcolors       r#   Ú_get_node_colorr-   ]   s…   € à—k’k‘m”mð ð ‰
ˆˆUÝ�c˜3ÑÔð 	ØˆLˆLˆLð	õ $×)Ò)Ñ+Ô+ð ð ‰
ˆˆUÝ�c˜3ÑÔð 	ØˆLˆLˆLð	ð ˆ7r%   c           	     ó  — ddl }t          t          d„ | j        ¦  «        ¦  «        }|st          }|                     ¦   «         }d}d}d}	|D ]©}
t          | |
¦  «        }|�•|                     t          |
¦  «        dt          |
¦  «        d¬¦  «        }| 	                    ¦   «         j
        D ]3}t          ||||	|¦  «        \  }}}	|                     |¦  «         |dz  }Œ4|                     |¦  «         Œªt          |||¦  «        }|S )aÕ  
    Draws the staged pass manager.

        This function needs `pydot <https://github.com/erocarrera/pydot>`__, which in turn needs
    `Graphviz <https://www.graphviz.org/>`__ to be installed.

    Args:
        pass_manager (StagedPassManager): the staged pass manager to be drawn
        filename (str): file path to save image to
        style (dict or OrderedDict): keys are the pass classes and the values are
            the colors to make them. An example can be seen in the DEFAULT_STYLE. An ordered
            dict can be used to ensure a priority coloring when pass falls into multiple
            categories. Any values not included in the provided dict will be filled in from
            the default dict
        raw (Bool) : True if you want to save the raw Dot output not an image. The
            default is False.
    Returns:
        PIL.Image or None: an in-memory representation of the pass manager. Or None if
        no image was generated or PIL is not installed.
    Raises:
        MissingOptionalLibraryError: when nxpd or pydot not installed.
        VisualizationError: If raw=True and filename=None.

    Example:
        .. code-block::

            %matplotlib inline
            from qiskit.providers.fake_provider import GenericBackendV2
            from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

            pass_manager = generate_preset_pass_manager(3, GenericBackendV2(num_qubits=5))
            pass_manager.draw()
    r   Nc                ó
   — | d uS )N© )Úss    r#   ú<lambda>z,staged_pass_manager_drawer.<locals>.<lambda>’   s
   €  1¨D =€ r%   Ú	helveticaÚl©ÚfontnameÚlabelÚ	labeljustr
   )r   ÚlistÚfilterÚexpanded_stagesr   r   ÚgetattrÚClusterÚstrr   r   r   r   r   )r   r   r   r   r   Ústagesr   r   Úidxr   ÚstÚstageÚ
stagegraphr    r!   r"   s                   r#   Ústaged_pass_manager_drawerrD   k   s4  € ðH €L€L€Lõ •&Ð0Ð0°,Ô2NÑOÔOÑPÔP€Fàð Ýˆð �IŠI‰KŒK€Eð
 €Lð €Cà€Iàð +ð +ˆÝ˜ bÑ)Ô)ˆàÐØŸš¥s¨2¡w¤w¸ÍCÐPRÉGÌGÐ_b˜ÑcÔcˆJØ$)×$<Ò$<Ñ$>Ô$>Ô$Dð ð Ð Ý4AØ$ l°E¸9Àcñ5ô 5Ñ1�˜,¨	ð ×'Ò'¨Ñ1Ô1Ð1Ø�q‘��Ø×Ò˜zÑ*Ô*Ð*øå˜  XÑ.Ô.€FØ€Mr%   c                ó´  — ddl }d|› d�}t          | t          ¦  «        r%t          | t          ¦  «        s|| j        j        › z  }|                     t          |¦  «        d|d¬¦  «        }|dz  }t          | t          ¦  «        rt          | d	g ¦  «        }n=t          | t          ¦  «        r| g}n$t          | t          t          f¦  «        r| }n|||fS g }	|D ]G}
t          |
t          ¦  «        r|	                     |
j        ¦  «         Œ2|	                     |
¦  «         ŒH|	D �]±}
t          |
t          ¦  «        r(|                     t          |¦  «        d
ddd¬¦  «        }nT|                     t          |¦  «        t!          |
|¦  «        dt          t#          |
¦  «        j        ¦  «        d¬¦  «        }|                     |¦  «         |dz  }t'          j        |
j        ¦  «        }|d         dd…         }|d         rt-          |d         ¦  «        nd}t/          |¦  «        D ]~\  }}d}|t-          |¦  «        |z
  k    rd}|                     |ddd|d|¬¦  «        }|                     |¦  «         |dz  }|                     |                     ||¦  «        ¦  «         Œ|r)|                     |                     ||¦  «        ¦  «         |}�Œ³|||fS )zDraw subgraph.r   Nú[z] r3   r4   r5   r
   r   ÚkzNested flow controllerÚ	rectangle)r,   r6   r7   Úshapeé   ÚsolidÚdashedr'   é
   Úellipse)r,   r6   Úfontsizer7   rI   r   )r   r)   r   r   Ú	__class__Ú__name__r=   r>   r<   r   r9   ÚtupleÚextendr   ÚappendÚNoder-   ÚtypeÚadd_nodeÚinspectÚgetfullargspecÚ__init__Úlenr   Úadd_edgeÚEdge)r    r   r   r   r@   r   r7   r!   r   Úflatten_tasksÚtaskÚnodeÚarg_specÚargsÚnum_optionalÚ	arg_indexÚargÚnd_styleÚ
input_nodes                      r#   r   r   µ   sG  € à€L€L€Lð �ˆKˆKˆK€EÝÐ"¥NÑ3Ô3ð :½JØÕ.ñ=ô =ð :ð 	Ð$Ô.Ô7Ð9Ñ9ˆð �}Š}�S Ñ.Ô.¸ÈEÐ]`ˆ}ÑaÔa€HØ�AÑ€LåÐ"¥NÑ3Ô3ð 
1õ Ð(¨'°2Ñ6Ô6ˆˆÝ	Ð$¥kÑ	2Ô	2ð 1Ø!Ð"ˆˆÝ	Ð$¥t­U mÑ	4Ô	4ð 1Ø ˆˆð ˜ yÐ0Ð0à€MØð 'ð 'ˆõ
 �dÕ0Ñ1Ô1ð 	'Ø× Ò  ¤Ñ,Ô,Ð,Ð,à× Ò  Ñ&Ô&Ð&Ð&àð 8ñ 8ˆÝ�d�NÑ+Ô+ð 	ð —:’:Ý�LÑ!Ô!ØØ$Ø.Ø!ð ñ ô ˆDˆDð —:’:Ý�LÑ!Ô!Ý% d¨EÑ2Ô2Ø$Ý�$˜t™*œ*Ô-Ñ.Ô.Ø!ð ñ ô ˆDð 	×Ò˜$ÑÔÐØ˜Ñˆõ Ô)¨$¬-Ñ8Ô8ˆà˜Œ{˜1˜2˜2Œˆà+3°A¬;Ð=•s˜8 Aœ;Ñ'Ô'Ð'¸Aˆõ (¨™oœoð 	<ð 	<‰NˆI�sØˆHð �S ™YœY¨Ñ5Ò6Ð6Ø#�àŸšØØØ$ØØØØð $ñ ô ˆJð ×Ò˜jÑ)Ô)Ð)Ø˜AÑˆLØ×Ò˜eŸjšj¨°TÑ:Ô:Ñ;Ô;Ð;Ð;ð ð 	;Ø×Ò˜eŸjšj¨°DÑ9Ô9Ñ:Ô:Ð:àˆ	‰	à�\ 9Ð,Ð,r%   c                ó8  — |r*|r|                       |d¬¦  «         dS t          d¦  «        ‚t          j        s|r|                      |¦  «         dS t          j                             d¦  «         t          j        ¦   «         5 }ddlm	} t          j                             |d¦  «        }|                      |¦  «         |                     |¦  «        }t          j        |¦  «         |r|                     |d	¦  «         |cddd¦  «         S # 1 swxY w Y   dS )
z Produce output for pass_manager.r   )ÚformatNz+if format=raw, then a filename is required.zpass manager drawerr   )ÚImagezpass_manager.pngÚPNG)Úwriter   Ú
_optionalsÚHAS_PILÚ	write_pngÚrequire_nowÚtempfileÚTemporaryDirectoryÚPILrj   ÚosÚpathÚjoinÚopenÚremoveÚsave)r   r   r   Ú
tmpdirnamerj   ÚtmppathÚimages          r#   r   r     sk  € à
ð TØð 	TØ�KŠK˜¨ˆKÑ/Ô/Ð/Ø�4å$Ð%RÑSÔSÐSåÔð  (ð à�Š˜Ñ!Ô!Ð!ØˆtåÔ×"Ò"Ð#8Ñ9Ô9Ð9å	Ô	$Ñ	&Ô	&ð ¨*ØÐÐÐÐÐå”'—,’,˜zÐ+=Ñ>Ô>ˆð 	�Š˜Ñ Ô Ð à—
’
˜7Ñ#Ô#ˆÝ
Œ	�'ÑÔÐØð 	(Ø�JŠJ�x Ñ'Ô'Ð'Øðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s   ÂA>DÄDÄD)NNF)Ú__doc__Ú
__future__r   rt   rX   rq   Úqiskit.utilsr   rm   Úqiskit.passmanager.base_tasksr   r   Ú#qiskit.passmanager.flow_controllersr   Úqiskit.transpiler.basepassesr   r	   Ú
exceptionsr   r   ÚHAS_GRAPHVIZÚrequire_in_callÚ	HAS_PYDOTr$   r-   rD   r   r   r0   r%   r#   ú<module>r‡      sd  ððð ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø €€€Ø €€€à 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ DÐ DÐ DÐ DÐ DÐ DØ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ *Ð *Ð *Ð *Ð *Ð *à˜uÐ&8¸&ÐA€ð ÔÔ(ØÔÔ%ð8ð 8ð 8ñ &Ô%ñ )Ô(ð8ðvð ð ð ÔÔ(ØÔÔ%ðEð Eð Eñ &Ô%ñ )Ô(ðEðP`-ð `-ð `-ðFð ð ð ð r%   