
    Vh0                    &   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlZd dlmZ d dlmZ d d	lmZ  G d
 de      Zg dZddgZ ed      Z ed      Z ed      Z ed      ZdZ ed      Z ed      ZdZ ed      Z ed      Z ed      Z ed      Z  ed      Z! ed      Z" ed      Z# eedz         Z$dZ% ed       Z& ed!      Z'd-d"Z(d.d#Z)d/d$Z*d0d%Z+d1d&Z,	 	 	 	 d2d'Z-	 	 	 	 d3d(Z.d4d)Z/d5d*Z0d6d+Z1e2d,k(  r e1        yy)7    )annotationsN)Enum)
itemgetter)Path)Any)generate_upgraders_bytecode)CodeTemplate)#MOBILE_UPGRADERS_HEADER_DESCRIPTIONc                       e Zd ZdZdZdZdZdZy)ByteCode               N)__name__
__module____qualname__instructions	constantstypes	operatorsregister_size     _/home/dcms/DCMS/lib/python3.12/site-packages/torchgen/operator_versions/gen_mobile_upgraders.pyr   r      s    LIEIMr   r   )zaten::full.nameszaten::full.outz
aten::fullfull_0_4full_out_0_4z7
    Instruction{OpCode::${operator_name}, ${X}, ${N}},zSstd::vector<Instruction>({
        ${instruction_list}
    }), // instructions listz
    c10::IValue(${constant}),zMstd::vector<c10::IValue>({
        ${constant_list}
    }), // constants listz-std::vector<c10::IValue>(), // constants listzc10::parseType("${type_str}"),zFstd::vector<c10::TypePtr>({
        ${type_list}
    }), // types listz*std::vector<c10::TypePtr>(), // types listzN
    OperatorString({"${operator_name}", "${overload_name}", ${num_of_args}}),z\
    std::vector<OperatorString>({
        ${operator_string_list}
    }), // operators listz
    mobile::Function::registerFunc(
        "${upgrader_name}",
        ${instruction_list},
        ${constant_list},
        ${type_list},
        ${register_size}
    )zi
    ByteCodeFunctionWithOperator({
        ${bytecode_function},
        ${operator_string_list}
    }),zhUpgrader({${upgrader_min_version}, ${upgrader_max_version}, "${upgrader_name}", ${bytecode_func_index}})z
    {std::string("${operator_name}"),
        std::vector<Upgrader>({
            ${upgrader_list_in_version_map}
        })},a%  
const std::unordered_map<std::string, std::vector<Upgrader>>
getOperatorVersionMapForMobile() {
  static std::unordered_map<std::string, std::vector<Upgrader>>
        operatorVersionMapForMobile({
            ${operator_list_in_version_map}
      });
  return operatorVersionMapForMobile;
}
a(  
#include <caffe2/serialize/versions.h>
#include <torch/csrc/jit/mobile/upgrader_mobile.h>

namespace c10 {
TypePtr parseType(const std::string& pythonStr);
} // namespace c10

namespace torch {
namespace jit {

// clang-format off

// From operator_versions_map
${operator_version_map}

const std::vector<ByteCodeFunctionWithOperator>& getUpgraderBytecodeList() {
  auto generate_upgrader_bytecode_list = []() {
    std::vector<ByteCodeFunctionWithOperator> upgrader_function_list({
               ${upgrader_bytecode}
            });
    for (const auto& upgrader_function : upgrader_function_list) {
      for (const auto& op : upgrader_function.operators) {
        upgrader_function.function.append_operator(
            op.name,
            op.overload_name,
            op.num_specified_args);
      }
    }
    return upgrader_function_list;
  };
  static std::vector<ByteCodeFunctionWithOperator> upgraderBytecodeList =
      generate_upgrader_bytecode_list();
  return upgraderBytecodeList;
}

// clang-format on

} // namespace jit
} // namespace torch
zupgrader_mobile.cppzHUpgrader({${min_version}, ${max_version}, ${operator_name}, ${index}}),
zR{
  std::string(${operator_name}),
  std::vector<Upgrader>({${upgrader_list}});
}
c           	         | D cg c]#  }t         j                  |d   |d   |d         % }}t        j                  dj                  |      j	                  d            S c c}w )Nr   r   r   )operator_nameXN 
)instruction_list)ONE_INSTRUCTION
substituteINSTRUCTION_LISTjoinlstrip)instruction_list_from_yamlinstructioninstruction_list_parts      r   construct_instructionr.      s     6  	""%a.!n!n 	# 	
  &&!67>>tD '     (A#c           	        g }| D ]  }d }t        |t              rd| d}nSt        |t              r|rdnd}n<|d}n7t        |t              rt        |      }nt	        d| dt        |       d      |j                  t        j                  |              t        |      d	k(  rt        S t        j                  dj                  |      j                  d
            S )N"truefalser#   zThe type of z is zO. Please add change in construct_constants function in gen_mobile_upgraders.py.)constantr   r$   )constant_list)
