
    o9i0P                     x   d dl mZmZmZmZ d dlZd dlZd dlmc m	Z
 d dlmZmZmZmZ d dlZd dlZd dlmZmZ d dlmZ d dlmZmZ  edd	      Z G d
 dej                  j4                        Z G d dej                  j4                        Z G d dej                  j8                        Z G d dej<                        Z G d de      Z  G d de      Z! G d dej                  j8                        Z"d Z# G d dej<                        Z$ G d dej<                        Z% G d dej<                        Z&y)    )OptionalTypeVarUnionoverloadN)Tensordevicedtypenn)undo_layoutget_tile_inds)GlobalOptimManager)OutlierTracerfind_outlier_dimsTztorch.nn.Module)boundc                        e Zd Z	 	 	 	 	 	 	 	 ddededee   dee   dededed	ee   d
df fdZddZ		 ddZ
ded
efdZ xZS )StableEmbeddingNnum_embeddingsembedding_dimpadding_idxmax_norm	norm_typescale_grad_by_freqsparse_weightreturnc                     t         |   |||||||||	|

       t        j                  j	                  ||	      | _        t        j                         j                  | dddi       y N)r   weight
optim_bits    )	super__init__torchr
   	LayerNormnormr   get_instanceregister_module_override)selfr   r   r   r   r   r   r   r   r   r	   	__class__s              a/var/www/html/backtest/airagagent/rag_env/lib/python3.12/site-packages/bitsandbytes/nn/modules.pyr#   zStableEmbedding.__init__   sp     		
 HH&&}V&D	'')BB(\2.	
    c                     t         j                  j                  j                  | j                         | j                          y Nr$   r
   initxavier_uniform_r   _fill_padding_idx_with_zeror)   s    r+   reset_parametersz StableEmbedding.reset_parameters4   (    %%dkk2((*r,   c                     | j                   Ft        j                         5  | j                  | j                      j	                  d       d d d        y y # 1 sw Y   y xY wNr   r   r$   no_gradr   fill_r3   s    r+   r2   z+StableEmbedding._fill_padding_idx_with_zero?   S    ' 7D,,-33A67 7 (7 7   )AAinputc           	      ^   t        j                  || j                  | j                  | j                  | j
                  | j                  | j                        }|j                  t        j                               }| j                  |      j                  | j                  j                        S r.   )F	embeddingr   r   r   r   r   r   tor$   get_default_dtyper&   r	   r)   r=   embs      r+   forwardzStableEmbedding.forwardD   s}    kkKKMMNN##KK
 ffU,,./yy~  !2!233r,   )NN       @FFNNNr   N)__name__
__module____qualname__intr   floatboolr   r#   r4   r2   rE   __classcell__r*   s   @r+   r   r      s    
 &*$(#($(

 
 c]	

 5/
 
 !
 
 &!
 

<+7
4V 4 4r,   r   c                        e Zd Z	 	 	 	 	 	 	 ddededee   dee   dededed	ee   d
ee   ddf fdZ	ddZ
	 ddZdedefdZ xZS )	EmbeddingNr   r   r   r   r   r   r   r   r   r   c
                     t         
|   |||||||||		       t        j                         j	                  | dddi       y r   )r"   r#   r   r'   r(   )r)   r   r   r   r   r   r   r   r   r   r*   s             r+   r#   zEmbedding.__init__V   sW     	 	 
	
 	'')BB(\2.	
r,   c                     t         j                  j                  j                  | j                         | j                          y r.   r/   r3   s    r+   r4   zEmbedding.reset_parametersq   r5   r,   c                     | j                   Ft        j                         5  | j                  | j                      j	                  d       d d d        y y # 1 sw Y   y xY wr7   r8   r3   s    r+   r2   z%Embedding._fill_padding_idx_with_zero|   r;   r<   r=   c           	          t        j                  || j                  | j                  | j                  | j
                  | j                  | j                        }|S r.   )r?   r@   r   r   r   r   r   r   rC   s      r+   rE   zEmbedding.forward   sH    kkKKMMNN##KK
 
