Skip to content

Commit fdab140

Browse files
authored
Function varriers (#147)
1 parent 6388cba commit fdab140

File tree

3 files changed

+22
-8
lines changed

3 files changed

+22
-8
lines changed

src/SemiclassicalOrthogonalPolynomials.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Base: getindex, axes, size, \, /, *, +, -, summary, show, ==, copy, sum,
77

88
import ArrayLayouts: MemoryLayout, ldiv, diagonaldata, subdiagonaldata, supdiagonaldata
99
import BandedMatrices: bandwidths, AbstractBandedMatrix, BandedLayout, _BandedMatrix
10-
import LazyArrays: resizedata!, paddeddata, CachedVector, CachedMatrix, CachedAbstractVector, LazyMatrix, LazyVector, arguments, ApplyLayout, colsupport, AbstractCachedVector, ApplyArray,
10+
import LazyArrays: resizedata!, paddeddata, maybe_cacheddata, CachedVector, CachedMatrix, CachedAbstractVector, LazyMatrix, LazyVector, arguments, ApplyLayout, colsupport, AbstractCachedVector, ApplyArray,
1111
AccumulateAbstractVector, LazyVector, AbstractCachedMatrix, BroadcastLayout, simplifiable
1212
import ClassicalOrthogonalPolynomials: OrthogonalPolynomial, recurrencecoefficients, jacobimatrix, normalize, _p0, UnitInterval, orthogonalityweight, NormalizedOPLayout, MappedOPLayout,
1313
Bidiagonal, Tridiagonal, SymTridiagonal, symtridiagonalize, normalizationconstant, LanczosPolynomial,

src/derivatives.jl

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""
2-
MulAddAccumulate(μ, A, B)
2+
MulAddAccumulate(μ, A, B)
33
4-
represents the vector satisfying v[k+1] == A[k]*v[k]+B[k] with v[1] == μ
4+
represents the vector satisfying v[k+1] == A[k+1]*v[k]+B[k+1] with v[1] == μ
55
"""
66
mutable struct MulAddAccumulate{T} <: AbstractCachedVector{T}
77
data::Vector{T}
@@ -21,11 +21,17 @@ MulAddAccumulate(data::Vector{T}, A::AbstractVector, B::AbstractVector, datasize
2121
MulAddAccumulate(μ, A, B) = MulAddAccumulate([μ], A, B, (1,))
2222
MulAddAccumulate(A, B) = MulAddAccumulate(A[1]+B[1], A, B)
2323

24-
function LazyArrays.cache_filldata!(K::MulAddAccumulate, inds)
25-
A,B = K.A,K.B
24+
LazyArrays.cache_filldata!(K::MulAddAccumulate, inds) = _muladdaccumulate_filldata!(K.data, K.A, K.B, inds)
25+
function _muladdaccumulate_filldata!(K, A, B, inds)
26+
n = maximum(inds)
27+
resizedata!(A, n)
28+
resizedata!(B, n)
29+
__muladdaccumulate_filldata!(K, maybe_cacheddata(A), maybe_cacheddata(B), inds)
30+
end
31+
function __muladdaccumulate_filldata!(data, A, B, inds)
2632
@inbounds for k in inds
27-
K.data[k] = muladd(A[k], K.data[k-1], B[k])
28-
end
33+
data[k] = muladd(A[k], data[k-1], B[k])
34+
end
2935
end
3036

3137
"""

test/test_derivative.jl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
using SemiclassicalOrthogonalPolynomials, ClassicalOrthogonalPolynomials, LazyArrays, Test
22
import ClassicalOrthogonalPolynomials: recurrencecoefficients, _BandedMatrix, _p0, Weighted
33
import LazyArrays: Accumulate, AccumulateAbstractVector
4-
import SemiclassicalOrthogonalPolynomials: MulAddAccumulate, HalfWeighted, toclassical
4+
import SemiclassicalOrthogonalPolynomials: MulAddAccumulate, HalfWeighted, toclassical, MulAddAccumulate
5+
6+
@testset "MulAddAccumulate" begin
7+
A = Vcat(1, cache(2:3), cache(4:∞) ./ cache(3:∞))
8+
B = Vcat(cache(1:5), [1, 2], cache(3:∞))
9+
v = MulAddAccumulate(A, B)
10+
@test v[1] 2
11+
@test all(k -> v[k+1] A[k+1] * v[k] + B[k+1], 2:1000)
12+
end
513

614
@testset "Derivative" begin
715
@testset "basics" begin

0 commit comments

Comments
 (0)