U
    ZÊ¹j[  ã                   @   sŒ  d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ 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 ddlmZmZ ddlmZ ddlm Z m!Z!m"Z"m#Z# ddl$m%Z% dddddgZ&G dd„ deƒZ'G dd„ de'ƒZ(G dd„ deƒZ)G dd„ deƒZ*dd„ Z+dd„ Z,dd„ Z-d d!„ Z.d"d#„ Z/d$d%„ Z0d3d'd(„Z1d)d*„ Z2d+d,„ Z3d-d.„ Z4d/d0„ Z5d1d2„ Z6d&S )4zClebsch-Gordon Coefficients.é    )ÚSum)ÚAdd)ÚExpr)Úexpand)ÚMul)ÚPow)ÚEq)ÚS)ÚWildÚsymbols)Úsympify)Úsqrt)Ú	Piecewise)Ú
prettyFormÚ
stringPict)ÚKroneckerDelta)Úclebsch_gordanÚ	wigner_3jÚ	wigner_6jÚ	wigner_9j)Ú
PRECEDENCEÚCGÚWigner3jÚWigner6jÚWigner9jÚcg_simpc                   @   sˆ   e Zd ZdZdZdd„ Zedd„ ƒZedd„ ƒZed	d
„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ ZdS )r   a¤  Class for the Wigner-3j symbols.

    Explanation
    ===========

    Wigner 3j-symbols are coefficients determined by the coupling of
    two angular momenta. When created, they are expressed as symbolic
    quantities that, for numerical parameters, can be evaluated using the
    ``.doit()`` method [1]_.

    Parameters
    ==========

    j1, m1, j2, m2, j3, m3 : Number, Symbol
        Terms determining the angular momentum of coupled angular momentum
        systems.

    Examples
    ========

    Declare a Wigner-3j coefficient and calculate its value

        >>> from sympy.physics.quantum.cg import Wigner3j
        >>> w3j = Wigner3j(6,0,4,0,2,0)
        >>> w3j
        Wigner3j(6, 0, 4, 0, 2, 0)
        >>> w3j.doit()
        sqrt(715)/143

    See Also
    ========

    CG: Clebsch-Gordan coefficients

    References
    ==========

    .. [1] Varshalovich, D A, Quantum Theory of Angular Momentum. 1988.
    Tc                 C   s&   t t||||||fƒ}tj| f|žŽ S ©N©Úmapr   r   Ú__new__)ÚclsÚj1Úm1Új2Úm2Új3Úm3Úargs© r(   úW/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/physics/quantum/cg.pyr   Q   s    zWigner3j.__new__c                 C   s
   | j d S ©Nr   ©r'   ©Úselfr(   r(   r)   r!   U   s    zWigner3j.j1c                 C   s
   | j d S ©Né   r+   r,   r(   r(   r)   r"   Y   s    zWigner3j.m1c                 C   s
   | j d S ©Né   r+   r,   r(   r(   r)   r#   ]   s    zWigner3j.j2c                 C   s
   | j d S ©Né   r+   r,   r(   r(   r)   r$   a   s    zWigner3j.m2c                 C   s
   | j d S ©Né   r+   r,   r(   r(   r)   r%   e   s    zWigner3j.j3c                 C   s
   | j d S ©Né   r+   r,   r(   r(   r)   r&   i   s    zWigner3j.m3c                 C   s   t dd„ | jD ƒƒ S )Nc                 s   s   | ]}|j V  qd S r   ©Ú	is_number©Ú.0Úargr(   r(   r)   Ú	<genexpr>o   s     z'Wigner3j.is_symbolic.<locals>.<genexpr>©Úallr'   r,   r(   r(   r)   Úis_symbolicm   s    zWigner3j.is_symbolicc                    sv  |  | j¡|  | j¡f|  | j¡|  | j¡f|  | j¡|  | j¡ff‰d}d}dgd }tdƒD ]$‰ t‡ ‡fdd„tdƒD ƒƒ|ˆ < q`d }tdƒD ]Ò}d }tdƒD ]„‰ ˆˆ  | }	|ˆ  |	 	¡  }
|
d }|
| }t
|	 d| ¡Ž }	t
|	 d| ¡Ž }	|d k�r|	}q¢t
| d| ¡Ž }t
| |	¡Ž }q¢|d k�r8|}q’t|ƒD ]}t
| d¡Ž }�q@t
| |¡Ž }q’t
| ¡ Ž }|S )Nr1   r/   éÿÿÿÿr3   c                 3   s   | ]}ˆˆ  |   ¡ V  qd S r   ©Úwidth©r;   Úi©ÚjÚmr(   r)   r=   z   s     z#Wigner3j._pretty.<locals>.<genexpr>ú )Ú_printr!   r"   r#   r$   r%   r&   ÚrangeÚmaxrC   r   ÚrightÚleftÚbelowÚparens©r-   Úprinterr'   ZhsepZvsepZmaxwÚDrE   ZD_rowÚsZwdeltaZwleftZwrightÚ_r(   rF   r)   Ú_prettyr   s@    þ
"

zWigner3j._prettyc                 G   s0   t |j| j| j| j| j| j| jfƒ}dt|ƒ S )NzH\left(\begin{array}{ccc} %s & %s & %s \\ %s & %s & %s \end{array}\right))	r   rJ   r!   r#   r%   r"   r$   r&   Útuple©r-   rR   r'   Úlabelr(   r(   r)   Ú_latex•   s      ÿÿzWigner3j._latexc                 K   s,   | j rtdƒ‚t| j| j| j| j| j| jƒS ©NzCoefficients must be numerical)	r@   Ú
ValueErrorr   r!   r#   r%   r"   r$   r&   ©r-   Úhintsr(   r(   r)   Údoit›   s    zWigner3j.doitN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Zis_commutativer   Úpropertyr!   r"   r#   r$   r%   r&   r@   rV   rZ   r_   r(   r(   r(   r)   r   &   s(   (






#c                   @   s4   e Zd ZdZed d Zdd„ Zdd„ Zdd	„ Zd
S )r   a÷  Class for Clebsch-Gordan coefficient.

    Explanation
    ===========

    Clebsch-Gordan coefficients describe the angular momentum coupling between
    two systems. The coefficients give the expansion of a coupled total angular
    momentum state and an uncoupled tensor product state. The Clebsch-Gordan
    coefficients are defined as [1]_:

    .. math ::
        C^{j_3,m_3}_{j_1,m_1,j_2,m_2} = \left\langle j_1,m_1;j_2,m_2 | j_3,m_3\right\rangle

    Parameters
    ==========

    j1, m1, j2, m2 : Number, Symbol
        Angular momenta of states 1 and 2.

    j3, m3: Number, Symbol
        Total angular momentum of the coupled system.

    Examples
    ========

    Define a Clebsch-Gordan coefficient and evaluate its value

        >>> from sympy.physics.quantum.cg import CG
        >>> from sympy import S
        >>> cg = CG(S(3)/2, S(3)/2, S(1)/2, -S(1)/2, 1, 1)
        >>> cg
        CG(3/2, 3/2, 1/2, -1/2, 1, 1)
        >>> cg.doit()
        sqrt(3)/2
        >>> CG(j1=S(1)/2, m1=-S(1)/2, j2=S(1)/2, m2=+S(1)/2, j3=1, m3=0).doit()
        sqrt(2)/2


    Compare [2]_.

    See Also
    ========

    Wigner3j: Wigner-3j symbols

    References
    ==========

    .. [1] Varshalovich, D A, Quantum Theory of Angular Momentum. 1988.
    .. [2] `Clebsch-Gordan Coefficients, Spherical Harmonics, and d Functions
        <https://pdg.lbl.gov/2020/reviews/rpp2020-rev-clebsch-gordan-coefs.pdf>`_
        in P.A. Zyla *et al.* (Particle Data Group), Prog. Theor. Exp. Phys.
        2020, 083C01 (2020).
    r   r/   c                 K   s,   | j rtdƒ‚t| j| j| j| j| j| jƒS r[   )	r@   r\   r   r!   r#   r%   r"   r$   r&   r]   r(   r(   r)   r_   Ú   s    zCG.doitc                 G   sÞ   |j | j| j| j| jfdd�}|j | j| jfdd�}t| ¡ | ¡ ƒ}t	| 
d¡Ž }t	| 
d¡Ž }|| ¡ ksˆt	| d|| ¡   ¡Ž }|| ¡ ks®t	| d|| ¡   ¡Ž }tdd|  ƒ}t	| |¡Ž }t	| |¡Ž }|S )Nú,)Ú	delimiterrI   ÚC)Z
_print_seqr!   r"   r#   r$   r%   r&   rL   rC   r   rN   rM   r   rO   Zabove)r-   rR   r'   ZbotÚtopÚpadrT   r(   r(   r)   rV   ß   s      ÿz
CG._prettyc                 G   s0   t |j| j| j| j| j| j| jfƒ}dt|ƒ S )NzC^{%s,%s}_{%s,%s,%s,%s})	r   rJ   r%   r&   r!   r"   r#   r$   rW   rX   r(   r(   r)   rZ   ñ   s      ÿz	CG._latexN)	r`   ra   rb   rc   r   Ú
precedencer_   rV   rZ   r(   r(   r(   r)   r   ¡   s
   6c                   @   s„   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ ZdS )r   zaClass for the Wigner-6j symbols

    See Also
    ========

    Wigner3j: Wigner-3j symbols

    c                 C   s&   t t||||||fƒ}tj| f|žŽ S r   r   )r    r!   r#   Új12r%   rG   Új23r'   r(   r(   r)   r      s    zWigner6j.__new__c                 C   s
   | j d S r*   r+   r,   r(   r(   r)   r!     s    zWigner6j.j1c                 C   s
   | j d S r.   r+   r,   r(   r(   r)   r#     s    zWigner6j.j2c                 C   s
   | j d S r0   r+   r,   r(   r(   r)   rk     s    zWigner6j.j12c                 C   s
   | j d S r2   r+   r,   r(   r(   r)   r%     s    zWigner6j.j3c                 C   s
   | j d S r4   r+   r,   r(   r(   r)   rG     s    z
Wigner6j.jc                 C   s
   | j d S r6   r+   r,   r(   r(   r)   rl     s    zWigner6j.j23c                 C   s   t dd„ | jD ƒƒ S )Nc                 s   s   | ]}|j V  qd S r   r8   r:   r(   r(   r)   r=     s     z'Wigner6j.is_symbolic.<locals>.<genexpr>r>   r,   r(   r(   r)   r@     s    zWigner6j.is_symbolicc                    s|  |  | j¡|  | j¡f|  | j¡|  | j¡f|  | j¡|  | j¡ff‰d}d}dgd }tdƒD ]$‰ t‡ ‡fdd„tdƒD ƒƒ|ˆ < q`d }tdƒD ]Ò}d }tdƒD ]„‰ ˆˆ  | }	|ˆ  |	 	¡  }
|
d }|
| }t
|	 d| ¡Ž }	t
|	 d| ¡Ž }	|d k�r|	}q¢t
| d| ¡Ž }t
| |	¡Ž }q¢|d k�r8|}q’t|ƒD ]}t
| d¡Ž }�q@t
| |¡Ž }q’t
|jdd	d
�Ž }|S )Nr1   r/   rA   r3   c                 3   s   | ]}ˆˆ  |   ¡ V  qd S r   rB   rD   rF   r(   r)   r=   )  s     z#Wigner6j._pretty.<locals>.<genexpr>rI   Ú{Ú}©rN   rM   )rJ   r!   r%   r#   rG   rk   rl   rK   rL   rC   r   rM   rN   rO   rP   rQ   r(   rF   r)   rV   !  s@    þ
"

