§
    O�’j¼(  ã                   óš   — d dl Z d dl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mZ d dlmZ dgZd	„ Zd
„ Zd„ Z G d„ de¦  «        ZdS )é    N)ÚTensor)Úconstraints)ÚDistribution)Ú_batch_mahalanobisÚ	_batch_mv)Ú_standard_normalÚlazy_property)Ú_sizeÚLowRankMultivariateNormalc                 óT  — |                       d¦  «        }| j        |                     d¦  «        z  }t          j        || ¦  «                             ¦   «         }|                     d||z  ¦  «        dd…dd|dz   …fxx         dz  cc<   t          j                             |¦  «        S )zƒ
    Computes Cholesky of :math:`I + W.T @ inv(D) @ W` for a batch of matrices :math:`W`
    and a batch of vectors :math:`D`.
    éÿÿÿÿéþÿÿÿNé   )	ÚsizeÚmTÚ	unsqueezeÚtorchÚmatmulÚ
contiguousÚviewÚlinalgÚcholesky)ÚWÚDÚmÚWt_DinvÚKs        ú]C:\Projects\DSCons\.venv\Lib\site-packages\torch\distributions\lowrank_multivariate_normal.pyÚ_batch_capacitance_trilr      sœ   € ð
 	
�Šˆr‰
Œ
€AØŒd�Q—[’[ ‘_”_Ñ$€GÝŒ�W˜aÑ Ô ×+Ò+Ñ-Ô-€AØ‡F‚Fˆ2ˆq�1‰uÑÔ�a�a�a˜˜˜A ™E˜�kÐ"Ð"Ô" aÑ'Ð"Ð"Ñ"ÝŒ<× Ò  Ñ#Ô#Ð#ó    c                 óÐ   — d|                      dd¬¦  «                             ¦   «                              d¦  «        z  |                     ¦   «                              d¦  «        z   S )zÇ
    Uses "matrix determinant lemma"::
        log|W @ W.T + D| = log|C| + log|D|,
    where :math:`C` is the capacitance matrix :math:`I + W.T @ inv(D) @ W`, to compute
    the log determinant.
    é   r   r   )Údim1Údim2)ÚdiagonalÚlogÚsum)r   r   Úcapacitance_trils      r   Ú_batch_lowrank_logdetr)      sa   € ð Ð×(Ò(¨b°rÐ(Ñ:Ô:×>Ò>Ñ@Ô@×DÒDÀRÑHÔHÑHÈ1Ï5Ê5É7Ì7Ï;Ê;Ø
ñLô Lñ ð r    c                 óÜ   — | j         |                     d¦  «        z  }t          ||¦  «        }|                     d¦  «        |z                       d¦  «        }t          ||¦  «        }||z
  S )a  
    Uses "Woodbury matrix identity"::
        inv(W @ W.T + D) = inv(D) - inv(D) @ W @ inv(C) @ W.T @ inv(D),
    where :math:`C` is the capacitance matrix :math:`I + W.T @ inv(D) @ W`, to compute the squared
    Mahalanobis distance :math:`x.T @ inv(W @ W.T + D) @ x`.
    r   r"   r   )r   r   r   Úpowr'   r   )r   r   Úxr(   r   Ú	Wt_Dinv_xÚmahalanobis_term1Úmahalanobis_term2s           r   Ú_batch_lowrank_mahalanobisr0   (   sh   € ð Œd�Q—[’[ ‘_”_Ñ$€GÝ˜' 1Ñ%Ô%€IØŸš˜q™œ A™×*Ò*¨2Ñ.Ô.ÐÝ*Ð+;¸YÑGÔGÐØÐ0Ñ0Ð0r    c                   ó¨  ‡ — e Zd ZdZej         ej        ej        d¦  «         ej        ej        d¦  «        dœZ	ej        Z
