B
    [                 @   s<  d Z ddlmZmZ ddlmZ 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	lmZ dd
lmZmZmZmZ ddlmZmZ ddlmZ ejjZdd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(ed#Z)ed$d"Z*ed%d&Z+ed'Z,ed(Z-ed)d*Z.ed+d,Z/ed-d.Z0ed/d0Z1ed1d2Z2ed3d2Z3ed4d2Z4ed5d6Z5ed7d8Z6ed9d:Z7ed;d:Z8ed<d:Z9ed=d:Z:ed>d:Z;ed?d8Z<ed@dAZ=i Z>dBdC Z?dDdE Z@dFdG ZAdHdI ZBdJdK ZCdLdM ZDdNdO ZEdPd& ZFdQdR ZGdSdT ZHdUdV ZIdWdX ZJdYdZ ZKd[d\ ZLd]d^ ZMd_d` ZNdadb ZOdcdd ZPdedf ZQdgdh ZRdidj ZSejTdkdl ZUejTdmdn ZVejTdodp ZWejTdqdr ZXejTdsdt ZYdudv ZZdwdx Z[eZdydz Z\e[d{dz Z]eZd|dz Z^e[d}dz Z_eZd~dz Z`e[ddz ZaeZddz Zbe[ddz ZceZddz Zde[ddz ZeeZddz Zfe[ddz ZgeZddz Zhe[ddz ZieZddz Zje[ddz Zkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd ZseCddz ddz ZteCddz ddz ZueCddz ddz ZveCddz ddz Zwdd Zxdd Zydd Zzi Z{dd Z|e?edd Z}e?e dd Z~e?e!dd Ze?e'dd Ze?e"dd Ze?e#dd Ze?e$dd Ze?e%dd Ze?e&dd Ze?e2dd Ze?e3dd Ze?e4dd Ze?e(ddÄ Ze?e)ddń Ze?e*ddǄ Ze?e+ddɄ Ze?e.dd˄ Ze?e/dd̈́ Ze?e1ddτ Ze?e-ddф Ze?e0ddӄ Ze?e5ddՄ Ze?e6ddׄ Ze?e7ddل Ze?e8ddۄ Ze?e9dd݄ Ze?e:dd߄ Ze?e;dd Ze?e<dd Ze?e,dd Zdd Zdd ZdS )a  Integration method that emulates by-hand techniques.

This module also provides functionality to get the steps used to evaluate a
particular integral, in the ``integral_steps`` function. This will return
nested namedtuples representing the integration rules used. The
``manualintegrate`` function computes the integral using those steps given
an integrand; given the steps, ``_manualintegrate`` will evaluate them.

The integrator can be extended with new heuristics and evaluation
techniques. To do so, write a function that accepts an ``IntegralInfo``
object and returns either a namedtuple representing a rule or
``None``. Then, write another function that accepts the namedtuple's fields
and returns the antiderivative, and decorate it with
``@evaluates(namedtuple_type)``.  If the new technique requires a new
match, add the key and call to the antiderivative function to integral_steps.
To enable simple substitutions, add the match to find_substitutions.

    )print_functiondivision)
namedtupleN)reduce)	fuzzy_not)TrigonometricFunction)OrthogonalPolynomial)	Piecewise)switchdo_one	null_safe	condition)EqNe)degree c                s2   dd   fdd}t | |d } |_||_|S )Nc             S   s   | j |j kot| |S )N)	__class__tuple__eq__)selfother r   >lib/python3.7/site-packages/sympy/integrals/manualintegrate.pyr   &   s    zRule.<locals>.__eq__c                s    | | S )Nr   )r   r   )r   r   r   <lambda>(   s    zRule.<locals>.<lambda>z context symbol)r   r   __ne__)nameZpropsZ__neq__clsr   )r   r   Rule$   s    r   ConstantRuleconstantConstantTimesRulezconstant other substep	PowerRulezbase expAddRulesubstepsURulezu_var u_func constant substep	PartsRulezu dv v_step second_stepCyclicPartsRulezparts_rules coefficientTrigRulezfunc argExpRuleReciprocalRulefunc
ArcsinRuleInverseHyperbolicRuleAlternativeRulealternativesDontKnowRuleDerivativeRuleRewriteRulezrewritten substepPiecewiseRuleZsubfunctionsHeavisideRulezharg ibnd substepTrigSubstitutionRulez(theta func rewritten substep restriction
ArctanRuleza b cArccothRuleArctanhRule
JacobiRulezn a bGegenbauerRulezn aChebyshevTRulenChebyshevURuleLegendreRuleHermiteRuleLaguerreRuleAssocLaguerreRuleIntegralInfozintegrand symbolc                s    fdd}|S )Nc                s    | _ | t < | S )N)rule
evaluators)r*   )rB   r   r   
_evaluatesR   s    zevaluates.<locals>._evaluatesr   )rB   rD   r   )rB   r   	evaluatesQ   s    rE   c             C   sX   t | trdS xD| D ]<}t |tr0t|rPdS qt |trtdd |D rdS qW dS )NTc             s   s   | ]}t |V  qd S )N)contains_dont_know).0ir   r   r   	<genexpr>a   s    z%contains_dont_know.<locals>.<genexpr>F)
isinstancer/   r   rF   listany)rB   valr   r   r   rF   X   s    



