U
    9%eQ                     @   s  d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
mZ ddlmZmZ ddlmZ ddlmZmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlm Z m!Z! ddl"m#Z#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> G dd de5Z?G dd de?e6Z@G dd de9e?ZAG dd de?e7ZBG dd  d e>ZCG d!d" d"eCe=ZDG d#d$ d$e:ZEG d%d& d&eEe;ZFd'd( ZGd)d* ZHd+S ),zl
Continuous Random Variables Module

See Also
========
sympy.stats.crv_types
sympy.stats.rv
sympy.stats.frv
    )Basic)cacheit)Lambda	PoleError)Inanoo)EqNe)S)Dummysymbols)_sympifysympify)	factorial)exp)	Piecewise)
DiracDelta)Integral	integrate)AndOr)PolynomialError)poly)series)	FiniteSetIntersectionIntervalUnion)solveset)reduce_rational_inequalities)
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d S )Nz#Not Implemented for generic Domains)NotImplementedErrorself r/   N/var/www/html/Darija-Ai-API/env/lib/python3.8/site-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                   @   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/   r0   compute_expectation6   s    z*SingleContinuousDomain.compute_expectationc                 C   s   | j | jS N)r;   Zas_relationalr:   r-   r/   r/   r0   r1   @   s    z!SingleContinuousDomain.as_boolean)Nr2   r3   r4   r5   r?   r1   r/   r/   r/   r0   r7   0   s   

r7   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   sD   |d kr| j }| jD ]*}t|t|j @ }|r|j||f|}q|S r@   )r   domainsr8   r?   )r.   r<   r=   r>   domainZdomain_varsr/   r/   r0   r?   I   s    
z+ProductContinuousDomain.compute_expectationc                 C   s   t dd | jD  S )Nc                 S   s   g | ]}|  qS r/   )r1   ).0rD   r/   r/   r0   
<listcomp>S   s     z6ProductContinuousDomain.as_boolean.<locals>.<listcomp>)r   rC   r-   r/   r/   r0   r1   R   s    z"ProductContinuousDomain.as_boolean)NrA   r/   r/   r/   r0   rB   D   s   
	rB   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   sD  |d kr| j }|s|S | j||}|jt|j }}| jg}|r4| }|jr~t	|t
rj||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|	 }
t|D ]L\}}|d |
krt||
}t|d |d }||}|
|j|jf||< qq>td| q>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?   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	integrandrM   
conditionsZcondr   r:   ilimitZcintvlZlintvlZintvlr/   r/   r0   r?   \   sH    


 
z/ConditionalContinuousDomain.compute_expectationc                 C   s   t | j | jS r@   )r   rJ   r1   rN   r-   r/   r/   r0   r1      s    z&ConditionalContinuousDomain.as_booleanc                 C   s8   t | jdkr,| jjt| jt| jd @ S tdd S )NrH   r   z)Set of Conditional Domain not Implemented)rV   r   rJ   r;   rX   rN   tupler,   r-   r/   r/   r0   r;      s     zConditionalContinuousDomain.set)N)r2   r3   r4   r5   r?   r1   propertyr;   r/   r/   r/   r0   rG   V   s
   
/rG   c                   @   s   e Zd Zdd ZdS )ContinuousDistributionc                 G   s
   | j | S r@   )pdf)r.   rR   r/   r/   r0   __call__   s    zContinuousDistribution.__call__N)r2   r3   r4   rd   r/   r/   r/   r0   rb      s   rb   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| f| S r@   )rL   mapr   r   __new__)clsrR   r/   r/   r0   rg      s    z$SingleContinuousDistribution.__new__c                  G   s   d S r@   r/   )rR   r/   r/   r0   check   s    z"SingleContinuousDistribution.checkc                 K   sX   t ddtd\}}| jj}| |}t| |||ff|}t|||kfd}t||S )zB Compute the CDF from the PDF.

        Returns a Lambda.
        x, zTrealrh   r   T)	r   r   r;   startrc   r   Zdoitr   r   )r.   r>   xz