zWigner6j._prettyc                 G   s0   t |j| j| j| j| j| j| jfƒ}dt|ƒ S )NzJ\left\{\begin{array}{ccc} %s & %s & %s \\ %s & %s & %s \end{array}\right\})	r   rJ   r!   r#   rk   r%   rG   rl   rW   rX   r(   r(   r)   rZ   D  s      ÿÿzWigner6j._latexc                 K   s,   | j rtdƒ‚t| j| j| j| j| j| jƒS r[   )	r@   r\   r   r!   r#   rk   r%   rG   rl   r]   r(   r(   r)   r_   J  s    zWigner6j.doitN)r`   ra   rb   rc   r   rd   r!   r#   rk   r%   rG   rl   r@   rV   rZ   r_   r(   r(   r(   r)   r   ÷   s&   






#c                   @   s¨   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ ZdS )r   zaClass for the Wigner-9j symbols

    See Also
    ========

    Wigner3j: Wigner-3j symbols

    c
                 C   s,   t t|||||||||	f	ƒ}
tj| f|
žŽ S r   r   )r    r!   r#   rk   r%   Új4Új34Új13Új24rG   r'   r(   r(   r)   r   Y  s    zWigner9j.__new__c                 C   s
   | j d S r*   r+   r,   r(   r(   r)   r!   ]  s    zWigner9j.j1c                 C   s
   | j d S r.   r+   r,   r(   r(   r)   r#   a  s    zWigner9j.j2c                 C   s
   | j d S r0   r+   r,   r(   r(   r)   rk   e  s    zWigner9j.j12c                 C   s
   | j d S r2   r+   r,   r(   r(   r)   r%   i  s    zWigner9j.j3c                 C   s
   | j d S r4   r+   r,   r(   r(   r)   rp   m  s    zWigner9j.j4c                 C   s
   | j d S r6   r+   r,   r(   r(   r)   rq   q  s    zWigner9j.j34c                 C   s
   | j d S )Né   r+   r,   r(   r(   r)   rr   u  s    zWigner9j.j13c                 C   s
   | j d S )Né   r+   r,   r(   r(   r)   rs   y  s    zWigner9j.j24c                 C   s
   | j d S )Né   r+   r,   r(   r(   r)   rG   }  s    z
Wigner9j.jc                 C   s   t dd„ | jD ƒƒ S )Nc                 s   s   | ]}|j V  qd S r   r8   r:   r(   r(   r)   r=   ƒ  s     z'Wigner9j.is_symbolic.<locals>.<genexpr>r>   r,   r(   r(   r)   r@   �  s    zWigner9j.is_symbolicc                    sš  |  | j¡|  | j¡|  | j¡f|  | j¡|  | j¡|  | j¡f|  | j¡|  | j¡|  | j	¡ff‰d}d}dgd }t
dƒD ]$‰ t‡ ‡fdd„t
dƒD ƒƒ|ˆ < q~d }t
dƒD ]Ò}d }t
dƒD ]„‰ ˆˆ  | }	|ˆ  |	 ¡  }
|
d }|
| }t|	 d| ¡Ž }	t|	 d| ¡Ž }	|d k�r$|	}qÀt| d| ¡Ž }t| |	¡Ž }qÀ|d k�rV|}q°t
|ƒD ]}t| d¡Ž }�q^t| |¡Ž }q°t|jdd	d
�Ž }|S )Nr1   r/   rA   r3   c                 3   s   | ]}ˆˆ  |   ¡ V  qd S r   rB   rD   rF   r(   r)   r=   ‘  s     z#Wigner9j._pretty.<locals>.<genexpr>rI   rm   rn   ro   )rJ   r!   r%   rr   r#   rp   rs   rk   rq   rG   rK   rL   rC   r   rM   rN   rO   rP   rQ   r(   rF   r)   rV   †  sT    ÿ
 
