Ë
    täi�  ã                   ó¦   — d Z dg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mZmZ ddlmZ d„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Z G d„ d«      Zy)a  

qasm.py - Functions to parse a set of qasm commands into a SymPy Circuit.

Examples taken from Chuang's page: https://web.archive.org/web/20220120121541/https://www.media.mit.edu/quanta/qasm2circ/

The code returns a circuit and an associated list of labels.

>>> from sympy.physics.quantum.qasm import Qasm
>>> q = Qasm('qubit q0', 'qubit q1', 'h q0', 'cnot q0,q1')
>>> q.get_circuit()
CNOT(1,0)*H(1)

>>> q = Qasm('qubit q0', 'qubit q1', 'cnot q0,q1', 'cnot q1,q0', 'cnot q0,q1')
>>> q.get_circuit()
CNOT(1,0)*CNOT(0,1)*CNOT(1,0)
ÚQasmé    )Úprod)
ÚHÚCNOTÚXÚZÚCGateÚCGateSÚSWAPÚSÚTÚCPHASE)ÚMzc                 ó.   — t        | j                  «       Ž S ©N)r   Ú
splitlines)Úliness    úi/Volumes/fast/ai/experiments/MLX_z-image/.venv/lib/python3.12/site-packages/sympy/physics/quantum/qasm.pyÚ	read_qasmr      s   € Ü�×!Ñ!Ó#Ð$Ð$ó    c                 ó@   — t        t        | «      j                  «       Ž S r   )r   ÚopenÚ	readlines)Úfilenames    r   Úread_qasm_filer      s   € Ü”�h“×)Ñ)Ó+Ð,Ð,r   c                 ó   — || z
  dz
  S )z­Reorder qubit indices from largest to smallest.

    >>> from sympy.physics.quantum.qasm import flip_index
    >>> flip_index(0, 2)
    1
    >>> flip_index(1, 2)
    0
    é   © )ÚiÚns     r   Ú
flip_indexr!   "   s   € ð ˆQ‰3ˆq‰5€Lr   c                 ó6   — d| vr| S | j                  d«      d   S )zìRemove everything following comment # characters in line.

    >>> from sympy.physics.quantum.qasm import trim
    >>> trim('nothing happens here')
    'nothing happens here'
    >>> trim('something #happens here')
    'something '
    Ú#r   )Úsplit)Úlines    r   Útrimr&   -   s#   € ð �$�ØˆØ�:‰:�c‹?˜1ÑÐr   c                 óN   — t        |«      }t        |j                  | «      |«      S )zÔGet qubit labels from the rest of the line,and return indices

    >>> from sympy.physics.quantum.qasm import get_index
    >>> get_index('q0', ['q0', 'q1'])
    1
    >>> get_index('q1', ['q0', 'q1'])
    0
    )Úlenr!   Úindex)ÚtargetÚlabelsÚnqs      r   Ú	get_indexr-   :   s#   € ô 
ˆV‹€BÜ�f—l‘l 6Ó*¨BÓ/Ð/r   c                 ó@   — | D �cg c]  }t        ||«      ‘Œ c}S c c}w r   )r-   )Útargetsr+   Úts      r   Úget_indicesr1   F   s!   € Ù*1Ó2©' QŒI�a˜Õ ¨'Ñ2Ð2ùÒ2s   …c              #   óZ   K  — | D ]"  }t        |«      }|j                  «       rŒ|–— Œ$ y ­wr   )r&   Úisspace)Úargsr%   s     r   Únonblankr5   I   s/   è ø€ ÛˆÜ�D‹zˆØ�<‰<Œ>ØØ‹
ð	 ð
 ùs   ‚)+c                 óÊ   — | j                  «       }dj                  |dd  «      }t        |d   «      |j                  d«      D �cg c]  }|j                  «       ‘Œ c}fS c c}w )NÚ r   r   Ú,)r$   ÚjoinÚ
fixcommandÚstrip)r%   ÚwordsÚrestÚss       r   Ú	fullsplitr?   Q   sU   € Ø�J‰J‹L€EØ�8‰8�E˜!˜"�IÓ€DÜ�e˜A‘hÓ°T·Z±ZÀ´_Ó!E±_° !§'¡'¥)°_Ñ!EÐEÐEùÒ!Es   ÁA c                 ój   — dg}| j                  «       } |D ]  }| j                  |d«      } Œ | dk(  ry| S )zwFix Qasm command names.

    Remove all of forbidden characters from command c, and
    replace 'def' with 'qdef'.
    Ú-Ú ÚdefÚqdef)ÚlowerÚreplace)ÚcÚforbidden_charactersÚchars      r   r:   r:   V   s@   € ð  ˜5ÐØ	�‰‹	€AÛ$ˆØ�I‰I�d˜BÓ‰ð %àˆE‚zØØ€Hr   c                 óN   — | j                  dd«      } | j                  dd«      } | S )zäReplace explicit quotes in a string.

    >>> from sympy.physics.quantum.qasm import stripquotes
    >>> stripquotes("'S'") == 'S'
    True
    >>> stripquotes('"S"') == 'S'
    True
    >>> stripquotes('S') == 'S'
    True
    Ú"rB   Ú')rF   )r>   s    r   ÚstripquotesrM   d   s)   € ð 	
