Ë
    èlÖiÉ  ã                   ó�   — d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
  G d„ d«      Z G d„ d	«      Z G d
„ d«      Z G d„ d«      Zy)zÞ
LFU cache Written by Shane Wang
https://medium.com/@epicshane/a-python-implementation-of-lfu-least-frequently-used-cache-with-o-1-time-complexity-e16b34a3c49b
https://github.com/luxigner/lfu_cache
Modified by Sep Dehpour
é    )Údefaultdict)ÚLock)Úmean)Ú	not_foundÚdict_Ú
SetOrderedc                   ó   — e Zd Zd„ Zd„ Zy)Ú	CacheNodec                 ó´   — || _         |r3t        t        «      | _        | j                  |   j	                  |«       n|| _        || _        || _        || _        y ©N)Úkeyr   r   ÚcontentÚaddÚ	freq_nodeÚpreÚnxt)Úselfr   Úreport_typeÚvaluer   r   r   s          úV/var/www/html/strategist-ai/venv_dbt/lib/python3.12/site-packages/deepdiff/lfucache.pyÚ__init__zCacheNode.__init__   sK   € ØˆŒÙÜ&¤zÓ2ˆDŒLØ�L‰L˜Ñ%×)Ñ)¨%Õ0à ˆDŒLØ"ˆŒØˆŒØˆ�ó    c                 óR  — | j                   j                  | j                   j                  k(  r#d x| j                   _        | j                   _        nÂ| j                   j                  | k(  r-d | j                  _        | j                  | j                   _        n|| j                   j                  | k(  r-d | j                  _        | j                  | j                   _        n6| j                  | j                  _        | j                  | j                  _        d | _        d | _        d | _         y r   )r   Ú
cache_headÚ
cache_tailr   r   ©r   s    r   Úfree_myselfzCacheNode.free_myself   sÃ   € Ø�>‰>×$Ñ$¨¯©×(AÑ(AÒAØDHÐHˆD�N‰NÔ%¨¯©Õ(AØ�^‰^×&Ñ&¨$Ò.ØˆD�H‰HŒLØ(,¯©ˆD�N‰NÕ%Ø�^‰^×&Ñ&¨$Ò.ØˆD�H‰HŒLØ(,¯©ˆD�N‰NÕ%àŸ8™8ˆD�H‰HŒLØŸ8™8ˆD�H‰HŒLàˆŒØˆŒØˆ�r   N)Ú__name__Ú
__module__Ú__qualname__r   r   © r   r   r
   r
      s   „ ò	ór   r
   c                   ó6   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	ÚFreqNodec                 óJ   — || _         || _        || _        d | _        d | _        y r   )Úfreqr   r   r   r   )r   r%   r   r   s       r   r   zFreqNode.__init__,   s%   € ØˆŒ	ØˆŒØˆŒØˆŒØˆ�r   c                 ój   — | j                   €| j                  €y| j                   | j                  k(  ryy)Nr   é   z2+)r   r   r   s    r   Úcount_cacheszFreqNode.count_caches3   s.   € Ø�?‰?Ð" t§¡Ð'>ØØ�_‰_ §¡Ò/Øàr   c                 ó  — | j                   �| j                  | j                   _        | j                  �| j                   | j                  _         | j                   }| j                  }d x| _         x| _        x| _        | _        ||fS r   )r   r   r   r   )r   r   r   s      r   ÚremovezFreqNode.remove;   sl   € Ø�8‰8ÐØŸ8™8ˆD�H‰HŒLØ�8‰8ÐØŸ8™8ˆD�H‰HŒLà�h‰hˆØ�h‰hˆØBFÐFˆŒÐF�4”8ÐF˜dœo°´à�SˆzÐr   c                 ó&  — | j                   €| j                  €y | j                   | j                  k(  r| j                   }d x| _         | _        |S | j                   }d | j                   j                  _        | j                   j                  | _         |S r   )r   r   r   r   )r   r   s     r   Úpop_head_cachezFreqNode.pop_head_cacheG   sw   € Ø�?‰?Ð" t§¡Ð'>ØØ�_‰_ §¡Ò/ØŸ™ˆJØ04Ð4ˆDŒO˜dœoØÐàŸ™ˆJØ&*ˆD�O‰O×ÑÔ#Ø"Ÿo™o×1Ñ1ˆDŒOØÐr   c                 óÀ   — | |_         | j                  €| j                  €|x| _        | _        y | j                  |_        d |_        || j                  _        || _        y r   )r   r   r   r   r   )r   Ú
cache_nodes     r   Úappend_cache_to_tailzFreqNode.append_cache_to_tailT   sP   € Ø#ˆ
Ôà�?‰?Ð" t§¡Ð'>Ø0:Ð:ˆDŒO˜d�oà!Ÿ_™_ˆJŒNØ!ˆJŒNØ",ˆD�O‰OÔØ(ˆD�Or   c                 ó|   — | |_         | j                  |_        | j                  �|| j                  _         || _        y r   ©r   r   ©r   r   s     r   Úinsert_after_mezFreqNode.insert_after_me_   s0   € Øˆ	ŒØŸ™ˆ	Œà�8‰8ÐØ$ˆD�H‰HŒLàˆ�r   c                 ó|   — | j                   �|| j                   _        | j                   |_         | |_        || _         y r   r1   r2   s     r   Úinsert_before_mezFreqNode.insert_before_meh   s0   € Ø�8‰8ÐØ$ˆD�H‰HŒLàŸ™ˆ	ŒØˆ	ŒØˆ�r   N)
r   r   r    r   r(   r*   r,   r/   r3   r5   r!   r   r   r#   r#   +   s%   „ òòò
òò	)òór   r#   c                   óD   — e Zd Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zy)ÚLFUCachec                 ó|   — t        «       | _        |dk  rt        d«      ‚|| _        d | _        t        «       | _        y )Nr   z*Capacity of LFUCache needs to be positive.)r   ÚcacheÚ
ValueErrorÚcapacityÚfreq_link_headr   Úlock)r   r;   s     r   r   zLFUCache.__init__s   s6   € Ü“WˆŒ
Ø�qŠ=ÜÐIÓJÐJØ ˆŒØ"ˆÔÜ“Fˆ�	r   c                 óö   — | j                   5  || j                  v rD| j                  |   }|j                  }|j                  }| j	                  ||«       |cd d d «       S t
        cd d d «       S # 1 sw Y   y xY wr   )r=   r9   r   r   Úmove_forwardr   )r   r   r.   r   r   s        r   ÚgetzLFUCache.get{   so   € Ø�Y‰Yñ 
	!Ø�d—j‘jÑ Ø!ŸZ™Z¨™_�
