Skip to content

Commit 9978e5b

Browse files
Merge pull request #739 from oameye/master
add `g` kwarg to `remake(::SDEProblem)`
2 parents 1141a24 + 99817cb commit 9978e5b

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

src/remake.jl

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,14 +225,15 @@ function remake(prob::BVProblem{uType, tType, iip, nlls}; f = missing, bc = miss
225225
end
226226

227227
"""
228-
remake(prob::SDEProblem; f = missing, u0 = missing, tspan = missing,
228+
remake(prob::SDEProblem; f = missing, g = missing, u0 = missing, tspan = missing,
229229
p = missing, noise = missing, noise_rate_prototype = missing,
230230
seed = missing, kwargs = missing, _kwargs...)
231231
232232
Remake the given `SDEProblem`.
233233
"""
234234
function remake(prob::SDEProblem;
235235
f = missing,
236+
g = missing,
236237
u0 = missing,
237238
tspan = missing,
238239
p = missing,
@@ -261,8 +262,23 @@ function remake(prob::SDEProblem;
261262
seed = prob.seed
262263
end
263264

264-
if f === missing #TODO: Need more features, e.g. remake `g`
265+
if f === missing && g === missing
265266
f = prob.f
267+
g = prob.g
268+
elseif f !== missing && g === missing
269+
g = prob.g
270+
elseif f === missing && g !== missing
271+
if prob.f isa SDEFunction
272+
f = remake(prob.f; g = g)
273+
else
274+
f = SDEFunction(prob.f, g)
275+
end
276+
else
277+
if f isa SDEFunction
278+
f = remake(f; g = g)
279+
else
280+
f = SDEFunction(f, g)
281+
end
266282
end
267283

268284
iip = isinplace(prob)
@@ -282,6 +298,37 @@ function remake(prob::SDEProblem;
282298
end
283299
end
284300

301+
"""
302+
remake(func::SDEFunction; f = missing, g = missing,
303+
mass_matrix = missing, analytic = missing, kwargs...)
304+
305+
Remake the given `SDEFunction`.
306+
"""
307+
function remake(func::SDEFunction;
308+
f = missing,
309+
g = missing,
310+
mass_matrix = missing,
311+
analytic = missing,
312+
kwargs...)
313+
if f === missing
314+
f = func.f
315+
end
316+
317+
if g === missing
318+
g = func.g
319+
end
320+
321+
if mass_matrix === missing
322+
mass_matrix = func.mass_matrix
323+
end
324+
325+
if analytic === missing
326+
analytic = func.analytic
327+
end
328+
329+
return SDEFunction(f, g; mass_matrix, analytic, kwargs...)
330+
end
331+
285332
"""
286333
remake(prob::OptimizationProblem; f = missing, u0 = missing, p = missing,
287334
lb = missing, ub = missing, int = missing, lcons = missing, ucons = missing,

test/remake_tests.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,3 +273,14 @@ uspan = (1.0, 2.0)
273273
interval_prob = IntervalNonlinearProblem(interval_f, uspan)
274274
new_prob = @inferred IntervalNonlinearProblem remake(interval_prob; p = [0])
275275
@test new_prob.p == [0]
276+
277+
# SDEProblem specific
278+
function noise2!(du, u, p, t)
279+
du .= 0.2u
280+
end
281+
fn = SDEFunction(lorenz!, noise!; sys)
282+
sdeprob = SDEProblem(fn, u0, tspan, Tuple(p))
283+
newprob = remake(sdeprob; g = noise2!)
284+
@test newprob.f isa SDEFunction
285+
tmp = newprob.g([0.0, 0.0, 0.0], [1.0, 2.0, 3.0], nothing, 0.0)
286+
@test tmp[0.2, 0.4, 0.6] atol=1e-6

0 commit comments

Comments
 (0)