U
    Ãmœd�8  ã                   @   s°   d Z ddlZddlZddlmZmZmZ ddlm	Z	 ddl
mZ ddlmZ dd	„ Zd
d„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )zM
Created on Fri Jan 29 19:19:45 2021

Author: Josef Perktold
License: BSD-3

é    N)ÚstatsÚ	integrateÚoptimizeé   )Ú
transforms)ÚCopula)Úcheck_random_statec                 C   s>   t  t j¡jd }dd„ }t  | ¡}t |||¡d | }|S )Néd   c                 S   s   t  | t  | ¡d  ¡S ©Nr   )ÚnpÚsqueezeÚexp)Út© r   úe/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/statsmodels/distributions/copula/archimedean.pyÚ	integrand   s    z_debye.<locals>.integrandr   )r   ZfinfoZfloat64Zepsr   r   Úquad)ÚalphaZEPSILONr   Z_alphaÚdebye_valuer   r   r   Ú_debye   s
    
r   c                 C   sd   t  | ¡} |  d | d d  | d d  | d d  | d d  | d	 d
  | d d d  }|S )z^Debye function minus 1, Taylor series approximation around zero

    function is not used
    é   é   é$   i  é   ià: é   i ¦ é
   i âgé   é³  l    x"Ø=©r   Úasarray)ÚxZdm1r   r   r   Ú_debyem1_expansion   s    
8
ÿÿr!   c                 C   s2   | dkrt | ƒ}nt| ƒ}dd|d  |   }|S )a  Kendall's tau for Frank Copula

    This uses Taylor series expansion for theta <= 1.

    Parameters
    ----------
    theta : float
        Parameter of the Frank copula. (not vectorized)

    Returns
    -------
    tau : float, tau for given theta
    r   r   )Ú_tau_frank_expansionr   )ÚthetaÚtaur   r   r   r   Ú	tau_frank*   s
    
r%   c                 C   sV   t  | ¡} | d | d d  | d d  | d d  | d d  | d	 d
 d  }|S )Né	   é   i„  é   i¸Î  é   i@‡) i€øÙé   r   l    ^‡vr   )r    r$   r   r   r   r"   B   s
    
6ÿr"   c                       sX   e Zd ZdZd‡ fdd„	Zdd„ Zdd	„ Zdd
d„Zddd„Zddd„Z	dd„ Z
‡  ZS )ÚArchimedeanCopulaaN  Base class for Archimedean copulas

    Parameters
    ----------
    transform : instance of transformation class
        Archimedean generator with required methods including first and second
        derivatives
    args : tuple
        Optional copula parameters. Copula parameters can be either provided
        when creating the instance or as arguments when calling methods.
    k_dim : int
        Dimension, number of components in the multivariate random variable.
        Currently only bivariate copulas are verified. Support for more than
        2 dimension is incomplete.
    r   r   c                    s$   t ƒ j|d� || _|| _d| _d S )N)Úk_dimr   )ÚsuperÚ__init__ÚargsÚ	transformZk_args)Úselfr0   r/   r,   ©Ú	__class__r   r   r.   \   s    zArchimedeanCopula.__init__c                 C   sB   t |tjƒrt|ƒ}t |tƒs$|f}t|ƒdks8|dkr>| j}|S )Nr   ©N)Ú
isinstancer   ÚndarrayÚtupleÚlenr/   )r1   r/   r   r   r   Ú_handle_argsb   s    
zArchimedeanCopula._handle_argsc                 C   s2   t  |¡}|jd | jkr.dd l}| dt¡ |S )Néÿÿÿÿr   zRu has different dimension than k_dim. This will raise exception in future versions)r   r   Úshaper,   ÚwarningsÚwarnÚFutureWarning)r1   Úur<   r   r   r   Ú	_handle_up   s    
þzArchimedeanCopula._handle_uc                 C   sp   |   |¡}|  |¡}d}| jj}| jj}|||f|žŽ  |¡f|žŽ }t|tjƒrV|nd}tj	|dd|d�}|S )z#Evaluate cdf of Archimedean copula.r:   Ng        ç      ð?)Úout)
r9   r@   r0   ÚevaluateÚinverseÚsumr5   r   r6   Zclip)r1   r?   r/   ÚaxisÚphiZphi_invZcdfvrB   r   r   r   Úcdfz   s    

