From f8347adee8dd3c1c9a45999ae2ad59171d59adc9 Mon Sep 17 00:00:00 2001 From: Julien Calbert Date: Fri, 20 Oct 2023 07:28:31 +0200 Subject: [PATCH] Jc/update doc (#318) * SCOTS->NaiveAbstraction * improve docs * format * Update runtests.jl * Remove Getting Started from make.jl * literate actions on getting started and slight changes * forgot getting started page * fix gs path --------- Co-authored-by: Adrien Banse <45042779+adrienbanse@users.noreply.github.com> Co-authored-by: adrienbanse --- docs/assets/abstraction.png | Bin 74460 -> 59743 bytes docs/make.jl | 32 +++++++++++++----- docs/src/developers/setup.md | 13 +++---- .../examples/{ => solvers}/DC-DC converter.jl | 25 ++++---------- .../Gol, Lazar & Belta (2013).jl | 2 +- .../{ => solvers}/Hierarchical-abstraction.jl | 8 ++--- .../Lazy-Ellipsoids-Abstraction.jl | 16 +++++---- .../Lazy-abstraction-reachability.jl | 30 ++++++++-------- .../examples/{ => solvers}/Path planning.jl | 19 ++++------- .../State-feedback Abstraction PWA System.jl | 5 +-- docs/src/examples/{ => utils}/Ellipsoids.jl | 0 docs/src/examples/{ => utils}/Grid.jl | 0 docs/src/examples/{ => utils}/Tree.jl | 0 docs/src/index.md | 3 +- docs/src/manual/abstraction-based-control.md | 22 ++++++------ docs/src/manual/manual.md | 28 +++++++-------- docs/src/reference/Optim.md | 2 +- src/optim/abstraction/abstraction.jl | 2 +- ...TS_abstraction.jl => naive_abstraction.jl} | 6 ++-- ... => test_NaiveAbstraction_reachability.jl} | 6 ++-- ...ety.jl => test_NaiveAbstraction_safety.jl} | 4 +-- .../test_controller.jl | 2 +- .../test_controllerreach.jl | 10 +++--- .../test_controllersafe.jl | 4 +-- .../test_fromcontrolsystemgrowth.jl | 0 .../test_fromcontrolsystemlinearized.jl | 0 test/runtests.jl | 14 ++++---- 27 files changed, 127 insertions(+), 126 deletions(-) rename docs/src/examples/{ => solvers}/DC-DC converter.jl (77%) rename docs/src/examples/{ => solvers}/Gol, Lazar & Belta (2013).jl (96%) rename docs/src/examples/{ => solvers}/Hierarchical-abstraction.jl (95%) rename docs/src/examples/{ => solvers}/Lazy-Ellipsoids-Abstraction.jl (86%) rename docs/src/examples/{ => solvers}/Lazy-abstraction-reachability.jl (85%) rename docs/src/examples/{ => solvers}/Path planning.jl (88%) rename docs/src/examples/{ => solvers}/State-feedback Abstraction PWA System.jl (97%) rename docs/src/examples/{ => utils}/Ellipsoids.jl (100%) rename docs/src/examples/{ => utils}/Grid.jl (100%) rename docs/src/examples/{ => utils}/Tree.jl (100%) rename src/optim/abstraction/{SCOTS_abstraction.jl => naive_abstraction.jl} (99%) rename test/optim/{test_SCOTS_reachability.jl => test_NaiveAbstraction_reachability.jl} (96%) rename test/optim/{test_SCOTS_safety.jl => test_NaiveAbstraction_safety.jl} (95%) rename test/optim/{unit_tests_SCOTS => unit_tests_NaiveAbstraction}/test_controller.jl (92%) rename test/optim/{unit_tests_SCOTS => unit_tests_NaiveAbstraction}/test_controllerreach.jl (92%) rename test/optim/{unit_tests_SCOTS => unit_tests_NaiveAbstraction}/test_controllersafe.jl (96%) rename test/optim/{unit_tests_SCOTS => unit_tests_NaiveAbstraction}/test_fromcontrolsystemgrowth.jl (100%) rename test/optim/{unit_tests_SCOTS => unit_tests_NaiveAbstraction}/test_fromcontrolsystemlinearized.jl (100%) diff --git a/docs/assets/abstraction.png b/docs/assets/abstraction.png index b5cc94d3b32894d1d2aef1b8a8eea0f68720a8d6..8a6f9ff8660a8bce58e9b703ef48bde6ff2282ed 100644 GIT binary patch literal 59743 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 HS@`@Pbr0hB diff --git a/docs/make.jl b/docs/make.jl index 1c9bc203f..16e239b47 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -1,24 +1,40 @@ using Dionysos using Documenter, Literate -const EXAMPLES_DIR = joinpath(@__DIR__, "src", "examples") +const EXAMPLES_SOLVERS_DIR = joinpath(@__DIR__, "src", "examples", "solvers") +const EXAMPLES_UTILS_DIR = joinpath(@__DIR__, "src", "examples", "utils") + const REFERENCE_DIR = joinpath(@__DIR__, "src", "reference") const OUTPUT_DIR = joinpath(@__DIR__, "src", "generated") -const EXAMPLES = readdir(EXAMPLES_DIR) +const EXAMPLES_SOLVERS = readdir(EXAMPLES_SOLVERS_DIR) +const EXAMPLES_UTILS = readdir(EXAMPLES_UTILS_DIR) const REFERENCE = readdir(REFERENCE_DIR) -for example in EXAMPLES - example_filepath = joinpath(EXAMPLES_DIR, example) - Literate.markdown(example_filepath, OUTPUT_DIR) - Literate.notebook(example_filepath, OUTPUT_DIR) - Literate.script(example_filepath, OUTPUT_DIR) +function literate_actions(file, output_dir) + Literate.markdown(file, output_dir) + Literate.notebook(file, output_dir) + return Literate.script(file, output_dir) +end + +for example in EXAMPLES_SOLVERS + literate_actions(joinpath(EXAMPLES_SOLVERS_DIR, example), OUTPUT_DIR) +end +for example in EXAMPLES_UTILS + literate_actions(joinpath(EXAMPLES_UTILS_DIR, example), OUTPUT_DIR) end +literate_actions(joinpath(@__DIR__, "src", "examples", "Getting Started.jl"), OUTPUT_DIR) const _PAGES = [ "Index" => "index.md", "Manual" => ["manual/abstraction-based-control.md", "manual/manual.md"], - "Examples" => map(EXAMPLES) do jl_file + "Getting Started" => "generated/Getting Started.md", + "Solvers" => map(EXAMPLES_SOLVERS) do jl_file + # Need `string` as Documenter fails if `name` is a `SubString{String}`. + name = string(split(jl_file, ".")[1]) + return name => "generated/$name.md" + end, + "Utils" => map(EXAMPLES_UTILS) do jl_file # Need `string` as Documenter fails if `name` is a `SubString{String}`. name = string(split(jl_file, ".")[1]) return name => "generated/$name.md" diff --git a/docs/src/developers/setup.md b/docs/src/developers/setup.md index b40a94482..021ba5b64 100644 --- a/docs/src/developers/setup.md +++ b/docs/src/developers/setup.md @@ -115,12 +115,13 @@ julia> using Revise If you don't plan to test the examples, comment out the Literate part in `docs/make.jl`: ```julila - 11 #for example in EXAMPLES - 12 # example_filepath = joinpath(EXAMPLES_DIR, example) - 13 # Literate.markdown(example_filepath, OUTPUT_DIR) - 14 # Literate.notebook(example_filepath, OUTPUT_DIR) - 15 # Literate.script(example_filepath, OUTPUT_DIR) - 16 #end + 20 # for example in EXAMPLES_SOLVERS + 21 # literate_actions(joinpath(EXAMPLES_SOLVERS_DIR, example), OUTPUT_DIR) + 22 # end + 23 # for example in EXAMPLES_UTILS + 24 # literate_actions(joinpath(EXAMPLES_UTILS_DIR, example), OUTPUT_DIR) + 25 # end + 26 # literate_actions(joinpath(@__DIR__, "src", "Getting Started.jl"), OUTPUT_DIR) ``` This will speed up building the documentation quite a lot. diff --git a/docs/src/examples/DC-DC converter.jl b/docs/src/examples/solvers/DC-DC converter.jl similarity index 77% rename from docs/src/examples/DC-DC converter.jl rename to docs/src/examples/solvers/DC-DC converter.jl index fa87af42f..842e0ed83 100644 --- a/docs/src/examples/DC-DC converter.jl +++ b/docs/src/examples/solvers/DC-DC converter.jl @@ -1,5 +1,5 @@ using Test #src -# # Example: DC-DC converter +# # Example: DC-DC converter solved by [Naive abstraction](https://github.com/dionysos-dev/Dionysos.jl/blob/master/docs/src/manual/manual.md#solvers). # #md # [![Binder](https://mybinder.org/badge_logo.svg)](@__BINDER_ROOT_URL__/generated/DC-DC converter.ipynb) #md # [![nbviewer](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](@__NBVIEWER_ROOT_URL__/generated/DC-DC converter.ipynb) @@ -19,24 +19,13 @@ using Test #src # A_1 = \begin{bmatrix} -\frac{r_l}{x_l} &0 \\ 0 & -\frac{1}{x_c}\frac{1}{r_0+r_c} \end{bmatrix}, A_2= \begin{bmatrix} -\frac{1}{x_l}\left(r_l+\frac{r_0r_c}{r_0+r_c}\right) & -\frac{1}{x_l}\frac{r_0}{r_0+r_c} \\ \frac{1}{x_c}\frac{r_0}{r_0+r_c} & -\frac{1}{x_c}\frac{1}{r_0+r_c} \end{bmatrix}, b = \begin{bmatrix} \frac{v_s}{x_l}\\0\end{bmatrix}. # ``` # The goal is to design a controller to keep the state of the system in a safety region around the reference desired value, using as input only the switching -# signal. -# -# -# In order to study the concrete system and its symbolic abstraction in a unified framework, we will solve the problem -# for the sampled system with a sampling time $\tau$. -# -# The abstraction is based on a feedback refinment relation [4,V.2 Definition]. -# Basically, this is equivalent to an alternating simulation relationship with the additional constraint that the input of the -# concrete and symbolic system preserving the relation must be identical. -# This allows to easily determine the controller of the concrete system from the abstraction controller by simply adding a quantization step. -# -# For the construction of the relations in the abstraction, it is necessary to over-approximate attainable sets of -# a particular cell. In this example, we consider the used of a growth bound function [4, VIII.2, VIII.5] which is one of the possible methods to over-approximate -# attainable sets of a particular cell based on the state reach by its center. Therefore, it is used -# to compute the relations in the abstraction based on the feedback refinement relation. +# signal. In order to study the concrete system and its symbolic abstraction in a unified framework, we will solve the problem +# for the sampled system with a sampling time $\tau$. For the construction of the relations in the abstraction, it is necessary to over-approximate attainable sets of +# a particular cell. In this example, we consider the use of a growth bound function [4, VIII.2, VIII.5] which is one of the possible methods to over-approximate +# attainable sets of a particular cell based on the state reach by its center. # -# First, let us import [StaticArrays](https://github.com/JuliaArrays/StaticArrays.jl) and [Plots]. +# First, let us import [StaticArrays](https://github.com/JuliaArrays/StaticArrays.jl) and [Plots](https://github.com/JuliaPlots/Plots.jl). using StaticArrays, Plots @@ -66,7 +55,7 @@ hu = SVector(1) input_grid = DO.GridFree(u0, hu) using JuMP -optimizer = MOI.instantiate(AB.SCOTSAbstraction.Optimizer) +optimizer = MOI.instantiate(AB.NaiveAbstraction.Optimizer) MOI.set(optimizer, MOI.RawOptimizerAttribute("concrete_problem"), concrete_problem) MOI.set(optimizer, MOI.RawOptimizerAttribute("state_grid"), state_grid) MOI.set(optimizer, MOI.RawOptimizerAttribute("input_grid"), input_grid) diff --git a/docs/src/examples/Gol, Lazar & Belta (2013).jl b/docs/src/examples/solvers/Gol, Lazar & Belta (2013).jl similarity index 96% rename from docs/src/examples/Gol, Lazar & Belta (2013).jl rename to docs/src/examples/solvers/Gol, Lazar & Belta (2013).jl index 50b1a2fe4..1cc46364f 100644 --- a/docs/src/examples/Gol, Lazar & Belta (2013).jl +++ b/docs/src/examples/solvers/Gol, Lazar & Belta (2013).jl @@ -1,5 +1,5 @@ using Test #src -# # Example: Gol, Lazar and Belta (2013) +# # Example: Gol, Lazar and Belta (2013) solved by [Bemporad Morari](https://github.com/dionysos-dev/Dionysos.jl/blob/master/docs/src/manual/manual.md#solvers). # #md # [![Binder](https://mybinder.org/badge_logo.svg)](@__BINDER_ROOT_URL__/generated/Gol%2C Lazar %26 Belta (2013).ipynb) #md # [![nbviewer](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](@__NBVIEWER_ROOT_URL__/generated/Gol%2C Lazar %26 Belta (2013).ipynb) diff --git a/docs/src/examples/Hierarchical-abstraction.jl b/docs/src/examples/solvers/Hierarchical-abstraction.jl similarity index 95% rename from docs/src/examples/Hierarchical-abstraction.jl rename to docs/src/examples/solvers/Hierarchical-abstraction.jl index 38fbfab27..17ac1e8c7 100644 --- a/docs/src/examples/Hierarchical-abstraction.jl +++ b/docs/src/examples/solvers/Hierarchical-abstraction.jl @@ -1,4 +1,4 @@ -# # Hierarchical-abstraction +# # Example: Reachability problem solved by [Hierarchical abstraction](https://github.com/dionysos-dev/Dionysos.jl/blob/master/docs/src/manual/manual.md#solvers). # #md # [![Binder](https://mybinder.org/badge_logo.svg)](@__BINDER_ROOT_URL__/generated/Hierarchical-abstraction.ipynb) #md # [![nbviewer](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](@__NBVIEWER_ROOT_URL__/generated/Hierarchical-abstraction.ipynb) @@ -17,7 +17,7 @@ const PR = DI.Problem const OP = DI.Optim const AB = OP.Abstraction -include("../../../problems/simple_problem.jl") +include(joinpath(dirname(dirname(pathof(Dionysos))), "problems", "simple_problem.jl")) ## specific functions function post_image(abstract_system, concrete_system, xpos, u) @@ -125,11 +125,11 @@ AB.LazyAbstraction.set_optimizer_parameters!( ) # Global optimizer parameters -hx_global = [10.0, 10.0] #[15.0, 15.0] +hx_global = [10.0, 10.0] u0 = SVector(0.0, 0.0) hu = SVector(0.5, 0.5) Ugrid = DO.GridFree(u0, hu) -max_iter = 6 # 9 +max_iter = 6 max_time = 1000 optimizer = MOI.instantiate(AB.HierarchicalAbstraction.Optimizer) diff --git a/docs/src/examples/Lazy-Ellipsoids-Abstraction.jl b/docs/src/examples/solvers/Lazy-Ellipsoids-Abstraction.jl similarity index 86% rename from docs/src/examples/Lazy-Ellipsoids-Abstraction.jl rename to docs/src/examples/solvers/Lazy-Ellipsoids-Abstraction.jl index 9588ac907..25ca97298 100644 --- a/docs/src/examples/Lazy-Ellipsoids-Abstraction.jl +++ b/docs/src/examples/solvers/Lazy-Ellipsoids-Abstraction.jl @@ -1,3 +1,6 @@ +# # Example: Reachability problem solved by [Lazy ellipsoid abstraction](https://github.com/dionysos-dev/Dionysos.jl/blob/master/docs/src/manual/manual.md#solvers). +# + using StaticArrays, LinearAlgebra, Random, IntervalArithmetic using MathematicalSystems, HybridSystems using JuMP, Mosek, MosekTools @@ -15,7 +18,7 @@ const PR = DI.Problem const OP = DI.Optim const AB = OP.Abstraction -include("../../../problems/non_linear.jl") +include(joinpath(dirname(dirname(pathof(Dionysos))), "problems", "non_linear.jl")) # # First example @@ -95,23 +98,24 @@ fig = plot(; ytickfontsize = 10, guidefontsize = 16, titlefontsize = 14, + label = false, ); xlabel!("\$x_1\$"); ylabel!("\$x_2\$"); title!("Specifictions and domains"); #Display the concrete domain -plot!(concrete_system.X; color = :yellow, opacity = 0.5); +plot!(concrete_system.X; color = :yellow, opacity = 0.5, label = false); for obs in concrete_system.obstacles - plot!(obs; color = :black) + plot!(obs; color = :black, label = false) end #Display the abstract domain -plot!(abstract_system; arrowsB = false, cost = false); +plot!(abstract_system; arrowsB = false, cost = false, label = false); #Display the concrete specifications -plot!(concrete_problem.initial_set; color = :green); -plot!(concrete_problem.target_set; color = :red) +plot!(concrete_problem.initial_set; color = :green, label = false); +plot!(concrete_problem.target_set; color = :red, label = false) # # Display the abstraction fig = plot(; diff --git a/docs/src/examples/Lazy-abstraction-reachability.jl b/docs/src/examples/solvers/Lazy-abstraction-reachability.jl similarity index 85% rename from docs/src/examples/Lazy-abstraction-reachability.jl rename to docs/src/examples/solvers/Lazy-abstraction-reachability.jl index 327eee3fb..e37c56384 100644 --- a/docs/src/examples/Lazy-abstraction-reachability.jl +++ b/docs/src/examples/solvers/Lazy-abstraction-reachability.jl @@ -1,4 +1,4 @@ -# # Lazy-abstraction-reachability +# # Example: Reachability problem solved by [Lazy abstraction](https://github.com/dionysos-dev/Dionysos.jl/blob/master/docs/src/manual/manual.md#solvers). # #md # [![Binder](https://mybinder.org/badge_logo.svg)](@__BINDER_ROOT_URL__/generated/Lazy-abstraction-reachability.ipynb) #md # [![nbviewer](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](@__NBVIEWER_ROOT_URL__/generated/Lazy-abstraction-reachability.ipynb) @@ -8,19 +8,14 @@ # # In order to study the concrete system and its symbolic abstraction in a unified framework, we will solve the problem # for the sampled system with a sampling time $\tau$. -# -# The abstraction is based on a feedback refinment relation [1,V.2 Definition]. -# This allows to easily determine the controller of the concrete system from the abstraction controller by simply adding a quantization step. -# # For the construction of the relations in the abstraction, it is necessary to over-approximate attainable sets of # a particular cell. In this example, we consider the used of a growth bound function [1, VIII.2, VIII.5] which is one of the possible methods to over-approximate -# attainable sets of a particular cell based on the state reach by its center. Therefore, it is used -# to compute the relations in the abstraction based on the feedback refinement relation. +# attainable sets of a particular cell based on the state reach by its center. # # For this reachability problem, the abstraction controller is built using a solver that lazily builds the abstraction, constructing the abstraction # at the same time as the controller. -# First, let us import [StaticArrays](https://github.com/JuliaArrays/StaticArrays.jl) and [Plots]. +# First, let us import [StaticArrays](https://github.com/JuliaArrays/StaticArrays.jl) and [Plots](https://github.com/JuliaPlots/Plots.jl). using StaticArrays, JuMP, Plots # At this point, we import Dionysos. @@ -34,7 +29,7 @@ const PR = DI.Problem const OP = DI.Optim const AB = OP.Abstraction -include("../../../problems/simple_problem.jl") +include(joinpath(dirname(dirname(pathof(Dionysos))), "problems", "simple_problem.jl")) ## specific functions function post_image(abstract_system, concrete_system, xpos, u) @@ -126,9 +121,9 @@ AB.LazyAbstraction.set_optimizer!( Ugrid, ) -# Build the state feedback abstraction and solve the optimal control problem using A* algorithm +# Build the abstraction and solve the optimal control problem using A* algorithm using Suppressor -@suppress begin # this is a workaround to supress the undesired output of SDPA +@suppress begin MOI.optimize!(optimizer) end @@ -181,7 +176,13 @@ plot!(cost_control_trajectory; ms = 0.5) # # Display the abstraction and Lyapunov-like function fig = plot(; aspect_ratio = :equal); -plot!(abstract_system; dims = [1, 2], cost = true, lyap_fun = optimizer.lyap_fun) +plot!( + abstract_system; + dims = [1, 2], + cost = true, + lyap_fun = optimizer.lyap_fun, + label = false, +) # # Display the Bellman-like value function (heuristic) fig = plot(; aspect_ratio = :equal) @@ -191,12 +192,9 @@ plot!( dims = [1, 2], cost = true, lyap_fun = optimizer.bell_fun, + label = false, ) # # Display the results of the A* algorithm fig = plot(; aspect_ratio = :equal) plot!(optimizer.lazy_search_problem) - -# ### References -# 1. G. Reissig, A. Weber and M. Rungger, "Feedback Refinement Relations for the Synthesis of Symbolic Controllers," in IEEE Transactions on Automatic Control, vol. 62, no. 4, pp. 1781-1796. -# 2. K. J. Aström and R. M. Murray, Feedback systems. Princeton University Press, Princeton, NJ, 2008. diff --git a/docs/src/examples/Path planning.jl b/docs/src/examples/solvers/Path planning.jl similarity index 88% rename from docs/src/examples/Path planning.jl rename to docs/src/examples/solvers/Path planning.jl index 32a6d2faf..9e681af68 100644 --- a/docs/src/examples/Path planning.jl +++ b/docs/src/examples/solvers/Path planning.jl @@ -1,5 +1,5 @@ using Test #src -# # Example: Path planning problem +# # Example: Path planning problem solved by [Naive abstraction](https://github.com/dionysos-dev/Dionysos.jl/blob/master/docs/src/manual/manual.md#solvers). # #md # [![Binder](https://mybinder.org/badge_logo.svg)](@__BINDER_ROOT_URL__/generated/Path planning.ipynb) #md # [![nbviewer](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](@__NBVIEWER_ROOT_URL__/generated/Path planning.ipynb) @@ -23,21 +23,14 @@ using Test #src # # In order to study the concrete system and its symbolic abstraction in a unified framework, we will solve the problem # for the sampled system with a sampling time $\tau$. -# -# The abstraction is based on a feedback refinment relation [1,V.2 Definition]. -# Basically, this is equivalent to an alternating simulation relationship with the additional constraint that the input of the -# concrete and symbolic system preserving the relation must be identical. -# This allows to easily determine the controller of the concrete system from the abstraction controller by simply adding a quantization step. -# # For the construction of the relations in the abstraction, it is necessary to over-approximate attainable sets of # a particular cell. In this example, we consider the used of a growth bound function [1, VIII.2, VIII.5] which is one of the possible methods to over-approximate -# attainable sets of a particular cell based on the state reach by its center. Therefore, it is used -# to compute the relations in the abstraction based on the feedback refinement relation. +# attainable sets of a particular cell based on the state reach by its center. # -# For this reachability problem, the abstraction controller is built by solving a fixed-point equation which consists in computing the the pre-image +# For this reachability problem, the abstraction controller is built by solving a fixed-point equation which consists in computing the pre-image # of the target set. -# First, let us import [StaticArrays](https://github.com/JuliaArrays/StaticArrays.jl) and [Plots]. +# First, let us import [StaticArrays](https://github.com/JuliaArrays/StaticArrays.jl) and [Plots](https://github.com/JuliaPlots/Plots.jl). using StaticArrays, Plots # At this point, we import Dionysos. @@ -72,10 +65,10 @@ u0 = SVector(0.0, 0.0); h = SVector(0.3, 0.3); input_grid = DO.GridFree(u0, h); -# We now solve the optimal control problem with the `Abstraction.SCOTSAbstraction.Optimizer`. +# We now solve the optimal control problem with the `Abstraction.NaiveAbstraction.Optimizer`. using JuMP -optimizer = MOI.instantiate(AB.SCOTSAbstraction.Optimizer) +optimizer = MOI.instantiate(AB.NaiveAbstraction.Optimizer) MOI.set(optimizer, MOI.RawOptimizerAttribute("concrete_problem"), concrete_problem) MOI.set(optimizer, MOI.RawOptimizerAttribute("state_grid"), state_grid) MOI.set(optimizer, MOI.RawOptimizerAttribute("input_grid"), input_grid) diff --git a/docs/src/examples/State-feedback Abstraction PWA System.jl b/docs/src/examples/solvers/State-feedback Abstraction PWA System.jl similarity index 97% rename from docs/src/examples/State-feedback Abstraction PWA System.jl rename to docs/src/examples/solvers/State-feedback Abstraction PWA System.jl index 598a075ad..924761a7b 100644 --- a/docs/src/examples/State-feedback Abstraction PWA System.jl +++ b/docs/src/examples/solvers/State-feedback Abstraction PWA System.jl @@ -1,5 +1,5 @@ using Test #src -# # Example: Optimal control of a PWA System by State-feedback Abstractions +# # Example: Optimal control of a PWA System by State-feedback Abstractions solved by [Ellipsoid abstraction](https://github.com/dionysos-dev/Dionysos.jl/blob/master/docs/src/manual/manual.md#solvers). # #md # [![Binder](https://mybinder.org/badge_logo.svg)](@__BINDER_ROOT_URL__/generated/State-feedback Abstraction: PWA System.ipynb) #md # [![nbviewer](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](@__NBVIEWER_ROOT_URL__/generated/State-feedback Abstraction: PWA System.ipynb) @@ -53,7 +53,8 @@ const OP = DI.Optim const AB = OP.Abstraction lib = CDDLib.Library() # polyhedron lib -include("../../../problems/pwa_sys.jl") + +include(joinpath(dirname(dirname(pathof(Dionysos))), "problems", "pwa_sys.jl")) # # Problem parameters # Notice that in [1] it was used `Wsz = 5` and `Usz = 50`. These, and other values were changed here to speed up the build time of the documentation. diff --git a/docs/src/examples/Ellipsoids.jl b/docs/src/examples/utils/Ellipsoids.jl similarity index 100% rename from docs/src/examples/Ellipsoids.jl rename to docs/src/examples/utils/Ellipsoids.jl diff --git a/docs/src/examples/Grid.jl b/docs/src/examples/utils/Grid.jl similarity index 100% rename from docs/src/examples/Grid.jl rename to docs/src/examples/utils/Grid.jl diff --git a/docs/src/examples/Tree.jl b/docs/src/examples/utils/Tree.jl similarity index 100% rename from docs/src/examples/Tree.jl rename to docs/src/examples/utils/Tree.jl diff --git a/docs/src/index.md b/docs/src/index.md index 5955e0c47..d73849085 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -24,8 +24,9 @@ Rather than relying on closed-form analysis of a model of the dynamical system, The documentation is organised as follows. * The **Manual** section contains all the useful information to use Dionysos as a user. +* The **Solvers** section contains a few examples of solving problems with Dionysos. Start with [Getting started](https://dionysos-dev.github.io/Dionysos.jl/dev/generated/Getting%20Started/) if you want to get familiar with Dionysos. +* The **Utils** section contains some examples of basic Dionysos functions. * The **API Reference** sections contains all the functions that we currently use in Dionysos. -* The **Examples** section contains a few examples of solving problems with Dionysos. Start with [Getting started](https://dionysos-dev.github.io/Dionysos.jl/dev/generated/Getting%20Started/) if you want to get familiar with Dionysos. * The **Developer Docs** section is dedicated to the contributors to Dionysos developement. diff --git a/docs/src/manual/abstraction-based-control.md b/docs/src/manual/abstraction-based-control.md index 4dc26e8b4..7891a76ee 100644 --- a/docs/src/manual/abstraction-based-control.md +++ b/docs/src/manual/abstraction-based-control.md @@ -1,18 +1,16 @@ # Abstraction-based control -Given a mathematical description of the system dynamics and the specifications describing the desired closed-loop behavior of the system, -**abstraction-based control** techniques involve synthesizing a **correct-by-construction** controller through a **systematic** three-step procedure. -First, both the original system and the specifications are transposed into an abstract domain, resulting in an abstract system and corresponding abstract specifications. -This step generally involves a complete discretization of the state and input spaces, typically with uniform hyperrectangles. -Next, an abstract controller is synthesized to solve this abstract control problem. Finally, the third step, referred to as the **refinement procedure**, involves deducing a controller for the original control problem from the abstract controller. The value of this approach lies in the substitution of the original system (often an infinite system) with a finite system, which enables it to leverage powerful control tools in the domain of symbolic control. This three steps procedure is illustrated on the following figure. +Given a mathematical description of the system dynamics and the specifications describing the desired closed-loop behavior of the system, **abstraction-based control** techniques involve synthesizing a **correct-by-construction** controller through a **systematic** three-step procedure. +First, both the original system and the specifications are transposed into an abstract domain, resulting in an abstract system and corresponding abstract specifications. +We refer to the original system as the concrete system as opposed to the abstract system. +Next, an abstract controller is synthesized to solve this abstract control problem. Finally, in the third step, called **concretization** as opposed to **abstraction**, a controller for the original control problem is derived from the abstract controller. -
-
Abstraction-based control.
-
Abstraction-based control
-
+In practice, the abstract domain is constructed by discretizing the concrete state space of the concrete system into subsets (called **cells**). +The value of this approach lies in the substitution of the concrete system (often a system with an infinite number of states) with a finite state system, which makes it possible to leverage powerful control tools from the graph-theoretic field, such as Dijkstra or the A-star algorithm. +This three steps procedure is illustrated on the following figure. + +![Abstraction-based control.](https://github.com/dionysos-dev/Dionysos.jl/blob/master/docs/assets/abstraction.png?raw=true) Although this approach offers a safety-critical framework, it suffers from the curse of dimensionality due to the exponential growth of the number of states with respect to the dimension. In order to render these techniques practical, it is necessary to construct **smart abstractions**, i.e., they differ from classical techniques in that the partitioning is designed smartly, using optimization-based design techniques, and computed iteratively, unlike the classical approach which uses an a priori defined approach, sub-optimal and subject to the curse of dimensionality. -To this end, we introduce solvers called **lazy solvers** (i.e. postponing heavier numerical operations) that co-design the abstraction and the controller to reduce the computed part of the abstraction. \ No newline at end of file +To this end, we propose solvers called **lazy solvers** (i.e. postponing heavier numerical operations) that co-design the abstraction and the controller to reduce the computed part of the abstraction. \ No newline at end of file diff --git a/docs/src/manual/manual.md b/docs/src/manual/manual.md index 6e9f8c004..b60e10ba6 100644 --- a/docs/src/manual/manual.md +++ b/docs/src/manual/manual.md @@ -1,11 +1,11 @@ -# Standard form problem +# Overview Dionysos aims to design a controller for a system $\mathcal{S}$ so that the closed-loop system satisfies the specification $\Sigma$ where: * the system $\mathcal{S}$ is specified by [`MathematicalSystems`](https://juliareach.github.io/MathematicalSystems.jl/latest/lib/types/#MathematicalSystems.AbstractSystem) or [`HybridSystems`](https://blegat.github.io/HybridSystems.jl/stable/lib/types/#HybridSystems.AbstractHybridSystem) objects; * the specification $\Sigma$ is specified by [`ProblemType`](https://dionysos-dev.github.io/Dionysos.jl/dev/reference/Problem/#Dionysos.Problem.ProblemType) objects; * the solver $\mathcal{O}$ implementents the abstract type [`AbstractOptimizer`](https://jump.dev/MathOptInterface.jl/stable/reference/models/#MathOptInterface.AbstractOptimizer) of [`MathOptInterface`](https://github.com/jump-dev/MathOptInterface.jl). -So a control problem $(\mathcal{S},\Sigma)$ can be addressed by a solver $\mathcal{O}$ via the [`JuMP`](https://github.com/jump-dev/JuMP.jl) interface, with Dionysos inheriting JuMP's powerful and practical optimization framework. +So a control problem $(\mathcal{S},\Sigma)$ can be solved by $\mathcal{O}$ via the [`JuMP`](https://github.com/jump-dev/JuMP.jl) interface, with Dionysos inheriting JuMP's powerful and practical optimization framework. # Overview of the code structure Description of the core of the Dionysos.jl package, the [`src`](https://github.com/dionysos-dev/Dionysos.jl/tree/master/src) folder: @@ -14,8 +14,8 @@ Description of the core of the Dionysos.jl package, the [`src`](https://github.c | :--------------- | :---------- | | [`utils`](https://github.com/dionysos-dev/Dionysos.jl/tree/master/src/utils) | Contains useful functions, data structures, classic search algorithms, file management, ... | | [`domain`](https://github.com/dionysos-dev/Dionysos.jl/tree/master/src/domain) | Contains structures defining the domain of a system | -| [`system`](https://github.com/dionysos-dev/Dionysos.jl/tree/master/src/system) | Contains specific systems and controllers | -| [`problem`](https://github.com/dionysos-dev/Dionysos.jl/tree/master/src/problem) | Contains specifications | +| [`system`](https://github.com/dionysos-dev/Dionysos.jl/tree/master/src/system) | Contains a description of specific systems | +| [`problem`](https://github.com/dionysos-dev/Dionysos.jl/tree/master/src/problem) | Contains control problems that can be solved by Dionysos solvers | | [`symbolic`](https://github.com/dionysos-dev/Dionysos.jl/tree/master/src/symbolic) | Contains the data structures needed to encode the abstractions | | [`optim`](https://github.com/dionysos-dev/Dionysos.jl/tree/master/src/optim) | Contains the solvers | @@ -28,9 +28,9 @@ where $\mathcal{X}$ is the state constraint, $\mathcal{U}$ is the input constrai * [`HybridSystems`](https://blegat.github.io/HybridSystems.jl/stable/lib/types/#HybridSystems.AbstractHybridSystem), which extends the class of systems of [`MathematicalSystems`](https://juliareach.github.io/MathematicalSystems.jl/latest/lib/types/#MathematicalSystems.AbstractSystem) to hybrid systems. -# Specifications +# Problems -The specification types implemented in Dionysos.jl are: +The problem types supported in Dionysos.jl are: | Type | Description | | :--------------- | :---------- | @@ -41,14 +41,14 @@ Extensions for linear temporal logic (LTL) specifications are currently being im # Solvers -The following tables summarize the different solver types in abbreviated form. +The following tables summarize the different solvers. **Abstraction-based solver types implemented in Dionysos.jl:** | Type | Full vs partial discretization | Partition vs Cover | Shape | Local controller | Abstraction | System | Reference | | :--------------- | :---------- | :---------- | :---------- | :---------- | :---------- | :---------- | :---------- | -| [`SCOTS`](https://dionysos-dev.github.io/Dionysos.jl/dev/reference/Optim/#Dionysos.Optim.Abstraction.SCOTSAbstraction.Optimizer) | Full | Partition | Hyperrectangle | Piece-wise constant | Non-determinisitic | Continuous-time | [`SCOTS: A Tool for the Synthesis of Symbolic Controllers`](https://dl.acm.org/doi/abs/10.1145/2883817.2883834) | +| [`Naive abstraction`](https://dionysos-dev.github.io/Dionysos.jl/dev/reference/Optim/#Dionysos.Optim.Abstraction.NaiveAbstraction.Optimizer) | Full | Partition | Hyperrectangle | Piece-wise constant | Non-determinisitic | Continuous-time | [`SCOTS: A Tool for the Synthesis of Symbolic Controllers`](https://dl.acm.org/doi/abs/10.1145/2883817.2883834) | | [`Lazy abstraction`](https://dionysos-dev.github.io/Dionysos.jl/dev/reference/Optim/#Dionysos.Optim.Abstraction.LazyAbstraction.Optimizer) | Partial | Partition | Hyperrectangle | Piece-wise constant | Non-determinisitic | Continuous-time | [`Alternating simulation on hierarchical abstractions`](https://ieeexplore.ieee.org/abstract/document/9683448/?casa_token=AXyECYU9FdwAAAAA:ERfvlbkORIbfGLbDd42d2K5K9SLVOjl-8kRs9pfp7lMa4QZEv0W4VgzlP8FshBlxXQF4ZQrDuzk) | | [`Hierarchical abstraction`](https://dionysos-dev.github.io/Dionysos.jl/dev/reference/Optim/#Dionysos.Optim.Abstraction.HierarchicalAbstraction.Optimizer) | Partial | Partition | Hyperrectangle | Piece-wise constant | Non-determinisitic | Continuous-time | [`Alternating simulation on hierarchical abstractions`](https://ieeexplore.ieee.org/abstract/document/9683448/?casa_token=AXyECYU9FdwAAAAA:ERfvlbkORIbfGLbDd42d2K5K9SLVOjl-8kRs9pfp7lMa4QZEv0W4VgzlP8FshBlxXQF4ZQrDuzk) | | [`Ellipsoid abstraction`](https://dionysos-dev.github.io/Dionysos.jl/dev/reference/Optim/#Dionysos.Optim.Abstraction.EllipsoidsAbstraction.Optimizer) | Full | Cover | Ellipsoid | Piece-wise affine | Determinisitic | Discrete-time affine | [`State-feedback Abstractions for Optimal Control of Piecewise-affine Systems`](https://arxiv.org/abs/2204.00315) | @@ -64,8 +64,8 @@ The following tables summarize the different solver types in abbreviated form. **Solver interface** -Each solver is defined by a module which must define the structure [`AbstractOptimizer`](https://jump.dev/MathOptInterface.jl/stable/reference/models/#MathOptInterface.AbstractOptimizer) and implement the [`Optimize!`](https://jump.dev/MathOptInterface.jl/stable/reference/models/#MathOptInterface.optimize!) function. -For example, for the SCOTS solver, this structure and function are defined as follows +Each solver is defined by a module which must implement the abstract type [`AbstractOptimizer`](https://jump.dev/MathOptInterface.jl/stable/reference/models/#MathOptInterface.AbstractOptimizer) and the [`Optimize!`](https://jump.dev/MathOptInterface.jl/stable/reference/models/#MathOptInterface.optimize!) function. +For example, for the NaiveAbstraction solver, this structure and function are defined as follows ```julia using JuMP @@ -110,9 +110,9 @@ end # Running an example In this section, we outline how to define and solve a control problem with Dionsysos. -For an executable version of this example, see [`Example: Path planning problem`](https://dionysos-dev.github.io/Dionysos.jl/dev/generated/Path%20planning/#Example:-Path-planning-problem) in the documentation. +For an executable version of this example, see [`Solvers: Path planning problem`](https://dionysos-dev.github.io/Dionysos.jl/dev/generated/Path%20planning/#Example:-Path-planning-problem) in the documentation. -First you need to define a control problem, i.e., the system and the specification of the desired closed loop behaviour. +Define a control problem, i.e., the system and the specification of the desired closed loop behaviour. To do this, you can define new ones yourself or directly load an existing benchmark, for example ```julia @@ -123,7 +123,7 @@ concrete_system = concrete_problem.system; Choose the solver you wish to use ```julia using JuMP -optimizer = MOI.instantiate(AB.SCOTSAbstraction.Optimizer) +optimizer = MOI.instantiate(AB.NaiveAbstraction.Optimizer) ``` Define the solver's meta-parameters @@ -166,7 +166,7 @@ plot!(concrete_system.X; color = :yellow, opacity = 0.5); plot!(abstract_system.Xdom; color = :blue, opacity = 0.5); plot!(concrete_problem.initial_set; color = :green, opacity = 0.2); plot!(concrete_problem.target_set; dims = [1, 2], color = :red, opacity = 0.2); -plot!(UT.DrawTrajectory(x_traj); ms = 0.5) +plot!(control_trajectory; ms = 0.5) ``` diff --git a/docs/src/reference/Optim.md b/docs/src/reference/Optim.md index 9ccec33e0..3fe632b67 100644 --- a/docs/src/reference/Optim.md +++ b/docs/src/reference/Optim.md @@ -8,7 +8,7 @@ Dionysos.Optim.Abstraction.LazyAbstraction.Optimizer Dionysos.Optim.Abstraction.EllipsoidsAbstraction.Optimizer Dionysos.Optim.Abstraction.HierarchicalAbstraction.Optimizer Dionysos.Optim.Abstraction.LazyEllipsoidsAbstraction.Optimizer -Dionysos.Optim.Abstraction.SCOTSAbstraction.Optimizer +Dionysos.Optim.Abstraction.NaiveAbstraction.Optimizer ``` ## Other solvers diff --git a/src/optim/abstraction/abstraction.jl b/src/optim/abstraction/abstraction.jl index c10a20cf2..32f3b5ad8 100644 --- a/src/optim/abstraction/abstraction.jl +++ b/src/optim/abstraction/abstraction.jl @@ -1,6 +1,6 @@ module Abstraction -include("SCOTS_abstraction.jl") +include("naive_abstraction.jl") include("lazy_abstraction.jl") include("hierarchical_abstraction.jl") include("ellipsoids_abstraction.jl") diff --git a/src/optim/abstraction/SCOTS_abstraction.jl b/src/optim/abstraction/naive_abstraction.jl similarity index 99% rename from src/optim/abstraction/SCOTS_abstraction.jl rename to src/optim/abstraction/naive_abstraction.jl index a2ee9469d..31cbefa06 100644 --- a/src/optim/abstraction/SCOTS_abstraction.jl +++ b/src/optim/abstraction/naive_abstraction.jl @@ -1,6 +1,6 @@ -export SCOTSAbstraction +export NaiveAbstraction -module SCOTSAbstraction +module NaiveAbstraction import Dionysos const DI = Dionysos @@ -15,7 +15,7 @@ using JuMP """ Optimizer{T} <: MOI.AbstractOptimizer -SCOTS abstraction solver +Naive abstraction solver """ mutable struct Optimizer{T} <: MOI.AbstractOptimizer concrete_problem::Union{Nothing, PR.ProblemType} diff --git a/test/optim/test_SCOTS_reachability.jl b/test/optim/test_NaiveAbstraction_reachability.jl similarity index 96% rename from test/optim/test_SCOTS_reachability.jl rename to test/optim/test_NaiveAbstraction_reachability.jl index 5c6840fb7..918e7e54c 100644 --- a/test/optim/test_SCOTS_reachability.jl +++ b/test/optim/test_NaiveAbstraction_reachability.jl @@ -35,10 +35,10 @@ u0 = SVector(0.0, 0.0) h = SVector(0.3, 0.3) input_grid = DO.GridFree(u0, h) -# We now solve the optimal control problem with the `Abstraction.SCOTSAbstraction.Optimizer`. +# We now solve the optimal control problem with the `Abstraction.NaiveAbstraction.Optimizer`. using JuMP -optimizer = MOI.instantiate(AB.SCOTSAbstraction.Optimizer) +optimizer = MOI.instantiate(AB.NaiveAbstraction.Optimizer) MOI.set(optimizer, MOI.RawOptimizerAttribute("concrete_problem"), concrete_problem) MOI.set(optimizer, MOI.RawOptimizerAttribute("state_grid"), state_grid) MOI.set(optimizer, MOI.RawOptimizerAttribute("input_grid"), input_grid) @@ -50,7 +50,7 @@ abstract_problem = MOI.get(optimizer, MOI.RawOptimizerAttribute("abstract_proble abstract_controller = MOI.get(optimizer, MOI.RawOptimizerAttribute("abstract_controller")) concrete_controller = MOI.get(optimizer, MOI.RawOptimizerAttribute("concrete_controller")) -@testset "SCOTS reachability" begin +@testset "NaiveAbstraction reachability" begin @test length(abstract_controller.data) == 19400 #src end diff --git a/test/optim/test_SCOTS_safety.jl b/test/optim/test_NaiveAbstraction_safety.jl similarity index 95% rename from test/optim/test_SCOTS_safety.jl rename to test/optim/test_NaiveAbstraction_safety.jl index 0a1348510..c65a3e0cb 100644 --- a/test/optim/test_SCOTS_safety.jl +++ b/test/optim/test_NaiveAbstraction_safety.jl @@ -29,7 +29,7 @@ hu = SVector(1) input_grid = DO.GridFree(u0, hu) using JuMP -optimizer = MOI.instantiate(AB.SCOTSAbstraction.Optimizer) +optimizer = MOI.instantiate(AB.NaiveAbstraction.Optimizer) MOI.set(optimizer, MOI.RawOptimizerAttribute("concrete_problem"), concrete_problem) MOI.set(optimizer, MOI.RawOptimizerAttribute("state_grid"), state_grid) MOI.set(optimizer, MOI.RawOptimizerAttribute("input_grid"), input_grid) @@ -38,7 +38,7 @@ MOI.optimize!(optimizer) abstract_controller = MOI.get(optimizer, MOI.RawOptimizerAttribute("abstract_controller")) concrete_controller = MOI.get(optimizer, MOI.RawOptimizerAttribute("concrete_controller")) -@testset "SCOTS safety" begin +@testset "NaiveAbstraction safety" begin @test length(abstract_controller.data) == 893803 #src end diff --git a/test/optim/unit_tests_SCOTS/test_controller.jl b/test/optim/unit_tests_NaiveAbstraction/test_controller.jl similarity index 92% rename from test/optim/unit_tests_SCOTS/test_controller.jl rename to test/optim/unit_tests_NaiveAbstraction/test_controller.jl index 7c71d1bad..d6c308c5a 100644 --- a/test/optim/unit_tests_SCOTS/test_controller.jl +++ b/test/optim/unit_tests_NaiveAbstraction/test_controller.jl @@ -11,7 +11,7 @@ sleep(0.1) # used for good printing println("Started test") @testset "Controller" begin - contr = AB.SCOTSAbstraction.NewControllerList() + contr = AB.NaiveAbstraction.NewControllerList() UT.push_new!(contr, (5, 6)) UT.push_new!(contr, (5, 6)) diff --git a/test/optim/unit_tests_SCOTS/test_controllerreach.jl b/test/optim/unit_tests_NaiveAbstraction/test_controllerreach.jl similarity index 92% rename from test/optim/unit_tests_SCOTS/test_controllerreach.jl rename to test/optim/unit_tests_NaiveAbstraction/test_controllerreach.jl index 5ffd425b8..3e9a52e6a 100644 --- a/test/optim/unit_tests_SCOTS/test_controllerreach.jl +++ b/test/optim/unit_tests_NaiveAbstraction/test_controllerreach.jl @@ -75,8 +75,8 @@ println("Started test") push!(targetlist, SY.get_state_by_xpos(symmodel, pos)) end - contr = AB.SCOTSAbstraction.NewControllerList() - AB.SCOTSAbstraction.compute_controller_reach!( + contr = AB.NaiveAbstraction.NewControllerList() + AB.NaiveAbstraction.compute_controller_reach!( contr, symmodel.autom, initlist, @@ -85,14 +85,14 @@ println("Started test") @test length(contr) == 412 if VERSION >= v"1.5" function f(autom, initlist, targetlist) - contr = AB.SCOTSAbstraction.NewControllerList() + contr = AB.NaiveAbstraction.NewControllerList() initset, targetset, num_targets_unreachable, current_targets, next_targets = - AB.SCOTSAbstraction._data(contr, autom, initlist, targetlist) + AB.NaiveAbstraction._data(contr, autom, initlist, targetlist) # Preallocates to make sure `_compute_controller_reach` does not need to allocate sizehint!(contr.data, 500) sizehint!(current_targets, 50) sizehint!(next_targets, 200) - @allocated AB.SCOTSAbstraction._compute_controller_reach!( + @allocated AB.NaiveAbstraction._compute_controller_reach!( contr, autom, initset, diff --git a/test/optim/unit_tests_SCOTS/test_controllersafe.jl b/test/optim/unit_tests_NaiveAbstraction/test_controllersafe.jl similarity index 96% rename from test/optim/unit_tests_SCOTS/test_controllersafe.jl rename to test/optim/unit_tests_NaiveAbstraction/test_controllersafe.jl index c07fd41f2..b6137f9a7 100644 --- a/test/optim/unit_tests_SCOTS/test_controllersafe.jl +++ b/test/optim/unit_tests_NaiveAbstraction/test_controllersafe.jl @@ -74,8 +74,8 @@ println("Started test") push!(safelist, SY.get_state_by_xpos(symmodel, pos)) end - contr = AB.SCOTSAbstraction.NewControllerList() - AB.SCOTSAbstraction.compute_controller_safe!(contr, symmodel.autom, initlist, safelist) + contr = AB.NaiveAbstraction.NewControllerList() + AB.NaiveAbstraction.compute_controller_safe!(contr, symmodel.autom, initlist, safelist) @test length(contr) == 15043 invlist = Int[] diff --git a/test/optim/unit_tests_SCOTS/test_fromcontrolsystemgrowth.jl b/test/optim/unit_tests_NaiveAbstraction/test_fromcontrolsystemgrowth.jl similarity index 100% rename from test/optim/unit_tests_SCOTS/test_fromcontrolsystemgrowth.jl rename to test/optim/unit_tests_NaiveAbstraction/test_fromcontrolsystemgrowth.jl diff --git a/test/optim/unit_tests_SCOTS/test_fromcontrolsystemlinearized.jl b/test/optim/unit_tests_NaiveAbstraction/test_fromcontrolsystemlinearized.jl similarity index 100% rename from test/optim/unit_tests_SCOTS/test_fromcontrolsystemlinearized.jl rename to test/optim/unit_tests_NaiveAbstraction/test_fromcontrolsystemlinearized.jl diff --git a/test/runtests.jl b/test/runtests.jl index c115dac47..aff17d61b 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -23,13 +23,13 @@ include("./symbolic/test_ellipsoidal_transitions.jl") include("./problem/test_problems.jl") -include("./optim/unit_tests_SCOTS/test_controller.jl") -include("./optim/unit_tests_SCOTS/test_controllerreach.jl") -include("./optim/unit_tests_SCOTS/test_controllersafe.jl") -include("./optim/unit_tests_SCOTS/test_fromcontrolsystemgrowth.jl") -include("./optim/unit_tests_SCOTS/test_fromcontrolsystemlinearized.jl") -include("./optim/test_SCOTS_safety.jl") -include("./optim/test_SCOTS_reachability.jl") +include("./optim/unit_tests_NaiveAbstraction/test_controller.jl") +include("./optim/unit_tests_NaiveAbstraction/test_controllerreach.jl") +include("./optim/unit_tests_NaiveAbstraction/test_controllersafe.jl") +include("./optim/unit_tests_NaiveAbstraction/test_fromcontrolsystemgrowth.jl") +include("./optim/unit_tests_NaiveAbstraction/test_fromcontrolsystemlinearized.jl") +include("./optim/test_NaiveAbstraction_safety.jl") +include("./optim/test_NaiveAbstraction_reachability.jl") include("./optim/test_lazy_abstraction.jl") include("./optim/test_ellipsoids_abstraction.jl") include("./optim/test_lazy_ellipsoids_abstraction.jl")