-
Notifications
You must be signed in to change notification settings - Fork 29
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: MTK Jacobian for CoupledDEs #229
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -26,4 +26,52 @@ end | |
else | ||
@test J(current_state(ds), current_parameters(ds), 0.0) == result | ||
end | ||
end | ||
end | ||
|
||
@testset "MTK Jacobian" begin | ||
using ModelingToolkit | ||
using ModelingToolkit: Num, RuntimeGeneratedFunctions.RuntimeGeneratedFunction | ||
using DynamicalSystemsBase: SciMLBase | ||
@independent_variables t | ||
@variables u(t)[1:2] | ||
D = Differential(t) | ||
p = 3.0 | ||
|
||
eqs = [D(u[1]) ~ p * u[1], | ||
D(u[2]) ~ -p * u[2]] | ||
|
||
@named sys = ODESystem(eqs, t) | ||
sys = structural_simplify(sys) | ||
|
||
jac = calculate_jacobian(sys) | ||
@test jac isa Matrix{Num} | ||
|
||
prob = ODEProblem(sys, [1.0, 1.0], (0.0, 1.0); jac=true) | ||
ode = CoupledODEs(prob) | ||
@test ode.integ.f.jac.jac_oop isa RuntimeGeneratedFunction | ||
Comment on lines
+51
to
+52
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Tests must ONLY use the public API. Not access internal fields that may or may not exist. You have to re-write the tests to use the |
||
@test ode.integ.f.jac([1.0, 1.0], [3.0], 0.0) isa Matrix{Float64} | ||
|
||
jac = jacobian(ode) | ||
@test jac.jac_oop isa RuntimeGeneratedFunction | ||
@test jac([1.0, 1.0], [3.0], 0.0) isa Matrix{Float64} | ||
|
||
@testset "CoupledSDEs" begin | ||
using StochasticDiffEq | ||
@brownian β | ||
eqs = [D(u[1]) ~ p * u[1]+ β, | ||
D(u[2]) ~ -p * u[2] + β] | ||
@mtkbuild sys = System(eqs, t) | ||
|
||
jac = calculate_jacobian(sys) | ||
Comment on lines
+65
to
+66
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What is this test testing? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. it comes from There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Then we shouldn't be testing it. We should only test functionality from our package. This is easier to maintain and also less confusing. So, the If you think this function from MTK needs additional testing it is much better to contribute these tests directly to MTK (although I doubt it). |
||
@test jac isa Matrix{Num} | ||
|
||
prob = SDEProblem(sys, [1.0, 1.0], (0.0, 1.0), jac=true) | ||
sde = CoupledSDEs(prob) | ||
@test sde.integ.f.jac.jac_oop isa RuntimeGeneratedFunction | ||
@test sde.integ.f.jac([1.0, 1.0], [3.0], 0.0) isa Matrix{Float64} | ||
|
||
jac = jacobian(ode) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Generally speaking testing the type of things is not of much value. We test functionality and interfaces. Instead of testing whether something "is what it should be", test instead that it "does what it should do". |
||
@test jac.jac_oop isa RuntimeGeneratedFunction | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ALl of these tests should instead test explicitly the analytic jacobian. That the matrix we get is exactly, numerically, the matrix we expect. |
||
@test jac([1.0, 1.0], [3.0], 0.0) isa Matrix{Float64} | ||
end | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this change made? SDEs are not a core system. Tangent space makes no sense for SDEs, and the tangent space is the only reason for the "Core" hierarchy.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I just want Jacobian to work for CoupledSDEs, I could also define
jacobian(Union{CoupledSDEs, CoreDynamicalSystem})
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is better to define
jacobian(sde::CoupledSDEs) = jacobian(CoupledODEs(sde))
. Which is also more transparent. It makes it clear that you want the jacobian of the drift, and not of the noise functiong
which also has a jacobian.