U
    	-eQE                     @   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mZmZ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"dd Z#dd Z$dd Z%dd Z&dd Z'dS )     )import_module)Mul)Integer)Dagger)	XYZHCNOTIdentityGateCGate	PhaseGateTGate)generate_gate_rulesgenerate_equivalent_idsGateIdentitybfs_identity_searchis_scalar_sparse_matrixis_scalar_nonsparse_matrixis_degenerateis_reducible)skipc                 C   s    t | t| t| t| f}|S )N)r   r   r   r	   )ZqubitZgates r   p/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/sympy/physics/quantum/tests/test_identitysearch.pycreate_gate_sequence   s    r   c                  C   s  t  \} }}}td}tdtd}t| f| fdfhks>t| | fdf| f| ffh}t| | f|ksjt| || fdf|| | fdf| | |fdf|| f| ff| |f| ff|f| | ffh}t| || f|kst| ||fdf||| fdf|| |fdfd| ||ffd|| |ffd||| ff| f||ff||f| ff|f| |ff|| f|ff|f|| ff| |f|ffh}t| ||f}||ks|td|||| ffd| |||ffd|| ||ffd||| |ff|f||| ff| f|||ff|f| ||ff|f|| |ff|| f||ff| |f||ff||f| |ff||f|| ff|| |f|ff| ||f|ff|||f| ff||| f|ff|| ||fdf| |||fdf|||| fdf||| |fdfh}t| |||f}||kstd|d |d | ffd|d | |d ffd| |d |d ff|f|d | ff|f| |d ff| f|d |d ff|| f|d ff||f| ff| |f|d ff|| |fdf||| fdf| ||fdfh}t| ||f}||ksttd|d |d  |  ftd|d |  |d  ftd| |d  |d  f||d |  f|| |d  f| |d |d  f||  |d f|| | f| | |d f||  | tdf|| |  tdf| | | tdfh}t| ||fdd}||kstd S )Nr      r   TZreturn_as_muls)r   r   r   r   r   AssertionErrorr   )xyzhphcgate_t
gate_rulesactualr   r   r   test_generate_gate_rules_1   s    

$                   
r'   c            	      C   s  t  \} }}}td}tdtd}| tdfh}t| fdd|ksHttdtdfh}t| |  dd|ksrtdh}t| |  dd|kst| | |  tdf|tdf||  | f| | | fh}t| | |  dd|kst| | | tdf|| |  tdf||  | tdftd| | | ftd||  | ftd|| |  f| || f|| | f|| | f||  |f|||  f| | |fh}t| | | dd}||ksttd|| | |  ftd| | | | ftd||  | | ftd|| |  | f||| |  f| || | f|| | | f|||  | f||  || f|| ||  f| | || f|| | | f||  | |f| | | |f|| | | f|| |  |f||  | | tdf| | | | tdf|| | |  tdf|| |  | tdfh}t| | | | dd}||ks0ttd|d |d  |  ftd|d |  |d  ftd| |d  |d  f||d |  f|| |d  f| |d |d  f||  |d f|| | f| | |d f||  | tdf|| |  tdf| | | tdfh}t| | | dd}||ks.td|d |d | ffd|d | |d ffd| |d |d ff|f|d | ff|f| |d ff| f|d |d ff|| f|d ff||f| ff| |f|d ff|| |fdf||| fdf| ||fdfh}t| | | }||kstd S )	Nr   r   Tr   )r   r   Fr   r   )r   r   r   r   r   r   r   )	r   r    r!   r"   r#   r$   expectedr%   r&   r   r   r   test_generate_gate_rules_2X   s    








      
r)   c            	      C   sP  t  \} }}}t| f| fhks$tt| | f| | fhks>tt| |f| |f|| fhks^t| ||f}| ||f||| f|| |f||| f|| |f| ||fh}t||kstt| ||t||| t|| |t||| t|| |t| ||h}t|dd|kst| |||f}| |||f|||| f|| ||f|||| f||| |f|| ||f||| |f| |||fh}t||kstt| || |f}| || |f|| || fh}t||ksttd|}||||f}||||f||||fh}t||ksttdd}tdtd}||||f}||||f||||f||||f||||fh}t||ksLtd S )NTr   r   r   r   r   )r   r   r   r   r   r
   r   )	r   r    r!   r"   Zgate_seqgate_idscgate_ycnotcgate_zr   r   r   test_generate_equivalent_ids_1   sR     
  
 
 

 

 

 



 
