
    Ǆg                     \    d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	 dgZ
 G d de      Zy)z
This closely follows the implementation in NumPyro (https://github.com/pyro-ppl/numpyro).

Original copyright notice:

# Copyright: Contributors to the Pyro project.
# SPDX-License-Identifier: Apache-2.0
    N)Betaconstraints)Distribution)broadcast_allLKJCholeskyc                        e Zd ZdZdej
                  iZej                  Zd fd	Z	d fd	Z
 ej                         fdZd Z xZS )	r   a)  
    LKJ distribution for lower Cholesky factor of correlation matrices.
    The distribution is controlled by ``concentration`` parameter :math:`\eta`
    to make the probability of the correlation matrix :math:`M` generated from
    a Cholesky factor proportional to :math:`\det(M)^{\eta - 1}`. Because of that,
    when ``concentration == 1``, we have a uniform distribution over Cholesky
    factors of correlation matrices::

        L ~ LKJCholesky(dim, concentration)
        X = L @ L' ~ LKJCorr(dim, concentration)

    Note that this distribution samples the
    Cholesky factor of correlation matrices and not the correlation matrices
    themselves and thereby differs slightly from the derivations in [1] for
    the `LKJCorr` distribution. For sampling, this uses the Onion method from
    [1] Section 3.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterministic")
        >>> l = LKJCholesky(3, 0.5)
        >>> l.sample()  # l @ l.T is a sample of a correlation 3x3 matrix
        tensor([[ 1.0000,  0.0000,  0.0000],
                [ 0.3516,  0.9361,  0.0000],
                [-0.1899,  0.4748,  0.8593]])

    Args:
        dimension (dim): dimension of the matrices
        concentration (float or Tensor): concentration/shape parameter of the
            distribution (often referred to as eta)

    **References**

    [1] `Generating random correlation matrices based on vines and extended onion method` (2009),
    Daniel Lewandowski, Dorota Kurowicka, Harry Joe.
    Journal of Multivariate Analysis. 100. 10.1016/j.jmva.2009.04.008
    concentrationc                 b   |dk  rt        d| d      || _        t        |      \  | _        | j                  j	                         }t        j                  ||f      }| j                  d| j                  dz
  z  z   }t        j                  | j                  dz
  | j                  j                  | j                  j                        }t        j                  |j                  d      |g      }|dz   }|j                  d      d|z  z
  }	t        ||	      | _        t        
| A  |||       y )	N   zDExpected dim to be an integer greater than or equal to 2. Found dim=.      ?   dtypedevice)r   )
ValueErrordimr   r	   sizetorchSizearanger   r   cat	new_zeros	unsqueezer   _betasuper__init__)selfr   r	   validate_argsbatch_shapeevent_shapemarginal_concoffset
beta_conc1
beta_conc0	__class__s             h/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/torch/distributions/lkj_cholesky.pyr   zLKJCholesky.__init__?   s   7VWZV[[\]   -m <	((--/jj#s,**SDHHqL-AAHHqL$$**%%,,

 F,,T2F;<c\
",,R03<?
*j1
k=A    c                 ~   | j                  t        |      }t        j                  |      }| j                  |_        | j
                  j                  |      |_        | j                  j                  || j                  fz         |_        t        t        |'  || j                  d       | j                  |_        |S )NF)r    )_get_checked_instancer   r   r   r   r	   expandr   r   r   r"   _validate_args)r   r!   	_instancenewr'   s       r(   r,   zLKJCholesky.expandU   s    ((i@jj-(( ..55kBJJ%%kTXXK&?@	k3()) 	) 	
 "00
r)   c                 ~   | j                   j                  |      j                  d      }t        j                  | j                  |      |j                  |j                        j                  d      }||j                  dd      z  }|ddd d f   j                  d       t        j                  |      |z  }t        j                  |j                        j                  }t        j                  dt        j                  |d	z  d
      z
  |      j                         }|t        j                   |      z  }|S )Nr   r   T)r   keepdim.r   g        r   r   r   )min)r   sampler   r   randn_extended_shaper   r   trilnormfill_sqrtfinfotinyclampsum
diag_embed)r   sample_shapeyu_normalu_hypersphereweps
diag_elemss           r(   r4   zLKJCholesky.samplea   s     JJl+55b9;;  .aggahh

$r( 	 !8==R=#FFc1ai &&s+JJqMM)kk!''"''[[UYYq!t%<!<#FKKM
	Uj))r)   c                    | j                   r| j                  |       |j                  dd      ddd f   }t        j                  d| j
                  dz   | j                  j                        }d| j                  dz
  j                  d      z  | j
                  z   |z
  }t        j                  ||j                         z  d      }| j
                  dz
  }| j                  d	|z  z   }t        j                  |      |z  }t        j                  |d	z
  |      }d	|z  t        j                  t        j                        z  }	|	|z   |z
  }
||
z
  S )
Nr   )dim1dim2.r   r   )r   r2   r   )r-   _validate_samplediagonalr   r   r   r	   r   r   r>   loglgammamvlgammamathpi)r   valuerF   orderunnormalized_log_pdfdm1alphadenominator	numeratorpi_constantnormalize_terms              r(   log_probzLKJCholesky.log_probv   s(    !!%(^^"^5c12g>
Q1T5G5G5N5NOT''!+66r::TXXEM$yy1A)ArJhhl""S3Y.ll5)C/NN53;4	 Ci$((477"33$y0;>#n44r)   )g      ?N)N)__name__
__module____qualname____doc__r   positivearg_constraintscorr_choleskysupportr   r,   r   r   r4   r[   __classcell__)r'   s   @r(   r   r      sH    $J '(<(<=O''GB,
 #-%**, *5r)   )r_   rP   r   torch.distributionsr   r    torch.distributions.distributionr   torch.distributions.utilsr   __all__r    r)   r(   <module>rj      s2      1 9 3 /z5, z5r)   