ó ùµÈ[c@sFdZddlZddlZddlZddlmZddlmZyddlTWne k rknXddl mZdd l m Z m Z dd l mZmZdd lmZd d ddgZd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd d„Zddd„Zdd„ZdS(sContrib Symbol API of MXNet.iÿÿÿÿNi(tuniform(tSymbol(t*(tsymboli(t_LIBt check_call(t SymbolHandlet_as_list(t AttrScopet rand_zipfiantforeacht while_looptcondc Csêt|tƒs%tdt|ƒƒ‚tj|dƒ}td|d|fddƒ}|jƒdjdƒ|}|jdƒ}|d|d jƒ|}||}|jdƒ}|d|d jƒ|} | |} ||| fS( séDraw random samples from an approximately log-uniform or Zipfian distribution. This operation randomly samples *num_sampled* candidates the range of integers [0, range_max). The elements of sampled_candidates are drawn with replacement from the base distribution. The base distribution for this operator is an approximately log-uniform or Zipfian distribution: P(class) = (log(class + 2) - log(class + 1)) / log(range_max + 1) This sampler is useful when the true classes approximately follow such a distribution. For example, if the classes represent words in a lexicon sorted in decreasing order of frequency. If your classes are not ordered by decreasing frequency, do not use this op. Additionaly, it also returns the number of times each of the true classes and the sampled classes is expected to occur. Parameters ---------- true_classes : Symbol The target classes in 1-D. num_sampled: int The number of classes to randomly sample. range_max: int The number of possible classes. Returns ------- samples: Symbol The sampled candidate classes in 1-D `int64` dtype. expected_count_true: Symbol The expected count for true classes in 1-D `float64` dtype. expected_count_sample: Symbol The expected count for sampled candidates in 1-D `float64` dtype. Examples -------- >>> true_cls = mx.nd.array([3]) >>> samples, exp_count_true, exp_count_sample = mx.nd.contrib.rand_zipfian(true_cls, 4, 5) >>> samples [1 3 3 3] >>> exp_count_true [ 0.12453879] >>> exp_count_sample [ 0.22629439 0.12453879 0.12453879 0.12453879] sunexpected type %siitshapetdtypetfloat64tint64g@gð?( t isinstanceRtAssertionErrorttypetmathtlogRtexptastype( t true_classest num_sampledt range_maxt log_rangetrandtsampled_classestexpected_prob_truetexpected_count_truetsampled_cls_fp64texpected_prob_sampledtexpected_count_sampled((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR 's1%  cCsåt|tjƒrOt|jƒƒ}|dkr6|nd}|gt|ƒfSt|ttfƒstd|t |ƒt t |ƒƒfƒ‚g}g}x=|D]5}t ||ƒ\}}|j |ƒ|j |ƒq¢W||fS(Niis9%s must be (nested) list of Symbol, but got %s of type %s(RRRtlent list_outputstinttlistttupleRtstrRt_flattentextendtappend(targst inout_strtlengthtflattfmtstitargtfmt((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR)hs%  cCs¿t|tƒr?|dkr-|d|dfS|| ||fSt|ttfƒs|tdt|ƒtt|ƒƒfƒ‚g}x0|D](}t||ƒ\}}|j|ƒq‰W||fS(Niis=output must be (nested) list of Symbol, but got %s of type %s( RR%R&R'RR(Rt_regroupR+(R,R3tretR1tres((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR4zs " cCsdj|j|jdƒƒS(Ns{}-{}t _value_index(tformattnametattr(tsym((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyt_get_sym_uniq_namescCsœtjdƒ}tjtƒƒ}ttj|jtj|ƒtj|ƒƒƒg}x@t |j ƒD]/}t tj ||tƒƒ}|j |ƒqeW|S(Ni(tctypestc_inttPOINTERRRRtMXSymbolGetInputSymbolsthandletbyreftrangetvalueRtcastR+(tsubgt num_handlesthandlestsymsR1ts((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyt_get_graph_inputsscCsœtjdƒ}tjtƒƒ}ttj|jtj|ƒtj|ƒƒƒg}x@t |j ƒD]/}t tj ||tƒƒ}|j |ƒqeW|S(Ni(R=R>R?RRRtMXSymbolCutSubgraphRARBRCRDRRER+(RFRGRHRIR1RJ((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyt _cut_subgraphœscCsxtjjj}|jddƒdkrFdj|dd|gƒ}ntj|cd7<|ttj|dƒ}|S(Nt__subgraph_name__tt$i(Rt_currentRDt_attrtgettjoint_subgraph_namesR((t subgraph_nametattrs((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyt_get_unique_subgraph_name¨s c CsSt|ƒ}t|ƒ}g}|j|ƒ|j|ƒtj|ƒ}g}|jƒ}d„|Dƒ}xd|D]\}|j|ks£|jƒjddƒ|kr¿|jtj j |ƒƒqp|j|ƒqpWxs|D]k} | j|ks| j|ks| jƒjddƒ|kr5|jtj j | ƒƒq×|j| ƒq×Wtj|ƒS(NcSsh|]}|j’qS((R9(t.0to((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pys ½s RNRO( RR*RtGroupt list_inputsR9t list_attrRSR+toptidentity( tsym_outt sym_statesR9t all_outputstgtflat_outtall_input_namest output_namesRZRJ((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyt_construct_subgraph³s&      - cCsgt}t|tƒrBx9|D]}t||ƒst}PqqWnt||ƒ}|sct|ƒ‚dS(N(tTrueRR&tFalseR(tinputstin_typetmsgtis_NDArray_or_listR1((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyt _check_dataÌs  c(Cs×t|dƒ\}}t|tjdƒt|dƒ\}}t|tjdƒt|ƒ}td|ƒ9g|D]}tjt|ƒƒ^qs} t| |ƒ\} } g|D]} tjt| ƒƒ^q°} t| t j |ƒƒ\} } || | ƒ\} }t| dƒ\} }t|dƒ\}}||ksFt dƒ‚t| tjd ƒt|tjd ƒt | ƒ}t |ƒ}||}t | ||ƒ}Wd QXt|ƒ}t|ƒ}t|ƒ}d „|Dƒ}|jƒ}g|D]}t|ƒ^qí}g|D]}t|ƒ^q }d „|Dƒ}|jƒ}|jƒ}t t|ƒƒt |ƒks€t dt|ƒƒ‚g|D] }|^q‡}g}x?|D]7} | |krÑ|j|j| ƒƒq¦t dƒ‚q¦W|j|ƒg}!x?|D]7}"|"|kr&|!j|j|"ƒƒqût dƒ‚qûWg}#xÉ|D]Á}$|$|ksqt d|$t|ƒfƒ‚|$|kr§|j||$ƒ|#j|j|$ƒƒqC|$|krC|$|krC|$|ksÑt ‚|jt j ||$ƒƒ|#j|j|$ƒƒqCqCWtjj|d|d|d|!d|d|#|Œ}%g}&x)t||ƒD]}'|&j|%|'ƒqRWt|&|ƒ\}&} g} x-t|ƒD]}'| j|%|||'ƒq•Wt| |ƒ\} } |&| fS(slRun a for loop with user-defined computation over Symbols on dimension 0. This operator simulates a for loop and body has the computation for an iteration of the for loop. It runs the computation in body on each slice from the input NDArrays. body takes two arguments as input and outputs a tuple of two elements, as illustrated below: out, states = body(data1, states) data1 can be either a symbol or a list of symbols. If data is a symbol, data1 is a symbol. Otherwise, data1 is a list of symbols and has the same size as data. states is a list of symbols and have the same size as init_states. Similarly, out can be either a symbol or a list of symbols, which are concatenated as the first output of foreach; states from the last execution of body are the second output of foreach. foreach can output only output data or states. If a user only wants states, the body function can return ([], states). Similarly, if a user only wants output data, the body function can return (out, []). The computation done by this operator is equivalent to the pseudo code below when the input data is NDArray: states = init_states outs = [] for i in data.shape[0]: s = data[i] out, states = body(s, states) outs.append(out) outs = stack(*outs) Parameters ---------- body : a Python function. Define computation in an iteration. data: a symbol or a list of symbols. The input data. init_states: a Symbol or nested lists of symbols. The initial values of the loop states. name: string. The name of the operator. Returns ------- outputs: a Symbol or nested lists of Symbols. The output data concatenated from the output of all iterations. states: a Symbol or nested lists of Symbols. The loop states in the last iteration. Examples -------- >>> step = lambda data, states: (data + states[0], [states[0] * 2]) >>> data = mx.sym.var('data') >>> states = [mx.sym.var('state')] >>> outs, states = mx.sym.contrib.foreach(step, data, states) s foreach inputs3data should be a symbol or a nested list of symbolssforeach statess:init_states should be a symbol or a nested list of symbolsRNsforeach outputsforeach loop_varss4The input and output loop_vars have different formats<the output should be an NDArray or a nested list of NDArrayssCthe output states should be an NDArray or a nested list of NDArraysNcSsi|]}||j“qS((R9(RYR;((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pys ;s cSs#i|]}||jƒd“qS(i(R$(RYR;((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pys As s4The inputs of the subgraph don't have unique names: s0the data arrays have to be used in the loop bodys1the state arrays have to be used in the loop bodys8The input variable %s can't be found in graph inputs: %st num_outputst num_out_datat in_state_locst in_data_locst remain_locs(R)RnRRRXRtvarR<R4tcopytdeepcopyRR#RgRKRMtkeysR\tsetR(R+tindexR*t _internalt_foreachRC((tbodytdatat init_statesR9t flatten_datatdata_fmttinit_flatten_statestinit_state_fmtR;tin_elest_RJtstatesR`Ratout_fmtt state_fmtRpt num_statesRoRct input_symstcut_symst gin_namest state_namest data_namest cut_var_mapt cut_var_namestsubg_input_namestxt ordered_insRrtdnameRqtsnameRstin_nameR5toutsR1((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR ×sŽ=   ((           !        csBd„}‡fd†}‡fd†}d„}t|dƒ\‰} tˆtjdƒ‡fd†} |dkr‚tdƒ‚n||td ƒ}t|ƒd krµtd ƒ‚n||||d ƒ\} } } }}| d ksìt‚| d ksþt‚||||dƒ\}} } }}| | |ƒ\}\\}}\}}x<t |d ƒD]+\}}|dkrZtd|ƒ‚qZqZWtj j | |d|d|d|d|d| d| |Œ}gt | ƒD]}||^qÒ}t ||ƒ\}}gt | | ƒD]}||^q }t || ƒ\}}||fS(s Run a while loop with user-defined computation and loop condition. This operator simulates a while loop which iterately does customized computation as long as the condition is satisfied. `loop_vars` is a Symbol or nested lists of Symbols on which the computation uses. `cond` is a user-defined function, used as the loop condition. It consumes `loop_vars`, and produces a scalar MXNet symbol, indicating the termination of the loop. The loop ends when `cond` returns false (zero). The `cond` is variadic, and its signature should be `cond(*loop_vars) => Symbol`. `func` is a user-defined function, used as the loop body. It also consumes `loop_vars`, and produces `step_output` and `new_loop_vars` at each step. In each step, `step_output` should contain the same number elements. Through all steps, the i-th element of `step_output` should have the same shape and dtype. Also, `new_loop_vars` should contain the same number of elements as `loop_vars`, and the corresponding element should have the same shape and dtype. The `func` is variadic, and its signature should be `func(*loop_vars) => (Symbol or nested List[Symbol] step_output, Symbol or nested List[Symbol] new_loop_vars)`. `max_iterations` is a scalar that defines the maximum number of iterations allowed. This function returns two lists. The first list has the length of `|step_output|`, in which the i-th element are all i-th elements of `step_output` from all steps, stacked along axis 0. The second list has the length of `|loop_vars|`, which represents final states of loop variables. .. warning:: For now, the axis 0 of all Symbols in the first list are `max_iterations`, due to lack of dynamic shape inference. .. warning:: Even if `cond` is never satisfied, while_loop returns a list of outputs with inferred dtype and shape. This is different from the Symbol version, where in this case `step_outputs` are assumed as an empty list. Parameters ---------- cond: a Python function. The loop condition. func: a Python function. The loop body. loop_vars: a Symbol or nested lists of Symbol. The initial values of the loop variables. max_iterations: a python int. Maximum number of iterations. Returns ------ outputs: a Symbol or nested lists of Symbols stacked output from each step states: a Symbol or nested lists of Symbols final state Examples -------- >>> cond = lambda i, s: i <= 5 >>> func = lambda i, s: ([i + s], [i + 1, s + i]) >>> loop_vars = (mx.sym.var('i'), mx.sym.var('s')) >>> outputs, states = mx.sym.contrib.while_loop(cond, func, loop_vars, max_iterations=10) cSsUt|dƒr|jƒ}ny||ƒ}Wn td||jfƒ‚nX|S(sxConverts "inputs", possibly typed mxnet NDArray, a numpy ndarray, other python types, to the given type tasscalarsCannot convert %s to python %s(thasattrR—t ValueErrort__name__(Rjttype_R9((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyt_to_python_scalarÁscs=ˆ|Œ}t|tƒs*tdƒ‚ng|gggfS(NsReturn of cond must be a Symbol(RRR™(t loop_varstresult(R (sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyt _cond_wrapperÍs csÙˆ|Œ\}}|dkr'g}n|dkr<g}nt|tƒrZt|ƒ}nt|tƒrxt|ƒ}nt|dƒ\}}t|dƒ\}}t|ƒt|ƒkrÉtdƒ‚n||||fS(sÜThis wrapper unifies "func: loop_vars -> new_loop_vars" and "func: loop_vars -> (step_output, new_loop_vars)" into "func: loop_vars -> (list of step_outputs, tuple of new_loop_vars) s while outputswhile loop_varss<The number of loop_vars should be consistent during the loopN(tNoneRR'R&R)R#R™(Rt step_outputt new_loop_varsR†tvar_fmt(tfunc(sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyt _func_wrapperÓs    c s,tˆƒ‰tdˆƒüt|dƒ\}}g|D]}tjt|ƒƒ^q8}t||ƒ\}}||ƒ\}}} }t|ƒ} t|ƒt|ƒ} tj||ƒj ƒ‰‡fd†‰‡fd†‰‡‡fd†} tjt t | ||ƒƒƒ} WdQX| | | | |fS(NRNswhile loop_varscs |jˆkS(N(R9(R‘(Re(sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pytùscs|jƒjddƒˆkS(NRNRO(R]RS(R‘(RV(sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR¦úscs-ˆ|ƒsˆ|ƒ r)tjj|ƒS|S(N(RR^R_(R‘(tin_graphtin_input(sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR¦ûs)( RXRR)RRtR<R4R#R[R\R&tmap(t graph_varst graph_funcRVR£R;tnew_graph_varsR„toutputst final_stateR†RpRot make_identitytgraph((ReR§R¨RVsT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyt_create_subgraphès ( (swhile loop_varss8loop_vars should be a symbol or a nested list of symbolscsÕg}g}i}x¶|D]®}d„ˆDƒ}d„t|ƒDƒ}d„t|ƒDƒ}d„tˆƒDƒ}g} dgtˆƒ} |jƒ} tt| ƒƒt| ƒksÊtdt| ƒƒ‚xç| D]ß} | |ksét‚| |kr|| } n,| |kr|| } ntj || ƒ} t | ƒ|krS|t | ƒ}n)t|ƒ}|j | ƒ||t | ƒ<| j |ƒ| |krÑt| ƒd| || s cSs#i|]}||jƒd“qS(i(R$(RYR;((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pys s cSsi|]}||j“qS((R9(RYR;((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pys s cSs%i|]\}}|t|ƒ“qS((R<(RYR1R;((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pys s iÿÿÿÿs4The inputs of the subgraph don't have unique names: i( RMRKt enumerateR#R\RxRR(RuRvtidR+(tgraphsRjtlocstinput_id_to_locR°tname_to_loop_varstname_to_cut_g_symstname_to_input_symstname_to_var_locst input_locstvar_locsRR9R;tloc(tflatten_loop_vars(sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyt _union_inputss<  !         s"max_iterations should be specifiedt max_iterationis-loop_vars should contain at least one elementt_condit_funciÿÿÿÿs7The %d-th loop_var doesn't involve into the computationtmax_iterationstcond_input_locstfunc_input_locst func_var_locsRpRoN(R)RnRRR R™R%R#RR²Rzt _while_loopRCR4(R R¤RRÃR9RœRŸR¥R±tinit_loop_var_fmtR¿tcond_gRpRoR„tfunc_gR†R‰RÄRÅRÆti_thR½RžR1R­tfinal_loop_vars((R R¾R¤sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR zsFG   / %%'   #&c sDd„}d„}g}||‡fd†|dƒ\}}} |dkr[tdƒ‚n||||dƒ\} } } ||||dƒ\} }} | |kr´td ƒ‚n||| | ƒ\}\}}}tjj|| | d |d |d |d | |Œ}gt| ƒD]}||^q}t|| ƒ\}} |S(s˜Run an if-then-else using user-defined condition and computation This operator simulates a if-like branch which chooses to do one of the two customized computations according to the specified condition. `pred` is a scalar MXNet Symbol, indicating which branch of computation should be used. `then_func` is a user-defined function, used as computation of the then branch. It produces `outputs`, which is a list of Symbols. The signature of `then_func` should be `then_func() => nested List[Symbol]`. `else_func` is a user-defined function, used as computation of the else branch. It produces `outputs`, which is a list of Symbols. The signature of `else_func` should be `else_func() => nested List[Symbol]`. The `outputs` produces by `then_func` and `else_func` should have the same number of elements, all of which should be in the same shape, of the same dtype and stype. This function returns a list of symbols, representing the computation result. Parameters ---------- pred: a MXNet Symbol representing a scalar. The branch condition. then_func: a Python function. The computation to be executed if `pred` is true. else_func: a Python function. The computation to be executed if `pred` is false. Returns ------- outputs: a Symbol or nested lists of Symbols, representing the result of computation. Examples -------- >>> a, b = mx.sym.var('a'), mx.sym.var('b') >>> pred = a * b < 5 >>> then_func = lambda: (a + 5) * (b + 5) >>> else_func = lambda: (a - 5) * (b - 5) >>> outputs = mx.sym.contrib.cond(pred, then_func, else_func) c sätˆƒ‰tdˆƒºg|D]}tj|jƒ^q#}||Œ}t|dƒ\}}t|ƒ}tj|ƒjƒ‰‡fd†‰‡fd†‰‡‡fd†}tjt t ||ƒƒƒ} WdQX| ||fS(NRNs cond outputscs |jˆkS(N(R9(R‘(Re(sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR¦”scs|jƒjddƒˆkS(NRNRO(R]RS(R‘(RV(sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR¦•scs-ˆ|ƒsˆ|ƒ r)tjj|ƒS|S(N(RR^R_(R‘(R§R¨(sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR¦–s)( RXRRRtR9R)R#R[R\R&R©( RªR«RVR;R¬R­R†RoR¯R°((ReR§R¨RVsT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR±‡s %  $c WsEg}g}i}x&|D]}d„|Dƒ}d„t|ƒDƒ}d„t|ƒDƒ}g}xÆ|jƒD]¸} | |ks†t‚| |krŸ|| } n,| |kr¸|| } ntj|| ƒ} t| ƒ|krð|t| ƒ} n)t|ƒ} |j| ƒ| |t| ƒ<|j| ƒqnW|j|ƒqW||fS(NcSsi|]}||j“qS((R9(RYR;((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pys §s cSs#i|]}||jƒd“qS(i(R$(RYR;((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pys ©s cSsi|]}||j“qS((R9(RYR;((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pys «s ( RMRKR\RRuRvR³R#R+( R´RjRµR¶R°tname_to_input_varsR¸R¹R»R9R;R½((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR¿›s.       csˆS(N(((tpred(sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR¦Ãst_predis%pred should always be a single outputt_thent_elses=Number of outputs differs between then-branch and else-branchRÄtthen_input_locstelse_input_locsRo(R™RRzRÁRCR4(RÎt then_funct else_funcR9R±R¿RjRÉtcond_num_outputsR„tthen_gtthen_num_outputstthen_fmttelse_gtelse_num_outputsR‰RÄRÒRÓRžR1R­((RÎsT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyR Ys,.  &(  !  #( t__doc__RR=RutrandomRRRt gen_contribt ImportErrorROtbaseRRRRt attributeRt__all__R R)R4R<RKRMRXRgRnR R R R (((sT/usr/local/lib/python2.7/site-packages/mxnet-1.3.1-py2.7.egg/mxnet/symbol/contrib.pyts4     A     £ß