[c@`sdZddlmZddlmZddlmZddlmZddlZddlZddlZ ddl m Z d Z dd Zd Zd Ze jd dZe jddZe jddZe jddZe jddZe jddZe jddZe jddZe jddZe jdd Ze jd!d"Ze jd#d$Ze jd%d&Ze jd'd(Z e jd)d*Z!d+Z"e jd,d-Z#e jd.d/Z$e jd0d1Z%e jd2d3Z&e jd4d5Z'e jd6d7Z(e jd8d9Z)e jd:d;Z*e jd<d=Z+e jd>d?Z,e jd@dAZ-e jdBdCZ.e jdDdEZ/e jdFdGZ0e jdHdIZ1dJZ2e jdKdLZ3e jdMdNZ4e jdOdPZ5e jdQdRZ6e jdSdTZ7e jdUdVZ8e jdWdXZ9e jdYdZZ:e jd[d\Z;e jd]d^Z<e jd_d`Z=e jdadbZ>e jdcddZ?e jdedfZ@e jdgdhZAe jdidjZBe jdkdlZCe jdmdnZDe jdodpZEe jdqdrZFe jdsdtZGe jdudvZHe jdwdxZIe jdydzZJe jd{d|ZKe jd}d~ZLe jddZMe jddZNe jddZOe jddZPe jddZQe jddZRe jddZSe jddZTe jddZUe jddZVe jddZWdS(uR Conversion Functions for common layers. Add new functions here with a decorator. i(tabsolute_import(tdivision(tprint_function(tunicode_literalsNi(t MXNetGraphcC`s8yddl}Wn!tk r3tddnX|S(uN To make sure ONNX is runtime dependency, it is imported used only when needediNu(Onnx and protobuf need to be installed. u6Instructions to install - https://github.com/onnx/onnx(tonnxt ImportError(R((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytimport_onnx_modules@s  cC`stjd}|dkr|S|j|dkr:dnt|j|}|dkr_|S|j|}|dk r|jdt|fkrt|}|St d|t|fn|S(u@Helper function to parse operator attributes in required format.u\([0-9L|,| ]+\)iuMalformed %s dimensions: %sN( tretcompiletNonetgettstrtsearchtspantlentevaltAttributeError(tattrst attrs_namet alt_valuettuple_ret attrs_strt attrs_matchtdims((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt parse_helperJs 0   cC`st|}dg|}d}t|d}xZtd|D]I}|ddkrp||||<|d7}q?||||<|d7}q?W|S(u@Helper function to convert padding format for pad operator. iii(Rtinttrange(t pad_widthtnum_pad_valuestonnx_pad_widtht start_indext end_indextidx((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyttransform_padding[s   cC`sg}|jd}x|D]}t|j}|jdd}|jdd}|jdd}|jdd}|jdd}|d kr|jt|qqW|S( ukHelper function to convert string to list. Used to convert shape attribute string to list format. u,u(uu)uLu[u]uNone(uuNone(tsplitR tstriptreplacetappendR(t string_valt result_listt list_stringtval((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_string_to_listos  unullc K`st}|d}|dtkr|d}|d}||}|jj|j}tj|}|jj|||} |j |jj d|d|d|d|j j d t| gS|jj||d |d } | gSd S( u3Helper function to convert weights and inputs. unameuis_inputuweightsu initializertnamet data_typeRtvalstrawuin_typeuin_shapeN( RtFalsetmappingtNP_TYPE_TO_TENSOR_TYPEtdtypetnptshapethelpertmake_tensor_value_infoR&t make_tensortflattenttolist( tnodetkwargsRR,tweightst initializertnp_arrR-Rt tensor_nodet tval_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_weights_and_inputss&        u ConvolutioncK`st}|d}|d}t|}|d}||d|ddj}||d|ddj}|dkr||d|ddj} n|jd} tt| d } tt| d ddg} tt| d ddg} t| jd d}tt| d ddg}| | } ||g}|dkra|j| n|jj dd|d|gd| d| d|d| d|d|}|gS(uiMap MXNet's convolution operator attributes to onnx's Conv operator and return the created node. unameuinputsu proc_nodesu index_lookupiiiuattrsukernelustrideupadu num_groupudilateuConvtinputstoutputst kernel_shapetstridest dilationstpadstgroupR,( RRR,R tlistRRR&R6t make_node(R;R<RR,RCt num_inputst proc_nodest input_nodet weights_nodet bias_nodeRt kernel_dimst stride_dimstpad_dimst num_groupRGt input_nodest conv_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_convolutions<             uFullyConnectedcK`st}|d}|d}|d|dd}|d|dd}|d|dd}|d}||} ||} ||} | j} | j} | j}|jjd| | |g|gd d d d d td td|}|gS(ulMap MXNet's FullyConnected operator attributes to onnx's Gemm operator and return the created node. unameuinputsu index_lookupiiiu proc_nodesuGemmtalphag?tbetattransAttransBR,(RR,R6RKR0tTrue(R;R<RR,RCt input_node_idtweight_node_idt bias_node_idRMRNRORPt input_namet weights_namet bias_name((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_fully_connecteds.              u BatchNormc K`skt}|d}|d}|d}|d}t|jdijdd}t|jdd}|d |d d } |d |d d } |d |d d } |d |d d } |d |dd } || j}|| j}|| j}|| }|j}|| j}|jjd|||||g|gd|d|d|dd }|gS(uuMap MXNet's BatchNorm operator attributes to onnx's BatchNormalization operator and return the created node. unameu proc_nodesuinputsuattrsumomentumg?uepsgMbP?u index_lookupiiiiiuBatchNormalizationR,tepsilontmomentumtspatial(RtfloatR R,R6RK(R;R<RR,RMRCRRetepstdata_idxt gamma_idxtbeta_idxtmoving_mean_idxtmoving_var_idxt data_nodet gamma_nodet beta_nodet mov_mean_nodet mov_var_nodetbn_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_batchnorms>     $         utanhcK`sut}|d}|d}|d|dd}|d}||j}|jjd|g|gd|}|gS(ubMap MXNet's tanh operator attributes to onnx's Tanh operator and return the created node. unameuinputsu index_lookupiu proc_nodesuTanhR,(RR,R6RK(R;R<RR,RCtinput_node_idxRMRN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_tanh"s        ucoscK`sut}|d}|d}|d|dd}|d}||j}|jjd|g|gd|}|gS(u`Map MXNet's cos operator attributes to onnx's Cos operator and return the created node. unameuinputsu index_lookupiu proc_nodesuCosR,(RR,R6RK(R;R<RR,RCRuRMRN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_cos6s        usincK`sut}|d}|d}|d|dd}|d}||j}|jjd|g|gd|}|gS(u`Map MXNet's sin operator attributes to onnx's Sin operator and return the created node. unameuinputsu index_lookupiu proc_nodesuSinR,(RR,R6RK(R;R<RR,RCRuRMRN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_sinJs        utancK`sut}|d}|d}|d|dd}|d}||j}|jjd|g|gd|}|gS(u`Map MXNet's tan operator attributes to onnx's tan operator and return the created node. unameuinputsu index_lookupiu proc_nodesuTanR,(RR,R6RK(R;R<RR,RCRuRMRN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_tan^s        uarccoscK`sut}|d}|d}|d|dd}|d}||j}|jjd|g|gd|}|gS(ubMap MXNet's acos operator attributes to onnx's acos operator and return the created node. unameuinputsu index_lookupiu proc_nodesuAcosR,(RR,R6RK(R;R<RR,RCRuRMRN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_acosrs        uarcsincK`sut}|d}|d}|d|dd}|d}||j}|jjd|g|gd|}|gS(ubMap MXNet's asin operator attributes to onnx's asin operator and return the created node. unameuinputsu index_lookupiu proc_nodesuAsinR,(RR,R6RK(R;R<RR,RCRuRMRN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_asins        uarctancK`sut}|d}|d}|d|dd}|d}||j}|jjd|g|gd|}|gS(ubMap MXNet's atan operator attributes to onnx's atan operator and return the created node. unameuinputsu index_lookupiu proc_nodesuAtanR,(RR,R6RK(R;R<RR,RCRuRMRN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_atans        usigmoidcK`sut}|d}|d}|d|dd}|d}||j}|jjd|g|gd|}|gS(uhMap MXNet's sigmoid operator attributes to onnx's Sigmoid operator and return the created node. unameuinputsu index_lookupiu proc_nodesuSigmoidR,(RR,R6RK(R;R<RR,RCRuRMRN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_sigmoids        urelucK`sut}|d}|d}|d|dd}|d}||j}|jjd|g|gd|}|gS(ubMap MXNet's relu operator attributes to onnx's Relu operator and return the created node. unameuinputsu index_lookupiu proc_nodesuReluR,(RR,R6RK(R;R<RR,RCRuRMRN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_relus        u Activationc K`st}|d}|d}|d}|d}|d}|d|dd}||jd} idd 6d d 6d d 6dd6dd6} | j|} | r|jj| | g|gd|}ntd||gS(umMap MXNet's Activation operator attributes to onnx's Tanh/Relu operator and return the created node. unameu proc_nodesuattrsuact_typeuinputsu index_lookupiuTanhutanhuReluureluuSigmoidusigmoiduSoftplususoftreluuSoftsignusoftsignR,u<Activation %s not implemented or recognized in the converter(RtoutputR R6RKR( R;R<RR,RMRtact_typeRCRuRNt act_typestact_name((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_activations0           uPadc K`s3t}|d}|d}|d}|d}|d|dd}||j}t|jd} t| } |jd} | d krd |krt|jd nd } |jjd d |gd|gdd d| d| d|}n6|jjd d |gd|gd| d| d|}|gS(u`Map MXNet's pad operator attributes to onnx's Pad operator and return the created node. unameuattrsu proc_nodesuinputsu index_lookupiu pad_widthumodeuconstantuconstant_valueguPadRCRDtmodetvalueRHR,(RR,R+R R"RgR6RK( R;R<RR,RRMRCRuRNtmxnet_pad_widthRtpad_modet pad_value((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_pads8        '        cC`sEt}|d|}|jjdd|gd|gd|}|S(u,create extra transpose node for dot operatoru_u TransposeRCRDR,(RR6RK(top_nameRNt node_nameRt trans_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytcreate_helper_trans_node-s     udotcK`st}|d}|d}|d}|d|dd}||j}|d|dd}||j} |jdi} d} d} d| kr| jddkrdnd} d | kr| jd dkrdnd}d t|d }t||dt|| d| r>t||d} |d}n|rct|| d} |d} n|jjdd|| gd|gd|}| r| r|gS| r| r| |gS|r| r| |gS| | |gSdS(uMap MXNet's dot operator attributes to onnx's MatMul and Transpose operators based on the values set for transpose_a, transpose_b attributes.u proc_nodesuinputsunameu index_lookupiiuattrsu transpose_auTrueu1u transpose_bu transposeuidxuaubu_au_buMatMulRCRDR,N(uTrueu1(uTrueu1(RR,R R R RR6RK(R;R<RRMt node_inputsR,t input_a_idxt input_node_at input_b_idxt input_node_bRt trans_a_nodet trans_b_nodettrans_attrans_bRt matmul_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_dot;sH       ! !          u _linalg_gemm2cK`st}|d}|d}|d}|d|dd}||j}|d|dd}||j} d|kr|d} t| d} t| d } t| d } nd } d} d} d t|d }| d kr4| dkr4| dkr4|jjdd|| gd|gd|}|gS| dkr| dkrd t|d }|d}|jjdd|gd|dgd|}|jjdd|| gd|gd|}||gS| dkrV| dkrV|d}|jjdd| gd|dgd|}|jjdd||gd|gd|}||gS|d}|jjdd|gd|dgd|}|d}|jjdd| gd|dgd|}|jjdd||gd|gd|}|||gSdS(uMap MXNet's _linalg_gemm2 operator attributes to onnx's MatMul and Transpose operators based on the values set for transpose_a, transpose_b attributes. Return multiple nodes created. u proc_nodesuinputsunameu index_lookupiiuattrsualphau transpose_au transpose_bg?u transposeuidxuMatMulRCRDR,u_au Transposeu_bN(RR,RgRR R6RK(R;R<RRMRR,RRRRRRXRRRRRRRt node_name_at node_name_b((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_linalg_gemm2os        $                                      uPoolingc K`st}|d}|d}t|d}|d}|jdrVt|dnd}d|kr|jddkrtnt}|d} |d | d d } || } |d } |jd d } | dkrd}tj|ntt |dd d g}||}idd6dd6}idd6dd6}|ru|j j ||| j g| gd| }n=|j j ||| j g| gd|d|d|d| }|gS(uMap MXNet's Pooling operator attributes to onnx's MaxPool/AveragePool/GlobalMaxPool/GlobalAveragePool operators based on the input node's attributes and return the created node. u proc_nodesuattrsukernelu pool_typeustrideu global_pooluTrueuinputsu index_lookupiunameupooling_conventionuvalidufulluPooling: ONNX currently doesn't support pooling_convention. This might lead to shape or accuracy issues. https://github.com/onnx/onnx/issues/549upaduMaxPoolumaxu AveragePooluavgu GlobalMaxPooluGlobalAveragePoolR,RERHRFN( RRR R R\R0tloggingtwarningRJRR6RKR,(R;R<RRMRtkernelt pool_typetstridet global_poolRRuRNR,tpooling_conventiontpooling_warningRSt pool_typestglobal_pool_types((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_poolingsF    % !             uexpcK`sut}|d}|d}|d}|d|dd}||j}|jjd|g|gd|}|gS(u`Map MXNet's exp operator attributes to onnx's Exp operator and return the created node. unameu proc_nodesuinputsu index_lookupiuExpR,(RR,R6RK(R;R<RR,RMRCR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_exp s        u_copycK`sut}|d}|d}|d}|d|dd}||j}|jjd|g|gd|}|gS(ugMap MXNet's _copy operator attributes to onnx's Identity operator and return the created node. unameu proc_nodesuinputsu index_lookupiuIdentityR,(RR,R6RK(R;R<RR,RMRCR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_identitys        u LeakyReLUc K`s7t}|d}|d}|d}|d|dd}||j}|d}|jdd} t|jd d } id d 6d d6dd6} | dkr|d|dd} || j} |jj| | d|| gd|gd|}n4|jj| | d|gd|gd|d| }|gS(uMap MXNet's LeakyReLU operator attributes to onnx's Elu/LeakyRelu/PRelu operators based on the input node's attributes and return the created node. unameu proc_nodesuinputsu index_lookupiuattrsuact_typeuleakyuslopeg?uEluueluu LeakyReluuPReluupreluiRCRDR,RX(RR,R RgR6RK(R;R<RR,RMRCR]RNRRRXRtalpha_node_indextalpha_node_name((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_leakyrelu5s2                  usoftmaxc K`st}|d}|d|dd}|d}||}|d}t|jdijdd}|jjd |jg|gd |d |} | gS( uhMap MXNet's softmax operator attributes to onnx's Softmax operator and return the created node. uinputsu index_lookupiu proc_nodesunameuattrsuaxisiuSoftmaxtaxisR,(RRR R6RKR,( R;R<RRCt input_idxRMRNR,Rt softmax_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_softmax[s     $    u SoftmaxOutputc K`st}|d}|d|dd}|d}||}|d}|jjd|jdg|gddd |}|gS( unMap MXNet's SoftmaxOutput operator attributes to onnx's Softmax operator and return the created node. uinputsu index_lookupiu proc_nodesunameuSoftmaxRiR,(RR6RKR( R;R<RRCt input1_idxRMtinput1R,R((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_softmax_outputvs         uConcatc K`st}|d}|d}|d}g|D]}||d|dj^q.}t|jdijdd}|jjd ||gd |d |} | gS( ufMap MXNet's Concat operator attributes to onnx's Concat operator and return the created node. unameuinputsu proc_nodesu index_lookupiuattrsudimiuConcatRR,(RR,RR R6RK( R;R<RR,RCRMtit input_namesRt concat_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_concats    ,$   u transposec K`st}|d}|d|ddd}|d}||j}|jdijdd }|rttttjd|}|jj d |g|gd |d |}n$|jj d |g|gd |}|gS( ulMap MXNet's transpose operator attributes to onnx's Transpose operator and return the created node. unameu index_lookupuinputsiu proc_nodesuattrsuaxesu\d+u TransposetpermR,(( RR,R ttupletmapRRtfindallR6RK( R;R<RR,RRMRNtaxesttranspose_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_transposes(    !      uLRNc K`s t}|d}|d|ddd}|d}||j}|d}d|krjt|dnd}d |krt|d nd } d |krt|d nd } t|d } |jjdd|gd|gd|d|d| d| d| } | gS(u`Map MXNet's LRN operator attributes to onnx's LRN operator and return the created node. unameu index_lookupuinputsiu proc_nodesuattrsualphag-C6?ubetag?uknormg?unsizeuLRNRCRDR,RXRYtbiastsize(RR,RgRR6RK( R;R<RR,RRMRNRRXRYRRtlrn_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_lrns(     """    uL2Normalizationc K`st}|d}|d|ddd}|d|j}|d}|jdd}|d krutd n|jjd |g|gd d d|}|gS(uxMap MXNet's L2Normalization operator attributes to onnx's LpNormalization operator and return the created node. unameu index_lookupuinputsiu proc_nodesuattrsumodeuinstanceuchannelu)ONNX currently supports channel mode onlyuLpNormalizationRiR,(RR,R RR6RK( R;R<RR,tinput_idR`RRt l2norm_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_l2normalizations       uDropoutc K`st}|d}|d|ddd}|d|j}|d}t|d}|jjd|g|gd |d |}|gS( uhMap MXNet's Dropout operator attributes to onnx's Dropout operator and return the created node. unameu index_lookupuinputsiu proc_nodesuattrsupuDropouttratioR,(RR,RgR6RK( R;R<RR,RR`Rt probabilityt dropout_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_dropouts      uFlattencK`sot}|d}|d|ddd}|d}||j}|jjd|g|gd|}|gS(uhMap MXNet's Flatten operator attributes to onnx's Flatten operator and return the created node. unameu index_lookupuinputsiu proc_nodesuFlattenR,(RR,R6RK(R;R<RR,RRMRNt flatten_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_flattens       uclipc K`st}|d}|d|ddd}|d}||j}|d}tj|jdtj }tj|jdtj} |jjd |g|gd |d |d | } | gS( ubMap MXNet's Clip operator attributes to onnx's Clip operator and return the created node. unameu index_lookupuinputsiu proc_nodesuattrsua_minua_maxuClipR,tmintmax(RR,R4RgR tinfR6RK( R;R<RR,RRMRNRta_minta_maxt clip_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_clip#s         c K`st}|d}|d}|d}t|jdijddg}|d|dd}||j} |d } t} x| D]} | j| kr|d kr|jj| |d} n{|d kr|jj| |d} nR|d kr|jj| |d} n)|d krA|jj| |d} nt} PqqW| tkrtj |}|j j |j }tj |}dt|d}|jj|||}| j|jjd|d|d|d|dt|jj|| |g|gd|}||gS|j j | j }tj | }| t|d}|jj|||}| j|jjd|d|d|d| dt|gSdS(u0Helper function for scalar arithmetic operationsunameu proc_nodesuinputsuattrsuscalariu index_lookupiu initializeruMuluSubuAdduDivu scalar_opuidxR,R-RR.R/N(RRgR R,R\t numpy_helpertto_arrayR0R4tarrayR1R2R3R5R R6R7R&R8RK(R;RR<RR,RMRCt scalar_valuet input_name_idRNR>tflagRtnew_initializerR?R-Rtscalar_op_nameR@tmul_nodet new_a_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytscalar_op_helper<sh    '                 u _mul_scalarcK`st|d|S(uMap MXNet's _mul_scalar operator attributes to onnx's Mul operator. Creates a new node for the input scalar value, adds it to the initializer and return multiple created nodes. uMul(R(R;R<((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_mul_scalarsu _minus_scalarcK`st|d|S(uMap MXNet's _minus_scalar operator attributes to onnx's Minus operator. Creates a new node for the input scalar value, adds it to the initializer and return multiple created nodes. uSub(R(R;R<((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_minus_scalarsu _plus_scalarcK`st|d|S(uMap MXNet's _plus_scalar operator attributes to onnx's Add operator. Creates a new node for the input scalar value, adds it to the initializer and return multiple created nodes. uAdd(R(R;R<((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_add_scalarsu _div_scalarcK`st|d|S(uMap MXNet's _div_scalar operator attributes to onnx's Div operator. Creates a new node for the input scalar value, adds it to the initializer and return multiple created nodes. uDiv(R(R;R<((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_div_scalarsuargmaxc K`st}|d}|d}|d|dd}||j}|d}|d}t|jd} d|krt|jdnd } |jjd d |gd | d | d|gd|}|gS(ufMap MXNet's argmax operator attributes to onnx's ArgMax operator and return the created node. u proc_nodesuinputsu index_lookupiunameuattrsuaxisukeepdimsiuArgMaxRCRtkeepdimsRDR,(RR,RR R6RK( R;R<RRMRRuRNR,RRR((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_argmaxs"      '    uargminc K`st}|d}|d}|d|dd}||j}|d}|d}t|jd} d|krt|jdnd } |jjd d |gd | d | d|gd|}|gS(ufMap MXNet's argmin operator attributes to onnx's ArgMin operator and return the created node. u proc_nodesuinputsu index_lookupiunameuattrsuaxisukeepdimsiuArgMinRCRRRDR,(RR,RR R6RK( R;R<RRMRRuRNR,RRR((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_argmins"      '    u_maximumc K`st}|d}|d}g}x4|D],}|d|d}|j||jq*W|d}|jjdd|d|gd |}|gS( ueMap MXNet's _maximum operator attributes to onnx's Max operator and return the created node. u proc_nodesuinputsu index_lookupiunameuMaxRCRDR,(RR&R,R6RK( R;R<RRMRtinput_node_listt node_inputtnode_idR,((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_maximums        u_minimumc K`st}|d}|d}g}x4|D],}|d|d}|j||jq*W|d}|jjdd|d|gd |}|gS( ueMap MXNet's _minimum operator attributes to onnx's Min operator and return the created node. u proc_nodesuinputsu index_lookupiunameuMinRCRDR,(RR&R,R6RK( R;R<RRMRRRRR,((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_minimums        uminc K`s4t}|d}|d}|d}|jdijdd}|dk rctt|nd}t|jdijdd}|d|dd} || j} |dk r|jjd d | gd |gd |d |d|}|gS|jjd d | gd |gd |d|}|gSdS(ufMap MXNet's min operator attributes to onnx's ReduceMin operator and return the created node. unameu proc_nodesuinputsuattrsuaxisukeepdimsiu index_lookupu ReduceMinRCRDRRR,N( RR R R+R RR,R6RK( R;R<RR,RMRCtmx_axisRRR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_mins2    $$          umaxc K`s4t}|d}|d}|d}|jdijdd}|dk rctt|nd}t|jdijdd}|d|dd} || j} |dk r|jjd d | gd |gd |d |d|}|gS|jjd d | gd |gd |d|}|gSdS(ufMap MXNet's max operator attributes to onnx's ReduceMax operator and return the created node. unameu proc_nodesuinputsuattrsuaxisukeepdimsiu index_lookupu ReduceMaxRCRDRRR,N( RR R R+R RR,R6RK( R;R<RR,RMRCRRRR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_max@s2    $$          umeanc K`s4t}|d}|d}|d}|jdijdd}|dk rctt|nd}t|jdijdd}|d|dd} || j} |dk r|jjd d | gd |gd |d |d|}|gS|jjd d | gd |gd |d|}|gSdS(uhMap MXNet's mean operator attributes to onnx's ReduceMean operator and return the created node. unameu proc_nodesuinputsuattrsuaxisukeepdimsiu index_lookupu ReduceMeanRCRDRRR,N( RR R R+R RR,R6RK( R;R<RR,RMRCRRRR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_meanis2    $$          uprodc K`s4t}|d}|d}|d}|jdijdd}|dk rctt|nd}t|jdijdd}|d|dd} || j} |dk r|jjd d | gd |gd |d |d|}|gS|jjd d | gd |gd |d|}|gSdS(uhMap MXNet's prod operator attributes to onnx's ReduceProd operator and return the created node. unameu proc_nodesuinputsuattrsuaxisukeepdimsiu index_lookupu ReduceProdRCRDRRR,N( RR R R+R RR,R6RK( R;R<RR,RMRCRRRR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_prods2    $$          u elemwise_addc K`st}|d}|d}|d}|d|dd}|d|dd}||j}||j} |jjd|| g|gd|} | gS( uiMap MXNet's elemwise_add operator attributes to onnx's Add operator and return the created node. unameu proc_nodesuinputsu index_lookupiiuAddR,(RR,R6RK( R;R<RR,RMRCtinput_node_a_idtinput_node_b_idRRtadd_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_elementwise_adds          u broadcast_addc K`st}|d}|d}|d}|d|dd}|d|dd}||j}||j} |jjd|| g|gd|} | gS( ujMap MXNet's broadcast_add operator attributes to onnx's Add operator and return the created node. unameu proc_nodesuinputsu index_lookupiiuAddR,(RR,R6RK( R;R<RR,RMRCRRRRR((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytcovert_broadcast_adds          u elemwise_subc K`st}|d}|d}|d}|d|dd}|d|dd}||j}||j} |jjd|| g|gd|} | gS( uiMap MXNet's elemwise_sub operator attributes to onnx's Sub operator and return the created node. unameu proc_nodesuinputsu index_lookupiiuSubR,(RR,R6RK( R;R<RR,RMRCRRRRtsub_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_elementwise_subs          u broadcast_subc K`st}|d}|d}|d}|d|dd}|d|dd}||j}||j} |jjd|| g|gd|} | gS( ujMap MXNet's broadcast_sub operator attributes to onnx's Sub operator and return the created node. unameu proc_nodesuinputsu index_lookupiiuSubR,(RR,R6RK( R;R<RR,RMRCRRRRR((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytcovert_broadcast_sub s          u elemwise_mulc K`st}|d}|d}|d}|d|dd}|d|dd}||j}||j} |jjd|| g|gd|} | gS( uiMap MXNet's elemwise_mul operator attributes to onnx's Mul operator and return the created node. unameu proc_nodesuinputsu index_lookupiiuMulR,(RR,R6RK( R;R<RR,RMRCRRRRR((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_elemwise_mul#s          u broadcast_mulc K`st}|d}|d}|d}|d|dd}|d|dd}||j}||j} |jjd|| g|gd|} | gS( ujMap MXNet's broadcast_mul operator attributes to onnx's Mul operator and return the created node. unameu proc_nodesuinputsu index_lookupiiuMulR,(RR,R6RK( R;R<RR,RMRCRRRRR((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_broadcast_mul<s          u elemwise_divc K`st}|d}|d}|d}|d|dd}|d|dd}||j}||j} |jjd|| g|gd|} | gS( uiMap MXNet's elemwise_div operator attributes to onnx's Div operator and return the created node. unameu proc_nodesuinputsu index_lookupiiuDivR,(RR,R6RK( R;R<RR,RMRCRRRRtdiv_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_elemwise_divVs          u broadcast_divc K`st}|d}|d}|d}|d|dd}|d|dd}||j}||j} |jjd|| g|gd|} | gS( ujMap MXNet's broadcast_div operator attributes to onnx's Div operator and return the created node. unameu proc_nodesuinputsu index_lookupiiuDivR,(RR,R6RK( R;R<RR,RMRCRRRRR((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_broadcast_divps          unegativec K`sut}|d}|d}|d}|d|dd}||j}|jjd|g|gd|}|gS(ueMap MXNet's negative operator attributes to onnx's Neg operator and return the created node. unameu proc_nodesuinputsu index_lookupiuNegR,(RR,R6RK( R;R<RR,RMRCR]RNtneg_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_negatives        uabsc K`sut}|d}|d}|d}|d|dd}||j}|jjd|g|gd|}|gS(u`Map MXNet's abs operator attributes to onnx's Abs operator and return the created node. unameu proc_nodesuinputsu index_lookupiuAbsR,(RR,R6RK( R;R<RR,RMRCR]RNtabs_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_abss        uadd_nc K`st}|d}|d}|d}g}x.|D]&}|j||d|djq4W|jjd||gd|}|gS(ubMap MXNet's add_n operator attributes to onnx's Sum operator and return the created node. unameu proc_nodesuinputsu index_lookupiuSumR,(RR&R,R6RK( R;R<RR,RMRCt input_listt input_valtsum_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_addns     $   uceilcK`sut}|d}|d}|d}|d|dd}||j}|jjd|g|gd|}|gS(ubMap MXNet's ceil operator attributes to onnx's Ceil operator and return the created node. unameu proc_nodesuinputsu index_lookupiuCeilR,(RR,R6RK(R;R<RR,RMRCR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_ceils        ufloorcK`sut}|d}|d}|d}|d|dd}||j}|jjd|g|gd|}|gS(udMap MXNet's floor operator attributes to onnx's Floor operator and return the created node. unameu proc_nodesuinputsu index_lookupiuFloorR,(RR,R6RK(R;R<RR,RMRCR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_floors        uReshapec K`snt}|d}|d}|d}|d}t|d}|d}tj|} |jj| j} tj| } dt|d} |j j | | | } |j |j j d | d | d | d |d t |d|dd}||j}dddg}x,|D]$}||krtd|qqW|j jd|| g|gd |}| |gS(uMap MXNet's Reshape operator attributes to onnx's Reshape operator. Converts output shape attribute to output shape tensor and return multiple created nodes. unameu proc_nodesuinputsuattrsushapeu initializerureshape_attr_tensoruidxR,R-RR.R/u index_lookupiiiiu!Shape value not supported in ONNXuReshape(RR+R4RR1R2R3R5R R6R7R&R8R0R,RRK(R;R<RR,RMRCRtoutput_shape_listR>toutput_shape_npR-Rtoutput_shape_nameR@Rutinput_node_nametnot_supported_shapeR*t reshape_node((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_reshapes>               uCastc K`st}|d}|d}|d}|dd}|dkrJd}n|dkr_d }n|d |d d }||j}|jjd |g|gd t|j|jd|}|gS(ubMap MXNet's Cast operator attributes to onnx's Cast operator and return the created node. unameu proc_nodesuinputsuattrsudtypeufloat32ufloatufloat64udoubleu index_lookupiuCastttoR,(RR,R6RKtgetattrt TensorPrototupper( R;R<RR,RMRCR3R]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_cast.s$            u slice_axisc K`st}|d}|d}|d}t|dd}t|dd}|dddkrrtd nt|dd}|d |d d } || j} |jjd | g|gd |gd|gd|gd|}|gS(uiMap MXNet's slice_axis operator attributes to onnx's Slice operator and return the created node. unameu proc_nodesuinputsuattrsuaxisubeginuenduNoneu6Slice: ONNX doesnt't support 'None' in 'end' attributeu index_lookupiuSliceRtstartstendsR,(RRt ValueErrorR,R6RK( R;R<RR,RMRCRRRR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_slice_axisNs(           u SliceChannelc K`s\t}|d}|d}|d}t|jdid}t|jdijdd}t|jdijdd }|d |d d } || j} |dkr|dkr|jjd | g|gd |gd |}|gS|d krL|dkrL|jjd| g|gd|d|gd |}|gStddS(uMap MXNet's SliceChannel operator attributes to onnx's Squeeze or Split operator based on squeeze_axis attribute and return the created node. unameu proc_nodesuinputsuattrsu num_outputsuaxisiu squeeze_axisiu index_lookupuSqueezeRR,uSplitRR#uQSliceChannel operator with num_outputs>1 andsqueeze_axis true is not implemented.N(RRR R,R6RKtNotImplementedError( R;R<RR,RMRCt num_outputsRt squeeze_axisR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_slice_channelms6    $$         u expand_dimsc K`st}|d}|d}|d}t|dd}|d|dd}||j}|jjd|g|gd |gd |}|gS( unMap MXNet's expand_dims operator attributes to onnx's Unsqueeze operator and return the created node. unameu proc_nodesuinputsuattrsuaxisu index_lookupiu UnsqueezeRR,(RRR,R6RK( R;R<RR,RMRCRR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_expand_dimss         usqueezec K`st}|d}|d}|d}d|dkrNt|dd}n td|d|dd}||j}|jjd |g|gd |d |}|gS( uhMap MXNet's squeeze operator attributes to onnx's squeeze operator and return the created node. unameu proc_nodesuinputsuaxisuattrsuYMissing axis attribute: ONNX currently requires axis to be specified for squeeze operatoru index_lookupiuSqueezeRR,(RR+RR,R6RK( R;R<RR,RMRCRR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_squeezes          ulogcK`sut}|d}|d}|d}|d|dd}||j}|jjd|g|gd|}|gS(u`Map MXNet's log operator attributes to onnx's Log operator and return the created node. unameu proc_nodesuinputsu index_lookupiuLogR,(RR,R6RK(R;R<RR,RMRCR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_logs        u reciprocalcK`sut}|d}|d}|d}|d|dd}||j}|jjd|g|gd|}|gS(unMap MXNet's reciprocal operator attributes to onnx's Reciprocal operator and return the created node. unameu proc_nodesuinputsu index_lookupiu ReciprocalR,(RR,R6RK(R;R<RR,RMRCR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_reciprocals        u_powerc K`st}|d}|d}|d}|d|dd}|d|dd}||j}||j} |jjd|| g|gdd }|gS( ucMap MXNet's _power operator attributes to onnx's Pow operator and return the created node. unameu proc_nodesuinputsu index_lookupiiuPowR,N(RR,R6RKR ( R;R<RR,RMRCRRRR((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_powers          usqrtcK`sut}|d}|d}|d}|d|dd}||j}|jjd|g|gd|}|gS(ubMap MXNet's sqrt operator attributes to onnx's Sqrt operator and return the created node. unameu proc_nodesuinputsu index_lookupiuSqrtR,(RR,R6RK(R;R<RR,RMRCR]RN((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt convert_sqrt s        udepth_to_spacec K`st}|d}|d}|d}|d}|d|dd}||j}t|jdd} |jjd|g|gd | d |}|gS( utMap MXNet's depth_to_space operator attributes to onnx's DepthToSpace operator and return the created node. unameu proc_nodesuinputsuattrsu index_lookupiu block_sizeu DepthToSpacet blocksizeR,(RR,RR R6RK( R;R<RR,RMRCRR]RNtblksize((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_depthtospace!s         uspace_to_depthc K`st}|d}|d}|d}|d}|d|dd}||j}t|jdd} |jjd|g|gd | d |}|gS( utMap MXNet's space_to_depth operator attributes to onnx's SpaceToDepth operator and return the created node. unameu proc_nodesuinputsuattrsu index_lookupiu block_sizeu SpaceToDepthRR,(RR,RR R6RK( R;R<RR,RMRCRR]RNR ((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pytconvert_spacetodepth:s         (Xt__doc__t __future__RRRRRRtnumpyR4t export_onnxRtmx_opRR RR"R+tregisterRBRWRcRtRvRwRxRyRzR{R|R}R~RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRR!R"(((sk/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/contrib/onnx/mx2onnx/_op_translations.pyt5s       /"/*+ 4d6&  J    )))*2 )