o
    8Va!P                     @   s  d 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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)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 G d
d de(Z2G dd de2e)Z3G dd de,e2Z4G dd de2e*Z5G dd de1Z6G dd de6e0Z7G dd de-Z8G dd de8e.Z9dd Z:dd Z;dS )zl
Continuous Random Variables Module

See Also
========
sympy.stats.crv_types
sympy.stats.rv
sympy.stats.frv
    )IntervalIntersectionsymbolssympifyDummynanIntegralAndOr	Piecewisecacheit	integrateooLambdaBasicSexpI	FiniteSetNeEqUnionpolyseries	factorial)	PoleError)
DiracDelta)PolynomialError)solveset)reduce_rational_inequalities)_sympify)
RandomDomainSingleDomainConditionalDomain	is_randomProductDomainPSpaceSinglePSpacerandom_symbolsNamedArgsMixinDistributionc                   @   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)Nz#Not Implemented for generic Domains)NotImplementedErrorself r/   1/usr/lib/python3/dist-packages/sympy/stats/crv.py
as_boolean!   s   zContinuousDomain.as_booleanN)__name__
__module____qualname____doc__is_Continuousr1   r/   r/   r/   r0   r+      s    r+   c                   @   "   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   sJ   |d u r| j }|s|S t|t| j krtdt|| j| jffi |S )NzValues should be equal)r   	frozenset
ValueErrorr   symbolset)r.   expr	variableskwargsr/   r/   r0   compute_expectation+   s   z*SingleContinuousDomain.compute_expectationc                 C   s   | j | jS N)r<   Zas_relationalr;   r-   r/   r/   r0   r1   5   s   z!SingleContinuousDomain.as_booleanrA   r2   r3   r4   r5   r@   r1   r/   r/   r/   r0   r8   %   s    

r8   c                   @   r7   )ProductContinuousDomainzE
    A collection of independent domains with continuous support
    Nc                 K   sH   |d u r| j }| jD ]}t|t|j @ }|r!|j||fi |}q
|S rA   )r   domainsr9   r@   )r.   r=   r>   r?   domainZdomain_varsr/   r/   r0   r@   >   s   
z+ProductContinuousDomain.compute_expectationc                 C   s   t dd | jD  S )Nc                 S   s   g | ]}|  qS r/   )r1   ).0rE   r/   r/   r0   
<listcomp>H       z6ProductContinuousDomain.as_boolean.<locals>.<listcomp>)r	   rD   r-   r/   r/   r0   r1   G   s   z"ProductContinuousDomain.as_booleanrA   rB   r/   r/   r/   r0   rC   9   s    
	rC   c                   @   s.   e Zd ZdZd	ddZdd Zedd ZdS )
ConditionalContinuousDomainzo
    A domain with continuous support that has been further restricted by a
    condition such as $x > 3$.
    Nc                 K   sH  |d u r| j }|s|S | j||}|jt|j}}| jg}|r| }|jr>t	|t
r4||j nct	|tr=tdnY|jr|jrO|t|j|j 9 }nH|jt| j @ }	t|	dkratd|	 }
t|D ]&\}}|d |
krt||
}t|d |d }||}|
|j|jf||< qintd| |s!t|g|R i |S )NzOr not implemented here   z-Multivariate Inequalities not yet implementedr      z+Condition %s is not a relational or Boolean)r   
fulldomainr@   functionlistlimits	conditionpopZ
is_Boolean
isinstancer	   extendargsr
   r,   is_RelationalZis_Equalityr   lhsrhsZfree_symbolsr<   len	enumerate!reduce_rational_inequalities_wrapr   	intersectleftright	TypeErrorr   )r.   r=   r>   r?   Z
fullintgrlZ	integrandrO   
conditionsZcondr   r;   ilimitZcintvlZlintvlZintvlr/   r/   r0   r@   Q   sN   


"z/ConditionalContinuousDomain.compute_expectationc                 C   s   t | j | jS rA   )r	   rL   r1   rP   r-   r/   r/   r0   r1      s   z&ConditionalContinuousDomain.as_booleanc                 C   s4   t | jdkr| jjt| jt| jd @ S td)NrJ   r   z)Set of Conditional Domain not Implemented)rX   r   rL   r<   rZ   rP   tupler,   r-   r/   r/   r0   r<      s   zConditionalContinuousDomain.setrA   )r2   r3   r4   r5   r@   r1   propertyr<   r/   r/   r/   r0   rI   K   s    
/rI   c                   @   s   e Zd Zdd ZdS )ContinuousDistributionc                 G   s
   | j | S rA   )pdf)r.   rT   r/   r/   r0   __call__   s   
