diff --git a/Project.toml b/Project.toml index 1dc7125..3bccd15 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Infinities" uuid = "e1ba4f0e-776d-440f-acd9-e1d2e9742647" authors = ["Sheehan Olver "] -version = "0.1.9" +version = "0.1.10" [compat] Aqua = "0.8" diff --git a/src/Infinities.jl b/src/Infinities.jl index 1706a27..5c2657f 100644 --- a/src/Infinities.jl +++ b/src/Infinities.jl @@ -1,6 +1,6 @@ module Infinities -import Base: angle, isone, iszero, isinf, isfinite, abs, one, oneunit, zero, isless, +import Base: angle, isone, iszero, isinf, isfinite, abs, one, oneunit, zero, isless, inv, +, -, *, ==, <, ≤, >, ≥, fld, cld, div, mod, min, max, sign, signbit, string, show, promote_rule, convert, getindex @@ -42,6 +42,7 @@ one(::Type{Infinity}) = 1 oneunit(::Type{Infinity}) = 1 oneunit(::Infinity) = 1 zero(::Infinity) = 0 +zero(::Type{Infinity}) = 0 struct RealInfinity <: Real signbit::Bool @@ -70,6 +71,13 @@ show(io::IO, y::RealInfinity) = print(io, string(y)) Base.to_index(i::RealInfinity) = convert(Integer, i) +one(::Type{RealInfinity}) = 1.0 +oneunit(::Type{RealInfinity}) = 1.0 +oneunit(::RealInfinity) = 1.0 +zero(::RealInfinity) = 0.0 +zero(::Type{RealInfinity}) = 0.0 + + ####### # ComplexInfinity ####### @@ -110,6 +118,12 @@ angle(x::ComplexInfinity) = π*x.signbit show(io::IO, x::ComplexInfinity) = print(io, "exp($(x.signbit)*im*π)∞") +one(::Type{<:ComplexInfinity}) = one(ComplexF64) +oneunit(::Type{<:ComplexInfinity}) = oneunit(ComplexF64) +oneunit(::ComplexInfinity) = oneunit(ComplexF64) +zero(::ComplexInfinity) = zero(ComplexF64) +zero(::Type{<:ComplexInfinity}) = zero(ComplexF64) + Base.hash(::Infinity) = 0x020113134b21797f # made up diff --git a/src/algebra.jl b/src/algebra.jl index 058fd82..7311748 100644 --- a/src/algebra.jl +++ b/src/algebra.jl @@ -86,4 +86,11 @@ for OP in (:fld,:cld,:div) $OP(x::IntegerInfinities, y::Real) = _inffcd(x, y) $OP(::IntegerInfinities, ::IntegerInfinities) = NotANumber() end -end \ No newline at end of file +end + +# Base.literal_pow + +# inv +inv(::Union{Infinity,InfiniteCardinal}) = 0 +inv(x::RealInfinity) = inv(float(x)) +inv(x::ComplexInfinity) = zero(ComplexF64) \ No newline at end of file diff --git a/src/cardinality.jl b/src/cardinality.jl index b284015..afbea1d 100644 --- a/src/cardinality.jl +++ b/src/cardinality.jl @@ -43,7 +43,15 @@ end Base.to_index(::Union{Infinity,InfiniteCardinal{0}}) = ℵ₀ Base.to_shape(::Union{Infinity,InfiniteCardinal{0}}) = ℵ₀ -Base.to_shape(dims::Tuple{Vararg{Union{Infinity, Integer, AbstractUnitRange}}}) = map(Base.to_shape, dims) + +# only vectors, matrices, 3-tensors are supported +Base.to_shape(dims::Tuple{Infinity, Vararg{Union{Integer, AbstractUnitRange}}}) = map(Base.to_shape, dims) +Base.to_shape(dims::Tuple{Infinity, Infinity, Vararg{Union{Integer, AbstractUnitRange}}}) = map(Base.to_shape, dims) +Base.to_shape(dims::Tuple{Union{Integer, AbstractUnitRange}, Infinity, Vararg{Union{Integer, AbstractUnitRange}}}) = map(Base.to_shape, dims) +Base.to_shape(dims::Tuple{Infinity, Infinity, Infinity, Vararg{Union{Integer, AbstractUnitRange}}}) = map(Base.to_shape, dims) +Base.to_shape(dims::Tuple{Infinity, Union{Integer, AbstractUnitRange}, Infinity, Vararg{Union{Integer, AbstractUnitRange}}}) = map(Base.to_shape, dims) +Base.to_shape(dims::Tuple{Union{Integer, AbstractUnitRange}, Infinity, Infinity, Vararg{Union{Integer, AbstractUnitRange}}}) = map(Base.to_shape, dims) +Base.to_shape(dims::Tuple{Union{Integer, AbstractUnitRange}, Union{Integer, AbstractUnitRange}, Infinity, Vararg{Union{Integer, AbstractUnitRange}}}) = map(Base.to_shape, dims) ## diff --git a/test/runtests.jl b/test/runtests.jl index 84ee6eb..5302444 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -296,12 +296,41 @@ using Aqua @test ∞ in s @test 2 ∉ s end + + @testset "Base.literal_pow" begin + @test Base.literal_pow(^, ℵ₀, Val(0)) ≡ ℵ₀^0 ≡ 1 + @test Base.literal_pow(^, ℵ₀, Val(1)) ≡ ℵ₀^1 ≡ ℵ₀ + @test Base.literal_pow(^, ℵ₀, Val(-1)) ≡ ℵ₀^(-1) ≡ 0 + + @test Base.literal_pow(^, ∞, Val(0)) ≡ ∞^0 ≡ 1 + @test Base.literal_pow(^, ∞, Val(1)) ≡ ∞^1 ≡ ∞ + @test Base.literal_pow(^, ∞, Val(-1)) ≡ ∞^(-1) ≡ 0 + + @test Base.literal_pow(^, -∞, Val(0)) ≡ (-∞)^0 ≡ 1.0 + @test Base.literal_pow(^, -∞, Val(1)) ≡ (-∞)^1 ≡ -∞ + @test Base.literal_pow(^, -∞, Val(-1)) ≡ (-∞)^(-1) ≡ 0.0 + + @test Base.literal_pow(^, ComplexInfinity(0.1), Val(0)) ≡ ComplexInfinity(0.1)^0 ≡ 1.0+0.0im + @test Base.literal_pow(^, ComplexInfinity(0.1), Val(1)) ≡ (ComplexInfinity(0.1))^1 ≡ ComplexInfinity(0.1) + @test Base.literal_pow(^, ComplexInfinity(0.1), Val(-1)) ≡ (ComplexInfinity(0.1))^(-1) ≡ 0.0+0.0im + end + + @testset "one/zero/oneunit" begin + @test one(ℵ₀) ≡ one(∞)≡ one(ℵ₀) ≡ oneunit(∞) ≡ one(Infinity) ≡ one(InfiniteCardinal{0}) ≡ oneunit(Infinity) ≡ oneunit(InfiniteCardinal{0}) ≡ 1 + @test one(-∞) ≡ oneunit(-∞) ≡ one(RealInfinity) ≡ oneunit(RealInfinity) ≡ 1.0 + @test one(exp(0.1im)∞) ≡ oneunit(exp(0.1im)∞) ≡ one(ComplexInfinity) ≡ oneunit(ComplexInfinity) ≡ 1.0+0.0im + + @test zero(ℵ₀) ≡ zero(∞) ≡ zero(Infinity) ≡ zero(InfiniteCardinal{0}) ≡ 0 + @test zero(-∞) ≡ zero(RealInfinity) ≡ 0.0 + @test zero(exp(0.1im)∞) ≡ zero(ComplexInfinity) ≡ 0.0+0.0im + end end + include("test_cardinality.jl") include("test_ambiguity.jl") @testset "Project quality" begin - Aqua.test_all(Infinities, piracies=(; broken=true)) + Aqua.test_all(Infinities) end diff --git a/test/test_cardinality.jl b/test/test_cardinality.jl index 5299f76..96584c3 100644 --- a/test/test_cardinality.jl +++ b/test/test_cardinality.jl @@ -161,6 +161,15 @@ using Infinities, Base64, Base.Checked, Test @test string(ℵ₁) == stringmime("text/plain", ℵ₁) == "ℵ₁" @test Base.to_index(ℵ₀) ≡ Base.to_shape(ℵ₀) ≡ ℵ₀ @test Base.to_shape((∞,)) ≡ (ℵ₀,) + @test Base.to_shape((∞,∞)) ≡ (ℵ₀,ℵ₀) + @test Base.to_shape((∞,1)) ≡ (ℵ₀,1) + @test Base.to_shape((1,∞)) ≡ (1,ℵ₀) + @test Base.to_shape((∞,∞,∞)) ≡ (ℵ₀,ℵ₀,ℵ₀) + @test Base.to_shape((∞,1,∞)) ≡ (ℵ₀,1,ℵ₀) + @test Base.to_shape((∞,∞,1)) ≡ (ℵ₀,ℵ₀,1) + @test Base.to_shape((1,∞,∞)) ≡ (1,ℵ₀,ℵ₀) + @test Base.to_shape((1,1,∞)) ≡ (1,1,ℵ₀) + @testset "Set" begin s = Set([ℵ₀,ℵ₁,∞,1])