o
    GZŽhÐ0  ã                   @   sø  d dl mZ d dlmZmZmZmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ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mZ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 d	l)m*Z* d d
l+m,Z, d dl-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 dd„ Z:dd„ Z;dd„ Z<dd„ Z=dd„ Z>dd„ Z?dd„ Z@dd„ ZAd d!„ ZBd"d#„ ZCd$d%„ ZDd&d'„ ZEd(d)„ ZFd*d+„ ZGd,d-„ ZHd.d/„ ZId0d1„ ZJd2d3„ ZKd4d5„ ZLd6d7„ ZMd8d9„ ZNd:d;„ ZOd<d=„ ZPd>d?„ ZQd@dA„ ZRdBdC„ ZSdDS )Eé    )ÚMul)ÚIÚIntegerÚRationalÚpi)ÚWildÚsymbols)Úexp)Úsqrt)ÚMatrixÚImmutableMatrix)ÚXGateÚYGateÚZGateÚrandom_circuitÚCNOTÚIdentityGateÚHÚXÚYÚSÚTÚZÚSwapGateÚ	gate_simpÚ	gate_sortÚCNotGateÚTGateÚHadamardGateÚ	PhaseGateÚUGateÚCGate)Ú
Commutator)ÚAntiCommutator)Ú	represent)Úqapply)ÚQubitÚIntQubitÚqubit_to_matrixÚmatrix_to_qubit)Úmatrix_to_zero)Ú	sqrt2_inv)ÚDaggerc            	      C   s¶   t dƒ} | jdksJ ‚| jdksJ ‚tdƒ}tdƒ}t |ƒ}t |ƒ}t |ƒ}||ks,J ‚||ks2J ‚||ks8J ‚t||ƒ}t||ƒ}t||ƒ}||ksMJ ‚||ksSJ ‚||ksYJ ‚dS )zTest a basic gate.é   é   Úi0Úi1N)r   Z
min_qubitsÚnqubitsr   r   )	Úhr/   r0   Zh0_w1Zh0_w2Zh1_w1Z
cnot_10_w1Z
cnot_10_w2Z
cnot_01_w1© r3   úT/var/www/auris/lib/python3.10/site-packages/sympy/physics/quantum/tests/test_gate.pyÚ	test_gate   s"   


r5   c            	      C   sî   t dƒ\} }}}t| |g||ggƒ}td|ƒ}t|dd|ks!J ‚t|tdƒ ƒ| tdƒ |tdƒ  ks7J ‚t|tdƒ ƒ|tdƒ |tdƒ  ksMJ ‚td|ƒ}t|dd}td	ƒD ]}|tt|dƒƒ tt|t|dƒ ƒƒkstJ ‚q\d S )
Núa,b,c,d©r   r-   ©r1   Ú0Ú1©r-   r.   é   )	r   r   r    r$   r%   r&   Úranger(   r'   )	ÚaÚbÚcÚdÚuMatÚu1Úu2Úu2RepÚir3   r3   r4   Ú
test_UGate/   s   
,,

ÿÿrG   c                  C   s¨  t g d¢g d¢g d¢g d¢gƒ} ttdtdƒƒdd| ksJ ‚td	tdƒƒ}t|d
dt g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢gƒksJJ ‚tdtdƒƒ}t|tdƒ ƒtt|tdƒ ddƒksgJ ‚t|tdƒ ƒtt|tdƒ ddƒks}J ‚tdtdƒƒ}t dddddt fddtdffƒ}t| 	¡ dd|ks¡J ‚tdt
dƒƒ}t dƒ}t|tdƒ ƒtdƒ ks»J ‚tt|tdƒ ddƒtdƒ ksÎJ ‚t| 	¡ dd|ksÚJ ‚tdtdƒƒ}t|tdƒ ƒttdƒ ksñJ ‚tt|tdƒ ddƒttdƒ ksJ ‚t|ƒ|ksJ ‚t|dƒt|ƒksJ ‚t|ƒ| ¡ ks&J ‚t|ƒ|ks/J ‚t|ƒ| ¡ ks:J ‚t|ƒt|dƒksFJ ‚t|dƒ| ¡ ksRJ ‚dS )zTest the general CGate.©r-   r   r   r   ©r   r-   r   r   ©r   r   r   r-   ©r   r   r-   r   r-   r   r.   r8   )r-   r.   é   )r-   r   r   r   r   r   r   r   )r   r-   r   r   r   r   r   r   )r   r   r-   r   r   r   r   r   )r   r   r   r-   r   r   r   r   )r   r   r   r   r-   r   r   r   )r   r   r   r   r   r-   r   r   )r   r   r   r   r   r   r   r-   )r   r   r   r   r   r   r-   r   )rL   r   Z1001r<   Z0000)rH   rI   rK   )r   r   r   éÿÿÿÿÚ11rM   N)r   r$   r!   r   r%   r&   r)   r   r   Ú	decomposer   r   r,   ÚpowZinverse)Z
CNOTMatrixZToffoliGateZCYGateZCYGate_matrixZCZGateZCZGate_matrixZ
CPhaseGater3   r3   r4   Ú
test_cgateA   sb   ÿ
ýÿÿÿÿÿÿÿ
ÿ