left_boundrc   cdfr/   r/   r0   compute_cdf   s    
z(SingleContinuousDistribution.compute_cdfc                 C   s   d S r@   r/   r.   ro   r/   r/   r0   _cdf   s    z!SingleContinuousDistribution._cdfc                 K   s2   t |dkr"| |}|dk	r"|S | jf ||S z Cumulative density function r   N)rV   ru   rs   )r.   ro   r>   rr   r/   r/   r0   rr      s
    
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, tTrk   )r   r   rc   r   r   r   r;   r   )r.   r>   ro   trc   cfr/   r/   r0   compute_characteristic_function   s    
 z<SingleContinuousDistribution.compute_characteristic_functionc                 C   s   d S r@   r/   r.   rx   r/   r/   r0   _characteristic_function   s    z5SingleContinuousDistribution._characteristic_functionc                 K   s2   t |dkr"| |}|dk	r"|S | jf ||S )z Characteristic function r   N)rV   r|   rz   )r.   rx   r>   ry   r/   r/   r0   characteristic_function   s
    
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.
        rw   Trk   )r   r   rc   r   r   r;   r   )r.   r>   ro   rx   rc   mgfr/   r/   r0   "compute_moment_generating_function   s    
z?SingleContinuousDistribution.compute_moment_generating_functionc                 C   s   d S r@   r/   r{   r/   r/   r0   _moment_generating_function   s    z8SingleContinuousDistribution._moment_generating_functionc                 K   s*   |s|  |}|dk	r|S | jf ||S )z Moment generating function N)r   r   )r.   rx   r>   r~   r/   r/   r0   moment_generating_function   s
    
z7SingleContinuousDistribution.moment_generating_functionTc                 K   s  | rzt ||}|jr tjW S tddd}| |}|dkr^t|| | || jff|W S |	 }t t
||d|d  |}	d}
t|d D ],}|
||| |	||  t| 7 }
q|
W S  tk
r   t|| | || jff| Y S X nt|| | || jff|S dS )z- Expectation of expression over distribution rx   Trl   Nr   rH   )r   is_zeror   Zeror   r   r   rc   r;   Zdegreer   ZremoveOrangeZcoeff_monomialr   r   r   )r.   r<   varevaluater>   prx   r~   degZtaylorresultkr/   r/   r0   expectation  s$    

 *&z(SingleContinuousDistribution.expectationc                 K   sn   t ddtd\}}| jj}| |}t||||ff|}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, pTrk   r   rH   )
r   r   r;   rn   rc   r   r   r   r   r   )r.   r>   ro   r   rq   rc   rr   quantiler/   r/   r0   compute_quantile  s    
z-SingleContinuousDistribution.compute_quantilec                 C   s   d S r@   r/   rt   r/   r/   r0   	_quantile%  s    z&SingleContinuousDistribution._quantilec                 K   s2   t |dkr"| |}|dk	r"|S | jf ||S rv   )rV   r   r   )r.   ro   r>   r   r/   r/   r0   r   (  s
    
z%SingleContinuousDistribution.quantileN)T)r2   r3   r4   r5   r   r   r;   rg   staticmethodri   r   rs   ru   rr   rz   r|   r}   r   r   r   r   r   r   r   r/   r/   r/   r0   re      s,   







