
    z	iJ                    l    S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	r	  SSK
Jr  SSKJr   " S	 S
5      rg)z-
Multi-partite matrix and vector shape class
    )annotationsN)reduce)mul)log2)Integral)QiskitErrorc                  d   \ rS rSrSrS!S jr\S 5       rS rS r	S r
\S	 5       r\S
 5       r\S 5       r\S 5       r\S 5       r\S 5       rS"S jrS"S jr\S 5       r\S 5       rS rS#S jr\       S$S j5       rS%S jrS%S jrS rS rS rS r\S 5       rS&S jr S"S jr!S"S jr"S r#g)'OpShape   z+Multipartite matrix and vector shape class.Nc                ^   SU l         SU l        SU l        SU l        U(       a  [	        U5      U l        U(       a*  [        U5      U l        [        U R                  5      U l        U(       a  [	        U5      U l         U(       a+  [        U5      U l        [        U R                  5      U l         gg)zInitialize an operator object.r   N)_num_qargs_l_num_qargs_r_dims_l_dims_rinttuplelen)selfdims_ldims_rnum_qargs_lnum_qargs_rs        `/home/james-whalen/.local/lib/python3.13/site-packages/qiskit/quantum_info/operators/op_shape.py__init__OpShape.__init__   s     
   #K 0D =DL #DLL 1D #K 0D =DL #DLL 1D     c                `    U R                   U R                  U R                  U R                  S.$ )z5Return the settings of the ``OpShape`` as dictionary.r   r   r   r   r   r   r   r   r   s    r   settingsOpShape.settings6   s.     llll,,,,	
 	
r   c                b   U R                   (       a  SU R                    3nO#U R                  (       a  SU R                   3nOSnU R                  (       a  SU R                   3nO#U R                  (       a  SU R                   3nOSnU(       a  U(       a  U SU 3nOU(       a  UnOUnSU S3$ )	Nzdims_l=znum_qargs_l= zdims_r=znum_qargs_r=z, zOpShape())r   r   r   r   )r   leftrightinners       r   __repr__OpShape.__repr__@   s    <<T\\N+D!$"3"3!45DD<<dll^,E"4#4#4"56EEEfBug&EEE%""r   c                    [        U[        5      (       d  gU R                  UR                  :H  =(       aY    U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R
                  UR
                  :H  $ )z.Check types and subsystem dimensions are equalF)
isinstancer
   r   r   r   r   r   others     r   __eq__OpShape.__eq__U   sp    %))!3!33 .!!U%7%77.-. -		
