code: def chunked_X(self, chunk_size: Optional[int] = None):
          
          if chunk_size is None:
              # Should be some adaptive code
              chunk_size = 6000
          start = 0
          n = self.n_obs
          for _ in range(int(n // chunk_size)):
              end = start + chunk_size
              yield (self.X[start:end], start, end)
              start = end
          if start < n:
              yield (self.X[start:n], start, n)
docs: Return an iterator over the rows of the data matrix :attr:`X`.
  
          Parameters
          ----------
          chunk_size
              Row size of a single chunk.