diff --git a/REQUIRE b/REQUIRE index 4f32cce..914cdc9 100644 --- a/REQUIRE +++ b/REQUIRE @@ -2,3 +2,4 @@ julia 0.5 IntervalArithmetic 0.9.1 IntervalRootFinding 0.1 +LightGraphs 0.9 diff --git a/src/IntervalOptimisation.jl b/src/IntervalOptimisation.jl index 7845b75..b92f0d9 100644 --- a/src/IntervalOptimisation.jl +++ b/src/IntervalOptimisation.jl @@ -3,12 +3,18 @@ module IntervalOptimisation export minimise, maximise, - minimize, maximize + minimize, maximize, + unify + include("SortedVectors.jl") using .SortedVectors using IntervalArithmetic, IntervalRootFinding +using LightGraphs # for unifying intervals + +const Interval=IntervalArithmetic.Interval + if !isdefined(:sup) const sup = supremum @@ -21,6 +27,6 @@ end include("optimise.jl") const minimize = minimise -const maximize = maximise +const maximize = maximise end diff --git a/src/optimise.jl b/src/optimise.jl index 337b8f4..1799f63 100644 --- a/src/optimise.jl +++ b/src/optimise.jl @@ -60,3 +60,22 @@ function maximise{T}(f, X::T, tol=1e-3) bound, minimizers = minimise(x -> -f(x), X, tol) return -bound, minimizers end + + + +function unify(minimisers) + + n = length(minimisers) + g = Graph(length(minimisers)) + + for i in 1:n, j in i+1:n + if !isempty(minimisers[i] ∩ minimisers[j]) + add_edge!(g, i, j) + end + end + + components = LightGraphs.connected_components(g) + + return [reduce(union, minimisers[components[i]]) for i in 1:length(components)] + +end