rF   c                s,  | j r"| j d }t| tjr6| t|d  S t| tjr\|  t|d  S t| tjr| t| t| S t| tjr|  t| t| S t| tjrt	 fdd| j D S t| tj
r"t| j dkr"t| j d tjr"| j d t| j d   S |  S )a  Derivative of f in form expected by find_substitutions

    SymPy's derivatives for some trig functions (like cot) aren't in a form
    that works well with finding substitutions; this replaces the
    derivatives for those particular forms with something that works better.

    r      c                s   g | ]}t | qS r   )manual_diff)rG   arg)symbolr   r   
<listcomp>x   s    zmanual_diff.<locals>.<listcomp>   )argsrJ   sympytandiffseccotcscAddsumMullenNumberrO   )frQ   rP   r   )rQ   r   rO   e   s     
 $rO   c       
         s   g } fdd}fddxl D ]`}|kr:q,t |}|||}|dk	r,|\}}| krpq,|||f}	|	|kr,||	 q,W |S )Nc                s   | }|j krdS ||  }|j kr>|jddS t| tjrd| j jrt	| jdk rtj
dgd}tj
dgd}| j| |   r fdd||fD \}}|d	kr|d	kr|d| j  | | }|jddS dS )
NF)Zas_AddrS   a)excludebc                s   g | ]}  |tqS r   )getZERO)rG   rH   )matchr   r   rR      s    z<find_substitutions.<locals>.test_subterm.<locals>.<listcomp>r   )free_symbolssubscancelas_independentrJ   rU   PowexpZ
is_IntegerAbsWildbaserf   )uu_diffsubstitutedra   rc   )	integrandrQ   u_var)rf   r   test_subterm   s$    

z(find_substitutions.<locals>.test_subtermc          	      s\  t | ttjtjtjtjtjtjfr0| j	d gS t | tj
tjtjtjtjfrZ| j	d gS t | tjtjfrx| j	d gS t | tjr| j	d gS t | tjrg }x&| j	D ]}|| | | qW |S t | tjr| j	d  r| j	d gS | j	d rX| j	d gS n@t | tjrXg }x(| j	D ]}|| | | q2W |S g S )Nr   rS   rN      )rJ   r   rU   asinacosatanrl   log	HeavisiderT   
chebyshevt
chebyshevulegendrehermitelaguerre
gegenbauerassoc_laguerrejacobir]   appendextendrk   Zis_constantr[   )Ztermrrp   rP   )possible_subtermsrQ   r   r   r      s:    

z-find_substitutions.<locals>.possible_subtermsF)rO   rh   r   )
rs   rQ   rt   resultsru   rp   rq   Znew_integrandr   substitutionr   )rs   r   rQ   rt   r   find_substitutions   s     


r   c                s    fdd}|S )z$Strategy that rewrites an integrand.c                sJ   | \}} |  rF|  }||krFt ||}t|tsF|rFt||||S d S )N)integral_stepsrJ   r/   r1   )integralrs   rQ   	rewrittensubstep)r   rewriter   r   	_rewriter   s    
zrewriter.<locals>._rewriterr   )r   r   r   r   )r   r   r   rewriter   s    r   c                s    fdd}|S )zAStrategy that rewrites an integrand based on some other criteria.c                sL   | \} }|\}}| t | } | rH| }||krHt|t||||S d S )N)rK   r1   r   )Zcriteriar   rs   rQ   rT   r   )r   r   r   r   _proxy_rewriter   s    z'proxy_rewriter.<locals>._proxy_rewriterr   )r   r   r   r   )r   r   r   proxy_rewriter   s    r   c                s    fdd}|S )z4Apply the rule that matches the condition, else Nonec                s*   x$   D ]\}}|| r
|| S q
W d S )N)items)exprkeyrB   )
conditionsr   r   multiplexer_rl   s    z#multiplexer.<locals>.multiplexer_rlr   )r   r   r   )r   r   multiplexer   s    r   c                 s    fdd}|S )zHStrategy that makes an AlternativeRule out of multiple possible results.c                s   g }x< D ]4}|| }|r
t |ts
|| kr
||kr
|| q
W t|dkrV|d S |rdd |D }|rzt|f|  S t|f|  S d S )NrS   r   c             S   s   g | ]}t |s|qS r   )rF   )rG   rB   r   r   r   rR      s    z7alternatives.<locals>._alternatives.<locals>.<listcomp>)rJ   r/   r   r^   r-   )r   ZaltsrB   resultZdoable)rulesr   r   _alternatives   s    
z#alternatives.<locals>._alternativesr   )r   r   r   )r   r   r.      s    c             C   s   | \}}t | jf|  S )N)r   rs   )r   rs   rQ   r   r   r   constant_rule  s    r   c             C   s   | \}}|  \}}||jkrVt|tjrVt|d dkrHt|||S t||||S ||jkrt|tjrt||||}t	t
|jr|S t
|jrtdd|S t|tt
|dftdd|dfg||S d S )NrS   r   T)as_base_exprg   rJ   rU   Symbolsimplifyr)   r!   r(   r   rz   is_zeror   r2   r   )r   rs   rQ   ro   rl   rB   r   r   r   
power_rule  s     r   c             C   s4   | \}}t |jd tjr0ttj|jd ||S d S )Nr   )rJ   rT   rU   r   r(   E)r   rs   rQ   r   r   r   exp_rule  s    r   c                s   t jtt jtt jtt jtt j	t
t jtt jtt jti}t jdt jdt jdi}| \} xr|D ]j}t||rX||d}|j|  krXt fdd|jd | D sX|jd | | f }|| | S qXW d S )Nrv   rN   rS   c             3   s   | ]}|  V  qd S )N)has)rG   v)rQ   r   r   rI   8  s    z'orthogonal_poly_rule.<locals>.<genexpr>)rU   r   r8   r   r9   r|   r:   r}   r<   r~   r=   r   r>   r   r?   r   r@   rJ   rd   rT   rL   )r   Zorthogonal_poly_classesZorthogonal_poly_var_indexrs   klassZ	var_indexrT   r   )rQ   r   orthogonal_poly_rule#  s&    



 r   c       	         s  | \  \ }tjdgd}tjdgd} ||d   sRd S dd }dd }d	d
 } fddfdd||fD \}}g }td| d dkr,|t||d| dt|dk|dk f ||||d|dt|dk|dkf |||| d|dt|dk |dkf dd |D }|jr||jr|dd |D }t	|dkr|d d d  S n |rt
fdd|D S d S )Nra   )rb   rc   rN   c             S   s   | j p|  S )N)is_negativeZcould_extract_minus_sign)xr   r   r   negativeG  s    z#inverse_trig_rule.<locals>.negativec             S   s   t tj| |S )N)r,   rU   Zasinh)rs   rQ   r   r   r   ArcsinhRuleJ  s    z&inverse_trig_rule.<locals>.ArcsinhRulec             S   s   t tj| |S )N)r,   rU   Zacosh)rs   rQ   r   r   r   ArccoshRuleM  s    z&inverse_trig_rule.<locals>.ArccoshRulec                s  t d} }}d  }	 }
 }}}|dkrV|| }	||||  |d   }|| }|| dkrt ||  }
t || }|}|||d   }| || |}|
d k	r|dkr|d k	rt||| ||||  }t||
|||}|	d k	r|d k	rt|	||}|S )Nrp   rS   rN   )rU   Dummysqrtr    r$   )Z	RuleClassZbase_expra   Zsign_arc   Zsign_brt   Zcurrent_baseZcurrent_symbolr   u_funcZ
u_constantr   Zfactored)ro   rs   rQ   r   r   make_inverse_trigP  s0    

z,inverse_trig_rule.<locals>.make_inverse_trigc                s   g | ]}  |tqS r   )rd   re   )rG   rH   )rf   r   r   rR   k  s    z%inverse_trig_rule.<locals>.<listcomp>rS   r   c             S   s   g | ]}|d  t jk	r|qS )r   )rU   Zfalse)rG   pr   r   r   rR   t  s    c             S   s   g | ]}|d  t jkr|qS )r   )rU   true)rG   r   r   r   r   rR   v  s    c                s$   g | ]} |d d  |d fqS )Nr   r   )rG   r   )r   r   r   rR   {  s    )r   rU   rn   rf   r   r   r+   And	is_numberr^   r2   )	r   rl   ra   rc   r   r   r   ZpossibilitiesZpossibilityr   )ro   rs   r   rf   rQ   r   inverse_trig_rule=  s4    *(*r   c                s6   | \}  fdd|  D }d |kr*d S t|| S )Nc                s   g | ]}t | qS r   )r   )rG   g)rQ   r   r   rR     s   zadd_rule.<locals>.<listcomp>)Zas_ordered_termsr"   )r   rs   r   r   )rQ   r   add_rule~  s    
r   c             C   sJ   | \}}|j }||\}}t||}|dkrF|d k	rFt|||||S d S )NrS   )rT   rj   r   r    )r   rs   rQ   rT   Zcoeffr`   	next_stepr   r   r   mul_rule  s    
r   c                s   fdd}dd }|t j|t jt jt j||t jt j|t jg}t d}t	| t jt jt jt jfrr||  } xht
|D ]Z\}}|| }|r~|\}	}
 |	jkr|	|sd S |	|d}	|
