docs: def generate_flat_data(self):
      """Generates batched data in flat numpy arrays.
  
      Raises:
        ValueError: When too many generate calls are required.
      """
      # Construct the string statements.
      all_statements = []
      all_targets = []
      self.sequence_sizes_in = []
      self.sequence_sizes_out = []
      for _ in six.moves.range(self._batch_size):
        length, nest = self.curriculum_obj.fetch()
        seq_size_in = self._max_seq_length
        # Generate batch within max length.
        is_valid_sample = False
        tries_remaining = 10
        while not is_valid_sample:
          value, code = generate_code(length, nest, self._ops)
          tokens_in, seq_size_in = self.tokenize(
              code, self._max_seq_length, self._token_by_char)
          tokens_out, seq_size_out = self.tokenize(
              value, self._max_seq_length, self._token_by_char)
          is_valid_sample = self._max_seq_length >= seq_size_in
          if is_valid_sample:
            self.sequence_sizes_in.append(seq_size_in)
            self.sequence_sizes_out.append(seq_size_out)
          if tries_remaining == 0:
            raise ValueError("Could not generate a sample below the allowable "
                             "maximum, consider reducing either max_length or "
                             "max_nest.")
          else:
            tries_remaining -= 1
        all_statements += tokens_in
        all_targets += tokens_out
      # Store the flattened data.
      self.flat_data = np.array(all_statements, dtype=np.int64)
      self.num_tokens = self.flat_data.shape[0]
      self.flat_targets = np.array(all_targets, dtype=np.int64)
      self.num_tokens_target = self.flat_targets.shape[0]
      self.start_token = np.array(self.tokenize(
          [get_start_token()], 1)[0], dtype=np.int64)
      self.end_token = np.array(self.tokenize(
          [get_end_token()], 1)[0], dtype=np.int64)