ÿrQ   c                  C   sX  t dƒ\} }}}t| |g||ggƒ}tg d¢g d¢dd| |gdd||ggƒ}td|ƒ}td|ƒ}t|dd|ks:J ‚t|td	ƒ ƒ| td	ƒ |td
ƒ  ksPJ ‚t|td
ƒ ƒ|td	ƒ |td
ƒ  ksfJ ‚t|tdƒ ƒtdƒkstJ ‚t|tdƒ ƒtdƒks‚J ‚td|ƒ}t|dd}	tdƒD ]}
|	tt	|
dƒƒ tt|t	|
dƒ ƒƒks©J ‚q‘d S )Nr6   rH   rI   r   r7   r-   r.   r8   Ú10rN   Ú01Ú00r;   r<   )
r   r   r    r!   r$   r%   r&   r=   r(   r'   )r>   r?   r@   rA   rB   ZcMatrC   Zcu1rD   rE   rF   r3   r3   r4   Útest_UGate_CGate_combov   s"   (

,,

ÿÿrU   c                  C   sf  t dƒ\} }}}t| |g||ggƒ}t| |d ddg|d |ddgdd| |d gdd|d |ggƒ}tdƒtd|ƒ }t|dd|ksEJ ‚tdtdƒ dtdƒ gttdƒ t tdƒ ggƒ}ttddƒtd  tddƒtd  gtddƒtd  tddƒtd  ggƒ}tddgdtggƒ}	td|ƒ}
tt	dƒ|
 dd|ks£J ‚t|
t	dƒ dd|	ks±J ‚d S )Nzv w f gr-   r   r.   r8   )
r   r   r   r   r    r$   r
   r   r   r   )ÚvÚwÚfÚgZuMat1ZcMat1rC   ZuMat2ZcMat2_1ZcMat2_2rD   r3   r3   r4   Útest_UGate_OneQubitGate_combo‹   s   @6$"ÿ
 rZ   c                  C   s8   t dƒtdƒ } t| dd}|tttddgƒksJ ‚dS )z-Test the representation of the hadamard gate.r   rT   r.   r8   N)r   r&   r$   r   r+   ©ÚcircuitZanswerr3   r3   r4   Útest_represent_hadamardš   s   r]   c                  C   ó4   t dƒtdƒ } t| dd}tg d¢ƒ|ksJ ‚dS )z&Test the representation of the X gate.r   rT   r.   r8   rI   N)r   r&   r$   r   r[   r3   r3   r4   Útest_represent_xgate¢   ó   r_   c                  C   sT   t dƒtdƒ } t| dd}|d dkr&|d tkr&|d dkr&|d dks(J ‚dS )z&Test the representation of the Y gate.r   rT   r.   r8   r-   rL   N)r   r&   r$   r   r[   r3   r3   r4   Útest_represent_ygate©   s    ra   c                  C   r^   )z&Test the representation of the Z gate.r   rT   r.   r8   rH   N)r   r&   r$   r   r[   r3   r3   r4   Útest_represent_zgate±   r`   rb   c                  C   s8   t dƒtdƒ } t| dd}tdtddgƒ|ksJ ‚dS )z&Test the representation of the S gate.r   rS   r.   r8   N)r   r&   r$   r   r   r[   r3   r3   r4   Útest_represent_phasegate¸   s   rc   c                  C   s@   t dƒtdƒ } tdttt d ƒddgƒt| ddksJ ‚dS )z&Test the representation of the T gate.r   rS   r<   r.   r8   N)r   r&   r   r	   r   r   r$   ©r\   r3   r3   r4   Útest_represent_tgate¿   s   0re   c                  C   s`   t dƒtdƒ tdƒ tdƒ tdƒ } t| dd}tttdƒ ttdƒ ddgƒ|ks.J ‚dS )z$Test a compound gate representation.r   rT   r.   r8   N)	r   r   r   r   r&   r$   r   r   r
   r[   r3   r3   r4   Útest_compound_gatesÅ   s   (,rf   c                  C   s¤   t ddƒ} t| ddtg d¢g d¢g d¢g d¢gƒksJ ‚| td	ƒ } tt| d