r,   )NNrF   FFNNrG   )rH   rI   rJ   rK   r   rL   rM   r   r   r#   r4   r2   rE   rN   rO   s   @r+   rQ   rQ   U   s    
 &*$(#($(#'

 
 c]	

 5/
 
 !
 
 &!
  
 

6+7
V  r,   rQ   c                        e Zd ZddZd Zeddedeee	e
f      deeeef      dedef
d       Zeddedeeef   dedefd	       Zedded
ededefd       Z fdZ xZS )
Params4bitc                     |t        j                  d      }t         j                  j                  | ||      }||_        ||_        ||_        ||_        ||_        |S r7   )	r$   emptyr   _make_subclass	blocksizecompress_statistics
quant_typequant_statedata)clsr_   requires_gradr^   r[   r\   r]   r)   s           r+   __new__zParams4bit.__new__   sV    <;;q>D||**3mD"#6 $&	r,   c                    | j                   j                         j                         j                  |      }t        j
                  j                  || j                  | j                  | j                        \  }}|| _         || _
        | S )N)r[   r\   r]   )r_   
contiguoushalfcudabnb
functionalquantize_4bitr[   r\   r]   r^   )r)   r   ww_4bitr^   s        r+   rf   zParams4bit.cuda   s    II  "'')..v6!nn::1lp  mE  mE  RV  Ra  Ra:  b	&r,   r)   r   r	   non_blockingr   c                      y r.    r)   r   r	   rl   s       r+   rA   zParams4bit.to       r,   c                      y r.   rn   r)   r	   rl   s      r+   rA   zParams4bit.to   rp   r,   tensorc                      y r.   rn   r)   rs   rl   s      r+   rA   zParams4bit.to   rp   r,   c                    t        j                  j                  j                  |i |\  }}}}|C|j                  dk(  r4| j
                  j                  j                  dk(  r| j                  |      S | j                  }||d   j                  |      |d<   | j                  rc|d   d   j                  |      |d   d<   |d   d   d   j                  |      |d   d   d<   |d   d   d   j                  |      |d   d   d<   t        t        	| %  |||      | j                  | j                  | j                  | j                  | j                        }|S )Nrf   cpur      r   r	   rl   )ra   r^   r[   r\   r]   )r$   _C_nn	_parse_totyper_   r   rf   r^   rA   r\   rW   r"   ra   r[   r]   )
r)   argskwargsr   r	   rl   convert_to_formats	new_paramr*   s
            r+   rA   zParams4bit.to   sK   9>9O9OQU9`Y_9`6|%66;;&#8TYY=M=M=R=RV[=[99V$$  A}twwv!++  !uQx{{62AbE!H"#B%(1+.."8AbE!HQK"#B%(1+.."8AbE!HQK"57:V5Wc:#d040B0BPTP`P`-1^^QUQiQi.2oo?I
 r,   )NTN@   Tfp4....rH   rI   rJ   rb   rf   r   r   r   r   rK   r   r	   strrM   rA   r   rN   rO   s   @r+   rW   rW      s    
  HU3;%78 xPUV[]`V`PaGb x|   IJ    5, D 1    F $    r,   rW   c                   F     e Zd Zd fd	Zd Zdej                  fdZ xZS )