dZ	 ddeded	ed
edz  ddf
ˆ fd„Zdˆ fd„	Zedefd„¦   «         Zedefd„¦   «         Zedefd„¦   «         Zedefd„¦   «         Zedefd„¦   «         Zedefd„¦   «         Z ej        ¦   «         fdedefd„Zd„ Zd„ Zˆ xZS )r   a  
    Creates a multivariate normal distribution with covariance matrix having a low-rank form
    parameterized by :attr:`cov_factor` and :attr:`cov_diag`::

        covariance_matrix = cov_factor @ cov_factor.T + cov_diag

    Example:
        >>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_LAPACK)
        >>> # xdoctest: +IGNORE_WANT("non-deterministic")
        >>> m = LowRankMultivariateNormal(
        ...     torch.zeros(2), torch.tensor([[1.0], [0.0]]), torch.ones(2)
        ... )
        >>> m.sample()  # normally distributed with mean=`[0,0]`, cov_factor=`[[1],[0]]`, cov_diag=`[1,1]`
        tensor([-0.2102, -0.5429])

    Args:
        loc (Tensor): mean of the distribution with shape `batch_shape + event_shape`
        cov_factor (Tensor): factor part of low-rank form of covariance matrix with shape
            `batch_shape + event_shape + (rank,)`
        cov_diag (Tensor): diagonal part of low-rank form of covariance matrix with shape
            `batch_shape + event_shape`

    Note:
        The computation for determinant and inverse of covariance matrix is avoided when
        `cov_factor.shape[1] << cov_factor.shape[0]` thanks to `Woodbury matrix identity
        <https://en.wikipedia.org/wiki/Woodbury_matrix_identity>`_ and
        `matrix determinant lemma <https://en.wikipedia.org/wiki/Matrix_determinant_lemma>`_.
        Thanks to these formulas, we just need to compute the determinant and inverse of
        the small size "capacitance" matrix::

            capacitance = I + cov_factor.T @ inv(cov_diag) @ cov_factor
    r"   r   )ÚlocÚ
cov_factorÚcov_diagTNr2   r3   r4   Úvalidate_argsÚreturnc           	      óX  •— |                      ¦   «         dk     rt          d¦  «        ‚|j        dd …         }|                      ¦   «         dk     rt          d¦  «        ‚|j        dd…         |k    rt          d|d         › d	�¦  «        ‚|j        dd …         |k    rt          d
|› �¦  «        ‚|                     d¦  «        }|                     d¦  «        }	 t	          j        |||¦  «        \  }| _        }n:# t          $ r-}t          d|j        › d|j        › d|j        › �¦  «        |‚d }~ww xY w|d         | _        |d         | _	        | j        j        d d…         }	|| _
        || _        t          ||¦  «        | _        t          ¦   «                              |	||¬¦  «         d S )Nr   z%loc must be at least one-dimensional.r   r"   zScov_factor must be at least two-dimensional, with optional leading batch dimensionsr   z2cov_factor must be a batch of matrices with shape r   z x mz/cov_diag must be a batch of vectors with shape zIncompatible batch shapes: loc z, cov_factor z, cov_diag ).r   ©r5   )ÚdimÚ
ValueErrorÚshaper   r   Úbroadcast_tensorsr3   ÚRuntimeErrorr2   r4   Ú_unbroadcasted_cov_factorÚ_unbroadcasted_cov_diagr   Ú_capacitance_trilÚsuperÚ__init__)Úselfr2   r3   r4   r5   Úevent_shapeÚloc_Ú	cov_diag_ÚeÚbatch_shapeÚ	__class__s             €r   rB   z"LowRankMultivariateNormal.__init__a   sî  ø€ ð �7Š7‰9Œ9�qŠ=ˆ=ÝÐDÑEÔEÐEØ”i   ”nˆØ�>Š>ÑÔ˜aÒÐÝð9ñô ð ð Ô˜B˜r˜EÔ" kÒ1Ð1ÝØYÀ[ÐQRÄ^ÐYÐYÐYñô ð ð Œ>˜"˜#˜#Ô +Ò-Ð-ÝØOÀ+ÐOÐOñô ð ð �}Š}˜RÑ Ô ˆØ×&Ò& rÑ*Ô*ˆ	ð	Ý/4Ô/FØ�j )ñ0ô 0Ñ,ˆD�$”/ 9 9øõ ð 	ð 	ð 	ÝØw°#´)ÐwÐwÈ*ÔJZÐwÐwÐgoÔguÐwÐwñô àðøøøøð	øøøð ˜”<ˆŒØ! &Ô)ˆŒØ”h”n S b SÔ)ˆà)3ˆÔ&Ø'/ˆÔ$Ý!8¸ÀXÑ!NÔ!NˆÔå‰Œ×Ò˜ kÀÐÑOÔOÐOÐOÐOs   ÃC; Ã;
D2Ä(D-Ä-D2c                 ó  •— |                       t          |¦  «        }t          j        |¦  «        }|| j        z   }| j                             |¦  «        |_        | j                             |¦  «        |_        | j                             || j        j	        dd …         z   ¦  «        |_        | j
        |_
        | j        |_        | j        |_        t          t          |¦  «                             || j        d¬¦  «         | j        |_        |S )Nr   Fr8   )Ú_get_checked_instancer   r   ÚSizerD   r2   Úexpandr4   r3   r;   r>   r?   r@   rA   rB   Ú_validate_args)rC   rH   Ú	_instanceÚnewÚ	loc_shaperI   s        €r   rM   z LowRankMultivariateNormal.expand�   só   ø€ Ø×(Ò(Õ)BÀIÑNÔNˆÝ”j Ñ-Ô-ˆØ $Ô"2Ñ2ˆ	Ø”(—/’/ )Ñ,Ô,ˆŒØ”}×+Ò+¨IÑ6Ô6ˆŒØœ×/Ò/°	¸D¼OÔ<QÐRTÐRUÐRUÔ<VÑ0VÑWÔWˆŒØ(,Ô(FˆÔ%Ø&*Ô&BˆÔ#Ø $Ô 6ˆÔÝÕ'¨Ñ-Ô-×6Ò6Ø˜Ô)¸ð 	7ñ 	
ô 	
ð 	
ð "Ô0ˆÔØˆ
r    c                 ó   — | j         S ©N©r2   ©rC   s    r   ÚmeanzLowRankMultivariateNormal.mean�   ó	   € àŒxˆr    c                 ó   — | j         S rS   rT   rU   s    r   ÚmodezLowRankMultivariateNormal.mode¡   rW   r    c                 ó¬   — | j                              d¦  «                             d¦  «        | j        z                        | j        | j        z   ¦  «        S )Nr"   r   )r>   r+   r'   r?   rM   Ú_batch_shapeÚ_event_shaperU   s    r   Úvariancez"LowRankMultivariateNormal.variance¥   sK   € ð Ô*×.Ò.¨qÑ1Ô1×5Ò5°bÑ9Ô9¸DÔ<XÑXß
Š&�Ô" TÔ%6Ñ6Ñ
7Ô
7ð	8r    c                 óÚ  — | j         d         }| j                             ¦   «                              d¦  «        }| j        |z  }t          j        ||j        ¦  «                             ¦   «         }| 	                    d||z  ¦  «        d d …d d |dz   …fxx         dz  cc<   |t
          j
                             |¦  «        z  }|                     | j        | j         z   | j         z   ¦  «        S )Nr   r   r   )r\   r?   Úsqrtr   r>   r   r   r   r   r   r   r   rM   r[   )rC   ÚnÚcov_diag_sqrt_unsqueezeÚ
