§
    OŠtj.  ã                  ó\  — d 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 g d¢Z ed¦  «        Z edd	d
gief¬¦  «        Zer!erej        Zej        j        Zej        j        Z G d„ d¦  «        Zd„ Zi fd„Zdd„Z G d„ de	¦  «        Z G d„ de	¦  «        Z G d„ de¦  «        Zdd„ZdS )aÉ  Matplotlib based plotting of quantum circuits.

Todo:

* Optimize printing of large circuits.
* Get this to work with single gates.
* Do a better job checking the form of circuits to make sure it is a Mul of
  Gates.
* Get multi-target gates plotting.
* Get initial and final states to plot.
* Get measurements to plot. Might need to rethink measurement as a gate
  issue.
* Get scale and figsize to be handled in a better way.
* Write some tests/examples!
é    )Úannotations)ÚMul)Úimport_module)ÚGateÚOneQubitGateÚCGateÚCGateS)ÚCircuitPlotÚcircuit_plotÚlabellerÚMzÚMxÚCreateOneQubitGateÚCreateCGateÚnumpyÚ
matplotlibÚfromlistÚpyplot)Úimport_kwargsÚcatchc                  ó¬   — e Zd ZU dZdZdZdZdZdZdZ	g Z
ded<   i Zde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„ Zd„ Zd„ Zd„ ZdS )r
   z$A class for managing a circuit plot.g      ð?g      4@gš™™™™™©?g333333Ã?z	list[str]Úlabelszdict[str, str]Úinitsç      à?c                óŠ  — t           rt          st          d¦  «        ‚|| _        t	          | j        j        ¦  «        | _        || _        |                      |¦  «         |  	                    ¦   «          |  
                    ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          d S )Nz"numpy or matplotlib not available.)Únpr   ÚImportErrorÚcircuitÚlenÚargsÚngatesÚnqubitsÚupdateÚ_create_gridÚ_create_figureÚ_plot_wiresÚ_plot_gatesÚ_finish)ÚselfÚcr"   Úkwargss       ú_/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/physics/quantum/circuitplot.pyÚ__init__zCircuitPlot.__init__<   s¯   € Ýð 	D�ð 	DÝÐBÑCÔCÐCØˆŒÝ˜$œ,Ô+Ñ,Ô,ˆŒØˆŒØ�Š�FÑÔÐØ×ÒÑÔÐØ×ÒÑÔÐØ×ÒÑÔÐØ×ÒÑÔÐØ�Š‰Œˆˆˆó    c                ó:   — | j                              |¦  «         dS )z'Load the kwargs into the instance dict.N)Ú__dict__r#   )r)   r+   s     r,   r#   zCircuitPlot.updateI   s   € àŒ×Ò˜VÑ$Ô$Ð$Ð$Ð$r.   c                óÜ   — | j         }t                               d| j        |z  |t          ¬¦  «        }t                               d| j        |z  |t          ¬¦  «        }|| _        || _        dS )zCreate the grid of wires.g        )ÚdtypeN)Úscaler   Úaranger"   Úfloatr!   Ú