Linear4bitc                     t         |   ||||       t        | j                  j                  d||      | _        || _        d| _        y )NF)ra   r\   r]   )r"   r#   rW   r   r_   compute_dtypecompute_type_is_set)	r)   input_featuresoutput_featuresbiasr   r\   r]   r   r*   s	           r+   r#   zLinear4bit.__init__   sK    $G !1!1\o  }G  H*#( r,   c                 d   |j                   t        j                  t        j                  fv r|j                   | _        y |j                   t        j
                  k(  r| j                  t        j                  k(  rL|j                         |j                  d   k(  r,t        j                  d       t        j                  dd       | j                  t        j                  k(  rN|j                         |j                  d   k7  r-t        j                  d       t        j                  dd       y y y y )NzInput type into Linear4bit is torch.float16, but bnb_4bit_compute_type=torch.float32 (default). This will lead to slow inference.ignorez.*inference.)messagezInput type into Linear4bit is torch.float16, but bnb_4bit_compute_type=torch.float32 (default). This will lead to slow inference or training speed.z.*inference or training)r	   r$   float32bfloat16r   float16numelshapewarningswarnfilterwarnings)r)   xs     r+   set_compute_typezLinear4bit.set_compute_type   s    77u}}enn55 "#DWW%!!U]]2	QWWR[8P   !b  d''.I!!U]]2	QWWR[8P  !t  v'':ST 9Q2 &r,   r   c                    | j                   a| j                   j                  |j                  k7  r>| j                   j                  j                  |j                        | j                   _        t	        | j
                  dd       t        d       | j                  s| j                  |       d| _        |j                  }| j                  |j                  | j                        }| j                   d n$| j                   j                  | j                        }t        j                  || j
                  j                         || j
                  j                        }|j                  |      }|S )Nr^   zhFP4 quantization state not initialized. Please call .cuda() or .to(device) on the LinearFP4 layer first.T)r   r^   )r   r	   r_   rA   getattrr   printr   r   r   rg   matmul_4bittr^   )r)   r   	inp_dtyper   outs        r+   rE   zLinear4bit.forward   s   99 TYY__%?!YY^^..qww7DIIN4;;t4<|}''!!!$'+D$GG	)T''(Ayy(tdiill4;M;M.NooatI`I`affY
r,   )TNTr   N)	rH   rI   rJ   r#   r   r$   r   rE   rN   rO   s   @r+   r   r      s    )U* r,   r   c                         e Zd Zd fd	Z xZS )	LinearFP4c           	      0    t         |   |||||d|       y )Nr   r"   r#   r)   r   r   r   r   r\   r   r*   s          r+   r#   zLinearFP4.__init__       $Obdikqrr,   TNTN)rH   rI   rJ   r#   rN   rO   s   @r+   r   r      s    s sr,   r   c                   $     e Zd ZdZd fd	Z xZS )	LinearNF4a7   Implements the NF4 data type.

        Constructs a quantization data type where each bin has equal area under a standard normal distribution N(0, 1) that
        is normalized into the range [-1, 1].

        For more information read the paper: QLoRA: Efficient Finetuning of Quantized LLMs (https://arxiv.org/abs/2305.14314)

        Implementation of the NF4 data type in bitsandbytes can be found in the `create_normal_map` function in
        the `functional.py` file: https://github.com/TimDettmers/bitsandbytes/blob/main/bitsandbytes/functional.py#L236.
    c           	      0    t         |   |||||d|       y )Nnf4r   r   s          r+   r#   zLinearNF4.__init__  r   r,   r   )rH   rI   rJ   __doc__r#   rN   rO   s   @r+   r   r     s    	s sr,   r   c                        e Zd Z	 	 	 	 	 ddZ fdZe	 	 	 ddedeee	e