Dinvsqrt_Wr   Ú
scale_trils         r   rc   z$LowRankMultivariateNormal.scale_tril«   sê   € ð Ô˜aÔ ˆØ"&Ô">×"CÒ"CÑ"EÔ"E×"OÒ"OÐPRÑ"SÔ"SÐØÔ3Ð6MÑMˆ
ÝŒL˜ Z¤]Ñ3Ô3×>Ò>Ñ@Ô@ˆØ	�Šˆr�1�q‘5ÑÔ˜!˜!˜!˜X˜X  A¡˜X˜+Ð&Ð&Ô&¨!Ñ+Ð&Ð&Ñ&Ø,­u¬|×/DÒ/DÀQÑ/GÔ/GÑGˆ
Ø× Ò ØÔ Ô 1Ñ1°DÔ4EÑEñ
ô 
ð 	
r    c                 óÒ   — t          j        | j        | j        j        ¦  «        t          j        | j        ¦  «        z   }|                     | j        | j        z   | j        z   ¦  «        S rS   )	r   r   r>   r   Ú
diag_embedr?   rM   r[   r\   )rC   Úcovariance_matrixs     r   rf   z+LowRankMultivariateNormal.covariance_matrix¼   sh   € å!œLØÔ*¨DÔ,JÔ,Mñ
ô 
åÔ˜TÔ9Ñ:Ô:ñ;Ðð !×'Ò'ØÔ Ô 1Ñ1°DÔ4EÑEñ
ô 
ð 	
r    c                 ó^  — | j         j        | j                             d¦  «        z  }t          j                             | j        |d¬¦  «        }t	          j        | j         	                    ¦   «         ¦  «        |j        |z  z
  }| 
                    | j        | j        z   | j        z   ¦  «        S )Nr   F)Úupper)r>   r   r?   r   r   r   Úsolve_triangularr@   re   Ú
