
    Ed.                     L   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 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 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/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dlm<Z<  G d de0          Z= G d de=e(          Z> G d de.          Z? G d  d!e?e*          Z@ G d" d#e?e-          ZA G d$ d%e,          ZB G d& d'e/e?          ZC G d( d)eBe)          ZDd*S )+    )Sum	summation)Basic)cacheit)Lambda)I)EqNe)S)Dummysymbols)sympify)	factorial)exp)floor)	Piecewise)And)poly)series)PolynomialError)!reduce_rational_inequalities_wrap)	NamedArgsMixinSinglePSpaceSingleDomainrandom_symbolsPSpaceConditionalDomainRandomDomainProductDomainDistribution)Probability)Range	FiniteSet)Union)Contains)
filldedent)_sympifyc                       e Zd Zd ZdS )DiscreteDistributionc                      | j         | S Npdfselfargss     /lib/python3.11/site-packages/sympy/stats/drv.py__call__zDiscreteDistribution.__call__        tx    N)__name__
__module____qualname__r2    r4   r1   r)   r)      s#            r4   r)   c                       e Zd ZdZej        Zd Zed             Z	e
d             Zd Zd Ze
d             Zd Zd	 Ze
d
             Zd Zd Ze
d             Zd Zd ZddZd ZdS )SingleDiscreteDistributionz Discrete distribution of a single variable.

    Serves as superclass for PoissonDistribution etc....

    Provides methods for pdf, cdf, and sampling

    See Also:
        sympy.stats.crv_types.*
    c                 j    t          t          t          |                    }t          j        | g|R  S r+   )listmapr   r   __new__)clsr0   s     r1   r>   z"SingleDiscreteDistribution.__new__1   s1    C&&''}S(4((((r4   c                      d S r+   r8   )r0   s    r1   checkz SingleDiscreteDistribution.check5   s    r4   c                 (   t          ddt                    }t          ddt                    }| j        j        }|                     |          }t          |||t          |          ffi |}t          |||k    fd          }t          ||          S )zB Compute the CDF from the PDF.

        Returns a Lambda.
        xT)integerr?   zrealr?   )r   T)	r   r   setinfr-   r   r   r   r   )r/   kwargsrC   rE   
left_boundr-   cdfs          r1   compute_cdfz&SingleDiscreteDistribution.compute_cdf9   s     C5111Cd...X\
 hhqkkaU1XX6AA&AAa:o.	::a~~r4   c                     d S r+   r8   r/   rC   s     r1   _cdfzSingleDiscreteDistribution._cdfJ       tr4   c                 d    |s|                      |          }||S   | j        di ||          S z Cumulative density function Nr8   )rP   rM   )r/   rC   rJ   rL   s       r1   rL   zSingleDiscreteDistribution.cdfM   sJ     	))A,,C 
)t))&))!,,,r4   c                    t          ddt                    \  }}|                     |          }t          t	          t
          |z  |z            |z  || j        j        | j        j        f          }t          ||          S )zV Compute the characteristic function from the PDF.

        Returns a Lambda.
        zx, tTrF   )
