Generator function for batchifying data for learning to execute.

    Yields:
      tuple:
        1. one-hot input tensor, representing programmatic input
        2. one-hot target tensor, the vealuation result.
        3. one-hot decoder target, start symbol added for sequence decoding.
        4. batch size tensor containing integer input sequence lengths.
        5. batch size tensor containing integer output sequence lengths.

def make_batch(self):
    """Generator function for batchifying data for learning to execute.

    Yields:
      tuple:
        1. one-hot input tensor, representing programmatic input
        2. one-hot target tensor, the vealuation result.
        3. one-hot decoder target, start symbol added for sequence decoding.
        4. batch size tensor containing integer input sequence lengths.
        5. batch size tensor containing integer output sequence lengths.
    """
    while True:
      self.reset_data_source()
      obs = np.reshape(self._data_source.flat_data,
                       [self.batch_size, -1])[:, :self._num_steps].T
      target = np.reshape(
          self._data_source.flat_targets,
          [self.batch_size, -1])[:, :self._num_steps_out].T
      start_tokens = np.ndarray([1, self.batch_size], dtype=np.int32)
      start_tokens.fill(self._data_source.start_token[0])
      target_in = np.concatenate((start_tokens, target[:-1, :]), axis=0)
      yield (self._np_one_hot(obs, self._num_steps),
             self._np_one_hot(target, self._num_steps_out),
             self._np_one_hot(target_in, self._num_steps_out),
             self.seq_sizes_in,
             self.seq_sizes_out)