|d}
||kr|	 sd S t	|	t jrd|
 }| rt| dkrd S ||krht	|
trht|
 }t	|trHd S |	 }t|}|	|
|||fS xp||d d  D ]\}|| }|rz|d |d|
rz|	 }tt |
 }t|}|	|
|||fS qzW q~W d S )Nc                sF   |    }  fdd| jD }|rBtj| }| |   }||fS d S )Nc                s   g | ]}|  r|qS r   )Zis_algebraic_expr)rG   rP   )rQ   r   r   rR     s    z;_parts_rule.<locals>.pull_out_algebraic.<locals>.<listcomp>)ri   ZtogetherrT   rU   r]   )rs   Z	algebraicrp   dv)rQ   r   r   pull_out_algebraic  s    
z'_parts_rule.<locals>.pull_out_algebraicc                 s    fdd}|S )Nc                sP   t  fddD rLfdd jD }|rLtdd |} | }||fS d S )Nc                s   g | ]}  |qS r   )r   )rG   r`   )rs   r   r   rR     s    zJ_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<listcomp>c                s&   g | ] t  fd dD r qS )c             3   s   | ]}t  |V  qd S )N)rJ   )rG   r   )rP   r   r   rI     s    zT_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<listcomp>.<genexpr>)rL   )rG   )	functions)rP   r   rR     s    c             S   s   | | S )Nr   )ra   rc   r   r   r   r     s    zH_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<lambda>)rL   rT   r   )rs   rT   rp   r   )r   )rs   r   pull_out_u_rl  s    z6_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rlr   )r   r   r   )r   r   
pull_out_u  s    	z_parts_rule.<locals>.pull_out_uZ	temporaryrS   r   )rU   rz   ry   rw   rx   sincosrl   r   rJ   	enumeraterg   r   rh   is_polynomialr   r   r   r/   rW   _manualintegrateZequalsr   )rs   rQ   r   r   Zliate_rulesZdummyindexrB   r   rp   r   Zrec_dvv_stepdur   r   r   )rQ   r   _parts_rule  sJ    



