
    ,Vh              
       H   d Z ddlmZmZ ddlZddlmZmZmZ ddl	m
Z
  ej                  d      ZddZdd	Zdd
ZddZddZddZddZej(                  j+                  dddgdddgddggdfgdddgddggddgddggfgdddgddggdfgg      dedee   ddfd       Zy)zf
Tets a series of opt_einsum contraction paths to ensure the results are the same for different paths
    )AnyTupleN)contractcontract_expressioncontract_path)PathTypenumpyreturnc            
         t        j                  t              5  t        dddd       d d d        t        j                  t              5  t        dddd       d d d        t        j                  d      } t        j                  t              5  t        ddd|        d d d        t        ddd      }t        j                  t              5 } |t        j                  j                  d	d
             d d d        dt        j                        v sJ t        j                  t              5 } |t        j                  j                  d	d
      t        j                  j                  d	d
      t        j                  j                  d	d
             d d d        dt        |j                        v sJ t        j                  t              5 } |t        j                  j                  d	d
d      t        j                  j                  d
d             d d d        dt        |j                        v sJ t        j                  t              5 } |t        j                  j                  d	d      t        j                  j                  d
dd             d d d        dt        |j                        v sJ t        j                  t              5 } |t        j                  j                  d	d
      t        j                  j                  d
d      t        j                  j                  d	dd             d d d        dt        |j                        v sJ t        j                  t              5 } |t        j                  j                  d	d
      t        j                  j                  d
d      d       d d d        dt        j                        v sJ y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   WxY w# 1 sw Y   xY w# 1 sw Y   }xY w# 1 sw Y   	xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)N	ab,bc->ac)      )r      Foptimize)*   r   )r   r   )outr   r   z$`ContractExpression` takes exactly 2r   z4Internal error while evaluating `ContractExpression`      F)orderzgot an unexpected keyword)pytestraises
ValueErrorr   npemptyrandomrandstrvalue	TypeError)r   exprerrerr_types       P/home/dcms/DCMS/lib/python3.12/site-packages/opt_einsum/tests/test_edge_cases.pytest_contract_expression_checksr&      s3   	z	" IK%HI 
z	" CKBC ((6
C	z	" BKSAB {FF;D 
z	" #cRYY^^Aq!"#1S^CCC 
z	" OcRYY^^Aq!299>>!Q#719MNO1S^CCC 
z	" <cRYY^^Aq!$biinnQ&:;<AS^SSS	z	" <cRYY^^Aq!299>>!Q#:;<AS^SSS	z	" VcRYY^^Aq!299>>!Q#7RYY^^AqRS=TUVAS^SSS 
y	! DXRYY^^Aq!299>>!Q#7sCD&#hnn*====OI IC C
B B# #
O O
< << <V V
D Dsp   OO(O5'P/A%PAPAP)A'P61AQO%(O25O?PPP&)P36Q Qc                  "   t         j                  j                  ddd      } t         j                  j                  dd      }t         j                  j                  dd      }t         j                  j                  d      }t        d| ||d      }t        d| ||d	      }t         j	                  ||      sJ ||z  }t        d
| |||d      }t        d
| |||d	      }t         j	                  ||      sJ t         j	                  ||      sJ y )N   r   r   r   
   z	ijk,kl,jlFr   Tzijk,kl,jl,i->ir   r   r   r   allclose	abcd
ein_scalar
opt_scalarresulteinopts	            r%   test_broadcasting_contractionr6   <   s    
		q!QA
		q!A
		q!A
		rA+q!Q?J+q!Q>J;;z:...!^F
#Q1a%
@C
#Q1a$
?C;;sF###;;sF###    c                  &   t         j                  j                  dddd      } t         j                  j                  dd      }t         j                  j                  dd      }t         j                  j                  dd      }t        d| ||d      }t        d| ||d	      }t         j	                  ||      sJ ||z  }t        d
| |||d      }t        d
| |||d	      }t         j	                  ||      sJ t         j	                  ||      sJ y )Nr(   r   r   r      z
abjk,kl,jlFr   Tzabjk,kl,jl,ab->abr*   r,   s	            r%   test_broadcasting_contraction2r:   O   s    
		q!Q"A
		q!A
		q!A
		q!A,1a%@J,1a$?J;;z:...!^F
&1aU
CC
&1aT
BC;;sF###;;sF###r7   c                  |   t         j                  j                  ddd      } t         j                  j                  ddd      }t         j                  j                  dd      }t         j                  j                  dd      }t        d| |||d      }t        d| |||d	      }t         j	                  ||      sJ y )
Nr(   r   r   r   r9   zajk,kbl,jl,ab->abFr   Tr*   )r-   r.   r/   r0   r4   r5   s         r%   test_broadcasting_contraction3r<   b   s    
		q!QA
		q!QA
		q!A
		q!A
&1aU
CC
&1aT
BC;;sC   r7   c                      t         j                  d      j                  ddd      } t        d| | d      }t        d| | d      }t         j	                  ||      sJ y )	N@   r   r      zobk,ijk->iojFr   T)r   arangereshaper   r+   )r-   r4   r5   s      r%   test_broadcasting_contraction4rB   n   sR    
		"aA&A
>1a%
8C
>1a$
7C;;sC   r7   c                      t        dddd      } | j                  d   d   dk(  sJ | j                  d   d   d	u sJ | j                  d
   d   dk(  sJ | j                  d
   d   dk(  sJ y )Nzab,bc,bd->acd)r   r   )r(   r   )r      r   r   z
bc,ab->bcaFr(   zbca,bd->acdGEMM)r   contraction_list)r"   s    r%   ,test_can_blas_on_healed_broadcast_dimensionsrH   v   s    HD  #A&,666  #B'5000  #A&-777  #B'6111r7   c                  p    d} d}g }t        | g|d|i\  }}t        |      sJ |j                  dk(  sJ y )Nz->)g      ?r   r(   )r   reprlargest_intermediate)eqarrayspath_infos        r%   #test_pathinfo_for_empty_contractionrQ      sI    	BFDB77$7GAt::$$)))r7   zexpression, operandsz,,->)r   g      @               @zab,->r   g       @r(   rR   r   g      @r   T
expressionoperandsc                 ~    t        j                  | g| }t        | g|ddi}t         j                  ||      sJ y)zTest that we can contract with assumed shapes, and that the output is correct. This is required as we need to infer intermediate shape sizes.r   TN)r   einsumr   r+   )rS   rT   	benchmarkr3   s       r%   !test_contract_with_assumed_shapesrX      s?     		*0x0Ij;8;d;F;;y&)))r7   )r
   N)__doc__typingr   r   r   
opt_einsumr   r   r   opt_einsum.typingr   importorskipr   r&   r6   r:   r<   rB   rH   rQ   markparametrizer   rX    r7   r%   <module>ra      s      C C & V!)>X$&$&	!!2* 	 	QFS!H%t,-	Aa)S!HsAh+?@A	QFS!H%t,-	*# *s *PT **r7   