r   c                .    [         R                   " U 5      $ )z%Make a deep copy of current operator.)copyr    s    r   r2   OpShape.copy`   s    yyr   c                4    U R                   U R                  -  $ )z,Return the combined dimensions of the object)_dim_l_dim_rr    s    r   sizeOpShape.sized   s     {{T[[((r   c                    U R                   (       d  U R                  (       a  gU R                  (       a8  U R                  (       a  U R                  U R                  :w  a  gU R                  $ U R                  $ )zRReturn number of qubits if shape is N-qubit.

If Shape is not N-qubit return None
Nr   r    s    r   
num_qubitsOpShape.num_qubitsi   sT     <<4<<  T%6%6$:K:K%K$$$   r   c                2    U R                   U R                  4$ )z4Return a tuple of the number of left and right wires)r   r   r    s    r   	num_qargsOpShape.num_qargsw   s       $"3"333r   c                    U R                   U R                  s=:X  a  S:X  a   g  U R                  (       d  U R                  4$ U R                  U R                  4$ )z"Return a tuple of the matrix shaper   )   r@   )r   r   r5   r6   r    s    r   shapeOpShape.shape|   sO      1 16Q6 7   KK>!{{DKK''r   c                    [        [        U R                  5       5      5      [        [        U R                  5       5      5      -   $ )z"Return a tuple of the tensor shape)r   reversedr   r   r    s    r   tensor_shapeOpShape.tensor_shape   s/     Xdkkm,-ht{{}6M0NNNr   c                t    U R                   U R                  :H  =(       a    U R                  U R                  :H  $ )z7Return True if the left and right dimensions are equal.)r   r   r   r   r    s    r   	is_squareOpShape.is_square   s-       D$5$55V$,,$,,:VVr   c                   ^  T R                   (       a(  U(       a  [        U 4S jU 5       5      $ T R                   $ Uc  T R                  O
[        U5      nUS-  $ )z9Return tuple of input dimension for specified subsystems.c              3  B   >#    U  H  nTR                   U   v   M     g 7fN)r   .0ir   s     r   	<genexpr>!OpShape.dims_r.<locals>.<genexpr>        <eT\\!_e      )r   r   r   r   r   qargsnums   `  r   r   OpShape.dims_r   G    <<<e<<<<<#(=dc%jTzr   c                   ^  T R                   (       a(  U(       a  [        U 4S jU 5       5      $ T R                   $ Uc  T R                  O
[        U5      nUS-  $ )z:Return tuple of output dimension for specified subsystems.c              3  B   >#    U  H  nTR                   U   v   M     g 7frL   )r   rM   s     r   rP   !OpShape.dims_l.<locals>.<genexpr>   rR   rS   rT   )r   r   r   r   rV   s   `  r   r   OpShape.dims_l   rZ   r   c                v    U R                   (       a  [        [        U R                   5      $ SU R                  -  $ z!Return the total input dimension.rU   )r   r   r   r   r    s    r   r6   OpShape._dim_r   -     <<#t||,,$####r   c                v    U R                   (       a  [        [        U R                   5      $ SU R                  -  $ r`   )r   r   r   r   r    s    r   r5   OpShape._dim_l   rb   r   c                "    U R                  USS9$ )z8Raise an exception if shape is not valid for the OpShapeT)raise_exception)	_validate)r   rA   s     r   validate_shapeOpShape.validate_shape   s    ~~eT~::r   c                   [        U5      nUS:  a  U(       a  [        SU S35      egU R                  (       aW  [        [        U R                  5      US   :w  a5  U(       a-  [        S[        [        U R                  5       SUS    S35      egO)US   SU R
                  -  :w  a  U(       a  [        S5      egUS:X  a  U R                  (       aX  [        [        U R                  5      US	   :w  a5  U(       a-  [        S
[        [        U R                  5       SUS	    S35      eg gUS	   SU R                  -  :w  a  U(       a  [        S5      eg gU R                  (       d  U R                  (       a  U(       a  [        S5      egg)z2Validate OpShape against a matrix or vector shape.rU   z/Input shape is not 1 or 2-dimensional (shape = r%   Fr   z-Output dimensions do not match matrix shape ( != z1Number of left qubits does not match matrix shaper@   z,Input dimensions do not match matrix shape (z2Number of right qubits does not match matrix shapez1Input dimension should be empty for vector shape.T)r   r   r   r   r   r   r   r   )r   rA   rf   ndims       r   rg   OpShape._validate   s    5z!8!$STYSZZ["\]]<<c4<<(E!H4"%"356d58*AG   5 1XD----!"UVV19||#t||,a8&)  &sDLL 9:$uQxjK  ! 9   qQ 1 111"%&Z[[ 2  \\T..!"UVVr   c                H   U(       a  U(       d  U(       a  [        S5      eU(       a  U(       d  U(       a  [        S5      eU(       a  UnUnU(       a  UnUnU(       a  U(       a  U " XeS9nGOU(       a  [        U5      OSn	Uc  Uc  U	S:  a  US   nUc  Uc  U	S:  a  US   nUcm  [        U[        5      (       a,  US:w  a"  X3S-
  -  S:X  a  [	        [        U5      5      nSnO0U4nO,Ub)  [        U5      S1:X  a  [        U5      nSnO[        U5      nUcm  [        U[        5      (       a,  US:w  a"  X"S-
  -  S:X  a  [	        [        U5      5      nSnO0U4nO,Ub)  [        U5      S1:X  a  [        U5      nSnO[        U5      nU " X#XVS9nU(       a  UR                  U5        U$ )	zAConstruct TensorShape with automatic checking of qubit dimensionsz5`dims` kwarg cannot be used with `dims_l` or `dims_r`zG`num_qubits` kwarg cannot be used with `num_qubits_l` or `num_qubits_r`)r   r   r   Nr@   rU   r   )	r   r   r,   r   r   r   setr   rh   )
clsrA   r   r   dimsnum_qubits_lnum_qubits_rr:   matrix_shaperl   s
             r   autoOpShape.auto   s    VvUVV<<Y  %L%LFFL<RL!&3u:AD~,"64!8q~,"64!8q#fh//{1*(=(B'*4<'8!%"('6{qc)'*6{!%!&v#fh//{1*(=(B'*4<'8!%"('6{qc)'*6{!%!&v,L ''.r   c                   U(       a?  U(       d  U(       a  [        S5      eU R                  (       a  UnU R                  (       a  Un[        U[        5      (       a  U4n[        U[        5      (       a  U4nU(       a$  [        U5      U R                  :  a  [        S5      eU(       a$  [        U5      U R                  :  a  [        S5      eSnSnU(       a-  [        U5      nU R                  (       a  U R                  U5      nSnSnU(       a-  [        U5      nU R                  (       a  U R                  U5      n[        XWXFS9$ )z1Return the reduced OpShape of the specified qargs1qargs cannot be specified with qargs_l or qargs_r/Max qargs_l is larger than number of left qargs0Max qargs_r is larger than number of right qargsr   Nr   )r   r   r   r,   r   maxr   r   r   r   r   r
   r   rW   qargs_lqargs_rr   r   r   r   s           r   subsetOpShape.subset(  s   '!"UVV     gx((jGgx((jG s7|t'8'88OPPs7|t'8'88PQQg,K||U+g,K||U+k
 	
r   c                  ^^ U(       a?  T(       d  T(       a  [        S5      eU R                  (       a  UmU R                  (       a  UmTc  Tc  U R                  5       $ [	        T[
        5      (       a  T4m[	        T[
        5      (       a  T4mT(       a$  [        T5      U R                  :  a  [        S5      eT(       a$  [        T5      U R                  :  a  [        S5      eSnSnT(       a`  U R                  [        T5      -
  nU R                  (       a7  U R                  [        U4S j[        U R                  5       5       5      5      nSnSnT(       a`  U R                  [        T5      -
  nU R                  (       a7  U R                  [        U4S j[        U R                  5       5       5      5      n[        XWXFS9$ )	z>Return a new :class:`OpShape` with the specified qargs removedrx   Nry   rz   r   c              3  6   >#    U  H  oT;  d  M
  Uv   M     g 7frL    )rN   rO   r}   s     r   rP   !OpShape.remove.<locals>.<genexpr>q       *c6N[bRb116N   		c              3  6   >#    U  H  oT;  d  M
  Uv   M     g 7frL   r   )rN   rO   r~   s     r   rP   r   x  r   r   r   )r   r   r   r2   r,   r   r{   r   r   r   r   ranger   r   r
   r|   s     ``    r   removeOpShape.removeR  s^   '!"UVV    ?w99; gx((jGgx((jG s7|t'8'88OPPs7|t'8'88PQQ++c'l:K||U*ceD<M<M6N*c%cd++c'l:K||U*ceD<M<M6N*c%cdk
 	
r   c                   [         R                   " U 5      nU R                  (       a#  [        [        U R                  5      5      Ul        U R                  (       a#  [        [        U R                  5      5      Ul        U$ )z%Reverse order of left and right qargs)r2   r   r   rD   r   r   rets     r   reverseOpShape.reverse~  sL    iio<< 67CK<< 67CK
r   c                    [         R                   " U 5      nU R                  Ul        U R                  Ul        U R                  Ul        U R                  Ul        U$ )zReturn the transposed OpShape.)r2   r   r   r   r   r   s     r   	transposeOpShape.transpose  sF    iiollll,,,,
r   c                $    U R                  X5      $ )!Return the tensor product OpShape_tensorr-   s     r   tensorOpShape.tensor  s    ||D((r   c                $    U R                  X5      $ )z!Return the expand product OpShaper   r-   s     r   expandOpShape.expand  s    ||E((r   c                   UR                   (       d  UR                   (       a$  UR                  5       UR                  5       -   nSnOSnUR                  UR                  -   nUR                  (       d  UR                  (       a$  UR	                  5       UR	                  5       -   nSnOSnUR
                  UR
                  -   nU " X5XFS9$ )r   Nr   )r   r   r   r   r   r   )rp   abr   r   r   r   s          r   r   OpShape._tensor  s     99		XXZ!((*,FKF..1>>9K99		XXZ!((*,FKF..1>>9K&[bbr   c                "   [        5       nUGcW  U(       a  U R                  UR                  :w  d  U R                  UR                  :w  a.  [        SU R                  5        SUR                  5        S35      eU R                  Ul        UR                  Ul        U R                  Ul        UR                  Ul        U$ U R                  UR                  :w  d  U R                  UR                  :w  a.  [        SU R                  5        SUR                  5        S35      eUR                  Ul        U R                  Ul        UR                  Ul        U R                  Ul        U$ U(       GaR  U R                  Ul        U R                  Ul        [        U5      UR                  :w  a%  [        S[        U5       SUR                   S35      eU R                  (       d  UR                  (       a  U R                  U5      UR                  5       :w  a.  [        SU R                  U5       SUR                  5        35      e[        U R                  5       5      n[        X!R                  5       5       H	  u  pgXuU'   M     [        U5      Ul        [        UR                  5      Ul        U$ U R                  Ul         U$ U R                  Ul        U R                  Ul        [        U5      UR                  :w  a%  [        S[        U5       SUR                   S35      eU R                  (       d  UR                  (       a  U R                  U5      UR                  5       :w  a.  [        SU R                  U5       SUR                  5        35      e[        U R                  5       5      n[        X!R                  5       5       H	  u  pgXxU'   M     [        U5      Ul        [        UR                  5      Ul        U$ U R                  Ul        U$ )zReturn composed OpShape.z/Left and right compose dimensions don't match (rk   r%   z Number of qargs does not match (z4Subsystem dimension do not match on specified qargs )r
   r   r   r   r   r   r   r   r   listzipr   )	r   r.   rW   frontr   r   rO   dimr   s	            r   composeOpShape.compose  sd   i=$$(:(::dllemm>[% KKM?$u||~.>aA  #ll#mm#'#4#4 #(#5#5  J $$(:(::dllemm>[% KKM?$u||~.>aA  $mm"ll#(#5#5 #'#4#4 J,,CK#00C5zU///!6s5zl$uGYGYFZZ[\  ||u}};;u%7%N;;u-.d5<<>2BD  dkkm,!%8FA #1I 9#Fm#&s{{#3 . 
+ $(#4#4 * 
' ,,CK#00C5zU///!6s5zl$uGYGYFZZ[\  ||u}};;u%7%N;;u-.d5<<>2BD  dkkm,!%8FA #1I 9#Fm#&s{{#3  
 $(#4#4 
r   c                "    U R                  XSS9$ )z'Return the dot product operator OpShapeT)r   )r   r   r.   rW   s      r   dotOpShape.dot  s    ||E|55r   c                   U(       a  U R                   U R                  :w  a  [        S5      eU R                  U5      UR                  5       :w  a.  [        SU R                  U5       SUR                  5        35      eU R	                  U5      UR	                  5       :w  a.  [        SU R	                  U5       SUR	                  5        35      e U $ X:w  a~  U R
                  UR
                  :w  a%  [        SU R
                   SUR
                   35      eU R                  UR                  :w  a%  [        SU R                   SUR                   35      eU $ )NzGCannot add using qargs if number of left and right qargs are not equal.zDCannot add shapes width different left dimension on specified qargs rk   zJCannot add shapes width different total right dimension on specified qargsz7Cannot add shapes width different total left dimension z8Cannot add shapes width different total right dimension )r   r   r   r   r   r5   r6   r   s      r   _validate_addOpShape._validate_add  sU     D$5$55!]  {{5!U\\^3!448KK4F3GtELLNK[]  {{5!U\\^3!337;;u3E2Fd5<<>JZ\  4   ]{{ell*!!!%T%,,A  {{ell*!!!%T%,,A  r   r   )NNNNrL   )F)NNNNNNN)NNN)NF)$__name__
__module____qualname____firstlineno____doc__r   propertyr!   r)   r/   r2   r7   r:   r=   rA   rE   rH   r   r   r6   r5   rh   rg   classmethodru   r   r   r   r   r   r   r   r   r   r   __static_attributes__r   r   r   r
   r
      s[   520 
 
#*	
 ) ) ! ! 4 4 	( 	( O O W W $ $ $ $;(T  E EN(
T*
X)) c c BH6r   r
   )r   
__future__r   r2   	functoolsr   operatorr   mathr   numbersr   qiskit.exceptionsr   r
   r   r   r   <module>r      s-    #      )r rr   