r   c                s  | \}|  \}}t|}g }|r
|\}}}}}	|| t|tjrPd S x|||   dkrhP |||   jkr|| |  }
tdd |D dt	| |
 |}|dkr|rt
||||| }|S t|| }|r|\}}}}}	|| qRP qRW  fdd |r||d \}}}}}	t|||	 |dd  || |}|dkrx|rxt
||||| }|S d S )NrS   c          	   S   s(   g | ] \}}}}}t |||d d d qS )N)r%   )rG   rp   r   r   r   r   r   r   r   rR     s   zparts_rule.<locals>.<listcomp>r   c                sZ   | r:| d \}}}}}t ||| | dd  || |S t|} | rL| S t|S d S )Nr   rS   )r%   r   r/   )stepsrs   rp   r   r   r   r   )make_second_steprQ   r   r   r     s    
z$parts_rule.<locals>.make_second_stepr   )Zas_coeff_Mulr   r   rJ   rU   Integralri   rg   r&   r^   r    r%   )r   rs   r   r   r   rp   r   r   r   r   coefficientrB   r   )r   rQ   r   
parts_rule  sL    

r   c             C   s  | \}}t |tjs t |tjr^|jd }t |tjs:d S t |tjrLd}nd}t||||S |t|d kr~td|||S |t|d krtd|||S t |tj	rtj|j tj|j  }nt |tj
rtj|j tj|j  }nt |tjr:|jd }t|d t	|t|  t|t	|  }nTt |tjr|jd }t|d t
|t|  t|t
|  }nd S t|t||||S )Nr   r   r   rN   zsec**2zcsc**2)rJ   rU   r   r   rT   r   r'   rX   rZ   rV   rY   r1   r   )r   rs   rQ   rP   r*   r   r   r   r   	trig_rule  s<    

 
 r   c             C   s   | \}}t |t | }|| }||jkr\td|||}|dkrX|rXt|||||}|S t | t | }|| }||jkrtd|||}|dkr|rt|||||}|S d S )Nzsec*tanrS   zcsc*cot)rU   rX   rV   rg   r'   r    rZ   rY   )r   rs   rQ   ZsectanqrB   Zcsccotr   r   r   trig_product_ruleE  s    

r   c             C   s  | \}}t jd|gd}t jd|gd}t jd|gd}||||d  |  }|sZd S || || ||   }}}tt|||||t || dft|||||t t |d | | t || dft	|||||t t |d | | t || dfg||S )Nra   )rb   rc   crN   r   )
rU   rn   rf   r2   r5   ZGtr6   r   ZLtr7   )r   rs   rQ   ra   rc   r   rf   r   r   r   quadratic_denom_rule\  s     8:r   c             C   s6  | \}}t jd|gd}t jd|gd}t d}|t || | | }|sVd S || || ||   }}}t jd|gd}t jd|gd}t d}	|t || | |	 }
|
rd S t d}t || | }|||}|||d	 | | }|d	 | | }t||}|r2t||d |||S d S )
Nra   )rb   rc   r   der`   rp   rN   )rU   rn   rf   r   r   rh   r   r$   )r   rs   rQ   ra   rc   r   rf   r   r   r`   Zrecursion_testrp   r   r   r   r   r   root_mul_rulel  s,    



r   c             C   s\   t jd| gd}t jd| gd}t jd| gdd gd}t jd| gd	d gd}||||fS )
Nra   )rb   rc   mc             S   s   t | tjS )N)rJ   rU   Integer)r;   r   r   r   r     s    zmake_wilds.<locals>.<lambda>)rb   Z
propertiesr;   c             S   s   t | tjS )N)rJ   rU   r   )r;   r   r   r   r     s    )rU   rn   )rQ   ra   rc   r   r;   r   r   r   
make_wilds  s
    r   c             C   sB   t | \}}}}t||  | t||  |  }|||||fS )N)r   rU   r   r   )rQ   ra   rc   r   r;   patternr   r   r   sincos_pattern  s    $r   c             C   sB   t | \}}}}t||  | t||  |  }|||||fS )N)r   rU   rV   rX   )rQ   ra   rc   r   r;   r   r   r   r   tansec_pattern  s    $r   c             C   sB   t | \}}}}t||  | t||  |  }|||||fS )N)r   rU   rY   rZ   )rQ   ra   rc   r   r;   r   r   r   r   cotcsc_pattern  s    $r   c             C   sL   t jd| gd}t jd| gd}t d}t ||  | | }||||fS )Nr   )rb   rc   r   )rU   rn   r{   )rQ   r   rc   r   r   r   r   r   heaviside_pattern  s
    
