U
    md8                     @   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   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 )Nr   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rt
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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 )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 