a
    <bQ                     @   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/   _/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/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   sJ   |d u r| j }|s|S t|t| j kr0t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_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   sH   |d u r| j }| jD ].}t|t|j @ }|r|j||fi |}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       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   sJ  |d u 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|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	integrandrN   
conditionsZcondr   r:   ilimitZcintvlZlintvlZintvlr/   r/   r0   r?   \   sF    



z/ConditionalContinuousDomain.compute_expectationc                 C   s   t | j | jS r@   )r   rK   r1   rO   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 )NrI   r   z)Set of Conditional Domain not Implemented)rW   r   rK   r;   rY   rO   tupler,   r-   r/   r/   r0   r;      s    zConditionalContinuousDomain.set)N)r2   r3   r4   r5   r?   r1   propertyr;   r/   r/   r/   r0   rH   V   s
   
/rH   c                   @   s   e Zd Zdd ZdS )ContinuousDistributionc                 G   s
   | j | S r@   )pdf)r.   rS   r/   r/   r0   __call__   s    zContinuousDistribution.__call__N)r2   r3   r4   re   r/   r/   r/   r0   rc      s   rc   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 r@   )rM   mapr   r   __new__)clsrS   r/   r/   r0   rh      s    z$SingleContinuousDistribution.__new__c                  G   s   d S r@   r/   )rS   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realri   r   T)	r   r   r;   startrd   r   Zdoitr   r   )r.   r>   xz
left_boundrd   cdfr/   r/   r0   compute_cdf   s    
z(SingleContinuousDistribution.compute_cdfc                 C   s   d S r@   r/   r.   rp   r/   r/   r0   _cdf   s    z!SingleContinuousDistribution._cdfc                 K   s6   t |dkr"| |}|dur"|S | jf i ||S z Cumulative density function r   N)rW   rv   rt   )r.   rp   r>   rs   r/   r/   r0   rs      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, tTrl   )r   r   rd   r   r   r   r;   r   )r.   r>   rp   trd   cfr/   r/   r0   compute_characteristic_function   s    
 z<SingleContinuousDistribution.compute_characteristic_functionc                 C   s   d S r@   r/   r.   ry   r/   r/   r0   _characteristic_function   s    z5SingleContinuousDistribution._characteristic_functionc                 K   s6   t |dkr"| |}|dur"|S | jf i ||S )z Characteristic function r   N)rW   r}   r{   )r.   ry   r>   rz   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.
        rx   Trl   )r   r   rd   r   r   r;   r   )r.   r>   rp   ry   rd   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ur|S | jf i ||S )z Moment generating function N)r   r   )r.   ry   r>   r   r/   r/   r0   moment_generating_function   s
    
z7SingleContinuousDistribution.moment_generating_functionTc                 K   s(  |rzt ||}|jr tjW S tddd}| |}|du rbt|| | || jffi |W S |	 }t t
||d|d  |}	d}
t|d D ],}|
||| |	||  t| 7 }
q|
W S  t y   t|| | || jffi | Y S 0 n"t|| | || jffi |S dS )z- Expectation of expression over distribution ry   Trm   Nr   rI   )r   is_zeror   Zeror   r   r   rd   r;   Zdegreer   ZremoveOrangeZcoeff_monomialr   r   r   )r.   r<   varevaluater>   pry   r   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, pTrl   r   rI   )
r   r   r;   ro   rd   r   r   r   r   r   )r.   r>   rp   r   rr   rd   rs   quantiler/   r/   r0   compute_quantile  s    
z-SingleContinuousDistribution.compute_quantilec                 C   s   d S r@   r/   ru   r/   r/   r0   	_quantile%  s    z&SingleContinuousDistribution._quantilec                 K   s6   t |dkr"| |}|dur"|S | jf i ||S rw   )rW   r   r   )r.   rp   r>   r   r/   r/   r0   r   (  s
    
z%SingleContinuousDistribution.quantileN)T)r2   r3   r4   r5   r   r   r;   rh   staticmethodrj   r   rt   rv   rs   r{   r}   r~   r   r   r   r   r   r   r   r/   r/   r/   r0   rf      s,   