zArchimedeanCopula.cdfc                    sÊ   ˆ  |¡}ˆ |¡}d}ˆjj}|jd dkr8ˆjj}nH|jd dkrPˆjj}n0|jd dkrhˆjj}n|jd ‰ ‡ ‡fdd„}ˆjj|f|žŽ  	|¡}t
 ||f|žŽ |¡}|||f|žŽ 9 }t
 |¡S )z#Evaluate pdf of Archimedean copula.r:   r   r'   r   c                     s   ˆj jˆ f| žŽ S r4   ©r0   Zderivk_inverse©r/   ©Úkr1   r   r   Úpsi_d˜   s    z$ArchimedeanCopula.pdf.<locals>.psi_d)r@   r9   r0   Úderivr;   Úderiv2_inverseÚderiv3_inverseÚderiv4_inverserC   rE   r   ÚprodÚabs)r1   r?   r/   rF   Úphi_d1rM   ÚpsiZpdfvr   rK   r   Úpdf‡   s     





zArchimedeanCopula.pdfc              	      sÜ   ˆ  |¡}ˆ |¡}d}ˆjj}|jd dkr8ˆjj}nH|jd dkrPˆjj}n0|jd dkrhˆjj}n|jd ‰ ‡ ‡fdd„}ˆjj|f|žŽ  	|¡}t
 	t
 t
 ||f|žŽ ¡¡|¡}|t
 t
 ||f|žŽ ¡¡7 }|S )z4Evaluate log pdf of multivariate Archimedean copula.r:   r   r'   r   c                     s   ˆj jˆ f| žŽ S r4   rI   rJ   rK   r   r   rM   µ   s    z'ArchimedeanCopula.logpdf.<locals>.psi_d)r@   r9   r0   rN   r;   rO   rP   rQ   rC   rE   r   ÚlogrS   )r1   r?   r/   rF   rT   rM   rU   Zlogpdfvr   rK   r   Úlogpdf£   s     





"zArchimedeanCopula.logpdfc                 C   s
   |   |¡S r4   )Útheta_from_tau©r1   r$   r   r   r   Ú_arg_from_tauÁ   s    zArchimedeanCopula._arg_from_tau)r   r   )r   )r   )r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r.   r9   r@   rH   rV   rX   r[   Ú__classcell__r   r   r2   r   r+   K   s   



r+   c                       sd   e Zd ZdZd‡ fdd„	Zddd	„Zd‡ fd
d„	Zd‡ fdd„	Zddd„Zddd„Z	dd„ Z
‡  ZS )ÚClaytonCopulaa  Clayton copula.

    Dependence is greater in the negative tail than in the positive.

    .. math::

        C_\theta(u,v) = \left[ \max\left\{ u^{-\theta} + v^{-\theta} -1 ;
        0 \right\} \right]^{-1/\theta}

    with :math:`\theta\in[-1,\infty)\backslash\{0\}`.

    Nr   c                    sT   |d k	r|f}nd}t ƒ jt ¡ ||d� |d k	rJ|dksB|dkrJtdƒ‚|| _d S )Nr   ©r/   r,   r:   r   zTheta must be > -1 and !=0)r-   r.   r   ZTransfClaytonÚ
ValueErrorr#   ©r1   r#   r,   r/   r2   r   r   r.   Ô   s    zClaytonCopula.__init__r   r   c           	      C   s„   t |ƒ}|  |¡\}| || jf¡}t d| ¡j|df|d�}| jdkrfdt |¡|  d|  }n| j	 
t |¡ | |¡}|S )NrA   r   ©ÚsizeÚrandom_stater   ç      ð¿)r   r9   Úrandomr,   r   ÚgammaÚrvsr   rW   r0   rD   ©	r1   Únobsr/   rg   ÚrngÚthr    ÚvÚrvr   r   r   rk   à   s    
zClaytonCopula.rvsc                    sŒ   |   |¡}|  |¡\}|jd dkrz|d tj|dd�|d    }tj||  dd�d }d| d  | }|||  S tƒ  ||¡S d S )Nr:   r   r   ©rF   )r@   r9   r;   r   rR   rE   r-   rV   )r1   r?   r/   ro   ÚaÚbÚcr2   r   r   rV   ë   s    
 zClaytonCopula.pdfc                    s   t ƒ j||d�S ©NrJ   ©r-   rX   ©r1   r?   r/   r2   r   r   rX   ö   s    zClaytonCopula.logpdfc                 C   sD   |   |¡}|  |¡\}|jd }tj||  dd�| d d|  S )Nr:   rr   r   rh   )r@   r9   r;   r   rE   )r1   r?   r/   ro   Údr   r   r   rH   ú   s    