ÿÿ
 
ÿ û
"

zWigner9j._prettyc                 G   s<   t |j| j| j| j| j| j| j| j| j	| j
f	ƒ}dt|ƒ S )NzZ\left\{\begin{array}{ccc} %s & %s & %s \\ %s & %s & %s \\ %s & %s & %s \end{array}\right\})r   rJ   r!   r#   rk   r%   rp   rq   rr   rs   rG   rW   rX   r(   r(   r)   rZ   ¬  s        ÿÿzWigner9j._latexc              
   K   s8   | j rtdƒ‚t| j| j| j| j| j| j| j	| j
| jƒ	S r[   )r@   r\   r   r!   r#   rk   r%   rp   rq   rr   rs   rG   r]   r(   r(   r)   r_   ²  s    zWigner9j.doitN)r`   ra   rb   rc   r   rd   r!   r#   rk   r%   rp   rq   rr   rs   rG   r@   rV   rZ   r_   r(   r(   r(   r)   r   P  s2   









&c                 C   sf   t | tƒrt| ƒS t | tƒr$t| ƒS t | tƒrBtdd„ | jD ƒŽ S t | tƒr^tt| j	ƒ| j
ƒS | S dS )aÇ  Simplify and combine CG coefficients.

    Explanation
    ===========

    This function uses various symmetry and properties of sums and
    products of Clebsch-Gordan coefficients to simplify statements
    involving these terms [1]_.

    Examples
    ========

    Simplify the sum over CG(a,alpha,0,0,a,alpha) for all alpha to
    2*a+1

        >>> from sympy.physics.quantum.cg import CG, cg_simp
        >>> a = CG(1,1,0,0,1,1)
        >>> b = CG(1,0,0,0,1,0)
        >>> c = CG(1,-1,0,0,1,-1)
        >>> cg_simp(a+b+c)
        3

    See Also
    ========

    CG: Clebsh-Gordan coefficients

    References
    ==========

    .. [1] Varshalovich, D A, Quantum Theory of Angular Momentum. 1988.
    c                 S   s   g | ]}t |ƒ‘qS r(   )r   r:   r(   r(   r)   Ú
<listcomp>Þ  s     zcg_simp.<locals>.<listcomp>N)Ú
isinstancer   Ú_cg_simp_addr   Ú_cg_simp_sumr   r'   r   r   ÚbaseÚexp©Úer(   r(   r)   r   ¸  s    !



