U
    Kvfr	  ã                   @   s\   d Z ddlZddlmZ G dd„ dƒZeƒ ZG dd„ dƒZeƒ Zdd	„ Z	d
d„ Z
dd„ ZdS )zQ

Special functions for copulas not available in scipy

Created on Jan. 27, 2023
é    N)Ú	factorialc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú	Sterling1z'Stirling numbers of the first kind
    c                 C   s
   i | _ d S ©N©Ú_cache©Úself© r	   úM/tmp/pip-unpacked-wheel-2v6byqio/statsmodels/distributions/copula/_special.pyÚ__init__   s    zSterling1.__init__c                 C   sž   t |ƒd t |ƒ }|| j ¡ kr,| j| S ||  kr@dkrHn ndS |dkr\|dkr\dS ||krhdS t|d |d ƒ|d t|d |ƒ  }|| j|< |S ©Nú,r   é   )Ústrr   ÚkeysÚ	sterling1©r   ÚnÚkÚkeyÚresultr	   r	   r
   Ú__call__   s    
(
zSterling1.__call__c                 C   s
   i | _ dS ©z(clear cache of Sterling numbers
        Nr   r   r	   r	   r
   Úclear_cache$   s    zSterling1.clear_cacheN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__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S )	Ú	Sterling2z(Stirling numbers of the second kind
    c                 C   s
   i | _ d S r   r   r   r	   r	   r
   r   3   s    zSterling2.__init__c                 C   s¶   t |ƒd t |ƒ }|| j ¡ kr,| j| S ||  kr@dkrHn ndS |dkrX|dksh|dkrl|dkrldS ||krxdS ||kr„dS |t|d |ƒ t|d |d ƒ }|| j|< |S r   )r   r   r   Ú	sterling2r   r	   r	   r
   r   6   s    
 $
zSterling2.__call__c                 C   s
   i | _ dS r   r   r   r	   r	   r
   r   G   s    zSterling2.clear_cacheNr   r	   r	   r	   r
   r   -   s   r   c                 C   s$   | dd|   | d   d|  d  S )z?Polylogarithm for negative integer order -3

    Li(-3, z)
    r   é   é   r	   ©Úzr	   r	   r
   Úli3P   s    r%   c                 C   s,   | d|   dd|   | d   d|  d  S )z?Polylogarithm for negative integer order -4

    Li(-4, z)
    r   é
   r"   é   r	   r#   r	   r	   r
   Úli4X   s    r(   c                    s|   t  |¡dkrt  |¡d }t  ˆ d ¡}t  ‡ fdd„|D ƒ¡}dˆ d  t jt|ƒ| dd|  |d   dd }|S )z‚Polylogarithm for negative integer order -n

    Li(-n, z)

    https://en.wikipedia.org/wiki/Polylogarithm#Particular_values
    r   ).Nc                    s   g | ]}t ˆ d  |d  ƒ‘qS )r   )r    )Ú.0Zki©r   r	   r
   Ú
<listcomp>k   s     zlin.<locals>.<listcomp>éÿÿÿÿ)Zaxis)ÚnpÚsizeÚarrayZarangeÚsumr   )r   r$   r   Zst2Úresr	   r*   r
   Úlin`   s    ,ÿr2   )r   Znumpyr-   Zscipy.specialr   r   r   r   r    r%   r(   r2   r	   r	   r	   r
   Ú<module>   s    