_wire_gridÚ
_gate_grid)r)   r3   Ú	wire_gridÚ	gate_grids       r,   r$   zCircuitPlot._create_gridM   s[   € à”
ˆÝ—I’I˜c 4¤<°Ñ#5°uÅE�IÑJÔJˆ	Ý—I’I˜c 4¤;¨uÑ#4°eÅ5�IÑIÔIˆ	Ø#ˆŒØ#ˆŒˆˆr.   c                óú  — t                                | j        | j        z  | j        | j        z  fdd¬¦  «        | _        | j                             dddd¬¦  «        }|                     ¦   «          d| j        z  }|                     | j	        d         |z
  | j	        d         |z   ¦  «         | 
                    | j        d         |z
  | j        d         |z   ¦  «         |                     d	¦  «         || _        d
S )z"Create the main matplotlib figure.Úw)ÚfigsizeÚ	facecolorÚ	edgecoloré   T)Úframeonr   r   éÿÿÿÿÚequalN)r   Úfigurer!   r3   r"   Ú_figureÚadd_subplotÚset_axis_offÚset_xlimr7   Úset_ylimr6   Ú
set_aspectÚ_axes)r)   ÚaxÚoffsets      r,   r%   zCircuitPlot._create_figureU   sö   € å—}’}Ø”[ ¤Ñ+¨T¬\¸$¼*Ñ-DÐEØØð %ñ 
ô 
ˆŒð
 Œ\×%Ò%Øˆq�!Øð &ñ 
ô 
ˆð 	�ŠÑÔÐØ�T”Z‘ˆØ
�Š�D”O AÔ&¨Ñ/°´ÀÔ1DÀvÑ1MÑNÔNÐNØ
�Š�D”O AÔ&¨Ñ/°´ÀÔ1DÀvÑ1MÑNÔNÐNØ
�Š�gÑÔÐØˆŒ
ˆ
ˆ
r.   c           
     óf  — | j         d         }| j         d         }|| j        z
  || j        z   f}t          | j        ¦  «        D ]Ù}| j        |         | j        |         f}t          ||d| j        ¬¦  «        }| j                             |¦  «         | j	        r„d}| j
                             | j	        |         ¦  «        rd}| j                             |d         | j        z
  |z
  |d         t          | j	        |         | j
        ¦  «        | j        ddd¬¦  «         ŒÚ|                      ¦   «          dS )	z&Plot the wires of the circuit diagram.r   rA   Úk©ÚcolorÚlwg      Ð?Úcenter)ÚsizerP   ÚhaÚvaN)r7   r3   Úranger"   r6   ÚLine2DÚ	linewidthrJ   Úadd_liner   r   ÚgetÚtextÚlabel_bufferÚrender_labelÚfontsizeÚ_plot_measured_wires)r)   ÚxstartÚxstopÚxdataÚiÚydataÚlineÚinit_label_buffers           r,   r&   zCircuitPlot._plot_wiresg   s?  € à” Ô#ˆØ” Ô#ˆØ˜$œ*Ñ$ e¨d¬jÑ&8Ð9ˆÝ�t”|Ñ$Ô$ð 	7ð 	7ˆAØ”_ QÔ'¨¬¸Ô);Ð<ˆEÝØ�uØØ”>ðñ ô ˆDð
 ŒJ×Ò Ñ%Ô%Ð%ØŒ{ð 7Ø$%Ð!Ø”:—>’> $¤+¨a¤.Ñ1Ô1ÐKÀtÐ3DØ”
—’Ø˜!”H˜TÔ.Ñ.Ð/@Ñ@ÀÀqÄÝ  ¤¨Q¤°´
Ñ;Ô;ØœØ ¨Xð	  ñ 7ô 7ð 7øð
 	×!Ò!Ñ#Ô#Ð#Ð#Ð#r.   c                ó  — |                       ¦   «         }| j        d         }d}|D ]q}| j        ||                  || j        z   f}| j        |         |z   | j        |         |z   f}t	          ||d| j        ¬¦  «        }| j                             |¦  «         Œrt          |  	                    ¦   «         ¦  «        D ]Ë\  }}	t          |	t          t          f¦  «        rª|	j        |	j        z   }
|
D ]˜}||v r’| j        |         | j        ||                  k    rpt          |
¦  «        t!          |
¦  «        f}| j        |         |z
  | j        |         |z
  f}t	          ||d| j        ¬¦  «        }| j                             |¦  «         Œ™ŒÌd S )NrA   g{®Gáz¤?rN   rO   )Ú_measurementsr7   r3   r6   rW   rX   rJ   rY   Ú	enumerateÚ_gatesÚ
isinstancer   r	   ÚcontrolsÚtargetsÚminÚmax)r)   Ú
ismeasuredra   ÚdyÚimrb   rd   re   rc   ÚgÚwiresÚwires               r,   r_   z CircuitPlot._plot_measured_wires~   s©  € Ø×'Ò'Ñ)Ô)ˆ
Ø” Ô#ˆØˆàð 	&ð 	&ˆBØ”_ Z°¤^Ô4°U¸4¼:Ñ5EÐFˆEØ”_ RÔ(¨Ñ+¨D¬O¸BÔ,?ÀÑ,BÐCˆEÝØ�uØØ”>ðñ ô ˆDð
 ŒJ×Ò Ñ%Ô%Ð%Ð%å˜TŸ[š[™]œ]Ñ+Ô+ð 	2ð 	2‰CˆAˆaÝ˜!�e¥V˜_Ñ-Ô-ð 2Øœ
 Q¤YÑ.�Ø!ð 
2ð 
2�DØ˜zÐ)Ð)Øœ?¨1Ô-°´À
È4Ô@PÔ0QÒQÐQÝ # E¡
¤
­C°©J¬JÐ 6˜Ø $¤°Ô 2°2Ñ 5°t´ÀqÔ7IÈ"Ñ7LÐ L˜Ý%Ø! 5Ø"%Ø#œ~ð ñ  ô  ˜ð
 œ