r   r   r-   r   r   r   rH   rI   supr   )r/   rJ   rC   tr-   cfs         r1   compute_characteristic_functionz:SingleDiscreteDistribution.compute_characteristic_functionU   si     vDe4441hhqkks1Q3q5zz#~48<'FGGa}}r4   c                     d S r+   r8   r/   rV   s     r1   _characteristic_functionz3SingleDiscreteDistribution._characteristic_function`   rQ   r4   c                 d    |s|                      |          }||S   | j        di ||          S )z Characteristic function Nr8   )r[   rX   )r/   rV   rJ   rW   s       r1   characteristic_functionz2SingleDiscreteDistribution.characteristic_functionc   sN     	..q11B 	=3t3==f==a@@@r4   c                    t          dd          }t          dd          }|                     |          }t          t          ||z            |z  || j        j        | j        j        f          }t          ||          S )NrV   TrG   rC   rD   )r   r-   r   r   rH   rI   rU   r   )r/   rJ   rV   rC   r-   mgfs         r1   "compute_moment_generating_functionz=SingleDiscreteDistribution.compute_moment_generating_functionk   so    #D!!!#t$$$hhqkkAaCq$(,&EFFa~~r4   c                     d S r+   r8   rZ   s     r1   _moment_generating_functionz6SingleDiscreteDistribution._moment_generating_functions   rQ   r4   c                 d    |s|                      |          }||S   | j        di ||          S )Nr8   )rd   rb   )r/   rV   rJ   ra   s       r1   moment_generating_functionz5SingleDiscreteDistribution.moment_generating_functionv   sN     	22155C 
@6t6@@@@CCCr4   c                     t          dd          }t          dd          }| j        j        }|                     |          }t	          ||||ffi |}|||k    ff}t          |t          |           S )zG Compute the Quantile from the PDF.

        Returns a Lambda.
        rC   Tr`   pr_   )r   rH   rI   r-   r   r   r   )r/   rJ   rC   rh   rK   r-   rL   rH   s           r1   compute_quantilez+SingleDiscreteDistribution.compute_quantile}   s     #t$$$#D!!!X\
hhqkkaQ/::6::18}aC)))r4   c                     d S r+   r8   rO   s     r1   	_quantilez$SingleDiscreteDistribution._quantile   rQ   r4   c                 d    |s|                      |          }||S   | j        di ||          S rS   )rk   ri   )r/   rC   rJ   quantiles       r1   rm   z#SingleDiscreteDistribution.quantile   sL     	 ~~a((H  .$t$..v..q111r4   Tc           	         |r(	 t          ||          }t          dd          }|                     |          }|                                }t          t	          ||d|dz                                             |          }	d}
t          |dz             D ]F}|
|                    ||z            |	                    ||z            z  t          |          z  z  }
G|
S # t          $ r> t          ||                     |          z  || j        j        | j        j        ffi |cY S w xY wt          ||                     |          z  || j        j        | j        j        ffi |S )z- Expectation of expression over distribution rV   Tr_   r      )r   r   rf   degreer   removeOrangecoeff_monomialr   r   r   r-   rH   rI   rU   r   )r/   exprvarevaluaterJ   rh   rV   ra   degtaylorresultks               r1   expectationz&SingleDiscreteDistribution.expectation   s     	FNsOO#D)))55a88hhjjfS!Qa88@@BBAFFs1u h hAa..sax886;P;PQRVWQW;X;XX[def[g[gggFF" N N N !5"%tx|TX\!BN NFLN N N N NN
 tdhhsmm+tx|TX\:F F>DF F Fs   CC! !AD)(D)c                      | j         | S r+   r,   r.   s     r1   r2   z#SingleDiscreteDistribution.__call__   r3   r4   N)T)r5   r6   r7   __doc__r   IntegersrH   r>   staticmethodrA   r   rM   rP   rL   rX   r[   r]   rb   rd   rf   ri   rk   rm   r{   r2   r8   r4   r1   r:   r:   $   sb         *C) ) )   \   W   - - -   W  A A A   W  D D D * * W*  2 2 2F F F F6    r4   r:   c                       e Zd ZdZdZdS )DiscreteDomainze
    A domain with discrete support with step size one.
    Represented using symbols and Range.
    TN)r5   r6   r7   r}   is_Discreter8   r4   r1   r   r      s          KKKr4   r   c                       e Zd Zd ZdS )SingleDiscreteDomainc                 6    t          | j        | j                  S r+   )r%   symbolrH   r/   s    r1   
as_booleanzSingleDiscreteDomain.as_boolean   s    TX...r4   Nr5   r6   r7   r   r8   r4   r1   r   r      s#        / / / / /r4   r   c                   (    e Zd ZdZed             ZdS )ConditionalDiscreteDomainzb
    Domain with discrete support of step size one, that is restricted by
    some condition.
    c                    | j         }t          | j                   dk    rt          t          d                    t	          |          d         }t          | j        |                              | j        j	                  S )Nro   zJ
                Multivariate conditional domains are not yet implemented.r   )
r   lenNotImplementedErrorr&   r<   r   	condition	intersect
fulldomainrH   )r/   rvs     r1   rH   zConditionalDiscreteDomain.set   s    \t|q  	O%j 2M 'N 'N O O O"XXa[0 	$/-..	/r4   N)r5   r6   r7   r}   propertyrH   r8   r4   r1   r   r      s9          / / X/ / /r4   r   c                   D    e Zd ZdZdZed             Zd Zd Zd Z	d Z
dS )DiscretePSpaceTc                       | j         | j         S r+   )densityr   r   s    r1   r-   zDiscretePSpace.pdf   s    t|T\**r4   c                 Z    t          |          }t           fd|D                       sJ t          |          dk    rt          t	          d                    t          ||d                   }|                     j        j                  }t          |d         j
        |          S )Nc              3   4   K   | ]}|j         j        v V  d S r+   )r   r   ).0rr/   s     r1   	<genexpr>z'DiscretePSpace.where.<locals>.<genexpr>   s,      9918t|+999999r4   ro   zIMultivariate discrete
            random variables are not yet supported.r   )r   allr   r   r&   r   r   domainrH   r   r   )r/   r   rvsconditional_domains   `   r1   wherezDiscretePSpace.where   s    Y''9999S99999999s88a< 	9%j 27 '8 '8 9 9 9>yF /99$+/JJ#CFM3EFFFr4   c                    t          |t                    }|r&t          |j        d         |j        d                   }	 |                     |          j        }|dk    s|t          j        u rt          j        S |dk    s|| j	        j        k    rt          j
        S |                     |          }n# t          $ r ddlm} |j        |j        z
  } ||          }t          |t"                    sddlm}  ||          }t)          dd          }	t+          |	|          }
