Skip to content

Commit 81f936e

Browse files
committed
Promote NoInverse for Composed and mapped/broadcasted
1 parent 5c5374b commit 81f936e

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

src/inverse.jl

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,25 @@ inverse(f::NoInverse) = f.f
7575
inverse(::typeof(inverse)) = inverse
7676

7777
@static if VERSION >= v"1.6"
78-
inverse(f::Base.ComposedFunction) = Base.ComposedFunction(inverse(f.inner), inverse(f.outer))
78+
function inverse(f::Base.ComposedFunction)
79+
inv_inner = inverse(f.inner)
80+
inv_outer = inverse(f.outer)
81+
if inv_inner isa NoInverse || inv_outer isa NoInverse
82+
NoInverse(f)
83+
else
84+
Base.ComposedFunction(inv_inner, inv_outer)
85+
end
86+
end
7987
end
8088

81-
inverse(mapped_f::Base.Fix1{<:Union{typeof(map),typeof(broadcast)}}) = Base.Fix1(mapped_f.f, inverse(mapped_f.x))
89+
function inverse(mapped_f::Base.Fix1{<:Union{typeof(map),typeof(broadcast)}})
90+
inv_f_kernel = inverse(mapped_f.x)
91+
if inv_f_kernel isa NoInverse
92+
NoInverse(mapped_f)
93+
else
94+
Base.Fix1(mapped_f.f, inverse(mapped_f.x))
95+
end
96+
end
8297

8398
inverse(::typeof(identity)) = identity
8499
inverse(::typeof(inv)) = inv

test/test_inverse.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,15 @@ InverseFunctions.inverse(f::Bar) = Bar(inv(f.A))
2020

2121

2222
@testset "inverse" begin
23-
f_without_inverse(x) = x^2
23+
f_without_inverse(x) = 1
2424
@test inverse(f_without_inverse) isa NoInverse
2525
@test_throws ErrorException inverse(f_without_inverse)(42)
2626
@test inverse(inverse(f_without_inverse)) === f_without_inverse
2727

28+
for f in (f_without_inverse exp, exp f_without_inverse, Base.Fix1(broadcast, f_without_inverse), Base.Fix1(map, f_without_inverse))
29+
@test inverse(f) == NoInverse(f)
30+
@test inverse(inverse(f)) == f
31+
end
2832

2933
InverseFunctions.test_inverse(inverse, log, compare = ===)
3034

0 commit comments

Comments
 (0)