1
1
module DataInterpolationsRegularizationToolsExt
2
2
3
3
using DataInterpolations
4
- import DataInterpolations: munge_data,
4
+ import DataInterpolations: munge_data, munge_extrapolation,
5
5
_interpolate, RegularizationSmooth, get_show, derivative,
6
6
integral
7
7
using LinearAlgebra
@@ -70,14 +70,19 @@ A = RegularizationSmooth(u, t, t̂, wls, wr, d; λ = 1.0, alg = :gcv_svd)
70
70
function RegularizationSmooth (u:: AbstractVector , t:: AbstractVector , t̂:: AbstractVector ,
71
71
wls:: AbstractVector , wr:: AbstractVector , d:: Int = 2 ;
72
72
λ:: Real = 1.0 , alg:: Symbol = :gcv_svd ,
73
+ extrapolation:: ExtrapolationType.T = ExtrapolationType. None,
73
74
extrapolation_left:: ExtrapolationType.T = ExtrapolationType. None,
74
- extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None)
75
+ extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None,
76
+ cache_parameters:: Bool = false )
77
+ extrapolation_left, extrapolation_right = munge_extrapolation (
78
+ extrapolation, extrapolation_left, extrapolation_right)
75
79
u, t = munge_data (u, t)
76
80
M = _mapping_matrix (t̂, t)
77
81
Wls½ = LA. diagm (sqrt .(wls))
78
82
Wr½ = LA. diagm (sqrt .(wr))
79
83
û, λ, Aitp = _reg_smooth_solve (
80
- u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left, extrapolation_right)
84
+ u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left,
85
+ extrapolation_right, cache_parameters)
81
86
RegularizationSmooth (
82
87
u, û, t, t̂, wls, wr, d, λ, alg, Aitp, extrapolation_left, extrapolation_right)
83
88
end
@@ -90,16 +95,22 @@ A = RegularizationSmooth(u, t, d; λ = 1.0, alg = :gcv_svd, extrapolate = false)
90
95
"""
91
96
function RegularizationSmooth (u:: AbstractVector , t:: AbstractVector , d:: Int = 2 ;
92
97
λ:: Real = 1.0 ,
93
- alg:: Symbol = :gcv_svd , extrapolation_left:: ExtrapolationType.T = ExtrapolationType. None,
94
- extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None)
98
+ alg:: Symbol = :gcv_svd ,
99
+ extrapolation:: ExtrapolationType.T = ExtrapolationType. None,
100
+ extrapolation_left:: ExtrapolationType.T = ExtrapolationType. None,
101
+ extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None,
102
+ cache_parameters:: Bool = false )
103
+ extrapolation_left, extrapolation_right = munge_extrapolation (
104
+ extrapolation, extrapolation_left, extrapolation_right)
95
105
u, t = munge_data (u, t)
96
106
t̂ = t
97
107
N = length (t)
98
108
M = Array {Float64} (LA. I, N, N)
99
109
Wls½ = Array {Float64} (LA. I, N, N)
100
110
Wr½ = Array {Float64} (LA. I, N - d, N - d)
101
111
û, λ, Aitp = _reg_smooth_solve (
102
- u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left, extrapolation_right)
112
+ u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left,
113
+ extrapolation_right, cache_parameters)
103
114
RegularizationSmooth (u,
104
115
û,
105
116
t,
@@ -122,15 +133,20 @@ A = RegularizationSmooth(u, t, t̂, d; λ = 1.0, alg = :gcv_svd, extrapolate = f
122
133
"""
123
134
function RegularizationSmooth (u:: AbstractVector , t:: AbstractVector , t̂:: AbstractVector ,
124
135
d:: Int = 2 ; λ:: Real = 1.0 , alg:: Symbol = :gcv_svd ,
136
+ extrapolation:: ExtrapolationType.T = ExtrapolationType. None,
125
137
extrapolation_left:: ExtrapolationType.T = ExtrapolationType. None,
126
- extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None)
138
+ extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None,
139
+ cache_parameters:: Bool = false )
140
+ extrapolation_left, extrapolation_right = munge_extrapolation (
141
+ extrapolation, extrapolation_left, extrapolation_right)
127
142
u, t = munge_data (u, t)
128
143
N, N̂ = length (t), length (t̂)
129
144
M = _mapping_matrix (t̂, t)
130
145
Wls½ = Array {Float64} (LA. I, N, N)
131
146
Wr½ = Array {Float64} (LA. I, N̂ - d, N̂ - d)
132
147
û, λ, Aitp = _reg_smooth_solve (
133
- u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left, extrapolation_right)
148
+ u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left,
149
+ extrapolation_right, cache_parameters)
134
150
RegularizationSmooth (u,
135
151
û,
136
152
t,
@@ -153,15 +169,21 @@ A = RegularizationSmooth(u, t, t̂, wls, d; λ = 1.0, alg = :gcv_svd, extrapolat
153
169
"""
154
170
function RegularizationSmooth (u:: AbstractVector , t:: AbstractVector , t̂:: AbstractVector ,
155
171
wls:: AbstractVector , d:: Int = 2 ; λ:: Real = 1.0 ,
156
- alg:: Symbol = :gcv_svd , extrapolation_left:: ExtrapolationType.T = ExtrapolationType. None,
157
- extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None)
172
+ alg:: Symbol = :gcv_svd ,
173
+ extrapolation:: ExtrapolationType.T = ExtrapolationType. None,
174
+ extrapolation_left:: ExtrapolationType.T = ExtrapolationType. None,
175
+ extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None,
176
+ cache_parameters:: Bool = false )
177
+ extrapolation_left, extrapolation_right = munge_extrapolation (
178
+ extrapolation, extrapolation_left, extrapolation_right)
158
179
u, t = munge_data (u, t)
159
180
N, N̂ = length (t), length (t̂)
160
181
M = _mapping_matrix (t̂, t)
161
182
Wls½ = LA. diagm (sqrt .(wls))
162
183
Wr½ = Array {Float64} (LA. I, N̂ - d, N̂ - d)
163
184
û, λ, Aitp = _reg_smooth_solve (
164
- u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left, extrapolation_right)
185
+ u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left,
186
+ extrapolation_right, cache_parameters)
165
187
RegularizationSmooth (u,
166
188
û,
167
189
t,
@@ -185,16 +207,22 @@ A = RegularizationSmooth(
185
207
"""
186
208
function RegularizationSmooth (u:: AbstractVector , t:: AbstractVector , t̂:: Nothing ,
187
209
wls:: AbstractVector , d:: Int = 2 ; λ:: Real = 1.0 ,
188
- alg:: Symbol = :gcv_svd , extrapolation_left:: ExtrapolationType.T = ExtrapolationType. None,
189
- extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None)
210
+ alg:: Symbol = :gcv_svd ,
211
+ extrapolation:: ExtrapolationType.T = ExtrapolationType. None,
212
+ extrapolation_left:: ExtrapolationType.T = ExtrapolationType. None,
213
+ extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None,
214
+ cache_parameters:: Bool = false )
215
+ extrapolation_left, extrapolation_right = munge_extrapolation (
216
+ extrapolation, extrapolation_left, extrapolation_right)
190
217
u, t = munge_data (u, t)
191
218
t̂ = t
192
219
N = length (t)
193
220
M = Array {Float64} (LA. I, N, N)
194
221
Wls½ = LA. diagm (sqrt .(wls))
195
222
Wr½ = Array {Float64} (LA. I, N - d, N - d)
196
223
û, λ, Aitp = _reg_smooth_solve (
197
- u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left, extrapolation_right)
224
+ u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left,
225
+ extrapolation_right, cache_parameters)
198
226
RegularizationSmooth (u,
199
227
û,
200
228
t,
@@ -219,16 +247,21 @@ A = RegularizationSmooth(
219
247
function RegularizationSmooth (u:: AbstractVector , t:: AbstractVector , t̂:: Nothing ,
220
248
wls:: AbstractVector , wr:: AbstractVector , d:: Int = 2 ;
221
249
λ:: Real = 1.0 , alg:: Symbol = :gcv_svd ,
250
+ extrapolation:: ExtrapolationType.T = ExtrapolationType. None,
222
251
extrapolation_left:: ExtrapolationType.T = ExtrapolationType. None,
223
- extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None)
252
+ extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None,
253
+ cache_parameters:: Bool = false )
254
+ extrapolation_left, extrapolation_right = munge_extrapolation (
255
+ extrapolation, extrapolation_left, extrapolation_right)
224
256
u, t = munge_data (u, t)
225
257
t̂ = t
226
258
N = length (t)
227
259
M = Array {Float64} (LA. I, N, N)
228
260
Wls½ = LA. diagm (sqrt .(wls))
229
261
Wr½ = LA. diagm (sqrt .(wr))
230
262
û, λ, Aitp = _reg_smooth_solve (
231
- u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left, extrapolation_right)
263
+ u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left,
264
+ extrapolation_right, cache_parameters)
232
265
RegularizationSmooth (u,
233
266
û,
234
267
t,
@@ -252,8 +285,12 @@ A = RegularizationSmooth(
252
285
"""
253
286
function RegularizationSmooth (u:: AbstractVector , t:: AbstractVector , t̂:: Nothing ,
254
287
wls:: Symbol , d:: Int = 2 ; λ:: Real = 1.0 , alg:: Symbol = :gcv_svd ,
288
+ extrapolation:: ExtrapolationType.T = ExtrapolationType. None,
255
289
extrapolation_left:: ExtrapolationType.T = ExtrapolationType. None,
256
- extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None)
290
+ extrapolation_right:: ExtrapolationType.T = ExtrapolationType. None,
291
+ cache_parameters:: Bool = false )
292
+ extrapolation_left, extrapolation_right = munge_extrapolation (
293
+ extrapolation, extrapolation_left, extrapolation_right)
257
294
u, t = munge_data (u, t)
258
295
t̂ = t
259
296
N = length (t)
@@ -262,7 +299,8 @@ function RegularizationSmooth(u::AbstractVector, t::AbstractVector, t̂::Nothing
262
299
Wls½ = LA. diagm (sqrt .(wls))
263
300
Wr½ = LA. diagm (sqrt .(wr))
264
301
û, λ, Aitp = _reg_smooth_solve (
265
- u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left, extrapolation_right)
302
+ u, t̂, d, M, Wls½, Wr½, λ, alg, extrapolation_left,
303
+ extrapolation_right, cache_parameters)
266
304
RegularizationSmooth (u,
267
305
û,
268
306
t,
@@ -286,7 +324,9 @@ Solve for the smoothed dependent variables and create spline interpolator
286
324
function _reg_smooth_solve (
287
325
u:: AbstractVector , t̂:: AbstractVector , d:: Int , M:: AbstractMatrix ,
288
326
Wls½:: AbstractMatrix , Wr½:: AbstractMatrix , λ:: Real , alg:: Symbol ,
289
- extrapolation_left:: ExtrapolationType.T , extrapolation_right:: ExtrapolationType.T )
327
+ extrapolation_left:: ExtrapolationType.T ,
328
+ extrapolation_right:: ExtrapolationType.T ,
329
+ cache_parameters:: Bool )
290
330
λ = float (λ) # `float` expected by RT
291
331
D = _derivative_matrix (t̂, d)
292
332
Ψ = RT. setupRegularizationProblem (Wls½ * M, Wr½ * D)
@@ -303,7 +343,7 @@ function _reg_smooth_solve(
303
343
û = result. x
304
344
λ = result. λ
305
345
end
306
- Aitp = CubicSpline (û, t̂; extrapolation_left, extrapolation_right)
346
+ Aitp = CubicSpline (û, t̂; extrapolation_left, extrapolation_right, cache_parameters )
307
347
# It seems logical to use B-Spline of order d+1, but I am unsure if theory supports the
308
348
# extra computational cost, JJS 12/25/21
309
349
# Aitp = BSplineInterpolation(û,t̂,d+1,:ArcLen,:Average)
0 commit comments