zContinuousDistribution.__call__N)r2   r3   r4   rf   r/   r/   r/   r0   rd      s    rd   c                   @   s   e Zd ZdZee e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e
dd Zdd Zdd  Zd!S )#SingleContinuousDistributiona   Continuous distribution of a single variable.

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

    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| g|R  S rA   )rN   mapr   r   __new__)clsrT   r/   r/   r0   ri      s   z$SingleContinuousDistribution.__new__c                  G      d S rA   r/   )rT   r/   r/   r0   check   s   z"SingleContinuousDistribution.checkc                 K   s\   t ddtd\}}| jj}| |}t| |||ffi |}t|||kfd}t||S )zB Compute the CDF from the PDF.

        Returns a Lambda.
        x, zTrealrj   r   T)	r   r   r<   startre   r   Zdoitr   r   )r.   r?   xz
left_boundre   cdfr/   r/   r0   compute_cdf   s   

z(SingleContinuousDistribution.compute_cdfc                 C   rk   rA   r/   r.   rr   r/   r/   r0   _cdf      z!SingleContinuousDistribution._cdfc                 K   6   t |dkr| |}|dur|S | jdi ||S z Cumulative density function r   Nr/   )rX   rx   rv   )r.   rr   r?   ru   r/   r/   r0   ru      
   
z SingleContinuousDistribution.cdfc                 K   sF   t ddtd\}}| |}ttt| | | || jf}t||S )zV Compute the characteristic function from the PDF.

        Returns a Lambda.
        x, tTrn   )r   r   re   r   r   r   r<   r   )r.   r?   rr   tre   cfr/   r/   r0   compute_characteristic_function   s   
 
z<SingleContinuousDistribution.compute_characteristic_functionc                 C   rk   rA   r/   r.   r~   r/   r/   r0   _characteristic_function   ry   z5SingleContinuousDistribution._characteristic_functionc                 K   rz   )z Characteristic function r   Nr/   )rX   r   r   )r.   r~   r?   r   r/   r/   r0   characteristic_function   r|   z4SingleContinuousDistribution.characteristic_functionc                 K   sB   t ddtd\}}| |}tt|| | || jf}t||S )zY Compute the moment generating function from the PDF.

        Returns a Lambda.
        r}   Trn   )r   r   re   r   r   r<   r   )r.   r?   rr   r~   re   mgfr/   r/   r0   "compute_moment_generating_function   s   

z?SingleContinuousDistribution.compute_moment_generating_functionc                 C   rk   rA   r/   r   r/   r/   r0   _moment_generating_function   ry   z8SingleContinuousDistribution._moment_generating_functionc                 K   s.   |s|  |}|dur|S | jdi ||S )z Moment generating function Nr/   )r   r   )r.   r~   r?   r   r/   r/   r0   moment_generating_function   s
   
z7SingleContinuousDistribution.moment_generating_functionTc                 K   s  |r~zat ||}|jrtjW S tddd}| |}|du r0t|| | || jffi |W S |	 }t t
||d|d  |}	d}
t|d D ]}|
||| |	||  t| 7 }
qJ|
W S  ty}   t|| | || jffi | Y S w t|| | || jffi |S )z- Expectation of expression over distribution r~   Tro   Nr   rJ   )r   Zis_zeror   Zeror   r   r   re   r<   Zdegreer   ZremoveOrangeZcoeff_monomialr   r   r   )r.   r=   varevaluater?   pr~   r   ZdegZtaylorresultkr/   r/   r0   expectation   s&   

$*&"z(SingleContinuousDistribution.expectationc                 K   sr   t ddtd\}}| jj}| |}t||||ffi |}t|| || j}t|t||dk|dk@ ft	dfS )zG Compute the Quantile from the PDF.

        Returns a Lambda.
        zx, pTrn   r   rJ   )
r   r   r<   rq   re   r   r   r   r   r   )r.   r?   rr   r   rt   re   ru   quantiler/   r/   r0   compute_quantile  s   
$z-SingleContinuousDistribution.compute_quantilec                 C   rk   rA   r/   rw   r/   r/   r0   	_quantile  ry   z&SingleContinuousDistribution._quantilec                 K   rz   r{   )rX   r   r   )r.   rr   r?   r   r/   r/   r0   r     r|   z%SingleContinuousDistribution.quantileNT)r2   r3   r4   r5   r   r   r<   ri   staticmethodrl   r   rv   rx   ru   r   r   r   r   r   r   r   r   r   r   r/   r/   r/   r0   rg      s.    







