U
    Kvf8                     @   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 )Nd   c                 S   s   t | t | d  S Nr   )npsqueezeexp)t r   P/tmp/pip-unpacked-wheel-2v6byqio/statsmodels/distributions/copula/archimedean.py	integrand   s    z_debye.<locals>.integrandr   )r   ZfinfoZfloat64Zepsr   r   Z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)selfr/   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.   )r0   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 )Nr   zRu has different dimension than k_dim. This will raise exception in future versions)r   r   shaper+   warningswarnFutureWarning)r0   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.r9   Ng              ?)out)
r8   r?   r/   evaluateinversesumr4   r   r5   Zclip)r0   r>   r.   axisphiZphi_invZcdfvrA   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.r9   r   r&   r   c                     s   j j f|  S r3   r/   Zderivk_inverser.   kr0   r   r   psi_d   s    z$ArchimedeanCopula.pdf.<locals>.psi_d)r?   r8   r/   derivr:   deriv2_inversederiv3_inversederiv4_inverserB   rD   r   prodabs)r0   r>   r.   rE   phi_d1rL   psiZpdfvr   rJ   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.r9   r   r&   r   c                     s   j j f|  S r3   rH   rI   rJ   r   r   rL      s    z'ArchimedeanCopula.logpdf.<locals>.psi_d)r?   r8   r/   rM   r:   rN   rO   rP   rB   rD   r   logrR   )r0   r>   r.   rE   rS   rL   rT   Zlogpdfvr   rJ   r   logpdf   s     





"zArchimedeanCopula.logpdfc                 C   s
   |  |S r3   )theta_from_taur0   r#   r   r   r   _arg_from_tau   s    zArchimedeanCopula._arg_from_tau)r   r   )r   )r   )r   )__name__
__module____qualname____doc__r-   r8   r?   rG   rU   rW   rZ   __classcell__r   r   r1   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+   r9   r   zTheta must be > -1 and !=0)r,   r-   r   ZTransfClayton
ValueErrorr"   r0   r"   r+   r.   r1   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 )Nr@   r   sizerandom_stater         )r   r8   randomr+   r   gammarvsr   rV   r/   rC   	r0   nobsr.   rf   rngthr   vrvr   r   r   rj      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 )Nr9   r   r   rE   )r?   r8   r:   r   rQ   rD   r,   rU   )r0   r>   r.   rn   abcr1   r   r   rU      s    
 zClaytonCopula.pdfc                    s   t  j||dS NrI   r,   rW   r0   r>   r.   r1   r   r   rW      s    zClaytonCopula.logpdfc                 C   sD   |  |}| |\}|jd }tj||  dd| d d|  S )Nr9   rq   r   rg   )r?   r8   r:   r   rD   )r0   r>   r.   rn   dr   r   r   rG      s    

zClaytonCopula.cdfc                 C   s   |d kr| j }||d  S )Nr   r"   r0   r"   r   r   r   r#      s    zClaytonCopula.tauc                 C   s   d| d|  S )Nr   r   r   rY   r   r   r   rX     s    zClaytonCopula.theta_from_tau)Nr   )r   r   N)r   )r   )r   )N)r[   r\   r]   r^   r-   rj   rU   rW   rG   r#   rX   r_   r   r   r1   r   r`      s   


r`   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   ra   r   zTheta must be !=0)r,   r-   r   ZTransfFrankrb   r"   rc   r1   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 )Nr@   r   rd   rg   )
r   r8   rh   r+   r   Zlogserrj   r   r   rV   )r0   rl   r.   rf   rm   rn   r   ro   r   r   r   rj   &  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 )Nr9   r   rq   r   )	r?   r8   r:   r,   rU   r   r   rD   rQ   )	r0   r>   r.   rn   Zg_Zg1numZauxdenr1   r   r   rU   3  s    
"zFrankCopula.pdfc                 C   sp   |  |}| |\}|jd }tjdt| |  dd}dt|  |d  }d| td||   S )Nr9   r   rq   rg   )r?   r8   r:   r   rQ   r   rV   )r0   r>   r.   rn   Zdimr|   r}   r   r   r   rG   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 )Nr9   r   .r   .r   r   )r?   r8   r:   r   r   rV   r,   rW   )r0   r>   r.   rn   u1u2rs   rU   r1   r   r   rW   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.
        r9   r   r~   r   #u needs to be bivariate (2 columns)N)r?   r8   r:   r   r   expm1NotImplementedError)r0   r>   r.   rn   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.
        r9   r   r   N)r   r   r8   r:   rV   r   r   r   )r0   qr   r.   rn   Zppfcr   r   r   ppfcond_2g1i  s    
zFrankCopula.ppfcond_2g1c                 C   s   |d kr| j }t|S r3   )r"   r$   rz   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 )Nry   )r#   )r   rY   r   r   _theta_from_tau  s    z3FrankCopula.theta_from_tau.<locals>._theta_from_taug)\(?g      ?r   )Zboundsr   )	r   rV   sys
float_infominmaxr   Zleast_squaresr   )r0   r#   ZMIN_FLOAT_LOGZMAX_FLOAT_LOGr   startresultr"   r   rY   r   rX   ~  s     
zFrankCopula.theta_from_tau)Nr   )r   r   N)r   )r   )r   )r   )r   )N)r[   r\   r]   r^   r-   rj   rU   rG   rW   r   r   r#   rX   r_   r   r   r1   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   ra   r   zTheta must be > 1)r,   r-   r   ZTransfGumbelrb   r"   rc   r1   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rt
t| | d|   }n| jt| | |}|S )Nr@   r   r   r   rd   )r   r8   rh   r+   r   Zlevy_stablerj   r   cospir   rV   r/   rC   rk   r   r   r   rj     s       
"zGumbelCopula.rvsc                    s   |  |}| |\}|jd dkrt| }|| }tj|dd}|d|  }t| }|| d }	|d| d  }
tj|dd|d  }tj|ddd }||	 |
 | | S t 	||S d S )Nr9   r   rq   r@   rg   )
r?   r8   r:   r   rV   rD   r   rQ   r,   rU   )r0   r>   r.   rn   ZxyZxy_thetaZsum_xy_thetaZsum_xy_theta_thetarr   rs   rt   rx   er1   r   r   rU     s    
zGumbelCopula.pdfc                 C   sH   |  |}| |\}tjt| | dd}t|d|   }|S )Nr9   rq   r@   )r?   r8   r   rD   rV   r   )r0   r>   r.   rn   hrG   r   r   r   rG     s
    
zGumbelCopula.cdfc                    s   t  j||dS ru   rv   rw   r1   r   r   rW     s    zGumbelCopula.logpdfc                 C   s   |d kr| j }|d | S r
   ry   rz   r   r   r   r#     s    zGumbelCopula.tauc                 C   s   dd|  S r
   r   rY   r   r   r   rX     s    zGumbelCopula.theta_from_tau)Nr   )r   r   N)r   )r   )r   )N)r[   r\   r]   r^   r-   rj   rU   rG   rW   r#   rX   r_   r   r   r1   r   r     s   


r   )r^   r   Znumpyr   Zscipyr   r   r    r   Zcopulasr   Zstatsmodels.tools.rng_qrngr   r   r    r$   r!   r*   r`   r{   r   r   r   r   r   <module>   s   	{E 