×+Ò+¨DÑ1Ô1Ð1øøð	2ð 	2r.   c                ó4  — g }t          | j        t          ¦  «        rGt          | j        j        ¦  «        D ],}t          |t
          ¦  «        r|                     |¦  «         Œ-n4t          | j        t
          ¦  «        r|                     | j        ¦  «         |S )z/Create a list of all gates in the circuit plot.)rk   r   r   Úreversedr    r   Úappend)r)   Úgatesrs   s      r,   rj   zCircuitPlot._gates›   s�   € àˆÝ�d”l¥CÑ(Ô(ð 	'Ý˜dœlÔ/Ñ0Ô0ð $ð $�Ý˜a¥Ñ&Ô&ð $Ø—L’L ‘O”O�Oøð$õ ˜œ¥dÑ+Ô+ð 	'Ø�LŠL˜œÑ&Ô&Ð&Øˆr.   c                ó€   — t          |                      ¦   «         ¦  «        D ]\  }}|                     | |¦  «         ŒdS )z0Iterate through the gates and plot each of them.N)ri   rj   Ú	plot_gate)r)   rc   Úgates      r,   r'   zCircuitPlot._plot_gates¦   sF   € å  §¢¡¤Ñ/Ô/ð 	$ð 	$‰GˆAˆtØ�NŠN˜4 Ñ#Ô#Ð#Ð#ð	$ð 	$r.   c                óÄ   — i }t          |                      ¦   «         ¦  «        D ];\  }}t          |dd¦  «        r%|j        D ]}||v r||         |k    r|||<   Œ|||<   ŒŒ<|S )z�Return a dict ``{i:j}`` where i is the index of the wire that has
        been measured, and j is the gate where the wire is measured.
        ÚmeasurementF)ri   rj   Úgetattrrm   )r)   rp   rc   rs   Útargets        r,   rh   zCircuitPlot._measurements«   s‹   € ð ˆ
Ý˜TŸ[š[™]œ]Ñ+Ô+ð 	/ð 	/‰CˆAˆaÝ�q˜ uÑ-Ô-ð /Øœið /ð /�FØ Ð+Ð+Ø% fÔ-°Ò1Ð1Ø12˜J vÑ.øà-.˜
 6Ñ*Ð*øØÐr.   c                óh   — | j                              ¦   «         D ]}|                     d¦  «         Œd S )NF)rD   ÚfindobjÚset_clip_on)r)   Úos     r,   r(   zCircuitPlot._finishº   s>   € à”×%Ò%Ñ'Ô'ð 	!ð 	!ˆAØ�MŠM˜%Ñ Ô Ð Ð ð	!ð 	!r.   c                óœ   — | j         |         }| j        |         }| j                             |||dddddd| j        dœ| j        ¬¦  «         dS )z#Draw a box for a single qubit gate.rN   rR   r;   T©ÚecÚfcÚfillrQ   )rP   rT   rU   ÚbboxrS   N)r7   r6   rJ   r[   rX   r^   )r)   ÚtÚgate_idxÚwire_idxÚxÚys         r,   Úone_qubit_boxzCircuitPlot.one_qubit_box¿   sg   € àŒO˜HÔ%ˆØŒO˜HÔ%ˆØŒ
�ŠØˆq�!ØØØØ 3°¸D¼NÐKÐKØ”ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r.   c                óV   — t          | j        ¦  «         t          | j        ¦  «         dS )z<Draw a box for a two qubit gate. Does not work yet.
        N)Úprintr7   r6   )r)   r‹   rŒ   r�   s       r,   Útwo_qubit_boxzCircuitPlot.two_qubit_boxÌ   s*   € õ
 	ˆdŒoÑÔÐÝˆdŒoÑÔÐÐÐr.   c                óÒ   — | j         |         | j         |         f}| j        |         | j        |         f}t          ||d| j        ¬¦  «        }| j                             |¦  «         dS )zDraw a vertical control line.rN   rO   N)r7   r6   rW   rX   rJ   rY   )r)   rŒ   Úmin_wireÚmax_wirerb   rd   re   s          r,   Úcontrol_linezCircuitPlot.control_lineÝ   sq   € à” Ô*¨D¬O¸HÔ,EÐFˆØ” Ô*¨D¬O¸HÔ,EÐFˆÝØ�5ØØŒ~ð
ñ 
ô 
ˆð
 	Œ