c                 C   s  g }g }t | ƒ} | jD ]š}| t¡r¦t|tƒr>| t|ƒ¡ q°t|tƒršd}|jD ]$}t|tƒrn|t|ƒ9 }qR||9 }qR| t¡rŽ| |¡ q¤| |¡ q°| |¡ q| |¡ qt	|ƒ\}}| |¡ t
|ƒ\}}| |¡ t|ƒ\}}| |¡ t|Ž t|Ž  S )a¢  Takes a sum of terms involving Clebsch-Gordan coefficients and
    simplifies the terms.

    Explanation
    ===========

    First, we create two lists, cg_part, which is all the terms involving CG
    coefficients, and other_part, which is all other terms. The cg_part list
    is then passed to the simplification methods, which return the new cg_part
    and any additional terms that are added to other_part
    r/   )r   r'   Úhasr   rx   r   Úappendrz   r   Ú_check_varsh_871_1Ú_check_varsh_871_2Ú_check_varsh_872_9r   )r~   Zcg_partÚ
other_partr<   ZtermsÚtermÚotherr(   r(   r)   ry   å  s2    










ry   c           
   
   C   s‚   t tdƒ\}}}}|t|||d||ƒ }d| d t|dƒ }|t|ƒ }d| d }|| }	t||||| ||||f||f||	ƒ	S )N)ÚaÚalphaÚbÚltr   r1   r/   )r   r
   r   r   ÚabsÚ_check_cg_simp)
