
    hz^                        S SK r S SKrS SKrS SKrS SKrS SKrS SKJrJrJ	r	J
r
JrJrJr  S SKJrJr  S SKJr  \R&                  " \5      rS rSS jrSS jrS r/ S	QrS
/SS
/SS
/S.r " S S5      r         SS jrSS jrg)    N)AttributeProto
GraphProto
ModelProto	NodeProtoTensorProtohelpernumpy_helper)infer_shapesinfer_shapes_path)versionc           
          U  Vs/ s H9  n[        [        UR                  S5      5      SS R                  S5      S5      PM;     sn$ s  snf )zl
Convert numpy float16 to python int.

:param np_list: numpy float16 list
:return int_list: python int list
H   N   )intbinviewzfill)np_list_s     Z/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/float16.py_npfloat16_to_intr      sC     =DDGqCAFF3K $**2.2GDDDs   A Ac           	      b   S nU [         R                  " U S:  5         R                  S   S:  a  U [         R                  " U S:  5         R                  5       nU [         R                  " U S:  5         R	                  5       nXB:  a  [
        R                  SU SU 35        XQ::  a  [
        R                  SU SU 35        U [         R                  " U S:  5         R                  S   S:  a  U [         R                  " U S:  5         R                  5       nU [         R                  " U S:  5         R	                  5       nXr* ::  a  [
        R                  SU SU*  35        Xa* :  a  [
        R                  SU SU*  35        [         R                  " U" SX5      X5      n [         R                  " U" U* U S5      U* U 5      n [         R                  " U" X [        S5      5      X 5      n [         R                  " U" [        S5      X* 5      U* U 5      n [         R                  " U 5      $ )a+  
Convert float32 numpy array to float16 without changing sign or finiteness.
Positive values less than min_positive_val are mapped to min_positive_val.
Positive finite values greater than max_finite_val are mapped to max_finite_val.
Similar for negative values. NaN, 0, inf, and -inf are unchanged.
c                 8    [         R                  " X:  X:  5      $ N)nplogical_and)abcs      r   between&convert_np_to_float16.<locals>.between/   s    ~~aeQU++    r   zthe float32 number z will be truncated to infz-inf)	r   whereshapemaxminloggerdebugfloatfloat16)np_arraymin_positive_valmax_finite_valr!   positive_maxpositive_minnegative_maxnegative_mins           r   convert_np_to_float16r4   '   s   , A&'--a014A 67;;=A 67;;=)LL.|n<RSaRbcd+LL.|n<RScRdefA&'--a014A 67;;=A 67;;=?*LL.|n<RTbSbRcde,,LL.|n<RTdSdRefgxx8>@P[Hxx!1 18Q?BRART\]Hxx%,GbHxxfxIN?\deH::hr#   c                 ,   [        U [        5      (       d  [        S[        U 5       35      eU R                  [        R
                  :X  a  [        R                  U l        U R                  (       aR  [        [        R                  " U R                  5      X5      n[        U5      nX@R                  SS& / U R                  SS& U R                  (       a@  [        R                  " U R                  SS9n[        XQU5      nUR                  5       U l        U $ )aa  Convert tensor float to float16.

Args:
    tensor (TensorProto): the tensor to convert.
    min_positive_val (float, optional): minimal positive value. Defaults to 1e-7.
    max_finite_val (float, optional): maximal finite value. Defaults to 1e4.

Raises:
    ValueError: input type is not TensorProto.

Returns:
    TensorProto: the converted tensor.
3Expected input type is an ONNX TensorProto but got Nfloat32dtype)
isinstancer   
ValueErrortype	data_typeFLOATFLOAT16
float_datar4   r   arrayr   
int32_dataraw_data
frombuffertobytes)tensorr.   r/   float16_dataint_listfloat32_listfloat16_lists          r   convert_tensor_float_to_float16rK   I   s     fk**NtTZ|n]^^;,,,&..0&:K:K1LN^oL(6H#+a #%Fa ??==	JL0Q_`L*224FOMr#   c                     [         R                  " U 5      R                  n[        R                  " U R
                  U R                  U5      $ r   )r	   to_arrayr&   r   make_tensor_value_infonamer=   )rF   r&   s     r   make_value_info_from_tensorrP   n   s7    !!&)//E((f6F6FNNr#   )ArrayFeatureExtractor	BinarizerCastMapCategoryMapperDictVectorizerFeatureVectorizerImputerLabelEncoderLinearClassifierLinearRegressor
NormalizerOneHotEncoderRandomUniformLikeSVMClassifierSVMRegressorScalerTreeEnsembleClassifierTreeEnsembleRegressorTreeEnsembleZipMapNonMaxSuppressionTopKRoiAlignRangeCumSumMinMaxUpsampler      )Resize	GroupNormSkipGroupNormc                   4    \ rS rSrSrS\4S jrS\4S jrSr	g)	InitializerTracker   z'Class for keeping track of initializer.initializerc                 ,    Xl         / U l        / U l        g r   )rt   
fp32_nodes
fp16_nodes)selfrt   s     r   __init__InitializerTracker.__init__   s    &r#   nodec                     U(       a  U R                   R                  U5        g U R                  R                  U5        g r   )rv   appendrw   )rx   r{   is_node_blockeds      r   add_nodeInitializerTracker.add_node   s)    OO""4(OO""4(r#   )rw   rv   rt   N)
__name__
__module____qualname____firstlineno____doc__r   ry   r   r   __static_attributes__ r#   r   rr   rr      s    1K 
)Y )r#   rr   c
                 &"   US:  d   S5       eU[        [        R                  " [        R                  5      R                  5      ::  d   S5       eUc  0 OUn
[        U [        5      (       a  U n[        R                  " [        R                  5      [        R                  " S5      :  aq  U(       dj  [        R                  " [        R                  R                  U5      S9 nUR                   n[#        X5        [        R$                  " U5      n SnSSS5        O[        R$                  " U5      n [        U [&        5      (       d  [)        S[+        U 5       35      eSnU(       dD  [        R                  " [        R                  5      [        R                  " S	5      :  a   [,        n Uc  [.        nUc  / n[1        U5      n[1        U5      n[2        R5                  S
U SU SU SU SU SU SU 35        / n/ n/ n/ nUb  U" U 5      n UR7                  U 5        0 n[1        5       n[1        5       nU R8                  R:                   Vs/ s HC  nUR*                  R<                  R>                  [@        RB                  :X  d  M7  UR                   PME     nnU R8                  RD                   Vs/ s HC  nUR*                  R<                  R>                  [@        RB                  :X  d  M7  UR                   PME     nn[        U[F        5      (       a5  U Vs/ s H  nUU;   d  M  UPM     nnU Vs/ s H  nUU;   d  M  UPM     nnOU(       d  / n/ n[I        U R8                  R:                  5       GH>  u  nnUR                   U;   d  M  S[        U5      -   nUUUR                   '   URK                  UR                   5        S[        U5      -   nU R8                  RL                  RK                  5       nURO                  U5        UUl        [@        RP                  UR*                  R<                  l        [R        RT                  " SUR                   /U/[@        RP                  US9/nU R8                  RV                  RY                  U5        UR7                  U5        URK                  U5        GMA     [I        U R8                  RD                  5       GH0  u  nnUR                   U;   d  M  S[        U5      -   nUUUR                   '   URK                  UR                   5        S[        U5      -   nU R8                  RL                  RK                  5       nURO                  U5        UUl        [@        RP                  UR*                  R<                  l        [R        RT                  " SU/UR                   /SUS9/nU R8                  RV                  RY                  U5        UR7                  U5        URK                  U5        GM3     0 nU(       Ga,  / n U GH  n![        U![&        5      (       a  U R7                  U!R8                  5        [        U![Z        5      (       Ga  U!R\                   HM  nUR^                  [@        RB                  :X  d  M#  UR                   U;  d   e[a        U5      UUR                   '   MO     U!RV                   GH   nUR                   U;   a  M  [c        [e        UR:                  5      5       H7  nUR:                  U   U;   d  M  UUR:                  U      UR:                  U'   M9     [c        [e        URD                  5      5       H7  nURD                  U   U;   d  M  UURD                  U      URD                  U'   M9     URf                  U;   =(       d    UR                   U;   n"[I        UR:                  5       Hu  u  nnUU;   d  M  U"=(       dI    U[h        Rk                  URf                  / 5      ;   =(       a    UU
Rk                  URf                  / 5      ;  n#UU   Rm                  UU#5        Mw     U"(       a  UR7                  U5        GM  URf                  S:X  aZ  URn                   HJ  n$U$R                   S:X  d  M  U$Rp                  [@        RB                  :X  d  M5  [@        RP                  U$l8          O   URf                  S;   a  Sn%URn                   HL  n$U$R                   S:X  d  M  Sn%U$Rp                  [@        RB                  :X  d  M7  [@        RP                  U$l8        MN     URf                  S;   aF  U%(       d?  URn                  RY                  [R        Rr                  " S[@        RP                  5      /5        URf                  [h        ;  d  URf                  U
;   a'  URn                   H  n$U R7                  U$5        M     GM  UR7                  U5        GM#     [        U![t        5      (       a  U R7                  U!Rv                  5        U!Rx                   H  nU R7                  U5        M     U!Rz                  RO                  [}        U!Rz                  X5      5        U!R~                   H  n[}        UX5      nM     [        U![Z        5      (       d  GM  [        R                  " U!R:                  U!RD                  U!RL                  5       GHJ  nUR*                  R<                  R>                  [@        RB                  :X  aJ  UR                   U;  a:  [@        RP                  UR*                  R<                  l        UR7                  U5        UR*                  R                  S5      (       d  M  UR*                  R                  R>                  R<                  R>                  [@        RB                  :X  d  M  UR                   U;  d  M  [@        RP                  UR*                  R                  R>                  R<                  l        UR7                  U5        GMM     GM     U nU(       a  GM,  UR                  5        H  n&U(       d  U&R                  (       d  M  [}        U&R\                  X5      U&l.        UR7                  [        U&R\                  5      5        U&R                  (       d  Mo  U(       a  Mx  [2        R                  SU&R                   35        M     U GHf  n'[I        U'R:                  5       GHH  u  nnU[h        U'Rf                     ;  d   UU
Rk                  U'Rf                  / 5      ;   a  M@  U GH  n(UU(R                   :X  d  M  U R8                  RL                  RK                  5       nURO                  U(5        U'R                   S-   [        U5      -   nUUl        [@        RB                  UR*                  R<                  l        U'R                   S -   [        U5      -   n[R        RT                  " SU/U/SUS9/nU R8                  RV                  RY                  U5        UU'R:                  U'     GMF     GMK     GMi     U	(       a  [@        R                  O[@        RB                  n)U GHb  n'[c        [e        U'R:                  5      5       GH  nU'R:                  U   nU H  n(UU(R                   :X  d  M  U R8                  RL                  RK                  5       nURO                  U(5        U'R                   S-   [        U5      -   nUUl        U)UR*                  R<                  l        U'R                   S -   [        U5      -   n[R        RT                  " SU/U/U)US9/nU R8                  RV                  RY                  U5        UU'R:                  U'     GM
     GM     [c        [e        U'RD                  5      5       GH  nU'RD                  U   n*U H  n(U*U(R                   :X  d  M  U R8                  RL                  RK                  5       nURO                  U(5        U'R                   S!-   [        U5      -   nUUl        U)UR*                  R<                  l        U'R                   S"-   [        U5      -   n[R        RT                  " SU/U*/S#US9/nU R8                  RV                  RY                  U5        UU'RD                  U'     GM
     GM     GMe     U $ ! , (       d  f       GN= f! f = fs  snf s  snf s  snf s  snf )$aS  Convert tensor float type in the input ONNX model to tensor float16.

Args:
    model (ModelProto or str): The ONNX model or path of the model to convert.
    min_positive_val (float, optional): minimal positive value. Defaults to 5.96e-08.
    max_finite_val (float, optional): maximal finite value of float16. Defaults to 65504.
    keep_io_types (Union[bool, List[str]], optional): It could be boolean or a list of float32 input/output names.
                                                      If True, model inputs/outputs should be left as float32.
                                                      Defaults to False.
    disable_shape_infer (bool, optional): Skips running onnx shape/type inference.
                                          Useful if shape inference has been done. Defaults to False.
    op_block_list (List[str], optional): List of op types to leave as float32.
                                         Defaults to None, which will use `float16.DEFAULT_OP_BLOCK_LIST`.
    node_block_list (List[str], optional): List of node names to leave as float32. Defaults to None.
    force_fp16_initializers(bool): force converting all float initializers to float16.
                                   Default to false, which will convert only the one needed to avoid precision loss.
    force_fp16_inputs(Dict[str, List[int]]): Force the conversion of the inputs of some operators to float16, even if
                                             this script's preference it to keep them in float32.
Raises:
    ValueError: input type is not ModelProto.

Returns:
    ModelProto: converted model.
"\o>zginvalid min_positive_val. smallest positive float16 value: subnormal 5.96e-08, and normalized 6.104e-05z4invalid max_finite_val. largest float16 value: 65504Nz1.8.0)dirTz$Expected an ONNX ModelProto but got z1.2.0z"fp16 parameters: min_positive_val=z max_finite_val=z keep_io_types=z disable_shape_infer=z op_block_list=z node_block_list=z force_fp16_initializers=graph_input_cast_graph_input_castCast)torO   graph_output_cast_graph_output_castrm   r   )EyeLikeMultinomialRandomNormalRandomNormalLikeRandomUniformr]   SequenceEmpty	BernoulliFr9   )r   r   r   sequence_typezXinitializer is used by both fp32 and fp16 nodes. Consider add these nodes to block list:_input_cast__input_cast_output_cast__output_cast
   )Jr+   r   finfor,   r'   r:   strr   parseonnx__version__tempfileNamedTemporaryFileospathdirnamerO   r   loadr   r;   r<   r
   DEFAULT_OP_BLOCK_LISTsetr)   r*   r}   graphinputtensor_type	elem_typer   r>   outputlist	enumerateadd
value_infoCopyFromr?   r   	make_noder{   extendr   rt   r=   rr   rangelenop_typeALWAYS_FLOAT_INPUTSgetr   	attributeimake_attributer   ggraphstrK   tensors	itertoolschainHasFieldr   valuesrw   rP   rv   infoBFLOAT16)+modelr.   r/   keep_io_typesdisable_shape_inferop_block_listnode_block_listforce_fp16_initializersforce_fp16_inputs#use_bfloat16_as_blocked_nodes_dtypeforce_fp16_inputs_dict
model_pathtmpfileshape_infer_model_pathfunc_infer_shapequeuevalue_info_list	node_listmixed_float_type_node_listname_mappinggraph_io_to_skipio_castsnfp32_inputsfp32_outputsr   output_name	node_namenew_value_infonew_node
input_namefp32_initializers
next_levelqr~   use_fp32_weightattr	has_dtypevaluer{   r   accuracy_typer   s+                                              r   convert_float_to_float16r      s   H x' q' U288BJJ#7#;#;<<t>tt<#4#<RBS%
==))*gmmG.DDM`,,1LMQX)0&!*E		"89&*# NM IIj)EeZ((?U}MNN7==1A1A#BgmmT[F\#\	+ -&M/*O
LL
,-=,>>N~N^^mn{m|  }R  Sf  Rg  gv  wD  vE  EV  Wf  Vg  g@  AX  @Y  	Z
 EOI
 "$ # '	LLLuuH#(;;#4#4j#4a8J8J8T8TXcXiXi8i6166#4Kj$)KK$6$6l$6q!&&:L:L:V:VZeZkZk:kFAFF$6Ll-&&"-D+Qm1Cq+D#/F<a13E<F%++++,166[ -A6K#.L   (*SV3I"[[33779N##A&"-N8C8K8KN++5((!&&K=[M`M`gpqrHKK##H-"">2LL# -" %++,,-166\!-A6J#-L   (+c!f4I"[[33779N##A&",N8C8K8KN++5((*xAT]^_HKK##H-"">2LL# ." 8:

A!Z((!!!''*!Z((A{{k&7&77 vv->>>>4Fq4I)!&&1 '
 A vv) "3qww<0771:5)5aggaj)AAGGAJ 1 #3qxx=188A;,6*6qxx{*CAHHQK 2 '(ii=&@&]AFFoD]O)2177);:%)::.= / !%8%<%<QYY%K K !W$%-C-G-G		SU-V$V , .j9BB1oV *< '!((+99.()#'99#4;CTCT9T-8-@-@DF$) )4
 99 	) 	 ).I()#'99#704I'+vv1B1B'B1<1D1D	 )4 !"		-_ _ir ! 2 2F4I4I'S^SfSf4g3h i 99,??199PfCf() * 1 1$ 7 )4 7==a@u  | !^,,!!!##&A%%a( "<QSSBRcdA7;K\A # !Z(( #!((ALLIAvv))33{7H7HH66)99;F;N;NAFF..8+2215vv7766//99EEOOS^SdSdd vv-==WbWjWj 4 4 > > J J T / 6 6q 9 Jk @ E %H #))+"e&6&6&6 ?@Q@QSc tE""#>u?P?P#QR(?(?notoo  oA  B , +&tzz2MAz+DLL99QBXB\B\]a]i]ikmBn=n-
0%*[[%;%;%?%?%AN"++J7"&))n"<s1v"EK*5N'@K@Q@QN''33= $		M 9CF BI & 0 0*}YZaj klHKK$$++H5$/DJJqM . 3 +( -PK((U`UfUfM s4::'AAJ-
0%*[[%;%;%?%?%AN"++J7"&))n"<s1v"EK*5N'@MN''33= $		M 9CF BI & 0 0*}Yfmv wxHKK$$++H5$/DJJqM . (& s4;;'(A[[^F-
Z__,%*[[%;%;%?%?%AN"++J7!%_!<s1v!EJ*4N'@MN''33= $		N :SV CI & 0 0*xTV]f ghHKK$$++H5%/DKKN . )/ P LU NM" @ klDFsV   "0AC(#AC: 
6AC?AC?.6AD(AD
AD	!AD	-
AD;ADC(
AC7C:AC<c                 (   [        U [        5      (       d  [        S[        U 5       35      eU R                  [        R
                  :w  a  [        S5      eSnU R                  (       a   [        R                  " U R                  5      nU R                  (       a  [        R                  " U R                  SS9nUc  [        S5      e[        X1U5      n[        R                  " [        R                  " U[        R                  " U5      -
  5      5      $ )zSMeasure the maximum absolute difference after converting a float tensor to float16.r6   z#Expected tensor data type is float.Nr7   r8   zexternal data not loaded!)r:   r   r;   r<   r=   r>   r@   r   rA   rC   rD   RuntimeErrorr4   amaxabsr7   )rF   r.   r/   float32_datarG   s        r   float_to_float16_max_diffr     s    fk**NtTZ|n]^^;,,,>??Lxx 1 12}}V__IF677(XL77266,L)AABCCr#   )r        @)	r   r   FFNNFNF)r   loggingr   r   numpyr   r   r   r   r   r   r   r   r	   onnx.shape_inferencer
   r   	packagingr   	getLoggerr   r)   r   r4   rK   rP   r   r   rr   r   r   r   r#   r   <module>r      s      	    e e e @ 			8	$E D"JO
 D #$Aq6QPQFS ) )" !(-yx	Dr#   