×Ò˜DÑ!Ô!Ð!Ð!Ð!r.   c                óÄ   — | j         |         }| j        |         }| j        }t          ||f|| j        z  ddd| j        ¬¦  «        }| j                             |¦  «         dS )zDraw a control point.rN   Tr†   N)r7   r6   Úcontrol_radiusÚCircler3   rX   rJ   Ú	add_patch)r)   rŒ   r�   rŽ   r�   Úradiusr*   s          r,   Úcontrol_pointzCircuitPlot.control_pointè   ss   € àŒO˜HÔ%ˆØŒO˜HÔ%ˆØÔ$ˆÝØ�ˆFØ�4”:ÑØØØØŒ~ð
ñ 
ô 
ˆð 	Œ
×Ò˜QÑÔÐÐÐr.   c                ó,  — | j         |         }| j        |         }| j        }t          ||f|ddd| j        ¬¦  «        }| j                             |¦  «         t          ||f||z
  ||z   fd| j        ¬¦  «        }| j                             |¦  «         dS )z7Draw a NOT gates as the circle with plus in the middle.rN   r;   Fr†   rO   N)	r7   r6   Ú
not_radiusrš   rX   rJ   r›   rW   rY   )r)   rŒ   r�   rŽ   r�   rœ   r*   Úls           r,   Ú	not_pointzCircuitPlot.not_point÷   sµ   € àŒO˜HÔ%ˆØŒO˜HÔ%ˆØ”ˆÝØ�ˆFØØØØØŒ~ð
ñ 
ô 
ˆð 	Œ
×Ò˜QÑÔÐÝØ�ˆF�Q˜‘Z  V¡Ð,ØØŒ~ð
ñ 
ô 
ˆð
 	Œ
×Ò˜AÑÔÐÐÐr.   c                óP  — | j         |         }| j        |         }| j        }t          ||z
  ||z   f||z
  ||z   fd| j        ¬¦  «        }t          ||z
  ||z   f||z   ||z
  fd| j        ¬¦  «        }| j                             |¦  «         | j                             |¦  «         dS )zDraw a swap point as a cross.rN   rO   N)r7   r6   Ú
swap_deltarW   rX   rJ   rY   )r)   rŒ   r�   rŽ   r�   ÚdÚl1Úl2s           r,   Ú
swap_pointzCircuitPlot.swap_point  sË   € àŒO˜HÔ%ˆØŒO˜HÔ%ˆØŒOˆÝØ�‰U�A˜‘EˆNØ�‰U�A˜‘EˆNØØŒ~ð	
ñ 
ô 
ˆõ Ø�‰U�A˜‘EˆNØ�‰U�A˜‘EˆNØØŒ~ð	
ñ 
ô 
ˆð 	Œ
×Ò˜BÑÔÐØŒ
×Ò˜BÑÔÐÐÐr.   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r3   r^   rX   r™   rŸ   r£   r   Ú__annotations__r   r\   r-   r#   r$   r%   r&   r_   rj   r'   rh   r(   r�   r“   r—   r�   r¡   r§   © r.   r,   r
   r
   /   sQ  € € € € € € Ø.Ð.à€EØ€HØ€IØ€NØ€JØ€JØ€FÐÐÐÑØ€EÐÐÐÑØ€Lðð ð ð%ð %ð %ð$ð $ð $ðð ð ð$$ð $ð $ð.2ð 2ð 2ð:	ð 	ð 	ð$ð $ð $ð
ð ð ð!ð !ð !ð

ð 
ð 
ðð ð ð"	"ð 	"ð 	"ð ð  ð  ðð ð ð* ð  ð  ð  ð  r.   r
   c                ó   — t          | |fi |¤ŽS )aE  Draw the circuit diagram for the circuit with nqubits.

    Parameters
    ==========

    c : circuit
        The circuit to plot. Should be a product of Gate instances.
    nqubits : int
        The number of qubits to include in the circuit. Must be at least
        as big as the largest ``min_qubits`` of the gates.
    )r
   )r*   r"   r+   s      r,   r   r      s   € õ �q˜'Ð,Ð, VÐ,Ð,Ð,r.   c                óL   — |                      | ¦  «        }|r	d| ›d|›d�S d| z  S )a  Slightly more flexible way to render labels.

    >>> from sympy.physics.quantum.circuitplot import render_label
    >>> render_label('q0')
    '$\\left|q0\\right\\rangle$'
    >>> render_label('q0', {'q0':'0'})
    '$\\left|q0\\right\\rangle=\\left|0\\right\\rangle$'
    z$\left|z\right\rangle=\left|z\right\rangle$z$\left|%s\right\rangle$)rZ   )Úlabelr   Úinits      r,   r]   r]   .  sB   € ð �9Š9�UÑÔ€DØð Pð PØCHÀ5À5È$È$È$ÐOÐOØ%¨Ñ-Ð-r.   Úqc                ó>   ‡ ‡— ˆ ˆfd„t          ‰ ¦  «        D ¦   «         S )aˆ  Autogenerate labels for wires of quantum circuits.

    Parameters
    ==========

    n : int
        number of qubits in the circuit.
    symbol : string
        A character string to precede all gate labels. E.g. 'q_0', 'q_1', etc.

    >>> from sympy.physics.quantum.circuitplot import labeller
    >>> labeller(2)
    ['q_1', 'q_0']
    >>> labeller(3,'j')
    ['j_2', 'j_1', 'j_0']
    c                ó*   •— g | ]}d ‰‰|z
  dz
  fz  ‘ŒS )z%s_%dr?   r­   )Ú.0rc   ÚnÚsymbols     €€r,   ú
