U
    Kvf!  ã                
   @   sœ  d dl Z d dlZd dlmZmZmZ ddlmZ e  	dej
 ¡Ze  e¡ZG dd„ dƒZG dd	„ d	ƒZG d
d„ dƒZG dd„ dƒZdd„ Zdd„ Zdd„ Zdd„ ZdZe e¡Zdde e¡  Ze e¡Ze e¡jZe e¡Z e e ¡Z!e "e!e¡Z#e ej $e¡¡Z%dZ&de e&¡de e 'e!¡¡  e#d e&  e dej
 ¡  Z(eeeƒ\Z)Z*e+e) ,¡ dƒ e+e( ,¡ dƒ e+e ej- .e#¡¡ ,¡ de%  ƒ e+dƒ e+e ej-j/ee 	e 0e¡¡d¡ ,¡ ƒ e+dƒ e+de "e 1ej2ed d!d  jd fej¡e¡ee dej
 ¡  de e 'e!¡¡ ,¡    ƒ e+de "e 1e 2e¡d  jd fej¡e¡ee dej
 ¡  de e 'e!¡¡ ,¡    ƒ e+de "e 1e 2e¡ej¡e¡ee dej
 ¡  de e 'e!¡¡ ,¡    ƒ e+eeeƒƒ ee 3e¡eeƒ ƒZ4e+e4 5e#¡ ,¡ ƒ e+eedƒƒ ee 3e¡eƒZ6e+e6 5e¡ƒ e6 7e¡Z8e+d"e "e8e8¡ƒ e+d"e "ee 1e 2e6j¡e¡¡ƒ e+d"e "ee 1e6jd fe¡¡ƒ dS )#é    N)ÚlinalgÚstatsÚspecialé   )ÚSvdArrayé   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚStandardNormalz®Distribution of vector x, with independent distribution N(0,1)

    this is the same as univariate normal for pdf and logpdf

    other methods not checked/adjusted yet

    c                 C   s   t j |¡S ©N)ÚnpÚrandomZstandard_normal©ÚselfÚsize© r   úM/tmp/pip-unpacked-wheel-2v6byqio/statsmodels/sandbox/archive/linalg_covmat.pyÚrvs   s    zStandardNormal.rvsc                 C   s   t  |d  d ¡t S ©Nr   ç      à?)r
   ÚexpÚsqrt2pi©r   Úxr   r   r   Úpdf   s    zStandardNormal.pdfc                 C   s   |d  d t  S r   )Ú
logsqrt2pir   r   r   r   Úlogpdf   s    zStandardNormal.logpdfc                 C   s
   t  |¡S r	   )r   Úndtrr   r   r   r   Ú_cdf   s    zStandardNormal._cdfc                 C   s   t  t |¡¡S r	   )r
   Úlogr   r   r   r   r   r   Ú_logcdf   s    zStandardNormal._logcdfc                 C   s
   t  |¡S r	   )r   Zndtri)r   Úqr   r   r   Ú_ppf   s    zStandardNormal._ppfN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r    r   r   r   r   r      s   r   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚAffineTransforma  affine full rank transformation of a multivariate distribution

    no dimension checking, assumes everything broadcasts correctly
    first version without bound support

    provides distribution of y given distribution of x
    y = const + tmat * x

    c                 C   s€   || _ || _|| _t|ƒ| _t | j|j¡ ¡ s8t	dƒ‚t
 |¡| _t tj
 | j¡¡| _t t tj
 | j¡¡¡| _| j d S )Nz(dimension of const and tmat do not agree)ÚconstÚtmatÚdistÚlenÚnrvr
   ÚequalÚshapeÚallÚ
ValueErrorr   ÚinvÚtmatinvÚabsÚdetÚabsdetr   Ú	logabsdet)r   r&   r'   r(   r   r   r   Ú__init__-   s    
zAffineTransform.__init__c                 C   s0   t |f| jf ƒ |  | jj|f| jf d¡S )N)r   )Úprintr*   Ú	transformr(   r   r   r   r   r   r   ;   s    zAffineTransform.rvsc                 C   s   t  || j¡| j S r	   )r
   Údotr'   r&   r   r   r   r   r7   @   s    zAffineTransform.transformc                 C   s   t  | j|| j ¡S r	   )r
   r8   r0   r&   )r   Úyr   r   r   ÚinvtransformD   s    zAffineTransform.invtransformc                 C   s   d| j  | j |  |¡¡ S )Nç      ð?)r3   r(   r   r:   r   r   r   r   r   G   s    zAffineTransform.pdfc                 C   s   | j  | j |  |¡¡ S r	   )r4   r(   r   r:   r   r   r   r   r   J   s    zAffineTransform.logpdfN)