r   c                s    fdd}|S )Nc                s    |  S )Nr   )rT   )r*   r   r   
uncurry_rl  s    zuncurry.<locals>.uncurry_rlr   )r*   r   r   )r*   r   uncurry  s    r   c                s    fdd}|S )Nc                sB   | \}}}}}} ||||||}||kr>t |t||||S d S )N)r1   r   )rT   ra   rc   r   r;   rs   rQ   r   )r   r   r   trig_rewriter_rl  s    z'trig_rewriter.<locals>.trig_rewriter_rlr   )r   r   r   )r   r   trig_rewriter  s    r   c             C   s   |j o|j o|jo|jS )N)is_evenZis_nonnegative)ra   rc   r   r;   rH   sr   r   r   r     s   r   c             C   sD   dt d|  |  d |d  dt d| |  d |d   S )NrS   rN   )rU   r   )ra   rc   r   r;   rH   rQ   r   r   r   r     s    c             C   s   |j o|dkS )Nrv   )is_odd)ra   rc   r   r;   rH   r   r   r   r   r     s    c             C   sB   dt | | d  |d d  t | |  t || |  S )NrS   rN   )rU   r   r   )ra   rc   r   r;   rH   rQ   r   r   r   r     s    .c             C   s   |j o|dkS )Nrv   )r   )ra   rc   r   r;   rH   r   r   r   r   r     s    c             C   sB   dt || d  |d d  t ||  t | | |  S )NrS   rN   )rU   r   r   )ra   rc   r   r;   rH   rQ   r   r   r   r     s    .c             C   s   |j o|dkS )N   )r   )ra   rc   r   r;   rH   r   r   r   r   r     s    c             C   sF   dt || d  |d d  t || d  t | | |  S )NrS   rN   )rU   rV   rX   )ra   rc   r   r;   rH   rQ   r   r   r   r     s    2c             C   s   |j S )N)r   )ra   rc   r   r;   rH   r   r   r   r   r     s    c             C   sB   t | | d d |d d  t | |  t || |  S )NrN   rS   )rU   rX   rV   )ra   rc   r   r;   rH   rQ   r   r   r   r     s    .c             C   s   |dko|dkS )NrN   r   r   )ra   rc   r   r;   rH   r   r   r   r   r     s    c             C   s   t | | d d S )NrN   rS   )rU   rX   )ra   rc   r   r;   rH   rQ   r   r   r   r     s    c             C   s   |j o|dkS )Nr   )r   )ra   rc   r   r;   rH   r   r   r   r   r     s    c             C   sF   dt || d  |d d  t || d  t | | |  S )NrS   rN   )rU   rY   rZ   )ra   rc   r   r;   rH   rQ   r   r   r   r     s    2c             C   s   |j S )N)r   )ra   rc   r   r;   rH   r   r   r   r   r     s    c             C   sB   t | | d d |d d  t | |  t || |  S )NrN   rS   )rU   rZ   rY   )ra   rc   r   r;   rH   rQ   r   r   r   r     s    .c                s   | \ }t  fddtjtjfD rt|\}}}}} |sJd S tttt	t
ttitfdd||||fD  |g S d S )Nc             3   s   | ]}  |V  qd S )N)r   )rG   r`   )rs   r   r   rI     s    z#trig_sincos_rule.<locals>.<genexpr>c                s   g | ]}  |tqS r   )rd   re   )rG   rH   )rf   r   r   rR     s    z$trig_sincos_rule.<locals>.<listcomp>)rL   rU   r   r   r   rf   r   sincos_botheven_conditionsincos_bothevensincos_sinodd_conditionsincos_sinoddsincos_cosodd_conditionsincos_cosoddr   )r   rQ   r   ra   rc   r   r;   r   )rs   rf   r   trig_sincos_rule  s    
r   c                s   | \ }  dt| t|i t fddtjtjfD rt|\}}}}} |shd S tt	t
ttttitfdd||||fD  |g S d S )NrS   c             3   s   | ]}  |V  qd S )N)r   )rG   r`   )rs   r   r   rI     s    z#trig_tansec_rule.<locals>.<genexpr>c                s   g | ]}  |tqS r   )rd   re   )rG   rH   )rf   r   r   rR     s    z$trig_tansec_rule.<locals>.<listcomp>)rh   rU   r   rX   rL   rV   r   rf   r   tansec_tanodd_conditiontansec_tanoddtansec_seceven_conditiontansec_seceventan_tansquared_conditiontan_tansquaredr   )r   rQ   r   ra   rc   r   r;   r   )rs   rf   r   trig_tansec_rule  s    
r   c          
      s   | \ }  dt| t|dt| t|t|t| t|i t fddtjtjfD rt|\}}}}} 	|sd S t
ttttitfdd||||fD  |g S d S )NrS   c             3   s   | ]}  |V  qd S )N)r   )rG   r`   )rs   r   r   rI     s    z#trig_cotcsc_rule.<locals>.<genexpr>c                s   g | ]}  |tqS r   )rd   re   )rG   rH   )rf   r   r   rR   (  s    z$trig_cotcsc_rule.<locals>.<listcomp>)rh   rU   r   rZ   rV   rY   r   rL   r   rf   r   cotcsc_cotodd_conditioncotcsc_cotoddcotcsc_csceven_conditioncotcsc_cscevenr   )r   rQ   r   ra   rc   r   r;   r   )rs   rf   r   trig_cotcsc_rule  s      
r   c             C   sv   | \}}t jdt d| gd}|t d| | }|rrdt | t | t d|  }t|| |S d S )Nra   rN   )rb   )rU   rn   r   rf   r   r   )r   rs   rQ   ra   rf   Z
sin_doubler   r   r   trig_sindouble_rule+  s    &r   c             C   s"   t tttttttt| S )N)r   r   r   r   r   r   )r   r   r   r   trig_powers_products_rule3  s    r   c          	   C   s  | \}}t jdd|gd}t jdd|gd}t d}|||d   }||}xB|D ]8}||}	|	|t}
|	|t}|
jr|
dkp|
j}|jr|dkp|j}|
jr|
dk p|
j	}|jr|dk p|j	}d }|r|rt 
|
t 
| t | }d}n|rL|rLt 
|
t 
|  }|t | }t || k||k }nF|r|rt 
|
 t 
| }|t | }t || k||k }|rXi }x^t jt jt jt jt jt jgD ]>}|||t 
||d < d|| |t 
||d	 < qW ||| }||}||sX|t||9 }| }|dt | }|rl|dt | t |i}t||}t|sXt|||||||S qXW d S )
Nra   r   )rb   rc   thetarN   TrS   )rU   rn   r   findrf   rd   re   r   Zis_positiver   r   rV   r   r   rX   r   rZ   rY   rh   trigsimpr   rO   Zxreplacer   rF   r4   )r   rs   rQ   ABr   Ztarget_patternZmatchesr   rf   ra   rc   Z
a_positiveZ
b_positiveZ
a_negativeZ
b_negativeZx_funcrestrictionr   substitutionsr`   ZreplacedZsecantsr   r   r   r   trig_substitution_rule9  s\    


