diff --git a/examples/ToolboxExamples.jl b/examples/ToolboxExamples.jl
index bfed7ef8b5e864b99c6a1561651793bd9c6c0edc..28472f177a38bcfb6eff4505fd2b7b0a9e23fc57 100644
--- a/examples/ToolboxExamples.jl
+++ b/examples/ToolboxExamples.jl
@@ -1275,16 +1275,13 @@ end
 sys_cr.procs
 
 # %%
-convergence_rate(sys_cr, x_cr)
+@show convergence_rate(sys_cr, x_cr)
 
-# %%
 (; conv_rate, grads) = convergence_rate_gradient(sys_cr, x_cr, [k])
 
-# %%
 @set k = value(k) + 1e-2*grads[k] 
 
-# %%
-convergence_rate(sys_cr, x_cr)
+@show convergence_rate(sys_cr, x_cr);
 
 # %%
 sys_gb = DiscreteTimeSystem(opt = MosekTools.Optimizer, sampling_time = 1/30)
@@ -1309,29 +1306,25 @@ cost = γ²_w + 100*γ²_1
 
 
 # %%
-solve!(sys_gb)
+@assert solve!(sys_gb)
 
-# %%
-value(cost)
+@show value(cost)
+value(k), value(b)
 
 # %%
 grads = gradient(sys_gb, [k, b])
 
-# %%
 step = 1e-2 / norm.(grads[k], grads[b])
 @set k = value(k) - step*grads[k]
 @set b = value(b) - step*grads[b]
 
-# %%
+solve!(sys_gb)
+@show value(cost)
 value(k), value(b)
 
 # %%
 convergence_rate(sys_cr, x_cr)
 
-# %%
-solve!(sys_gb)
-value(cost)
-
 # %%
 @showprogress for _ in 1:100
     grads = gradient(sys_gb, [k, b])
@@ -1343,10 +1336,7 @@ value(cost)
 end
 
 # %%
-value(k)
-
-# %%
-value(b)
+value(k), value(b)
 
 # %% [markdown]
 # ## NN
@@ -1368,10 +1358,8 @@ for ℓ in nn_flux.layers
 end
 
 # %%
-nn_flux([1.0])
-
-# %%
-nn_flux([-1.0])
+xs = range(-100, 100, length=100)
+plot(xs, [ only(nn_flux([x])) for x in xs ])
 
 # %%
 xs = range(-1, 1, length=100)
@@ -1394,35 +1382,6 @@ end
 end
 
 
-# %%
-convergence_rate(sys_cr, x_cr, margin = 0)
-
-# %%
-convergence_rate(sys_cr, x_cr)
-
-# %%
-xs = range(-1, 1, length=100)
-plot(xs, [ only(nn_flux([x])) for x in xs ])
-
-# %%
-convergence_rate(sys_cr, x_cr)
-
-# %%
-xs = range(-1, 1, length=100)
-plot(xs, [ only(nn_flux([x])) for x in xs ])
-
-# %%
-nn_flux_bias = Flux.Chain(Flux.Dense(1, 4, IQC.NeuralNetworks.Relu()), Flux.Dense(4, 1, IQC.NeuralNetworks.Identity())) |> f64
-
-# %%
-for (ℓ, ℓ_b) in zip(nn_flux.layers, nn_flux_bias.layers)
-    ℓ_b.weight .= ℓ.weight
-end
-
-# %%
-xs = range(-1, 1, length=100)
-plot(xs, [ only(nn_flux_bias([x])) for x in xs ])
-
 # %%
 sys_gb = DiscreteTimeSystem(opt = MosekTools.Optimizer, sampling_time = 1/30)
 
@@ -1452,22 +1411,21 @@ cost = γ²_w + 100*γ²_1
 
 
 # %%
-solve!(sys_gb)
+convergence_rate(sys_cr, x_cr)
 
 # %%
-value(cost)
+@assert solve!(sys_gb)
 
-# %%
-xs = range(-1, 1, length=100)
-plot(xs, [ only(nn_flux_bias([x])) for x in xs ])
+value(cost)
 
 # %%
 ps = params(nn_IQC)
 rs = []
 
 # %%
