
    Ph2                        d dl Z d dlmZ d dlmZ d dlmZmZ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 ee   d!e&fd"Z'd#ee   d!e&fd$Z(d%ee   d!e&fd&Z)d'ee   d!e&fd(Z*d)e+d!e&fd*Z,d+ee&ef   d!e&fd,Z-d-eee&ef      d!ee&ef   fd.Z.d/e&d-eee&ef      d!dfd0Z/d1eee&ef      d!eee&ef      fd2Z0d5d3Z1e2d4k(  r e1        yy)6    N)Enum)Path)AnyDictList)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     zC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\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}});
}
instruction_list_from_yamlreturnc           	          g }| D ]2  }|j                  t        j                  |d   |d   |d                4 t        j                  dj	                  |      j                  d            S )Nr   r   r   )operator_nameXN 
)instruction_list)appendONE_INSTRUCTION
substituteINSTRUCTION_LISTjoinlstrip)r   instruction_list_partinstructions      r   construct_instructionr0      sz    1$$&&)!na.a. ' 	
 2 &&!67>>tD '  r   constants_list_from_yamlc           	         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typer(   ONE_CONSTANTr*   lenCONSTANTS_LIST_EMPTYCONSTANT_LISTr,   r-   )r1   constants_list_partconstant_from_yamlconvert_constants       r   construct_constantsrE      s   6(#.!"#5"6a8*D1);v'!*C0"#5612$t<N7O6P Q` `  	""<#:#:DT#:#UV! 7" 1$####gg1299$? $  r   operator_list_from_yamlc           	          g }| D ]2  }|j                  t        j                  |d   |d   |d                4 t        j                  dj	                  |      j                  d            S )Nr   r   r   )r"   overload_namenum_of_argsr%   r&   )operator_string_list)r(   ONE_OPERATOTR_STRINGr*   OPERATOR_STRING_LISTr,   r-   )rF   operator_list_partoperators      r   construct_operatorsrO      sz    +!! ++&qk&qk$QK , 	
 ,  **WW%78??E +  r   types_tr_list_from_yamlc                     g }| D ]'  }|j                  t        j                  |             ) t        |      dk(  rt        S t
        j                  dj                  |      j                  d            S )N)type_strr   r%   r&   )	type_list)r(   ONE_TYPEr*   r?   TYPE_LIST_EMPTY	TYPE_LISTr,   r-   )rP   types_tr_list_parttypes_trs      r   construct_typesrY      sk    +!!("5"5x"5"HI ,
!#"''2D*E*L*LT*RSSr   register_size_from_yamlc                 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.)r8   r;   r<   r9   )rZ   s    r   construct_register_sizer\      s=    -s3%&=%> ?U U
 	
 &''r   'upgrader_bytecode_function_to_index_mapc           
         t         j                  j                         }t        |j	                         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 )Nc                     | d   S )Nr   r   )items    r   <lambda>z(construct_version_maps.<locals>.<lambda>
  s    tAwr   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itemsdictEXCLUDED_OP_SET_get_upgrader_rangesr?   	enumeraterf   r(   ONE_UPGRADER_IN_VERSION_MAPr*   min_versionmax_versionONE_OPERATOR_IN_VERSION_MAPr,   OPERATOR_VERSION_MAPr-   )r]   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_entryrf   bytecode_function_indexs                r   construct_version_mapsr     sm    ((446K !2!2!4:NO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   upgrader_dictc                 l    i }d}| D ]*  }|j                         D ]  }|t        v r|||<   |dz  } , |S )Nr   r   )keysEXCLUE_UPGRADER_SET)r   r]   indexupgrader_bytecoderf   s        r   +get_upgrader_bytecode_function_to_index_mapr   0  sU     /1+E*.335M 33EJ3MBQJE	 6 + 32r   cpp_pathc           	      v   g }t        |      }t        |      }g }|D ]I  }|j                         D ]2  \  }}|t        v rd}	d}
d}d}d}|j                         D ]  \  }}t        |   }d}|t        j
                  u rt        |      }	/|t        j                  u rt        |      }
M|t        j                  u rt        |      }k|t        j                  u rt        |      }|t        j                  u st        |      } t        j!                  ||	|
||      }t"        j!                  |j%                  d      |j%                  d            }|j'                  |       5 L t(        j!                  |dj+                  |      j%                  d            }|j'                  |       t-        d| dz   t.        z          t1        t2        j4                  j+                  | t.              d      5 }dj+                  |      }|j7                  |j9                  d	             d d d        y # 1 sw Y   y xY w)
Nr%   )rf   r'   r7   rS   r   r&   )bytecode_functionrJ   )operator_version_mapr   zwriting file to : /wbzutf-8)r   r   rn   r   r   r   r0   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)r   r   
body_partsr]   version_map_srcall_upgrader_src_stringr   rf   bytecodeinstruction_list_strconstant_list_strtype_list_strregister_size_stroperator_list_str
table_namecontentselementbody_stringone_upgrader_function_stringone_upgrader_src_stringupgrader_file_contentout_filefinal_outputs                          r   	write_cppr   >  s,   J3MB , --TUO *'8'>'>'@#M8 33#%  "M " "(0(8$
H":. h333+@+J( 2 22(;H(E% 2 22(;H(E%.$3H$=M 6 66(?(I% )9 ,A+K+K+!5/'/ ,L ,( '7&A&A">"E"Ed"K%6%=%=d%C 'B '# $**+BCE (A +J -77,''"9:AA$G 8  +,	
31J JK	bggll8%>?	F(wwz*,33G<= 
G	F	Fs   42H//H8upgrader_listc                 "    t        | d       }|S )Nc                 *    t        t        |             S )N)nextiter)one_upgraders    r   ra   zsort_upgrader.<locals>.<lambda>w  s    T,5G0Hr   rb   )rm   )r   sorted_upgrader_lists     r   sort_upgraderr   u  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   rj   csrcjitmobile)r   r   r   r   r   r   __file__resolveparentsr   r9   )r   r   uppytorch_dirupgrader_paths        r   mainr   |  sz    /1M(7"&T"X7 # x.((*2215K')F2U:XEMc- "67r   __main__)r    N)3r   enumr   pathlibr   typingr   r   r   rj   torch.jit.generate_bytecoder   torchgen.code_templater	   8torchgen.operator_versions.gen_mobile_upgraders_constantr
   r   rp   r   r)   r+   r>   rA   r@   rT   rV   rU   rK   rL   r   r   rs   rv   rw   r   r   UPGRADER_ELEMENTPER_OPERATOR_UPGRADER_LISTr9   r0   rE   rO   rY   r;   r\   r   r   r   r   r   r   r   r   r   <module>r      s   	   " "  C /
t  ">2 :
     !
  K <=	 C#Q 
 $  %		     +r  +  $	   '()+ Z 2   * d3i C $s)  4c s TT#Y T3 T(S (S ('-1#s(^''T3S#X'3	#s(^34> 4>Dc3h,@ 4>T 4>n d38n!5  $tCH~:N  8 zF r   