B
    ˜‘[‘7  ã               @   s   d dl mZ edƒZd dlmZ d dlmZmZ d dlZd dl	Z	d dl
mZ erÊd dlmZmZmZmZmZmZ d dlmZ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mZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJ d dlKmLZLm'Z'mZmMZMmNZNmOZOmPZP e Qe¡ eedd„ dd„ ƒ e Qe¡ e Qe¡ eedd„ dd„ ƒ e Qe¡ e Qe¡ e Qe¡ e Qe¡ eedd„ dd„ ƒ e Qe¡ e Qe¡ e Qe¡ e Qe¡ eedd„ dd„ ƒ e Qe'¡ ee'dd„ dd„ ƒ e Qe¡ eedd„ dd„ ƒ e QeL¡ eeLdd„ dd„ ƒ e Qe)¡ ee)dd„ dd„ ƒ e QeE¡ eeEdd„ dd„ ƒ e QeJ¡ eeJdd„ d d„ ƒ e QeN¡ eeNd!d„ d"d„ ƒ e QeI¡ eeId#d„ d$d„ ƒ e QeA¡ eeAd%d„ d&d„ ƒ e QeB¡ eeBd'd„ d(d„ ƒ e QeM¡ eeMd)d„ d*d„ ƒ e QeC¡ eeCd+d„ d,d„ ƒ e QeG¡ eeGd-d„ d.d„ ƒ e QeH¡ eeHd/d„ d0d„ ƒ e QeD¡ eeDd1d„ d2d„ ƒ e Qe<¡ ee<d3d„ d4d„ ƒ e Qe=¡ ee=d5d„ d6d„ ƒ e Qe&¡ ee&d7d„ d8d„ ƒ e Qe@¡ ee@d9d„ d:d„ ƒ e Qe>¡ ee>d;d„ d<d„ ƒ e Qe?¡ ee?d=d„ d>d„ ƒ e Qe¡ eed?d„ d@d„ ƒ e Qe ¡ ee dAd„ dBd„ ƒ e Qe!¡ ee!dCd„ dDd„ ƒ e Qe"¡ ee"dEd„ dFd„ ƒ e Qe#¡ ee#dGd„ dHd„ ƒ e Qe$¡ ee$dId„ dJd„ ƒ e Qe1¡ ee1dKd„ dLd„ ƒ e Qe0¡ ee0dMd„ dNd„ ƒ e Qe2¡ ee2dOd„ dPd„ ƒ e Qe3¡ ee3dQd„ dRd„ ƒ e Qe5¡ ee5dSd„ dTd„ ƒ e Qe4¡ ee4dUd„ dVd„ ƒ e Qe8¡ ee8dWd„ dXd„ ƒ e Qe:¡ ee:dYd„ dZd„ ƒ e Qe6¡ ee6d[d„ d\d„ ƒ e Qe9¡ ee9d]d„ d^d„ ƒ e Qe7¡ ee7d_d„ d`d„ ƒ e Qe;¡ ee;dad„ dbd„ ƒ e Qe+¡ ee+dcd„ ddd„ ƒ e Qe*¡ ee*ded„ dfd„ ƒ e Qe,¡ ee,dgd„ dhd„ ƒ e Qe-¡ ee-did„ djd„ ƒ e Qe.¡ ee.dkd„ dld„ ƒ e Qe/¡ ee/dmd„ dnd„ ƒ dodp„ ZReeeRƒ edqdrdsdt„ ƒZSeOeƒZTeduƒZUeSƒ \ZVZWZXdvdw„ ZYdxdy„ ZZdzd{„ Z[edqdrdƒd}d~„ƒZ\edqdrd„dd€„ƒZ]edqdrdd‚„ ƒZ^dS )…é    )Úimport_moduleÚmatchpy)Údoctest_depends_on)ÚIntegerÚFloatN)Úpowsimp)Ú	OperationÚCommutativeOperationÚAssociativeOperationÚManyToOneReplacerÚOneIdentityOperationÚCustomConstraint)Úregister_operation_iteratorÚregister_operation_factory)ÚPowÚAddÚIntegralÚBasicÚMulÚSÚFunctionÚE),ÚlogÚsinÚcosÚtanÚcotÚcscÚsecÚsqrtÚerfÚexpÚgammaÚacoshÚasinhÚatanhÚacothÚacschÚasechÚcoshÚsinhÚtanhÚcothÚsechÚcschÚatanÚacscÚasinÚacotÚacosÚasecÚfresnelsÚfresnelcÚerfcÚerfiÚEiÚ
uppergammaÚpolylogÚzetaÚ	factorialÚ	polygammaÚdigammaÚliÚexpintÚLambertWÚloggamma)ÚGammar!   r   Ú
ProductLogÚ	PolyGammaÚrubi_unevaluated_exprÚprocess_trigc             C   s   | j d f| j d  S )Nr   é   )Ú_args)Úa© rL   ú8lib/python3.7/site-packages/sympy/integrals/rubi/rubi.pyÚ<lambda>   s    rN   c             C   s   t | jd f| jd  ƒS )Nr   rI   )ÚlenrJ   )rK   rL   rL   rM   rN      s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN      s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN      s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN       s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN       s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   &   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   &   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   )   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   )   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   ,   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   ,   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   /   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   /   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   2   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   2   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   5   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   5   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   8   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   8   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   ;   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   ;   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   >   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   >   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   A   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   A   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   D   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   D   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   G   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   G   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   J   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   J   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   M   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   M   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   P   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   P   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   S   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   S   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   V   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   V   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   Y   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   Y   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   \   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   \   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   _   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   _   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   b   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   b   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   e   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   e   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   h   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   h   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   k   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   k   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   n   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   n   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   q   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   q   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   t   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   t   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   w   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   w   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   z   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   z   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   }   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   }   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   €   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   €   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   ƒ   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   ƒ   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   †   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   †   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   ‰   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   ‰   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   Œ   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   Œ   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN      s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN      s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   ’   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   ’   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   •   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   •   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   ˜   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   ˜   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   ›   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   ›   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   ž   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   ž   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   ¡   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   ¡   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   ¤   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   ¤   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   §   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   §   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   ª   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   ª   s    c             C   s   | j S )N)rJ   )rK   rL   rL   rM   rN   ­   s    c             C   s
   t | jƒS )N)rO   rJ   )rK   rL   rL   rM   rN   ­   s    c             C   s   t | ƒ|Ž S )N)Útype)Zold_operationZnew_operandsZvariable_namerL   rL   rM   Úsympy_op_factory¯   s    rQ   )r   )Úmodulesc              C   s²  ddl m}  ddlm} ddlm} ddlm} ddlm	} ddl
