def test_cholesky(rng): m, n = 100, 100 A = rng.normal(size=(m, n)) b = rng.normal(size=(m, )) x0, _, _, _ = np.linalg.lstsq(A, b) x1, _ = lstsq.Cholesky(transpose=False)(A, b, 0) x2, _ = lstsq.Cholesky(transpose=True)(A, b, 0) assert np.allclose(x0, x1) assert np.allclose(x0, x2)
def test_subsolvers_L2(rng, logger): pytest.importorskip('scipy', minversion='0.11') # version for lsmr ref_solver = lstsq.Cholesky() solvers = [ lstsq.Conjgrad(), lstsq.BlockConjgrad(), lstsq.ConjgradScipy(), lstsq.LSMRScipy() ] A, B = get_system(m=2000, n=1000, d=10, rng=rng) sigma = 0.1 * A.max() with Timer() as t0: x0, _ = ref_solver(A, B, sigma) xs = np.zeros((len(solvers), ) + x0.shape) for i, solver in enumerate(solvers): with Timer() as t: xs[i], info = solver(A, B, sigma) logger.info('solver: %r' % solver) logger.info('duration: %0.3f', t.duration) logger.info('duration relative to reference solver: %0.2f', (t.duration / t0.duration)) logger.info('info: %s', info) for solver, x in zip(solvers, xs): assert np.allclose(x0, x, atol=1e-5, rtol=1e-3), ("Solver %s" % solver.__name__)
def test_scipy_solvers(rng, allclose): pytest.importorskip("scipy", minversion="0.11") # version for lsmr A, b = get_system(1000, 100, 2, rng=rng) sigma = 0.1 * A.max() x0, i0 = lstsq.Cholesky()(A, b, sigma) logging.info("Cholesky rmse=%0.3f", i0["rmses"].mean()) x1, i1 = lstsq.ConjgradScipy()(A, b, sigma) logging.info( "ConjgradScipy rmse=%0.3f, itns=%0.1f (%0.1f)", i1["rmses"].mean(), i1["iterations"].mean(), i1["iterations"].std(), ) x2, i2 = lstsq.LSMRScipy()(A, b, sigma) logging.info( "LSMRScipy rmse=%0.3f, itns=%0.1f (%0.1f)", i2["rmses"].mean(), i2["iterations"].mean(), i2["iterations"].std(), ) assert allclose(x0, x1, atol=2e-5, rtol=1e-3) assert allclose(x0, x2, atol=2e-5, rtol=1e-3)
def test_subsolvers_L2(rng, allclose): pytest.importorskip("scipy", minversion="0.11") # version for lsmr ref_solver = lstsq.Cholesky() solvers = [ lstsq.Conjgrad(), lstsq.BlockConjgrad(), lstsq.ConjgradScipy(), lstsq.LSMRScipy(), ] A, B = get_system(m=2000, n=1000, d=10, rng=rng) sigma = 0.1 * A.max() with Timer() as t0: x0, _ = ref_solver(A, B, sigma) xs = np.zeros((len(solvers), ) + x0.shape) for i, solver in enumerate(solvers): with Timer() as t: xs[i], info = solver(A, B, sigma) logging.info("solver: %r", solver) logging.info("duration: %0.3f", t.duration) logging.info("duration relative to reference solver: %0.2f", (t.duration / t0.duration)) logging.info("info: %s", info) for solver, x in zip(solvers, xs): assert allclose(x0, x, atol=1e-5, rtol=1e-3), f"Solver {solver.__name__}"
def test_conjgrad(rng): A, b = get_system(1000, 100, 2, rng=rng) sigma = 0.1 * A.max() x0, _ = lstsq.Cholesky()(A, b, sigma) x1, _ = lstsq.Conjgrad(tol=1e-3)(A, b, sigma) x2, _ = lstsq.BlockConjgrad(tol=1e-3)(A, b, sigma) assert np.allclose(x0, x1, atol=1e-6, rtol=1e-3) assert np.allclose(x0, x2, atol=1e-6, rtol=1e-3)
def test_scipy_solvers(rng): pytest.importorskip('scipy', minversion='0.11') # version for lsmr A, b = get_system(1000, 100, 2, rng=rng) sigma = 0.1 * A.max() x0, _ = lstsq.Cholesky()(A, b, sigma) x1, _ = lstsq.ConjgradScipy()(A, b, sigma) x2, _ = lstsq.LSMRScipy()(A, b, sigma) assert np.allclose(x0, x1, atol=2e-5, rtol=1e-3) assert np.allclose(x0, x2, atol=2e-5, rtol=1e-3)
def test_subsolvers(Solver, seed, rng, tol=1e-2): get_rng = lambda: np.random.RandomState(seed) A, b = get_system(500, 100, 5, rng=rng) x0, _ = Solver(solver=lstsq.Cholesky())(A, b, rng=get_rng()) subsolvers = [lstsq.Conjgrad, lstsq.BlockConjgrad] for subsolver in subsolvers: x, info = Solver(solver=subsolver(tol=tol))(A, b, rng=get_rng()) rel_rmse = rms(x - x0) / rms(x0) assert rel_rmse < 4 * tol
def test_scipy_solvers(rng, logger): pytest.importorskip('scipy', minversion='0.11') # version for lsmr A, b = get_system(1000, 100, 2, rng=rng) sigma = 0.1 * A.max() x0, i0 = lstsq.Cholesky()(A, b, sigma) logger.info("Cholesky rmse=%0.3f" % (i0['rmses'].mean(),)) x1, i1 = lstsq.ConjgradScipy()(A, b, sigma) logger.info("ConjgradScipy rmse=%0.3f, itns=%0.1f (%0.1f)" % ( i1['rmses'].mean(), i1['iterations'].mean(), i1['iterations'].std())) x2, i2 = lstsq.LSMRScipy()(A, b, sigma) logger.info("LSMRScipy rmse=%0.3f, itns=%0.1f (%0.1f)" % ( i2['rmses'].mean(), i2['iterations'].mean(), i2['iterations'].std())) assert np.allclose(x0, x1, atol=2e-5, rtol=1e-3) assert np.allclose(x0, x2, atol=2e-5, rtol=1e-3)