Ø&×0Ñ0�	Ø$×,Ñ,�à×!Ñ! *¨iÔ8à÷
	!ñ 
	!ô !÷
	!÷ 
	!ò 
	!ús   �A	A/Á A/Á/A8Nc                 ó\  — | j                   5  || j                  v r8| j                  |   }|r|j                  |   j                  |«       nM||_        nEt	        | j                  «      | j
                  k\  r| j                  «        | j                  |||«       d d d «       y # 1 sw Y   y xY wr   )r=   r9   r   r   Úlenr;   Ú
dump_cacheÚcreate_cache_node)r   r   r   r   r.   s        r   ÚsetzLFUCache.setˆ   s�   € Ø�Y‰Yñ 	@Ø�d—j‘jÑ Ø!ŸZ™Z¨™_�
ÙØ×&Ñ& {Ñ3×7Ñ7¸Õ>à).�JÕ&ä�t—z‘z“? d§m¡mÒ3Ø—O‘OÔ%à×&Ñ& s¨K¸Ô?÷	@÷ 	@ñ 	@ús   �BB"Â"B+c                 ó   — || j                   v S r   )r9   ©r   r   s     r   Ú__contains__zLFUCache.__contains__–   s   € Ø�d—j‘jÐ Ð r   c                 óš  — |j                   �&|j                   j                  |j                  dz   k7  rt        |j                  dz   d d «      }d}n|j                   }d}|j                  «        |j	                  |«       |r|j                  |«       |j                  «       dk(  r'| j                  |k(  r|| _        |j                  «        y y )Nr'   TFr   )	r   r%   r#   r   r/   r3   r(   r<   r*   )r   r.   r   Útarget_freq_nodeÚtarget_emptys        r   r?   zLFUCache.move_forward™   s¶   € Ø�=‰=Ð  I§M¡M×$6Ñ$6¸)¿.¹.È1Ñ:LÒ$LÜ'¨	¯©¸Ñ(:¸DÀ$ÓGÐØ‰Là(Ÿ}™}ÐØ ˆLà×ÑÔ Ø×-Ñ-¨jÔ9áØ×%Ñ%Ð&6Ô7à×!Ñ!Ó# qÒ(Ø×"Ñ" iÒ/Ø&6�Ô#à×ÑÕð	 )r   c                 ó  — | j                   }| j                  j                  |j                  j                  «       |j                  «        |j                  «       dk(  r"|j                  | _         |j                  «        y y )Nr   )	r<   r9   Úpopr   r   r,   r(   r   r*   )r   Úhead_freq_nodes     r   rC   zLFUCache.dump_cache­   se   € Ø×,Ñ,ˆØ�
‰
�‰�~×0Ñ0×4Ñ4Ô5Ø×%Ñ%Ô'à×&Ñ&Ó(¨AÒ-Ø"0×"4Ñ"4ˆDÔØ×!Ñ!Õ#ð .r   c                 ó^  — t        |||d d d ¬«      }|| j                  |<   | j                  �| j                  j                  dk7  rMt	        dd d «      }|j                  |«       | j                  �| j                  j                  |«       || _        y | j                  j                  |«       y )N)r   r   r   r   r   r   r   )r
   r9   r<   r%   r#   r/   r5   )r   r   r   r   r.   Únew_freq_nodes         r   rD   zLFUCache.create_cache_node¶   s    € ÜØ Ø 4¨T°tô=ˆ