m} ddlm} dd	lm} dd
lm} ddlm}	 ddlm}
 ddlm} ddlm} ddlm} ddlm} ddlm} ddl m!} g }g }|| |ƒ7 }|||ƒ7 }|||ƒ7 }|||ƒ7 }|||ƒ7 }|||ƒ7 }|||ƒ7 }|||ƒ7 }|||ƒ7 }|||ƒ7 }||	|ƒ7 }||
|ƒ7 }|||ƒ7 }|||ƒ7 }|||ƒ7 }|||ƒ7 }|||ƒ7 }t"|Ž }|||fS )a9  
        Returns rubi ManyToOneReplacer by adding all rules from different modules.

        Uncomment the lines to add integration capabilities of that module.

        Currently, there are parsing issues with special_function,
        derivative and miscellaneous_integration. Hence they are commented.
        r   )Úintegrand_simplification)Úlinear_products)Úquadratic_products)Úbinomial_products)Útrinomial_products)Úmiscellaneous_algebraic)Úexponential)Ú
logarithms)Úsine)Útangent)Úsecant)Úmiscellaneous_trig)Úinverse_trig)Ú
hyperbolic)Úinverse_hyperbolic)Úspecial_functions)Úmiscellaneous_integration)#Z3sympy.integrals.rubi.rules.integrand_simplificationrS   Z*sympy.integrals.rubi.rules.linear_productsrT   Z-sympy.integrals.rubi.rules.quadratic_productsrU   Z,sympy.integrals.rubi.rules.binomial_productsrV   Z-sympy.integrals.rubi.rules.trinomial_productsrW   Z2sympy.integrals.rubi.rules.miscellaneous_algebraicrX   Z&sympy.integrals.rubi.rules.exponentialrY   Z%sympy.integrals.rubi.rules.logarithmsrZ   Zsympy.integrals.rubi.rules.siner[   Z"sympy.integrals.rubi.rules.tangentr\   Z!sympy.integrals.rubi.rules.secantr]   Z-sympy.integrals.rubi.rules.miscellaneous_trigr^   Z'sympy.integrals.rubi.rules.inverse_trigr_   Z%sympy.integrals.rubi.rules.hyperbolicr`   Z-sympy.integrals.rubi.rules.inverse_hyperbolicra   Z,sympy.integrals.rubi.rules.special_functionsrb   Z4sympy.integrals.rubi.rules.miscellaneous_integrationrc   r   )rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   ÚrulesÚrules_appliedÚrubirL   rL   rM   Úrubi_object´   sL    
rg   Ú	Integratec               C   s^   t  t d ¡dkrdS t d t d   krRt d   krRt d   krRt d krZn ndS d S )	NéÿÿÿÿrI   FéþÿÿÿéýÿÿÿéüÿÿÿéûÿÿÿT)re   ÚcountrL   rL   rL   rM   Ú
_has_cycleë   s    @ro   c             C   s0   |   t¡r|  tt¡} |   t¡r,|  tt¡} | S )aû  
    When there is recursion for more than 10 rules or in total 20 rules have been applied
    rubi returns `Integrate` in order to stop any further matching. After complete integration,
    Integrate needs to be replaced back to Integral. Also rubi's `exp` need to be replaced back
    to sympy's general `exp`.

    Examples
    ========
    >>> from sympy import Function, E
    >>> from sympy.integrals.rubi.rubi import process_final_integral
    >>> from sympy.integrals.rubi.utility_function import rubi_unevaluated_expr
    >>> Integrate = Function("Integrate")
    >>> from sympy.abc import a, x
    >>> _E = rubi_unevaluated_expr(E)
    >>> process_final_integral(Integrate(a, x))
    Integral(a, x)
    >>> process_final_integral(_E**5)
    exp(5)

    )Zhasrh   Úreplacer   Ú_Er   )ÚexprrL   rL   rM   Úprocess_final_integralñ   s
    

