
    rh                     x    d Z ddlZddlmZmZ ddlZddlm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)OptionalUnion)Tensor)Betaconstraints)Distribution)broadcast_allLKJCholeskyc            	            e Zd ZdZdej
                  iZej                  Z	 	 dde	de
eef   dee   ddf 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
    concentrationNdimvalidate_argsreturnc                 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   )
ValueErrorr   r	   r   sizetorchSizearanger   r   cat	new_zeros	unsqueezer   _betasuper__init__)selfr   r   r   batch_shapeevent_shapemarginal_concoffset
beta_conc1
beta_conc0	__class__s             s/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/torch/distributions/lkj_cholesky.pyr#   zLKJCholesky.__init__B   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,   r0   zLKJCholesky.expand]   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,   r8   zLKJCholesky.samplei   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   r6   r   )r1   _validate_samplediagonalr   r   r   r   r   r    rB   loglgammamvlgammamathpi)r$   valuerJ   orderunnormalized_log_pdfdm1alphadenominator	numeratorpi_constantnormalize_terms              r,   log_probzLKJCholesky.log_prob~   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supportintr   r   floatr   boolr#   r0   r   r   r8   r_   __classcell__)r+   s   @r,   r
   r
      s    $L '(<(<=O''G
 /2(,	BB VU]+B  ~	B
 
B6
 #-%**, *5r-   )rc   rT   typingr   r   r   r   torch.distributionsr   r    torch.distributions.distributionr   torch.distributions.utilsr	   __all__r
    r-   r,   <module>rr      s8     "   1 9 3 /@5, @5r-   