a
    kº”hƒ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   ú[/var/www/auris/lib/python3.9/site-packages/sympy/physics/quantum/tests/test_circuitutils.pyÚcreate_gate_sequence   s    r   c                  C   s¨   d} g d¢}|t | ƒksJ ‚d} g d¢}|t | ƒks8J ‚tdƒ}tdƒ}tdƒ}tdƒ}|||||f} g d¢}|t | ƒks~J ‚|||||f} g d¢}|t | ƒks¤J ‚d S )N)ÚaÚbÚcÚdr   r   r   )éÿÿÿÿr   r   r   r   é   é   )ÚPÚAÚRÚTÚIÚCr$   r    r!   r#   ÚEú r$   ÚNr'   r    r!   r"   r!   r%   r	   ÚUr#   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	   )ÚwordZexpected_tableÚxÚyÚzÚhr   r   r   Útest_kmp_table   s     r0   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svJ ‚t||fƒdksŠJ ‚t||fƒdksžJ ‚t||fƒdks²J ‚t|t| |ƒƒdksÊJ ‚t|t| ||ƒƒdksäJ ‚t|t||ƒƒdksüJ ‚tt|Ž | |||fƒdksJ ‚tt|Ž ||| fƒdks:J ‚t|| fddddksVJ ‚| || ||f}tt|Ž t| ||ƒƒdks„J ‚t|| fdddksžJ ‚t|| |fddddks¼J ‚tt|Ž | |fddddksÞJ ‚t|| |fdd	ddksüJ ‚t|| |fdd	ddksJ ‚| |||| |||| ||| |||||f}t|| ||||fƒd
ks^J ‚| ||||	|f}t||||	fƒdksˆJ ‚|||	|||
f}|||	f}t||ƒ}|dksºJ ‚d S )Nr   r   Úi0r   r   )ÚstartÚend)r2   r*   é   é   )r   r   r   r	   r   r   r   )r,   r-   r.   r/   Úx1Úy1r1   Úx_i0Úy_i0Úz_i0Zh_i0ÚcircuitZ
subcircuitÚresultr   r   r   Útest_find_subcircuit+   sN    
  "ÿ

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sfJ ‚t||| f ƒdks~J ‚t||dd|ks”J ‚t||dd| fks¬J ‚t|| | fdd||fksÊJ ‚t||fƒ|ksÞJ ‚| || ||f}| ||f}tt|Ž t|Ž ƒ| |fksJ ‚| || |f}t||ƒ|fks8J ‚| ||||f}| ||f}t|t|Ž dd||fkspJ ‚t||dd|ksˆJ ‚||f}t||ƒ|ks¤J ‚||||f}t||ƒ| fksÆJ ‚|| f}t|||d}	|	| || fksðJ ‚| ||| ||f}| |f}||f}t||t|Ž d}	|	|||| ||fks<J ‚t|||dd	}	|	| |||||fksfJ ‚d S )
Nr   r   ©r   r   )Úposr   r   )Úreplace)r@   r?   )r   r   r   r	   r
   r   r   r   )
r,   r-   r.   r/   ÚcnotÚcgate_zr;   Úremover@   Úactualr   r   r   Útest_replace_subcircuit[   sV    


 
 ÿÿÿrE   c                  C   s  t ƒ \} }}}tdƒ}|tdƒi}t| fƒ\}}}}	|t|ƒfksFJ ‚||ksRJ ‚t|ƒt|ƒt|ƒt|ƒf}
