§
    º³Ùgxf  ã                   óð   — d Z ddlZddlZddlZddlZddlmZ ddlZddl	m
Z
mZmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZ ddlmZ dd	lmZ d
dlmZ d
dlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&  G d„ d¦  «        Z'dS )zlatex visualization backend.é    N)Úwarn)ÚClbitÚQubitÚClassicalRegister)Úexpr)ÚControlledGate)ÚSwapGateÚXGateÚZGateÚRZZGateÚU1GateÚ	PhaseGate)ÚMeasure)Úpi_checké   )Ú
load_style)Úget_gate_ctrl_textÚget_param_strÚget_wire_mapÚget_bit_registerÚget_bit_reg_indexÚget_wire_labelÚgenerate_latex_labelÚget_condition_label_valc                   óx   — e Zd ZdZ	 	 	 	 	 	 	 dd„Zd„ Zd„ Zd„ Zd	„ Zd
„ Z	d„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„ZdS )ÚQCircuitImagezçThis class contains methods to create \LaTeX circuit images.

    The class targets the \LaTeX package Q-circuit
    (https://arxiv.org/pdf/quant-ph/0406003).

    Thanks to Eric Sabo for the initial implementation for Qiskit.
    NFTc                 óú  — || _         || _        || _        || _        |€dn|| _        i | _        g | _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        || _        || _        |
r+| j         j        r| j         j        j        | _        nd| _        nd| _        || _        |j        | _        t,          j                             | j        ¦  «        D ]:}|j        r1|j        j        dk    r!|	rt9          dt:          d¦  «         d| _         nŒ;|	€d	n|	| _        t?          |||z   | j        ¦  «        | _         tC          | j         ¦  «        | _        tE          |¦  «        \  | _#        }dS )
a|  QCircuitImage initializer.

        Args:
            qubits (list[Qubit]): list of qubits
            clbits (list[Clbit]): list of clbits
            nodes (list[list[DAGNode]]): list of circuit instructions, grouped by layer
            scale (float): image scaling
            style (dict or str): dictionary of style or file name of style file
            reverse_bits (bool): when True, reverse the bit ordering of the registers
            plot_barriers (bool): Enable/disable drawing barriers in the output
               circuit. Defaults to True.
            initial_state (bool): Optional. Adds |0> in the beginning of the line. Default: `False`.
            cregbundle (bool): Optional. If set True bundle classical registers.
            circuit (QuantumCircuit): the circuit that's being displayed
        Raises:
            ImportError: If pylatexenc is not installed
        Nç      ð?r   r   FÚmeasurezXCregbundle set to False since an instruction needs to refer to individual classical wireé   T)$Ú_circuitÚ_qubitsÚ_clbitsÚ_nodesÚ_scaleÚ_cregsÚ_latexÚ
_img_depthÚ
_img_widthÚ_sum_column_widthsÚ_sum_wire_heightsÚ_column_separationÚ_wire_separationÚ_has_boxÚ_has_targetÚ_plot_barriersÚ_reverse_bitsÚ_layoutÚinitial_layoutÚ_initial_stateÚglobal_phaseÚ_global_phaseÚ	itertoolsÚchainÚfrom_iterableÚcargsÚopÚnamer   ÚRuntimeWarningÚ_cregbundler   Ú	_wire_mapÚlenr   Ú_style)ÚselfÚqubitsÚclbitsÚnodesÚscaleÚstyleÚreverse_bitsÚplot_barriersÚinitial_stateÚ
cregbundleÚwith_layoutÚcircuitÚnodeÚ_s                 úX/granary/edev/quantum/lib/python3.11/site-packages/qiskit/visualization/circuit/latex.pyÚ__init__zQCircuitImage.__init__4   s¯  € ð@  ˆŒØˆŒØˆŒð ˆŒð #˜]�c�c°ˆŒð ˆŒð ˆŒð ˆŒð ˆŒð #$ˆÔð "#ˆÔð #$ˆÔð !"ˆÔð ˆŒØ ˆÔà+ˆÔØ)ˆÔØð 	 ØŒ}Ô$ð $Ø#œ}Ô4ÔC�”�à#�”�àˆDŒLà+ˆÔØ$Ô1ˆÔõ ”O×1Ò1°$´+Ñ>Ô>ð 	Jð 	JˆDØŒzð 	˜dœgœl¨iÒ7Ð7Øð Ýð8å&Øñ	ô ð ð $)�Ô Ø�øà'1Ð'9˜t˜t¸zˆDÔå% g¨v¸©ÀÔ@PÑQÔQˆŒÝ˜dœnÑ-Ô-ˆŒå# EÑ*Ô*‰ˆŒ�Q�Q�Qó    c           	      óÀ  — |                       ¦   «          |                      ¦   «          d}d}d| j        › d�dz   }d}t          j        ¦   «         }|                     |¦  «         |                     |¦  «         |                     |¦  «         | j        r0|                     dd›d	t          | j        d
¬¦  «        ›d�¦  «         |                     || j        | j	        fz  ¦  «         t          | j        ¦  «        D ]�}|                     d¦  «         t          | j        dz   ¦  «        D ]^}|                     | j        |         |         ¦  «         || j        k    r|                     d¦  «         ŒI|                     d¦  «         Œ_ŒŽ|                     d¦  «         |                     d¦  «         |                     ¦   «         }|                     ¦   «          |S )z.Return LaTeX string representation of circuit.z'\documentclass[border=2px]{standalone}
zK
\usepackage[braket, qm]{qcircuit}
\usepackage{graphicx}

