o
    oÇh.  ã                   @   s    d dl mZ dd„ Zdd„ ZdS )é    ©Úwrapsc                    s   | ‰ ‡ fdd„}|S )aÅ  
    Memo decorator for sequences defined by recurrence

    Examples
    ========

    >>> from sympy.utilities.memoization import recurrence_memo
    >>> @recurrence_memo([1]) # 0! = 1
    ... def factorial(n, prev):
    ...     return n * prev[-1]
    >>> factorial(4)
    24
    >>> factorial(3) # use cache values
    6
    >>> factorial.cache_length() # cache length can be obtained
    5
    >>> factorial.fetch_item(slice(2, 4))
    [2, 6]

    c                    s6   t ˆ ƒ‡‡ fdd„ƒ}‡fdd„|_‡fdd„|_|S )Nc                    sD   t ˆ ƒ}| |k rˆ |  S t|| d ƒD ]
}ˆ  ˆ|ˆ ƒ¡ qˆ d S )Né   éÿÿÿÿ©ÚlenÚrangeÚappend)ÚnÚLÚi)ÚcacheÚf© úo/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/utilities/memoization.pyÚg   s   z-recurrence_memo.<locals>.decorator.<locals>.gc                      s   t ˆ ƒS ©N)r   r   ©r   r   r   Ú<lambda>$   ó    z4recurrence_memo.<locals>.decorator.<locals>.<lambda>c                    s   ˆ |  S r   r   )Úxr   r   r   r   %   r   )r   Úcache_lengthÚ
fetch_item©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 t|| d ƒD ]#}ˆ |ƒ}|g}ˆ |¡ td|d ƒD ]}ˆ||ˆƒ}| |¡ q*qˆ|  | S )Nr   r   )r
   Úmr   r   ÚF_i0Ú	F_i_cacheÚjÚF_ij)Úbase_seqr   r   r   r   r   7   s   
þz3assoc_recurrence_memo.<locals>.decorator.<locals>.gr   r   ©r#   r   r   r   r   6   s   z(assoc_recurrence_memo.<locals>.decoratorr   )r#   r   r   r$   r   Úassoc_recurrence_memo*   s   
r%   N)Ú	functoolsr   r   r%   r   r   r   r   Ú<module>   s    &