<listcomp>zlabeller.<locals>.<listcomp>M  s*   ø€ Ð7Ð7Ð7¨ˆG�v˜a ™c !™e�nÑ$Ð7Ð7Ð7r.   )rV   )r¶   r·   s   ``r,   r   r   <  s)   øø€ ð" 8Ð7Ð7Ð7Ð7­e°A©h¬hÐ7Ñ7Ô7Ð7r.   c                  ó   — e Zd ZdZdZd ZdZdS )r   zŠMock-up of a z measurement gate.

    This is in circuitplot rather than gate.py because it's not a real
    gate, it just draws one.
    TÚM_zN©r¨   r©   rª   r«   r~   Ú	gate_nameÚgate_name_latexr­   r.   r,   r   r   O  ó)   € € € € € ðð ð
 €KØ€IØ€O€O€Or.   r   c                  ó   — e Zd ZdZdZd ZdZdS )r   z‹Mock-up of an x measurement gate.

    This is in circuitplot rather than gate.py because it's not a real
    gate, it just draws one.
    TÚM_xNr»   r­   r.   r,   r   r   Y  r¾   r.   r   c                  ó   — e Zd Zdd„ZdS )r   Nc                óD   — |s|}t          |dz   t          f||dœ¦  «        S )Nr   )r¼   r½   )Útyper   )ÚmclÚnameÚ	latexnames      r,   Ú__new__zCreateOneQubitGate.__new__d  s6   € Øð 	ØˆIÝ�D˜6‘M¥L ?Ø°9Ð=Ð=ñ?ô ?ð 	?r.   ©N)r¨   r©   rª   rÇ   r­   r.   r,   r   r   c  s(   € € € € € ð?ð ?ð ?ð ?ð ?ð ?r.   r   Nc                ó:   ‡— |s| }t          | |¦  «        Šˆfd„}|S )z5Use a lexical closure to make a controlled gate.
    c                óP   •— t          t          | ¦  «         ‰|¦  «        ¦  «        S rÈ   )r   Útuple)Úctrlsr€   Úonequbitgates     €r,   ÚControlledGatez#CreateCGate.<locals>.ControlledGatep  s#   ø€ Ý•U˜5‘\”\ , ,¨vÑ"6Ô"6Ñ7Ô7Ð7r.   )r   )rÅ   rÆ   rÎ   rÍ   s      @r,   r   r   j  s@   ø€ ð ð Øˆ	Ý% d¨IÑ6Ô6€Lð8ð 8ð 8ð 8ð 8àÐr.   )r²   rÈ   )r«   Ú
__future__r   Úsympy.core.mulr   Úsympy.externalr   Úsympy.physics.quantum.gater   r   r   r	   Ú__all__r   ÚRuntimeErrorr   r   ÚlinesrW   Úpatchesrš   r
   r   r]   r   r   r   rÃ   r   r   r­   r.   r,   ú<module>r×      sì  ððð ð  #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ Hðð ð €ð €]�7ÑÔ€Øˆ]Ø ¨h¨ZÐ 8Øˆ/ðñ ô €
ð ð 'ˆ*ð 'ØÔ€FØÔÔ$€FØÔÔ&€Fð
o ð o ð o ð o ð o ñ o ô o ð o ðb-ð -ð -ð !ð .ð .ð .ð .ð8ð 8ð 8ð 8ð&ð ð ð ð ˆñ ô ð ðð ð ð ð ˆñ ô ð ð?ð ?ð ?ð ?ð ?˜ñ ?ô ?ð ?ðð ð ð ð ð r.   