Ú	term_listr‡   rˆ   r‰   rŠ   ÚexprÚsimpÚsignÚ
build_exprÚ
index_exprr(   r(   r)   r�     s    r�   c           
   
   C   s”   t tdƒ\}}}}|t|||| |dƒ }td| d ƒt|dƒ }d||  | t|ƒ }d| d }|| }	t||||| ||||f||f||	ƒ	S )N)r‡   rˆ   ÚcrŠ   r   r1   r/   rA   )r   r
   r   r   r   r‹   rŒ   )
r�   r‡   rˆ   r“   rŠ   rŽ   r�   r�   r‘   r’   r(   r(   r)   r‚     s    r‚   c                 C   s¢  t tdƒ\	}}}}}}}}}	|	t||||||ƒd  }
tj}|	t|	ƒ }t|| ƒ}t|| ƒ}|| d t|||kfdt||ƒf|||kfƒ }|| | }t|
|||	| |||||||	f||||f||ƒ	\} }t|| ƒ}|| }|d | || d  }|| ||  | | }t|
|||	| |||||||	f||||f||ƒ	\} }t||||||ƒt||||||ƒ }
t	||ƒt	||ƒ }tj}t|| ƒ}t|| ƒ}|| d t|||kfdt||ƒf|||kfƒ }|| | }t|
||tj| ||||||||f||||||f||ƒ	\} }t|| ƒ}|| }|d | || d  }|| ||  | | }t|
||tj| ||||||||f||||||f||ƒ	\} }| || | fS )N)	r‡   rˆ   Úalphapr‰   ÚbetaÚbetapr“   ÚgammarŠ   r1   r/   r   )
r   r
   r   r	   ÚOner‹   r   r   rŒ   r   )r�   r‡   rˆ   r”   r‰   r•   r–   r“   r—   rŠ   rŽ   r�   r�   ÚxÚyr‘   r’   Zother1Zother2Zother3Zother4r(   r(   r)   rƒ   )  s8    222$2::rƒ   c	              	      sÞ  d}	d}