rg   c                   @   s   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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 rA   )densityrE   r   r-   r/   r/   r0   re   1  s   zContinuousPSpace.pdfNFc                 K   sZ   |d u r| j }nt|}|dd |D }tdd |D }| jj| j| |fi |S )Nc                 S      i | ]}||j qS r/   r;   rF   rvr/   r/   r0   
<dictcomp>;  rH   z8ContinuousPSpace.compute_expectation.<locals>.<dictcomp>c                 s       | ]}|j V  qd S rA   r   r   r/   r/   r0   	<genexpr>=      z7ContinuousPSpace.compute_expectation.<locals>.<genexpr>)valuesr9   xreplacerE   r@   re   )r.   r=   rvsr   r?   Zdomain_symbolsr/   r/   r0   r@   5  s   z$ContinuousPSpace.compute_expectationc                 K   s   || j v r,tt| j t|g }tdd |D }| jj| j|fi |}t|j|S t	ddd}t|| jt
|| fi |S )Nc                 s   r   rA   r   )rF   Zrsr/   r/   r0   r   G  r   z3ContinuousPSpace.compute_density.<locals>.<genexpr>rs   Tr   )r   rb   r<   r9   rE   r@   re   r   r;   r   r   )r.   r=   r?   Zrandomsymbolsr   re   rs   r/   r/   r0   compute_densityB  s   
 z ContinuousPSpace.compute_densityc                 K   sx   | j jjs	td| j|fi |}tddtd\}}| j jj}t|||||ffi |}t	|||kfd}t
||S )Nz0CDF not well defined on multivariate expressionsrm   Trn   rp   )rE   r<   is_Intervalr:   r   r   r   rq   r   r   r   )r.   r=   r?   drr   rs   rt   ru   r/   r/   r0   rv   N  s   


zContinuousPSpace.compute_cdfc                 K   sn   | j jjs	td| j|fi |}tddtd\}}ttt	| | || |t
 t
ffi |}t||S )NzCCharacteristic function of multivariate expressions not implementedr}   Trn   )rE   r<   r   r,   r   r   r   r   r   r   r   r   )r.   r=   r?   r   rr   r~   r   r/   r/   r0   r   ^  s   
.
z0ContinuousPSpace.compute_characteristic_functionc                 K   sj   | j jjs	td| j|fi |}tddtd\}}tt|| || |t	 t	ffi |}t
||S )NzFMoment generating function of multivariate expressions not implementedr}   Trn   )rE   r<   r   r,   r   r   r   r   r   r   r   )r.   r=   r?   r   rr   r~   r   r/   r/   r0   r   h  s   
*
z3ContinuousPSpace.compute_moment_generating_functionc                 K   s\   | j jjs	td| j|fi |}tddd}tddd}t||| || j}t||S )Nz5Quantile not well defined on multivariate expressionsrr   Tr   r   )Zpositive)rE   r<   r   r:   rv   r   r   r   )r.   r=   r?   r   rr   r   r   r/   r/   r0   r   r  s   

z!ContinuousPSpace.compute_quantilec              	      s  t dddd}t|trt|jd |jd }d}zU| |  fdd| jD d }| j|fi  jt	j
u sAt jtrK|sGt	jW S t	jW S t jtratfd	d
 jjD W S t jffi W S  ty   ddlm} |j|j }t|s| j}|j}n
||fi }d}t|tsddlm}	 |	|| jjd}t|}
|
||
j|}|s| Y S t	j|  Y S w )Nrs   Tr   Fr   rJ   c                    s   g | ]
}|j  j kr|qS r/   r   r   )rE   r/   r0   rG     s    z0ContinuousPSpace.probability.<locals>.<listcomp>c                 3   s4    | ]}t |trt|ffi  V  qd S rA   )rR   r   r   )rF   Zsubset)r?   re   rs   r/   r0   r     s    
z/ContinuousPSpace.probability.<locals>.<genexpr>)r   )ContinuousDistributionHandmade)r<   )r   rR   r   r   rT   wherer   r   r<   r   ZEmptySetr   r   ZOner   sumr   r,   sympy.stats.rvr   rV   rW   r$   rd   Zsympy.stats.crv_typesr   rE   SingleContinuousPSpaceprobability	__class__value)r.   rP   r?   Zcond_invr   r   r=   Zdenscompr   Zspacer   r/   )rE   r?   re   rs   r0   r     s>   




