
    .`iP%                     n    d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
 d dlmZmZ  G d de	          ZdS )	    )OrderedDict)Iterable)	BlockHash)LoadStoreSpecOffloadingEventOffloadingManagerPrepareStoreOutput)BackendBlockStatusc                       e Zd ZdZddedefdZdee         de	dz  fd	Z
dee         defd
Zdee         fdZdee         fdZdee         dedz  fdZddee         defdZdee         fdZdS )ARCOffloadingManageru  
    An OffloadingManager implementing the ARC (Adaptive Replacement Cache)
    eviction policy with a pluggable backend.

    Data Structures:
        T1: Recent cache containing blocks accessed once.
        T2: Frequent cache containing blocks accessed multiple times.
        B1/B2: Ghost lists tracking recently evicted blocks from T1/T2.
        target_t1_size: Adaptive target size for the T1 partition.

    Algorithm Flow:
        1. Cache lookup (lookup):
           Searches T1 and T2 for block hashes and counts consecutive hits
           until a miss or non-ready block is encountered.

        2. Cache touch (touch) - Adaptive Learning:
           For each block_hash (in reverse order):
           - If in T1: Move to T2 (promotion from recent to frequent).
           - If in T2: Move to MRU position (end of queue).
           - If in B1 ghost list: Increase target_t1_size.
           - If in B2 ghost list: Decrease target_t1_size.

        3. Block eviction (prepare_store) - Adaptive Replacement:
           Determines eviction source based on adaptive target:
           - If T1 size > target_t1_size: Evict from T1, add to B1.
           - Otherwise: Evict from T2, add to B2.
           Finally, bound each ghost list size.

        4. Block insertion (prepare_store):
           New blocks are always inserted into T1 and removed from B1/B2 if
           present. Blocks may later be promoted to T2 during touch operations.

    Adaptive Behavior:
        The algorithm self-tunes the recency vs. frequency trade-off:
        - B1 hit: Recent access patterns matter more → increase T1.
        - B2 hit: Frequent access patterns matter more → decrease T1.
    Fbackendenable_eventsc                    || _         d| _        t                      | _        t                      | _        t                      | _        t                      | _        |rg nd | _        | j                                         | _	        d S )Ng        )
r   target_t1_sizer   t1t2b1b2eventsget_num_free_blockscache_capacity)selfr   r   s      r/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/v1/kv_offload/arc_manager.py__init__zARCOffloadingManager.__init__7   si     '%(7B}}7B}}0;0;:G4QBBT#'<#C#C#E#E    block_hashesreturnNc                     d}|D ]F}| j                             |          p| j                            |          }||j        s n|dz  }G|S )Nr      )r   getr   is_ready)r   r   	hit_count
block_hashblocks        r   lookupzARCOffloadingManager.lookupB   s]    	& 	 	JGKK
++Ftw{{:/F/FE}EN}NIIr   c                 B   g }|D ]}| j                             |          p| j                            |          }|J d|d            |j        sJ d|d            |xj        dz  c_        |                    |           | j                            ||          S )NBlock z not found in cachez is not ready for readingr    )r   r!   r   r"   ref_cntappendr   get_load_store_spec)r   r   blocksr$   r%   s        r   prepare_loadz!ARCOffloadingManager.prepare_loadK   s    & 	! 	!JGKK
++Ftw{{:/F/FE$$&Pz&P&P&P$$$>SS#SJ#S#S#SSS>MMQMMMM%    |//fEEEr   c                    t          t          |                    D ]k}|| j        v rG| j                            |          }|j        s| j                            |           H|| j        |<   S|| j        v r| j                            |           w|| j        v rtt          dt          | j
                  t          | j                  z            }t          | j        |z   | j                  | _        | j                            |           || j
        v rnt          dt          | j                  t          | j
                  z            }t          | j        |z
  d          | _        | j
                            |           md S )Nr    r   )reversedlistr   popr"   move_to_endr   r   maxlenr   minr   r   )r   r   r$   r%   deltas        r   touchzARCOffloadingManager.touchW   ss   "4#5#566 	0 	0JTW$$J//~ 0G''
3333*/DGJ''tw&&##J////tw&&As47||c$'ll:;;&)'%/1D' '# ##J////tw&&As47||c$'ll:;;&)$*=*Eq&I&I###J///1	0 	0r   c                     |D ]o}| j                             |          p| j                            |          }|J d|d            |j        dk    sJ d|d            |xj        dz  c_        pd S )Nr(   z
 not foundr   z ref_cnt is already 0r    )r   r!   r   r)   )r   r   r$   r%   s       r   complete_loadz"ARCOffloadingManager.complete_loadr   s    & 	 	JGKK
++Ftw{{:/F/FE$$&Gz&G&G&G$$$=1$$$&Rz&R&R&R$$$MMQMMM	 	r   c                    g }|D ])}|| j         vr|| j        vr|                    |           *|s+t          g | j                            g g           g           S t          |          | j                                        z
  }g }|dk    rd }t          | j                   t          | j	                  k    r>| j         
                                D ]$\  }}|j        dk    r||f}| j         }| j        }	 n%|s@| j        
                                D ]$\  }}|j        dk    r||f}| j        }| j        }	 n%d S |\  }}||= d |	|<   |                    |           | j                            |           |dz  }|dk    | j        | j        fD ]?}
t          t          |
          | j        z
            D ]}|
                    d           @|rF| j        ?| j                            t'          || j        j        | j        j        d                     | j                            |          }t          |          t          |          k    s
J d            t/          ||          D ]E\  }}|| j         |<   | j                            |d            | j                            |d            F| j                            ||          }t          |||          S )	N)block_hashes_to_store
store_specblock_hashes_evictedr   r    F)lastTr   
block_sizemediumremovedz6Backend did not allocate the expected number of blocks)r   r   r*   r	   r   r+   r4   r   intr   itemsr)   r   r   freeranger   popitemr   r   r@   rA   allocate_blockszipr1   )r   r   r;   r$   num_blocks_to_evictto_evictblock_to_evictr%   
eviction_t
eviction_bbir,   r<   s                 r   prepare_storez"ARCOffloadingManager.prepare_storez   sh    !#& 	9 	9J((Ztw-F-F%,,Z888$ 	%&(<;;BCC%'    %&&)I)I)K)KK 	 !A%%!N47||s4#67777)-  %J}))*4e)<%)W
%)W
	 *
 " 
 )-    %J}))*4e)<%)W
%)W
	 *  4 .J:&%)Jz"OOJ'''Le$$$1$7 "A%%: '47# 	& 	&A3q66D$7788 & &		u	%%%%&  	/K!)#|6<. 	     --.CDD6{{c"788888D 988 "%%:F!C!C 	* 	*J"'DGJGKK
D)))GKK
D))))\556KVTT
!"7!!)
 
 
 	
r   Tsuccessc                 $   g }|r_|D ][}| j                             |          p| j                            |          }|#|j        sd|_        |                    |           \n`|D ]]}| j                             |d           }|| j                            |d           }|!|j        s| j                            |           ^|rH| j	        C| j	                            t          || j        j        | j        j        d                     d S d S d S )Nr   Fr?   )r   r!   r   r"   r)   r*   r1   r   rE   r   r   r@   rA   )r   r   rR   stored_block_hashesr$   r%   s         r   complete_storez#ARCOffloadingManager.complete_store   sB   /1 	-* ; ;
J//J47;;z3J3J$U^$$%EM'..z:::; + - -
J55= GKK
D99E$U^$L%%e,,, 	4;#:K!4#|6<.!	      	 	#:#:r   c              #   h   K   | j         (| j         E d {V  | j                                          d S d S )N)r   clear)r   s    r   take_eventsz ARCOffloadingManager.take_events   sJ      ;"{"""""""K #"r   )F)T)__name__
__module____qualname____doc__r
   boolr   r   r   rC   r&   r   r-   r7   r9   r	   rQ   rU   r   rX    r   r   r   r      sf       $ $L	F 	F 	F 	F 	F 	F 	F8I#6 3:    
F))< 
F 
F 
F 
F 
F0(9"5 0 0 0 06(9*=    P
$Y/P
	d	"P
 P
 P
 P
d 8I+>     < Xo6            r   r   N)collectionsr   collections.abcr   vllm.v1.core.kv_cache_utilsr   vllm.v1.kv_offload.abstractr   r   r   r	   vllm.v1.kv_offload.backendr
   r   r   r^   r   r   <module>rd      s    $ # # # # # $ $ $ $ $ $ 1 1 1 1 1 1            < ; ; ; ; ; ; ;]  ]  ]  ]  ] , ]  ]  ]  ]  ] r   