|
                    |                    |
j        d                    }Y nw xY w|t3          |          }|s|nt          j
        |z
  S )	Nr   ro   FT)r   )DiscreteDistributionHandmaderE   r_   )
isinstancer
   r	   r0   r   rH   r   EmptySetZeror   One	eval_probr   sympy.stats.rvr   lhsrhsr)   sympy.stats.drv_typesr   r   SingleDiscretePSpaceprobability	__class__valuer!   )r/   r   
complement_domainprobr   rt   densr   rE   spaces              r1   r   zDiscretePSpace.probability   s   	2..
 	A9>!,inQ.?@@I	Jjj++/GE! W
%: vD  Gt{$> u>>'**DD" 		J 		J 		J......=9=0D74==Dd$899 :NNNNNN33D99c%%%A(D11E$$Y%8%8a%H%HIIDDD		J  	*y))D%7tt154<7s   9B1 9!B1 B1 1BEEc                 L   	 t           j                  d         }t          |t                    rtt          dd          }d |j        D             \  }}} j                            |||z            }t          ||||z  ||z  dz
  f                                          }|S t          |t                    r2t          | j                  	t          	fd|D                       }|S t          |t                    r"t           fd|j        D                       }|S d S )	Nr   nTr`   c              3      K   | ]}|V  d S r+   r8   )r   r   s     r1   r   z+DiscretePSpace.eval_prob.<locals>.<genexpr>  s"      66Aa666666r4   ro   c              3   .   K   | ]} |          V  d S r+   r8   )r   rC   r-   s     r1   r   z+DiscretePSpace.eval_prob.<locals>.<genexpr>	  s+      --SSVV------r4   c              3   B   K   | ]}                     |          V  d S r+   )r   )r   rC   r/   s     r1   r   z+DiscretePSpace.eval_prob.<locals>.<genexpr>  s/      ==1T^^A&&======r4   )r<   r   r   r"   r0   r-   replacer   doitr#   r   sumr$   )
