U
    ZÊ¹jc  ã                   @   sŒ   d dl Z d dlmZ d dlmZ d dlmZ d dlm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eedœdd„ZdS )é    N)Údefaultdict)ÚPermutation)ÚTuple)ÚIntegerc                 C   s@   i }d}t | ƒD ]*\}}t|ƒD ]}||f||< |d7 }q q|S )Nr   é   )Ú	enumerateÚrange)ÚsubranksÚmappingÚcounterÚiZrankÚj© r   úc/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/tensor/array/expressions/utils.pyÚ_get_mapping_from_subranks	   s    r   c           
         sv   t |ƒ‰ ‡ fdd„|D ƒ}ttƒ}|D ]B}t|ƒdkr&|\\}}\}}	||	f|| |< ||f|| |	< q&q&| t|ƒfS )Nc                    s   g | ]}‡ fd d„|D ƒ‘qS )c                    s   g | ]}ˆ | ‘qS r   r   )Ú.0r   ©r
   r   r   Ú
<listcomp>   s     z5_get_contraction_links.<locals>.<listcomp>.<listcomp>r   ©r   r   r   r   r   r      s     z*_get_contraction_links.<locals>.<listcomp>é   )r   r   ÚdictÚlen)
Úargsr	   Zcontraction_indicesZcontraction_tuplesZdlinksÚlinksZarg1Zpos1Zarg2Úpos2r   r   r   Ú_get_contraction_links   s    r   c                 C   s"   dd„ | D ƒ} | j dd„ d� | S )Nc                 S   s   g | ]}t t|ƒŽ ‘qS r   )r   Úsortedr   r   r   r   r   "   s     z-_sort_contraction_indices.<locals>.<listcomp>c                 S   s   t | ƒS ©N)Úmin©Úxr   r   r   Ú<lambda>#   ó    z+_sort_contraction_indices.<locals>.<lambda>©Úkey)Úsort)Zpairing_indicesr   r   r   Ú_sort_contraction_indices!   s    r&   c                    s¢   t tƒ‰ tˆƒD ]&\}}t|ttfƒr(qˆ |  |¡ qdd„ ˆ  ¡ D ƒ‰ ‡ fdd„ˆD ƒ}tˆ ƒ}|j‡fdd„d� ‡ fdd„|D ƒ}||7 }t	|ƒ}||fS )	Nc                 S   s"   i | ]\}}t |ƒd kr||“qS )r   ©r   )r   ÚkÚvr   r   r   Ú
<dictcomp>.   s       z)_get_diagonal_indices.<locals>.<dictcomp>c                    s   g | ]}|ˆ kr|‘qS r   r   r   ©Úaxes_contractionr   r   r   0   s      z)_get_diagonal_indices.<locals>.<listcomp>c                    s
   ˆ   | ¡S r   )Úindexr   )Úflattened_indicesr   r   r!   2   r"   z'_get_diagonal_indices.<locals>.<lambda>r#   c                    s   g | ]}t ˆ | ƒ‘qS r   )Útupler   r+   r   r   r   3   s     )
r   Úlistr   Ú
isinstanceÚintr   ÚappendÚitemsr%   r/   )r.   r   ÚindZret_indicesZdiag_indicesZdiagonal_indicesr   )r,   r.   r   Ú_get_diagonal_indices'   s    r6   c                 C   sT   t | ƒD ]6\}}||kr |  S t|ttfƒr||kr|  S qtd|| f ƒ‚d S )Nz%s not found in %s)r   r1   ÚsetÚ	frozensetÚ
IndexError)Z
subindicesr5   r   Zsindr   r   r   Ú_get_argindex9   s    
r:   c                    sT   t |tttfƒr&t‡ fdd„|D ƒƒS t |tƒrHt ‡ fdd„|D ƒ¡S ˆ |ƒS d S )Nc                 3   s   | ]}t ˆ |ƒV  qd S r   ©Ú$_apply_recursively_over_nested_listsr   ©Úfuncr   r   Ú	<genexpr>D   s     z7_apply_recursively_over_nested_lists.<locals>.<genexpr>c                 3   s   | ]}t ˆ |ƒV  qd S r   r;   r   r=   r   r   r?   F   s     )r1   r/   r0   r   Zfromiter)r>   Zarrr   r=   r   r<   B   s
    
r<   c                    sž   ddi‰d}d}|t ˆ ƒk rrd}|| t ˆ ƒk rTˆ | | ˆ ||  krJqT|d7 }q ||7 }|ˆˆ | < ||7 }qtˆ ¡ ƒ‰‡‡fdd„‰‡ ‡fdd„}|S )Nr   r   c                    s   ˆˆ t  ˆ | ¡d   S )Nr   )ÚbisectÚbisect_right)Úidx)Ú
shift_keysÚshiftsr   r   r>   Z   s    z8_build_push_indices_up_func_transformation.<locals>.funcc                    s   | ˆ krd S | ˆ| ƒ S d S r   r   ©r   )Úflattened_contraction_indicesr>   r   r   Ú	transform]   s    z=_build_push_indices_up_func_transformation.<locals>.transform)r   r   Úkeys)rF   r   Z
cumulativer   rG   r   )rF   r>   rC   rD   r   Ú*_build_push_indices_up_func_transformationK   s     

rI   c                    s2   ˆ d d }‡ fdd„t |ƒD ƒ‰‡fdd„}|S )Néÿÿÿÿr   c                    s   g | ]}|ˆ kr|‘qS r   r   r   )rF   r   r   r   i   s      z@_build_push_indices_down_func_transformation.<locals>.<listcomp>c                    s0   | t ˆ ƒk rˆ |  S | ˆ d  t ˆ ƒ d S d S )NrJ   r   r'   rE   )rD   r   r   rG   k   s    z?_build_push_indices_down_func_transformation.<locals>.transform)r   )rF   ÚNrG   r   )rF   rD   r   Ú,_build_push_indices_down_func_transformationf   s    rL   )ÚpermÚtarget_listc                 C   s6   dd„ t | jƒD ƒ}t|ƒD ]\}}||| |ƒ< q|S )z<
    Permute a list according to the given permutation.
    c                 S   s   g | ]}d ‘qS r   r   r   r   r   r   r   x   s     z._apply_permutation_to_list.<locals>.<listcomp>)r   Úsizer   )rM   rN   Znew_listr   Úer   r   r   Ú_apply_permutation_to_listt   s    rQ   )r@   Úcollectionsr   Zsympy.combinatoricsr   Zsympy.core.containersr   Zsympy.core.numbersr   r   r   r&   r6   r:   r<   rI   rL   r0   rQ   r   r   r   r   Ú<module>   s   
		