Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ version = "0.9.0"
CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2"
ControllerFormats = "02ac4b2c-022a-44aa-84a5-ea45a5754bcc"
LazySets = "b4f0291d-fe17-52bc-9479-3d1a343d9043"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
NeuralNetworkReachability = "5de1e908-2f08-45bf-a571-ac88a54f7e7f"
Parameters = "d96e819e-fc66-5662-9728-84c9c7592b0a"
ReachabilityAnalysis = "1e97bd63-91d1-579d-8e8d-501d2b57c93f"
Expand All @@ -28,6 +29,7 @@ ClosedLoopReachabilityOrdinaryDiffEqPlotsExt = ["OrdinaryDiffEq", "Plots"]
CommonSolve = "0.2"
ControllerFormats = "0.1 - 0.2"
LazySets = "7"
LinearAlgebra = "<0.0.1, 1.6"
NeuralNetworkReachability = "0.1"
OrdinaryDiffEq = "6"
Parameters = "0.12 - 0.13"
Expand Down
1 change: 1 addition & 0 deletions src/init.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ end
using Reexport: @reexport

using Base: isempty
using LinearAlgebra: isdiag
using ControllerFormats: ActivationFunction, DenseLayerOp, FeedforwardNetwork,
Id, ReLU
# controller formats and parsers
Expand Down
4 changes: 2 additions & 2 deletions src/setops.jl
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,8 @@ function _reconstruct(method::TaylorModelReconstructor, P₀::LazySet, U₀::Laz
vTM[n + i] = TaylorModel1(Taylor1(p, orderT), rem, zeroI, Δtn)
end
else
Z₀ = ReachabilityAnalysis._convert_or_overapproximate(U₀, Zonotope)
Z₀ = ReachabilityAnalysis._reduce_order(Z₀, 2; force_reduction=true)
Z₀ = ReachabilityAnalysis._convert_or_overapproximate(Zonotope, U₀)
Z₀ = reduce_order(Z₀, 2)
# NOTE if we used _overapproximate_structured directly :
# Utm₀ = set(ReachabilityAnalysis._overapproximate_structured(Z₀, TaylorModelReachSet, orderT=orderT, orderQ=orderQ))
# @inbounds for i in 1:m
Expand Down
22 changes: 12 additions & 10 deletions src/simulate.jl
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@ Base.getindex(ess::EnsembleSimulationSolution, i) = ess.solutions[i]
function solutions(ess::EnsembleSimulationSolution, i)
return EnsembleSimulationSolution([sol[i] for sol in ess.solutions])
end
trajectory(ess::EnsembleSimulationSolution, i) = trajectory(solution(ess, i))
trajectory(ess::EnsembleSimulationSolution, i) = trajectory(ess[i])
trajectories(ess::EnsembleSimulationSolution) = trajectory.(ess.solutions)
controls(ess::EnsembleSimulationSolution, i) = controls(solution(ess, i))
controls(ess::EnsembleSimulationSolution, i) = controls(ess[i])
controls(ess::EnsembleSimulationSolution) = controls.(ess.solutions)
disturbances(ess::EnsembleSimulationSolution, i) = disturbances(solution(ess, i))
disturbances(ess::EnsembleSimulationSolution, i) = disturbances(ess[i])
disturbances(ess::EnsembleSimulationSolution) = disturbances.(ess.solutions)

"""
Expand Down Expand Up @@ -71,7 +71,8 @@ function simulate(cp::AbstractControlProblem, args...; kwargs...)
st_vars = states(cp)
dist_vars = disturbances(cp)
X₀ = project(initial_state(cp), st_vars)
if !isempty(dist_vars)
use_disturbance = !isempty(dist_vars)
if use_disturbance
W₀ = project(initial_state(cp), dist_vars)
end
τ = period(cp)
Expand All @@ -92,6 +93,7 @@ function simulate(cp::AbstractControlProblem, args...; kwargs...)
# preallocate
extended = Vector{Vector{Float64}}(undef, trajectories)
simulations = _initialize_simulation_container(iterations)
@assert !isnothing(simulations)
all_controls = Vector{Vector{Vector{Float64}}}(undef, iterations)
all_disturbances = Vector{Vector{Vector{Float64}}}(undef, iterations)

Expand All @@ -107,19 +109,19 @@ function simulate(cp::AbstractControlProblem, args...; kwargs...)
all_controls[i] = control_signals

# compute disturbances
if !isempty(dist_vars)
if use_disturbance
@assert @isdefined W₀
disturbance_signals = sample(W₀, trajectories)
all_disturbances[i] = disturbance_signals
else
disturbance_signals = nothing
end

# extend system state with disturbances
for j in 1:trajectories
if isnothing(disturbance_signals)
extended[j] = vcat(x0_vec[j], control_signals[j])
else
if use_disturbance
@assert @isdefined disturbance_signals
extended[j] = vcat(x0_vec[j], disturbance_signals[j], control_signals[j])
else
extended[j] = vcat(x0_vec[j], control_signals[j])
end
end

Expand Down
2 changes: 2 additions & 0 deletions test/Project.toml
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
[deps]
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
ExplicitImports = "7d51a73a-1435-4ff3-83d9-f097790105c7"
JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

[compat]
Aqua = "0.8.9"
ExplicitImports = "1"
JET = "0.9 - 0.12"
Test = "<0.0.1, 1"
12 changes: 9 additions & 3 deletions test/quality_assurance.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using ClosedLoopReachability, Test
import Aqua, ExplicitImports
import Aqua, ExplicitImports, JET

@testset "ExplicitImports tests" begin
ignores_all_explicit_imports_are_public = (:AbstractContinuousPost, :AbstractLazyReachSet,
Expand All @@ -25,8 +25,9 @@ import Aqua, ExplicitImports
:center, :diam, :domain, :evaluate, :high, :initial_state,
:interval, :linear_map, :low, :mid, :ngens, :overapproximate,
:polynomial, :project, :radius_hyperrectangle, :rand,
:remainder, :rsetrep, :sample, :scale, :set, :size, :sup,
:system, :tend, :translate, :tstart, :(×), :shift, :vars)
:reduce_order, :remainder, :rsetrep, :sample, :scale, :set,
:size, :sup, :system, :tend, :translate, :tstart, :(×), :shift,
:vars)
ignores_no_self_qualified_accesses = (:controller,)
ExplicitImports.test_explicit_imports(ClosedLoopReachability;
all_explicit_imports_are_public=(ignore=ignores_all_explicit_imports_are_public,),
Expand All @@ -35,6 +36,11 @@ import Aqua, ExplicitImports
no_self_qualified_accesses=(ignore=ignores_no_self_qualified_accesses,))
end

@testset "JET tests" begin
# false positives for Base functionality
JET.test_package(ClosedLoopReachability; target_modules=(ClosedLoopReachability,))
end

@testset "Aqua tests" begin
Aqua.test_all(ClosedLoopReachability)
end
Loading