B
    [L                 @   s  d 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 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 m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z- dd	l.Z.G d
d deZ/G dd de/eZ0G dd dee/Z1G dd de/eZ2G dd deZ3G dd de3eZ4G dd de4Z5G dd de	Z6G dd de6e
Z7dd Z8dd Z9d	S ) zl
Continuous Random Variables Module

See Also
========
sympy.stats.crv_types
sympy.stats.rv
sympy.stats.frv
    )print_functiondivision)RandomDomainSingleDomainConditionalDomainProductDomainPSpaceSinglePSpacerandom_symbolsNamedArgsMixin)
DiracDelta)IntervalIntersectionsymbolssympifyDummyIntegralAndOr	Piecewisecacheit	integrateooLambdaBasicSexpI	FiniteSetNeEqUnionpolyseries	factorial)solveset)reduce_rational_inequalities)PolynomialErrorNc               @   s   e Zd ZdZdZdd ZdS )ContinuousDomainzX
    A domain with continuous support

    Represented using symbols and Intervals.
    Tc             C   s   t dd S )Nz#Not Implemented for generic Domains)NotImplementedError)self r+   .lib/python3.7/site-packages/sympy/stats/crv.py
as_boolean!   s    zContinuousDomain.as_booleanN)__name__
__module____qualname____doc__is_Continuousr-   r+   r+   r+   r,   r(      s   r(   c               @   s"   e Zd ZdZdddZdd ZdS )SingleContinuousDomainzj
    A univariate domain with continuous support

    Represented using a single symbol and interval.
    Nc             K   sF   |d kr| j }|s|S t|t| j kr0tdt|| j| jff|S )NzValues should be equal)r   	frozenset
ValueErrorr   symbolset)r*   expr	variableskwargsr+   r+   r,   compute_expectation+   s    z*SingleContinuousDomain.compute_expectationc             C   s   | j | jS )N)r7   Zas_relationalr6   )r*   r+   r+   r,   r-   5   s    z!SingleContinuousDomain.as_boolean)N)r.   r/   r0   r1   r;   r-   r+   r+   r+   r,   r3   %   s   

r3   c               @   s"   e Zd ZdZdddZdd ZdS )ProductContinuousDomainzE
    A collection of independent domains with continuous support
    Nc             K   sH   |d kr| j }x4| jD ]*}t|t|j @ }|r|j||f|}qW |S )N)r   domainsr4   r;   )r*   r8   r9   r:   domainZdomain_varsr+   r+   r,   r;   >   s    z+ProductContinuousDomain.compute_expectationc             C   s   t dd | jD  S )Nc             S   s   g | ]}|  qS r+   )r-   ).0r>   r+   r+   r,   
<listcomp>H   s    z6ProductContinuousDomain.as_boolean.<locals>.<listcomp>)r   r=   )r*   r+   r+   r,   r-   G   s    z"ProductContinuousDomain.as_boolean)N)r.   r/   r0   r1   r;   r-   r+   r+   r+   r,   r<   9   s   
	r<   c               @   s.   e Zd ZdZd	ddZdd Zedd ZdS )
ConditionalContinuousDomainzl
    A domain with continuous support that has been further restricted by a
    condition such as x > 3
    Nc             K   sL  |d kr| j }|s|S | j||}|jt|j }}| jg}x|r:| }|jrt	|t
rl||j nt	|tr~tdq@|jr,|jr|t|j|j 9 }n|jt| j @ }	t|	dkrtd|	 }
xft|D ]L\}}|d |
krt||
}t|d |d }||}|
|j|jf||< qW q@td| q@W t|f||S )NzOr not implemented here   z-Multivariate Inequalities not yet implementedr      z+Condition %s is not a relational or Boolean)r   
fulldomainr;   Zfunctionlistlimits	conditionpopZ
is_Boolean
isinstancer   extendargsr   r)   is_RelationalZis_Equalityr   lhsrhsZfree_symbolsr7   len	enumerate!reduce_rational_inequalities_wrapr   	intersectleftright	TypeErrorr   )r*   r8   r9   r:   Z
fullintgrlZ	integrandrF   
conditionsZcondr   r6   ilimitZcintvlZlintvlZintvlr+   r+   r,   r;   Q   s@    



