From 9cc1077b3d11852e1670d37c60063333d0f2b1bb Mon Sep 17 00:00:00 2001 From: David Sanders Date: Sat, 29 Apr 2017 19:50:14 -0500 Subject: [PATCH 1/5] Replace reverse_mode.jl with using IntervalContractors package --- src/IntervalConstraintProgramming.jl | 5 +++-- test/runtests.jl | 6 ------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/IntervalConstraintProgramming.jl b/src/IntervalConstraintProgramming.jl index 936e75a..2154470 100644 --- a/src/IntervalConstraintProgramming.jl +++ b/src/IntervalConstraintProgramming.jl @@ -2,7 +2,9 @@ __precompile__() module IntervalConstraintProgramming -using IntervalArithmetic, IntervalRootFinding +using IntervalArithmetic, + IntervalRootFinding, + IntervalContractors using MacroTools @@ -21,7 +23,6 @@ export show_code -include("reverse_mode.jl") include("ast.jl") include("code_generation.jl") include("contractor.jl") diff --git a/test/runtests.jl b/test/runtests.jl index bac3e49..4a9208d 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -163,9 +163,3 @@ end @test C3(A, x) == IntervalBox(sqrt(A / 16)) end - -@testset "power_rev for odd power" begin - x = -∞..∞ - a = -8..27 - power_rev(a, x, 3)[2] == Interval(-2.0000000000000004, 3.0000000000000004) -end From 7fc3c3740149c6f8a6e7b62565e925a541e78f6a Mon Sep 17 00:00:00 2001 From: David Sanders Date: Sat, 29 Apr 2017 19:52:29 -0500 Subject: [PATCH 2/5] Make alias for unexported rev_ops --- src/IntervalConstraintProgramming.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/IntervalConstraintProgramming.jl b/src/IntervalConstraintProgramming.jl index 2154470..5608809 100644 --- a/src/IntervalConstraintProgramming.jl +++ b/src/IntervalConstraintProgramming.jl @@ -22,6 +22,7 @@ export Vol, show_code +const rev_ops = IntervalContractors.rev_ops include("ast.jl") include("code_generation.jl") From de24ec07d84481f50ef69aa249eba5fab969b0c3 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Mon, 1 May 2017 07:09:23 -0500 Subject: [PATCH 3/5] Remove reverse_mode.jl --- src/reverse_mode.jl | 130 -------------------------------------------- 1 file changed, 130 deletions(-) delete mode 100644 src/reverse_mode.jl diff --git a/src/reverse_mode.jl b/src/reverse_mode.jl deleted file mode 100644 index 185b109..0000000 --- a/src/reverse_mode.jl +++ /dev/null @@ -1,130 +0,0 @@ -export plus_rev, minus_rev, mul_rev, - power_rev, sqrt_rev, sqr_rev # export due to quoting issue - -# export sqr -# sqr(x) = x^2 - -const rev_ops = Dict( - :+ => :plus_rev, - :- => :minus_rev, - :* => :mul_rev, - :^ => :power_rev, - :sqrt => :sqrt_rev, - :sqr => :sqr_rev, - :() => :() - ) - - -function plus_rev(a::Interval, b::Interval, c::Interval) # a = b + c - # a = a ∩ (b + c) # add this line for plus contractor (as opposed to reverse function) - b = b ∩ (a - c) - c = c ∩ (a - b) - - return a, b, c -end - -plus_rev(a,b,c) = plus_rev(promote(a,b,c)...) - -function minus_rev(a::Interval, b::Interval, c::Interval) # a = b - c - # a = a ∩ (b - c) - b = b ∩ (a + c) - c = c ∩ (b - a) - - return a, b, c -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) - b = b ∩ (a / c) - c = c ∩ (a / b) - - return a, b, c -end - -mul_rev(a,b,c) = mul_rev(promote(a,b,c)...) - - -function power_rev(a::Interval, b::Interval, c::Integer) # a = b^c, log(a) = c.log(b), b = a^(1/c) - - if c == 2 # a = b^2 - b1 = b ∩ √a - b2 = b ∩ (-√a) - - b = hull(b1, b2) - - elseif iseven(c) - b1 = b ∩ ( a^(inv(c) )) - b2 = b ∩ ( -( a^(inv(c)) ) ) - - 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) - end - - return (a, b, c) -end - - -function power_rev(a::Interval, b::Interval, c::Interval) # a = b^c - - # log(a) = c.log(b), b = a^(1/c) - - b = b ∩ ( a^(inv(c) )) - c = c ∩ (log(a) / log(b)) - - return a, b, c -end - -power_rev(a, b, c) = power_rev(promote(a, b, c)...) - - -function sqrt_rev(a::Interval, b::Interval) # a = sqrt(b) - # a1 = a ∩ √b - # a2 = a ∩ (-(√b)) - # a = hull(a1, a2) - - b = b ∩ (a^2) - - return a, b -end - -sqrt_rev(a,b) = sqrt_rev(promote(a,b)...) - - -# IEEE-1788 style - -function sqr_rev(c, x) # c = x^2; refine x - x1 = sqrt(c) ∩ x - x2 = -(sqrt(c)) ∩ x - - return (c, hull(x1, x2)) -end - -sqr_rev(c) = sqr_rev(c, -∞..∞) - -""" -∘_rev1(b, c, x) is the subset of x such that x ∘ b is defined and in c -∘_rev2(a, c, x) is the subset of x such that a ∘ x is defined and in c - -If these agree (∘ is commutative) then call it ∘_rev(b, c, x) -""" - -function mul_rev_new(b, c, x) # c = b*x - return x ∩ (c / b) -end - -function pow_rev1(b, c, x) # c = x^b - return x ∩ c^(1/b) -end - -function pow_rev2(a, c, x) # c = a^x - return x ∩ (log(c) / lob(a)) -end From 5aa41dc3b19eebc30c89c3c77238ae7550f624bd Mon Sep 17 00:00:00 2001 From: David Sanders Date: Mon, 1 May 2017 07:10:27 -0500 Subject: [PATCH 4/5] Rename rev_ops -> reverse_operations --- src/IntervalConstraintProgramming.jl | 2 +- src/ast.jl | 2 +- src/code_generation.jl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/IntervalConstraintProgramming.jl b/src/IntervalConstraintProgramming.jl index 5608809..1c45d5b 100644 --- a/src/IntervalConstraintProgramming.jl +++ b/src/IntervalConstraintProgramming.jl @@ -22,7 +22,7 @@ export Vol, show_code -const rev_ops = IntervalContractors.rev_ops +const reverse_operations = IntervalContractors.reverse_operations include("ast.jl") include("code_generation.jl") diff --git a/src/ast.jl b/src/ast.jl index 13bb2b8..1c842a3 100644 --- a/src/ast.jl +++ b/src/ast.jl @@ -309,7 +309,7 @@ function process_call!(flatAST::FlatAST, ex, new_var=nothing) #@show op - if op ∈ keys(rev_ops) # standard operator + if op ∈ keys(reverse_operations) # standard operator if new_var == nothing new_var = make_symbol() end diff --git a/src/code_generation.jl b/src/code_generation.jl index c08c86e..e4a9474 100644 --- a/src/code_generation.jl +++ b/src/code_generation.jl @@ -53,7 +53,7 @@ function emit_backward_code(a::Assignment) args = isa(a.args, Vector) ? a.args : [a.args] return_args = [a.lhs, args...] - rev_op = rev_ops[a.op] # find reverse operation + rev_op = reverse_operations[a.op] # find reverse operation if rev_op == :() # empty args = make_tuple(args) From 3a22df1abf42bdbd6789a9f2bd86470529b9ec99 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Wed, 3 May 2017 21:11:07 -0500 Subject: [PATCH 5/5] Add IntervalContractors to REQUIRE --- REQUIRE | 1 + 1 file changed, 1 insertion(+) diff --git a/REQUIRE b/REQUIRE index efc5e6d..f81d81e 100644 --- a/REQUIRE +++ b/REQUIRE @@ -1,5 +1,6 @@ julia 0.5 IntervalArithmetic 0.9 IntervalRootFinding 0.1 +IntervalContractors 0.1 MacroTools 0.3