U
    	Ç-eƒ3  ã                   @   sÞ   d dl m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mZm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 d dlmZ dd	d
„Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!edd„ ƒZ"edd„ ƒZ#dS )é    )ÚMul)ÚInteger)ÚSymbol)Únumbered_symbols)ÚXÚYÚZÚHÚCNOTÚCGate)Úbfs_identity_search)Ú	kmp_tableÚfind_subcircuitÚreplace_subcircuitÚconvert_to_symbolic_indicesÚconvert_to_real_indicesÚrandom_reduceÚrandom_insertÚflatten_ids)Úslowc                 C   s    t | ƒt| ƒt| ƒt| ƒf}|S )N)r   r   r   r	   )ZqubitZgates© r   ún/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/sympy/physics/quantum/tests/test_circuitutils.pyÚcreate_gate_sequence   s    r   c                  C   sê   d} dddddddg}|t | ƒks&t‚d} ddddddddddddddddddddddddg}|t | ƒksnt‚tdƒ}tdƒ}tdƒ}tdƒ}|||||f} dddddg}|t | ƒksºt‚|||||f} dddddg}|t | ƒksæt‚d S )N)ÚaÚbÚcÚdr   r   r   éÿÿÿÿr   é   é   )ÚPÚAÚRÚTÚIÚCr$   r    r!   r#   ÚEú r$   ÚNr'   r    r!   r"   r!   r%   r	   ÚUr#   r&   é   )r   ÚAssertionErrorr   r   r   r	   )ÚwordZexpected_tableÚxÚyÚzÚhr   r   r   Útest_kmp_table   s:               ÿr1   c                  C   s¾  t dƒ} tdƒ}tdƒ}tdƒ}t dƒ}tdƒ}tdƒ}t |ƒ}t|ƒ}t|ƒ}	t|ƒ}
| ||f}t|| fƒdksvt‚t||fƒdksŠt‚t||fƒdksžt‚t||fƒdks²t‚t|t| |ƒƒdksÊt‚t|t| ||ƒƒdksät‚t|t||ƒƒdksüt‚tt|Ž | |||fƒdkst‚tt|Ž ||| fƒdks:t‚t|| fddddksVt‚| || ||f}tt|Ž t| ||ƒƒdks„t‚t|| fdddksžt‚t|| |fddddks¼t‚tt|Ž | |fddddksÞt‚t|| |fdd	ddksüt‚t|| |fdd	ddkst‚| |||| |||| ||| |||||f}t|| ||||fƒd
ks^t‚| ||||	|f}t||||	fƒdksˆt‚|||	|||
f}|||	f}t||ƒ}|dksºt‚d S )Nr   r   Úi0r   r   )ÚstartÚend)r3   r*   é   é   )r   r   r   r	   r   r   r+   r   )r-   r.   r/   r0   Úx1Úy1r2   Úx_i0Úy_i0Úz_i0Zh_i0ÚcircuitZ
subcircuitÚresultr   r   r   Útest_find_subcircuit+   sX    
  "     ÿ

r>   c            
      C   sj  t dƒ} tdƒ}tdƒ}tdƒ}tddƒ}tdtdƒƒ}||| | f}||| f}t|t|Ž ƒ| fksft‚t||| f ƒdks~t‚t||dd|ks”t‚t||dd| fks¬t‚t|| | fdd||fksÊt‚t||fƒ|ksÞt‚| || ||f}| ||f}tt|Ž t|Ž ƒ| |fkst‚| || |f}t||ƒ|fks8t‚| ||||f}| ||f}t|t|Ž dd||fkspt‚t||dd|ksˆt‚||f}t||ƒ|ks¤t‚||||f}t||ƒ| fksÆt‚|| f}t|||d}	|	| || fksðt‚| ||| ||f}| |f}||f}t||t|Ž d}	|	|||| ||fks<t‚t|||dd	}	|	| |||||fksft‚d S )
Nr   r   ©r   r   )Úposr   r   )Úreplace)rA   r@   )	r   r   r   r	   r
   r   r   r   r+   )
r-   r.   r/   r0   ÚcnotÚcgate_zr<   ÚremoverA   Úactualr   r   r   Útest_replace_subcircuit[   sX    


 
 ÿÿ ÿrF   c                  C   s  t ƒ \} }}}tdƒ}|tdƒi}t| fƒ\}}}}	|t|ƒfksFt‚||ksRt‚t|ƒt|ƒt|ƒt|ƒf}
