o
    հi9                     @  s  d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZmZ d dlZd dlmZ ddlmZ edkrMd dlmZ ejd eeejj d d	lmZmZmZmZm Z m!Z!m"Z" e#eZ$d
egZ%G dd de
Z&G dd de
Z'G dd dZ(dS )    )annotationsN)OrderedDict)AnyLiteral
NamedTupleTypeVarUnion   )quant_shape_to_byte_shape__main__)Path)GGML_QUANT_SIZESGGUF_DEFAULT_ALIGNMENT
GGUF_MAGICGGUF_VERSIONGGMLQuantizationTypeGGUFValueType
GGUFEndian   c                   @  sV   e Zd ZU ded< ded< g Zded< dgZded	< g Zd
ed< edfdddZdS )ReaderFieldintoffsetstrnamezlist[npt.NDArray[Any]]partsz	list[int]datazlist[GGUFValueType]typesNindex_or_sliceint | slicereturnr   c                   s    j rhdd  j d }|tjkrS j d }|tjkr6 j| }t|tr, j| S  fdd|D S t|trG j j|   d S  fdd j| D S |tjkr_ jd S  jd  d S d S )Nc                 S  s   t |  ddS )Nutf-8encoding)r   tobytes)x r&   D/home/ubuntu/.local/lib/python3.10/site-packages/gguf/gguf_reader.py<lambda>;   s    z&ReaderField.contents.<locals>.<lambda>r   r   c                   s   g | ]	} j | qS r&   )r   .0idxself	to_stringr&   r'   
<listcomp>G   s    z(ReaderField.contents.<locals>.<listcomp>c                   s$   g | ]} j |  D ]}|qqS r&   )r   tolist)r*   r+   pv)r-   r&   r'   r/   Z   s   $ )	r   r   ARRAYSTRINGr   
isinstancer   r   r0   )r-   r   	main_typesub_typeindicesr&   r,   r'   contents9   s"   







zReaderField.contents)r   r   r    r   )	__name__
__module____qualname____annotations__r   r   r   slicer8   r&   r&   r&   r'   r   '   s   
 r   c                   @  sN   e Zd ZU ded< ded< ded< ded< ded	< ded
< ded< ded< dS )ReaderTensorr   r   r   tensor_typeznpt.NDArray[np.uint32]shaper   
n_elementsn_bytesdata_offsetnpt.NDArray[Any]r   r   fieldN)r9   r:   r;   r<   r&   r&   r&   r'   r>   d   s   
 r>   c                   @  s  e Zd ZU dZded< eZded< ded< eje	j
eje	jeje	jeje	jeje	jeje	jeje	jeje	jeje	jeje	jeje	jiZded< dDdEddZ e!de"j#dZ$dFddZ%dGddZ&	dHdId%d&Z'dJdKd,d-Z(dLd/d0Z)dMd4d5Z*dNd6d7Z+dOd9d:Z,dPd<d=Z-dQdBdCZ.dS )R
GGUFReaderIzLiteral['I', 'S']
byte_orderr   	alignmentrC   z%dict[GGUFValueType, type[np.generic]]gguf_scalar_to_nprpathos.PathLike[str] | strmodeLiteral['r', 'r+', 'c']c              	   C  s  t j||d| _d}| j|t jddd tkrtd|d7 }| |t j}|d d@ dkr;d| _||j	
| j}|d }|tvrKtd	| d
tjdkrWtj}tj}ntj}tj}| jdkrd|n|| _t | _g | _|| t|d|gdgtjg7 }| |t jd}|| t|d|d d gdgtjg7 }|| t|d|dd  gdgtjg7 }|\}	}
| ||
}| ||	\}}| jd}|d ur|jtjgkrtd|jd d | _ || j  }|dkr|| j | 7 }|| _!| "|| d S )N)rN   r   <)override_orderzGGUF magic invalid   i  Sz"Sorry, file appears to be version z which we cannot handlelittlezGGUF.versionr   zGGUF.tensor_countr	   zGGUF.kv_countzgeneral.alignmentz$Bad type for general.alignment fieldr   )#npmemmapr   _getuint32r   
ValueErrorrH   viewdtypenewbyteorderREADER_SUPPORTED_VERSIONSsys	byteorderr   LITTLEBIG	endianessr   fieldstensors_push_fieldr   r   UINT32uint64UINT64_build_fields_build_tensor_infogetr   r   rI   rC   _build_tensors)r-   rL   rN   offstemp_versionversionhost_endianswapped_endiantemp_countstensor_countkv_counttensors_fields	new_alignpaddingr&   r&   r'   __init__   sJ   
"**
zGGUFReader.__init___DT)boundkeyr   r    Union[ReaderField, None]c                 C  s   | j |d S N)rc   rk   )r-   r{   r&   r&   r'   	get_field   s   zGGUFReader.get_fieldr+   r>   c                 C  s
   | j | S r}   )rd   )r-   r+   r&   r&   r'   
get_tensor   s   
zGGUFReader.get_tensorr	   Nr   r[   npt.DTypeLikecountrQ   None | Literal['I', 'S', '<']rD   c                 C  sj   t |}t tjg |dj}|||  }| j|| j|dd | }||j|d u r1| jS |S )N)r[   )	r   rU   emptyitemsizer   rZ   r[   r\   rH   )r-   r   r[   r   rQ   r   end_offsarrr&   r&   r'   rW      s
   $zGGUFReader._getFrE   r   skip_sumboolc                 C  sh   |j | jv r td|j  d|j  || j|j d|j < n|| j|j < |r*dS tdd |jD S )NzDuplicate key z at offset z_{}r   c                 s      | ]}t |jV  qd S r}   r   nbytesr*   partr&   r&   r'   	<genexpr>       z)GGUFReader._push_field.<locals>.<genexpr>)r   rc   loggerwarningr   formatsumr   )r-   rE   r   r&   r&   r'   re      s
   zGGUFReader._push_field4tuple[npt.NDArray[np.uint64], npt.NDArray[np.uint8]]c                 C  s*   |  |tj}||  |d tj|d fS )N   r   )rW   rU   rg   uint8)r-   r   slenr&   r&   r'   _get_str   s   zGGUFReader._get_str	orig_offsraw_typeBtuple[int, list[npt.NDArray[Any]], list[int], list[GGUFValueType]]c                   s\  |}g }t |}|| |t jkr)t| |}tdd |D }||dg|fS | j|}|d urD| ||}	t	|	j
