o
    h                  
   @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlZd dlZd dl	Z
ejjej  ddejdeedd	gd
dgd
dgdd ZdS )    N)nullcontext)product)TemporaryDirectoryzthis test requires a GPU)reasonz%quant_type, compress_statistics, biasnf4fp4FTc              	   C   sd  t j}d }d}d}t jj||dd}tjj|j|j|||| dd}tjj|j	dd}	|	|_	|r8t j
|j|_||}| }
|
d	d }|
d
}tjjj|
|d}tjj|j|j|||| dd}||_	|rpt j
||_||}|j	|j	}}|j|jksJ |j|jksJ t ||sJ |j}|j}dD ])}t||t||}}t|t jrt ||sJ q||ksJ | d| q|jd urdD ]+}t|j|t|j|}}t|t jrt ||sJ q||ksJ | d| q|r|j|j}}|j|jksJ |j|jksJ t ||sJ t jd|d |d}||}||}|j|jks9J |j|jksBJ t ||sKJ t Y}tj|d}tj|d}t | | t | | tj|tj|}}|| }|t jkrdnd}d|dd|dd|d}||k sJ |W d    d S 1 sw   Y  d S )Ncuda)i,  i  cpu)dtypedevicemeta)biascompute_dtypecompress_statistics
quant_typer   F)datarequires_gradr   weight)quantized_statsr   )coder
   	blocksizeabsmaxz != *   r   )r   zstate_4bit.pthz	state.pthgM?g(\?zquantized_size ,z is larger on disk than z.2%z of original size ) torchfloat16nnLinearbnb
Linear4bitin_featuresout_features
Params4bitr   	Parameterr   to
state_dictpopfrom_prequantizedr   r
   equalquant_stategetattr
isinstanceTensorstate2randr   ospathjoinsavegetsizefloat32)r   r   r   original_dtyper   r   layer_shapelinearlinear_q
new_weightsd
bias_data2weight_data2weight2	linear_q2abq0q1attrcdxtmpdirstate_path_4bit
state_path	size_origsize_4
size_ratiotarget_compressionratio_error_msg rO   K/var/www/html/ai/venv/lib/python3.10/site-packages/tests/test_linear4bit.pytest_linear_serialization   s   	




$rQ   )r/   
contextlibr   	itertoolsr   tempfiler   pytestr   bitsandbytesr   markskipifr   is_availableparametrizelistrQ   rO   rO   rO   rP   <module>   s    