From 0bdd68715416840f3d8255820f787657e77fd764 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Fri, 6 Jan 2017 21:39:56 -0500 Subject: [PATCH 1/5] Make unary minus work --- src/reverse_mode.jl | 1 + test/runtests.jl | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/reverse_mode.jl b/src/reverse_mode.jl index ba13f33..3ae1e73 100644 --- a/src/reverse_mode.jl +++ b/src/reverse_mode.jl @@ -35,6 +35,7 @@ end minus_rev(a,b,c) = minus_rev(promote(a,b,c)...) +minus_rev(a::Interval, b::Interval) = (b = -a; return (a, b)) # a = -b function mul_rev(a::Interval, b::Interval, c::Interval) # a = b * c # a = a ∩ (b * c) diff --git a/test/runtests.jl b/test/runtests.jl index 11e6e2f..ab01fc3 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -158,3 +158,9 @@ end @test C3(A, x) == IntervalBox(sqrt(A / 16)) end + +@testset "Unary minus" begin + x = IntervalBox(-∞..∞) + C6 = @constraint 1 <= -x <= 3 + @test C6(x)[1] == Interval(-3, -1) +end From bde9f772978c316afa8bd20b02074361641d04b0 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Fri, 6 Jan 2017 21:45:15 -0500 Subject: [PATCH 2/5] Make power_rev work with odd powers for intervals with negative regions --- src/reverse_mode.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/reverse_mode.jl b/src/reverse_mode.jl index 3ae1e73..717a2ab 100644 --- a/src/reverse_mode.jl +++ b/src/reverse_mode.jl @@ -49,6 +49,8 @@ mul_rev(a,b,c) = mul_rev(promote(a,b,c)...) Base.iseven(x::Interval) = isinteger(x) && iseven(round(Int, x.lo)) +Base.isodd(x::Interval) = isinteger(x) && isodd(round(Int, x.lo)) + function power_rev(a::Interval, b::Interval, c::Interval) # a = b^c, log(a) = c.log(b), b = a^(1/c) @@ -66,6 +68,12 @@ function power_rev(a::Interval, b::Interval, c::Interval) # a = b^c, log(a) = b = hull(b1, b2) + elseif isodd(c) + b1 = b ∩ ( (a ∩ (0..∞)) ^(inv(c) )) # positive part + b2 = b ∩ (- ( (-(a ∩ (-∞..0)))^(inv(c)) ) ) # negative part + + b = hull(b1, b2) + else b = b ∩ ( a^(inv(c) )) From d1f6b67bc960c64242602d10c230bd0690401137 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Fri, 6 Jan 2017 23:17:09 -0500 Subject: [PATCH 3/5] Split up repeated addition and multiplication. Needs test. --- src/ast.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ast.jl b/src/ast.jl index c4f8088..5683c87 100644 --- a/src/ast.jl +++ b/src/ast.jl @@ -259,9 +259,7 @@ function process_call!(flatAST::FlatAST, ex, new_var=nothing) # TODO: Use @match here! if op in (:+, :*) && length(ex.args) > 3 - return flatten!(flatAST, - :( ($op)($(ex.args[2]), ($op)($(ex.args[3:end]...) )) ) - ) + return flatten!(flatAST, :( ($op)($(ex.args[2]), ($op)($(ex.args[3:end]...) )) )) end top_args = [] From d6b346578b96a283b4176491b8f0d345a23eed70 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Sat, 7 Jan 2017 07:51:27 -0500 Subject: [PATCH 4/5] Add test for power_rev with odd power --- test/runtests.jl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/runtests.jl b/test/runtests.jl index ab01fc3..3b29909 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -159,8 +159,15 @@ end @test C3(A, x) == IntervalBox(sqrt(A / 16)) end +<<<<<<< d1f6b67bc960c64242602d10c230bd0690401137 @testset "Unary minus" begin x = IntervalBox(-∞..∞) C6 = @constraint 1 <= -x <= 3 @test C6(x)[1] == Interval(-3, -1) +======= +@testset "power_rev for odd power" begin + x = -∞..∞ + a = -8..27 + power_rev(a, x, 3)[2] == Interval(-2.0000000000000004, 3.0000000000000004) +>>>>>>> Add test for power_rev with odd power end From 6b49128a1a65b44db1892f324ee3ff636a313d96 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Sat, 7 Jan 2017 07:56:15 -0500 Subject: [PATCH 5/5] Fix rebase --- test/runtests.jl | 7 ------- 1 file changed, 7 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index 3b29909..4a40c4f 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -159,15 +159,8 @@ end @test C3(A, x) == IntervalBox(sqrt(A / 16)) end -<<<<<<< d1f6b67bc960c64242602d10c230bd0690401137 -@testset "Unary minus" begin - x = IntervalBox(-∞..∞) - C6 = @constraint 1 <= -x <= 3 - @test C6(x)[1] == Interval(-3, -1) -======= @testset "power_rev for odd power" begin x = -∞..∞ a = -8..27 power_rev(a, x, 3)[2] == Interval(-2.0000000000000004, 3.0000000000000004) ->>>>>>> Add test for power_rev with odd power end