diff --git a/Project.toml b/Project.toml index 91e242d6..3e6d0030 100644 --- a/Project.toml +++ b/Project.toml @@ -6,12 +6,22 @@ version = "0.1.6" [deps] CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" IntervalArithmetic = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" +IntervalConstraintProgramming = "138f1668-1576-5ad7-91b9-7425abbf3153" +LazySets = "b4f0291d-fe17-52bc-9479-3d1a343d9043" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" OpenBLASConsistentFPCSR_jll = "6cdc7f73-28fd-5e50-80fb-958a8875b1af" Reexport = "189a3867-3050-52da-a836-e630ba90ab69" Requires = "ae029012-a4dd-5104-9daa-d747884805df" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" +[extensions] +IntervalConstraintProgrammingExt = "IntervalConstraintProgramming" +LazySetsExt = "LazySets" + +[weakdeps] +IntervalConstraintProgramming = "138f1668-1576-5ad7-91b9-7425abbf3153" +LazySets = "b4f0291d-fe17-52bc-9479-3d1a343d9043" + [compat] CommonSolve = "0.2" IntervalArithmetic = "0.20.5" diff --git a/src/linear_systems/oettli_nonlinear.jl b/ext/IntervalConstraintProgrammingExt.jl similarity index 74% rename from src/linear_systems/oettli_nonlinear.jl rename to ext/IntervalConstraintProgrammingExt.jl index 0548f349..d0592d54 100644 --- a/src/linear_systems/oettli_nonlinear.jl +++ b/ext/IntervalConstraintProgrammingExt.jl @@ -1,4 +1,12 @@ -using .IntervalConstraintProgramming +module IntervalConstraintProgrammingExt + +if !isdefined(Base, :get_extension) + using ..IntervalLinearAlgebra + using ..IntervalConstraintProgramming +else + using IntervalLinearAlgebra + using IntervalConstraintProgramming +end """ returns the unrolled expression for \$|a ⋅x - b|\$ @@ -44,18 +52,17 @@ function oettli_eq(a, b, x) rhs = oettli_rhs(ar, br, x) ex = :(@constraint $lhs - $rhs <= 0) @eval $ex - end - - -function (op::NonLinearOettliPrager)(A, b, X::IntervalBox) +function (op::IntervalLinearAlgebra.NonLinearOettliPrager)(A, b, X::IntervalBox) vars = ntuple(i -> Symbol(:x, i), length(b)) separators = [oettli_eq(A[i,:], b[i], vars) for i in 1:length(b)] S = reduce(∩, separators) return Base.invokelatest(pave, S, X, op.tol) end -(op::NonLinearOettliPrager)(A, b, X=enclose(A, b)) = op(A, b, IntervalBox(X)) +(op::IntervalLinearAlgebra.NonLinearOettliPrager)(A, b, X=enclose(A, b)) = op(A, b, IntervalBox(X)) + +IntervalLinearAlgebra._default_precondition(_, ::NonLinearOettliPrager) = NoPrecondition() -_default_precondition(_, ::NonLinearOettliPrager) = NoPrecondition() +end diff --git a/src/linear_systems/oettli_linear.jl b/ext/LazySetsExt.jl similarity index 60% rename from src/linear_systems/oettli_linear.jl rename to ext/LazySetsExt.jl index 3c8c5005..ec93c791 100644 --- a/src/linear_systems/oettli_linear.jl +++ b/ext/LazySetsExt.jl @@ -1,6 +1,14 @@ -using .LazySets +module LazySetsExt -function (opl::LinearOettliPrager)(A, b) +if !isdefined(Base, :get_extension) + using ..IntervalLinearAlgebra + using ..LazySets +else + using IntervalLinearAlgebra + using LazySets +end + +function (opl::IntervalLinearAlgebra.LinearOettliPrager)(A, b) n = length(b) Ac = mid.(A) bc = mid.(b) @@ -22,4 +30,6 @@ function (opl::LinearOettliPrager)(A, b) return identity.(filter!(!isempty, polytopes)) end -_default_precondition(_, ::LinearOettliPrager) = NoPrecondition() +IntervalLinearAlgebra._default_precondition(_, ::LinearOettliPrager) = NoPrecondition() + +end diff --git a/src/IntervalLinearAlgebra.jl b/src/IntervalLinearAlgebra.jl index 975af56d..db7f9576 100644 --- a/src/IntervalLinearAlgebra.jl +++ b/src/IntervalLinearAlgebra.jl @@ -1,8 +1,12 @@ module IntervalLinearAlgebra -using StaticArrays, Requires, Reexport +using StaticArrays, Reexport using LinearAlgebra: checksquare +if !isdefined(Base, :get_extension) + using Requires +end + import Base: +, -, *, /, \, ==, show, convert, promote_rule, zero, one, getindex, IndexStyle, setindex!, size @@ -54,20 +58,23 @@ else end function __init__() - @require IntervalConstraintProgramming = "138f1668-1576-5ad7-91b9-7425abbf3153" include("linear_systems/oettli_nonlinear.jl") - @require LazySets = "b4f0291d-fe17-52bc-9479-3d1a343d9043" include("linear_systems/oettli_linear.jl") + @static if !isdefined(Base, :get_extension) + @require IntervalConstraintProgramming = "138f1668-1576-5ad7-91b9-7425abbf3153" include("../ext/IntervalConstraintProgrammingExt.jl") + @require LazySets = "b4f0291d-fe17-52bc-9479-3d1a343d9043" include("../ext/LazySetsExt.jl") + end + if Sys.ARCH == :x86_64 @info "Switching to OpenBLAS with ConsistentFPCSR = 1 flag enabled, guarantees correct floating point rounding mode over all threads." BLAS.lbt_forward(OpenBLASConsistentFPCSR_jll.libopenblas_path; verbose = true) - + N = BLAS.get_num_threads() K = 1024 if NumericalTest.rounding_test(N, K) @info "OpenBLAS is giving correct rounding on a ($K,$K) test matrix on $N threads" else @warn "OpenBLAS is not rounding correctly on the test matrix" - @warn "The number of BLAS threads was set to 1 to ensure rounding mode is consistent" + @warn "The number of BLAS threads was set to 1 to ensure rounding mode is consistent" if !NumericalTest.rounding_test(1, K) @warn "The rounding test failed on 1 thread" end