r!   r"   r#   r$   r5   r   r7   r:   r   r   r   r   r   r   r%   #   s   	r%   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚMultivariateNormalCholaŠ  multivariate normal distribution with cholesky decomposition of sigma

    ignoring mean at the beginning, maybe

    needs testing for broadcasting to contemporaneously but not intertemporaly
    correlated random variable, which axis?,
    maybe swapaxis or rollaxis if x.ndim != mean.ndim == (sigma.ndim - 1)

    initially 1d is ok, 2d should work with iid in axis 0 and mvn in axis 1

    c                 C   sB   || _ || _t| _t |¡| _t t¡d d d…d d d…f | _d S ©Néÿÿÿÿ)ÚmeanÚsigmaÚsigmainvr   ÚcholeskyÚ	cholsigmaÚcholsigmainv©r   r?   r@   r   r   r   r5   ]   s
    zMultivariateNormalChol.__init__c                 C   s   t  t|¡S r	   )r
   r8   rD   r   r   r   r   Úwhitenf   s    zMultivariateNormalChol.whitenc                 C   sn   || j  }|  |¡}t tj t¡¡}d}dt |¡dt t | j¡¡  |d |  t dtj	 ¡  }|S )Nr;   r   ç       @r   )
r?   rF   r
   r   r   r2   r@   ÚdiagonalrD   Úpi)r   r   Ú
x_whitenedÚlogdetsigmaÚsigma2Úlliker   r   r   Ú
logpdf_obsi   s    


ÿ
þýz!MultivariateNormalChol.logpdf_obsc                 C   s   |   |¡ d¡S r=   )rN   Úsumr   r   r   r   r   y   s    zMultivariateNormalChol.logpdfc                 C   s   t  |  |¡¡S r	   )r
   r   r   r   r   r   r   r   |   s    zMultivariateNormalChol.pdfN)	r!   r"   r#   r$   r5   rF   rN   r   r   r   r   r   r   r<   P   s   	r<   c                   @   s   e Zd Zdd„ ZdS )ÚMultivariateNormalc                 C   s   || _ t|ƒ| _d S r	   )r?   r   r@   rE   r   r   r   r5   ƒ   s    zMultivariateNormal.__init__N)r!   r"   r#   r5   r   r   r   r   rP      s   rP   c                 C   s–   t  | ¡} t j| d | dd… || dd…   f }dd|d   }d|d  d¡ | t  d|d  ¡ | jd t  dt j ¡t  |¡    }|S )zxloglikelihood of AR(1) process, as a test case

    sigma_u partially hard coded

    Greene chapter 12 eq. (12-31)
    r   r   Nr>   r   r   )r
   ZasarrayZr_rO   r   r,   rI   )r   ÚrhoÚuZsigma_u2Zloglikr   r   r   Úloglike_ar1Š   s    
*&"ÿrS   c                 C   sÄ   |\}}t  | ¡}t  d| d| d |d   d|  ¡| d  |d< t  d|d  ¡| d  |t  d|d  ¡ d|  | d   |d< | dd… || dd…   || dd…   |dd…< |S )z

    (Greene eq 12-30)
    r   r   r   Nr>   éþÿÿÿ)r
   Z
zeros_likeÚsqrt)r   ZarcoefsZa1Za2r9   r   r   r   Úar2transform™   s    
6D4rV   c                 C   sf   t  |¡}t tj  |¡¡}t| ƒ}t | t || ¡¡ }||t dtj ¡ 8 }||8 }|d9 }|S )úæloglike multivariate normal

    assumes x is 1d, (nobs,) and sigma is 2d (nobs, nobs)

    brute force from formula
    no checking of correct inputs
    use of inv and log-det should be replace with something more efficient
    r   r   )r   r/   r
   r   r2   r)   r8   rI   )r   r@   rA   rK   ÚnobsZllfr   r   r   Úmvn_loglike¦   s    
rY   c                 C   s€   t  |¡}t  |¡}t || ¡}t tj  |¡¡}d}dt |¡dt t |¡¡  |d |  t dtj ¡  }||d fS )rW   r;   r   rG   r   )	r   r/   rB   r
   r8   r   r2   rH   rI   )r   r@   rA   rD   rJ   rK   rL   rM   r   r   r   Úmvn_nloglike_obs»   s    


ÿþrZ   é
   gš™™™™™é?r;   r   rG   zll.sum()zllike.sum()zstats whitened)Zscalezstats scaledF)ÚlowerZxSigmax)9ÚmathZnumpyr
   Zscipyr   r   r   Zlinalg_decomp_1r   rU   rI   r   r   r   r   r%   r<   rP   rS   rV   rY   rZ   rX   Zaranger   ZautocovZtoeplitzr@   rB   ÚTrC   r/   rA   rD   r8   rJ   r2   rK   rL   rH   rM   ZllZlsr6   rO   ZnormZ_pdfr   ZdiagZ	cho_solveZ
cho_factorÚzerosZ
normtransfr   ZmchrF   Zxwr   r   r   r   Ú<module>   st   
-1	




ÿþ"*ÿÿÿþýZP
"