diff --git a/Project.toml b/Project.toml
index e37edd243..254cf1ea5 100644
--- a/Project.toml
+++ b/Project.toml
@@ -10,6 +10,7 @@ DiffEqDevTools = "f3b72e0c-5b89-59e1-b016-84e28bfd966d"
ExponentialUtilities = "d4d017d3-3776-5f7e-afef-a10c40355c18"
FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898"
FastGaussQuadrature = "442a2c76-b920-505d-bb47-c5924d526838"
+FiniteHorizonGramians = "b59a298d-d283-4a37-9369-85a9f9a111a5"
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
FunctionWrappersWrappers = "77dc65aa-8811-40c2-897b-53d922fa7daf"
GaussianDistributions = "43dcc890-d446-5863-8d1a-14597580bb8d"
diff --git a/benchmarks/hodgkinhuxley.jmd b/benchmarks/hodgkinhuxley.jmd
index d2e9a6a5f..256a5ae3a 100644
--- a/benchmarks/hodgkinhuxley.jmd
+++ b/benchmarks/hodgkinhuxley.jmd
@@ -77,21 +77,19 @@ plot(test_sol,
DENSE = SAVE_EVERYSTEP = false
_setups = [
- "EK0(2)" => Dict(:alg=>EK0(order=2, smooth=DENSE))
"EK0(3)" => Dict(:alg=>EK0(order=3, smooth=DENSE))
"EK0(5)" => Dict(:alg=>EK0(order=5, smooth=DENSE))
- "EK1(2)" => Dict(:alg=>EK1(order=2, smooth=DENSE))
"EK1(3)" => Dict(:alg=>EK1(order=3, smooth=DENSE))
"EK1(5)" => Dict(:alg=>EK1(order=5, smooth=DENSE))
"EK1(8)" => Dict(:alg=>EK1(order=8, smooth=DENSE))
- "RosenbrockExpEK1(2)" => Dict(:alg=>RosenbrockExpEK(order=2, smooth=DENSE))
"RosenbrockExpEK1(3)" => Dict(:alg=>RosenbrockExpEK(order=3, smooth=DENSE))
"RosenbrockExpEK1(5)" => Dict(:alg=>RosenbrockExpEK(order=5, smooth=DENSE))
+ "RosenbrockExpEK1(8)" => Dict(:alg=>RosenbrockExpEK(order=8, smooth=DENSE))
]
labels = first.(_setups)
setups = last.(_setups)
-colors = [1 1 1 2 2 2 2 3 3 3]
+colors = [1 1 2 2 2 3 3 3]
abstols = 1.0 ./ 10.0 .^ (6:10)
reltols = 1.0 ./ 10.0 .^ (3:7)
@@ -124,21 +122,19 @@ plot(
DENSE = SAVE_EVERYSTEP = true
_setups = [
- "EK0(2)" => Dict(:alg=>EK0(order=2, smooth=DENSE))
"EK0(3)" => Dict(:alg=>EK0(order=3, smooth=DENSE))
"EK0(5)" => Dict(:alg=>EK0(order=5, smooth=DENSE))
- "EK1(2)" => Dict(:alg=>EK1(order=2, smooth=DENSE))
"EK1(3)" => Dict(:alg=>EK1(order=3, smooth=DENSE))
"EK1(5)" => Dict(:alg=>EK1(order=5, smooth=DENSE))
"EK1(8)" => Dict(:alg=>EK1(order=8, smooth=DENSE))
- "RosenbrockExpEK1(2)" => Dict(:alg=>RosenbrockExpEK(order=2, smooth=DENSE))
"RosenbrockExpEK1(3)" => Dict(:alg=>RosenbrockExpEK(order=3, smooth=DENSE))
"RosenbrockExpEK1(5)" => Dict(:alg=>RosenbrockExpEK(order=5, smooth=DENSE))
+ "RosenbrockExpEK1(8)" => Dict(:alg=>RosenbrockExpEK(order=8, smooth=DENSE))
]
labels = first.(_setups)
setups = last.(_setups)
-colors = [1 1 1 2 2 2 2 3 3 3]
+colors = [1 1 2 2 2 3 3 3]
abstols = 1.0 ./ 10.0 .^ (6:10)
reltols = 1.0 ./ 10.0 .^ (3:7)
@@ -176,9 +172,9 @@ abstols = reltols = repeat([missing], length(dts))
DM = FixedDiffusion()
_setups = [
- "EK0(2)" => Dict(:alg=>EK0(order=2, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
- "EK1(2)" => Dict(:alg=>EK1(order=2, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
- "RosenbrockExpEK1(2)" => Dict(:alg=>RosenbrockExpEK(order=2, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
+ "EK0(3)" => Dict(:alg=>EK0(order=3, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
+ "EK1(3)" => Dict(:alg=>EK1(order=3, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
+ "RosenbrockExpEK1(3)" => Dict(:alg=>RosenbrockExpEK(order=3, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
]
labels = first.(_setups)
@@ -218,9 +214,9 @@ dts = 10.0 .^ range(-2, -3, length=length(abstols))
DM = FixedDiffusion()
_setups = [
- "EK0(2)" => Dict(:alg=>EK0(order=2, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
- "EK1(2)" => Dict(:alg=>EK1(order=2, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
- "RosenbrockExpEK1(2)" => Dict(:alg=>RosenbrockExpEK(order=2, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
+ "EK0(3)" => Dict(:alg=>EK0(order=3, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
+ "EK1(3)" => Dict(:alg=>EK1(order=3, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
+ "RosenbrockExpEK1(3)" => Dict(:alg=>RosenbrockExpEK(order=3, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
]
labels = first.(_setups)
diff --git a/docs/src/benchmarks/figures/hodgkinhuxley_2_1.svg b/docs/src/benchmarks/figures/hodgkinhuxley_2_1.svg
index fd6d89049..140c56a8f 100644
--- a/docs/src/benchmarks/figures/hodgkinhuxley_2_1.svg
+++ b/docs/src/benchmarks/figures/hodgkinhuxley_2_1.svg
@@ -1,444 +1,444 @@
diff --git a/docs/src/benchmarks/figures/hodgkinhuxley_3_1.svg b/docs/src/benchmarks/figures/hodgkinhuxley_3_1.svg
index 2e5dc9f4a..b37b89a2f 100644
--- a/docs/src/benchmarks/figures/hodgkinhuxley_3_1.svg
+++ b/docs/src/benchmarks/figures/hodgkinhuxley_3_1.svg
@@ -1,270 +1,252 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/src/benchmarks/figures/hodgkinhuxley_4_1.svg b/docs/src/benchmarks/figures/hodgkinhuxley_4_1.svg
index a186d5286..6999795ce 100644
--- a/docs/src/benchmarks/figures/hodgkinhuxley_4_1.svg
+++ b/docs/src/benchmarks/figures/hodgkinhuxley_4_1.svg
@@ -1,268 +1,246 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/src/benchmarks/figures/hodgkinhuxley_5_1.svg b/docs/src/benchmarks/figures/hodgkinhuxley_5_1.svg
index 9285daeb0..51f69136c 100644
--- a/docs/src/benchmarks/figures/hodgkinhuxley_5_1.svg
+++ b/docs/src/benchmarks/figures/hodgkinhuxley_5_1.svg
@@ -1,229 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/src/benchmarks/figures/hodgkinhuxley_6_1.svg b/docs/src/benchmarks/figures/hodgkinhuxley_6_1.svg
index a76fed732..f2a8e753f 100644
--- a/docs/src/benchmarks/figures/hodgkinhuxley_6_1.svg
+++ b/docs/src/benchmarks/figures/hodgkinhuxley_6_1.svg
@@ -1,225 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/src/benchmarks/hodgkinhuxley.md b/docs/src/benchmarks/hodgkinhuxley.md
index 64570b39c..198d52318 100644
--- a/docs/src/benchmarks/hodgkinhuxley.md
+++ b/docs/src/benchmarks/hodgkinhuxley.md
@@ -84,21 +84,19 @@ plot(test_sol,
DENSE = SAVE_EVERYSTEP = false
_setups = [
- "EK0(2)" => Dict(:alg=>EK0(order=2, smooth=DENSE))
"EK0(3)" => Dict(:alg=>EK0(order=3, smooth=DENSE))
"EK0(5)" => Dict(:alg=>EK0(order=5, smooth=DENSE))
- "EK1(2)" => Dict(:alg=>EK1(order=2, smooth=DENSE))
"EK1(3)" => Dict(:alg=>EK1(order=3, smooth=DENSE))
"EK1(5)" => Dict(:alg=>EK1(order=5, smooth=DENSE))
"EK1(8)" => Dict(:alg=>EK1(order=8, smooth=DENSE))
- "RosenbrockExpEK1(2)" => Dict(:alg=>RosenbrockExpEK(order=2, smooth=DENSE))
"RosenbrockExpEK1(3)" => Dict(:alg=>RosenbrockExpEK(order=3, smooth=DENSE))
"RosenbrockExpEK1(5)" => Dict(:alg=>RosenbrockExpEK(order=5, smooth=DENSE))
+ "RosenbrockExpEK1(8)" => Dict(:alg=>RosenbrockExpEK(order=8, smooth=DENSE))
]
labels = first.(_setups)
setups = last.(_setups)
-colors = [1 1 1 2 2 2 2 3 3 3]
+colors = [1 1 2 2 2 3 3 3]
abstols = 1.0 ./ 10.0 .^ (6:10)
reltols = 1.0 ./ 10.0 .^ (3:7)
@@ -118,7 +116,7 @@ wp = WorkPrecisionSet(
plot(
wp,
- title = "Hodgkin-Huxley with adaptive steps",
+ title = "Adaptive steps - no smoothing",
color = colors,
xticks = 10.0 .^ (-16:1:5),
yticks = 10.0 .^ (-6:1:5),
@@ -135,21 +133,19 @@ plot(
DENSE = SAVE_EVERYSTEP = true
_setups = [
- "EK0(2)" => Dict(:alg=>EK0(order=2, smooth=DENSE))
"EK0(3)" => Dict(:alg=>EK0(order=3, smooth=DENSE))
"EK0(5)" => Dict(:alg=>EK0(order=5, smooth=DENSE))
- "EK1(2)" => Dict(:alg=>EK1(order=2, smooth=DENSE))
"EK1(3)" => Dict(:alg=>EK1(order=3, smooth=DENSE))
"EK1(5)" => Dict(:alg=>EK1(order=5, smooth=DENSE))
"EK1(8)" => Dict(:alg=>EK1(order=8, smooth=DENSE))
- "RosenbrockExpEK1(2)" => Dict(:alg=>RosenbrockExpEK(order=2, smooth=DENSE))
"RosenbrockExpEK1(3)" => Dict(:alg=>RosenbrockExpEK(order=3, smooth=DENSE))
"RosenbrockExpEK1(5)" => Dict(:alg=>RosenbrockExpEK(order=5, smooth=DENSE))
+ "RosenbrockExpEK1(8)" => Dict(:alg=>RosenbrockExpEK(order=8, smooth=DENSE))
]
labels = first.(_setups)
setups = last.(_setups)
-colors = [1 1 1 2 2 2 2 3 3 3]
+colors = [1 1 2 2 2 3 3 3]
abstols = 1.0 ./ 10.0 .^ (6:10)
reltols = 1.0 ./ 10.0 .^ (3:7)
@@ -169,7 +165,7 @@ wp = WorkPrecisionSet(
plot(
wp,
- title = "Hodgkin-Huxley with adaptive steps",
+ title = "Adaptive steps - with smoothing",
color = colors,
xticks = 10.0 .^ (-16:1:5),
yticks = 10.0 .^ (-6:1:5),
@@ -191,9 +187,9 @@ abstols = reltols = repeat([missing], length(dts))
DM = FixedDiffusion()
_setups = [
- "EK0(2)" => Dict(:alg=>EK0(order=2, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
- "EK1(2)" => Dict(:alg=>EK1(order=2, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
- "RosenbrockExpEK1(2)" => Dict(:alg=>RosenbrockExpEK(order=2, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
+ "EK0(3)" => Dict(:alg=>EK0(order=3, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
+ "EK1(3)" => Dict(:alg=>EK1(order=3, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
+ "RosenbrockExpEK1(3)" => Dict(:alg=>RosenbrockExpEK(order=3, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
]
labels = first.(_setups)
@@ -216,7 +212,7 @@ wp = WorkPrecisionSet(
plot(
wp,
- title = "Hodgkin-Huxley with fixed steps",
+ title = "Fixed steps - no smoothing",
color = colors,
xticks = 10.0 .^ (-16:1:5),
yticks = 10.0 .^ (-6:1:5),
@@ -237,9 +233,9 @@ dts = 10.0 .^ range(-2, -3, length=length(abstols))
DM = FixedDiffusion()
_setups = [
- "EK0(2)" => Dict(:alg=>EK0(order=2, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
- "EK1(2)" => Dict(:alg=>EK1(order=2, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
- "RosenbrockExpEK1(2)" => Dict(:alg=>RosenbrockExpEK(order=2, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
+ "EK0(3)" => Dict(:alg=>EK0(order=3, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
+ "EK1(3)" => Dict(:alg=>EK1(order=3, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
+ "RosenbrockExpEK1(3)" => Dict(:alg=>RosenbrockExpEK(order=3, diffusionmodel=DM, smooth=DENSE), :dts=>dts)
]
labels = first.(_setups)
@@ -262,7 +258,7 @@ wp = WorkPrecisionSet(
plot(
wp,
- title = "Hodgkin-Huxley with fixed steps",
+ title = "Fixed steps - with smoothing",
color = colors,
xticks = 10.0 .^ (-16:1:5),
yticks = 10.0 .^ (-6:1:5),