ó
¡¼™\c           @   sU  d  d l  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 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 m Z d d	 „ Z d
 „  Z  d „  Z! d „  Z" d „  Z# d „  Z$ d „  Z% d „  Z& d „  Z' d „  Z( d „  Z) e sQe e) ƒ Z) n  d S(   iÿÿÿÿ(   t   import_module(   t   Mult   Integer(   t   PY3(   t   Dagger(	   t   Xt   Yt   Zt   Ht   CNOTt   IdentityGatet   CGatet	   PhaseGatet   TGate(   t   generate_gate_rulest   generate_equivalent_idst   GateIdentityt   bfs_identity_searcht   is_scalar_sparse_matrixt   is_scalar_nonsparse_matrixt   is_degeneratet   is_reducible(   t   skipt   XFAILi    c         C   s.   t  |  ƒ t |  ƒ t |  ƒ t |  ƒ f } | S(   N(   R   R   R   R   (   t   qubitt   gates(    (    sN   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_identitysearch.pyt   create_gate_sequence   s    *c          C   s£  t  ƒ  \ }  } } } t d ƒ } t d t d ƒ ƒ } t |  f ƒ |  f d f h k s] t ‚ t |  |  f d f |  f |  f f g ƒ } t |  |  f ƒ | k s¥ t ‚ t |  | |  f d f | |  |  f d f |  |  | f d	 f | |  f |  f f |  | f |  f f | f |  |  f f g ƒ } t |  | |  f ƒ | k s>t ‚ t |  | | 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 g ƒ } t |  | | f ƒ } | | k sIt ‚ 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 g ƒ } t |  | | | f ƒ } | | k s#t ‚ 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 g ƒ } t |  | | f ƒ } | | k s^t ‚ t 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 g ƒ } t |  | | f d t ƒ} | | k sŸt ‚ d  S(   Ni    i   iÿÿÿÿt   return_as_muls(    (    (    (    (    (    (    (    (    (    (    (    (    (    (    (    (    (    (    (    (    (    (    (    (    (	   R   R   R   R   R   t   AssertionErrort   setR   t   True(   t   xt   yt   zt   ht   pht   cgate_tt
   gate_rulest   actual(    (    sN   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_identitysearch.pyt   test_generate_gate_rules_1   st    '!966???????3" c    	      C   sº  t  ƒ  \ }  } } } t d ƒ } t d t d ƒ ƒ } |  t d ƒ f h } t |  f d t ƒ| k sl t ‚ t d ƒ t d ƒ f h } t |  |  d t ƒ| k s© t ‚ d d f h } t |  |  d t ƒ| k sÚ t ‚ t	 |  | |  t d ƒ f | t d ƒ f | |  |  f |  | |  f g ƒ } t |  | |  d t ƒ| k sLt ‚ t	 |  | | t d ƒ f | | |  t d ƒ f | |  | t d ƒ f t d ƒ |  | | f t d ƒ | |  | f t d ƒ | | |  f |  | | f | | |  f | |  | f | |  | f | | |  f |  | | f g ƒ } t |  | | d t ƒ} | | k s\t ‚ t	 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 g ƒ } t |  | | | d t ƒ} | | k s<t ‚ t	 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 g ƒ } t |  | | d t ƒ} | | k s|t ‚ 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 g ƒ } t |  | | ƒ } | | k s¶t ‚ d  S(   Ni    i   R   iÿÿÿÿ(    (    (    (    (    (    (    (    (
   R   R   R   R   R   R   R   R   t   FalseR   (	   R   R    R!   R"   R#   R$   t   expectedR%   R&   (    (    sN   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_identitysearch.pyt   test_generate_gate_rules_2X   s    !""&""""""$" c    	      C   s  t  ƒ  \ }  } } } t |  f ƒ |  f h k s6 t ‚ t |  |  f ƒ |  |  f h k s] t ‚ t |  | f ƒ |  | f | |  f h k s t ‚ |  | | f } t |  | | f | | |  f | |  | f | | |  f | |  | f |  | | f g ƒ } t | ƒ | k st ‚ t t |  | | ƒ t | | |  ƒ t | |  | ƒ t | | |  ƒ t | |  | ƒ t |  | | ƒ g ƒ } t | d t ƒ| k sŒt ‚ |  | | | f } t |  | | | f | | | |  f | |  | | f | | | |  f | | |  | f | |  | | f | | |  | f |  | | | f g ƒ } t | ƒ | k s:t ‚ |  | |  | f } |  | |  | f | |  | |  f h } t | ƒ | k sˆt ‚ t d | ƒ } | | | | f } | | | | f | | | | f h } t | ƒ | k såt ‚ t d d ƒ } t d t d ƒ ƒ } | | | | f } t | | | | f | | | | f | | | | f | | | | f g ƒ } t | ƒ | k s{t ‚ d  S(   NR   i   i    (   i   (   i    (	   R   R   R   R   R   R   R   R	   R   (	   R   R    R!   R"   t   gate_seqt   gate_idst   cgate_yt   cnott   cgate_z(    (    sN   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_identitysearch.pyt   test_generate_equivalent_ids_1­   s<    !'03!06!'$$!'c    	   
   C   sx  t  ƒ  \ }  } } } t |  f d t ƒ|  h k s9 t ‚ t d ƒ h } t |  |  d t ƒ| k sj t ‚ |  | | |  h } t |  | d t ƒ| k s  t ‚ |  | f | |  f h } t |  | ƒ | k sÔ t ‚ t |  | | f Œ  } t |  | | | | |  | |  | | | |  | |  | |  | | g ƒ } t | d t ƒ| k sUt ‚ t |  | | | f Œ  } t |  | | | | | | |  | |  | | | | | |  | | |  | | |  | | | | |  | |  | | | g ƒ } t | d t ƒ| k st ‚ t |  | |  | f Œ  } |  | |  | | |  | |  h } t | d t ƒ| k sit ‚ t d | ƒ } t | | | | f Œ  } | | | | | | | | h } t | d t ƒ| k sÒt ‚ t d d ƒ } t d t	 d ƒ ƒ } t | | | | f Œ  } t | | | | | | | | | | | | | | | | g ƒ } t | d t ƒ| k stt ‚ d  S(   NR   i   i    (   i   (   i    (
   R   R   R   R   R   R   R   R   R	   R   (	   R   R    R!   R"   R,   t   circuitR-   R.   R/   (    (    sN   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_identitysearch.pyt   test_generate_equivalent_ids_2Ö   s>    $""/!'$$!'c          C   sY  d }  t  } t d ƒ f } t | |  | ƒ } | t k s? t ‚ t d ƒ } | | f } t | |  | ƒ } | t k s{ t ‚ t d ƒ } t d ƒ } | | f } t | |  | ƒ } | t  k sÃ t ‚ t d ƒ }	 | | |	 f }
 t |
 |  | ƒ } | t k st ‚ t d d ƒ } | | f } t | |  | ƒ } | t k sAt ‚ t	 d ƒ } | | f } t | |  | ƒ } | t k s}t ‚ t	 d ƒ } | | |	 | f } t | |  | ƒ } | t k s¿t ‚ t } t | |  | ƒ } | t k sét ‚ t |
 |  | ƒ } | t  k st ‚ t | |  | ƒ } | t k s1t ‚ t | |  | ƒ } | t k sUt ‚ d  S(   Ni   i   i    (
   R(   R
   R   R   R   R   R   R   R	   R   (   t	   numqubitst   id_onlyt   id_gateR&   t   x0t
   xx_circuitt   x1t   y1t
   xy_circuitt   z1t   xyz_circuitR.   t   cnot_circuitR"   t
   hh_circuitt   h1t   xhzh_circuit(    (    sN   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_identitysearch.pyt   test_is_scalar_nonsparse_matrix  sN    c          C   se  t  d ƒ }  |  s t d ƒ n  t  d d i d g d 6ƒ} | sN t d ƒ n  d } t } t d	 ƒ f } t | | | ƒ t k s‡ t ‚ t d
 ƒ } | | f } t | | | ƒ t k s½ t ‚ t d	 ƒ } t d	 ƒ } | | f }	 t |	 | | ƒ t k sÿ t ‚ t	 d	 ƒ }
 | | |
 f } t | | | ƒ t k s8t ‚ t
 d	 d
 ƒ } | | f } t | | | ƒ t k sqt ‚ t d
 ƒ } | | f } t | | | ƒ t k s§t ‚ t d	 ƒ } | | |
 | f } t | | | ƒ t k sãt ‚ t } t | | | ƒ t k st ‚ t | | | ƒ t k s%t ‚ t | | | ƒ t k sCt ‚ t | | | ƒ t k sat ‚ d  S(   Nt   numpys   numpy not installed.t   scipyt   __import__kwargst   sparset   fromlists   scipy not installed.i   i   i    (   R    R   R(   R
   R   R   R   R   R   R   R	   R   (   t   npRC   R3   R4   R5   R6   R7   R8   R9   R:   R;   R<   R.   R=   R"   R>   R?   R@   (    (    sN   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_identitysearch.pyt   test_is_scalar_sparse_matrix4  sD    c          C   s^   t  ƒ  \ }  } } } t |  | | ƒ } | h } | | |  f } t | | ƒ t k sZ t ‚ d  S(   N(   R   R   R   R   R   (   R   R    R!   R"   t   gate_idt   idst
   another_id(    (    sN   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_identitysearch.pyt   test_is_degeneratef  s
    	c          C   s  d }  t  ƒ  \ } } } } | | | f } t | |  d d ƒ t k sK t ‚ | | | f } t | |  d d ƒ t k s{ t ‚ | | | | f } t | |  d d ƒ t k s® t ‚ | | | | f } t | |  d d ƒ t k sá t ‚ | | | | | f } t | |  d d ƒ t k st ‚ d  S(   Ni   i   i   i    i   i   (   R   R   R   R   R(   (   t   nqubitsR   R    R!   R"   R1   (    (    sN   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_identitysearch.pyt   test_is_reduciblep  s    !!!!c          C   s
  t  g  d ƒ t ƒ  k s t ‚ t ƒ  \ }  } } } |  g } t |  |  ƒ h } t  | d d d ƒ| k so t ‚ |  | | g } t t |  |  ƒ t | | ƒ t | | ƒ t |  | | ƒ g ƒ } t  | d ƒ | k sØ t ‚ t t |  |  ƒ t | | ƒ t | | ƒ t |  | | ƒ t |  | |  | ƒ t |  | |  | ƒ t | | | | ƒ g ƒ } t  | d d d ƒ| k snt ‚ t  | d d d ƒ| k st ‚ |  | | | g } t t |  |  ƒ t | | ƒ t | | ƒ t | | ƒ t |  | | ƒ t |  | |  | ƒ t |  | |  | ƒ t |  | | | ƒ t | | | | ƒ t | | | | ƒ g
 ƒ } t  | d ƒ | k sat ‚ t t |  |  ƒ t | | ƒ t | | ƒ t | | ƒ g ƒ } | t  | d d d d t ƒk sÄt ‚ t t |  |  ƒ t | | ƒ t | | ƒ t | | ƒ t |  | | ƒ t |  | |  | ƒ t |  | |  | ƒ t |  | | | ƒ t | | | | ƒ t | | | | ƒ t |  | | |  | ƒ t |  | | | | ƒ t | | | | | ƒ g ƒ } t  | d d d ƒ| k sÉt ‚ t t |  |  ƒ t | | ƒ t | | ƒ t | | ƒ t |  | | | ƒ g ƒ } | t  | d d d d t ƒk s>t ‚ t d d ƒ } |  | g } t t |  |  ƒ t | | ƒ t |  | |  | ƒ g ƒ } t  | d d d ƒ| k s°t ‚ t d	 |  ƒ } |  | g } t t |  |  ƒ t | | ƒ t |  | |  | ƒ g ƒ } t  | d d d ƒ| k s"t ‚ t d
 t d ƒ ƒ } | | | g } t t | | ƒ t | | ƒ t | | ƒ t | | | | ƒ g ƒ } t  | d d d ƒ| k s©t ‚ t	 d ƒ }	 t
 d ƒ }
 |	 |
 g } t |	 |	 |	 |	 ƒ h } t  | d d d ƒ| k st ‚ d  S(   Ni   t	   max_depthi   i   i   i   t   identity_onlyi    (   i   (   i    (   R   R   R   R   R   R   R	   R   R   R   R   (   R   R    R!   R"   t	   gate_listt   id_setR.   t   cgate_xR/   t   st   t(    (    sN   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_identitysearch.pyt   test_bfs_identity_search„  s¦    	!!!!!!!c          C   s™   t  d d i d g d 6ƒ}  |  r/ t d ƒ n  t d ƒ } t d ƒ } t | ƒ | g } t t | ƒ | | ƒ h } t | d d d	 ƒ| k s• t ‚ d  S(
   NRC   RD   RE   RF   s   scipy installed.i    i   RO   i   (   R    R   R   R   R   R   R   R   (   RC   RT   RU   RQ   RR   (    (    sN   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_identitysearch.pyt   test_bfs_identity_search_xfailé  s    N(*   t   sympy.externalR    t   sympyR   R   t   sympy.core.compatibilityR   t   sympy.physics.quantum.daggerR   t   sympy.physics.quantum.gateR   R   R   R   R	   R
   R   R   R   t$   sympy.physics.quantum.identitysearchR   R   R   R   R   R   R   R   t   sympy.utilities.pytestR   R   R   R'   R*   R0   R2   RA   RH   RL   RN   RV   RW   (    (    (    sN   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_identitysearch.pyt   <module>   s&   @:	E	U	)	,	2	2	
		e	