re   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 r@   )densityrD   r   r-   r/   r/   r0   rc   <  s    zContinuousPSpace.pdfNFc                 K   sV   |d kr| j }nt|}|dd |D }tdd |D }| jj| j| |f|S )Nc                 S   s   i | ]}||j qS r/   r:   rE   rvr/   r/   r0   
<dictcomp>F  s      z8ContinuousPSpace.compute_expectation.<locals>.<dictcomp>c                 s   s   | ]}|j V  qd S r@   r   r   r/   r/   r0   	<genexpr>H  s     z7ContinuousPSpace.compute_expectation.<locals>.<genexpr>)valuesr8   xreplacerD   r?   rc   )r.   r<   rvsr   r>   Zdomain_symbolsr/   r/   r0   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}t|| jt
|| f|S )Nc                 s   s   | ]}|j V  qd S r@   r   )rE   rsr/   r/   r0   r   R  s     z3ContinuousPSpace.compute_density.<locals>.<genexpr>rp   Tr   )r   r`   r;   r8   rD   r?   rc   r   r:   r   r   )r.   r<   r>   Zrandomsymbolsr   rc   rp   r/   r/   r0   compute_densityM  s    
z ContinuousPSpace.compute_densityc                 K   sp   | j jjstd| j|f|}tddtd\}}| j jj}t|||||ff|}t	|||kfd}t
||S )Nz0CDF not well defined on multivariate expressionsrj   Trk   rm   )rD   r;   is_Intervalr9   r   r   r   rn   r   r   r   )r.   r<   r>   dro   rp   rq   rr   r/   r/   r0   rs   Y  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 implementedrw   Trk   )rD   r;   r   r,   r   r   r   r   r   r   r   r   )r.   r<   r>   r   ro   rx   ry   r/   r/   r0   rz   i  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 implementedrw   Trk   )rD   r;   r   r,   r   r   r   r   r   r   r   )r.   r<   r>   r   ro   rx   r~   r/   r/   r0   r   s  s    
&z3ContinuousPSpace.compute_moment_generating_functionc                 K   sX   | j jjstd| j|f|}tddd}tddd}t||| || j}t||S )Nz5Quantile not well defined on multivariate expressionsro   Tr   r   )Zpositive)rD   r;   r   r9   rs   r   r   r   )r.   r<   r>   r   ro   r   r   r/   r/   r0   r   }  s    
z!ContinuousPSpace.compute_quantilec              	      s  t dddd}t|tr4t|jd |jd }d}z| |  fdd| jD d }| j|f jt	j
ks~t jtr|st	jnt	jW S t jtrtfd	d
 jjD W S t jffW S  tk
r   ddlm} |j|j }t|s| j}|j}n||f}d}t|tsNddlm}	 |	|| jjd}t|}
|
||
j|}|sv|nt	j|  Y S X d S )Nrp   Tr   Fr   rH   c                    s   g | ]}|j  j kr|qS r/   r   r   )rD   r/   r0   rF     s      z0ContinuousPSpace.probability.<locals>.<listcomp>c                 3   s.   | ]&}t |trt|ff V  qd S r@   )rP   r   r   )rE   Zsubset)r>   rc   rp   r/   r0   r     s   
z/ContinuousPSpace.probability.<locals>.<genexpr>)r   )ContinuousDistributionHandmade)r;   )r   rP   r
   r	   rR   wherer   r   r;   r   ZEmptySetr   r   ZOner   sumr   r,   sympy.stats.rvr   rT   rU   r$   rb   Zsympy.stats.crv_typesr   rD   SingleContinuousPSpaceprobability	__class__value)r.   rN   r>   Zcond_invr   r   r<   Zdenscompr   spacer   r/   )rD   r>   rc   rp   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 )NrH   z2Multiple continuous random variables not supportedr   )r8   r(   rV   issubsetr   r,   r`   rX   rY   rD   r;   r7   r:   )r.   rN   r   r   intervalr/   r/   r0   r     s    
