
    Ed                         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 d dlmZ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   G d de          Z! G d dee          Z"dS )    )Sum)Basic)Lambda)Dummy)Integral)NamedArgsMixinrandom_symbols_symbol_converterPSpaceRandomSymbol	is_randomDistribution)ContinuousDistributionSingleContinuousPSpace)DiscreteDistributionSingleDiscretePSpace)SingleFiniteDistributionSingleFinitePSpace)ContinuousDistributionHandmade)DiscreteDistributionHandmade)FiniteDistributionHandmadec                   $   e Zd ZdZd Zed             Zed             Zed             Zed             Z	ed             Z
ed             Zed	             Zed
             Zed             ZddZd ZdddZdddZddZdddZdddZdS )CompoundPSpacez
    A temporary Probability Space for the Compound Distribution. After
    Marginalization, this returns the corresponding Probability Space of the
    parent distribution.
    c                 x   t          |          }t          |t                    rt          ||          S t          |t                    rt          ||          S t          |t                    rt          ||          S t          |t                    st          d|z            t          j        | ||          S )Nz2%s should be an isinstance of CompoundDistribution)r
   
isinstancer   r   r   r   r   r   CompoundDistribution
ValueErrorr   __new__)clssdistributions      7lib/python3.11/site-packages/sympy/stats/compound_rv.pyr   zCompoundPSpace.__new__   s    a  l$:;; 	;)!\:::l$899 	9'<888l$<== 	7%a666,(<== 	? /0<> ? ? ?}S!\222    c                 ,    t          | j        |           S N)r   symbolselfs    r"   valuezCompoundPSpace.value$   s    DK...r#   c                     | j         d         S Nr   argsr'   s    r"   r&   zCompoundPSpace.symbol(       y|r#   c                     | j         j        S r%   )r!   is_Continuousr'   s    r"   r0   zCompoundPSpace.is_Continuous,   s     ..r#   c                     | j         j        S r%   )r!   	is_Finiter'   s    r"   r2   zCompoundPSpace.is_Finite0   s     **r#   c                     | j         j        S r%   )r!   is_Discreter'   s    r"   r4   zCompoundPSpace.is_Discrete4   s     ,,r#   c                     | j         d         S )N   r,   r'   s    r"   r!   zCompoundPSpace.distribution8   r.   r#   c                 @    | j                             | j                  S r%   )r!   pdfr&   r'   s    r"   r8   zCompoundPSpace.pdf<   s     $$T[111r#   c                     | j         j        S r%   )r!   setr'   s    r"   r:   zCompoundPSpace.set@   s     $$r#   c                 4    |                                  j        S r%   )_get_newpspacedomainr'   s    r"   r=   zCompoundPSpace.domainD   s    ""$$++r#   Fc                    t          d          }| j        j        d         }t          || j                            ||                    }|                     | j        ||          }||S dt          |          z  }t          |          )Nxr   2Compound Distribution for %s is not implemeted yet)	r   r!   r-   r   r8   _transform_pspacer&   strNotImplementedError)r(   evaluater?   parent_distfunc
new_pspacemessages          r"   r<   zCompoundPSpace._get_newpspaceH   s    #JJ',Q/a*..q(;;<<++DKdKK
 	G#kJZJZZ!'***r#   c                    t          | |                    |j        }t          |t                    rt	          |t          |                    S t          |t                    rt          |t          |                    S t          |t                    r+fd|D             }t          |t          |                    S dS )z
        This function returns the new pspace of the distribution using handmade
        Distributions and their corresponding pspace.
        c                 (    i | ]}| |          S  rK   ).0kr8   s     r"   
<dictcomp>z4CompoundPSpace._transform_pspace.<locals>.<dictcomp>^   s#    ,,,!Ass1vv,,,r#   N)r   r:   r   r   r   r   r   r   r   r   r   r   )r(   symdistr8   _setdenss      `  r"   rA   z CompoundPSpace._transform_pspaceR   s    
 S##c((##xd233 	M)#/McSW/X/XYYY233 	M'-I#t-T-TUUU677 	M,,,,t,,,D%c+Ed+K+KLLL	M 	Mr#   T)compound_evaluatec                    |                      |          }|                    | j        |j        i          } |j        |fi |S r%   )r<   subsr)   compute_densityr(   exprrS   kwargsrG   s        r"   rV   zCompoundPSpace.compute_densitya   sL    (():;;