z/ConditionalContinuousDomain.compute_expectationc             C   s   t | j | jS )N)r   rD   r-   rG   )r*   r+   r+   r,   r-      s    z&ConditionalContinuousDomain.as_booleanc             C   s8   t | jdkr,| jjt| jt| jd @ S tdd S )NrB   r   z)Set of Conditional Domain not Implemented)rO   r   rD   r7   rQ   rG   tupler)   )r*   r+   r+   r,   r7      s
    zConditionalContinuousDomain.set)N)r.   r/   r0   r1   r;   r-   propertyr7   r+   r+   r+   r,   rA   K   s   
/rA   c               @   s   e Zd Zdd ZdS )ContinuousDistributionc             G   s
   | j | S )N)pdf)r*   rK   r+   r+   r,   __call__   s    zContinuousDistribution.__call__N)r.   r/   r0   r]   r+   r+   r+   r,   r[      s   r[   c               @   s   e Zd ZdZee eZdd Zedd Z	dd Z
edd	 Zed
d Zdd Zdd Zedd Zdd Zdd Zedd Zdd Zdd Zd ddZdS )!SingleContinuousDistributionam   Continuous distribution of a single variable

    Serves as superclass for Normal/Exponential/UniformDistribution etc....

    Represented by parameters for each of the specific classes.  E.g
    NormalDistribution is represented by a mean and standard deviation.

    Provides methods for pdf, cdf, and sampling

    See Also:
        sympy.stats.crv_types.*
    c             G   s   t tt|}tj| f| S )N)rE   mapr   r   __new__)clsrK   r+   r+   r,   r`      s    z$SingleContinuousDistribution.__new__c              G   s   d S )Nr+   )rK   r+   r+   r,   check   s    z"SingleContinuousDistribution.checkc             C   s   |   }|tddS )z, A random realization from the distribution r   rB   )_inverse_cdf_expressionrandomZuniform)r*   Zicdfr+   r+   r,   sample   s    z#SingleContinuousDistribution.samplec             C   s   t dddtd\}}y@t| || |tj}t|trRtj|jkrRt	|jd }W n t
k
rl   d}Y nX |r~t|dkrt
dt||d S )z4 Inverse of the CDF

        Used by sample
        zx, zT)realZpositivera   rB   NzCould not invert CDFr   )r   r   r%   cdfr   RealsrI   r   rK   rE   r)   rO   r   )r*   xzZinverse_cdfr+   r+   r,   rc      s    
z4SingleContinuousDistribution._inverse_cdf_expressionc             K   sV   t dddtd\}}| jj}| |}t||||ff|}t|||kfd}t||S )z@ Compute the CDF from the PDF

        Returns a Lambda
        zx, zT)rf   finitera   )r   T)r   r   r7   startr\   r   r   r   )r*   r:   ri   rj   
left_boundr\   rg   r+   r+   r,   compute_cdf   s    
z(SingleContinuousDistribution.compute_cdfc             C   s   d S )Nr+   )r*   ri   r+   r+   r,   _cdf   s    z!SingleContinuousDistribution._cdfc             K   s2   t |dkr"| |}|dk	r"|S | jf ||S )z Cumulative density function r   N)rO   ro   rn   )r*   ri   r:   rg   r+   r+   r,   rg      s
    
z SingleContinuousDistribution.cdfc             K   sJ   t dddtd\}}| |}ttt| | | |t tf}t||S )zT Compute the characteristic function from the PDF

        Returns a Lambda
        zx, tT)rf   rk   ra   )r   r   r\   r   r   r   r   r   )r*   r:   ri   tr\   cfr+   r+   r,   compute_characteristic_function   s    
"z<SingleContinuousDistribution.compute_characteristic_functionc             C   s   d S )Nr+   )r*   rp   r+   r+   r,   _characteristic_function   s    z5SingleContinuousDistribution._characteristic_functionc             K   s2   t |dkr"| |}|dk	r"|S | jf ||S )z Characteristic function r   N)rO   rs   rr   )r*   rp   r:   rq   r+   r+   r,   characteristic_function   s
    
z4SingleContinuousDistribution.characteristic_functionc             K   sD   t ddtd\}}| |}tt|| | |t tf}t||S )zW Compute the moment generating function from the PDF

        Returns a Lambda
        zx, tT)rf   ra   )r   r   r\   r   r   r   r   )r*   r:   ri   rp   r\   mgfr+   r+   r,   "compute_moment_generating_function   s    
z?SingleContinuousDistribution.compute_moment_generating_functionc             C   s   d S )Nr+   )r*   rp   r+   r+   r,   _moment_generating_function   s    z8SingleContinuousDistribution._moment_generating_functionc             K   sL   t |dkr<y| |}|dk	r$|S W n tk
r:   dS X | jf ||S )z Moment generating function r   N)rO   rw   r)   rv   )r*   rp   r:   ru   r+   r+   r,   moment_generating_function  s    
z7SingleContinuousDistribution.moment_generating_functionTc             K   s  |ryt ||}tddd}| |}|dkrLt|| | || jff|S | }t t||d|d  |}	d}
x<t	|d D ],}|
|
|| |	
||  t| 7 }
qW |
S  tk
r   t|| | || jff|S X nt|| | || jff|S dS )z- Expectation of expression over distribution rp   T)rf   Nr   rB   )r"   r   rw   r   r\   r7   Zdegreer#   ZremoveOrangeZcoeff_monomialr$   r'   r   )r*   r8   varevaluater:   prp   ru   ZdegZtaylorresultkr+   r+   r,   expectation  s     

,"z(SingleContinuousDistribution.expectationN)T)r.   r/   r0   r1   r   r   r7   r`   staticmethodrb   re   r   rc   rn   ro   rg   rr   rs   rt   rv   rw   rx   r   r+   r+   r+   r,   r^      s    r^   c               @   s0   e Zd ZdZedd Zee efddZdS )ContinuousDistributionHandmade)r\   c             C   s
   | j d S )NrB   )rK   )r*   r+   r+   r,   r7   $  s    z"ContinuousDistributionHandmade.setc             C   s   t | ||S )N)r   r`   )ra   r\   r7   r+   r+   r,   r`   (  s    z&ContinuousDistributionHandmade.__new__N)	r.   r/   r0   Z	_argnamesrZ   r7   r   r   r`   r+   r+   r+   r,   r   !  s   r   c               @   st   e Zd ZdZdZdZedd ZdddZd	d
 Z	e
