
    :Qg                         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          N/var/www/html/answerous/venv/lib/python3.12/site-packages/deepdiff/lfucache.py__init__zCacheNode.__init__   sK    &z2DLLL%))%0 DL"    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ADHHDNN%(A^^&&$.DHHL(,DNN%^^&&$.DHHL(,DNN%88DHHL88DHHL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    8888DHHL8888DHHLhhhhBFFF48FdoSz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'>__/J044DOdoJ&*DOO#"oo11DO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::DOdo!__JN!JN",DOO(DOr   c                 |    | |_         | j                  |_        | j                  || j                  _         || _        y r   r   r   r   r   s     r   insert_after_mezFreqNode.insert_after_me_   s0    		88$DHHLr   c                 |    | j                   || j                   _        | j                   |_         | |_        || _         y r   r1   r2   s     r   insert_before_mezFreqNode.insert_before_meh   s0    88$DHHL		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    YY 
	!djj !ZZ_
&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    YY 	@djj !ZZ_
&&{377>).J&tzz?dmm3OO%&&sK?	@ 	@ 	@s   BB""B+c                     || j                   v S r   )r9   r   r   s     r   __contains__zLFUCache.__contains__   s    djj  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    == IMM$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"4D!!# .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    4Tt=
 %

3&$*=*=*B*Ba*G$Qd3M..z:"".##44]C"/D44Z@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    1Q4% r   )r   )r9   itemsr   r%   sort)r   ir%   results       r   get_sorted_cache_keyszLFUCache.get_sorted_cache_keys   sN    :>**:J:J:LMwq$1dnn))*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     HDDNN''Hs    ")r   r9   valuesr   s    r   get_average_frequencyzLFUCache.get_average_frequency   s     HDJJ4E4E4G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   