Skip to content

Commit

Permalink
Merge pull request #290 from sathvikbhagavan/sb/bspline
Browse files Browse the repository at this point in the history
refactor: error in BSpline when number of data/control is less than or equal to degree
  • Loading branch information
ChrisRackauckas authored Jul 7, 2024
2 parents 3142a03 + 19b1db9 commit 3bf4a76
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/interpolation_caches.jl
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,7 @@ function BSplineInterpolation(
u, t, d, pVecType, knotVecType; extrapolate = false, safetycopy = true)
u, t = munge_data(u, t, safetycopy)
n = length(t)
n < d + 1 && error("BSplineInterpolation needs at least d + 1, i.e. $(d+1) points.")
s = zero(eltype(u))
p = zero(t)
k = zeros(eltype(t), n + d + 1)
Expand Down Expand Up @@ -615,6 +616,7 @@ function BSplineApprox(
u, t, d, h, pVecType, knotVecType; extrapolate = false, safetycopy = true)
u, t = munge_data(u, t, safetycopy)
n = length(t)
h < d + 1 && error("BSplineApprox needs at least d + 1, i.e. $(d+1) control points.")
s = zero(eltype(u))
p = zero(t)
k = zeros(eltype(t), h + d + 1)
Expand Down
12 changes: 12 additions & 0 deletions test/interpolation_tests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,12 @@ end
@test [A(190.0), A(225.0)] == [13.437481084762863, 11.367034741256463]
@test [A(t[1]), A(t[end])] == [u[1], u[end]]

@test_throws ErrorException("BSplineInterpolation needs at least d + 1, i.e. 4 points.") BSplineInterpolation(
u[1:3], t[1:3], 3, :Uniform, :Uniform)
@test_throws ErrorException("BSplineInterpolation needs at least d + 1, i.e. 5 points.") BSplineInterpolation(
u[1:4], t[1:4], 4, :ArcLen, :Average)
@test_nowarn BSplineInterpolation(u[1:3], t[1:3], 2, :Uniform, :Uniform)

# Test extrapolation
A = BSplineInterpolation(u, t, 2, :ArcLen, :Average; extrapolate = true)
@test A(-1.0) == u[1]
Expand All @@ -633,6 +639,12 @@ end
@test [A(t[1]), A(t[end])] [u[1], u[end]]
test_cached_index(A)

@test_throws ErrorException("BSplineApprox needs at least d + 1, i.e. 3 control points.") BSplineApprox(
u, t, 2, 2, :Uniform, :Uniform)
@test_throws ErrorException("BSplineApprox needs at least d + 1, i.e. 4 control points.") BSplineApprox(
u, t, 3, 3, :ArcLen, :Average)
@test_nowarn BSplineApprox(u, t, 2, 3, :Uniform, :Uniform)

# Test extrapolation
A = BSplineApprox(u, t, 2, 4, :Uniform, :Uniform; extrapolate = true)
@test A(-1.0) == u[1]
Expand Down

0 comments on commit 3bf4a76

Please sign in to comment.