reciprocalrM   r[   r\   )rC   r   ÚAÚprecision_matrixs       r   rl   z*LowRankMultivariateNormal.precision_matrixÅ   s«   € ð Ô*Ô-ØÔ*×4Ò4°RÑ8Ô8ñ9ð 	õ ŒL×)Ò)¨$Ô*@À'ÐQVÐ)ÑWÔWˆåÔ˜TÔ9×DÒDÑFÔFÑGÔGÈ!Ì$ÐQRÉ(ÑRð 	ð  ×&Ò&ØÔ Ô 1Ñ1°DÔ4EÑEñ
ô 
ð 	
r    Úsample_shapec                 óv  — |                       |¦  «        }|d d…         | j        j        dd …         z   }t          || j        j        | j        j        ¬¦  «        }t          || j        j        | j        j        ¬¦  «        }| j        t          | j        |¦  «        z   | j	         
                    ¦   «         |z  z   S )Nr   )ÚdtypeÚdevice)Ú_extended_shaper3   r;   r   r2   ro   rp   r   r>   r?   r_   )rC   rm   r;   ÚW_shapeÚeps_WÚeps_Ds         r   Úrsamplez!LowRankMultivariateNormal.rsampleÖ   s¨   € Ø×$Ò$ \Ñ2Ô2ˆØ˜˜˜”*˜tœÔ4°R°S°SÔ9Ñ9ˆÝ  °´´ÀtÄxÄÐWÑWÔWˆÝ  ¨d¬h¬nÀTÄXÄ_ÐUÑUÔUˆàŒHÝ˜Ô6¸Ñ>Ô>ñ?àÔ*×/Ò/Ñ1Ô1°EÑ9ñ:ð	
r    c                 ó@  — | j         r|                      |¦  «         || j        z
  }t          | j        | j        || j        ¦  «        }t          | j        | j        | j        ¦  «        }d| j        d         t          j
        dt          j        z  ¦  «        z  |z   |z   z  S )Ng      à¿r   r"   )rN   Ú_validate_sampler2   r0   r>   r?   r@   r)   r\   Úmathr&   Úpi)rC   ÚvalueÚdiffÚMÚlog_dets        r   Úlog_probz"LowRankMultivariateNormal.log_probá   s©   € ØÔð 	)Ø×!Ò! %Ñ(Ô(Ð(Ø�t”xÑˆÝ&ØÔ*ØÔ(ØØÔ"ñ	
ô 
ˆõ (ØÔ*ØÔ(ØÔ"ñ
ô 
ˆð
 �tÔ(¨Ô+­d¬h°q½4¼7±{Ñ.CÔ.CÑCÀgÑMÐPQÑQÑRÐRr    c                 ó  — t          | j        | j        | j        ¦  «        }d| j        d         dt          j        dt
          j        z  ¦  «        z   z  |z   z  }t          | j	        ¦  «        dk    r|S | 
                    | j	        ¦  «        S )Ng      à?r   g      ð?r"   )r)   r>   r?   r@   r\   rx   r&   ry   Úlenr[   rM   )rC   r}   ÚHs      r   Úentropyz!LowRankMultivariateNormal.entropyò   s†   € Ý'ØÔ*ØÔ(ØÔ"ñ
ô 
ˆð
 �4Ô$ QÔ'¨3µ´¸!½d¼g¹+Ñ1FÔ1FÑ+FÑGÈ'ÑQÑRˆÝˆtÔ Ñ!Ô! QÒ&Ð&ØˆHà—8’8˜DÔ-Ñ.Ô.Ð.r    rS   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úreal_vectorÚindependentÚrealÚpositiveÚarg_constraintsÚsupportÚhas_rsampler   ÚboolrB   rM   ÚpropertyrV   rY   r	   r]   rc   rf   rl   r   rL   r
   ru   r~   r‚   Ú__classcell__)rI   s   @r   r   r   6   s=  ø€ € € € € ðð ðF Ô&Ø-�kÔ-¨kÔ.>ÀÑBÔBØ+�KÔ+¨KÔ,@À!ÑDÔDðð €Oð
 Ô%€GØ€Kð &*ð*Pð *Pàð*Pð ð*Pð ð	*Pð
 ˜d‘{ð*Pð 
ð*Pð *Pð *Pð *Pð *Pð *PðXð ð ð ð ð ð  ð�fð ð ð ñ „Xðð ð�fð ð ð ñ „Xðð ð8˜&ð 8ð 8ð 8ñ „]ð8ð
 ð
˜Fð 
ð 
ð 
ñ „]ð
ð  ð
 6ð 
ð 
ð 
ñ „]ð
ð ð
 &ð 
ð 
ð 
ñ „]ð
ð  -7¨E¬J©L¬Lð 	
ð 	
 Eð 	
¸Vð 	
ð 	
ð 	
ð 	
ðSð Sð Sð"
/ð 
/ð 
/ð 
/ð 
/ð 
/ð 
/r    )rx   r   r   Útorch.distributionsr   Ú torch.distributions.distributionr   Ú'torch.distributions.multivariate_normalr   r   Útorch.distributions.utilsr   r	   Útorch.typesr
   Ú__all__r   r)   r0   r   © r    r   ú<module>r˜      s  ðà €€€à €€€Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ Ð Ð Ð Ð Ð ð 'Ð
'€ð	$ð 	$ð 	$ð	ð 	ð 	ð1ð 1ð 1ðF/ð F/ð F/ð F/ð F/ ñ F/ô F/ð F/ð F/ð F/r    