dd Ze
dd Ze
dd Zdd Zdd ZdddZdS )ContinuousPSpacez Continuous Probability Space

    Represents the likelihood of an event space defined over a continuum.

    Represented with a ContinuousDomain and a PDF (Lambda-Like)
    Tc             C   s   | j | jj S )N)densityr>   r   )r*   r+   r+   r,   r\   7  s    zContinuousPSpace.pdfNFc             K   sZ   |d kr| j }nt|}|tdd |D }tdd |D }| jj| j| |f|S )Nc             s   s   | ]}||j fV  qd S )N)r6   )r?   rvr+   r+   r,   	<genexpr>A  s    z7ContinuousPSpace.compute_expectation.<locals>.<genexpr>c             s   s   | ]}|j V  qd S )N)r6   )r?   r   r+   r+   r,   r   C  s    )valuesr4   xreplacedictr>   r;   r\   )r*   r8   rvsr{   r:   Zdomain_symbolsr+   r+   r,   r;   ;  s    z$ContinuousPSpace.compute_expectationc             K   s~   || j krTtt| j t|g }tdd |D }| jj| j|f|}t|j|S t	dddd}t|| jt
|| f|S )Nc             s   s   | ]}|j V  qd S )N)r6   )r?   Zrsr+   r+   r,   r   M  s    z3ContinuousPSpace.compute_density.<locals>.<genexpr>rj   T)rf   rk   )r   rY   r7   r4   r>   r;   r\   r   r6   r   r   )r*   r8   r:   Zrandomsymbolsr   r\   rj   r+   r+   r,   compute_densityH  s    
z ContinuousPSpace.compute_densityc             K   sr   | j jjstd| j|f|}tdddtd\}}| j jj}t|||||ff|}t	|||kfd}t
||S )Nz0CDF not well defined on multivariate expressionszx, zT)rf   rk   ra   )r   T)r>   r7   is_Intervalr5   r   r   r   rl   r   r   r   )r*   r8   r:   dri   rj   rm   rg   r+   r+   r,   rn   T  s    