|	gdg|fS |t jkr| |tj}
|t	|
j
7 }| |tj}|t	|j
7 }|
|g}g }t|d D ]-}| ||
d \}}}}|dkr||7 }t| ||7 }| fdd|D 7 }||7 }qq|| |||fS td| )Nc                 s  r   r}   r   r   r&   r&   r'   r      r   z.GGUFReader._get_field_parts.<locals>.<genexpr>r	   r   c                 3  s    | ]}|  V  qd S r}   r&   r)   	idxs_offsr&   r'   r      s    zUnknown/unhandled field type )r   appendr3   listr   r   rJ   rk   rW   r   r   r2   rU   rX   rg   range_get_field_partslenrY   )r-   r   r   rm   r   gtypespartssizenptypeval	raw_itypealenaparts	data_idxsr+   	curr_size
curr_parts	curr_idxs
curr_typesr&   r   r'   r      s:   



zGGUFReader._get_field_partsc           	   	   C  s   |}|  |\}}|t|j|j 7 }| |tj}|t|j7 }| |tj|d }|t|j7 }| |tj}|t|j7 }| |tj}|t|j7 }t|tt	|dd||||||gg dS )Nr   r!   r"   )r	      rR      )
r   r   r   rW   rU   rX   rg   r   r   bytes)	r-   r   rm   name_len	name_datan_dimsdims	raw_dtypeoffset_tensorr&   r&   r'   _get_tensor_info_field   s"   z!GGUFReader._get_tensor_info_fieldrm   c              	     s   t |D ]Z}|}| |\}}|t|j|j 7 }| |tj}|t|j7 }|||g}t| | ||d \}	}
}}||
7 }| j	t
|tt|dd| fdd|D |dd ||	7 }q|S )Nr   r!   r"   c                   s   g | ]}|  qS r&   r&   r)   r   r&   r'   r/   -  s    z,GGUFReader._build_fields.<locals>.<listcomp>T)r   )r   r   r   r   rW   rU   rX   r   r   re   r   r   r   )r-   rm   r   _r   kv_klenkv_kdataraw_kv_typer   
field_sizefield_parts
field_idxsfield_typesr&   r   r'   ri     s*   

zGGUFReader._build_fieldstuple[int, list[ReaderField]]c                 C  sF   g }t |D ]}| |}|tdd |jD 7 }|| q||fS )Nc                 s  r   r}   r   r   r&   r&   r'   r   7  r   z0GGUFReader._build_tensor_info.<locals>.<genexpr>)r   r   r   r   r   )r-   rm   r   tensor_fieldsr   rE   r&   r&   r'   rj   3  s   
zGGUFReader._build_tensor_info
start_offsrc   list[ReaderField]Nonec                 C  s  g }t  }|D ]}|j\}}}}	}
}tt|dd}||v r%td| || t|
d }tt	|	}t
t|	 }t| \}}|| | }t||d  }|tjkr^|}tj}nL|tjkri|}tj}nA|tjkrt|}tj}n6|tjkr|}tj}n+|tjkr|}tj}n |tjkr|}tj}n|tjkr|}tj}n
|}tj}t||}|t|||	||||  |||!||d q|| _"d S )Nr!   r"   z"Found duplicated tensor with name r   )r   r?   r@   rA   rB   rC   r   rE   )#setr   r   r   rY   addr   r   rU   prodtuplereversedr0   r   F16float16F32float32F64float64I8int8I16int16I32int32I64int64r   r
   r   r>   rW   reshaperd   )r-   r   rc   rd   tensor_namesrE   	_name_lenr   _n_dimsr   r   r   tensor_name	ggml_typen_elemsnp_dims
block_size	type_sizerB   	data_offs
item_count	item_typer&   r&   r'   rl   ;  sb   











zGGUFReader._build_tensors)rK   )rL   rM   rN   rO   )r{   r   r    r|   )r+   r   r    r>   )r	   N)
r   r   r[   r   r   r   rQ   r   r    rD   )F)rE   r   r   r   r    r   )r   r   r    r   )r   r   r   r   r    r   )r   r   r    r   )rm   r   r   r   r    r   )rm   r   r   r   r    r   )r   r   rc   r   r    r   )/r9   r:   r;   rH   r<   r   rI   r   UINT8rU   r   INT8r   UINT16uint16INT16r   rf   rX   INT32r   FLOAT32r   rh   rg   INT64r   FLOAT64r   BOOLbool_rJ   rx   r   npt	DTypeLikery   r~   r   rW   re   r   r   r   ri   rj   rl   r&   r&   r&   r'   rF   o   s:   
 4

	


&

rF   ))
__future__r   loggingosr^   collectionsr   typingr   r   r   r   r   numpyrU   numpy.typingr   quantsr
   r9   pathlibr   rL   insertr   __file__parentgguf.constantsr   r   r   r   r   r   r   	getLoggerr   r]   r   r>   rF   r&   r&   r&   r'   <module>   s$   $

=