rs   c             C   s`   g }g }t | tƒr\x4| jD ]*}t |tttfƒr:| |¡ q| |¡ qW tt|Ž ƒt|Ž  S | S )a:  
    This function is needed to preprocess an expression as done in matchpy
    `x^a*x^b` in matchpy auotmatically transforms to `x^(a+b)`

    Examples
    ========

    >>> from sympy.integrals.rubi.rubi import rubi_powsimp
    >>> from sympy.abc import a, b, x
    >>> rubi_powsimp(x**a*x**b)
    x**(a+b)

    )Ú
isinstancer   Úargsr   r!   Úsym_expÚappendr   )rr   Zlst_powZlst_non_powÚirL   rL   rM   Úrubi_powsimp  s    
ry   Fc             C   s¾   |   tt¡} g tdd…< t| ƒ} t| ƒ} t| ttfƒsDt| t	t
fƒrPt| ƒ| S t| tƒr¢d}x:| jD ]0}g tdd…< |t  t||ƒ¡7 }g tdd…< qfW t|ƒS tj t| |ƒdd}t|ƒS )aW  
    Rule based algorithm for integration. Integrates the expression by applying
    transformation rules to the expression.

    Returns `Integrate` if an expression cannot be integrated.

    Parameters
    ==========
    expr : integrand expression
    var : variable of integration

    Returns Integral object if unable to integrate.
    Nr   é
   )Ú	max_count)rp   rv   r!   re   rH   ry   rt   Úintr   Úfloatr   r   r   ru   rf   r   rs   )rr   ÚvarÚ	showstepsÚresultsÚexrL   rL   rM   Úrubi_integrate%  s    
r‚   c             C   sœ   t | ƒ} |  tt¡} t| ttfƒs0t| ttfƒr<t	| ƒ| S t| t
ƒrPt| |ƒS ttƒdkrxtƒ snttƒdkrxt| |ƒS tjt| |ƒdd}g td d …< |S )Nrz   é   )r{   )rH   rp   rv   r!   rt   r|   r   r}   r   r   r   r‚   rO   re   ro   rh   rf   r   )rr   r~   r   r€   rL   rL   rM   Úutil_rubi_integrateE  s    


r„   c       	      C   sª   t j}| t| |ƒ¡}xŽ|D ]†\}}tdƒ tt |¡ƒ t |¡\}}td|ƒ td |¡ƒ tdƒ t	t
 d|d ¡ d¡ƒ}t|j|d  ƒ t|ƒ tƒ  qW dS )	zš
    Prints the list or rules which match to `expr`.

    Parameters
    ==========
    expr : integrand expression
    var : variable of integration
    zRule matching: z	On line: Ú
zPattern matching: z^\s*rule(\d+)r   rI   N)rf   ÚmatcherÚmatchr   ÚprintÚinspectZgetsourcefileZgetsourcelinesÚjoinr|   ÚreÚgroupZpatterns)	rr   r~   r†   ZmiterZfunÚeÚcodeÚlinenoZpattnorL   rL   rM   Úget_matching_rule_definitionT  s    

r   )F)F)_Zsympy.externalr   r   Zsympy.utilities.decoratorr   Z
sympy.corer   r   r‰   r‹   Zsympyr   r   r	   r
   r   r   r   Zmatchpy.expressions.functionsr   r   r   r   r   r   r   r   r   r   Zsympy.functionsr   r   r   r   r   r   r   r   r    r!   rv   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   Z%sympy.integrals.rubi.utility_functionrD   rE   rF   rG   rH   ÚregisterrQ   rg   rq   rh   rf   re   rd   ro   rs   ry   r‚   r„   r   rL   rL   rL   rM   Ú<module>   s   (¸$
























































3