|tdƒi}t| |||fƒ\}}}}	||
ksžJ ‚||ksªJ ‚t dƒ\}}}}tdƒ}t|ƒt|ƒt|ƒt|ƒf}
|tdƒi}t||||fƒ\}}}}	||
ksJ ‚||ksJ ‚t|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒf}
|tdƒ|tdƒi}t| |||||||fƒ\}}}}	||
ks”J ‚||ks¢J ‚|tdƒ|tdƒi}tt||||| |||ƒƒ\}}}}	||
ksæJ ‚||ksôJ ‚t|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒf}
|tdƒ|tdƒi}tt| |||||||ƒƒ\}}}}	||
kslJ ‚||kszJ ‚|tdƒ|tdƒi}t|| ||||||fƒ\}}}}	||
ks¼J ‚||ksÊJ ‚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¤J ‚||ks²J ‚|| ||||||||||f}t|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt|ƒt	||ƒt	||ƒt
|t|ƒƒt
|t|ƒƒf}
|tdƒ|tdƒi}t|ƒ\}}}}	||
ks\J ‚||ksjJ ‚||||f}t	||ƒt|ƒt
|t|ƒƒt|ƒf}
|tdƒ|tdƒi}t|ƒ\}}}}	||
ksÌJ ‚||ksÚJ ‚||||f}|tdƒ|tdƒi}t|ƒ\}}}}	||
ksJ ‚||ks&J ‚||||f}t	||ƒt|ƒt
|t|ƒƒt|ƒf}
|tdƒ|tdƒi}t|ƒ\}}}}	||
ksˆJ ‚||ks–J ‚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s0J ‚||ks>J ‚|tdƒi}tddd}t||||d	\}}}}	||
ks|J ‚||ksŠJ ‚td
ƒ}t
dtdƒƒ}|tdƒ|tdƒ|tdƒ|tdƒi}t
|||ft|ƒƒf}
|f}t|ƒ\}}}}	||
ksþJ ‚||ksJ ‚d S )Nr1   r   r   Úi1Úi2r   Úi)Úprefixr2   )Ú	qubit_mapr2   ÚgenÚi3)r*   r   r   r*   )r   r   r   r   r   r   r   r	   r   r
   r   r   )r,   r-   r.   r/   r1   Zexp_maprD   Zact_mapZsndxrK   Úexpectedr6   r7   Zz1Úh1rF   Úcnot_10Úcnot_01Ú
cgate_z_10Ú
cgate_z_01ÚargsrG   Úccgate_zÚccgate_xZndx_mapZ	index_genrL   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shJ ‚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èJ ‚|f}
|f}t|
|	ƒ}||ksJ ‚|f}
|f}t|
|	ƒ}||ks0J ‚| d|di}	|f}
|f}t|
|	ƒ}||ks`J ‚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ìJ ‚| d|d|di}	||f}
tdtdtdƒƒƒtdtdtdƒƒƒf}t|
|	ƒ}||ksDJ ‚d S )Nr1   rF   r   r   rG   r   )	r   r   r   r   r   r   r
   r   r   )r1   rF   r,   r-   r.   r/   r8   r9   r:   rJ   rS   rM   rD   rO   rP   rQ   rR   Z
cnot_i1_i0Z
cnot_i0_i1Zcgate_z_i1_i0rG   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stJ ‚t||ƒ|ks†J ‚g d¢}	| ||| ||f}t|||	d| ||fksºJ ‚| | ||||f}t|||	d| | ||fksèJ ‚g d¢}	t|||	d||||fksJ ‚| |||||g}tt|d	ddƒ}d
g}	| |||||||||f
}| |||||f}
t|||	d|
ksxJ ‚t	|Ž }t|||	d|
ks˜J ‚d S )Nr   r   r>   r4   ©Z	max_depth)r   r5   é	   r*   é   ©Úseed)é   é   r   r   é   )
r   r   r   r	   r
   r   Úlistr   r   r   )r,   r-   r.   r/   rA   rB   Ú	gate_listÚidsr;   ÚseqrM   r   r   r   Útest_random_reduceK  s4    

 rd   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sxJ ‚| |||f}||f| ||fg}| | |||||f}d\}}	t||||	gd}
|
|ksÎJ ‚| |||||g}tt|ddd	ƒ}t	|ƒ}| ||||f}| || || ||||f	}d
\}}	t||||	gd}
|
|ksDJ ‚t
|Ž }t||||	gd}
|
|kslJ ‚d S )Nr   r   r>   )r   r   r[   )r   r   r   r4   rX   )r   é   )r   r   r   r	   r
   r   r   r`   r   r   r   )r,   r-   r.   r/   rA   rB   Úchoicesr;   ÚlocÚchoicerD   rM   ra   rb   Zeq_idsr   r   r   Útest_random_insertp  s8    

ri   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   r0   r=   rE   rV   rW   rd   ri   r   r   r   r   Ú<module>   s"    (
02~@
$