code: def RNN_step(weights, gates):
      
  
      def rnn_step_fwd(prevstate_inputs, drop=0.0):
          prevstate, inputs = prevstate_inputs
          cell_tm1, hidden_tm1 = prevstate
  
          acts, bp_acts = weights.begin_update((inputs, hidden_tm1), drop=drop)
          (cells, hiddens), bp_gates = gates.begin_update((acts, cell_tm1), drop=drop)
  
          def rnn_step_bwd(d_state_d_hiddens, sgd=None):
              (d_cells, d_hiddens), d_hiddens = d_state_d_hiddens
              d_acts, d_cell_tm1 = bp_gates((d_cells, d_hiddens), sgd=sgd)
              d_inputs, d_hidden_tm1 = bp_acts(d_acts, sgd=sgd)
              return (d_cell_tm1, d_hidden_tm1), d_inputs
  
          return ((cells, hiddens), hiddens), rnn_step_bwd
  
      model = wrap(rnn_step_fwd, weights, gates)
      model.nO = weights.nO
      model.nI = weights.nI
      model.weights = weights
      model.gates = gates
      return model
docs: Create a step model for an RNN, given weights and gates functions.