B
    e‹d•  ã               @   s    d dl mZ dd„ Zdd„ ZdS )é    )Úwrapsc                s   | ‰ ‡ fdd„}|S )z}
    Memo decorator for sequences defined by recurrence

    See usage examples e.g. in the specfun/combinatorial module
    c                s   t ˆ ƒ‡‡ fdd„ƒ}|S )Nc                sL   t ˆ ƒ}| |d krˆ |  S x&t|| d ƒD ]}ˆ  ˆ|ˆ ƒ¡ q,W ˆ d S )Né   éÿÿÿÿ)ÚlenÚrangeÚappend)ÚnÚLÚi)ÚcacheÚf© úh/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sympy/utilities/memoization.pyÚg   s    z-recurrence_memo.<locals>.decorator.<locals>.g)r   )r   r   )r   )r   r   Ú	decorator   s    z"recurrence_memo.<locals>.decoratorr   )Úinitialr   r   )r   r   Úrecurrence_memo   s    
r   c                s   g ‰‡ ‡fdd„}|S )zé
    Memo decorator for associated sequences defined by recurrence starting from base

    base_seq(n) -- callable to get base sequence elements

    XXX works only for Pn0 = base_seq(0) cases
    XXX works only for m <= n cases
    c                s   t ˆ ƒ‡‡‡ fdd„ƒ}|S )Nc                s†   t ˆƒ}| |k rˆ|  | S x\t|| d ƒD ]J}ˆ |ƒ}|g}ˆ |¡ x,td|d ƒD ]}ˆ||ˆƒ}| |¡ qXW q,W ˆ|  | S )Nr   )r   r   r   )r   Úmr	   r
   ZF_i0Z	F_i_cacheÚjZF_ij)Úbase_seqr   r   r   r   r   &   s    
z3assoc_recurrence_memo.<locals>.decorator.<locals>.g)r   )r   r   )r   r   )r   r   r   %   s    z(assoc_recurrence_memo.<locals>.decoratorr   )r   r   r   )r   r   r   Úassoc_recurrence_memo   s    
r   N)Ú	functoolsr   r   r   r   r   r   r   Ú<module>   s   