'Returns (mat, swaps) where `mat` is a row-equivalent matrix
in echelon form and `swaps` is a list of row-swaps performed.'

def _eval_echelon_form(self, iszerofunc, simpfunc):

    (reduced, pivot_cols, swaps) = self._row_reduce(iszerofunc, simpfunc, normalize_last=True, normalize=False, zero_above=False)
    return (reduced, pivot_cols, swaps)