zContinuousPSpace.compute_cdfc             K   sf   | j jjstd| j|f|}tddtd\}}ttt	| | || |t
 t
ff|}t||S )NzCCharacteristic function of multivariate expressions not implementedzx, tT)rf   ra   )r>   r7   r   r)   r   r   r   r   r   r   r   r   )r*   r8   r:   r   ri   rp   rq   r+   r+   r,   rr   d  s    
*z0ContinuousPSpace.compute_characteristic_functionc             K   sb   | j jjstd| j|f|}tddtd\}}tt|| || |t	 t	ff|}t
||S )NzFMoment generating function of multivariate expressions not implementedzx, tT)rf   ra   )r>   r7   r   r)   r   r   r   r   r   r   r   )r*   r8   r:   r   ri   rp   ru   r+   r+   r,   rv   n  s    
&z3ContinuousPSpace.compute_moment_generating_functionc       
   	      sR  t ddddd}t|tr6t|jd |jd }d}y| |  fdd| jD d }| j|f jt	j
kst jtr|st	jS t	jS t jtrtfd	d
 jjD S t jffS  tk
rL   ddlm} |j|j }||f}t|tst|}t|}|||jd}	|sB|	S t	j|	 S X d S )Nrj   T)rf   rk   Fr   rB   c                s   g | ]}|j  j kr|qS r+   )r6   )r?   r   )r>   r+   r,   r@     s    z0ContinuousPSpace.probability.<locals>.<listcomp>c             3   s.   | ]&}t |trt|ff V  qd S )N)rI   r   r   )r?   Zsubset)r:   r\   rj   r+   r,   r     s    z/ContinuousPSpace.probability.<locals>.<genexpr>)r   )r   rI   r   r    rK   wherer   r   r7   r   ZEmptySetr   ZZeroZOner!   sumr   r)   sympy.stats.rvr   rM   rN   r[   r   SingleContinuousPSpaceprobability	__class__value)
r*   rG   r:   Zcond_invr   r   r8   ZdensZspacer}   r+   )r>   r:   r\   rj   r,   r   x  s2    


zContinuousPSpace.probabilityc             C   s\   t t|}t|dkr$|| js,tdt|d }t||}|| j	j
}t|j|S )NrB   z2Multiple continuous random variables not supportedr   )r4   r
   rO   issubsetr   r)   rY   rQ   rR   r>   r7   r3   r6   )r*   rG   r   r   Zintervalr+   r+   r,   r     s    
zContinuousPSpace.wherec       	      K   sp   | tdd | jD }t| j|}|rfdd | jD }|j| jf|}| j| | }t|j|}t	||S )Nc             s   s   | ]}||j fV  qd S )N)r6   )r?   r   r+   r+   r,   r     s    z5ContinuousPSpace.conditional_space.<locals>.<genexpr>c             S   s   i | ]}t t||qS r+   )r   str)r?   r   r+   r+   r,   
<dictcomp>  s    z6ContinuousPSpace.conditional_space.<locals>.<dictcomp>)
r   r   r   rA   r>   r   r;   r\   r   r   )	r*   rG   Z	normalizer:   r>   ZreplacementZnormr\   r   r+   r+   r,   conditional_space  s    z"ContinuousPSpace.conditional_space)NF)T)r.   r/   r0   r1   r2   Zis_realrZ   r\   r;   r   r   rn   rr   rv   r   r   r   r+   r+   r+   r,   r   ,  s   


