L i=ddlmZddlZddlmZddlmZddlmZddlm Z ddl m Z ddl m Z d gZd ZGd d eZGd d e Zy))OptionalN)Tensor)Function)once_differentiable) constraints)ExponentialFamily)_size Dirichletc|jddj|}tj|||}||||zjddz zSNT)sum expand_astorch_dirichlet_grad)x concentration grad_outputtotalgrads c/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/torch/distributions/dirichlet.py_Dirichlet_backwardrsT   b$ ' 1 1- @E  M5 9D ;!k/!6!6r4!@@ AAc6eZdZedZeedZy) _DirichletcTtj|}|j|||SN)r_sample_dirichletsave_for_backward)ctxrrs rforwardz_Dirichlet.forwards'  # #M 2 a/rc:|j\}}t|||Sr) saved_tensorsr)r rrrs rbackwardz_Dirichlet.backwards#,,="1m[AArN)__name__ __module__ __qualname__ staticmethodr!rr$rrrrs2 BBrrc"eZdZdZdej ej diZejZ dZ dde de e ddffd Zdfd Zdd ede fd Zd Zede fd Zede fdZede fdZdZedee fdZdZxZS)r a Creates a Dirichlet distribution parameterized by concentration :attr:`concentration`. Example:: >>> # xdoctest: +IGNORE_WANT("non-deterministic") >>> m = Dirichlet(torch.tensor([0.5, 0.5])) >>> m.sample() # Dirichlet distributed with concentration [0.5, 0.5] tensor([ 0.1046, 0.8954]) Args: concentration (Tensor): concentration parameter of the distribution (often referred to as alpha) rTN validate_argsreturnc|jdkr td||_|jdd|jdd}}t||||y)Nr+z;`concentration` parameter must be at least one-dimensional.r r,)dim ValueErrorrshapesuper__init__)selfrr, batch_shape event_shape __class__s rr4zDirichlet.__init__;si     "M +#0#6#6s#;]=P=PQSQT=U[  kOrc|jt|}tj|}|jj ||j z|_tt|#||j d|j|_ |S)NFr/) _get_checked_instancer rSizerexpandr7r3r4_validate_args)r5r6 _instancenewr8s rr<zDirichlet.expandHs}((I>jj-  ..55kDDTDT6TU i& )) ' "00 r sample_shapec|j|}|jj|}tj |Sr)_extended_shaperr<rapply)r5r@r2rs rrsamplezDirichlet.rsampleRs9$$\2**11%8  ..rc\|jr|j|tj|jdz |j dtj |jj dztj |jj dz S)N?r )r=_validate_samplerxlogyrrlgamma)r5values rlog_probzDirichlet.log_probWs     ! !% ( KK**S0% 8 < >""Q&+++3XX((00 J  "  %'<'r|sI #7+< -B B Ba<!a