Skip to content

Commit a4c4396

Browse files
authored
Delete truncerr (#88)
1 parent 5d8e5ad commit a4c4396

File tree

5 files changed

+5
-196
lines changed

5 files changed

+5
-196
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "TensorAlgebra"
22
uuid = "68bd88dc-f39d-4e12-b2ca-f046b68fcc6a"
33
authors = ["ITensor developers <[email protected]> and contributors"]
4-
version = "0.4.1"
4+
version = "0.4.2"
55

66
[deps]
77
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"

src/MatrixAlgebra.jl

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ export eigen,
1717
svd,
1818
svd!,
1919
svdvals,
20-
svdvals!,
21-
truncerr
20+
svdvals!
2221

2322
using LinearAlgebra: LinearAlgebra, norm
2423
using MatrixAlgebraKit
@@ -143,43 +142,6 @@ end
143142

144143
using MatrixAlgebraKit: MatrixAlgebraKit, TruncationStrategy
145144

146-
struct TruncationError{T<:Real} <: TruncationStrategy
147-
atol::T
148-
rtol::T
149-
p::Int
150-
end
151-
152-
"""
153-
truncerr(; atol::Real=0, rtol::Real=0, p::Int=2)
154-
155-
Create a truncation strategy for truncating such that the error in the factorization
156-
is smaller than `max(atol, rtol * norm)`, where the error is determined using the `p`-norm.
157-
"""
158-
function truncerr(; atol::Real=0, rtol::Real=0, p::Int=2)
159-
return TruncationError(promote(atol, rtol)..., p)
160-
end
161-
162-
function MatrixAlgebraKit.findtruncated(values::AbstractVector, strategy::TruncationError)
163-
Base.require_one_based_indexing(values)
164-
issorted(values; rev=true) || error("Not sorted.")
165-
# norm(values, p) ^ p
166-
normᵖ = sum(Base.Fix2(^, strategy.p) abs, values)
167-
ϵᵖ = max(strategy.atol ^ strategy.p, strategy.rtol ^ strategy.p * normᵖ)
168-
if ϵᵖ normᵖ
169-
return Base.OneTo(0)
170-
end
171-
truncerrᵖ = zero(real(eltype(values)))
172-
rank = length(values)
173-
for i in reverse(eachindex(values))
174-
truncerrᵖ += abs(values[i]) ^ strategy.p
175-
if truncerrᵖ ϵᵖ
176-
rank = i
177-
break
178-
end
179-
end
180-
return Base.OneTo(rank)
181-
end
182-
183145
struct TruncationDegenerate{Strategy<:TruncationStrategy,T<:Real} <: TruncationStrategy
184146
strategy::Strategy
185147
atol::T

test/Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ TestExtras = "5ed8adda-3752-4e41-b88a-e8b09835ee3a"
1616
[compat]
1717
Aqua = "0.8.9"
1818
BlockArrays = "1.6.1"
19-
EllipsisNotation = "1.8.0"
19+
EllipsisNotation = "1.8"
2020
LinearAlgebra = "<0.0.1, 1"
2121
MatrixAlgebraKit = "0.2, 0.3"
2222
Random = "1.10"
2323
SafeTestsets = "0.1"
2424
StableRNGs = "1.0.2"
2525
Suppressor = "0.2"
26-
TensorAlgebra = "0.4.0"
26+
TensorAlgebra = "0.4"
2727
TensorOperations = "5.1.4"
2828
Test = "1.10"
2929
TestExtras = "0.3.1"

test/test_exports.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ using TensorAlgebra: TensorAlgebra
4545
:svd!,
4646
:svdvals,
4747
:svdvals!,
48-
:truncerr,
4948
]
5049
@test issetequal(names(TensorAlgebra.MatrixAlgebra), exports)
5150
end

test/test_matrixalgebra.jl

Lines changed: 1 addition & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using LinearAlgebra: Diagonal, I, diag, isposdef, norm
22
using MatrixAlgebraKit: qr_compact, svd_trunc, truncrank
33
using StableRNGs: StableRNG
4-
using TensorAlgebra.MatrixAlgebra: MatrixAlgebra, truncdegen, truncerr
4+
using TensorAlgebra.MatrixAlgebra: MatrixAlgebra, truncdegen
55
using Test: @test, @testset
66

