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) # %%