�	‰	�#�rÓ€AØ	�	‰	�#�rÓ€AØ€Hr   c                   óœ   — e Zd ZdZd„ Zd„ Zd„ 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„ Zd„ Zd„ Zd„ Zd„ Zy)r   aV  Class to form objects from Qasm lines

    >>> from sympy.physics.quantum.qasm import Qasm
    >>> q = Qasm('qubit q0', 'qubit q1', 'h q0', 'cnot q0,q1')
    >>> q.get_circuit()
    CNOT(1,0)*H(1)
    >>> q = Qasm('qubit q0', 'qubit q1', 'cnot q0,q1', 'cnot q1,q0', 'cnot q0,q1')
    >>> q.get_circuit()
    CNOT(1,0)*CNOT(0,1)*CNOT(1,0)
    c                 óh   — i | _         g | _        g | _        i | _         | j                  |Ž  || _        y r   )ÚdefsÚcircuitr+   ÚinitsÚaddÚkwargs)Úselfr4   rT   s      r   Ú__init__zQasm.__init__~   s2   € ØˆŒ	ØˆŒØˆŒØˆŒ
Øˆ�‰�$‰Øˆ�r   c                 óÞ  — t        |«      D ]ß  }t        |«      \  }}| j                  j                  |«      rˆ| j                  j                  |«      }| j	                  |«      }t        |«      dk(  r%| j                  j                   ||d   «      «       Œ‹| j                  j                   ||d d |d   «      «       Œ´t        | |«      rt        | |«      } ||Ž  ŒÒt        d|z  «       Œá y )Nr   r   éÿÿÿÿz!Function %s not defined. Skipping)r5   r?   rP   ÚgetÚindicesr(   rQ   ÚappendÚhasattrÚgetattrÚprint)rU   r   r%   Úcommandr=   ÚfunctionrZ   s          r   rS   zQasm.add†   sÂ   € Ü˜U–OˆDÜ% d›O‰MˆG�TØ�y‰y�}‰}˜WÔ%ØŸ9™9Ÿ=™=¨Ó1�ØŸ,™, tÓ,�Ü�w“< 1Ò$Ø—L‘L×'Ñ'©°¸±Ó(<Õ=à—L‘L×'Ñ'©°¸¸"°¸wÀr¹{Ó(KÕLÜ˜˜wÔ'Ü" 4¨Ó1�Ù˜$’äÐ9¸GÑCÕDñ $r   c                 ó>   — t        t        | j                  «      «      S r   )r   ÚreversedrQ   ©rU   s    r   Úget_circuitzQasm.get_circuit–   s   € Ü”H˜TŸ\™\Ó*Ó+Ð+r   c                 ó>   — t        t        | j                  «      «      S r   )Úlistrb   r+   rc   s    r   Ú
get_labelszQasm.get_labels™   s   € Ü”H˜TŸ[™[Ó)Ó*Ð*r   c                 óŽ   — ddl m} | j                  «       | j                  «       }} ||t	        |«      || j
                  ¬«       y )Nr   )ÚCircuitPlot)r+   rR   )Ú!sympy.physics.quantum.circuitplotri   rd   rg   r(   rR   )rU   ri   rQ   r+   s       r   Úplotz	Qasm.plotœ   s4   € ÝAØ×*Ñ*Ó,¨d¯o©oÓ.?�ˆÙ�GœS ›[°¸t¿z¹zÖJr   Nc                 ó^   — | j                   j                  |«       |r|| j                  |<   y y r   )r+   r[   rR   )rU   ÚargÚinits      r   Úqubitz
