
    z	ig                         S r SSKrSSKrSSKrSSKrSSKJr  SSKrSSK	J
r
JrJr  SSKJr  SSKJr  SSKJr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J r   SSK!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)   " S S5      r*g)zlatex visualization backend.    N)warn)ClbitQubitClassicalRegister)expr)ControlledGate)SwapGateXGateZGateRZZGateU1Gate	PhaseGate)Measure)pi_check)
load_style)MPLDefaultStyleMPLStyleDict   )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                       \ rS rSrSr       SS jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rS rSS jrSrg)QCircuitImage,   zThis 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.
Nc                    Xl         Xl        X l        X0l        Uc  SOUU l        0 U l        / U l        SU l        SU l        SU l	        SU l
        SU l        SU l        SU l        SU l        Xpl        X`l        U
(       aI  U R                   R"                  (       a&  U R                   R"                  R$                  U l        OSU l        OSU l        Xl        UR(                  U l        [,        R.                  R1                  U R                  5       HQ  nUR2                  (       d  M  UR4                  R6                  S:w  d  M2  U	(       a  [9        S[:        S5        SU l          O   U	c  S	OU	U l        [?        XU-   U R<                  5      U l         [C        U R@                  5      U l        [E        U[F        [I        5       S
SS9u  U l%        ng)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_mpl_stylecircuit_mpl_style_path)
style_dictdefault_styleuser_config_optuser_config_path_opt)&_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   r   r   _style)selfqubitsclbitsnodesscalestylereverse_bitsplot_barriersinitial_state
cregbundlewith_layoutcircuitnode_s                 \/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/visualization/circuit/latex.py__init__QCircuitImage.__init__5   s   @    #]c     #$ "# #$ !"  +)}}$$#}}44CC#DL+$11 OO11$++>Dzzzdgglli78&	 $)  ? (2'9tzD%g@P@PQdnn-##)+/!9
Q    c           
         U R                  5         U R                  5         SnSnSU R                   S3S-   nSn[        R                  " 5       nUR                  U5        UR                  U5        UR                  U5        U R                  (       a,  UR                  SS< S	[        U R                  S
S9< S35        UR                  X@R                  U R                  4-  5        [        U R                  5       H  nUR                  S5        [        U R                  S-   5       HW  nUR                  U R                  U   U   5        XpR                  :w  a  UR                  S5        MF  UR                  S5        MY     M     UR                  S5        UR                  S5        UR                  5       nUR                  5         U$ )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writer?   r   r5   r6   ranger2   r1   r0   getvalueclose)	rK   header_1header_2header_scaleqcircuit_linera   ijcontentss	            rY   r`   QCircuitImage.latex   so    	$$&!C &dkk]"5; XX\"LL'$2D2DW)UW 	]&=&=t?T?T%UUVt'ALL!4??Q./T[[^A./'LL'LL. 0 ( 	_%&'??$r\   c                    U R                  5       u  U l        U l        U R                  U l        U R
                  (       a  SU l        O U R                  (       a  SU l        OSU l        U R                   VVs/ s HC  n[        U R                  S-   5       Vs/ s H  n[        U[        5      (       a  SOSPM     snPME     snnU l        U R                  R                  S/U R                  S-   -  5        U R                  R                  5        GH>  u  p[        U[        5      (       a#  Un[!        SXCU R"                  U R$                  S	9nO?['        U R(                  U5      u  pFn[!        SUUc  UOUU R"                  U R$                  S	9nUS-  nU R*                  (       a  U[        U[        5      (       a  SOS-  nUS-  n[        U[        5      (       dU  U R$                  (       aD  UbA  U R                  U   nS[-        UR.                  5      -   S-   U R                  U   S'   SU S3nOUnSU-   S-   S-   U-   U R                  U   S'   GMA     g
s  snf s  snnf )z9Initialize qubit and clbit labels and set wire separationg?g?r!   r   \qwz\cw r`   )layoutrT   Nz : z	\ket{{0}}0z }z\lstick{/_{_{z}}} \cwz\mathrm{r^   z\nghost{rb   z\lstick{r   )_get_image_depthr1   r3   r2   r4   r7   r6   r8   rH   rh   
isinstancer   r0   appenditemsr   r   r;   rG   r   r*   r=   strsize)	rK   wirerX   indexregister
wire_label	bit_index	reg_indexposs	            rY   rc   %QCircuitImage._initialize_latex_array   s#   373H3H3J00!%==$'D!$'D!$'D! 
& EJ$//\]J]D^_D^qz$..VF:D^_&
 	C5DOOa$789  >>//1KD$ 122+XT\\dN^N^
 2C4==RV1W.Y+!)!1Iy<<#//
 %J""ju.E.El3N
$JdU,,1A1AhFZnnX.&6X]]9K&Kj&XC #)*R8
"-
":U"B["PS]"]DKKQ7 2 `
s   7 I#I:IIc           
      d   SnU R                   (       a  U R                  (       ao  U R                  S   (       a[  U R                  S   S   R                  R                  S:X  d,  [	        U R                  S   S   R                  SS5      (       a  US-  n/ nU R                   GH]  nSnSnU GH9  nUR                  n/ SQn/ SQn	UR                  U;   a  S	U l        O4UR                  U	;   a  S	U l        O[        U[        5      (       a  S	U l        Sn
UR                   H_  n[        S
 UR                   5       5      (       a  M&  [        R                  " SU R                  [        U5      5      nU
[        U5      -  n
Ma     [!        X5      n[#        US5      (       d  SOUR$                  n[        U[&        5      (       d#  [        U[(        [*        [&        45      (       d  GM7  SnGM<     UR-                  U5        X-  nGM`     [/        S U 5       5      nSnU R0                   Hg  n[        U[2        [4        45      (       a(  [7        U R8                  U5      nUb  UR                  OSnOUR                  n[!        U[        U5      5      nMi     USUS-  -   -  nU[:        R<                  " U5      4$ )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   V   #    U  H  n[        U[        R                  5      v   M!     g 7f)N)ry   npndarray).0params     rY   	<genexpr>1QCircuitImage._get_image_depth.<locals>.<genexpr>9  s     T)z%<<)s   ')z[-+]?\d*\.\d{2,}|\d{2,}	base_gate   c              3   2   #    U  H  nS US-  -   v   M     g7f)r      N )r   vs     rY   r   r   L  s     E3DaAE	3Ds   r       )rG   r-   rD   rE   getattrr7   r8   ry   r   paramsanyresub_truncate_floatr|   rI   maxhasattrr   r   r   r   rz   sumrH   r   r   r   r*   mathceil)rK   columnsmax_column_widthslayercolumn_widthcurrent_maxrW   rD   boxed_gatestarget_gatesarg_str_lenargarg_str	base_typesum_column_widthsmax_wire_namer~   r   rE   s                      rY   rx   QCircuitImage._get_image_depth   sK    KKAAq!$$))Y64;;q>!,//dCC qLG [[ELKWW6  A77k)$(DMWW,'+D$N33$(DM99CT"))TTT"$&&)CTEYEY[^_b[c"d#s7|3 % "+; )0K(@(@Dbll	b'**jVYX_D`.a.a#$Li j $$[1#Gs !~  E3DEENND$//+DMM4@(0(<x}}"yys4y9M # 	Q!222 		"3444r\   c                    SnSnU R                   U R                  -  nSn[        U R                   U-  U5      n[        U R                  U-  U5      nXV-  U:  aD  [        [        R                  " X-  5      U5      n[        [        R                  " X-  5      U5      n[        US5      n[        US5      nXVU R                  4$ )z9Get height, width & scale attributes for the beamer page.i@  i&        ?
   )r4   r3   minr   sqrtr   r.   )rK   	pil_limitbeamer_limitaspect_ratiomargin_factorheightwidths          rY   _get_beamer_pageQCircuitImage._get_beamer_page\  s     	  --0G0GG T++m;\JD++m;\J >I%!9:LIF	 89<HE VRE2t{{++r\   c           	      d   SnU R                   (       a  U R                  (       ao  U R                  S   (       a[  U R                  S   S   R                  R                  S:X  d,  [	        U R                  S   S   R                  SS5      (       a  US-  nU R                   GH  nSnU GH  nUR                  nSnUR
                   Vs/ s H#  owU R                  ;   d  M  U R                  U   PM%     nn[	        USS5      (       aG  [        UR                  [        R                  5      (       a  [        S5        OU R                  XXU5        [        U[        5      (       a  U R                  XA5        GO[	        USS5      (       a  U R!                  XA5        O[#        US	U R$                  S
9u  n	  n
U	['        US	SS9-  n	[)        U	5      n	UR*                  (       a;  UR*                   Vs/ s H#  oU R,                  ;   d  M  U R                  U   PM%     nnO/ n[/        U5      S:X  a+  UR*                  (       d  SU	 S3U R0                  US      U'   O;[        U[2        5      (       a  U R5                  XYX5      nOU R7                  XYXU5      n[9        X65      nGM     X-  nGM     gs  snf s  snf )z?Returns an array of strings containing \LaTeX for this circuit.r   r   r"   r   Nz9ignoring expression condition, which is not supported yet
_directiveFr`   )rP   r   )ndigits\gate{r^   )rG   r-   rD   rE   r   qargsr+   rH   ry   r   r   Exprr   _add_conditionr   _build_measure_build_barrierr   rJ   r   r   rC   r,   rI   r0   r   _build_ctrl_gate_build_multi_gater   )rK   columnr   num_cols_layerrW   rD   num_cols_opqarg	wire_list	gate_textrX   carg
cwire_lists                rY   rd    QCircuitImage._build_latex_array{  sN    KKAAq!$$))Y64;;q>!,//dCC aKF[[ENWW>BjjajdTXT`T`L`1T^^D1j	a2{D11!",,		::XY++B6Bb'**''5Ru55''5 '9WDKK&XOIq!r7A!FFI 4Y ?Izz=AZZ&=GTSWS_S_K_0DNN40Z # &
 &(
9~*4::>FykQS<TIaL1&9#B77&*&;&;B9&]&*&<&<9&' "%^!AK N $FU ! b$&s   J(J(*J-J-c                    [        U R                  5      nSn[        U[        [        45      (       a  U R                  XX55      nU$ [        U5      n[        U5      n	U(       a  U R                  (       d  [        U5      n	UR                  U5      n
SX-
   SU S3S[        [        U
5      5      S-   -  -   SU
 S3-   U R                  U   U'   [        US-   U	S-   5       H  nX:  a  S	U S3nX;   a  UR                  U5      n
OS
U S3nX;   a  UR                  U5      n
XU-   ;   a9  US-   S[        [        U
5      5      S-   -  -   SU
 S3-   U R                  U   U'   M  XR                  U   U'   M     U$ )z+Add a multiple wire gate to the _latex listr   z\multigate{z}{z}_<r#   r_   r^   z\ghost{z\cghost{rX   )rI   r+   ry   r	   r   _build_symmetric_gater   r   rG   r   r|   r0   rh   )rK   rD   r   r   r   colcwire_startr   wire_minwire_maxwire_indr~   	ghost_boxs                rY   r   QCircuitImage._build_multi_gate  s   $,,'b8W-..44RISK6 3 9~H9~H$"2"2z? x0H 34D3GS]+a/01xj#$ KK!#&
 hlHqL9%"+I;b 9I(#,??4#8",YKr :I)#-#3#3D#9z11!C#S]1Ca1G*HHRPXzY[K\\ KK%c* .7KK%c* : r\   c                    SnUR                   nX6S nUSU n[        U5      n	[        U5      n
UR                  S R	                  US5      SSS2   n[        U5      S:X  a  U R                  X8X5        [        UR                  [        5      (       a  SU R                  US      U'   U$ [        UR                  [        5      (       a  SU R                  US      U'   U$ [        UR                  [        [        45      (       a  U R                  XX45      nU$ S	U S
3U R                  US      U'    U$ [        UR                  [        [         45      (       a&  U R                  X8X5        U R                  XX45      nU$ U H  nU[#        X5      ;   d  M  Un  O   U R                  X8X5        U R%                  XU/ U5        U$ )z4Add a gate with multiple controls to the _latex listr   Nbrw   z\targr   z\control\qwr   r^   )num_ctrl_qubitsr   r   
ctrl_staterjustrI   _add_controlsry   r   r
   r0   r   r   r   r   r	   r   rh   r   )rK   rD   r   r   r   r   r   	wireqargs	ctrlqargsr   r   r   ctrls                rY   r   QCircuitImage._build_ctrl_gate  s   ,,./	./	y>y>a(//EddK
 y>QyZE ",,..19IaL)#.. - BLL%001@IaL)#.* ) BLL69*=>>"88	W& # 4<I;b1IIaL)#."  ",,7(;<<""9I"88	W  &DuX88$-	 &
 &&yZM&&riSIr\   c                    [        U5      nUS   nUS   n[        US5      (       d  SOUR                  n[        U[        5      (       d  U(       aK  [        U[        5      (       a6  SU R
                  U   U'   S[        Xg-
  5      -   S-   U R
                  U   U'   g[        U[        5      (       d  U(       a  [        U[        5      (       a  S	n	O$UR                  S
 R                  SS5      SSS2   n	U	S:X  a  SOSn
U
 S[        Xv-
  5      -   S-   -   U R
                  U   U'   SU R
                  U   U'   SU S3U R
                  US-
     US-   '   g)z.Add symmetric gates for cu1, cp, swap, and rzzr   r   Nz\qswapz\qswap \qwx[]r   1r   rw   \ctrlo\ctrlr_   r^   z\control \qwz\dstick{\hspace{2.0em}z} \qwr   )
r   r   r   ry   r	   r0   r|   r   r   r   )rK   rD   r   r   r   r   wire_next_last	wire_lastbase_opctrl_bitcontrols              rY   r   #QCircuitImage._build_symmetric_gate  sH   y>"2bM	%b+66$BLLb(##Jw4Q4Q/8DKK',*:SA[=\*\_b*bDKK	"3'b'""w:gw3O3OH--*11!S9$B$?H'3)H.5Y#i011C7,
N#C( '7Is#/J9+U\-]HqL!#'*r\   c           	         U R                   UR                  S      nSU R                  U   U'   Sn[        UR                  SS5      (       a  SOSnU R
                  (       a  [        U R                  UR                  S   5      nUbQ  U R                   U   n[        U R                  R                  UR                  S   5      R                  S   S   5      nOU R                   UR                  S      nS	U S
U S[        Xs-
  5       S3U R                  U   U'   gU R                   UR                  S      nS[        Xs-
  5      -   S-   U R                  U   U'   g)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 @{<=} [-)rH   r   r0   r   rD   rG   r   r*   rC   r|   find_bit	registers)rK   rW   r   wire1idx_strcond_offsetr   wire2s           rY   r   QCircuitImage._build_measure  s=   tzz!}-"+E3$TWWk4@@cc'tzz!}EH#x0dmm44TZZ]CMMaPQRSTtzz!}5,[MgY G''*5='9&:#? KKs#
 NN4::a=1E&:S=O&ORW&WDKKs#r\   c           	      
   U R                   (       Gal  UR                   Vs/ s H#  o3U R                  ;   d  M  U R                  U   PM%     nnUR	                  5         US   =pVUSS  Ho  nUS-
  U:X  a  UnM  U R                  U R                  U      nU R
                  U   US-
  ==   S[        Xe-
  5      -   S-   -  ss'   SU R
                  U   U'   U=pVMq     U R                  U R                  U      nU R
                  U   US-
  ==   S[        Xe-
  5      -   S-   -  ss'   UR                  R                  bB  US   nUR                  R                  R                  SS5      n	S	U	 S
3U R
                  U   U'   gggs  snf )z4Build a partial or full barrier if plot_barriers setr   r   Nz \barrier[0em]{r^   rt   ru   z\,z\cds{0}{^{\mathrm{z}}})
r9   r   r+   rH   sortr0   r|   rD   labelreplace)
rK   rW   r   r   indexesfirstlastr   r   r  s
             rY   r   QCircuitImage._build_barrier2  sx   8<

[
dllFZ+t~~d+
G[LLN"1:%E 19$ D..e)<=CKK$S1W-1Cc$,FW1WZ]1]]-,2DKK$S)#((ED % ..e!45CKKS1W%);c$,>O)ORU)UU%ww}}(aj--c59*CE7&(QC % ) [s
   F F c                 .   [        [        X#5      5       H}  u  pVUS   nX   nX   US   :  a  US-  nX;  a  US-  nX;  a  M  OUS-  nX;  a  US-  nX;  a  M  US   S:X  a  SOSn	U	 S-   [        XU   -
  5      -   S-   U R                  U   U'   M     g	)
z"Add one or more controls to a gater   r   r   rw   r  r	  r_   r^   N)	enumeratezipr|   r0   )
rK   r   r  r   r   r   	ctrl_itemr   nxtr  s
             rY   r   QCircuitImage._add_controlsG  s     )#i*D EEA,C"C)B-/q*1HC * q*1HC * $-Q<3#6iHG'.i3$6SUCS=S9T$TWZ$ZDKKS! !Fr\   c           	      l   [        UR                  U R                  U R                  5      u  pE[	        UR                  S   [
        5      nUR                  S   nU(       a(  [        U R                  UR                  S   5      nUb  Un[	        U[        5      (       a  SOSn	U(       d  U R                  (       a  U R                  (       a  U R                  U   OU R                  UR                  S      n
U
[        U5      -
  nUR                  S   (       a  SOSnU SU	 S	U S
[        U5       S3U R                  U
   U'   g/ n/ nU R                  R                  5        HJ  u  nn[        U R                  U5      u  nnnUU:X  d  M(  UR                  U5        UR                  U5        ML     US   [        U5      -
  nUS   n[        [!        X5      5       VVs/ s H  u  nnUPM
     nnn[#        USS 5       HD  u  nnUS:  a  UU-
  nUU   S:X  a  SOSnU S3[        U5      -   S-   U R                  U   U'   UnMF     [%        U5      S:X  a  US   [        U5      -
  nOUS   U-
  nU[%        U5      S-
     S:X  a  SOSnU S-   U	U[        U5      4-  U R                  US      U'   gs  snnf )z"Add a condition to the _latex listr   Ng333333ӿr  r   z\controlz	\controloz \cw^(z){^{\mathtt{z
}}} \cwx[-r  r   r  z \cw \cwx[-z# \cw^(%s){^{\mathtt{%s}}} \cwx[-%s])r   r   r*   rG   ry   r   r   r   rH   r   r|   r0   r{   r   rz   sortedr#  r"  rI   )rK   rD   r   r   r  val_bitscond_is_bitcond_regr   meas_offsetcwiregapr  
cond_wires	cond_bitsr~   r   regrX   r   	prev_wirebitval_bits_sortedro   s                           rY   r   QCircuitImage._add_conditionY  s   
 2",,tO_O_` a%8<<?'r||AGH##(W55d3 $**,0,<,<x($..QSQ]Q]^_Q`Ba  #i.(C%'\\!_k,G )7;-/?wnUXY\U]T^^_` KK JI#~~335e$5dmmT$J!Q	(?$$Y/%%e,	  6 Q-#i.0C"1I17I8P1QR1Qvq#s1QOR %Z_54q5*C)8);s)B+,39M)BSX)MPS)SD!#& 	 6 :!# mc)n4 ny0%4S_q5H%IS%PkVbG)GGC0DKK
2',! Ss   J0c                 r    UR                  S5      (       a!  SU S3[        UR                  S5      5      -  $ g)zTruncate long floats.r   z%.gr   )groupfloat)rK   matchobjr   s      rY   r   QCircuitImage._truncate_float  s5    >>!y?U8>>!+<%===r\   )r*   r,   r5   rG   r/   r?   r7   r8   r1   r2   r=   r0   r;   r-   r9   r+   r:   r.   rJ   r3   r4   rH   r6   )NFTFNFN)r   )__name__
__module____qualname____firstlineno____doc__rZ   r`   rc   rx   r   rd   r   r   r   r   r   r   r   r   __static_attributes__r   r\   rY   r   r   ,   sr     l
\(T-^^^5@,>9%v D'R6X,R*[$=~r\   r   )+r@  re   r@   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   qiskit.visualization.styler   $qiskit.visualization.circuit.qcstyler   r   _utilsr   r   r   r   r   r   r   r   r   r   r\   rY   <module>rM     sW    # 	   	   : : ) 8 d d * 2 2 N	 	 	p	 p	r\   