L ixddlmZddlZddlmZmZddlmZmZddlm Z ddl m Z ddl m Z dgZGd de Zy) )OptionalN)infTensor) Categorical constraints)Binomial) Distribution) broadcast_all Multinomialc eZdZUdZej ej dZee d<e de fdZ e de fdZ dded ee d ee d eeddf fd Zdfd ZdZej&dddZe de fdZe de fdZe dej0fdZej0fdZdZdZxZS)r a` Creates a Multinomial distribution parameterized by :attr:`total_count` and either :attr:`probs` or :attr:`logits` (but not both). The innermost dimension of :attr:`probs` indexes over categories. All other dimensions index over batches. Note that :attr:`total_count` need not be specified if only :meth:`log_prob` is called (see example below) .. note:: The `probs` argument must be non-negative, finite and have a non-zero sum, and it will be normalized to sum to 1 along the last dimension. :attr:`probs` will return this normalized value. The `logits` argument will be interpreted as unnormalized log probabilities and can therefore be any real number. It will likewise be normalized so that the resulting probabilities sum to 1 along the last dimension. :attr:`logits` will return this normalized value. - :meth:`sample` requires a single shared `total_count` for all parameters and samples. - :meth:`log_prob` allows different `total_count` for each parameter and sample. Example:: >>> # xdoctest: +SKIP("FIXME: found invalid values") >>> m = Multinomial(100, torch.tensor([ 1., 1., 1., 1.])) >>> x = m.sample() # equal probability of 0, 1, 2, 3 tensor([ 21., 24., 30., 25.]) >>> Multinomial(probs=torch.tensor([1., 1., 1., 1.])).log_prob(x) tensor([-4.1338]) Args: total_count (int): number of trials probs (Tensor): event probabilities logits (Tensor): event log probabilities (unnormalized) probslogits total_countreturnc4|j|jzSN)rrselfs e/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/torch/distributions/multinomial.pymeanzMultinomial.mean8szzD,,,,cT|j|jzd|jz zS)Nrrrs rvariancezMultinomial.variance<s$$**,DJJ??rrNrr validate_argsc(t|ts td||_t |||_t ||j|_|j j}|j jdd}t|1|||y)Nz*inhomogeneous total_count is not supportedr rr) isinstanceintNotImplementedErrorrr _categoricalrr _binomial batch_shape param_shapesuper__init__)rrrrrr& event_shape __class__s rr)zMultinomial.__init__@s+s+%&RS S&'eFC!kL''33 ''33BC8  kOrc"|jt|}tj|}|j|_|j j ||_tt|#||jd|j|_ |S)NFr ) _get_checked_instancer torchSizerr$expandr(r)r*_validate_args)rr& _instancenewr+s rr0zMultinomial.expandPs((i@jj- **,,33K@ k3( )) ) "00 rc:|jj|i|Sr)r$_new)rargskwargss rr5zMultinomial._new[s %t  %%t6v66rT) is_discrete event_dimc@tj|jSr)r multinomialrrs rsupportzMultinomial.support^s&&t'7'788rc.|jjSr)r$rrs rrzMultinomial.logitsbs  '''rc.|jjSr)r$rrs rrzMultinomial.probsfs  &&&rc.|jjSr)r$r'rs rr'zMultinomial.param_shapejs  ,,,rc$tj|}|jjtj|jf|z}t t |j}|j|jd|j|}|j|j|j}|jd|tj||j!|j"S)Nrr)r.r/r$samplerlistrangedimappendpoppermuter3_extended_shapezero_ scatter_add_ ones_liketype_asr)r sample_shapesamples shifted_idxcountss rrAzMultinomial.samplenszz,/ ##** JJ((* +l :  5/0 ;??1-.!'//;/T11,?@FFHB)AB~~djj))rctj|j}|jj }||ztj |dzz }|j jddd}tj|j j|}tj |dz}||zjddg}||zS)NrF)r0rr) r.tensorrr$entropylgammar%enumerate_supportexplog_probsum)rn cat_entropyterm1r<binomial_probsweightsterm2s rrSzMultinomial.entropy|s LL)) *''//1 K%,,q1u"55..22%2@D4>>#:#:7#CD,,w{+')..2w7u}rc|jr|j|t|j|\}}|j t j }t j|jddz}t j|dzjd}d||dk(|t k(z<||zjd}||z |zS)N) memory_formatrrr) r1_validate_sampler rcloner.contiguous_formatrTrXr)rvaluerlog_factorial_nlog_factorial_xs log_powerss rrWzMultinomial.log_probs     ! !% (%dkk59 E,C,CD,,uyy}q'89 << 266r:23 v#~./un))"- !11J>>r)rNNNr)__name__ __module__ __qualname____doc__rsimplex real_vectorarg_constraintsr"__annotations__propertyrrrrboolr)r0r5dependent_propertyr<rrr.r/r'rArSrW __classcell__)r+s@rr r sT#J!, 3 3{?V?VWO -f--@&@@ "&#'(, PPP P  ~ P  P 7$[##B9C9((('v''-UZZ--#-%**, *  ?r)typingrr.rrtorch.distributionsrrtorch.distributions.binomialr torch.distributions.distributionr torch.distributions.utilsr __all__r rrr{s1 8193 /C?,C?r