§
    OŠtj�  ã                   ó®   — 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dS )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                 ó8   — t          |                      ¦   «         Ž S ©N)r   Ú
splitlines)Úliness    úX/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sympy/physics/quantum/qasm.pyÚ	read_qasmr      s   € Ý�×!Ò!Ñ#Ô#Ð$Ð$ó    c                 óR   — t          t          | ¦  «                             ¦   «         Ž 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                 óD   — d| vr| S |                       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                 óf   — t          |¦  «        }t          |                     | ¦  «        |¦  «        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                 ó    ‡— ˆfd„| D ¦   «         S )Nc                 ó0   •— g | ]}t          |‰¦  «        ‘ŒS r   )r-   )Ú.0Útr+   s     €r   ú
<listcomp>zget_indices.<locals>.<listcomp>G   s#   ø€ Ð2Ð2Ð2 Q�I�a˜Ñ Ô Ð2Ð2Ð2r   r   )Útargetsr+   s    `r   Úget_indicesr4   F   s   ø€ Ø2Ð2Ð2Ð2¨'Ð2Ñ2Ô2Ð2r   c              #   ód   K  — | D ]*}t          |¦  «        }|                     ¦   «         rŒ&|V — Œ+d S r   )r&   Úisspace)Úargsr%   s     r   Únonblankr8   I   sC   è è € Øð ð ˆÝ�D‰zŒzˆØ�<Š<‰>Œ>ð 	ØØˆ
ˆ
ˆ
ˆ
Ø
€Fr   c                 óÌ   — |                       ¦   «         }d                     |dd …         ¦  «        }t          |d         ¦  «        d„ |                      d¦  «        D ¦   «         fS )Nú r   r   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS r   )Ústrip)r0   Úss     r   r2   zfullsplit.<locals>.<listcomp>T   s    € Ð!EÐ!EÐ!E° !§'¢'¡)¤)Ð!EÐ!EÐ!Er   ú,)r$   ÚjoinÚ
fixcommand)r%   ÚwordsÚrests      r   Ú	fullsplitrC   Q   sX   € Ø�JŠJ‰LŒL€EØ�8Š8�E˜!˜"˜"”IÑÔ€DÝ�e˜A”hÑÔÐ!EÐ!E°T·Z²ZÀ±_´_Ð!EÑ!EÔ!EÐEÐEr   c                 óz   — dg}|                       ¦   «         } |D ]}|                      |d¦  «        } Œ| dk    rdS | 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   sP   € ð  ˜5ÐØ	�Š‰	Œ	€AØ$ð  ð  ˆØ�IŠI�d˜BÑÔˆˆØˆE‚z€zØˆvØ€Hr   c                 ó^   — |                       dd¦  «        } |                       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
    ú"rF   ú')rJ   )r=   s    r   ÚstripquotesrQ   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dS )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                 ó`   — i | _         g | _        g | _        i | _         | j        |Ž  || _        d S r   )ÚdefsÚcircuitr+   ÚinitsÚaddÚkwargs)Úselfr7   rX   s      r   Ú__init__zQasm.__init__~   s6   € ØˆŒ	ØˆŒØˆŒØˆŒ