$



r  c       
      C   s|   | \}}t |\}}}}||}|rxd|| krxt|| |}t|}	|| ||  }}t|| | | | |	||S d S )Nr   )r   rf   r   r   r3   )
r   rs   rQ   r   r   rc   r   rf   r   r   r   r   r   heaviside_rulev  s    
r  c          
   C   s  | \}}t d}t|||}|rRg }x|D ]\}}}t||}	t|	rLq.t |d dkr| \}
}|	rt|||	||}	|jrg }g }t	|t j
r|j}n
|| xB|D ]:}t|jst||d|}|r||t |df qW ||	df t|||}	|t||||	|| q.W t|dkrBt|||S |r|d S nZ|t jrt |}d}||| }|||}||jkrt|||t||||S d S )Nrp   rS   r   T)rU   r   r   r   rF   r   Zas_numer_denomr    rg   rJ   r]   rT   r   r   r   rh   r   r2   r$   r^   r-   r   rl   rW   )r   rs   rQ   rt   r  Zwaysr   r   rr   Zsubrule_denomZ	piecewiseZcould_be_zeror   r   r   r   r   substitution_rule  sX    






r  c             C   s   |   S )N)Zis_rational_function)rs   rQ   r   r   r   r     s    c             C   s
   |  |S )N)Zapart)rs   rQ   r   r   r   r     s    c             C   s   dS )NTr   )rs   rQ   r   r   r   r     s    c             C   s   |   S )N)ri   )rs   rQ   r   r   r   r     s    c                s0   t  fdd| jD p.t| tjp.t| tjS )Nc             3   s   | ]}|j p| V  qd S )N)Zis_Powr   )rG   rP   )rQ   r   r   rI     s    z<lambda>.<locals>.<genexpr>)allrT   rJ   rU   rk   r]   )rs   rQ   r   )rQ   r   r     s    c             C   s   |   S )N)expand)rs   rQ   r   r   r   r     s    c             C   s    t tdd | tD dkS )Nc             s   s   | ]}|j d  V  qdS )r   N)rT   )rG   ra   r   r   r   rI     s    z<lambda>.<locals>.<genexpr>rS   )r^   setZatomsr   )rs   rQ   r   r   r   r     s    c             C   s   | j ddS )NT)Ztrig)r
  )rs   rQ   r   r   r   r     s    c             C   sX   | d }|j }|j}|j}| j|krD| j|kr6t|  S t|| jS nt| jf|  S d S )Nr   )Z	variablesr   rg   rQ   r0   r/   r   rs   )r   rs   Zdiff_variablesZundifferentiated_functionZintegrand_variablesr   r   r   derivative_rule  s    

r  c             C   sP   | \}}| dt| rL|dt| t|}t|t||||S d S )NrS   )rf   rU   r   rh   rX   r1   r   )r   rs   rQ   r   r   r   r   rewrites_rule  s    r  c             C   s   t |  S )N)r/   )r   r   r   r   fallback_rule  s    r  c                sV  | f}|t kr*t | dkr dS t | S ndt |< t| }fdd  fdd}ttt tjttttttt	tj
ttjttjttjttttttttt	tttjttttjttttjti
tttttttt |tjtjt!t |tjtjt"t |tjtj#tj$tj%tj&t't |tjtjt(t)t*tt+t,|}t |= |S )a  Returns the steps needed to compute an integral.

    This function attempts to mirror what a student would do by hand as
    closely as possible.

    SymPy Gamma uses this to provide a step-by-step explanation of an
    integral. The code it uses to format the results of this function can be
    found at
    https://github.com/sympy/sympy_gamma/blob/master/app/logic/intsteps.py.

    Examples
    ========

    >>> from sympy import exp, sin, cos
    >>> from sympy.integrals.manualintegrate import integral_steps
    >>> from sympy.abc import x
    >>> print(repr(integral_steps(exp(x) / (1 + exp(2 * x)), x)))     # doctest: +NORMALIZE_WHITESPACE
    URule(u_var=_u, u_func=exp(x), constant=1,
    substep=PiecewiseRule(subfunctions=[(ArctanRule(a=1, b=1, c=1, context=1/(_u**2 + 1), symbol=_u), True),
        (ArccothRule(a=1, b=1, c=1, context=1/(_u**2 + 1), symbol=_u), False),
        (ArctanhRule(a=1, b=1, c=1, context=1/(_u**2 + 1), symbol=_u), False)],
    context=1/(_u**2 + 1), symbol=_u), context=exp(x)/(exp(2*x) + 1), symbol=x)
    >>> print(repr(integral_steps(sin(x), x)))     # doctest: +NORMALIZE_WHITESPACE
    TrigRule(func='sin', arg=x, context=sin(x), symbol=x)
    >>> print(repr(integral_steps((x**2 + 3)**2 , x)))     # doctest: +NORMALIZE_WHITESPACE
    RewriteRule(rewritten=x**4 + 6*x**2 + 9,
    substep=AddRule(substeps=[PowerRule(base=x, exp=4, context=x**4, symbol=x),
        ConstantTimesRule(constant=6, other=x**2,
            substep=PowerRule(base=x, exp=2, context=x**2, symbol=x),
                context=6*x**2, symbol=x),
        ConstantRule(constant=9, context=9, symbol=x)],
    context=x**4 + 6*x**2 + 9, symbol=x), context=(x**2 + 3)**2, symbol=x)


    Returns
    =======
    rule : namedtuple
        The first step; most rules have substeps that must also be
        considered. These substeps can be evaluated using ``manualintegrate``
        to obtain a result.

    Nc                s   | j }t|trtS t|tjr&tjS  |jkr6tjS xDtjtjtj	tj
