U
    	Ç-eÐ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t‚| jdks$t‚tdƒ}tdƒ}t |ƒ}t |ƒ}t |ƒ}||ksXt‚||ksdt‚||kspt‚t||ƒ}t||ƒ}t||ƒ}||ksšt‚||ks¦t‚||ks²t‚dS )zTest a basic gate.é   é   Úi0Úi1N)r   Z
min_qubitsÚAssertionErrorÚnqubitsr   r   )	Úhr/   r0   Zh0_w1Zh0_w2Zh1_w1Z
cnot_10_w1Z
cnot_10_w2Z
cnot_01_w1© r4   úf/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/sympy/physics/quantum/tests/test_gate.pyÚ	test_gate   s"    


r6   c            	      C   sî   t dƒ\} }}}t| |g||ggƒ}td|ƒ}t|dd|ksBt‚t|tdƒ ƒ| tdƒ |tdƒ  ksnt‚t|tdƒ ƒ|tdƒ |tdƒ  ksšt‚td|ƒ}t|dd}td	ƒD ]0}|tt	|dƒƒ tt|t	|dƒ ƒƒks¸t‚q¸d S )
Núa,b,c,d©r   r-   ©r2   Ú0Ú1©r-   r.   é   )
r   r   r    r$   r1   r%   r&   Úranger(   r'   )	ÚaÚbÚcÚdÚuMatÚu1Úu2Úu2RepÚir4   r4   r5   Ú
test_UGate/   s    
,,
ÿrH   c                  C   s(  t ddddgddddgddddgddddggƒ} ttdtdƒƒdd| ksNt‚tdtdƒƒ}t|ddt ddddddddgddddddddgddddddddgddddddddgddddddddgddddddddgddddddddgddddddddggƒkst‚tdtdƒƒ}t|tdƒ ƒtt|tdƒ d	dƒksBt‚t|td
ƒ ƒtt|td
ƒ d	dƒkspt‚tdtdƒƒ}t dddddt	 fddt	dffƒ}t| 
¡ dd|ksºt‚tdtdƒƒ}t dƒ}t|tdƒ ƒtdƒ ksðt‚tt|tdƒ ddƒtdƒ kst‚t| 
¡ dd|ks2t‚tdtdƒƒ}t|tdƒ ƒt	tdƒ ksbt‚tt|tdƒ ddƒt	tdƒ ksŒt‚t|ƒ|ksžt‚t|dƒt|ƒks¶t‚t|ƒ| ¡ ksÌt‚t|ƒ|ksÞt‚t|ƒ| ¡ ksôt‚t|ƒt|dƒkst‚t|dƒ| ¡ ks$t‚dS )zTest the general CGate.r-   r   r.   r9   )r-   r.   é   )rI   r   Z1001r=   Z0000©r-   r   r   r   ©r   r-   r   r   )rJ   rK   ©r   r   r-   r   )r   r   r   éÿÿÿÿÚ11rM   N)r   r$   r!   r   r1   r%   r&   r)   r   r   Ú	decomposer   r   r,   ÚpowZinverse)Z
CNOTMatrixZToffoliGateZCYGateZCYGate_matrixZCZGateZCZGate_matrixZ
CPhaseGater4   r4   r5   Ú
test_cgateA   sn    *ÿ
6  
  ÿýÿÿ
ÿ
ÿ
ÿÿ ÿ

ÿ

ÿ
rQ   c                  C   sf  t dƒ\} }}}t| |g||ggƒ}tddddgddddgdd| |gdd||ggƒ}td|ƒ}td|ƒ}t|dd|ks|t‚t|tdƒ ƒ| tdƒ |tdƒ  ks¨t‚t|tdƒ ƒ|tdƒ |tdƒ  ksÔt‚t|td	ƒ ƒtd	ƒksðt‚t|td
ƒ ƒtd
ƒkst‚td|ƒ}t|dd}	tdƒD ]4}
|	t	t
|
dƒƒ t	t|t
|
dƒ ƒƒks,t‚q,d S )Nr7   r-   r   r8   r.   r9   Ú10rN   Ú01Ú00r<   r=   )r   r   r    r!   r$   r1   r%   r&   r>   r(   r'   )r?   r@   rA   rB   rC   ZcMatrD   Zcu1rE   rF   rG   r4   r4   r5   Útest_UGate_CGate_combov   s     0

,,
ÿrU   c                  C   sj  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sŠt‚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sHt‚t|
t
dƒ dd|	ksft‚d S )Nzv w f gr-   r   r.   r9   )r   r   r   r   r    r$   r1   r
   r   r   r   )ÚvÚwÚfÚgZuMat1ZcMat1rD   ZuMat2ZcMat2_1ZcMat2_2rE   r4   r4   r5   Útest_UGate_OneQubitGate_combo‹   s    @6$"ÿ