\begin{document}
z
\scalebox{Ú}Ú{z(
\Qcircuit @C=%.1fem @R=%.1fem @!R { \\
z
{$\mathrm{zglobal\,phase:\,z
} \mathrm{Úlatex)Úoutputz}$}z	 	r   ú & z\\
z\\ }}
z\end{document})Ú_initialize_latex_arrayÚ_build_latex_arrayr%   ÚioÚStringIOÚwriter6   r   r,   r-   Úranger)   r(   r'   ÚgetvalueÚclose)	rB   Úheader_1Úheader_2Úheader_scaleÚqcircuit_linerW   ÚiÚjÚcontentss	            rP   rV   zQCircuitImage.latexœ   sï  € ð 	×$Ò$Ñ&Ô&Ð&Ø×ÒÑ!Ô!Ð!ØCˆðˆð 6 d¤kÐ5Ð5Ð5¸Ñ;ˆðˆõ ”‘”ˆØ�Š�XÑÔÐØ�Š�XÑÔÐØ�Š�\Ñ"Ô"Ð"ØÔð 	Ø�LŠLˆLà'Ð'Ð'­°$Ô2DÈWÐ)UÑ)UÔ)UÐ)UÐ)UðWñô ð ð 	�Š�] dÔ&=¸tÔ?TÐ%UÑUÑVÔVÐVÝ�t”Ñ'Ô'ð 	/ð 	/ˆAØ�LŠL˜Ñ!Ô!Ð!Ý˜4œ?¨QÑ.Ñ/Ô/ð /ð /�Ø—’˜Tœ[¨œ^¨AÔ.Ñ/Ô/Ð/Ø˜œÒ'Ð'Ø—L’L Ñ'Ô'Ð'Ð'à—L’L Ñ.Ô.Ð.Ð.ð/ð 	�Š�_Ñ%Ô%Ð%Ø�ŠÐ&Ñ'Ô'Ð'Ø—?’?Ñ$Ô$ˆØ�Š‰ŒˆØˆrR   c                 ó–  ‡ — ‰                       ¦   «         \  ‰ _        ‰ _        ‰ j        ‰ _        ‰ j        rd‰ _        n‰ j        rd‰ _        nd‰ _        ˆ fd„‰ j        D ¦   «         ‰ _	        ‰ j	         
                    dg‰ j        dz   z  ¦  «         ‰ j                             ¦   «         D �]\  }}t          |t          ¦  «        r!|}t          d||‰ j        ‰ j        ¬¦  «        }n;t#          ‰ j        |¦  «        \  }}}t          d||€|n|‰ j        ‰ j        ¬¦  «        }|d
z  }‰ j        r|t          |t(          ¦  «        rdndz  }|dz  }t          |t(          ¦  «        sE‰ j        r>|�<‰ j        |         }dt+          |j        ¦  «        z   dz   ‰ j	        |         d<   d|› d�}n|}d|z   dz   dz   |z   ‰ j	        |         d<   �Œd	S )z9Initialize qubit and clbit labels and set wire separationgš™™™™™É?gš™™™™™é?r   c                 óX   •‡— g | ]%Šˆfd „t          ‰j        dz   ¦  «        D ¦   «         ‘Œ&S )c                 óB   •— g | ]}t          ‰t          ¦  «        rd nd‘ŒS )ú\qwz\cw)Ú
isinstancer   )Ú.0rO   Úwires     €rP   ú
<listcomp>zDQCircuitImage._initialize_latex_array.<locals>.<listcomp>.<listcomp>Ò   s,   ø€ Ð_Ð_Ð_¸q•z $­Ñ.Ô.Ð:ˆVˆV°FÐ_Ð_Ð_rR   r   )r^   r(   )rm   rn   rB   s    @€rP   ro   z9QCircuitImage._initialize_latex_array.<locals>.<listcomp>Ñ   sO   øø€ ð 
ð 
ð 
àð `Ð_Ð_Ð_ÅEÈ$Ì/Ð\]ÑJ]ÑD^ÔD^Ð_Ñ_Ô_ð
ð 
ð 
rR   ú r   rV   )ÚlayoutrK   Nz : z	\ket{{0}}Ú0z }z\lstick{/_{_{z}}} \cwz\mathrm{rT   z\nghost{rX   z\lstick{r   )Ú_get_image_depthr(   r*   r)   r+   r.   r-   r/   r?   r'   ÚappendÚitemsrl   r   r   r2   r>   r   r!   r4   r   ÚstrÚsize)rB   rn   ÚindexÚregisterÚ
wire_labelÚ	bit_indexÚ	reg_indexÚposs   `       rP   rY   z%QCircuitImage._initialize_latex_arrayÆ   s:  ø€ à37×3HÒ3HÑ3JÔ3JÑ0ˆŒ˜Ô0Ø!%¤ˆÔàŒ=ð 	(Ø$'ˆDÔ!Ð!ØÔð 	(Ø$'ˆDÔ!Ð!à$'ˆDÔ!ð
ð 
ð 
ð 
àœð
ñ 
ô 
ˆŒð 	Œ×Ò˜C˜5 D¤O°aÑ$7Ñ8Ñ9Ô9Ð9ð  œ>×/Ò/Ñ1Ô1ð 	^ñ 	^‰KˆD�%Ý˜$Õ 1Ñ2Ô2ð Ø�Ý+Ø˜X u°T´\ÈdÔN^ðñ ô �
�
õ 2CÀ4Ä=ÐRVÑ1WÔ1WÑ.�˜) YÝ+ØØØ!)Ð!1�I�I°yØœ<Ø#Ô/ðñ ô �
ð ˜%ÑˆJØÔ"ð OØ­j¸½uÑ.EÔ.EÐN˜l˜lÈ3ÑN�
Ø˜$ÑˆJå˜d¥UÑ,Ô,ð °Ô1Að ÀhÐFZØ”n XÔ.�Ø&6½¸X¼]Ñ9KÔ9KÑ&KÈjÑ&X�”˜CÔ  Ñ#Ø8¨*Ð8Ð8Ð8�
�
à�Ø"-°
Ñ":¸UÑ"BÀ[Ñ"PÐS]Ñ"]ˆDŒK˜Ô˜QÑÑð7	^ð 	^rR   c           
      ó°  — d}| j         ra| j        rZ| j        d         rM| j        d         d         j        j        dk    s't	          | j        d         d         j        dd¦  «        r|dz  }g }| j        D �];}d}d}|D �]}|j        }g d¢}g d¢}	|j        |v rd	| _        n-|j        |	v rd	| _        nt          |t          ¦  «        rd	| _        d}