dƒt| ƒks1J ‚t ddƒ} t| ƒ| ks>J ‚tt| ƒƒ| ksHJ ‚| |  dksPJ ‚dS )zTest the CNOT gate.r-   r   r.   r8   rH   rI   rJ   rK   Z111rL   N)r   r$   r   r&   r)   r%   r,   rd   r3   r3   r4   Útest_cnot_gateÌ   s   

ÿÿ
rg   c                  C   sÀ  t tttttfD ]} t| dƒ| dƒ | dƒ ƒ| dƒ| dƒ | dƒ ks&J ‚qtt dƒtdƒd  tddƒ t dƒ t dƒ ƒ}|tdƒd tddƒ t dƒ t dƒd  ksYJ ‚ttdƒt dƒ ƒt dƒ tdƒ ksnJ ‚ttdƒt dƒd  ƒt dƒd tdƒ ks†J ‚ttdƒtdƒ ƒtdƒ tdƒ ks›J ‚ttdƒt dƒ ƒt dƒ tdƒ ks°J ‚ttdƒtdƒ ƒtdƒ tdƒ ksÅJ ‚ttdƒtdƒ ƒtdƒtdƒ ksÙJ ‚ttdƒtdƒ ƒtdƒtdƒ ksíJ ‚ttdƒtdƒ ƒtdƒtdƒ ksJ ‚ttdƒtddƒ ƒtddƒtdƒ ksJ ‚ttdƒtddƒ ƒtddƒtdƒ ks0J ‚ttdƒtddƒ ƒtddƒtdƒ ksGJ ‚tt dƒtddƒ ƒtddƒt dƒ ks^J ‚dS )zTest gate_sort.r.   r-   r   N)r   r   r   r   r   r   r   r   )rY   Úer3   r3   r4   Útest_gate_sortÛ   s    :22*0***((*...2ri   c                  C   s|  t dƒtdƒ t dƒd  tddƒ tdƒd  tdƒ tdƒd  tdƒd  } t| ƒt dƒtddƒ tdƒ tdƒ tdƒ ksDJ ‚ttdƒtdƒ ƒdksRJ ‚ttdƒtdƒ ƒdks`J ‚ttdƒtdƒ ƒdksnJ ‚tt dƒt dƒ ƒdks|J ‚ttdƒtdƒ ƒtdƒksŒJ ‚ttdƒtdƒ ƒtdƒksœJ ‚ttdƒƒtdƒks¨J ‚ttdƒd tdƒd  ƒtdƒks¼J ‚dS )zTest gate_simp.r   r-   r.   rL   r<   N)	r   r   r   r   r   r   r   r   r   )rh   r3   r3   r4   Útest_gate_simp÷   s   R6  ,rj   c                  C   s˜   t dƒ} ttddƒ ¡ dd| ksJ ‚ttddƒtdƒ ƒtdƒks$J ‚d	}t|ƒD ]}t|ƒD ]}tt||ƒ|dtt||ƒ ¡ |dksHJ ‚q0q*d
S )zTest the SWAP gate.)rH   rK   rI   rJ   r-   r   r.   r8   rL   Z0010Z1000r<   N)r   r$   r   rO   r%   r&   r=   )Zswap_gate_matrixr1   rF   Újr3   r3   r4   Útest_swap_gate  s   ÿ"
ÿÿÿrl   c                  C   sœ   t ttttttfD ]B} t ttttttfD ]6}t| dƒ|dƒƒ}tt	|dddƒ}tt	| 
¡ dddƒ}||ks9J ‚t| dƒ|dƒƒ}| 
¡ dksJJ ‚qq	dS )z-Test single qubit gate commutation relations.r   r-   Úsympy©r1   ÚformatN)r   r   r   r   r   r   r   r"   r*   r$   Údoit©Úg1Úg2rh   r>   r?   r3   r3   r4   Útest_one_qubit_commutators  s   ùÿrt   c                  C   s¸   t ttttfD ]R} t ttttfD ]H}t| dƒ|dƒƒ}tt|dddƒ}tt| ¡ dddƒ}||ks5J ‚t| dƒ|dƒƒ}tt|dddƒ}tt| ¡ dddƒ}||ksXJ ‚qqdS )z1Test single qubit gate anticommutation relations.r   r-   rm   rn   r.   N)	r   r   r   r   r   r#   r*   r$   rp   rq   r3   r3   r4   Útest_one_qubit_anticommutators  s   øÿru   c                   C   s  t tddƒtdƒƒ ¡ dksJ ‚t tddƒtdƒƒ ¡ dks J ‚t tddƒtdƒƒ ¡ dks0J ‚t tddƒtdƒƒ ¡ dks@J ‚t tddƒtddƒƒ ¡ dksQJ ‚t tddƒtddƒƒ ¡ dksbJ ‚t tddƒtddƒƒ ¡ dkssJ ‚t tddƒtddƒƒ ¡ dks„J ‚dS )z)Test commutators of involving CNOT gates.r   r-   r.   N)r"   r   r   rp   r   r   r   r3   r3   r3   r4   Útest_cnot_commutators-  s       """&rv   c                  C   sD   t ddƒ} t| tƒsJ ‚t| dd}|jdksJ ‚t|tƒs J ‚d S )Né
   rL   r8   )é   rx   )r   Ú
isinstancer   r$   Úshaper   )r@   Úmr3   r3   r4   Útest_random_circuit9  s
   
r|   c                  C   ó"   t ddƒ} t| ƒ}| |ksJ ‚d S ©Nr-   r.   ©r   r,   ©ÚxZx_daggerr3   r3   r4   Útest_hermitian_XGateA  ó   
r‚   c                  C   r}   r~   ©r   r,   ©ÚyZy_daggerr3   r3   r4   Útest_hermitian_YGateH  rƒ   r‡   c                  C   r}   r~   ©r   r,   ©ÚzZz_daggerr3   r3   r4   Útest_hermitian_ZGateO  rƒ   r‹   c                  C   ó&   t ddƒ} t| ƒ}| | dksJ ‚d S r~   r   r€   r3   r3   r4   Útest_unitary_XGateV  ó   
r   c                  C   rŒ   r~   r„   r…   r3   r3   r4   Útest_unitary_YGate]  rŽ   r   c                  C   rŒ   r~   rˆ   r‰   r3   r3   r4   Útest_unitary_ZGated  rŽ   r   N)TZsympy.core.mulr   Zsympy.core.numbersr   r   r   r   Zsympy.core.symbolr   r   Z&sympy.functions.elementary.exponentialr	   Z(sympy.functions.elementary.miscellaneousr
   Zsympy.matricesr   r   Zsympy.physics.quantum.gater   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   Z sympy.physics.quantum.commutatorr"   Z$sympy.physics.quantum.anticommutatorr#   Zsympy.physics.quantum.representr$   Zsympy.physics.quantum.qapplyr%   Zsympy.physics.quantum.qubitr&   r'   r(   r)   Z!sympy.physics.quantum.matrixutilsr*   Z!sympy.physics.quantum.matrixcacher+   Zsympy.physics.quantumr,   r5   rG   rQ   rU   rZ   r]   r_   ra   rb   rc   re   rf   rg   ri   rj   rl   rt   ru   rv   r|   r‚   r‡   r‹   r   r   r   r3   r3   r3   r4   Ú<module>   sR    \5