rZ   c                  C   s8   t dƒtdƒ } t| dd}|tttddgƒks4t‚dS )z-Test the representation of the hadamard gate.r   rT   r.   r9   N)r   r&   r$   r   r+   r1   ©ÚcircuitZanswerr4   r4   r5   Útest_represent_hadamardš   s    r]   c                  C   s8   t dƒtdƒ } t| dd}tddddgƒ|ks4t‚dS )z&Test the representation of the X gate.r   rT   r.   r9   r-   N)r   r&   r$   r   r1   r[   r4   r4   r5   Útest_represent_xgate¢   s    r^   c                  C   sT   t dƒtdƒ } t| dd}|d dkrL|d tkrL|d dkrL|d dksPt‚dS )z&Test the representation of the Y gate.r   rT   r.   r9   r-   rI   N)r   r&   r$   r   r1   r[   r4   r4   r5   Útest_represent_ygate©   s    
ÿ
ÿr_   c                  C   s8   t dƒtdƒ } t| dd}tddddgƒ|ks4t‚dS )z&Test the representation of the Z gate.r   rT   r.   r9   r-   N)r   r&   r$   r   r1   r[   r4   r4   r5   Útest_represent_zgate±   s    r`   c                  C   s8   t dƒtdƒ } t| dd}tdtddgƒ|ks4t‚dS )z&Test the representation of the S gate.r   rS   r.   r9   N)r   r&   r$   r   r   r1   r[   r4   r4   r5   Útest_represent_phasegate¸   s    ra   c                  C   s@   t dƒtdƒ } tdttt d ƒddgƒt| ddks<t‚dS )z&Test the representation of the T gate.r   rS   r=   r.   r9   N)r   r&   r   r	   r   r   r$   r1   ©r\   r4   r4   r5   Útest_represent_tgate¿   s    rc   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\t	‚dS )z$Test a compound gate representation.r   rT   r.   r9   N)
r   r   r   r   r&   r$   r   r   r
   r1   r[   r4   r4   r5   Útest_compound_gatesÅ   s    (rd   c               	   C   s´   t ddƒ} t| ddtddddgddddgddddgddddggƒksJt‚| tdƒ } tt| ddƒt| ƒksrt‚t ddƒ} t| ƒ| ksŒt‚tt| ƒƒ| ks t‚| |  dks°t‚dS )zTest the CNOT gate.r-   r   r.   r9   Z111rI   N)r   r$   r   r1   r&   r)   r%   r,   rb   r4   r4   r5   Útest_cnot_gateÌ   s    

.ÿÿ
re   c                  C   sÌ  t tttttfD ]<} t| dƒ| dƒ | dƒ ƒ| dƒ| dƒ | dƒ kst‚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s²t‚ttdƒt dƒ ƒt dƒ tdƒ ksÜt‚ttdƒt dƒd  ƒt dƒd tdƒ kst‚ttdƒtdƒ ƒtdƒ tdƒ ks:t‚ttdƒt dƒ ƒt dƒ tdƒ ksft‚ttdƒtdƒ ƒtdƒ tdƒ ks’t‚ttdƒtdƒ ƒtdƒtdƒ ks¼t‚ttdƒtdƒ ƒtdƒtdƒ ksæt‚ttdƒtdƒ ƒtdƒtdƒ kst‚ttdƒtddƒ ƒtddƒtdƒ ks>t‚ttdƒtddƒ ƒtddƒtdƒ kslt‚ttdƒtddƒ ƒtddƒtdƒ ksšt‚tt dƒtddƒ ƒtddƒt dƒ ksÈt‚dS )zTest gate_sort.r.   r-   r   N)	r   r   r   r   r   r   r   r1   r   )rY   Úer4   r4   r5   Útest_gate_sortÛ   s     :22*2,,,***...rg   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sˆt‚ttdƒtdƒ ƒdks¤t‚ttdƒtdƒ ƒdksÀt‚ttdƒtdƒ ƒdksÜt‚tt dƒt dƒ ƒdksøt‚ttdƒtdƒ ƒtdƒkst‚ttdƒtdƒ ƒtdƒks<t‚tt	dƒƒt	dƒksVt‚ttdƒd tdƒd  ƒt	dƒks€t‚dS )zTest gate_simp.r   r-   r.   rI   r=   N)
r   r   r   r   r   r   r1   r   r   r   )rf   r4   r4   r5   Útest_gate_simp÷   s    R6""rh   c                  C   s˜   t dƒ} ttddƒ ¡ dd| ks&t‚ttddƒtdƒ ƒtdƒksHt‚d	}t|ƒD ]>}t|ƒD ]0}tt||ƒ|dtt||ƒ ¡ |dks`t‚q`qTd
S )zTest the SWAP gate.)rJ   rL   rK   )r   r   r   r-   r-   r   r.   r9   rI   Z0010Z1000r=   N)r   r$   r   rO   r1   r%   r&   r>   )Zswap_gate_matrixr2   rG   Újr4   r4   r5   Útest_swap_gate  s    ÿ"ÿrj   c                  C   sœ   t ttttttfD ]„} t ttttttfD ]l}t| dƒ|dƒƒ}tt	|dddƒ}tt	| 
¡ dddƒ}||ksrt‚t| dƒ|dƒƒ}| 
¡ dks(t‚q(qdS )z-Test single qubit gate commutation relations.r   r-   Úsympy©r2   ÚformatN)r   r   r   r   r   r   r   r"   r*   r$   Údoitr1   ©Úg1Úg2rf   r?   r@   r4   r4   r5   Útest_one_qubit_commutators  s    rr   c                  C   s¸   t ttttfD ]¤} t ttttfD ]}t| dƒ|dƒƒ}tt|dddƒ}tt| ¡ dddƒ}||ksjt	‚t| dƒ|dƒƒ}tt|dddƒ}tt| ¡ dddƒ}||ks t	‚q qdS )z1Test single qubit gate anticommutation relations.r   r-   rk   rl   r.   N)
r   r   r   r   r   r#   r*   r$   rn   r1   ro   r4   r4   r5   Útest_one_qubit_anticommutators  s    rs   c                   C   s  t tddƒtdƒƒ ¡ dks t‚t tddƒtdƒƒ ¡ dks@t‚t tddƒtdƒƒ ¡ dks`t‚t tddƒtdƒƒ ¡ dks€t‚t tddƒtddƒƒ ¡ dks¢t‚t tddƒtddƒƒ ¡ dksÄt‚t tddƒtddƒƒ ¡ dksæt‚t tddƒtddƒƒ ¡ dks
t‚dS )z)Test commutators of involving CNOT gates.r   r-   r.   N)r"   r   r   rn   r1   r   r   r   r4   r4   r4   r5   Útest_cnot_commutators-  s        """rt   c                  C   sD   t ddƒ} t| tƒst‚t| dd}|jdks2t‚t|tƒs@t‚d S )Né
   rI   r9   )é   rv   )r   Ú