yy$*j&6788)z)$99&999r#   c                    |                      |          }|                    | j        |j        i          } |j        |fi |S r%   )r<   rU   r)   compute_cdfrW   s        r"   r[   zCompoundPSpace.compute_cdff   sL    (():;;
yy$*j&6788%z%d55f555r#   Nc                    |                      |          }|                    | j        |j        i          }|r!|                    | j        |j        i          }t          |t                    r |j        ||fi |S  |j        |||fi |S r%   )r<   rU   r)   r   r   compute_expectation)r(   rX   rvsrD   rY   rG   s         r"   r]   z"CompoundPSpace.compute_expectationk   s    ((22
yy$*j&6788 	;((DJ
(89::Cj"455 	G1:1$FFvFFF-z-dCLLVLLLr#   c                    |                      |          }|                    | j        |j        i          }|                    |          S r%   )r<   rU   r)   probabilityr(   	conditionrS   rY   rG   s        r"   r`   zCompoundPSpace.probabilityt   sE    (():;;
NNDJ
0@#ABB	%%i000r#   c                    |                      |          }|                    | j        |j        i          }|                    |          S r%   )r<   rU   r)   conditional_spacera   s        r"   rd   z CompoundPSpace.conditional_spacey   sE    (():;;
NNDJ
0@#ABB	++I666r#   F)NF)__name__
__module____qualname____doc__r   propertyr)   r&   r0   r2   r4   r!   r8   r:   r=   r<   rA   rV   r[   r]   r`   rd   rK   r#   r"   r   r      s        3 3 3 / / X/   X / / X/ + + X+ - - X-   X 2 2 X2 % % X% , , X,+ + + +M M M :> : : : : :
 6: 6 6 6 6 6
M M M M ;? 1 1 1 1 1
 AE 7 7 7 7 7 7 7r#   r   c                       e Zd ZdZd Zed             Zed             Zed             Zed             Z	ddZ
d	 Zed
             ZdS )r   a  
    Class for Compound Distributions.

    Parameters
    ==========

    dist : Distribution
        Distribution must contain a random parameter

    Examples
    ========

    >>> from sympy.stats.compound_rv import CompoundDistribution
    >>> from sympy.stats.crv_types import NormalDistribution
    >>> from sympy.stats import Normal
    >>> from sympy.abc import x
    >>> X = Normal('X', 2, 4)
    >>> N = NormalDistribution(X, 4)
    >>> C = CompoundDistribution(N)
    >>> C.set
    Interval(-oo, oo)
    >>> C.pdf(x, evaluate=True).simplify()
    exp(-x**2/64 + x/16 - 1/16)/(8*sqrt(pi))

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Compound_probability_distribution

    c                     t          |t          t          t          f          s!dt	          |          z  }t          |          |                     |          s|S t          j        | |          S )Nr@   )	r   r   r   r   rB   rC   _compound_checkr   r   )r   rP   rH   s      r"   r   zCompoundDistribution.__new__   ss    $!7(*>!@ A A 	/JSQUYYVG%g...""4(( 	K}S$'''r#   c                 &    | j         d         j        S r+   )r-   r:   r'   s    r"   r:   zCompoundDistribution.set   s    y|r#   c                 B    t          | j        d         t                    S r+   )r   r-   r   r'   s    r"   r0   z"CompoundDistribution.is_Continuous   s    $)A,(>???r#   c                 B    t          | j        d         t                    S r+   )r   r-   r   r'   s    r"   r2   zCompoundDistribution.is_Finite   s    $)A,(@AAAr#   c                 B    t          | j        d         t                    S r+   )r   r-   r   r'   s    r"   r4   z CompoundDistribution.is_Discrete   s    $)A,(<===r#   Fc                 j   | j         d         }d |j         D             }t          |t                    r(t          ddd          }|                    |          }n$t          d          }|                    |          }|D ]}|                     |||          } t          ||          |          S )Nr   c                 0    g | ]}t          |          |S rK   )r   )rL   rvs     r"   
<listcomp>z,CompoundDistribution.pdf.<locals>.<listcomp>   s#    ;;;"Yr]];2;;;r#   yTF)integernegative)r-   r   r   r   pmfr8   _marginaliser   )r(   r?   rD   rP   randomsrv   rX   rt   s           r"   r8   zCompoundDistribution.pdf   s    y|;;	;;;d455 	c4%888A88A;;DDc

A88A;;D 	9 	9B$$T2x88DDvaq!!!r#   c                    t          |j        j        t                    r |j        j                            |          }n|j        j                            |          }|j        j        j        }|j        j        s|j        j	        r!t          ||z  ||j        |j        f          }n t          ||z  ||j        |j        f          }|r|                                S |S r%   )r   pspacer!   r   ry   r8   r=   r:   r4   r2   r   _inf_supr   doit)r(   rX   rt   rD   rv_densrv_doms         r"   rz   z!CompoundDistribution._marginalise   s    bi,.FGG 	5i,0044GGi,0044G!%9  	"BI$7 	"tG|b&+K&! " "DD DL2v{K+! " "D 	99;;r#   c                     g }|j         D ]$}|                    t          |                     %t          |          dk    rdS dS )zN
        Checks if the given distribution contains random parameters.
        r   FT)r-   extendr	   len)r(   rP   r{   args       r"   rm   z$CompoundDistribution._compound_check   sT    
 9 	0 	0CNN>#..////w<<1 	5tr#   Nre   )rf   rg   rh   ri   r   rj   r:   r0   r2   r4   r8   rz   classmethodrm   rK   r#   r"   r   r      s         >( ( (     X  @ @ X@ B B XB > > X>" " " "    	 	 [	 	 	r#   r   N)#sympy.concrete.summationsr   sympy.core.basicr   sympy.core.functionr   sympy.core.symbolr   sympy.integrals.integralsr   sympy.stats.rvr   r	   r
   r   r   r   r   sympy.stats.crvr   r   sympy.stats.drvr   r   sympy.stats.frvr   r   sympy.stats.crv_typesr   sympy.stats.drv_typesr   sympy.stats.frv_typesr   r   r   rK   r#   r"   <module>r      s   ) ) ) ) ) ) " " " " " " & & & & & & # # # # # # . . . . . .G G G G G G G G G G G G G G G G G G J J J J J J J J F F F F F F F F H H H H H H H H @ @ @ @ @ @ > > > > > > < < < < < <l7 l7 l7 l7 l7V l7 l7 l7^` ` ` ` `< ` ` ` ` `r#   