77
elts = (Float32, Float64, ComplexF32, ComplexF64)
@@ -152,158 +152,6 @@ elts = (Float32, Float64, ComplexF32, ComplexF64)
152152
@test V' * V I
153153
@test MatrixAlgebra.svdvals(A) diag(S)
154154
end
155-
@testset "Truncation" begin
156-
s = Diagonal(real(elt)[1.2, 0.9, 0.3, 0.2, 0.01])
157-
n = length(diag(s))
158-
rng = StableRNG(123)
159-
u, _ = qr_compact(randn(rng, elt, n, n); positive=true)
160-
v, _ = qr_compact(randn(rng, elt, n, n); positive=true)
161-
a = u * s * v
162-
163-
# p = 2, relative = true
164-
ũ, s̃, ṽ = svd_trunc(
165-
a; trunc=truncerr(; rtol=norm([0.3, 0.2, 0.01]) / norm(diag(s)) + 10eps(real(elt)))
166-
)
167-
@test size(ũ) == (n, 2)
168-
@test size(s̃) == (2, 2)
169-
@test size(ṽ) == (2, n)
170-
@test norm(ũ **- a) norm([0.3, 0.2, 0.01])
171-
ũ, s̃, ṽ = svd_trunc(
172-
a; trunc=truncerr(; rtol=norm([0.3, 0.2, 0.01]) / norm(diag(s)) - 10eps(real(elt)))
173-
)
174-
@test size(ũ) == (n, 3)
175-
@test size(s̃) == (3, 3)
176-
@test size(ṽ) == (3, n)
177-
@test norm(ũ **- a) norm([0.2, 0.01])
178-
ũ, s̃, ṽ = svd_trunc(a; trunc=truncerr(; rtol=0))
179-
@test size(ũ) == (n, n)
180-
@test size(s̃) == (n, n)
181-
@test size(ṽ) == (n, n)
182-
@test** a
183-
ũ, s̃, ṽ = svd_trunc(a; trunc=truncerr(; rtol=1))
184-
@test size(ũ) == (n, 0)
185-
@test size(s̃) == (0, 0)
186-
@test size(ṽ) == (0, n)
187-
@test norm(ũ ** ṽ) 0
188-
189-
# p = 2, relative = false
190-
ũ, s̃, ṽ = svd_trunc(
191-
a; trunc=truncerr(; atol=norm([0.3, 0.2, 0.01]) + 10eps(real(elt)))
192-
)
193-
@test size(ũ) == (n, 2)
194-
@test size(s̃) == (2, 2)
195-
@test size(ṽ) == (2, n)
196-
@test norm(ũ **- a) norm([0.3, 0.2, 0.01])
197-
ũ, s̃, ṽ = svd_trunc(
198-
a; trunc=truncerr(; atol=norm([0.3, 0.2, 0.01]) - 10eps(real(elt)))
199-
)
200-
@test size(ũ) == (n, 3)
201-
@test size(s̃) == (3, 3)
202-
@test size(ṽ) == (3, n)
203-
@test norm(ũ **- a) norm([0.2, 0.01])
204-
ũ, s̃, ṽ = svd_trunc(a; trunc=truncerr(; atol=0))
205-
@test size(ũ) == (n, n)
206-
@test size(s̃) == (n, n)
207-
@test size(ṽ) == (n, n)
208-
@test** a
209-
ũ, s̃, ṽ = svd_trunc(
210-
a; trunc=truncerr(; atol=(norm(diag(s)) * (one(real(elt)) + 10eps(real(elt)))))
211-
)
212-
@test size(ũ) == (n, 0)
213-
@test size(s̃) == (0, 0)
214-
@test size(ṽ) == (0, n)
215-
@test norm(ũ ** ṽ) 0
216-
217-
# p = 1, relative = true
218-
ũ, s̃, ṽ = svd_trunc(
219-
a;
220-
trunc=truncerr(;
221-
rtol=(norm([0.3, 0.2, 0.01], 1) / norm(diag(s), 1) + 10eps(real(elt))), p=1
222-
),
223-
)
224-
@test size(ũ) == (n, 2)
225-
@test size(s̃) == (2, 2)
226-
@test size(ṽ) == (2, n)
227-
@test norm(ũ **- a) norm([0.3, 0.2, 0.01])
228-
ũ, s̃, ṽ = svd_trunc(
229-
a;
230-
trunc=truncerr(;
231-
rtol=(norm([0.3, 0.2, 0.01], 1) / norm(diag(s), 1) - 10eps(real(elt))), p=1
232-
),
233-
)
234-
@test size(ũ) == (n, 3)
235-
@test size(s̃) == (3, 3)
236-
@test size(ṽ) == (3, n)
237-
@test norm(ũ **- a) norm([0.2, 0.01])
238-
ũ, s̃, ṽ = svd_trunc(a; trunc=truncerr(; rtol=0, p=1))
239-
@test size(ũ) == (n, n)
240-
@test size(s̃) == (n, n)
241-
@test size(ṽ) == (n, n)
242-
@test** a
243-
ũ, s̃, ṽ = svd_trunc(a; trunc=truncerr(; rtol=1, p=1))
244-
@test size(ũ) == (n, 0)
245-
@test size(s̃) == (0, 0)
246-
@test size(ṽ) == (0, n)
247-
@test norm(ũ ** ṽ) 0
248-
249-
# p = 1, relative = false
250-
ũ, s̃, ṽ = svd_trunc(
251-
a; trunc=truncerr(; atol=(norm([0.3, 0.2, 0.01], 1) + 10eps(real(elt))), p=1)
252-
)
253-
@test size(ũ) == (n, 2)
254-
@test size(s̃) == (2, 2)
255-
@test size(ṽ) == (2, n)
256-
@test norm(ũ **- a) norm([0.3, 0.2, 0.01])
257-
ũ, s̃, ṽ = svd_trunc(
258-
a; trunc=truncerr(; atol=(norm([0.3, 0.2, 0.01], 1) - 10eps(real(elt))), p=1)
259-
)
260-
@test size(ũ) == (n, 3)
261-
@test size(s̃) == (3, 3)
262-
@test size(ṽ) == (3, n)
263-
@test norm(ũ **- a) norm([0.2, 0.01])
264-
ũ, s̃, ṽ = svd_trunc(a; trunc=truncerr(; atol=0, p=1))
265-
@test size(ũ) == (n, n)
266-
@test size(s̃) == (n, n)
267-
@test size(ṽ) == (n, n)
268-
@test** a
269-
ũ, s̃, ṽ = svd_trunc(
270-
a;
271-
trunc=truncerr(; atol=(norm(diag(s), 1) * (one(real(elt)) + 10eps(real(elt)))), p=1),
272-
)
273-
@test size(ũ) == (n, 0)
274-
@test size(s̃) == (0, 0)
275-
@test size(ṽ) == (0, n)
276-
@test norm(ũ ** ṽ) 0
277-
278-
# Specifying both `atol` and `rtol`.
279-
s = Diagonal(real(elt)[0.1, 0.01, 0.001])
280-
n = length(diag(s))
281-
rng = StableRNG(123)
282-
u, _ = qr_compact(randn(rng, elt, n, n); positive=true)
283-
v, _ = qr_compact(randn(rng, elt, n, n); positive=true)
284-
a = u * s * v
285-
286-
ũ, s̃, ṽ = svd_trunc(a; trunc=truncerr(; rtol=0.002))
287-
@test size(ũ) == (n, n)
288-
@test size(s̃) == (n, n)
289-
@test size(ṽ) == (n, n)
290-
@test** a
291-
@test** a rtol = 0.002
292-
293-
ũ, s̃, ṽ = svd_trunc(a; trunc=truncerr(; atol=0.002))
294-
@test size(ũ) == (n, 2)
295-
@test size(s̃) == (2, 2)
296-
@test size(ṽ) == (2, n)
297-
@test norm(ũ **- a) norm([0.001])
298-
@test** a atol = 0.002
299-
300-
ũ, s̃, ṽ = svd_trunc(a; trunc=truncerr(; atol=0.002, rtol=0.002))
301-
@test size(ũ) == (n, 2)
302-
@test size(s̃) == (2, 2)
303-
@test size(ṽ) == (2, n)
304-
@test norm(ũ **- a) norm([0.001])
305-
@test** a atol = 0.002 rtol = 0.002
306-
end
307155
@testset "Truncate degenerate" begin
308156
s = Diagonal(real(elt)[2.0, 0.32, 0.3, 0.29, 0.01, 0.01])
309157
n = length(diag(s))

0 commit comments

Comments
 (0)