tjtjtjtjtjtjtfD ]}t||rf|S qfW d S )N)rs   rJ   r   rU   
Derivativerg   r_   rk   r   rl   rz   r[   r]   ry   rw   rx   r{   r   )r   rs   r   )rQ   r   r   r   &  s    


zintegral_steps.<locals>.keyc                 s    fdd}|S )Nc                s    | }|ot |S )N)
issubclass)r   k)r   klassesr   r   _integral_is_subclass8  s    zKintegral_steps.<locals>.integral_is_subclass.<locals>._integral_is_subclassr   )r  r  )r   )r  r   integral_is_subclass7  s    z,integral_steps.<locals>.integral_is_subclass)-_integral_cacherA   r   r   r
   rU   rk   r   r   r   r   rl   r   r[   r   r]   r   r   r  r   r  r  r   r   r{   r   r   r_   r   r.   r  r  r   partial_fractions_rulecancel_rulerz   ry   rw   rx   r   distribute_expand_ruler   trig_expand_ruler  r  )rs   rQ   ZoptionsZcachekeyr   r  r   r   )r   rQ   r   r     s^    .


r   c             C   s   | | S )Nr   )r   rs   rQ   r   r   r   eval_constantg  s    r  c             C   s   | t | S )N)r   )r   r   r   rs   rQ   r   r   r   eval_constanttimesk  s    r  c             C   s2   t | |d  |d  t |dft | dfS )NrS   r   T)rU   r	   r   rz   )ro   rl   rs   rQ   r   r   r   
eval_powero  s    r  c             C   s   |t |  S )N)rU   ln)ro   rl   rs   rQ   r   r   r   eval_expv  s    r  c             C   s   t tt| S )N)r\   mapr   )r#   rs   rQ   r   r   r   eval_addz  s    r   c             C   s   t |}|| |S )N)r   rh   )rt   r   r   r   rs   rQ   r   r   r   r   eval_u~  s    r!  c             C   s   t |}| | t | S )N)r   )rp   r   r   Zsecond_steprs   rQ   r   r   r   r   
eval_parts  s    r"  c             C   sN   d| }g }d}x.| D ]&}| ||j t|j  |d9 }qW tj| | S )NrS   r   )r   rp   r   r   rU   r[   )Zparts_rulesr   rs   rQ   r   ZsignrB   r   r   r   eval_cyclicparts  s    
r#  c             C   st   | dkrt | S | dkr&t |S | dkr8t |S | dkrJt |S | dkr\t |S | dkrpt | S d S )Nr   r   zsec*tanzcsc*cotzsec**2zcsc**2)rU   r   r   rX   rZ   rV   rY   )r*   rP   rs   rQ   r   r   r   	eval_trig  s    



r$  c             C   s2   | | d t ||  t |t ||   S )NrS   )rU   r   ry   )ra   rc   r   rs   rQ   r   r   r   eval_arctan  s    r%  c             C   s8   |  | d t | |  t |t | |   S )NrS   )rU   r   Zacoth)ra   rc   r   rs   rQ   r   r   r   eval_arccoth  s    r&  c             C   s8   |  | d t | |  t |t | |   S )NrS   )rU   r   Zatanh)ra   rc   r   rs   rQ   r   r   r   eval_arctanh  s    r'  c             C   s
   t | S )N)rU   r  )r*   rs   rQ   r   r   r   eval_reciprocal  s    r(  c             C   s
   t |S )N)rU   rw   )rs   rQ   r   r   r   eval_arcsin  s    r)  c             C   s   | |S )Nr   )r*   rs   rQ   r   r   r   eval_inversehyperbolic  s    r*  c             C   s   t | d S )Nr   )r   )r.   rs   rQ   r   r   r   eval_alternative  s    r+  c             C   s   t |S )N)r   )r   r   rs   rQ   r   r   r   eval_rewrite  s    r,  c             C   s   t jdd | D  S )Nc             S   s   g | ]\}}t ||fqS r   )r   )rG   r   condr   r   r   rR     s   z"eval_piecewise.<locals>.<listcomp>)rU   r	   )r#   rs   rQ   r   r   r   eval_piecewise  s    
