def test_update_cholesky_single(method): X, y = make_test_case(50, 5, 2) E = np.array([True, False, True, False, False]) E_new = np.array([True, False, True, True, False]) L = lasso._compute_cholesky(X, E) L_new, index_new = method(X, L, np.flatnonzero(E), np.flatnonzero(E_new)) L_new_truth = lasso._compute_cholesky(X, E_new) assert np.linalg.norm( lasso._compute_leverage_cholesky(X, L_new, index_new) - lasso._compute_leverage_cholesky(X, L_new_truth, E_new)) < 0.001
def test_update_cholesky_no_order(method): X, y = make_test_case(50, 5, 2) E = np.array([True, False, True, False, False]) E_new = np.array([True, True, True, False, False]) perm = np.array([0, 2, 1, 3, 4]) L = lasso._compute_cholesky(X, E) L_new, index_new = method(X, L, np.flatnonzero(E), np.flatnonzero(E_new)) L_new_truth = lasso._compute_cholesky(X, E_new) L_new_truth_perm = lasso._compute_cholesky(X[:, perm], E_new[perm]) assert np.linalg.norm(np.tril(L_new) - np.tril(L_new_truth_perm)) < 1e-5 assert np.linalg.norm( lasso._compute_leverage_cholesky(X, L_new, index_new) - lasso._compute_leverage_cholesky(X, L_new_truth, E_new)) < 1e-3
def test_update_cholesky_inplace(): X, y = make_test_case(50, 5, 2) E = np.array([True, False, True, True, False]) E_new = np.array([True, True, True, False, False]) L_orig = lasso._compute_cholesky(X, E) L_new_truth = lasso._compute_cholesky(X, E_new) L = np.empty_like(L_new_truth, order='F') L[:L_orig.shape[0], :L_orig.shape[1]] = L_orig L_new, index_new = native_impl.lasso_update_cholesky_w( X, L, np.flatnonzero(E), np.flatnonzero(E_new), overwrite_L=True) assert L_new is L or L_new.base is L assert np.linalg.norm( lasso._compute_leverage_cholesky(X, L_new, index_new) - lasso._compute_leverage_cholesky(X, L_new_truth, E_new)) < 1e-5