|
t ˆƒk �rÖtˆ|
 | t |ƒƒ‰ ˆ dkr<|
d7 }
q| ˆ ¡jsR|
d7 }
q‡ fdd„|D ƒ}dg| ˆ ¡ }t|
t ˆƒƒD ]š}tˆ| |  |¡t |ƒt |ƒ | ˆ ¡| |¡fd�}|dkrÆq‚| |¡ |¡jsÚq‚||  |d¡ |¡ |¡| |¡| |¡ |¡f|| |¡ |¡< q‚tdd„ |D ƒƒ�sÌtd	d„ |D ƒŽ }d
d„ |D ƒ}| ¡  | ¡  ‡fdd„|D ƒ |D ]:}t	|d ƒ|k�rxˆ 
|d ||d   |d  ¡ �qx|	|||  ˆ ¡ 7 }	q|
d7 }
qˆ|	fS )a½   Checks for simplifications that can be made, returning a tuple of the
    simplified list of terms and any terms generated by simplification.

    Parameters
    ==========

    expr: expression
        The expression with Wild terms that will be matched to the terms in
        the sum

    simp: expression
        The expression with Wild terms that is substituted in place of the CG
        terms in the case of simplification

    sign: expression
        The expression with Wild terms denoting the sign that is on expr that
        must match

    lt: expression
        The expression with Wild terms that gives the leading term of the
        matched expr

    term_list: list
        A list of all of the terms is the sum to be simplified

    variables: list
        A list of all the variables that appears in expr

    dep_variables: list
        A list of the variables that must match for all the terms in the sum,
        i.e. the dependent variables

    build_index_expr: expression
        Expression with Wild terms giving the number of elements in cg_index

    index_expr: expression
        Expression with Wild terms giving the index terms have when storing
        them to cg_index

    r   Nr/   c                    s   g | ]}|ˆ | f‘qS r(   r(   )r;   r™   )Úsub_1r(   r)   rw   ‰  s     z"_check_cg_simp.<locals>.<listcomp>)r�   c                 s   s   | ]}|d kV  qd S r   r(   rD   r(   r(   r)   r=   ’  s     z!_check_cg_simp.<locals>.<genexpr>c                 S   s   g | ]}t |d  ƒ‘qS )r1   )r‹   ©r;   r…   r(   r(   r)   rw   “  s     c                 S   s   g | ]}|d  ‘qS )r   r(   rœ   r(   r(   r)   rw   ”  s     c                    s   g | ]}ˆ   |¡‘qS r(   )Úpop)r;   rG   )r�   r(   r)   rw   —  s     r1   r3   )ÚlenÚ	_check_cgÚsubsr9   rK   ÚanyÚminÚsortÚreverser‹   r€   )rŽ   r�   r�   rŠ   r�   Ú	variablesZdep_variablesZbuild_index_exprr’   r„   rE   Zsub_depZcg_indexrG   Zsub_2Zmin_ltÚindicesr…   r(   )r›   r�   r)   rŒ   V  s>    )6D&
