
    Iuij                     @    d dl Zd Zd Zd	dZd Zd Z G d d      Zy)
    Nc           	      Z   |st        d      t        |d   j                  t        j                        r!t        j
                  }t        j                  }ndd l}|j                  }|j                  } ||D cg c]  }|j                   c}      | _        d }|D ]*  }|j                         s|j                  j                  } n |X ||D cg c]@  }|j                         r|j                  n! ||j                  j                  d   g|      B c}      | _
        y y c c}w c c}w )N9Cannot fuse linear layers: at least one layer is requiredr   )dtype)
ValueError
isinstanceweightnpndarrayconcatenatezerostorchcathas_biasbiasr   shape)speclayersr   r   r   layer
bias_dtypes          N/opt/pipecat/venv/lib/python3.12/site-packages/ctranslate2/converters/utils.pyfuse_linearr      s   TUU&)""BJJ/nnii@u||@ADKJ >>))J
  $  ~~' JJ 2 21 56jIJ	
	  As   8D#AD(c                 (   |st        d      g d}t        |d   j                  t        j                        rt        j
                  }ndd l}|j                  }|D ]/  }t        | | ||D cg c]  }t        ||       c}|             1 y c c}w )Nr   )r   weight_scaleweight_zeror   axis)
r   r   r   r	   r
   r   r   r   setattrgetattr)r   r   r   paramsr   r   paramr   s           r   fuse_linear_prequantr!   &   s    TUU6F&)""BJJ/nnii 
FC5.C$O	

 Ds   ,Bc                    || j                  || j                  d   |z  d      } | ddd|f   }t        |j                  ||z  d      |      j                  ||d      }|| ddd|f<   | j                  d| j                  d         S | j                  || j                  d   |z  dz  d| j                  d         j                  dd      j                  | j                  d   | j                  d         S )z<Permutes the weight to use the sliced rotary implementation.Nr         )reshaper   permute_for_sliced_rotaryswapaxes)r   	num_heads
rotary_dimrotary_weights       r   r'   r'   9   s    	6<<?i+GLq+:+~.1!!)j"8"=y

')Z
, 	 "/q+:+~~~b&,,r"233 	y&,,q/Y">!"CQUVX	!Q	a&,,q/	2    c                    t        |j                  t        j                        s+|j                  j	                         }|j	                         }n|j                  }t        j
                  t        j                  |      d      }t        j                  |d      }|j                  |j                        }t        j                  ||z        }t        j                  |d      }t        |j                  t        j                        sddl}|j                  |      }| xj                  |z  c_        | xj                  |z  c_        |xj                  |j                  dd      z  c_        y)zlApplies the activation smoothing technique described in
    https://github.com/mit-han-lab/smoothquant.
    r   r   gh㈵>Nr%   r#   )r   r   r	   r
   numpyamaxabsolutemaximumastyper   sqrtr   
from_numpygammabetar&   )
layer_normlinearactivation_scaleslinear_weightweight_scalesscalesr   s          r   smooth_activationr=   N   s    fmmRZZ0++--335GGBKK6Q?MJJ}d3M)001D1DEWW&67FZZ%FfmmRZZ0!!&)OOvO
MMV^^Ar**Mr,   c                 :    d}| D ]
  }|d|z   z  } t        |      )NzjThe model you are trying to convert is not supported by CTranslate2. We identified the following reasons:
z
- )r   )reasonsmessagereasons      r   raise_unsupportedrB   k   s6    	1   #6F?"#
W
r,   c                       e Zd Zd Zd Zd Zy)ConfigurationCheckerc                     g | _         y N)_unsupported_reasonsselfs    r   __init__zConfigurationChecker.__init__v   s
    $&!r,   c                 @    |s| j                   j                  |       y y rF   )rG   append)rI   assert_conditionerror_messages      r   __call__zConfigurationChecker.__call__y   s    %%,,];  r,   c                 H    | j                   rt        | j                          y y rF   )rG   rB   rH   s    r   validatezConfigurationChecker.validate}   s    $$d778 %r,   N)__name__
__module____qualname__rJ   rO   rQ    r,   r   rD   rD   u   s    '<9r,   rD   rF   )r.   r	   r   r!   r'   r=   rB   rD   rU   r,   r   <module>rV      s,    
D
&*+:
9 
9r,   