ð %ˆ�
‰
�3‰à×ÑÐ&¨$×*=Ñ*=×*BÑ*BÀaÒ*GÜ$ Q¨¨dÓ3ˆMØ×.Ñ.¨zÔ:à×"Ñ"Ð.Ø×#Ñ#×4Ñ4°]ÔCà"/ˆDÕà×Ñ×4Ñ4°ZÕ@r   c                 ó¼   — | j                   j                  «       D ��cg c]  \  }}||j                  j                  f‘Œ }}}|j	                  d„ ¬«       |S c c}}w )Nc                 ó   — | d    S )Nr'   r!   )Úxs    r   ú<lambda>z0LFUCache.get_sorted_cache_keys.<locals>.<lambda>É   s   €  1 Q¡4 %€ r   )r   )r9   Úitemsr   r%   Úsort)r   Úir%   Úresults       r   Úget_sorted_cache_keyszLFUCache.get_sorted_cache_keysÇ   sN   € Ø:>¿*¹*×:JÑ:JÓ:L×M©w¨q°$�1�d—n‘n×)Ñ)Ò*ÐMˆÑMØ�‰™ˆÔ(Øˆùó Ns   ž"Ac                 óV   — t        d„ | j                  j                  «       D «       «      S )Nc              3   óH   K  — | ]  }|j                   j                  –— Œ y ­wr   )r   r%   )Ú.0r%   s     r   ú	<genexpr>z1LFUCache.get_average_frequency.<locals>.<genexpr>Í   s   è ø€ ÒH¨D�D—N‘N×'Õ'ÑHùs   ‚ ")r   r9   Úvaluesr   s    r   Úget_average_frequencyzLFUCache.get_average_frequencyÌ   s    € ÜÑH°D·J±J×4EÑ4EÓ4GÔHÓHÐHr   )NN)r   r   r    r   r@   rE   rH   r?   rC   rD   rY   r_   r!   r   r   r7   r7   q   s2   „ òò!ó@ò!òò($òAò"ó
Ir   r7   c                   ó    — e Zd Zd„ ZeZeZd„ Zy)ÚDummyLFUc                  ó   — y r   r!   )r   ÚargsÚkwargss      r   r   zDummyLFU.__init__Ò   s   € Ør   c                  ó   — y)NFr!   rG   s     r   rH   zDummyLFU.__contains__Ø   s   € Ør   N)r   r   r    r   rE   r@   rH   r!   r   r   ra   ra   Ð   s   „ òð €CØ
€Cór   ra   N)Ú__doc__Úcollectionsr   Ú	threadingr   Ú
statisticsr   Údeepdiff.helperr   r   r   r
   r#   r7   ra   r!   r   r   ú<module>rk      sK   ðñõ $Ý Ý ß 8Ñ 8÷ñ ÷<Cñ C÷L\Iñ \I÷~	ò 	r   