isinstancestrboolint
ValueErrortypeappendONE_CONSTANTr'   lenCONSTANTS_LIST_EMPTYCONSTANT_LISTr)   r*   )constants_list_from_yamlconstants_list_partconstant_from_yamlconvert_constants       r   construct_constantsrE      s	   6 W(#.!"#5"6a8*D1);v'!*C0"#5612$t<N7O6P Q` `  	""<#:#:DT#:#UV!W" 1$####gg1299$? $  r   c           	         | D cg c]#  }t         j                  |d   |d   |d         % }}t        j                  dj                  |      j	                  d            S c c}w )Nr   r   r   )r    overload_namenum_of_argsr#   r$   )operator_string_list)ONE_OPERATOTR_STRINGr'   OPERATOR_STRING_LISTr)   r*   )operator_list_from_yamloperatoroperator_list_parts      r   construct_operatorsrO      s     0  	''"1+"1+  	( 	
   **WW%78??E +  r/   c                    | D cg c]  }t         j                  |       }}t        |      dk(  rt        S t        j                  dj                  |      j                  d            S c c}w )N)type_strr   r#   r$   )	type_list)ONE_TYPEr'   r>   TYPE_LIST_EMPTY	TYPE_LISTr)   r*   )types_tr_list_from_yamltypes_trtypes_tr_list_parts      r   construct_typesrY      so    ?V3;X.  !#"''2D*E*L*LT*RSSs   A,c                V    t        | t              st        d|  d      t        |       S )NzInput register size is zJ andit's type is {type(register_size_from_yaml)}. An int type is expected.)r6   r9   r:   r7   )register_size_from_yamls    r   construct_register_sizer\      s=    -s3%&=%> ?U U
 	
 &''r   c           
        t         j                  j                         }t        |j	                         t        d            }t        |      }g }|D ]  }g }|t        v rt         j                  j                  |      }||   }t        |      t        |      k(  sJ t        |      D ]X  \  }	}
|
j                  }| |   }|j                  t        j                  ||	   j                  ||	   j                   ||             Z |j                  t"        j                  |dj%                  |                    t&        j                  dj%                  |      j)                  d            S )Nr   key)upgrader_min_versionupgrader_max_versionupgrader_namebytecode_func_indexr#   )r    upgrader_list_in_version_mapr$   )operator_list_in_version_map)torch_C_get_operator_version_mapsorteditemsr   dictEXCLUDED_OP_SET_get_upgrader_rangesr>   	enumeraterb   r<   ONE_UPGRADER_IN_VERSION_MAPr'   min_versionmax_versionONE_OPERATOR_IN_VERSION_MAPr)   OPERATOR_VERSION_MAPr*   )'upgrader_bytecode_function_to_index_mapversion_mapsorted_version_map_sorted_version_map!operator_list_in_version_map_partop_nameupgraders_in_version_map_partupgrader_rangesupgrader_entriesidxupgrader_entryrb   bytecode_function_indexs                r   construct_version_mapsr     sz    ((446K !2!2!4*Q-H12(*%% 
(*%o%((77@-g6?#s+;'<<<<#,-=#> 	C*88M&M'# *00+66)8)=)I)I)8)=)I)I"/(?	 7 	 	*00'22%-/WW5R-S 3 	
+
6  **%'WW-N%O%V%V&
 +  r   c                l    i }d}| D ]*  }|j                         D ]  }|t        v r|||<   |dz  } , |S )Nr   r   )keysEXCLUE_UPGRADER_SET)upgrader_dictrt   indexupgrader_bytecoderb   s        r   +get_upgrader_bytecode_function_to_index_mapr   1  s_     /1+E* .335 	M 33EJ3MBQJE		 32r   c           	     *   t        |      }t        |      }g }|D ]G  }|j                         D ]0  \  }}|t        v rd}d}	d}