|j	        D ]Z}t          d
„ |j	        D ¦   «         ¦  «        s:t          j        d| j        t          |¦  «        ¦  «        }|
t          |¦  «        z  }
Œ[t!          |
|¦  «        }t#          |d¦  «        sdn|j        }t          |t&          ¦  «        s"t          |t(          t*          t&          f¦  «        rd}�Œ|                     |¦  «         ||z  }�Œ=t/          d„ |D ¦   «         ¦  «        }d}| j        D ]c}t          |t2          t4          f¦  «        r!t7          | j        |¦  «        }|�|j        nd}n|j        }t!          |t          |¦  «        ¦  «        }Œd|d|dz  z   z  }|t;          j        |¦  «        fS )z&Get depth information for the circuit.r    r   r   Ú	conditionNr   )Úu1Úu2Úu3ÚuÚpÚxÚyÚzÚhÚsÚsdgÚtÚtdgÚsxÚsxdgÚrxÚryÚrzÚchÚcyÚcrzÚcu2Úcu3ÚcuÚid)ÚcxÚccxÚcu1ÚcpÚrzzTc              3   óJ   K  — | ]}t          |t          j        ¦  «        V — Œd S )N)rl   ÚnpÚndarray)rm   Úparams     rP   ú	<genexpr>z1QCircuitImage._get_image_depth.<locals>.<genexpr>2  s.   è è € ÐTÐTÀ�z¨%µ´Ñ<Ô<ÐTÐTÐTÐTÐTÐTrR   z[-+]?\d*\.\d{2,}|\d{2,}Ú	base_gateé   c              3   ó&   K  — | ]}d |dz  z   V — ŒdS )r   é   N© )rm   Úvs     rP   r¢   z1QCircuitImage._get_image_depth.<locals>.<genexpr>E  s*   è è € ÐEÐE¨a  A¨¡E¡	ÐEÐEÐEÐEÐEÐErR   r¦   Ú é   )r>   r$   r;   r<   Úgetattrr.   r/   rl   r   ÚparamsÚanyÚreÚsubÚ_truncate_floatrv   r@   ÚmaxÚhasattrr£   r   r   r   rt   Úsumr?   r   r   r   r!   ÚmathÚceil)rB   ÚcolumnsÚmax_column_widthsÚlayerÚcolumn_widthÚcurrent_maxrN   r;   Úboxed_gatesÚtarget_gatesÚarg_str_lenÚargÚarg_strÚ	base_typeÚsum_column_widthsÚmax_wire_namern   ry   r<   s                      rP   rs   zQCircuitImage._get_image_depthõ   s·  € ð ˆØÔð 	ØŒKð	à”˜A”ð	ð ”˜A”˜qÔ!Ô$Ô)¨YÒ6Ð6Ý˜4œ; qœ>¨!Ô,Ô/°¸dÑCÔCð 7ð �q‰LˆGð ÐØ”[ð 9	$ñ 9	$ˆEØˆLØˆKØð 4%ñ 4%�Ø”W�ðð ð �ð6  AÐ@Ð@�Ø”7˜kÐ)Ð)Ø$(�D”M�MØ”W Ð,Ð,Ø'+�DÔ$Ð$Ý ¥NÑ3Ô3ð )Ø$(�D”Mà�àœ9ð 4ð 4�CÝÐTÐTÈ"Ì)ÐTÑTÔTÑTÔTð 4Ý"$¤&Ð)CÀTÔEYÕ[^Ð_bÑ[cÔ[cÑ"dÔ"d˜Ø#¥s¨7¡|¤|Ñ3˜øõ " +¨{Ñ;Ô;�õ )0°°KÑ(@Ô(@ÐR˜D˜DÀbÄl�	Ý˜b¥'Ñ*Ô*ð %­j¸ÅVÍYÕX_ÐD`Ñ.aÔ.að %Ø#$�LùØ×$Ò$ [Ñ1Ô1Ð1Ø�|Ñ#ˆG‰Gõ  ÐEÐEÐ3DÐEÑEÔEÑEÔEÐàˆØ”Nð 	:ð 	:ˆDÝ˜$¥­ Ñ/Ô/ð !Ý+¨D¬M¸4Ñ@Ô@�Ø(0Ð(<�x”}�}À"��à”y�Ý ­s°4©y¬yÑ9Ô9ˆMˆMà˜Q °Ñ!2Ñ2Ñ2Ðð �œ	Ð"3Ñ4Ô4Ð4Ð4rR   c                 ó†  — d}d}| j         | j        z  }d}t          | j         |z  |¦  «        }t          | j        |z  |¦  «        }||z  |k    rJt          t          j        ||z  ¦  «        |¦  «        }t          t          j        ||z  ¦  «        |¦  «        }t          |d¦  «        }t          |d¦  «        }||| j        fS )z9Get height, width & scale attributes for the beamer page.i@œ  i&  ç      ø?é
   )r+   r*   ÚminrŸ   Úsqrtr±   r%   )rB   Ú	pil_limitÚbeamer_limitÚaspect_ratioÚmargin_factorÚheightÚwidths          rP   Ú_get_beamer_pagezQCircuitImage._get_beamer_pageU  sÏ   € ð ˆ	ð ˆð Ô-°Ô0GÑGˆð ˆÝ�TÔ+¨mÑ;¸\ÑJÔJˆÝ�DÔ+¨mÑ;¸\ÑJÔJˆð �E‰>˜IÒ%Ð%Ý�œ ¨\Ñ!9Ñ:Ô:¸LÑIÔIˆFÝ�œ 	¨LÑ 8Ñ9Ô9¸<ÑHÔHˆEõ �V˜R‘”ˆÝ�E˜2‘”ˆà˜˜tœ{Ð+Ð+rR   c           	      óp  ‡ — d}‰ j         ra‰ j        rZ‰ j        d         rM‰ j        d         d         j        j        dk    s't	          ‰ j        d         d         j        dd¦  «        r|dz  }‰ j        D �]Á}d}|D �]³}|j        }d}ˆ fd„|j        D ¦   «         }t	          |dd¦  «        rFt          |j        t          j	        ¦  «        rt          d¦  «         n‰                      |||¦  «         t          |t          ¦  «        r‰                      ||¦  «         �n t	          |dd	¦  «        r‰                      ||¦  «         nØt          |d
