o
    
۾iP%                     @   s`   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 de	ZdS )	    )OrderedDict)Iterable)	BlockHash)LoadStoreSpecOffloadingEventOffloadingManagerPrepareStoreOutput)BackendBlockStatusc                   @   s   e Zd ZdZddedefddZdee de	d	B fd
dZ
dee defddZdee fddZdee fddZdee ded	B fddZddee defddZdee fd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                 C   sJ   || _ 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    r   R/home/ubuntu/.local/lib/python3.10/site-packages/vllm/v1/kv_offload/arc_manager.py__init__7   s   zARCOffloadingManager.__init__block_hashesreturnNc                 C   sF   d}|D ]}| j |p| j|}|d u s|js |S |d7 }q|S )Nr      )r   getr   is_ready)r   r   	hit_count
block_hashblockr   r   r   lookupB   s   
zARCOffloadingManager.lookupc                 C   sz   g }|D ]1}| j |p| j|}|d usJ d|d|js)J d|d| jd7  _|| q| 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!   r   r   r   prepare_loadK   s   z!ARCOffloadingManager.prepare_loadc                 C   s   t t|D ]m}|| jv r#| j|}|js| j| q|| j|< q|| jv r/| j| q|| jv rRtdt	| j
t	| j }t| j| | j| _| j| q|| j
v rstdt	| jt	| j
 }t| j| d| _| j
| qd S )Nr   r   )reversedlistr   popr   move_to_endr   r   maxlenr   minr   r   )r   r   r    r!   deltar   r   r   touchW   s(   



zARCOffloadingManager.touchc                 C   sf   |D ].}| j |p| j|}|d usJ d|d|jdks)J d|d| jd8  _qd S )Nr#   z
 not foundr   z ref_cnt is already 0r   )r   r   r   r$   )r   r   r    r!   r   r   r   complete_loadr   s   z"ARCOffloadingManager.complete_loadc                 C   s  g }|D ]}|| j vr|| jvr|| q|s$tg | jg g g dS t|| j  }g }|dkrd }t| j t| j	krZ| j 
 D ]\}}|jdkrY||f}| j }| j}	 nqD|sy| j
 D ]\}}|jdkrv||f}| j}| j}	 nqad S |\}}||= d |	|< || | j| |d8 }|dks3| j| jfD ]}
tt|
| j D ]}|
jdd qq|r| jd ur| jt|| jj| jjdd | j|}t|t|ksJ dt||D ]\}}|| j |< | j|d  | j|d  q| j||}t|||d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&   r.   r   intr   itemsr$   r   r   freeranger   popitemr   r   r8   r9   allocate_blockszipr+   )r   r   r3   r    num_blocks_to_evictto_evictblock_to_evictr!   
eviction_t
eviction_bbir'   r4   r   r   r   prepare_storez   s   



	
z"ARCOffloadingManager.prepare_storeTsuccessc                 C   s   g }|r%|D ]}| j |p| j|}|d ur#|js#d|_|| qn$|D ]!}| j |d }|d u r;| j|d }|d urH|jsH| j| q'|rb| j	d urd| j	t
|| jj| jjdd d S d S d S )Nr   Fr7   )r   r   r   r   r$   r%   r+   r   r=   r   r   r8   r9   )r   r   rJ   stored_block_hashesr    r!   r   r   r   complete_store   s4   
z#ARCOffloadingManager.complete_storec                 c   s*    | j d ur| j E d H  | j   d S d S )N)r   clear)r   r   r   r   take_events   s
   
z ARCOffloadingManager.take_events)F)T)__name__
__module____qualname____doc__r	   boolr   r   r   r;   r"   r   r(   r1   r2   r   rI   rL   r   rN   r   r   r   r   r      s    &	
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   r   <module>   s   