Qasm.qubit¡   s%   € Ø�‰×Ñ˜3ÔÙ 4�—‘˜C’ˆ4r   c                 ó.   — t        || j                  «      S r   )r1   r+   ©rU   r4   s     r   rZ   zQasm.indices¥   s   € Ü˜4 §¡Ó-Ð-r   c                 ó.   — t        || j                  «      S r   )r-   r+   ©rU   rm   s     r   r)   z
Qasm.index¨   s   € Ü˜˜dŸk™kÓ*Ð*r   c                  ó   — y r   r   rq   s     r   ÚnopzQasm.nop«   s   € Ør   c                 ój   — | j                   j                  t        | j                  |«      «      «       y r   )rQ   r[   r   r)   rs   s     r   ÚxzQasm.x®   ó!   € Ø�‰×ÑœA˜dŸj™j¨›oÓ.Õ/r   c                 ój   — | j                   j                  t        | j                  |«      «      «       y r   )rQ   r[   r   r)   rs   s     r   ÚzzQasm.z±   rx   r   c                 ój   — | j                   j                  t        | j                  |«      «      «       y r   )rQ   r[   r   r)   rs   s     r   ÚhzQasm.h´   rx   r   c                 ój   — | j                   j                  t        | j                  |«      «      «       y r   )rQ   r[   r   r)   rs   s     r   r>   zQasm.s·   rx   r   c                 ój   — | j                   j                  t        | j                  |«      «      «       y r   )rQ   r[   r   r)   rs   s     r   r0   zQasm.tº   rx   r   c                 ój   — | j                   j                  t        | j                  |«      «      «       y r   )rQ   r[   r   r)   rs   s     r   ÚmeasurezQasm.measure½   s!   € Ø�‰×ÑœB˜tŸz™z¨#›Ó/Õ0r   c                 óh   — | j                   j                  t        | j                  ||g«      Ž «       y r   )rQ   r[   r   rZ   ©rU   Úa1Úa2s      r   Úcnotz	Qasm.cnotÀ   ó&   € Ø�‰×ÑœD $§,¡,°°B¨xÓ"8Ð9Õ:r   c                 óh   — | j                   j                  t        | j                  ||g«      Ž «       y r   )rQ   r[   r   rZ   r‚   s      r   Úswapz	Qasm.swapÃ   r†   r   c                 óh   — | j                   j                  t        | j                  ||g«      Ž «       y r   )rQ   r[   r   rZ   r‚   s      r   ÚcphasezQasm.cphaseÆ   s&   € Ø�‰×ÑœF D§L¡L°"°b°Ó$:Ð;Õ<r   c                 ó”   — | j                  |||g«      \  }}}| j                  j                  t        ||ft	        |«      «      «       y r   )rZ   rQ   r[   r
   r   )rU   rƒ   r„   Úa3Úi1Úi2Úi3s          r   ÚtoffolizQasm.toffoliÉ   s=   € Ø—\‘\ 2 r¨2 ,Ó/‰
ˆˆB�Ø�‰×ÑœF B¨ 8¬Q¨r«UÓ3Õ4r   c                 óŒ   — | j                  ||g«      \  }}| j                  j                  t        |t	        |«      «      «       y r   )rZ   rQ   r[   r	   r   ©rU   rƒ   r„   ÚfiÚfjs        r   ÚcxzQasm.cxÍ   ó5   € Ø—‘˜r 2˜hÓ'‰ˆˆBØ�‰×ÑœE "¤a¨£eÓ,Õ-r   c                 óŒ   — | j                  ||g«      \  }}| j                  j                  t        |t	        |«      «      «       y r   )rZ   rQ   r[   r	   r   r’   s        r   ÚczzQasm.czÑ   r–   r   c                 ó   — t        d|«       y )Nz$defbox not supported yet. Skipping: )r^   rq   s     r   ÚdefboxzQasm.defboxÕ   s   € ÜÐ4°dÕ;r   c                 ó¶   — ddl m}m} t        |«      }t	        |«      }t        |«      }|dkD  r ||«      | j                  |<   y  ||«      | j                  |<   y )Nr   )ÚCreateOneQubitGateÚCreateCGate)rj   rœ   r�   Úintr:   rM   rP   )rU   ÚnameÚ	ncontrolsÚsymbolrœ   r�   r_   s          r   rD   z	Qasm.qdefØ   sO   € ßUÜ˜	“Nˆ	Ü˜TÓ"ˆÜ˜VÓ$ˆØ�qŠ=Ù!,¨VÓ!4ˆD�I‰I�gÒá!3°FÓ!;ˆD�I‰I�gÒr   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rV   rS   rd   rg   rk   ro   rZ   r)   ru   rw   rz   r|   r>   r0   r€   r…   rˆ   rŠ   r�   r•   r˜   rš   rD   r   r   r   r   r   s   s|   „ ñ	òòEò ,ò+òKó
(ò.ò+òò0ò0ò0ò0ò0ò1ò;ò;ò=ò5ò.ò.ò<ó<r   N)r¥   Ú__all__Úmathr   Úsympy.physics.quantum.gater   r   r   r   r	   r
   r   r   r   r   rj   r   r   r   r!   r&   r-   r1   r5   r?   r:   rM   r   r   r   r   Ú<module>r©      sf   ðñð& ð€õ ç V× V× VÝ 0ò%ò-ò	òò
0ò3òòFò
ò÷m<ò m<r   