def test_power_method_opnorm_exceptions(): # Test the exceptions space = odl.rn(2) op = odl.IdentityOperator(space) with pytest.raises(ValueError): # Too small number of iterates power_method_opnorm(op, maxiter=0) with pytest.raises(ValueError): # Negative number of iterates power_method_opnorm(op, maxiter=-5) with pytest.raises(ValueError): # Input vector is zero power_method_opnorm(op, maxiter=2, xstart=space.zero()) with pytest.raises(ValueError): # Input vector in the nullspace op = odl.MatVecOperator([[0., 1.], [0., 0.]]) power_method_opnorm(op, maxiter=2, xstart=op.domain.one()) with pytest.raises(ValueError): # Uneven number of iterates for non square operator op = odl.MatVecOperator([[1., 2., 3.], [4., 5., 6.]]) power_method_opnorm(op, maxiter=1, xstart=op.domain.one())
def test_power_method_opnorm_exceptions(): """Test the exceptions""" space = odl.rn(2) op = odl.IdentityOperator(space) with pytest.raises(ValueError): # Too small number of iterates power_method_opnorm(op, maxiter=0) with pytest.raises(ValueError): # Negative number of iterates power_method_opnorm(op, maxiter=-5) with pytest.raises(ValueError): # Input vector is zero power_method_opnorm(op, maxiter=2, xstart=space.zero()) with pytest.raises(ValueError): # Input vector in the nullspace op = odl.MatrixOperator([[0., 1.], [0., 0.]]) power_method_opnorm(op, maxiter=2, xstart=op.domain.one()) with pytest.raises(ValueError): # Uneven number of iterates for non square operator op = odl.MatrixOperator([[1., 2., 3.], [4., 5., 6.]]) power_method_opnorm(op, maxiter=1, xstart=op.domain.one())
def test_power_method_opnorm_symm(): """Test the power method on a symmetrix matrix operator""" # Test matrix with singular values 1.2 and 1.0 mat = np.array([[0.9509044, -0.64566614], [-0.44583952, -0.95923051]]) op = odl.MatrixOperator(mat) true_opnorm = 1.2 opnorm_est = power_method_opnorm(op, maxiter=100) assert opnorm_est == pytest.approx(true_opnorm, rel=1e-2) # Start at a different point xstart = odl.rn(2).element([0.8, 0.5]) opnorm_est = power_method_opnorm(op, xstart=xstart, maxiter=100) assert opnorm_est == pytest.approx(true_opnorm, rel=1e-2)
def test_power_method_opnorm_symm(): """Test the power method on a symmetrix matrix operator""" # Test matrix with eigenvalues 1 and -2 # Rather nasty case since the eigenvectors are almost parallel mat = np.array([[10, -18], [6, -11]], dtype=float) op = odl.MatrixOperator(mat) true_opnorm = 2 opnorm_est = power_method_opnorm(op) assert opnorm_est == pytest.approx(true_opnorm, rel=1e-2) # Start at a different point xstart = odl.rn(2).element([0.8, 0.5]) opnorm_est = power_method_opnorm(op, xstart=xstart) assert opnorm_est == pytest.approx(true_opnorm, rel=1e-2)
def test_power_method_opnorm_symm(): # Test the power method on a matrix operator # Test matrix with eigenvalues 1 and -2 # Rather nasty case since the eigenvectors are almost parallel mat = np.array([[10, -18], [6, -11]], dtype=float) op = odl.MatVecOperator(mat) true_opnorm = 2 opnorm_est = power_method_opnorm(op) assert almost_equal(opnorm_est, true_opnorm, places=2) # Start at a different point xstart = odl.rn(2).element([0.8, 0.5]) opnorm_est = power_method_opnorm(op, xstart=xstart) assert almost_equal(opnorm_est, true_opnorm, places=2)
def test_power_method_opnorm_symm(): # Test the power method on a matrix operator # Test matrix with eigenvalues 1 and -2 # Rather nasty case since the eigenvectors are almost parallel mat = np.array([[10, -18], [6, -11]], dtype=float) op = odl.MatVecOperator(mat) true_opnorm = 2 opnorm_est = power_method_opnorm(op, niter=10) assert almost_equal(opnorm_est, true_opnorm, places=2) # Start at a different point xstart = odl.Rn(2).element([0.8, 0.5]) opnorm_est = power_method_opnorm(op, niter=10, xstart=xstart) assert almost_equal(opnorm_est, true_opnorm, places=2)
def test_power_method_opnorm_nonsymm(): """Test the power method on a nonsymmetrix matrix operator""" # Singular values 5.5 and 6 mat = np.array([[-1.52441557, 5.04276365], [1.90246927, 2.54424763], [5.32935411, 0.04573162]]) op = odl.MatrixOperator(mat) true_opnorm = 6 # Start vector (1, 1) is close to the wrong eigenvector xstart = odl.rn(2).element([1, 1]) opnorm_est = power_method_opnorm(op, xstart=xstart, maxiter=50) assert opnorm_est == pytest.approx(true_opnorm, rel=1e-2) # Start close to the correct eigenvector, converges very fast xstart = odl.rn(2).element([-0.8, 0.5]) opnorm_est = power_method_opnorm(op, xstart=xstart, maxiter=6) assert opnorm_est == pytest.approx(true_opnorm, rel=1e-2)
def test_power_method_opnorm_nonsymm(): # Test the power method on a matrix operator # Singular values 5.5 and 6 mat = np.array([[-1.52441557, 5.04276365], [1.90246927, 2.54424763], [5.32935411, 0.04573162]]) op = odl.MatrixOperator(mat) true_opnorm = 6 # Start vector (1, 1) is close to the wrong eigenvector opnorm_est = power_method_opnorm(op, maxiter=50) assert almost_equal(opnorm_est, true_opnorm, places=2) # Start close to the correct eigenvector, converges very fast xstart = odl.rn(2).element([-0.8, 0.5]) opnorm_est = power_method_opnorm(op, maxiter=6, xstart=xstart) assert almost_equal(opnorm_est, true_opnorm, places=2)
def test_power_method_opnorm_nonsymm(): # Test the power method on a matrix operator # Singular values 5.5 and 6 mat = np.array([[-1.52441557, 5.04276365], [1.90246927, 2.54424763], [5.32935411, 0.04573162]]) op = odl.MatVecOperator(mat) true_opnorm = 6 # Start vector (1, 1) is close to the wrong eigenvector opnorm_est = power_method_opnorm(op, niter=50) assert almost_equal(opnorm_est, true_opnorm, places=2) # Start close to the correct eigenvector, converges very fast xstart = odl.Rn(2).element([-0.8, 0.5]) opnorm_est = power_method_opnorm(op, niter=5, xstart=xstart) assert almost_equal(opnorm_est, true_opnorm, places=2)