rf   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   rd   <  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   s   i | ]}||j qS r/   r:   rE   rvr/   r/   r0   
<dictcomp>F  rG   z8ContinuousPSpace.compute_expectation.<locals>.<dictcomp>c                 s   s   | ]}|j V  qd S r@   r   r   r/   r/   r0   	<genexpr>H  rG   z7ContinuousPSpace.compute_expectation.<locals>.<genexpr>)valuesr8   xreplacerD   r?   rd   )r.   r<   rvsr   r>   Zdomain_symbolsr/   r/   r0   r?   @  s    z$ContinuousPSpace.compute_expectationc                 K   s   || j v rXt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   s   | ]}|j V  qd S r@   r   )rE   rsr/   r/   r0   r   R  rG   z3ContinuousPSpace.compute_density.<locals>.<genexpr>rq   Tr   )r   ra   r;   r8   rD   r?   rd   r   r:   r   r   )r.   r<   r>   Zrandomsymbolsr   rd   rq   r/   r/   r0   compute_densityM  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 expressionsrk   Trl   rn   )rD   r;   is_Intervalr9   r   r   r   ro   r   r   r   )r.   r<   r>   drp   rq   rr   rs   r/   r/   r0   rt   Y  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 implementedrx   Trl   )rD   r;   r   r,   r   r   r   r   r   r   r   r   )r.   r<   r>   r   rp   ry   rz   r/   r/   r0   r{   i  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 implementedrx   Trl   )rD   r;   r   r,   r   r   r   r   r   r   r   )r.   r<   r>   r   rp   ry   r   r/   r/   r0   r   s  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 expressionsrp   Tr   r   )Zpositive)rD   r;   r   r9   rt   r   r   r   )r.   r<   r>   r   rp   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i  jt	j
u st 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i W S  ty   ddlm} |j|j }t|s| j}|j}n||fi }d}t|tsXddlm}	 |	|| jjd}t|}
|
||
j|}|s|nt	j|  Y S 0 d S )Nrq   Tr   Fr   rI   c                    s   g | ]}|j  j kr|qS r/   r   r   )rD   r/   r0   rF     rG   z0ContinuousPSpace.probability.<locals>.<listcomp>c                 3   s2   | ]*}t |trt|ffi  V  qd S r@   )rQ   r   r   )rE   Zsubset)r>   rd   rq   r/   r0   r     s   
z/ContinuousPSpace.probability.<locals>.<genexpr>)r   )ContinuousDistributionHandmade)r;   )r   rQ   r
   r	   rS   wherer   r   r;   r   ZEmptySetr   r   ZOner   sumr   r,   sympy.stats.rvr   rU   rV   r$   rc   Zsympy.stats.crv_typesr   rD   SingleContinuousPSpaceprobability	__class__value)r.   rO   r>   Zcond_invr   r   r<   Zdenscompr   spacer   r/   )rD   r>   rd   rq   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 )NrI   z2Multiple continuous random variables not supportedr   )r8   r(   rW   issubsetr   r,   ra   rY   rZ   rD   r;   r7   r:   )r.   rO   r   r   intervalr/   r/   r0   r     s    
zContinuousPSpace.wherec           	      K   st   | dd | jD }t| j|}|rjdd | jD }|j| jfi |}| j| | }tt|j|}t	||S )Nc                 S   s   i | ]}||j qS r/   r   r   r/   r/   r0   r     rG   z6ContinuousPSpace.conditional_space.<locals>.<dictcomp>c                 S   s   i | ]}|t t|qS r/   )r   strr   r/   r/   r0   r     rG   )
r   r   rH   rD   r   r?   rd   r   ra   r   )	r.   rO   	normalizer>   rD   replacementZnormrd   r   r/   r/   r0   conditional_space  s    z"ContinuousPSpace.conditional_space)NF)T)r2   r3   r4   r5   r6   Zis_realrb   rd   r?   r   r   rt   r{   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 |vr|S t|}|dd |D }| j j}z| jj||fd|i|W S  ty   t|| j || j	ffi | Y S 0 d S )Nc                 S   s   i | ]}||j qS r/   r   r   r/   r/   r0   r     rG   z>SingleContinuousPSpace.compute_expectation.<locals>.<dictcomp>r   )
r   r   r   r:   r   r   r   r   rd   r;   )r.   r<   r   r   r>   rp   r/   r/   r0   r?     s    
z*SingleContinuousPSpace.compute_expectationc                 K   sH   || j kr0tddd}t|| jj|fi |S tj| |fi |S d S )Nrq   Tr   )r   r   r   r   rs   r   rt   )r.   r<   r>   rq   r/   r/   r0   rt     s    
z"SingleContinuousPSpace.compute_cdfc                 K   sH   || j kr0tddd}t|| jj|fi |S tj| |fi |S d S Nry   Tr   )r   r   r   r   r~   r   r{   r.   r<   r>   ry   r/   r/   r0   r{      s    
z6SingleContinuousPSpace.compute_characteristic_functionc                 K   sH   || j kr0tddd}t|| jj|fi |S tj| |fi |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v rTt	|jd }|sjt
d|| j f | | j  t fdd|D }t|S )NyTr   rI   zCan not solve %s for %sc                 3   s$   | ]} |t | V  qd S r@   )absdiff)rE   gZfxr   r/   r0   r     rG   z9SingleContinuousPSpace.compute_density.<locals>.<genexpr>)r   r   r   r   r   ZRealsrQ   r   rS   rM   r9   r   r   r   )r.   r<   r>   ZgsZfyr/   r   r0   r     s    
z&SingleContinuousPSpace.compute_densityc                 K   sH   || j kr0tddd}t|| jj|fi |S tj| |fi |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   rb   r;   rD   r   r?   rt   r{   r   r   r   r/   r/   r/   r0   r     s   	



r   c                 K   s<   zt | |fi |W S  ty6   td| d  Y n0 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   )rT   r   rQ   r   r   rS   r   rZ   )rO   r   Z	intervalsr   r_   r/   r   r0   rY   .  s    


rY   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   rH   rc   rf   r   r   r   rY   r/   r/   r/   r0   <module>   sB   0B  !V