‰ j        ¬¦  «        \  }}	}	|t#          |d
d¬¦  «        z  }t%          |¦  «        }|j        rˆ fd„|j        D ¦   «         }
ng }
t)          |¦  «        dk    r"|j        sd|› d�‰ j        |d                  |<   nGt          |t,          ¦  «        r‰                      ||||¦  «        }n‰                      ||||
|¦  «        }t3          ||¦  «        }�Œµ||z  }�ŒÃdS )z?Returns an array of strings containing \LaTeX for this circuit.r   r   r   r   Nc                 ó<   •— g | ]}|‰j         v ¯‰j        |         ‘ŒS r§   ©r"   r?   ©rm   ÚqargrB   s     €rP   ro   z4QCircuitImage._build_latex_array.<locals>.<listcomp>‰  s.   ø€ ÐaÐaÐa°dÈDÐTXÔT`ÐL`ÐL`˜Tœ^¨DÔ1ÐL`ÐL`ÐL`rR   z9ignoring expression condition, which is not supported yetÚ
_directiveFrV   )rG   r¤   )Úndigitsc                 ó<   •— g | ]}|‰j         v ¯‰j        |         ‘ŒS r§   )r#   r?   )rm   ÚcargrB   s     €rP   ro   z4QCircuitImage._build_latex_array.<locals>.<listcomp>›  s5   ø€ ð &ð &ð &Ø59È4ÐSWÔS_ÐK_ÐK_˜DœN¨4Ô0ÐK_ÐK_ÐK_rR   ú\gate{rT   )r>   r$   r;   r<   r«   Úqargsrl   r   r   ÚExprr   Ú_add_conditionr   Ú_build_measureÚ_build_barrierr   rA   r   r   r:   r@   r'   r   Ú_build_ctrl_gateÚ_build_multi_gater±   )rB   Úcolumnr¸   Únum_cols_layerrN   r;   Únum_cols_opÚ	wire_listÚ	gate_textrO   Ú
cwire_lists   `          rP   rZ   z QCircuitImage._build_latex_arrayt  s¨  ø€ ð ˆàÔð 	ØŒKð	à”˜A”ð	ð ”˜A”˜qÔ!Ô$Ô)¨YÒ6Ð6Ý˜4œ; qœ>¨!Ô,Ô/°¸dÑCÔCð 7ð �a‰KˆFà”[ð *	%ñ *	%ˆEØˆNàð %Bñ %B�Ø”W�Ø�ØaÐaÐaÐa¸d¼jÐaÑaÔa�	Ý˜2˜{¨DÑ1Ô1ð CÝ! "¤,µ´	Ñ:Ô:ð CÝÐXÑYÔYÐYÐYà×+Ò+¨B°	¸6ÑBÔBÐBå˜b¥'Ñ*Ô*ð Ø×'Ò'¨¨fÑ5Ô5Ð5Ñ5å˜R ¨uÑ5Ô5ð Ø×'Ò'¨¨fÑ5Ô5Ð5Ð5õ '9¸¸WÈDÌKÐ&XÑ&XÔ&X‘O�I˜q !Ø¥¨r°7ÀAÐ!FÑ!FÔ!FÑF�IÝ 4°YÑ ?Ô ?�IØ”zð (ð&ð &ð &ð &Ø=A¼Zð&ñ &ô &˜
˜
ð &(˜
å˜9‘~”~¨Ò*Ð*°4´:Ð*Ø<TÀyÐ<TÐ<TÐ<T˜œ I¨a¤LÔ1°&Ñ9Ð9å# B­Ñ7Ô7ð Ø&*×&;Ò&;¸BÀ	È9ÐV\Ñ&]Ô&]˜˜à&*×&<Ò&<Ø 	¨9°jÀ&ñ'ô '˜õ "% ^°[Ñ!AÔ!A�‘à�nÑ$ˆF‰FðU*	%ð *	%rR   c                 ó"  — t          | j        ¦  «        }d}t          |t          t          f¦  «        r|                      ||||¦  «        }�nBt          |¦  «        }t          |¦  «        }	|r| j        st          |¦  «        }	| 	                    |¦  «        }
d|	|z
  › d|› d�dt          t          |
¦  «        ¦  «        dz   z  z   d|
› d�z   | j        |         |<   t          |dz   |	dz   ¦  «        D ]œ}||k     r d	|› d�}||v r| 	                    |¦  «        }
nd
|› d�}||v r| 	                    |¦  «        }
|||z   v r>|dz   dt          t          |
¦  «        ¦  «        dz   z  z   d|
› d�z   | j        |         |<   ŒŒ|| j        |         |<   Œ�|S )z+Add a multiple wire gate to the _latex listr   z\multigate{z}{z}_ú<r    rU   rT   z\ghost{z\cghost{rO   )r@   r"   rl   r	   r   Ú_build_symmetric_gaterÆ   r±   r>   rx   rv   r'   r^   )rB   r;   rä   rã   rå   ÚcolÚcwire_startrâ   Úwire_minÚwire_maxÚwire_indrn   Ú	ghost_boxs                rP   rß   zQCircuitImage._build_multi_gate¯  sê  € å˜$œ,Ñ'Ô'ˆØˆÝ�b�8¥WÐ-Ñ.Ô.ð 	7Ø×4Ò4°R¸ÀIÈsÑSÔSˆK‰Kå˜9‘~”~ˆHÝ˜9‘~”~ˆHØð + $Ô"2ð +Ý˜z™?œ?�Ø —’ xÑ0Ô0ˆHàG ¨8Ñ 3ÐGÐG¸ÐGÐGÐGØ��S ™]œ]Ñ+Ô+¨aÑ/Ñ0ñ1à#�xÐ#Ð#Ð#ñ$ð ŒK˜Ô! #Ñ&õ
 ˜h¨™l¨H°q©LÑ9Ô9ð 7ð 7�Ø˜+Ò%Ð%Ø 9¨IÐ 9Ð 9Ð 9�IØ˜yÐ(Ð(Ø#,§?¢?°4Ñ#8Ô#8˜øà :¨YÐ :Ð :Ð :�IØ˜zÐ)Ð)Ø#-×#3Ò#3°DÑ#9Ô#9˜Ø˜9 zÑ1Ð1Ð1à! C™¨#µµS¸±]´]Ñ1CÔ1CÀaÑ1GÑ*HÑHÐK\ÐPXÐK\ÐK\ÐK\Ñ\ð ”K Ô% cÑ*Ð*ð .7�D”K Ô% cÑ*Ð*ØÐrR   c                 óÊ  — d}|j         }||d…         }|d|…         }t          |¦  «        }	t          |¦  «        }
|j        d›                     |d¦  «        ddd…         }t          |¦  «        dk    rÐ|                      ||||¦  «         t          |j        t          ¦  «        rd| j
        |d                  |<   �n$t          |j        t          ¦  «        rd| j
        |d                  |<   nót          |j        t          t          f¦  «        r|                      ||||¦  «        }n¹d	|› d
�| j
        |d                  |<   nžt          |j        t          t           f¦  «        r1|                      ||||¦  «         |                      ||||¦  «        }nL|D ]}|t#          |	|
¦  «        v r|} nŒ|                      ||||¦  «         |                      |||g |¦  «         |S )z4Add a gate with multiple controls to the _latex listr   NÚbrr   éÿÿÿÿz\targr   z\control\qwrØ   rT   )Únum_ctrl_qubitsrÆ   r±   Ú
ctrl_stateÚrjustr@   Ú_add_controlsrl   r£   r
   r'   r   r   r   rè   r	   r   r^   rß   )rB   r;   rä   rã   ré   râ   rò   Ú	wireqargsÚ	ctrlqargsrë   rì   ró   Úctrls                rP   rÞ   zQCircuitImage._build_ctrl_gateÑ  s  € àˆØÔ,ˆØ˜oÐ.Ð.Ô/ˆ	ØÐ.˜Ð.Ô/ˆ	Ý�y‘>”>ˆÝ�y‘>”>ˆØœÐ)Ð)×/Ò/°ÀÑEÔEÀdÀdÈÀdÔKˆ
õ ˆy‰>Œ>˜QÒÐØ×Ò˜y¨)°ZÀÑEÔEÐEõ ˜"œ,­Ñ.Ô.ð JØ19�”˜I aœLÔ)¨#Ñ.Ñ.Ý˜BœL­%Ñ0Ô0ð JØ1@�”˜I aœLÔ)¨#Ñ.Ð.Ý˜BœL­6µ9Ð*=Ñ>Ô>ð JØ"×8Ò8¸¸YÈ	ÐSVÑWÔW��à1I¸IÐ1IÐ1IÐ1I�”˜I aœLÔ)¨#Ñ.Ð.õ ˜"œ,­µ7Ð(;Ñ<Ô<ð JØ×"Ò" 9¨i¸ÀSÑIÔIÐIØ"×8Ò8¸¸YÈ	ÐSVÑWÔW��ð &ð Nð N�DØ�u X¨xÑ8Ô8Ð8Ð8Ø$-˜	Ø˜ð 9ð ×&Ò& y°)¸ZÈÑMÔMÐMà×&Ò& r¨9°iÀÀSÑIÔIÐIØÐrR   c                 ó¤  — t          |¦  «        }|d         }|d         }t          |d¦  «        sdn|j        }t          |t          ¦  «        s|rMt          |t          ¦  «        r8d| j        |         |<   dt          ||z
  ¦  «        z   dz   | j        |         |<   dS t          |t          ¦  «        s|rt          |t          ¦  «        rd	}	n&|j        d
› 	                    dd¦  «        ddd…         }	|	dk    rdnd}
|
› dt          ||z
  ¦  «        z   dz   z   | j        |         |<   d| j        |         |<   d|› d�| j        |dz
           |dz   <   dS )z.Add symmetric gates for cu1, cp, swap, and rzzéþÿÿÿrñ   r£   Nz\qswapz\qswap \qwx[ú]r   Ú1rð   rr   ú\ctrloú\ctrlrU   rT   z\control \qwz\dstick{\hspace{2.0em}z} \qwr¤   )
r±   r²   r£   rl   r	   r'   rv   r   ró   rô   )rB   r;   rä   rã   ré   rì   Úwire_next_lastÚ	wire_lastÚbase_opÚctrl_bitÚcontrols              rP   rè   z#QCircuitImage._build_symmetric_gateú  s~  € å�y‘>”>ˆà" 2œˆØ˜b”Mˆ	Ý% b¨+Ñ6Ô6ÐH�$�$¸B¼Lˆå�b�(Ñ#Ô#ð 	¨ð 	µJ¸wÍÑ4QÔ4Qð 	Ø/8ˆDŒK˜Ô'¨Ñ,Ø*:½SÀÐR[ÑA[Ñ=\Ô=\Ñ*\Ð_bÑ*bˆDŒK˜	Ô" 3Ñ'Ø�1å�b�'Ñ"Ô"ð 	@ wð 	@µ:¸gÅwÑ3OÔ3Oð 	@ØˆHˆHàœ-Ð+Ð+×1Ò1°!°SÑ9Ô9¸$¸$¸B¸$Ô?ˆHà'¨3š˜�)�)°HˆØ.5¨<Ø•#�i .Ñ0Ñ1Ô1Ñ1°CÑ7ñ,
ˆŒ�NÔ# CÑ(ð '7ˆŒ�IÔ˜sÑ#à-]È9Ð-]Ð-]Ð-]ˆŒ�H˜q‘LÔ! #¨¡'Ñ*ØˆqrR   c           	      ó†  — | j         |j        d                  }d| j        |         |<   d}t          |j        dd¦  «        rdnd}| j        r·t          | j        |j        d         ¦  «        }|�Q| j         |         }t          | j         
                    |j        d         ¦  «        j        d         d         ¦  «        }n| j         |j        d                  }d	|› d
|› dt          ||z
  ¦  «        › d�| j        |         |<   dS | j         |j        d                  }dt          ||z
  ¦  «        z   dz   | j        |         |<   dS )z'Build a meter and the lines to the cregr   z\meterr©   r   NrÄ   ç        r   z\dstick{_{_{\hspace{zem}z}}} \cw \ar @{<=} [-z,0]z\cw \ar @{<=} [-)r?   rÙ   r'   r«   r;   r>   r   r!   r:   rv   Úfind_bitÚ	registers)rB   rN   ré   Úwire1Úidx_strÚcond_offsetry   Úwire2s           rP   rÜ   zQCircuitImage._build_measure  sT  € à”˜tœz¨!œ}Ô-ˆØ"+ˆŒ�EÔ˜3ÑàˆÝ$ T¤W¨k¸4Ñ@Ô@ÐI�c�cÀcˆØÔð 	XÝ'¨¬°t´zÀ!´}ÑEÔEˆHØÐ#Øœ xÔ0�Ý˜dœm×4Ò4°T´ZÀ´]ÑCÔCÔMÈaÔPÐQRÔSÑTÔT��àœ t¤z°!¤}Ô5�ð?¨[ð ?ð ?¸gð ?ð ?Ý'*¨5°5©=Ñ'9Ô'9ð?ð ?ð ?ð ŒK˜Ô˜sÑ#Ð#Ð#ð
 ”N 4¤:¨a¤=Ô1ˆEØ&:½SÀÈÁÑ=OÔ=OÑ&OÐRWÑ&WˆDŒK˜Ô˜sÑ#Ð#Ð#rR   c           	      óœ  ‡ — ‰ j         �r@ˆ fd„|j        D ¦   «         }|                     ¦   «          |d         x}}|dd…         D ]n}|dz
  |k    r|}Œ‰ j        ‰ j        |                  }‰ j        |         |dz
  xx         dt          ||z
  ¦  «        z   dz   z  cc<   d‰ j        |         |<   |x}}Œo‰ j        ‰ j        |                  }‰ j        |         |dz
  xx         dt          ||z
  ¦  «        z   dz   z  cc<   |j        j        �@|d         }|j        j         	                    dd	¦  «        }d
|› d�‰ j        |         |<   dS dS dS )z4Build a partial or full barrier if plot_barriers setc                 ó<   •— g | ]}|‰j         v ¯‰j        |         ‘ŒS r§   rÑ   rÒ   s     €rP   ro   z0QCircuitImage._build_barrier.<locals>.<listcomp>.  s,   ø€ Ð[Ð[Ð[°ÀdÈdÌlÐFZÐFZ�t”~ dÔ+ÐFZÐFZÐFZrR   r   r   Nz \barrier[0em]{rT   rk   rp   z\,z\cds{0}{^{\mathrm{z}}})
r0   rÙ   Úsortr?   r"   r'   rv   r;   ÚlabelÚreplace)	rB   rN   ré   ÚindexesÚfirstÚlastrx   r}   r  s	   `        rP   rÝ   zQCircuitImage._build_barrier+  s–  ø€ àÔñ 	RØ[Ð[Ð[Ð[¸¼
Ð[Ñ[Ô[ˆGØ�LŠL‰NŒNˆNØ" 1œ:Ð%ˆE�DØ    œð )ð )�Ø˜1‘9 Ò$Ð$Ø �D�Dàœ.¨¬°eÔ)<Ô=�CØ”K Ô$ S¨1¡WÐ-Ð-Ô-Ð1CÅcÈ$ÐQVÉ,ÑFWÔFWÑ1WÐZ]Ñ1]Ñ]Ð-Ð-Ñ-Ø,2�D”K Ô$ SÑ)Ø#(Ð(�E˜D˜DØ”. ¤¨eÔ!4Ô5ˆCØŒK˜Ô˜S 1™WÐ%Ð%Ô%Ð);½cÀ$ÈÁ,Ñ>OÔ>OÑ)OÐRUÑ)UÑUÐ%Ð%Ñ%ØŒwŒ}Ð(Ø˜a”j�Øœœ×-Ò-¨c°5Ñ9Ô9�Ø(QÀEÐ(QÐ(QÐ(Q�”˜CÔ  Ñ%Ð%Ð%ð#	Rð 	Rð )Ð(rR   c                 óZ  — t          t          ||¦  «        ¦  «        D ]Œ\  }}|d         }||         }||         |d         k    r|dz  }||vr	|dz  }||v°	n|dz  }||vr	|dz  }||v°	|d         dk    rdnd}	|	› dz   t          |||         z
  ¦  «        z   dz   | j        |         |<   Œ�d	S )
z"Add one or more controls to a gater   rñ   r   rr   rý   rþ   rU   rT   N)Ú	enumerateÚziprv   r'   )
rB   rã   r÷   ró   ré   rx   Ú	ctrl_itemr}   Únxtr  s
             rP   rõ   zQCircuitImage._add_controls@  s  € å )­#¨i¸Ñ*DÔ*DÑ EÔ Eð 	[ð 	[ÑˆE�9Ø˜A”,ˆCØ˜EÔ"ˆCØ˜Ô )¨B¤-Ò/Ð/Ø�q‘�Ø Ð*Ð*Ø˜1‘H�Cð  Ð*Ð*øð �q‘�Ø Ð*Ð*Ø˜1‘H�Cð  Ð*Ð*ð $-¨Q¤<°3Ò#6Ð#6�i�i¸HˆGØ'. L°3Ñ$6½¸SÀ9ÈUÔCSÑ=SÑ9TÔ9TÑ$TÐWZÑ$ZˆDŒK˜Ô˜SÑ!Ð!ð	[ð 	[rR   c           	      óX  — t          |j        | j        | j        ¦  «        \  }}t	          |j        d         t
          ¦  «        }|j        d         }|r$t          | j        |j        d         ¦  «        }|�|}t	          |t          ¦  «        rdnd}	|s| j        rz| j        r| j        |         n| j        |j        d                  }
