code: def vanilla_lstm(num_hidden, indata, prev_state, param, seqidx, layeridx, is_batchnorm=False, gamma=None, beta=None, name=None):
      
      i2h = mx.sym.FullyConnected(data=indata,
                                  weight=param.i2h_weight,
                                  bias=param.i2h_bias,
                                  num_hidden=num_hidden * 4,
                                  name="t%d_l%d_i2h" % (seqidx, layeridx))
      if is_batchnorm:
          if name is not None:
              i2h = batchnorm(net=i2h, gamma=gamma, beta=beta, name="%s_batchnorm" % name)
          else:
              i2h = batchnorm(net=i2h, gamma=gamma, beta=beta)
      h2h = mx.sym.FullyConnected(data=prev_state.h,
                                  weight=param.h2h_weight,
                                  bias=param.h2h_bias,
                                  num_hidden=num_hidden * 4,
                                  name="t%d_l%d_h2h" % (seqidx, layeridx))
      gates = i2h + h2h
      slice_gates = mx.sym.SliceChannel(gates, num_outputs=4,
                                        name="t%d_l%d_slice" % (seqidx, layeridx))
      in_gate = mx.sym.Activation(slice_gates[0], act_type="sigmoid")
      in_transform = mx.sym.Activation(slice_gates[1], act_type="tanh")
      forget_gate = mx.sym.Activation(slice_gates[2], act_type="sigmoid")
      out_gate = mx.sym.Activation(slice_gates[3], act_type="sigmoid")
      next_c = (forget_gate * prev_state.c) + (in_gate * in_transform)
      next_h = out_gate * mx.sym.Activation(next_c, act_type="tanh")
      return LSTMState(c=next_c, h=next_h)
docs: LSTM Cell symbol