rŒ   Nc                 C   s^   |   |¡}|dkrdS |dk	rJt|tƒs0tdƒ‚|d |d  |¡ksJdS t|ƒ|krZ|S dS )z2Checks whether a term matches the given expressionNzsign must be a tupler   r/   )Úmatchrx   rW   Ú	TypeErrorr    rž   )Zcg_termrŽ   Úlengthr�   Úmatchesr(   r(   r)   rŸ   ¡  s    

rŸ   c                 C   s   t | ƒ} t| ƒ} t| ƒ} | S r   )Ú_check_varsh_sum_871_1Ú_check_varsh_sum_871_2Ú_check_varsh_sum_872_4r}   r(   r(   r)   rz   °  s    rz   c              
   C   sr   t dƒ}tdƒ}t dƒ}|  tt|||d||ƒ|| |fƒ¡}|d k	rnt|ƒdkrnd| d t|dƒ  |¡S | S )Nr‡   rˆ   r‰   r   r1   r/   )r
   r   r§   r   r   rž   r   r    )r~   r‡   rˆ   r‰   r§   r(   r(   r)   r«   ·  s    &r«   c                 C   s„   t dƒ}tdƒ}t dƒ}|  td||  t|||| |dƒ || |fƒ¡}|d k	r€t|ƒdkr€td| d ƒt|dƒ  |¡S | S )Nr‡   rˆ   r“   rA   r   r1   r/   )	r
   r   r§   r   r   rž   r   r   r    )r~   r‡   rˆ   r“   r§   r(   r(   r)   r¬   Á  s    ,ÿ r¬   c                 C   sü   t dƒ}t dƒ}tdƒ}tdƒ}tdƒ}tdƒ}tdƒ}tdƒ}t||||||ƒ}	t||||||ƒ}
|  t|	|
 || |f|| |fƒ¡}|d k	r¸t|ƒd	kr¸t||ƒt||ƒ  |¡S |  t|	d
 || |f|| |fƒ¡}|d k	røt|ƒdkrøtj	S | S )Nrˆ   r•   r‡   r‰   r“   Úcpr—   Úgammaprt   r1   r5   )
r   r
   r   r§   r   rž   r   r    r	   r˜   )r~   rˆ   r•   r‡   r‰   r“   r®   r—   r¯   Zcg1Zcg2Zmatch1Zmatch2r(   r(   r)   r­   Ì  s"    &&r­   c                    sÀ   t ˆtƒrˆfddfS g ‰ d}t ˆttfƒs4tdƒ‚t ˆtƒrvˆjjrvˆjjrj‡ ‡fdd„tˆjƒD ƒ nˆfddfS t ˆtƒr¼ˆjD ]"}t |tƒr ˆ  	|¡ q†||9 }q†ˆ ||t
|ƒ fS d S )Nr/   z term must be CG, Add, Mul or Powc                    s   g | ]}ˆ   ˆj¡‘qS r(   )r€   r{   )r;   rU   ©Zcgr…   r(   r)   rw   é  s     z_cg_list.<locals>.<listcomp>)rx   r   r   r   ÚNotImplementedErrorr|   r9   rK   r'   r€   r‹   )r…   Zcoeffr<   r(   r°   r)   Ú_cg_listà  s     




r²   )N)7rc   Zsympy.concrete.summationsr   Zsympy.core.addr   Zsympy.core.exprr   Zsympy.core.functionr   Zsympy.core.mulr   Zsympy.core.powerr   Zsympy.core.relationalr   Zsympy.core.singletonr	   Zsympy.core.symbolr
   r   Zsympy.core.sympifyr   Z(sympy.functions.elementary.miscellaneousr   Z$sympy.functions.elementary.piecewiser   Z sympy.printing.pretty.stringpictr   r   Z(sympy.functions.special.tensor_functionsr   Zsympy.physics.wignerr   r   r   r   Zsympy.printing.precedencer   Ú__all__r   r   r   r   r   ry   r�   r‚   rƒ   rŒ   rŸ   rz   r«   r¬   r­   r²   r(   r(   r(   r)   Ú<module>   sL   û{VYh-.-K