ØˆŒ�$ˆˆØˆŒˆˆr   c                 ó4  — t          |¦  «        D �]}t          |¦  «        \  }}| j                             |¦  «        rŸ| j                             |¦  «        }|                      |¦  «        }t          |¦  «        dk    r*| j                              ||d         ¦  «        ¦  «         Œ›| j                              ||d d…         |d         ¦  «        ¦  «         ŒÎt          | |¦  «        rt          | |¦  «        } ||Ž  Œôt          d|z  ¦  «         �Œd S )Nr   r   éÿÿÿÿz!Function %s not defined. Skipping)r8   rC   rT   ÚgetÚindicesr(   rU   ÚappendÚhasattrÚgetattrÚprint)rY   r   r%   ÚcommandrB   Úfunctionr^   s          r   rW   zQasm.add†   s  € Ý˜U‘O”Oð 	Eñ 	EˆDÝ% d™OœO‰MˆG�TØŒy�}Š}˜WÑ%Ô%ð EØœ9Ÿ=š=¨Ñ1Ô1�ØŸ,š, tÑ,Ô,�Ý�w‘<”< 1Ò$Ð$Ø”L×'Ò'¨¨°¸´Ñ(<Ô(<Ñ=Ô=Ð=Ð=à”L×'Ò'¨¨°¸¸"¸´¸wÀr¼{Ñ(KÔ(KÑLÔLÐLÐLÝ˜˜wÑ'Ô'ð EÝ" 4¨Ñ1Ô1�Ø�˜$���åÐ9¸GÑCÑDÔDÐDÑDð	Eð 	Er   c                 óD   — t          t          | j        ¦  «        ¦  «        S r   )r   ÚreversedrU   ©rY   s    r   Úget_circuitzQasm.get_circuit–   s   € Ý•H˜Tœ\Ñ*Ô*Ñ+Ô+Ð+r   c                 óD   — t          t          | j        ¦  «        ¦  «        S r   )Úlistrf   r+   rg   s    r   Ú
get_labelszQasm.get_labels™   s   € Ý•H˜Tœ[Ñ)Ô)Ñ*Ô*Ð*r   c                 ó¤   — ddl m} |                      ¦   «         |                      ¦   «         }} ||t	          |¦  «        || j        ¬¦  «         d S )Nr   )ÚCircuitPlot)r+   rV   )Ú!sympy.physics.quantum.circuitplotrm   rh   rk   r(   rV   )rY   rm   rU   r+   s       r   Úplotz	Qasm.plotœ   sZ   € ØAÐAÐAÐAÐAÐAØ×*Ò*Ñ,Ô,¨d¯oªoÑ.?Ô.?�ˆØˆ�G�S ™[œ[°¸t¼zÐJÑJÔJÐJÐJÐJr   Nc                 óV   — | j                              |¦  «         |r|| j        |<   d S d S r   )r+   r_   rV   )rY   ÚargÚinits      r   Úqubitz
Qasm.qubit¡   s2   € ØŒ×Ò˜3ÑÔÐØÐ' 4�”˜C‘��Ð'Ð'r   c                 ó,   — t          || j        ¦  «        S r   )r4   r+   ©rY   r7   s     r   r^   zQasm.indices¥   s   € Ý˜4 ¤Ñ-Ô-Ð-r   c                 ó,   — t          || j        ¦  «        S r   )r-   r+   ©rY   rq   s     r   r)   z
Qasm.index¨   s   € Ý˜˜dœkÑ*Ô*Ð*r   c                 ó   — d S r   r   ru   s     r   ÚnopzQasm.nop«   s   € Øˆr   c                 óz   — | j                              t          |                      |¦  «        ¦  «        ¦  «         d S r   )rU   r_   r   r)   rw   s     r   ÚxzQasm.x®   ó0   € ØŒ×Ò�A˜dŸjšj¨™oœoÑ.Ô.Ñ/Ô/Ð/Ð/Ð/r   c                 óz   — | j                              t          |                      |¦  «        ¦  «        ¦  «         d S r   )rU   r_   r   r)   rw   s     r   ÚzzQasm.z±   r|   r   c                 óz   — | j                              t          |                      |¦  «        ¦  «        ¦  «         d S r   )rU   r_   r   r)   rw   s     r   ÚhzQasm.h´   r|   r   c                 óz   — | j                              t          |                      |¦  «        ¦  «        ¦  «         d S r   )rU   r_   r   r)   rw   s     r   r=   zQasm.s·   r|   r   c                 óz   — | j                              t          |                      |¦  «        ¦  «        ¦  «         d S r   )rU   r_   r   r)   rw   s     r   r1   zQasm.tº   r|   r   c                 óz   — | j                              t          |                      |¦  «        ¦  «        ¦  «         d S r   )rU   r_   r   r)   rw   s     r   ÚmeasurezQasm.measure½   s0   € ØŒ×Ò�B˜tŸzšz¨#™œÑ/Ô/Ñ0Ô0Ð0Ð0Ð0r   c                 ór   — | j                              t          |                      ||g¦  «        Ž ¦  «         d S r   )rU   r_   r   r^   ©rY   Úa1Úa2s      r   Úcnotz	Qasm.cnotÀ   ó3   € ØŒ×Ò�D $§,¢,°°B¨xÑ"8Ô"8Ð9Ñ:Ô:Ð:Ð:Ð:r   c                 ór   — | j                              t          |                      ||g¦  «        Ž ¦  «         d S r   )rU   r_   r   r^   r†   s      r   Úswapz	Qasm.swapÃ   rŠ   r   c                 ór   — | j                              t          |                      ||g¦  «        Ž ¦  «         d S r   )rU   r_   r   r^   r†   s      r   ÚcphasezQasm.cphaseÆ   s3   € ØŒ×Ò�F D§L¢L°"°b°Ñ$:Ô$:Ð;Ñ<Ô<Ð<Ð<Ð<r   c                 ó¬   — |                       |||g¦  «        \  }}}| j                             t          ||ft	          |¦  «        ¦  «        ¦  «         d S r   )r^   rU   r_   r
   r   )rY   r‡   rˆ   Úa3Úi1Úi2Úi3s          r   ÚtoffolizQasm.toffoliÉ   sO   € Ø—\’\ 2 r¨2 ,Ñ/Ô/‰