|tdƒi}t| |||fƒ\}}}}	||
ksžt‚||ksªt‚t dƒ\}}}}tdƒ}t|ƒt|ƒt|ƒt|ƒf}
|tdƒi}t||||fƒ\}}}}	||
kst‚||kst‚t|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒf}
|tdƒ|tdƒi}t| |||||||fƒ\}}}}	||
ks”t‚||ks¢t‚|tdƒ|tdƒi}tt	||||| |||ƒƒ\}}}}	||
ksæt‚||ksôt‚t|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒf}
|tdƒ|tdƒi}tt	| |||||||ƒƒ\}}}}	||
kslt‚||kszt‚|tdƒ|tdƒi}t|| ||||||fƒ\}}}}	||
ks¼t‚||ksÊt‚t
ddƒ}t
ddƒ}tdtdƒƒ}tdtdƒƒ}t|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt
||ƒt
||ƒt|t|ƒƒt|t|ƒƒf}
|tdƒ|tdƒi}| |||||||||||f}t|ƒ\}}}}	||
ks¤t‚||ks²t‚|| ||||||||||f}t|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt
||ƒt
||ƒt|t|ƒƒt|t|ƒƒf}
|tdƒ|tdƒi}t|ƒ\}}}}	||
ks\t‚||ksjt‚||||f}t
||ƒt|ƒt|t|ƒƒt|ƒf}
|tdƒ|tdƒi}t|ƒ\}}}}	||
ksÌt‚||ksÚt‚||||f}|tdƒ|tdƒi}t|ƒ\}}}}	||
kst‚||ks&t‚||||f}t
||ƒt|ƒt|t|ƒƒt|ƒf}
|tdƒ|tdƒi}t|ƒ\}}}}	||
ksˆt‚||ks–t‚tdƒ}tdtdtdƒƒƒ}tdtdtdƒƒƒ}||f}t|t|t|ƒƒƒt|t|t|ƒƒƒf}
|tdƒ|tdƒ|tdƒi}t|ƒ\}}}}	||
ks0t‚||ks>t‚|tdƒi}tddd}t||||d	\}}}}	||
ks|t‚||ksŠt‚td
ƒ}tdtdƒƒ}|tdƒ|tdƒ|tdƒ|tdƒi}t|||ft|ƒƒf}
|f}t|ƒ\}}}}	||
ksþt‚||kst‚d S )Nr2   r   r   Úi1Úi2r   Úi)Úprefixr3   )Ú	qubit_mapr3   ÚgenÚi3)r*   r   r   r*   )r   r   r   r   r   r+   r   r   r	   r   r
   r   r   )r-   r.   r/   r0   r2   Zexp_maprE   Zact_mapZsndxrL   Úexpectedr7   r8   Zz1Zh1rG   Úcnot_10Úcnot_01Ú
cgate_z_10Ú
cgate_z_01ÚargsrH   Úccgate_zÚccgate_xZndx_mapZ	index_genrM   Zcgate_x0_c321r   r   r   Ú test_convert_to_symbolic_indices   s    4
   ÿ     ÿ4     ÿ
   ÿ

$    þ ÿ ÿ$    þ$$(ý   ÿrV   c                  C   sH  t dƒ} t dƒ}tƒ \}}}}t| ƒ}t| ƒ}t| ƒ}| di}	|||f}
|||f}t|
|	ƒ}||ksht‚tddƒ}tddƒ}tdtdƒƒ}tdtdƒƒ}t|| ƒ}t| |ƒ}t|t| ƒƒ}| d|di}	|f}
|f}t|
|	ƒ}||ksèt‚|f}
|f}t|
|	ƒ}||kst‚|f}
|f}t|
|	ƒ}||ks0t‚| d|di}	|f}
|f}t|
|	ƒ}||ks`t‚t dƒ}t| t|t|ƒƒƒ}t|t|t| ƒƒƒ}| d|d|di}	||f}
tdtdtdƒƒƒtdtdtdƒƒƒf}tt	|
Ž |	ƒ}||ksìt‚| d|d|di}	||f}
tdtdtdƒƒƒtdtdtdƒƒƒf}t|
|	ƒ}||ksDt‚d S )Nr2   rG   r   r   rH   r   )
r   r   r   r   r   r   r+   r
   r   r   )r2   rG   r-   r.   r/   r0   r9   r:   r;   rK   rS   rN   rE   rO   rP   rQ   rR   Z
cnot_i1_i0Z
cnot_i0_i1Zcgate_z_i1_i0rH   rT   rU   r   r   r   Útest_convert_to_real_indices  sb    










((
rW   c               
   C   s¤  t dƒ} tdƒ}tdƒ}tdƒ}tddƒ}tdtdƒƒ}| ||g}tt|dddƒ}| ||||f}t|g ƒ|kstt	‚t||ƒ|ks†t	‚dddd	d
g}	| ||| ||f}t|||	d| ||fksÀt	‚| | ||||f}t|||	d| | ||fksît	‚dddg}	t|||	d||||fkst	‚| |||||g}tt|dddƒ}dg}	| |||||||||f
}| |||||f}
t|||	d|
ks€t	‚t
|Ž }t|||	d|
ks t	‚d S )Nr   r   r?   r5   ©Ú	max_depthr   r6   é	   r*   é   ©Úseedé   é   é   )r   r   r   r	   r
   r   Úlistr   r   r+   r   )r-   r.   r/   r0   rB   rC   Ú	gate_listÚidsr<   ÚseqrN   r   r   r   Útest_random_reduceK  s4    


 re   c               	   C   sp  t dƒ} tdƒ}tdƒ}tdƒ}tddƒ}tdtdƒƒ}| | fg}||f}d\}}	t||||	gd}
|
| | ||fksxt‚| |||f}||f| ||fg}| | |||||f}d\}}	t||||	gd}
|
|ksÎt‚| |||||g}tt	|ddd	ƒ}t
|ƒ}| ||||f}| || || ||||f	}d
\}}	t||||	gd}
|
|ksDt‚t|Ž }t||||	gd}
|
|kslt‚d S )Nr   r   r?   )r   r   r\   )r   r   r   r5   rX   )r   é   )r   r   r   r	   r
   r   r   r+   ra   r   r   r   )r-   r.   r/   r0   rB   rC   Úchoicesr<   ÚlocÚchoicerE   rN   rb   rc   Zeq_idsr   r   r   Útest_random_insertp  s8    

rj   N)r   )$Zsympy.core.mulr   Zsympy.core.numbersr   Zsympy.core.symbolr   Zsympy.utilitiesr   Zsympy.physics.quantum.gater   r   r   r	   r
   r   Z$sympy.physics.quantum.identitysearchr   Z"sympy.physics.quantum.circuitutilsr   r   r   r   r   r   r   r   Zsympy.testing.pytestr   r   r1   r>   rF   rV   rW   re   rj   r   r   r   r   Ú<module>   s"    (
02~@
$