@@ -11,10 +11,17 @@ function TruncationStrategy(; atol=nothing, rtol=nothing, maxrank=nothing)
1111 if isnothing(maxrank) && isnothing(atol) && isnothing(rtol)
1212 return NoTruncation()
1313 elseif isnothing(maxrank)
14- @assert isnothing(rtol) " TODO: rtol"
15- return trunctol(atol)
14+ atol = @something atol 0
15+ rtol = @something rtol 0
16+ return TruncationKeepAbove(atol, rtol)
1617 else
17- return truncrank(maxrank)
18+ if isnothing(atol) && isnothing(rtol)
19+ return truncrank(maxrank)
20+ else
21+ atol = @something atol 0
22+ rtol = @something rtol 0
23+ return truncrank(maxrank) & TruncationKeepAbove(atol, rtol)
24+ end
1825 end
1926end
2027
@@ -82,6 +89,20 @@ Truncation strategy to discard the values that are larger than `atol` in absolut
8289"""
8390truncabove(atol) = TruncationKeepFiltered(≤ (atol) ∘ abs)
8491
92+ """
93+ TruncationComposition(trunc1::TruncationStrategy, trunc2::TruncationStrategy)
94+
95+ Compose two truncation strategies, keeping values common between the two strategies.
96+ """
97+ struct TruncationComposition{T1<: TruncationStrategy ,T2<: TruncationStrategy } < :
98+ TruncationStrategy
99+ trunc1:: T1
100+ trunc2:: T2
101+ end
102+ function Base.:& (trunc1:: TruncationStrategy , trunc2:: TruncationStrategy )
103+ return TruncationComposition(trunc1, trunc2)
104+ end
105+
85106# truncate!
86107# ---------
87108# Generic implementation: `findtruncated` followed by indexing
@@ -147,6 +168,12 @@ function findtruncated(values::AbstractVector, strategy::TruncationKeepAbove)
147168 return 1 : i
148169end
149170
171+ function findtruncated(values:: AbstractVector , strategy:: TruncationComposition )
172+ ind1 = findtruncated(values, strategy. trunc1)
173+ ind2 = findtruncated(values, strategy. trunc2)
174+ return ind1 ∩ ind2
175+ end
176+
150177"""
151178 TruncatedAlgorithm(alg::AbstractAlgorithm, trunc::TruncationAlgorithm)
152179
0 commit comments