zClaytonCopula.cdfc                 C   s   |d kr| j }||d  S )Nr   ©r#   ©r1   r#   r   r   r   r$      s    zClaytonCopula.tauc                 C   s   d| d|  S )Nr   r   r   rZ   r   r   r   rY     s    zClaytonCopula.theta_from_tau)Nr   )r   r   N)r   )r   )r   )N)r\   r]   r^   r_   r.   rk   rV   rX   rH   r$   rY   r`   r   r   r2   r   ra   Æ   s   


ra   c                       sx   e Zd ZdZd‡ fdd„	Zddd	„Zd‡ fd
d„	Zddd„Zd‡ fdd„	Zddd„Z	ddd„Z
ddd„Zdd„ Z‡  ZS ) ÚFrankCopulaa2  Frank copula.

    Dependence is symmetric.

    .. math::

        C_\theta(\mathbf{u}) = -\frac{1}{\theta} \log \left[ 1-
        \frac{ \prod_j (1-\exp(- \theta u_j)) }{ (1 - \exp(-\theta)-1)^{d -
        1} } \right]

    with :math:`\theta\in \mathbb{R}\backslash\{0\}, \mathbf{u} \in [0, 1]^d`.

    Nr   c                    sL   |d k	r|f}nd}t ƒ jt ¡ ||d� |d k	rB|dkrBtdƒ‚|| _d S )Nr   rb   r   zTheta must be !=0)r-   r.   r   ZTransfFrankrc   r#   rd   r2   r   r   r.     s    zFrankCopula.__init__r   r   c              	   C   s€   t |ƒ}|  |¡\}| || jf¡}tjjdt | ¡ |df|d�}d| t 	dt t 	|¡ |  ¡t | ¡d   ¡ S )NrA   r   re   rh   )
r   r9   ri   r,   r   Zlogserrk   r   r   rW   )r1   rm   r/   rg   rn   ro   r    rp   r   r   r   rk   &  s     ÿ"ÿzFrankCopula.rvsc           	         s¤   |   |¡}|  |¡\}|jd dkr2tƒ  ||¡S t | tj|dd� ¡d }t | ¡d }| | d|  }tjt | | ¡d dd�| }|d }|| S )Nr:   r   rr   r   )	r@   r9   r;   r-   rV   r   r   rE   rR   )	r1   r?   r/   ro   Zg_Úg1ÚnumZauxÚdenr2   r   r   rV   3  s    
"zFrankCopula.pdfc                 C   sp   |   |¡}|  |¡\}|jd }tjdt | | ¡ dd�}dt | ¡ |d  }d| t d||  ¡ S )Nr:   r   rr   rh   )r@   r9   r;   r   rR   r   rW   )r1   r?   r/   ro   Údimr~   r   r   r   r   rH   A  s    

zFrankCopula.cdfc                    s°   |   |¡}|  |¡\}|jd dkrž|d |d  }}dt | ¡ }t || ¡|||   }|dt |dt | | ¡ dt | | ¡   ¡ 8 }|S tƒ  ||¡S d S )Nr:   r   ©.r   ©.r   r   )r@   r9   r;   r   r   rW   r-   rX   )r1   r?   r/   ro   Úu1Úu2rt   rV   r2   r   r   rX   K  s    
ÿzFrankCopula.logpdfc                 C   s†   |   |¡}|  |¡\}|jd dkrz|d |d  }}t | | ¡}|t | ¡t | | ¡ t | | ¡  }|S tdƒ‚dS )zFConditional cdf of second component given the value of first.
        r:   r   r�   r‚   ú#u needs to be bivariate (2 columns)N)r@   r9   r;   r   r   Úexpm1ÚNotImplementedError)r1   r?   r/   ro   rƒ   r„   Zcdfcr   r   r   Úcdfcond_2g1[  s    
0zFrankCopula.cdfcond_2g1c              	   C   sp   t  |¡}|  |¡\}|jd dkrdt  dt  | ¡d| d t  | | ¡ d   ¡ | }|S tdƒ‚dS )zFConditional pdf of second component given the value of first.
        r:   r   r…   N)r   r   r9   r;   rW   r†   r   r‡   )r1   Úqrƒ   r/   ro   Zppfcr   r   r   Úppfcond_2g1i  s    