zContinuousPSpace.probabilityc                 C   s\   t t|}t|dkr|| jstdt|d }t||}|| j	j
}t|j|S )NrJ   z2Multiple continuous random variables not supportedr   )r9   r(   rX   issubsetr   r,   rb   rZ   r[   rE   r<   r8   r;   )r.   rP   r   r   intervalr/   r/   r0   r     s   
zContinuousPSpace.wherec           	      K   st   | dd | jD }t| j|}|r5dd | jD }|j| jfi |}| j| | }tt|j|}t	||S )Nc                 S   r   r/   r   r   r/   r/   r0   r     rH   z6ContinuousPSpace.conditional_space.<locals>.<dictcomp>c                 S   s   i | ]	}|t t|qS r/   )r   strr   r/   r/   r0   r     s    )
r   r   rI   rE   r   r@   re   r   rb   r   )	r.   rP   	normalizer?   rE   ZreplacementZnormre   r   r/   r/   r0   conditional_space  s   
z"ContinuousPSpace.conditional_spaceNFr   )r2   r3   r4   r5   r6   Zis_realrc   re   r@   r   r   rv   r   r   r   r   r   r   r/   r/   r/   r0   r   &  s&    



	
	
)
r   c                   @   sd   e Zd ZdZedd Zedd Zdd	d
ZdddZ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 rA   )distributionr<   r-   r/   r/   r0   r<     s   zSingleContinuousPSpace.setc                 C   s   t t| j| jS rA   )r8   r   r;   r<   r-   r/   r/   r0   rE     s   zSingleContinuousPSpace.domainr/   scipyNc                 C   s   | j | jj|||diS )zp
        Internal sample method.

        Returns dictionary mapping RandomSymbol to realization value.
        )libraryseed)r   r   sample)r.   sizer   r   r/   r/   r0   r     s   zSingleContinuousPSpace.sampleFc                 K   s   |p| j f}| j |vr|S t|}|dd |D }| j j}z| jj||fd|i|W S  tyE   t|| j || j	ffi | Y S w )Nc                 S   r   r/   r   r   r/   r/   r0   r     rH   z>SingleContinuousPSpace.compute_expectation.<locals>.<dictcomp>r   )
r   r    r   r;   r   r   r   r   re   r<   )r.   r=   r   r   r?   rr   r/   r/   r0   r@     s   
"z*SingleContinuousPSpace.compute_expectationc                 K   D   || j krtddd}t|| jj|fi |S tj| |fi |S )Nrs   Tr   )r   r   r   r   ru   r   rv   )r.   r=   r?   rs   r/   r/   r0   rv        
z"SingleContinuousPSpace.compute_cdfc                 K   r   Nr~   Tr   )r   r   r   r   r   r   r   r.   r=   r?   r~   r/   r/   r0   r     r   z6SingleContinuousPSpace.compute_characteristic_functionc                 K   r   r   )r   r   r   r   r   r   r   r   r/   r/   r0   r     r   z9SingleContinuousPSpace.compute_moment_generating_functionc                    s   || j kr| jS tdddt| | j tj}t|tr*tj|jv r*t	|jd }|s5t
d|| j f | | j  t fdd|D }t|S )NyTr   rJ   zCan not solve %s for %sc                 3   s&    | ]} |t | V  qd S rA   )absZdiff)rF   gZfxr   r/   r0   r     s   $ z9SingleContinuousPSpace.compute_density.<locals>.<genexpr>)r   r   r   r   r   ZRealsrR   r   rT   rN   r:   r   r   r   )r.   r=   r?   ZgsZfyr/   r   r0   r     s   

z&SingleContinuousPSpace.compute_densityc                 K   r   )Nr   Tr   )r   r   r   r   r   r   r   )r.   r=   r?   r   r/   r/   r0   r     s   
z'SingleContinuousPSpace.compute_quantile)r/   r   Nr   )r2   r3   r4   r5   rc   r<   rE   r   r@   rv   r   r   r   r   r/   r/   r/   r0   r     s    	



r   c                 K   s4   z
t | |fi |W S  ty   td| d  w )Nz!Reduction of condition failed %s
r   )r   r   r:   )r_   r   r?   r/   r/   r0   _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 }|D ]}||}q2|S d S )NFZ
relationalc                       g | ]}t |gg d dqS Fr   r   rF   argr   r/   r0   rG   '      z5reduce_rational_inequalities_wrap.<locals>.<listcomp>c                    r   r   r   r   r   r/   r0   rG   *  r   r   )rU   r   rR   r
   r   rT   r	   r[   )rP   r   Z	intervalsr   r`   r/   r   r0   rZ   #  s   


rZ   N)<r5   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   r   Zsympy.core.functionr   Z'sympy.functions.special.delta_functionsr   Zsympy.polys.polyerrorsr   Zsympy.solvers.solvesetr   Zsympy.solvers.inequalitiesr   Zsympy.core.sympifyr    r   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r8   rC   rI   rd   rg   r   r   r   rZ   r/   r/   r/   r0   <module>   s*    l0B  !V