-@showprogress for _ in 1:50
-    # while !solve!(sys_gb, silent = true)
+progress = ProgressUnknown(desc="Gradient Steps:")
+
+while !solve!(sys_gb, silent = true)
     (; conv_rate, grads ) = convergence_rate_gradient(sys_cr, x_cr, ps)
     push!(rs, conv_rate)
     
@@ -1476,13 +1434,19 @@ rs = []
     for p in ps
         @set p = p + step*grads[p]
     end
+    next!(progress, showvalues = [(:conv_rate, round(conv_rate, sigdigits = 3))])
 end
+finish!(progress)
 
 rs[end]
 
 # %%
 plot(rs)
 
+# %%
+xs = range(-100, 100, length=100)
+plot(xs, [ only(nn_flux([x])) for x in xs ])
+
 # %%
 xs = range(-1, 1, length=100)
 plot(xs, [ only(nn_flux([x])) for x in xs ])
@@ -1494,18 +1458,41 @@ solve!(sys_gb)
 ps = params(nn_IQC_bias)
 cs = []
 
-@showprogress for _ in 1:100
-    solve!(sys_gb, silent=true)
-    push!(cs, value(cost))
+# %%
+ps
+
+# %%
+xs = -2:1/2:2
+[ only(nn_flux([x])) for x in xs ]
+
+# %%
+n_steps = 1000
+progress = Progress(n_steps)
+parameter_change = 1e-3
+
+for _ in 1:n_steps
+    if solve!(sys_gb, silent=true)
+        push!(cs, value(cost))
+    else
+        push!(cs, missing)
+    end
     push!(rs, convergence_rate(sys_cr, x_cr))
     grads = gradient(sys_gb, ps)
-    step = 1e-3/norm(grads[p] for p in ps)
+    step = parameter_change/norm(grads[p] for p in ps)
     
     for p in ps
         @set p = value(p) - step*grads[p]
     end
+    next!(progress, showvalues = [(:conv_rate, round(rs[end], sigdigits=3)), (:gain_bound, round(cs[end], sigdigits = 3))])
 end
 
+# %%
+cs[end]
+
+# %%
+xs = range(-100, 100, length=100)
+plot(xs, [ only(nn_flux([x])) for x in xs ])
+
 # %%
 xs = range(-1, 1, length=100)
 plot(xs, [ only(nn_flux([x])) for x in xs ])
@@ -1513,6 +1500,10 @@ plot(xs, [ only(nn_flux([x])) for x in xs ])
 # %%
 value(cost)
 
+# %%
+xs = -2:1/2:2
+[ only(nn_flux([x])) for x in xs ]
+
 # %%
 ps
 
@@ -1520,6 +1511,66 @@ ps
 plot(rs)
 
 # %%
-plot(cs)
+plot(cs, marker = :dot, line = nothing)
+
+# %%
+plot!(yaxis = :log10)
+
+# %%
+n_steps = 3000
+progress = Progress(n_steps)
+parameter_change = 1e-3
+
+for _ in 1:n_steps
+    if solve!(sys_gb, silent=true)
+        push!(cs, value(cost))
+    else
+        push!(cs, missing)
+    end
+    push!(rs, convergence_rate(sys_cr, x_cr))
+    grads = gradient(sys_gb, ps)
+    step = parameter_change/norm(grads[p] for p in ps)
+    
+    for p in ps
+        @set p = value(p) - step*grads[p]
+    end
+    next!(progress, showvalues = [(:conv_rate, round(rs[end], sigdigits=3)), (:gain_bound, round(cs[end], sigdigits = 3))])
+end
+
+# %%
+cs[end]
+
+# %%
+xs = range(-100, 100, length=100)
+plot(xs, [ only(nn_flux([x])) for x in xs ])
+
+# %%
+xs = range(-1, 1, length=100)
+plot(xs, [ only(nn_flux([x])) for x in xs ])
+
+# %%
+value(cost)
+
+# %%
+xs = -2:1/2:2
+[ only(nn_flux([x])) for x in xs ]
+
+# %%
+ps
+
+# %%
+plot(rs)
+
+# %%
+plot(cs, marker = :dot, line = nothing)
+
+# %%
+plot!(yaxis = :log10)
+
+# %%
+value(γ²_1)
+
+# %%
+value(γ²_w)
 
 # %%