o
    -i,                     @   s   d dl Z d dlZd dlZd dlZd dlmZmZ d dlZd dl	Z	d dl
mZ d dlmZ d dlmZ ddlmZ eeZe jddd	ed
eg df fddZG dd dZdS )    N)CallableIterable)Image)init_logger   )MediaWithBytes   )maxsize	algorithmreturnzhashlib._Hashc                 C   sJ   |   } | dkrddlm} |S | dkrtjS | dkrtjS td|  )aP  
    Get the hasher factory based on the configured algorithm.

    Args:
        algorithm: Hash algorithm name (blake3, sha256, or sha512)

    Returns a callable that creates a new hasher instance.
    Supports blake3 (default), sha256, and sha512 for FIPS compliance.

    See: https://github.com/vllm-project/vllm/issues/18334
    blake3r   )r   sha256sha512zUnsupported hash algorithm: )lowerr   hashlibr   r   
ValueError)r
   r    r   S/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/vllm/multimodal/hasher.py_get_hasher_factory   s   r   c                	   @   sb   e Zd ZededeeeB  fddZede	dedeeeB  fddZ
edede	fd	d
ZdS )MultiModalHasherobjr   c           	      C   s  t |ttfr
|fS t |tr|dfS t |ttfr$t|	 fS t |t
j
rn| }t
jjj|v rIt |t
jjj tjrI|t
jjj jfS |jt|d}|j}|d urh|j|d< |jd urh|j|d< | d|S t |trt |jt
j
r|j }t
jjj|v rt |t
jjj tjr|t
jjj jfS | d|jS t |tjr| }|j}|j}|tjkr| }| |! f tj"}| dt|t#||$ dS | d|$ S t |tj%r|j&j'r| tj"j(n|	 }| d|jj|j|d	S t)*d
t+| t,-|fS )Nutf-8)modedatapalettepalette_rawmodeimagetensor)original_dtypeoriginal_shaper   ndarray)dtypeshaper   z=No serialization method found for %s. Falling back to pickle.).
isinstancebytes
memoryviewstrencodeintfloatnparraytobytesr   getexifExifTagsBaseImageIDuuidUUIDr   asarrayr   rawmodeiter_item_to_bytesr   mediaoriginal_bytestorchTensorcpur!   r"   bfloat16
contiguousviewnumeluint8tuplenumpyr    flagsc_contiguousr   loggerwarningtypepickledumps)	clsr   exifr   r   
tensor_objtensor_dtypetensor_shapearr_datar   r   r   serialize_item3   sn   





zMultiModalHasher.serialize_itemkeyc                 c   s    |d u r| dV  d S t|ttfr-t|D ]\}}| | d| |E d H  qd S t|trK| D ]\}}| | d| |E d H  q6d S | dV  | |E d H  d S )Nr   .)	r'   r#   listr@   	enumerater5   dictitemsrO   )rI   rP   r   ielemkvr   r   r   r5   }   s   
z#MultiModalHasher.iter_item_to_byteskwargsc                 K   sF   t tj}| }| D ]\}}| ||D ]}|| qq| S )N)r   envsVLLM_MM_HASHER_ALGORITHMrU   r5   update	hexdigest)rI   rZ   hasher_factoryhasherrX   rY   bytes_r   r   r   hash_kwargs   s   
zMultiModalHasher.hash_kwargsN)__name__
__module____qualname__classmethodobjectr   r$   r%   rO   r&   r5   rb   r   r   r   r   r   2   s    I
r   )	functoolsr   rG   r1   collections.abcr   r   rA   r*   r8   PILr   	vllm.envsr[   vllm.loggerr   r6   r   rc   rD   	lru_cacher&   r   r   r   r   r   r   <module>   s   