ˆˆB�ØŒ×Ò�F B¨ 8­Q¨r©U¬UÑ3Ô3Ñ4Ô4Ð4Ð4Ð4r   c                 ó¤   — |                       ||g¦  «        \  }}| j                             t          |t	          |¦  «        ¦  «        ¦  «         d S r   )r^   rU   r_   r	   r   ©rY   r‡   rˆ   ÚfiÚfjs        r   ÚcxzQasm.cxÍ   óG   € Ø—’˜r 2˜hÑ'Ô'‰ˆˆBØŒ×Ò�E "¥a¨¡e¤eÑ,Ô,Ñ-Ô-Ð-Ð-Ð-r   c                 ó¤   — |                       ||g¦  «        \  }}| j                             t          |t	          |¦  «        ¦  «        ¦  «         d S r   )r^   rU   r_   r	   r   r–   s        r   ÚczzQasm.czÑ   rš   r   c                 ó&   — t          d|¦  «         d S )Nz$defbox not supported yet. Skipping: )rb   ru   s     r   ÚdefboxzQasm.defboxÕ   s   € ÝÐ4°dÑ;Ô;Ð;Ð;Ð;r   c                 óÌ   — ddl m}m} t          |¦  «        }t	          |¦  «        }t          |¦  «        }|dk    r ||¦  «        | j        |<   d S  ||¦  «        | j        |<   d S )Nr   )ÚCreateOneQubitGateÚCreateCGate)rn   r    r¡   Úintr@   rQ   rT   )rY   ÚnameÚ	ncontrolsÚsymbolr    r¡   rc   s          r   rH   z	Qasm.qdefØ   s�   € ØUÐUÐUÐUÐUÐUÐUÐUÝ˜	‘N”Nˆ	Ý˜TÑ"Ô"ˆÝ˜VÑ$Ô$ˆØ�qŠ=ˆ=Ø!, ¨VÑ!4Ô!4ˆDŒI�gÑÐÐà!3Ð!3°FÑ!;Ô!;ˆDŒI�gÑÐÐr   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rZ   rW   rh   rk   ro   rs   r^   r)   ry   r{   r~   r€   r=   r1   r„   r‰   rŒ   rŽ   r”   r™   rœ   rž   rH   r   r   r   r   r   s   s‚  € € € € € ð	ð 	ðð ð ðEð Eð Eð ,ð ,ð ,ð+ð +ð +ðKð Kð Kð
(ð (ð (ð (ð.ð .ð .ð+ð +ð +ðð ð ð0ð 0ð 0ð0ð 0ð 0ð0ð 0ð 0ð0ð 0ð 0ð0ð 0ð 0ð1ð 1ð 1ð;ð ;ð ;ð;ð ;ð ;ð=ð =ð =ð5ð 5ð 5ð.ð .ð .ð.ð .ð .ð<ð <ð <ð<ð <ð <ð <ð <r   N)r©   Ú__all__Úmathr   Úsympy.physics.quantum.gater   r   r   r   r	   r
   r   r   r   r   rn   r   r   r   r!   r&   r-   r4   r8   rC   r@   rQ   r   r   r   r   ú<module>r­      s^  ððð ð& ð€ð Ð Ð Ð Ð Ð à VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ 0Ð 0Ð 0Ð 0Ð 0Ð 0ð%ð %ð %ð-ð -ð -ð	ð 	ð 	ðð ð ð
0ð 
0ð 
0ð3ð 3ð 3ðð ð ðFð Fð Fð
ð ð ðð ð ðm<ð m<ð m<ð m<ð m<ñ m<ô m<ð m<ð m<ð m<r   