code: def update_inverse(self):
          
          # compute R_k and W_k_inv
          Wk = self._C_k[self._columns, :]
          self._W_k_inv = np.linalg.pinv(Wk)
          self._R_k = np.dot(self._W_k_inv, self._C_k.T)
docs: Recomputes W_k_inv and R_k given the current column selection
  
          When computed, the block matrix inverse W_k_inv will be updated. This is useful when you want to compute
          eigenvalues or get an approximation for the full matrix or individual columns.
          Calling this function is not strictly necessary, but then you rely on the fact that the updates did not
          accumulate large errors. That depends very much on how columns were added. Adding columns with very small
          Schur complement causes accumulation of errors and is more likely to make it necessary to update the inverse.