#
r   c               @   sZ   e Zd ZdZedd Zedd Zdd Zdd
dZdd Z	dd Z
dd Zdd ZdS )r   a
  
    A continuous probability space over a single univariate variable

    These consist of a Symbol and a SingleContinuousDistribution

    This class is normally accessed through the various random variable
    functions, Normal, Exponential, Uniform, etc....
    c             C   s   | j jS )N)distributionr7   )r*   r+   r+   r,   r7     s    zSingleContinuousPSpace.setc             C   s   t t| j| jS )N)r3   r   r6   r7   )r*   r+   r+   r,   r>     s    zSingleContinuousPSpace.domainc             C   s   | j | j iS )zo
        Internal sample method

        Returns dictionary mapping RandomSymbol to realization value.
        )r   r   re   )r*   r+   r+   r,   re     s    zSingleContinuousPSpace.sampleNFc             K   s   |p
| j f}| j |kr|S |tdd |D }| j j}y| jj||fd|i|S  tk
r~   t|| j || j	ff|S X d S )Nc             s   s   | ]}||j fV  qd S )N)r6   )r?   r   r+   r+   r,   r     s    z=SingleContinuousPSpace.compute_expectation.<locals>.<genexpr>r{   )
r   r   r   r6   r   r   	Exceptionr   r\   r7   )r*   r8   r   r{   r:   ri   r+   r+   r,   r;     s    
z*SingleContinuousPSpace.compute_expectationc             K   sD   || j kr0tdddtd}t|| jj|f|S tj| |f|S d S )Nrj   T)rf   rk   ra   )r   r   r   r   r   rg   r   rn   )r*   r8   r:   rj   r+   r+   r,   rn     s    
z"SingleContinuousPSpace.compute_cdfc             K   sB   || j kr.tddtd}t|| jj|f|S tj| |f|S d S )Nrp   T)rf   ra   )r   r   r   r   r   rt   r   rr   )r*   r8   r:   rp   r+   r+   r,   rr     s    
z6SingleContinuousPSpace.compute_characteristic_functionc             K   sB   || j kr.tddtd}t|| jj|f|S tj| |f|S d S )Nrp   T)rf   ra   )r   r   r   r   r   rx   r   rv   )r*   r8   r:   rp   r+   r+   r,   rv     s    
z9SingleContinuousPSpace.compute_moment_generating_functionc                s   || j kr| jS tdt| | j tj}t|trPtj|jkrPt	|jd }|sft
d|| j f | | j  t fdd|D }t|S )NyrB   zCan not solve %s for %sc             3   s$   | ]} |t | V  qd S )N)absZdiff)r?   g)fxr   r+   r,   r      s    z9SingleContinuousPSpace.compute_density.<locals>.<genexpr>)r   r   r   r%   r   rh   rI   r   rK   rE   r5   r   r   r   )r*   r8   r:   ZgsZfyr+   )r   r   r,   r     s    
z&SingleContinuousPSpace.compute_density)NF)r.   r/   r0   r1   rZ   r7   r>   re   r;   rn   rr   rv   r   r+   r+   r+   r,   r     s   
r   c             K   s8   yt | |f|S  tk
r2   td| d  Y nX d S )Nz!Reduction of condition failed %s
r   )r&   r'   r5   )rV   rz   r:   r+   r+   r,   _reduce_inequalities  s    r   c                s   | j rt| gg ddS t| tr:t fdd| jD  S t| tr| fdd| jD }|d }x|D ]}||}qfW |S d S )NF)
relationalc                s   g | ]}t |gg d dqS )F)r   )r   )r?   arg)rz   r+   r,   r@     s   z5reduce_rational_inequalities_wrap.<locals>.<listcomp>c                s   g | ]}t |gg d dqS )F)r   )r   )r?   r   )rz   r+   r,   r@     s   r   )rL   r   rI   r   r!   rK   r   rR   )rG   rz   Z	intervalsr   rW   r+   )rz   r,   rQ   
  s    




rQ   ):r1   Z
__future__r   r   r   r   r   r   r   r   r	   r
   r   Z'sympy.functions.special.delta_functionsr   Zsympyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   Zsympy.solvers.solvesetr%   Zsympy.solvers.inequalitiesr&   Zsympy.polys.polyerrorsr'   rd   r(   r3   r<   rA   r[   r^   r   r   r   r   rQ   r+   r+   r+   r,   <module>	   s*   (hB  M