BBt_solve = trn.BBt_solver()
mu = 100.0
phi_map2 = salsa.l1_proximity_map(1, mu)
x2, u2 = salsa.bp_salsa(
    B, Bt, BBt_solve, tst_col, phi1, phi_map2, n_iter=400, x0=x0,
    verbose=True, save_sol=True, rtol=1e-6
    )
# C-SALSA
# let phi_map be the same as above
# make a new solver for (BtB + I)
eps = 1e-5
BtBpI_solve = trn.BtBpI_solver(mu=1)
phi_map2 = salsa.l1_proximity_map(1, 10.)
x3, u3 = salsa.c_salsa(
    B, Bt, BtBpI_solve, tst_col, eps, phi1, phi_map2, n_iter=400,
    x0=x0, verbose=True, save_sol=True, rtol=1e-6
    )

# see how much u is changing
du1 = np.diff(u1, axis=0)
du2 = np.diff(u2, axis=0)
du3 = np.diff(u3, axis=0)
ndu1 = np.array([np.linalg.norm(du) for du in du1])
ndu2 = np.array([np.linalg.norm(du) for du in du2])
ndu3 = np.array([np.linalg.norm(du) for du in du3])
del du1, du2, du3
# resids
r1 = B*u1.T - tst_col[:,None]
r1 = np.sqrt((r1**2).sum(axis=0))
r2 = B*u2.T - tst_col[:,None]
r2 = np.sqrt((r2**2).sum(axis=0))
# quadratic + l1 regularize SALSA
x1, u1 = salsa.qreg_salsa(
    A, At, AtA_solve, tst_col, phi1, phi_map1, mu,
    x0=mmse_x, rtol=1e-4, save_sol=True, n_iter=200
    )

# C-SALSA
# let phi_map be the same as above
# make a new solver for (BtB + I)
AtApI_solve = trn.AtApI_solver(mu=1)
mu2 = float(n) / len(cls_cols)
mu2 = 15.
phi_map2 = salsa.l1_proximity_map(1, n)
eps = 5e-3
x2, u2 = salsa.c_salsa(
    A, At, AtApI_solve, tst_col, eps, phi1, phi_map2,
    x0=mmse_x, rtol=1e-4, n_iter=400, save_sol=True
    )

# see how much u is changing
du1 = np.diff(u1, axis=0)
du2 = np.diff(u2, axis=0)
ndu1 = np.array([np.linalg.norm(du) for du in du1])
ndu2 = np.array([np.linalg.norm(du) for du in du2])
del du1, du2
# resids
r1 = A*u1.T - tst_col[:,None]
r1 = np.sqrt((r1**2).sum(axis=0))
r2 = A*u2.T - tst_col[:,None]
r2 = np.sqrt((r2**2).sum(axis=0))
# L1 norm
p1 = np.sum(np.abs(u1), axis=1)