ÿÿzFrankCopula.ppfcond_2g1c                 C   s   |d kr| j }t|ƒS r4   )r#   r%   r{   r   r   r   r$   w  s    zFrankCopula.tauc                    s\   t  tjj¡}t  tjj¡}‡ ‡fdd„}ˆdk r6dnd}tj||||fd�}|jd }|S )Nc                    s   ˆ j | d�ˆ S )Nrz   )r$   )r   rZ   r   r   Ú_theta_from_tau‚  s    z3FrankCopula.theta_from_tau.<locals>._theta_from_taug)\�Âõ(¼?g      à?r   )Zboundsr   )	r   rW   ÚsysÚ
float_infoÚminÚmaxr   Zleast_squaresr    )r1   r$   ZMIN_FLOAT_LOGZMAX_FLOAT_LOGr‹   ÚstartÚresultr#   r   rZ   r   rY   ~  s     ÿ
zFrankCopula.theta_from_tau)Nr   )r   r   N)r   )r   )r   )r   )r   )N)r\   r]   r^   r_   r.   rk   rV   rH   rX   rˆ   rŠ   r$   rY   r`   r   r   r2   r   r|     s   





r|   c                       sd   e Zd ZdZd‡ fdd„	Zddd	„Zd‡ fd
d„	Zddd„Zd‡ fdd„	Zddd„Z	dd„ Z
‡  ZS )ÚGumbelCopulaa  Gumbel copula.

    Dependence is greater in the positive tail than in the negative.

    .. math::

        C_\theta(u,v) = \exp\!\left[ -\left( (-\log(u))^\theta +
        (-\log(v))^\theta \right)^{1/\theta} \right]

    with :math:`\theta\in[1,\infty)`.

    Nr   c                    sL   |d k	r|f}nd}t ƒ jt ¡ ||d� |d k	rB|dkrBtdƒ‚|| _d S )Nr   rb   r   zTheta must be > 1)r-   r.   r   ZTransfGumbelrc   r#   rd   r2   r   r   r.   œ  s    zGumbelCopula.__init__r   r   c           	   	   C   s¢   t |ƒ}|  |¡\}| || jf¡}tjjd| ddt tj	d|  ¡| |df|d�}| jdkr„t 
t |¡ | d|   ¡}n| j t |¡ | |¡}|S )NrA   r   r   r   re   )r   r9   ri   r,   r   Zlevy_stablerk   r   ÚcosÚpir   rW   r0   rD   rl   r   r   r   rk   ¨  s       ý
"zGumbelCopula.rvsc                    sÈ   |   |¡}|  |¡\}|jd dkr¶t |¡ }|| }tj|dd�}|d|  }t | ¡}|| d }	|d| d  }
tj|dd�|d  }tj|dd�d }||	 |
 | | S tƒ  	||¡S d S )Nr:   r   rr   rA   rh   )
r@   r9   r;   r   rW   rE   r   rR   r-   rV   )r1   r?   r/   ro   ZxyZxy_thetaZsum_xy_thetaZsum_xy_theta_thetars   rt   ru   ry   Úer2   r   r   rV   ¸  s    
zGumbelCopula.pdfc                 C   sH   |   |¡}|  |¡\}tjt |¡ | dd�}t |d|   ¡}|S )Nr:   rr   rA   )r@   r9   r   rE   rW   r   )r1   r?   r/   ro   ÚhrH   r   r   r   rH   Ì  s
    
zGumbelCopula.cdfc                    s   t ƒ j||d�S rv   rw   rx   r2   r   r   rX   Ó  s    zGumbelCopula.logpdfc                 C   s   |d kr| j }|d | S r
   rz   r{   r   r   r   r$   ×  s    zGumbelCopula.tauc                 C   s   dd|  S r
   r   rZ   r   r   r   rY   Þ  s    zGumbelCopula.theta_from_tau)Nr   )r   r   N)r   )r   )r   )N)r\   r]   r^   r_   r.   rk   rV   rH   rX   r$   rY   r`   r   r   r2   r   r’   Ž  s   


r’   )r_   rŒ   Únumpyr   Zscipyr   r   r   Ú r   Zcopulasr   Zstatsmodels.tools.rng_qrngr   r   r!   r%   r"   r+   ra   r|   r’   r   r   r   r   Ú<module>   s   	{E 