r.  c             C   sx  | t| dt|  }t|t}t|dks:t|d }t	|| |}t|dksbtt
|d \}	}
t|tjr|	}|
}t|
d |	d  }t|d }ntt|tjr|	}|
}t|
d |	d  }t|d }n:t|tjr"|	}|
}t|
d |	d  }t|d }t| || ft| || ft| || f| |fg}tt| | |fS )NrS   r   rN   )rh   rU   rX   r   rK   r   r   r^   AssertionErrorZsolveZfractionrJ   r   r   rw   rx   rV   ry   r	   r   r   )r   r*   r   r   r  rs   rQ   Ztrig_functionZrelationZnumerr  ZoppositeZ
hypotenuseZadjacentZinverser   r   r   r   eval_trigsubstitution  s8    
r0  c             C   sP   t | j}x2t|D ]&\}\}}||kr||d f||< P qW tj| jf| S )NrS   )rK   variable_countr   rU   r  r   )rs   rQ   r1  rH   varcountr   r   r   eval_derivativerule  s    
r4  c             C   s   t | ||||  S )N)rU   r{   rh   )ZhargZibndr   rs   rQ   r   r   r   eval_heaviside  s    r5  c             C   s~   t dt| d |d |d | | | |  t| | | df|t| df|| d |d  d || | d  t| dfS )NrN   rS   r   r   )r	   rU   r   r   r   )r;   ra   rc   rs   rQ   r   r   r   eval_jacobi   s    <r6  c             C   sZ   t t| d |d |d|d   t|dft| d || d  t| dftjjdfS )NrS   rN   r   T)r	   rU   r   r   r|   SZero)r;   ra   rs   rQ   r   r   r   eval_gegenbauer  s    * r9  c             C   sV   t t| d || d  t| d || d   d tt| df|d d dfS )NrS   rN   T)r	   rU   r|   r   rm   )r;   rs   rQ   r   r   r   eval_chebyshevt  s    ,r:  c             C   s0   t t| d || d  t| dftjjdfS )NrS   r   T)r	   rU   r|   r   r7  r8  )r;   rs   rQ   r   r   r   eval_chebyshevu  s     r;  c             C   s,   t | d |t | d | d|  d  S )NrS   rN   )rU   r~   )r;   rs   rQ   r   r   r   eval_legendre  s    r<  c             C   s   t | d |d| d   S )NrS   rN   )rU   r   )r;   rs   rQ   r   r   r   eval_hermite  s    r=  c             C   s   t | |t | d | S )NrS   )rU   r   )r;   rs   rQ   r   r   r   eval_laguerre"  s    r>  c             C   s   t | d |d | S )NrS   )rU   r   )r;   ra   rs   rQ   r   r   r   eval_assoclaguerre&  s    r?  c             C   s   t | |S )N)rU   r   )rs   rQ   r   r   r   eval_dontknowrule*  s    r@  c             C   s(   t | j}|s tdt|  ||  S )NzCannot evaluate rule %s)rC   rd   r   
ValueErrorrepr)rB   Z	evaluatorr   r   r   r   .  s    r   c             C   s   t t| |}t|trt|jdkr|jd d }t|tr|jd d dkr||jd d tj	|j f|jd d df}|S )a  manualintegrate(f, var)

    Compute indefinite integral of a single variable using an algorithm that
    resembles what a student would do by hand.

    Unlike ``integrate``, var can only be a single symbol.

    Examples
    ========

    >>> from sympy import sin, cos, tan, exp, log, integrate
    >>> from sympy.integrals.manualintegrate import manualintegrate
    >>> from sympy.abc import x
    >>> manualintegrate(1 / x, x)
    log(x)
    >>> integrate(1/x)
    log(x)
    >>> manualintegrate(log(x), x)
    x*log(x) - x
    >>> integrate(log(x))
    x*log(x) - x
    >>> manualintegrate(exp(x) / (1 + exp(2 * x)), x)
    atan(exp(x))
    >>> integrate(exp(x) / (1 + exp(2 * x)))
    RootSum(4*_z**2 + 1, Lambda(_i, _i*log(2*_i + exp(x))))
    >>> manualintegrate(cos(x)**4 * sin(x), x)
    -cos(x)**5/5
    >>> integrate(cos(x)**4 * sin(x), x)
    -cos(x)**5/5
    >>> manualintegrate(cos(x)**4 * sin(x)**3, x)
    cos(x)**7/7 - cos(x)**5/5
    >>> integrate(cos(x)**4 * sin(x)**3, x)
    cos(x)**7/7 - cos(x)**5/5
    >>> manualintegrate(tan(x), x)
    -log(cos(x))
    >>> integrate(tan(x), x)
    -log(cos(x))

    See Also
    ========

    sympy.integrals.integrals.integrate
    sympy.integrals.integrals.Integral.doit
    sympy.integrals.integrals.Integral
    rN   r   rS   T)
r   r   rJ   r	   r^   rT   r   r*   rU   r   )r`   r2  r   r-  r   r   r   manualintegrate5  s    .rC  )r   )__doc__Z
__future__r   r   collectionsr   rU   Zsympy.core.compatibilityr   Zsympy.core.logicr   Z(sympy.functions.elementary.trigonometricr   Z#sympy.functions.special.polynomialsr   Z$sympy.functions.elementary.piecewiser	   Zsympy.strategies.corer
   r   r   r   Zsympy.core.relationalr   r   Zsympy.polys.polytoolsr   r7  r8  re   r   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@   rA   rC   rE   rF   rO   r   r   r   r   r.   r   r   r   r   r   r   r   r   r   r   r   r   r   Zcacheitr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r)  r*  r+  r,  r.  r0  r4  r5  r6  r9  r:  r;  r<  r=  r>  r?  r@  r   rC  r   r   r   r   <module>   s8  




























JAL>)		








=:



{%
