ó
¡¼™\c           @   s  d  d l  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 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 „ Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z e d „  ƒ Z  e d „  ƒ Z! d S(   iÿÿÿÿ(   t   Symbolt   Integert   Mul(   t   numbered_symbols(   t   Xt   Yt   Zt   Ht   CNOTt   CGate(   t   bfs_identity_search(   t	   kmp_tablet   find_subcircuitt   replace_subcircuitt   convert_to_symbolic_indicest   convert_to_real_indicest   random_reducet   random_insertt   flatten_ids(   t   slowi    c         C   s.   t  |  ƒ t |  ƒ t |  ƒ t |  ƒ f } | S(   N(   R   R   R   R   (   t   qubitt   gates(    (    sL   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_circuitutils.pyt   create_gate_sequence   s    *c          C   s]  d }  d d d d d d d g } | t  |  ƒ k s9 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 s¥ t ‚ 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 sYt ‚ d  S(   Nt   at   bt   ct   diÿÿÿÿi    i   i   t   Pt   At   Rt   Tt   It   Ct   Et    t   NR   t   Ui   (   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   t   AssertionErrorR   R   R   R   (   t   wordt   expected_tablet   xt   yt   zt   h(    (    sL   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_circuitutils.pyt   test_kmp_table   s$     $*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 s± t ‚ 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 sVt ‚ t | t | | ƒ ƒ d k szt ‚ t t | Œ  |  | | | f ƒ d k s§t ‚ t t | Œ  | | |  f ƒ d k sÑt ‚ t | |  f d d d d ƒd k sût ‚ |  | |  | | f } t t | Œ  t |  | | ƒ ƒ d k s=t ‚ t | |  f d d ƒd k sat ‚ t | |  | f d d d d ƒd k sŽt ‚ t t | Œ  |  | f d d d d ƒd k sÁt ‚ t | |  | f d d d d	 ƒd k sît ‚ t | |  | f d 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(   Ni    i   t   i0iÿÿÿÿt   starti   t   endi   i   i   (   R   R   R   R   R    R   R%   R   (   R(   R)   R*   R+   t   x1t   y1R-   t   x_i0t   y_i0t   z_i0t   h_i0t   circuitt
   subcircuitt   result(    (    sL   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_circuitutils.pyt   test_find_subcircuit)   sL    $'$-**-$-3--!*$c    
      C   sƒ  t  d ƒ }  t d ƒ } t d ƒ } t d ƒ } t d d ƒ } t d t d ƒ ƒ } | | |  |  f } | | |  f } t | t | Œ  ƒ |  f k s™ t ‚ 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 sKt ‚ |  | |  | | f } |  | | f } t t | Œ  t | Œ  ƒ |  | f k sœt ‚ |  | |  | f } t | | ƒ | f k sÌt ‚ |  | | | | f } |  | | f } t | t | Œ  d d ƒ| | f k st ‚ t | | d d ƒ| k s>t ‚ | | f } t | | ƒ | k set ‚ | | | | f } t | | ƒ |  f k s•t ‚ | |  f } t | | d | ƒ}	 |	 |  | |  f k sÑt ‚ |  | | |  | | f } |  | f } | | f } t | | d t | Œ  ƒ}	 |	 | | | |  | | f k s@t ‚ t | | d | d d ƒ}	 |	 |  | | | | | f k st ‚ d  S(	   Ni    i   t   posi   iÿÿÿÿt   replace(   i    (    (	   R   R   R   R   R   R	   R   R   R%   (
   R(   R)   R*   R+   t   cnott   cgate_zR6   t   removeR;   t   actual(    (    sL   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_circuitutils.pyt   test_replace_subcircuitY   sP    $"!$---!	$c          C   sn
  t  ƒ  \ }  } } } t d ƒ } i t d ƒ | 6} t |  f ƒ \ } } } }	 | t | ƒ f k sj t ‚ | | k s| t ‚ t | ƒ t | ƒ t | ƒ t | ƒ f }
 i t d ƒ | 6} t |  | | | f ƒ \ } } } }	 | |
 k sï t ‚ | | k st ‚ t  d ƒ \ } } } } t d ƒ } t | ƒ t | ƒ t | ƒ t | ƒ f }
 i t d ƒ | 6} t | | | | f ƒ \ } } } }	 | |
 k s˜t ‚ | | k sªt ‚ t | ƒ t | ƒ t | ƒ t | ƒ t | ƒ t | ƒ t | ƒ t | ƒ f }
 i t d ƒ | 6t d ƒ | 6} t |  | | | | | | | f ƒ \ } } } }	 | |
 k sZt ‚ | | k slt ‚ i t d ƒ | 6t d ƒ | 6} t t	 | | | | |  | | | ƒ ƒ \ } } } }	 | |
 k sÑt ‚ | | k sãt ‚ t | ƒ t | ƒ t | ƒ t | ƒ t | ƒ t | ƒ t | ƒ t | ƒ f }
 i t d ƒ | 6t d ƒ | 6} t t	 |  | | | | | | | ƒ ƒ \ } } } }	 | |
 k s–t ‚ | | k s¨t ‚ i t d ƒ | 6t d ƒ | 6} 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 }
 i t d ƒ | 6t d ƒ | 6} |  | | | | | | | | | | | f } t | ƒ \ } } } }	 | |
 k sbt ‚ | | k stt ‚ | |  | | | | | | | | | | f } t | ƒ t | ƒ t | ƒ t | ƒ t | ƒ t | ƒ t | ƒ t | ƒ t
 | | ƒ t
 | | ƒ t | t | ƒ ƒ t | t | ƒ ƒ f }
 i t d ƒ | 6t d ƒ | 6} t | ƒ \ } } } }	 | |
 k srt ‚ | | k s„t ‚ | | | | f } t
 | | ƒ t | ƒ t | t | ƒ ƒ t | ƒ f }
 i t d ƒ | 6t d ƒ | 6} t | ƒ \ } } } }	 | |
 k st ‚ | | k s(t ‚ | | | | f } i t d ƒ | 6t d ƒ | 6} t | ƒ \ } } } }	 | |
 k s„t ‚ | | k s–t ‚ | | | | f } t
 | | ƒ t | ƒ t | t | ƒ ƒ t | ƒ f }
 i t d ƒ | 6t d ƒ | 6} 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 }
 i t d ƒ | 6t d ƒ | 6t d ƒ | 6} t | ƒ \ } } } }	 | |
 k s!	t ‚ | | k s3	t ‚ i t d ƒ | 6} t d d d	 d ƒ } t | d
 | d	 | d | ƒ\ } } } }	 | |
 k s—	t ‚ | | k s©	t ‚ t d ƒ } t d t d ƒ ƒ } i t d ƒ | 6t d ƒ | 6t d ƒ | 6t d ƒ | 6} t | | | f t | ƒ ƒ f }
 | f } t | ƒ \ } } } }	 | |
 k sX
