to avoid side-effects in case of inplace
  modifications of the input.

Then, if `fit_intercept=True` this preprocessing centers both `X` and `y` as
follows:
    - if `X` is dense, center the data and
    store the mean vector in `X_offset`.
    - if `X` is sparse, store the mean in `X_offset`
    without centering `X`. The centering is expected to be handled by the
    linear solver where appropriate.
    - in either case, always center `y` and store the mean in `y_offset`.
    - both `X_offset` and `y_offset` are always weighted by `sample_weight`
      if not set to `None`.

If `fit_intercept=False`, no centering is performed and `X_offset`, `y_offset`
are set to zero.

Returns
-------
X_out : {ndarray, sparse matrix} of shape (n_samples, n_features)
    If copy=True a copy of the input X is triggered, otherwise operations are
    inplace.
    If input X is dense, then X_out is centered.
y_out : {ndarray, sparse matrix} of shape (n_samples,) or (n_samples, n_targets)
    Centered version of y. Possibly performed inplace on input y depending
    on the copy_y parameter.
X_offset : ndarray of shape (n_features,)
    The mean per column of input X.
y_offset : float or ndarray of shape (n_features,)
X_scale : ndarray of shape (n_features,)
    Always an array of ones. TODO: refactor the code base to make it
    possible to remove this unused variable.
N