r/   r   symr   rI   rU   stepsummandr   r-   s
   `        @r1   r   zDiscretePSpace.eval_prob   s>   4<  #gu%% 	T***A66666NCd))1T6 G7CHsDj1n-/ //3tvv I++ 	dh''C----W-----BI'' 	=========BI	 	r4   c                    t          t          | j                  | j        |                     |          z            }|                    d | j        D                       }t          | j        |          }t          ||          S )Nc                     i | ]
}||j         S r8   r   r   r   s     r1   
<dictcomp>z4DiscretePSpace.conditional_space.<locals>.<dictcomp>  s    'L'L'L"BI'L'L'Lr4   )
r   tupler   r-   r   xreplacevaluesr   r   r   )r/   r   r   r   s       r1   conditional_spacez DiscretePSpace.conditional_space  sw     t|,,dht7G7G	7R7R.RSS&&'L'L'L'L'LMM	*4;	BBfg...r4   N)r5   r6   r7   is_realr   r   r-   r   r   r   r   r8   r4   r1   r   r      sv        GK+ + X+	G 	G 	G8 8 82  $/ / / / /r4   r   c                       e Zd Zd ZdS )ProductDiscreteDomainc                 2    t          d | j        D              S )Nc                     g | ]	}|j         
S r8   )r   )r   r   s     r1   
<listcomp>z4ProductDiscreteDomain.as_boolean.<locals>.<listcomp>  s    BBB6V&BBBr4   )r   domainsr   s    r1   r   z ProductDiscreteDomain.as_boolean  s    BBT\BBBCCr4   Nr   r8   r4   r1   r   r     s(        D D D D Dr4   r   c                   p    e Zd ZdZdZed             Zed             ZddZdd	Z	d
 Z
d Zd Zd Zd ZdS )r   z> Discrete probability space over a single univariate variable Tc                     | j         j        S r+   )distributionrH   r   s    r1   rH   zSingleDiscretePSpace.set  s     $$r4   c                 6    t          | j        | j                  S r+   )r   r   rH   r   s    r1   r   zSingleDiscretePSpace.domain#  s    #DK:::r4   r8   scipyNc                 J    | j         | j                            |||          iS )zp
        Internal sample method.

        Returns dictionary mapping RandomSymbol to realization value.
        )libraryseed)r   r   sample)r/   sizer   r   s       r1   r   zSingleDiscretePSpace.sample'  s*     
D-44T7QU4VVWWr4   c                 H   |p| j         f}| j         |vr|S t          |          }|                    d |D                       }| j         j        }	  | j        j        ||fd|i|S # t          $ r0 t          || j        z  || j	        j
        | j	        j        ffi |cY S w xY w)Nc                     i | ]
}||j         S r8   r   r   s     r1   r   z<SingleDiscretePSpace.compute_expectation.<locals>.<dictcomp>5  s    :::b"):::r4   rv   )r   r'   r   r   r   r{   r   r   r-   rH   rI   rU   )r/   rt   r   rv   rJ   rC   s         r1   compute_expectationz(SingleDiscretePSpace.compute_expectation/  s    "dj]:S  	K~~}}::c:::;;J	04$0q  8   " 	 	 	tdhDHL$(,(G      	s   A' '7B! B!c                     || j         k    r2t          dd          }t          | | j        j        |fi |          S t                      )NrC   Tr_   )r   r   r   r   rL   r   )r/   rt   rJ   rC   s       r1   rM   z SingleDiscretePSpace.compute_cdf?  sX    4: 	(c%%%A!2T.21????@@@%'''r4   c                 B    || j         k    r| j        S t                      r+   )r   r   r   )r/   rt   rJ   s      r1   compute_densityz$SingleDiscretePSpace.compute_densityF  s&    4: 	%$$!###r4   c                     || j         k    r2t          dd          }t          | | j        j        |fi |          S t                      NrV   Tr_   )r   r   r   r   r]   r   r/   rt   rJ   rV   s       r1   rX   z4SingleDiscretePSpace.compute_characteristic_functionK  sX    4: 	(c%%%A!FT.FqSSFSSTTT%'''r4   c                     || j         k    r2t          dd          }t          | | j        j        |fi |          S t                      r   )r   r   r   r   rf   r   r   s       r1   rb   z7SingleDiscretePSpace.compute_moment_generating_functionR  sX    4: 	(c%%%A!IT.I!VVvVVWWW%'''r4   c                     || j         k    r2t          dd          }t          | | j        j        |fi |          S t                      )Nrh   Tr_   )r   r   r   r   rm   r   )r/   rt   rJ   rh   s       r1   ri   z%SingleDiscretePSpace.compute_quantileY  sX    4: 	(c%%%A!7T.7DDVDDEEE%'''r4   )r8   r   N)NT)r5   r6   r7   r}   r   r   rH   r   r   r   rM   r   rX   rb   ri   r8   r4   r1   r   r     s        HHG% % X% ; ; X;X X X X    ( ( ($ $ $
( ( (( ( (( ( ( ( (r4   r   N)Esympy.concrete.summationsr   r   sympy.core.basicr   sympy.core.cacher   sympy.core.functionr   sympy.core.numbersr   sympy.core.relationalr	   r
   sympy.core.singletonr   sympy.core.symbolr   r   sympy.core.sympifyr   (sympy.functions.combinatorial.factorialsr   &sympy.functions.elementary.exponentialr   #sympy.functions.elementary.integersr   $sympy.functions.elementary.piecewiser   sympy.logic.boolalgr   sympy.polys.polytoolsr   sympy.series.seriesr   sympy.polys.polyerrorsr   sympy.stats.crvr   r   r   r   r   r   r   r   r   r   r     sympy.stats.symbolic_probabilityr!   sympy.sets.fancysetsr"   r#   sympy.sets.setsr$   sympy.sets.containsr%   sympy.utilitiesr&   r'   r)   r:   r   r   r   r   r   r   r8   r4   r1   <module>r      s   6 6 6 6 6 6 6 6 " " " " " " $ $ $ $ $ $ & & & & & &             * * * * * * * * " " " " " " . . . . . . . . & & & & & & > > > > > > 6 6 6 6 6 6 5 5 5 5 5 5 : : : : : : # # # # # # & & & & & & & & & & & & 2 2 2 2 2 2 = = = = = =9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 8 8 8 8 8 1 1 1 1 1 1 1 1 ! ! ! ! ! ! ( ( ( ( ( ( & & & & & & ' ' ' ' ' '    <   
N N N N N!5~ N N Nb    \   / / / / />< / / /
/ / / / /0A / / / D/ D/ D/ D/ D/V D/ D/ D/LD D D D DM> D D DC( C( C( C( C(>< C( C( C( C( C(r4   