f      deeeef      dedef
d       Zeddedeeef   dedefd	       Zedded
ededefd       Z fdZ xZS )
Int8Paramsc                     || _         d | _        d | _        |t        j                  d      }t        j
                  j                  | ||      S r7   )has_fp16_weightsCBSCBr$   rY   r   rZ   )r`   r_   ra   r   r   r   s         r+   rb   zInt8Params.__new__  sE      0<;;q>D||**3mDDr,   c                 <   | j                   rt        | 	  |      S | j                  j	                         j                         j                  |      }t        j                  j                  |      \  }}}}}~~|| _        t        | d|       t        | d|       | S )Nr   r   )
r   r"   rf   r_   rd   re   rg   rh   double_quantsetattr)	r)   r   Br   CBtr   SCBtcoo_tensorBr*   s	           r+   rf   zInt8Params.cuda"  s      7<'' 		$$&++-226:A.1nn.I.I!.L+BS$DID$#D%%r,   r)   r   r	   rl   r   c                      y r.   rn   ro   s       r+   rA   zInt8Params.to2  s     	r,   c                      y r.   rn   rr   s      r+   rA   zInt8Params.to;  rp   r,   rs   c                      y r.   rn   ru   s      r+   rA   zInt8Params.to?  rp   r,   c                    t        j                  j                  j                  |i |\  }}}}|C|j                  dk(  r4| j
                  j                  j                  dk(  r| j                  |      S t        t        | )  |||      | j                  | j                        }| j                  |_        | j                  |_        |S )Nrf   rw   rz   )ra   r   )r$   r{   r|   r}   r~   r_   r   rf   r   r"   rA   ra   r   r   r   )	r)   r   r   r   r	   rl   r   r   r*   s	           r+   rA   zInt8Params.toC  s    9>9O9O:
:
6|%6
 v%		  %%.99V$$"
!\   #00!%!6!6I  77IL HHIMr,   )NTFNNr   r   r   rO   s   @r+   r   r     s     E   03-0 	sF{+, eSj)* 	
 
   5, D 1    F $    r,   r   c                     | j                  | d      }|y | j                  | dd      }|dk7  r)t        ||j                        }	t	        ||	      | | d<   y y )Nr   weight_formatrow)getpopr   r   r   )

state_dictprefixlocal_metadatastrictmissing_keysunexpected_keys
error_msgsr   r   tile_indicess
             r+   maybe_rearrange_weightr   \  sk    ^^vhf-.F~NNfX]#;UCM$]FMMB(3FL(I
fXV$% r,   c                   ^     e Zd Z	 	 d fd	Z fdZ fdZd Zdej                  fdZ	 xZ
S )Linear8bitLtc	                    t         	|   ||||       |rJ d       t        j                         | _        || _        || j                  _        || j                  _        || j                  _        |dkD  r|sd| j                  _	        t        | j                  j                  ||      | _        | j                  t               y )Nzvmemory_efficient_backward is no longer required and the argument is deprecated in 0.37.0 and will be removed in 0.39.0        Tr   ra   )r"   r#   rg   MatmulLtStatestateindex	thresholdr   memory_efficient_backwarduse_poolr   r   r_   "_register_load_state_dict_pre_hookr   
r)   r   r   r   r   r   r   r   r   r*   s
            r+   r#   zLinear8bitLt.__init__i  s    $G,  	g  /g  	g,&&(

(

&6

#/H

,s?#3"&DJJ !1!1DTdtu//0FGr,   c                    t         
|   |||       d}t        | j                  |      }t        | j                  |      }| j                  j
                  d u}|| z   }|dz   }	| j                  j                  st||r|n|j                         ||<   d||	<   y ||s|r|n|j                         ||<   d||	<   y |1|r|n|j                         ||<   | j                  j                  ||	<   y y y )Nr   r   r   )	r"   _save_to_state_dictr   r   r   CxBr   detachformatB)r)   destinationr   	keep_varsscb_nameparam_from_weightparam_from_statelayout_reorderedkey_nameformat_namer*   s             r+   r   z Linear8bitLt._save_to_state_dicty  s   #KC  $DKK:"4::x8::>>5xj).zz** ,=F(9L]LdLdLfH%+0K(!-6F<E(8K[KbKbKdH%+0K(!-<E(8K[KbKbKdH%+/::+=+=K( . +r,   c           	         t         |   |||||||       t        |      }|D ]  }	|	t        |      d  }
|
dk(  s| j                  j
                  t        d      ||	   }| j                  j
                  j                  |       | j                  j
                  %| j                  j
                  | j                  _        |j                  |	        y )Nr   zLoading a quantized checkpoint into non-quantized Linear8bitLt is not supported. Please call module.cuda() before module.load_state_dict())
r"   _load_from_state_dictlistlenr   r   RuntimeErrorcopy_r   remove)r)   r   r   r   r   r   r   r   unexpected_copykey
input_nameinput_paramr*   s               r+   r   z"Linear8bitLt._load_from_state_dict  s    %j&.&R^`o&0	2/" 	,CS[\*JU";;??*& (r s s )o%%k2::>>-%)[[__DJJN&&s+	,r,   c                     | j                   j                  | j                  _        | j                   j                  | j                  _        d | j                   _        d | j                   _        y r.   r   r   r   r   r3   s    r+   init_8bit_statezLinear8bitLt.init_8bit_state  >    



r,   r   c                    | j                   | j                  _        | j                  j                  | j                          | j                  a| j                  j                  |j                  k7  r>| j                  j                  j                  |j                        | j                  _        t        j                  || j                  | j                  | j                        }| j                  j                  s]| j                  j                  G| j                  j                  1| j                  `| j                  j                  | j                  _        |S N)r   r   )trainingr   is_trainingr   r   r   r   r	   r_   rA   rg   matmulr   r   r)   r   r   s      r+   rE   zLinear8bitLt.forward  s    !%

;;>>%  " 99 TYY__%?!YY^^..qww7DIINjjDKKdiitzzJzz**zz}}(TZZ^^-G JJM#'::>> 
r,   TTFr   NN)rH   rI   rJ   r#   r   r   r   r$   r   rE   rN   rO   s   @r+   r   r   h  s.    TXZ^H >6,, r,   r   c                   2     e Zd Zd fd	Zd Zd Zd Z xZS )OutlierAwareLinearc                 F    t         |   ||||       d | _        d| _        y )NF)r"   r#   outlier_dimis_quantized)r)   r   r   r   r   r*   s        r+   r#   zOutlierAwareLinear.__init__  s&    $G!r,   c                     t        d      )NzJPlease override the `forward_with_outliers(self, x, outlier_idx)` functionNotImplementedError)r)   r   outlier_idxs      r+   forward_with_outliersz(OutlierAwareLinear.forward_with_outliers  s    !"noor,   c                     t        d      )NzEPlease override the `quantize_weights(self, w, outlier_idx)` functionr  )r)   rj   r
  s      r+   quantize_weightz"OutlierAwareLinear.quantize_weight  s    !"ijjr,   c                 |   | j                   Qt        j                         }|j                         st	        d       |j                  | j                        }|| _         | j                  sS| j                  | j                  | j                         }| j                  j                  j                  |       d| _        y y )NzTPlease use OutlierTracer.initialize(model) before using the OutlierAwareLinear layerT)r  r   r'   is_initializedr   get_outliersr   r  r  r_   r   )r)   r   tracerr
  rj   s        r+   rE   zOutlierAwareLinear.forward  s    #"//1F((*lm --dkk:K*D  $$T[[$2B2BCAKK""1% $D !r,   )TN)rH   rI   rJ   r#   r  r  rE   rN   rO   s   @r+   r  r    s    "
pk%r,   r  c                   8     e Zd Z	 	 	 	 	 	 d fd	Zd Zd Z xZS )SwitchBackLinearBnbc	                 N   t         	|   ||||       t        j                         | _        || _        || j                  _        || j                  _        || j                  _        |dkD  r|sd| j                  _	        t        | j                  j                  ||      | _        y )Nr   Tr   )r"   r#   rg   r   r   r   r   r   r   r   r   r   r_   r   s
            r+   r#   zSwitchBackLinearBnb.__init__  s     	OT6	
 &&(

(

&6

#/H

,s?#3"&DJJ KK/?O_
r,   c                     | j                   j                  | j                  _        | j                   j                  | j                  _        d | j                   _        d | j                   _        y r.   r   r3   s    r+   r   z#SwitchBackLinearBnb.init_8bit_state  r   r,   c                 2   | j                   | j                  _        | j                  j                  | j                          t        j                  |j                         | j                  j                         d | j                        | j                  z   }y r   )
r   r   r   r   r   r   rg   matmul_mixedre   r   r   s      r+   rE   zSwitchBackLinearBnb.forward   se    !%

;;>>%  "qvvx)9)9);$djjY\`\e\eer,   r  )rH   rI   rJ   r#   r   rE   rN   rO   s   @r+   r  r    s'    
 "'
6fr,   r  )'typingr   r   r   r   r   r$   torch.nn.functionalr
   rh   r?   r   r   r	   bitsandbytesrg   bitsandbytes.functional bitsandbytes.autograd._functionsr   r   bitsandbytes.optimr   bitsandbytes.utilsr   r   r   rQ   r   	ParameterrW   Linearr   r   r   r   r   r   r  r  rn   r,   r+   <module>r!     s  
 6 5     + +   G 1 ?C()=4ehh(( =4@7"" 7r<## <|0 0ds
 ss
 s G## GT	JY299 Yx% %4(f")) (fr,   