r0   c            	   	   C   s  t  \} }}}t| fdd| hks&ttdh}t| |  dd|ksHt| | ||  h}t| | dd|kspt| |f|| fh}t| | |kstt| ||f }| | | || |  ||  | || |  ||  | | | | h}t|dd|kstt| |||f }| | | | || | |  ||  | | || | |  || |  | ||  | | || |  | | | | | h}t|dd|kstt| || |f }| | |  | ||  | |  h}t|dd|ksttd|}t||||f }|| | | || | | h}t|dd|ks&ttdd}tdtd}t||||f }|| | | || | | || | | || | | h}t|dd|kstd S )NTr   r   r*   r   r+   )r   r   r   r   r   r   r
   r   )	r   r    r!   r"   r,   circuitr-   r.   r/   r   r   r   test_generate_equivalent_ids_2   sN    
(
 
    
 
 r2   c                  C   s  d} d}t df}t|| |}|dks*ttd}||f}t|| |}|dksRttd}td}||f}t|| |}|dksttd}	|||	f}
t|
| |}|dksttdd}||f}t|| |}|dksttd}||f}t|| |}|dksttd}|||	|f}t|| |}|dks,td}t|| |}|dksJtt|
| |}|dksdtt|| |}|dks~tt|| |}|dkstd S )N   Fr   Tr   )r   r   r   r   r   r   r
   r	   )	numqubitsid_onlyid_gater&   x0
xx_circuitx1y1
xy_circuitz1xyz_circuitr.   cnot_circuitr"   
hh_circuith1xhzh_circuitr   r   r   test_is_scalar_nonsparse_matrix  sN    


rB   c                  C   s  t d} | std t dddgid}|s2td d}d	}td
f}t|||dksXttd}||f}t|||dks|ttd
}td
}||f}	t|	||d	ksttd
}
|||
f}t|||dksttd
d}||f}t|||dkstt	d}||f}t|||dkstt	d
}|||
|f}t|||dksDtd}t|||dks^tt|||d	ksttt|||dkstt|||dkstd S )Nnumpyznumpy not installed.scipyfromlistsparse)Zimport_kwargszscipy not installed.r3   Fr   Tr   )
r   r   r   r   r   r   r   r   r
   r	   )nprD   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r.   r>   r"   r?   r@   rA   r   r   r   test_is_scalar_sparse_matrix4  sD    


rH   c                  C   s@   t  \} }}}t| ||}|h}||| f}t||dks<td S )NT)r   r   r   r   )r   r    r!   r"   Zgate_idZidsZ
another_idr   r   r   test_is_degeneratef  s
    
rI   c                  C   s   d} t  \}}}}|||f}t|| dddks2t|||f}t|| dddksRt||||f}t|| dddkstt||||f}t|| dddkst|||||f}t|| dddkstd S )	Nr3   r      TFr         )r   r   r   )Znqubitsr   r    r!   r"   r1   r   r   r   test_is_reduciblep  s    

rM   c                  C   s  t g dt kstt \} }}}| g}t| | h}t |ddd|ksJt| ||g}t| | t||t||t| ||h}t |d|kstt| | t||t||t| ||t| || |t| || |t||||h}t |ddd|kstt |ddd|kst| |||g}t| | t||t||t||t| ||t| || |t| || |t| |||t||||t||||h
}t |d|kstt| | t||t||t||h}|t |ddddkstt| | t||t||t||t| ||t| || |t| || |t| |||t||||t||||t| ||| |t| ||||t|||||h}t |ddd|ksxtt| | t||t||t||t| |||h}|t |ddddksttdd	}| |g}t| | t||t| || |h}t |ddd|ksttd
| }| |g}t| | t||t| || |h}t |ddd|ksVttdtd}|||g}t||t||t||t||||h}t |ddd|ksttd	}	t	d	}
|	|
g}t|	|	|	|	h}t |ddd|kstd S )Nr   r3   	max_depthrK   rL   rJ   T)rO   Zidentity_onlyr   r*   r+   )
r   setr   r   r   r
   r   r   r   r   )r   r    r!   r"   	gate_listid_setr.   Zcgate_xr/   str   r   r   test_bfs_identity_search  s    










rU   c                  C   sH   t d} td}t| |g}tt| ||h}t|ddd|ksDtd S )Nr   r   rJ   rN   )r   r   r   r   r   r   )rS   rT   rQ   rR   r   r   r   test_bfs_identity_search_xfail  s
    rV   N)r   )(Zsympy.externalr   Zsympy.core.mulr   Zsympy.core.numbersr   Zsympy.physics.quantum.daggerr   Zsympy.physics.quantum.gater   r   r   r	   r
   r   r   r   r   Z$sympy.physics.quantum.identitysearchr   r   r   r   r   r   r   r   Zsympy.testing.pytestr   r   r'   r)   r0   r2   rB   rH   rI   rM   rU   rV   r   r   r   r   <module>   s"   ,(
EU),22
c