isinstancer   r1   r$   Úshaper   )rA   Úmr4   r4   r5   Útest_random_circuit9  s
    
rz   c                  C   s"   t ddƒ} t| ƒ}| |kst‚d S ©Nr-   r.   ©r   r,   r1   ©ÚxZx_daggerr4   r4   r5   Útest_hermitian_XGateA  s    
r   c                  C   s"   t ddƒ} t| ƒ}| |kst‚d S r{   ©r   r,   r1   ©ÚyZy_daggerr4   r4   r5   Útest_hermitian_YGateH  s    
rƒ   c                  C   s"   t ddƒ} t| ƒ}| |kst‚d S r{   ©r   r,   r1   ©ÚzZz_daggerr4   r4   r5   Útest_hermitian_ZGateO  s    
r‡   c                  C   s&   t ddƒ} t| ƒ}| | dks"t‚d S r{   r|   r}   r4   r4   r5   Útest_unitary_XGateV  s    
rˆ   c                  C   s&   t ddƒ} t| ƒ}| | dks"t‚d S r{   r€   r   r4   r4   r5   Útest_unitary_YGate]  s    
r‰   c                  C   s&   t ddƒ} t| ƒ}| | dks"t‚d S r{   r„   r…   r4   r4   r5   Útest_unitary_ZGated  s    
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,   r6   rH   rQ   rU   rZ   r]   r^   r_   r`   ra   rc   rd   re   rg   rh   rj   rr   rs   rt   rz   r   rƒ   r‡   rˆ   r‰   rŠ   r4   r4   r4   r5   Ú<module>   sP   \5