t ‚ | | k sj
t ‚ d  S(   NR-   i    i   t   i1t   i2i   t   prefixt   iR.   t	   qubit_mapt   gent   i3i   (   i   i   i   (   R   R    R   R   R   R%   R   R   R   R   R   R	   R   (   R(   R)   R*   R+   R-   t   exp_mapR?   t   act_mapt   sndxRF   t   expectedR0   R1   t   z1t   h1RA   t   cnot_10t   cnot_01t
   cgate_z_10t
   cgate_z_01t   argsRB   t   ccgate_zt   ccgate_xt   ndx_mapt	   index_genRG   t   cgate_x0_c321(    (    sL   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_circuitutils.pyt    test_convert_to_symbolic_indices‹   sÒ    *$*$N ! 'N ' !6** 6** 6  6 <-	!	c          C   sf  t  d ƒ }  t  d ƒ } t ƒ  \ } } } } t |  ƒ } t |  ƒ } t |  ƒ } i d |  6}	 | | | f }
 | | | f } t |
 |	 ƒ } | | k s t ‚ t d d ƒ } t d d ƒ } t d t d ƒ ƒ } t d t d ƒ ƒ } t | |  ƒ } t |  | ƒ } t | t |  ƒ ƒ } i d |  6d | 6}	 | f }
 | f } t |
 |	 ƒ } | | k s_t ‚ | f }
 | f } t |
 |	 ƒ } | | k s’t ‚ | f }
 | f } t |
 |	 ƒ } | | k sÅt ‚ i d |  6d | 6}	 | f }
 | f } t |
 |	 ƒ } | | k st ‚ t  d ƒ } t |  t | t | ƒ ƒ ƒ } t | t | t |  ƒ ƒ ƒ } i d |  6d | 6d | 6}	 | | f }
 t d t d t d ƒ ƒ ƒ t d t d t d ƒ ƒ ƒ f } t t	 |
 Œ  |	 ƒ } | | k sÞt ‚ i d |  6d | 6d | 6}	 | | f }
 t d t d t d ƒ ƒ ƒ t d t d t d ƒ ƒ ƒ f } t |
 |	 ƒ } | | k sbt ‚ d  S(   NR-   RA   i    i   RB   i   (
   R    R   R   R   R   R   R%   R   R	   R   (   R-   RA   R(   R)   R*   R+   R2   R3   R4   RE   RR   RK   R?   RN   RO   RP   RQ   t
   cnot_i1_i0t
   cnot_i0_i1t   cgate_z_i1_i0RB   RS   RT   (    (    sL   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_circuitutils.pyt   test_convert_to_real_indices	  sb    								<<c       
   C   sk  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 s® t	 ‚ t | | ƒ | k sÉ t	 ‚ d d d d d	 g }	 |  | | |  | | f } t | | d
 |	 ƒ|  | | f k s t	 ‚ |  |  | | | | f } t | | d
 |	 ƒ|  |  | | f k se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 sgt	 ‚ d  S(   Ni    i   t	   max_depthi   i   i   i	   i   i   t   seedi   i   i   (   i    (   R   R   R   R   R   R	   t   listR
   R   R%   R   (   R(   R)   R*   R+   R<   R=   t	   gate_listt   idsR6   t   seqRK   (    (    sL   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_circuitutils.pyt   test_random_reduceI  s4    *--	$!c       	   C   s   t  d ƒ }  t d ƒ } t d ƒ } t d ƒ } t d d ƒ } t d t d ƒ ƒ } |  |  f g } | | f } d	 \ } }	 t | | d | |	 g ƒ}
 |
 |  |  | | f k s´ t ‚ |  | | | f } | | f |  | | f g } |  |  | | | | | f } d
 \ } }	 t | | d | |	 g ƒ}
 |
 | k s5t ‚ |  | | | | | g } t t	 | d d d ƒƒ } t
 | ƒ } |  | | | | f } |  | |  | |  | | | | f	 } d \ } }	 t | | d | |	 g ƒ}
 |
 | k sãt ‚ t | Œ  } t | | d | |	 g ƒ}
 |
 | k st ‚ d  S(   Ni    i   R^   i   R]   i   i   (   i    (   i    i    (   i   i   (   i   i   (   R   R   R   R   R   R	   R   R%   R_   R
   R   R   (   R(   R)   R*   R+   R<   R=   t   choicesR6   t   loct   choiceR?   RK   R`   Ra   t   eq_ids(    (    sL   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_circuitutils.pyt   test_random_insertn  s8    !N("   t   sympyR    R   R   t   sympy.utilitiesR   t   sympy.physics.quantum.gateR   R   R   R   R   R	   t$   sympy.physics.quantum.identitysearchR
   t"   sympy.physics.quantum.circuitutilsR   R   R   R   R   R   R   R   t   sympy.utilities.pytestR   R   R,   R9   R@   RX   R\   Rc   Rh   (    (    (    sL   lib/python2.7/site-packages/sympy/physics/quantum/tests/test_circuitutils.pyt   <module>   s   .:		0	2	~	@%