|
t          |¦  «        z
  }|j        d         rdnd}|› d|	› d	|› d
t          |¦  «        › d�| j        |
         |<   dS g }g }| j                             ¦   «         D ]N\  }}t          | j        |¦  «        \  }}}||k    r*|                     |¦  «         |                     |¦  «         ŒO|d         t          |¦  «        z
  }|d         }d„ t          t!          ||¦  «        ¦  «        D ¦   «         }t#          |dd…         ¦  «        D ]H\  }}|dk    r||z
  }||         dk    rdnd}|› d�t          |¦  «        z   dz   | j        |         |<   |}ŒIt%          |¦  «        dk    r|d         t          |¦  «        z
  }n|d         |z
  }|t%          |¦  «        dz
           dk    rdnd}|› dz   |	|t          |¦  «        fz  | j        |d                  |<   dS )z"Add a condition to the _latex listr   Ng333333Ó¿r  r   z\controlz	\controloz \cw^(z){^{\mathtt{z
}}} \cwx[-rû   c                 ó   — g | ]\  }}|‘ŒS r§   r§   )rm   rO   Úbits      rP   ro   z0QCircuitImage._add_condition.<locals>.<listcomp>y  s   € ÐRÐRÐR¡v q¨#˜sÐRÐRÐRrR   rñ   rü   z \cw \cwx[-z# \cw^(%s){^{\mathtt{%s}}} \cwx[-%s])r   r   r!   r>   rl   r   r   r   r?   r±   rv   r'   ru   r   rt   Úsortedr  r  r@   )rB   r;   rã   ré   r  Úval_bitsÚcond_is_bitÚcond_regry   Úmeas_offsetÚcwireÚgapr  Ú
cond_wiresÚ	cond_bitsrn   rx   ÚregrO   r|   Ú	prev_wireÚval_bits_sortedre   s                          rP   rÛ   zQCircuitImage._add_conditionR  s	  € õ
 2°"´,ÀÄÈtÔO_Ñ`Ô`‰ˆˆxÝ  ¤¨a¤µ%Ñ8Ô8ˆØ”< ”?ˆØð 	$Ý'¨¬°r´|ÀA´ÑGÔGˆHØÐ#Ø#�Ý(¨­WÑ5Ô5Ð>�d�d¸3ˆð ð -	˜$Ô*ð -	à,0Ô,<Ða�”˜xÔ(Ð(À$Ä.ÐQSÔQ]Ð^_ÔQ`ÔBað ð �#˜i™.œ.Ñ(ˆCØ%'¤\°!¤_ÐF�k�k¸,ˆGð Ð`Ð` ;Ð`Ð`ÀÐ`Ð`ÕUXÐY\ÑU]ÔU]Ð`Ð`Ð`ð ŒK˜ÔØñð ð ð ˆJØˆIØ#œ~×3Ò3Ñ5Ô5ð -ð -‘��eÝ$5°d´mÀTÑ$JÔ$JÑ!��Q˜	Ø˜(’?�?Ø×$Ò$ YÑ/Ô/Ð/Ø×%Ò% eÑ,Ô,Ð,øà˜Q”-¥# i¡.¤.Ñ0ˆCØ" 1œˆIØRÐRµ½¸IÀxÑ8PÔ8PÑ1QÔ1QÐRÑRÔRˆOõ % Z°°°¤_Ñ5Ô5ð !ð !‘��4Ø�q’5�5Ø Ñ*�CØ)8¸Ô);¸sÒ)BÐ)B˜+˜+È�Ø,3Ð)BÐ)BÐ)BÅSÈÁXÄXÑ)MÐPSÑ)S�”˜DÔ! #Ñ&Ø �	�	õ �:‰Œ !Ò#Ð#Ø  ”m¥c¨)¡n¤nÑ4��à  ”n yÑ0�Ø%4µS¸±_´_ÀqÑ5HÔ%IÈSÒ%PÐ%P�k�kÐVbˆGà�ÐGÑGàØÝ�C‘”ðñ0ˆDŒK˜
 2œÔ'¨Ñ,Ð,Ð,rR   r¤   c                 ó‚   — |                      d¦  «        r)d|› d�t          |                      d¦  «        ¦  «        z  S dS )zTruncate long floats.r   z%.Úgr©   )ÚgroupÚfloat)rB   ÚmatchobjrÕ   s      rP   r°   zQCircuitImage._truncate_float‘  sB   € à�>Š>˜!ÑÔð 	>Ø"˜�?�?�?¥U¨8¯>ª>¸!Ñ+<Ô+<Ñ%=Ô%=Ñ=Ð=ØˆrrR   )NFTFNFN)r¤   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rQ   rV   rY   rs   rÎ   rZ   rß   rÞ   rè   rÜ   rÝ   rõ   rÛ   r°   r§   rR   rP   r   r   +   s,  € € € € € ðð ð ØØØØØØðf+ð f+ð f+ð f+ðP(ð (ð (ðT-^ð -^ð -^ð^^5ð ^5ð ^5ð@,ð ,ð ,ð>9%ð 9%ð 9%ðv ð  ð  ðD'ð 'ð 'ðRð ð ð6Xð Xð Xð,Rð Rð Rð*[ð [ð [ð$=ð =ð =ð~ð ð ð ð ð rR   r   )(r0  r[   r7   r´   r®   Úwarningsr   ÚnumpyrŸ   Úqiskit.circuitr   r   r   Úqiskit.circuit.classicalr   Úqiskit.circuit.controlledgater   Ú%qiskit.circuit.library.standard_gatesr	   r
   r   r   r   r   Úqiskit.circuit.measurer   Úqiskit.circuit.tools.pi_checkr   Úqcstyler   Ú_utilsr   r   r   r   r   r   r   r   r   r§   rR   rP   ú<module>r;     sœ  ðð #Ð "à 	€	€	€	Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø )Ð )Ð )Ð )Ð )Ð )Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dØ *Ð *Ð *Ð *Ð *Ð *Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ð  Ð Ð Ð Ð Ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ðj	ð j	ð j	ð j	ð j	ñ j	ô j	ð j	ð j	ð j	rR   