zContinuousPSpace.wherec           	      K   sp   | dd | jD }t| j|}|rfdd | jD }|j| jf|}| j| | }tt|j|}t	||S )Nc                 S   s   i | ]}||j qS r/   r   r   r/   r/   r0   r     s      z6ContinuousPSpace.conditional_space.<locals>.<dictcomp>c                 S   s   i | ]}|t t|qS r/   )r   strr   r/   r/   r0   r     s      )
r   r   rG   rD   r   r?   rc   r   r`   r   )	r.   rN   	normalizer>   rD   replacementZnormrc   r   r/   r/   r0   conditional_space  s    z"ContinuousPSpace.conditional_space)NF)T)r2   r3   r4   r5   r6   Zis_realra   rc   r?   r   r   rs   rz   r   r   r   r   r   r/   r/   r/   r0   r   1  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 r@   )distributionr;   r-   r/   r/   r0   r;     s    zSingleContinuousPSpace.setc                 C   s   t t| j| jS r@   )r7   r   r:   r;   r-   r/   r/   r0   rD     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 |kr|S t|}|dd |D }| j j}z| jj||fd|i|W S  tk
r   t|| j || j	ff| Y S X d S )Nc                 S   s   i | ]}||j qS r/   r   r   r/   r/   r0   r     s      z>SingleContinuousPSpace.compute_expectation.<locals>.<dictcomp>r   )
r   r   r   r:   r   r   r   r   rc   r;   )r.   r<   r   r   r>   ro   r/   r/   r0   r?     s    
z*SingleContinuousPSpace.compute_expectationc                 K   s@   || j kr,tddd}t|| jj|f|S tj| |f|S d S )Nrp   Tr   )r   r   r   r   rr   r   rs   )r.   r<   r>   rp   r/   r/   r0   rs     s    
z"SingleContinuousPSpace.compute_cdfc                 K   s@   || j kr,tddd}t|| jj|f|S tj| |f|S d S Nrx   Tr   )r   r   r   r   r}   r   rz   r.   r<   r>   rx   r/   r/   r0   rz      s    
z6SingleContinuousPSpace.compute_characteristic_functionc                 K   s@   || j kr,tddd}t|| jj|f|S tj| |f|S d S r   )r   r   r   r   r   r   r   r   r/   r/   r0   r     s    
z9SingleContinuousPSpace.compute_moment_generating_functionc                    s   || j kr| jS tdddt| | j tj}t|trTtj|jkrTt	|jd }|sjt
d|| j f | | j  t fdd|D }t|S )NyTr   rH   zCan not solve %s for %sc                 3   s$   | ]} |t | V  qd S r@   )absdiff)rE   gZfxr   r/   r0   r     s     z9SingleContinuousPSpace.compute_density.<locals>.<genexpr>)r   r   r   r   r   ZRealsrP   r   rR   rL   r9   r   r   r   )r.   r<   r>   gsfyr/   r   r0   r     s    
z&SingleContinuousPSpace.compute_densityc                 K   s@   || j kr,tddd}t|| jj|f|S tj| |f|S d S )Nr   Tr   )r   r   r   r   r   r   r   )r.   r<   r>   r   r/   r/   r0   r     s    
z'SingleContinuousPSpace.compute_quantile)r/   r   N)NF)r2   r3   r4   r5   ra   r;   rD   r   r?   rs   rz   r   r   r   r/   r/   r/   r0   r     s   	



r   c                 K   s:   zt | |f|W S  tk
r4   td| d  Y nX d S )Nz!Reduction of condition failed %s
r   )r    r   r9   )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rx fdd| jD }|d }|D ]}||}qd|S d S )NFZ
relationalc                    s   g | ]}t |gg d dqS Fr   r   rE   argr   r/   r0   rF   2  s   z5reduce_rational_inequalities_wrap.<locals>.<listcomp>c                    s   g | ]}t |gg d dqS r   r   r   r   r/   r0   rF   5  s   r   )rS   r   rP   r   r   rR   r   rY   )rN   r   Z	intervalsr   r^   r/   r   r0   rX   .  s    


rX   N)Ir5   Zsympy.core.basicr   Zsympy.core.cacher   Zsympy.core.functionr   r   Zsympy.core.numbersr   r   r   Zsympy.core.relationalr	   r
   Zsympy.core.singletonr   Zsympy.core.symbolr   r   Zsympy.core.sympifyr   r   Z(sympy.functions.combinatorial.factorialsr   Z&sympy.functions.elementary.exponentialr   Z$sympy.functions.elementary.piecewiser   Z'sympy.functions.special.delta_functionsr   Zsympy.integrals.integralsr   r   Zsympy.logic.boolalgr   r   Zsympy.polys.polyerrorsr   Zsympy.polys.polytoolsr   Zsympy.series.seriesr   Zsympy.sets.setsr   r   r   r   Zsympy.solvers.solvesetr   Zsympy.solvers.inequalitiesr    r   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r7   rB   rG   rb   re   r   r   r   rX   r/   r/   r/   r0   <module>   sB   0B  !V