Skip to content

Commit 04082db

Browse files
authored
constant propagation in Space power (#360)
* constant propagation in Space power * version limit tests
1 parent bc51c6d commit 04082db

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

src/Multivariate/TensorSpace.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,14 +345,21 @@ Space(sp::ProductDomain) = TensorSpace(sp)
345345
setdomain(sp::TensorSpace, d::ProductDomain) = TensorSpace(setdomain.(factors(sp), factors(d)))
346346

347347
*(A::Space, B::Space) = A B
348-
function ^(A::Space, p::Integer)
348+
@inline function _powspace(A, p)
349349
p >= 1 || throw(ArgumentError("exponent must be >= 1, received $p"))
350350
# Enumerate common cases to help with constant propagation
351351
p == 1 ? A :
352352
p == 2 ? A * A :
353353
p == 3 ? A * A * A :
354354
foldl(*, ntuple(_ -> A, p))
355355
end
356+
@static if VERSION >= v"1.8"
357+
Base.@constprop :aggressive function ^(A::Space, p::Integer)
358+
_powspace(A, p)
359+
end
360+
else
361+
^(A::Space, p::Integer) = _powspace(A, p)
362+
end
356363

357364

358365
## TODO: generalize

test/SpacesTest.jl

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,15 @@ using LinearAlgebra
7171
end
7272
@test ApproxFunBase.intpow(f,-2) == f^-2 == 1/(f*f)
7373

74-
@test sp^1 == sp
75-
@test sp^2 == sp * sp
76-
@test sp^3 == sp * sp * sp
74+
if VERSION >= v"1.8"
75+
@test (@inferred (x -> x^1)(sp)) == sp
76+
@test (@inferred (x -> x^2)(sp)) == sp * sp
77+
@test (@inferred (x -> x^3)(sp)) == sp * sp * sp
78+
else
79+
@test sp^1 == sp
80+
@test sp^2 == sp * sp
81+
@test sp^3 == sp * sp * sp
82+
end
7783
@test sp^4 == sp * sp * sp * sp
7884
@test sp^5 == sp * sp * sp * sp * sp
7985
end

0 commit comments

Comments
 (0)