d}d}|j                         D ]  \  }}t        |   }|t        j
                  u rt        |      }-|t        j                  u rt        |      }	K|t        j                  u rt        |      }i|t        j                  u rt        |      }
|t        j                  u st        |      } t        j!                  |||	|
|      }t"        j!                  |j%                  d      |j%                  d            }|j'                  |       3 J t(        j!                  |dj+                  |      j%                  d            }t-        d| dz   t.        z          t1        t2        j4                  j+                  | t.              d      5 }|j7                  |j9                  d	             d d d        y # 1 sw Y   y xY w)
Nr#   )rb   r%   r5   rR   r   r$   )bytecode_functionrI   )operator_version_mapr   zwriting file to : /wbzutf-8)r   r   rj   r   r   r   r.   r   rE   r   rO   r   rY   r   r\   ONE_UPGRADER_FUNCTIONr'   ONE_UPGRADER_SRCr*   r<   UPGRADER_CPP_SRCr)   printUPGRADER_MOBILE_FILE_NAMEopenospathwriteencode)cpp_pathr   rt   version_map_srcall_upgrader_src_stringr   rb   bytecodeinstruction_list_strconstant_list_strtype_list_strregister_size_stroperator_list_str
table_namecontentselementone_upgrader_function_stringone_upgrader_src_stringupgrader_file_contentout_files                       r   	write_cppr   ?  s!   3MB , --TUO * "D'8'>'>'@ !	D#M8 33#%  "M " "(0(8 J$
H":.h333+@+J( 2 22(;H(E% 2 22(;H(E%.$3H$=M 6 66(?(I%J ,A+K+K+!5/'/ ,L ,( '7&A&A">"E"Ed"K%6%=%=d%C 'B '# $**+BCC!	D"DH -77,''"9:AA$G 8  

31J JK	bggll8%>?	F >(,33G<=> > >s   !H		Hc                "    t        | d       }|S )Nc                *    t        t        |             S )N)nextiter)one_upgraders    r   <lambda>zsort_upgrader.<locals>.<lambda>t  s    T,5G0H r   r^   )ri   )upgrader_listsorted_upgrader_lists     r   sort_upgraderr   r  s    !H  r   c            	        t               } t        |       }|D ]   }t        dt        t	        |                   " t        t              j                         j                  d   }|dz  dz  dz  dz  }t        t        |      |       y )Nzafter sort upgrader : r   rf   csrcjitmobile)r   r   r   r   r   r   __file__resolveparentsr   r7   )r   r   uppytorch_dirupgrader_paths        r   mainr   y  s    /1M(7" 8&T"X78 x.((*2215K')F2U:XEMc- "67r   __main__)r+   	list[Any]returnr7   )rA   r   r   r7   )rL   r   r   r7   )rV   r   r   r7   )r[   r9   r   r7   )rt   dict[str, Any]r   r7   )r   list[dict[str, Any]]r   r   )r   r7   r   r   r   None)r   r   r   r   )r   r   )3
__future__r   r   enumr   rM   r   pathlibr   typingr   rf   torch.jit.generate_bytecoder   torchgen.code_templater	   8torchgen.operator_versions.gen_mobile_upgraders_constantr
   r   rl   r   r&   r(   r=   r@   r?   rS   rU   rT   rJ   rK   r   r   ro   rr   rs   r   r   UPGRADER_ELEMENTPER_OPERATOR_UPGRADER_LISTr.   rE   rO   rY   r\   r   r   r   r   r   r   r   r   r   <module>r      s   # 	      C /
t  ">2 :
     !
  K <=	 C#Q 
 $  %		     +r  +  $	   '()+ Z 2   * 4T('-;''T3'330>f 8 zF r   