diff --git a/src/variable.jl b/src/variable.jl index 87e64a03..8075b81a 100644 --- a/src/variable.jl +++ b/src/variable.jl @@ -47,9 +47,16 @@ Returns whether variables of the given type are commutative, i.e., whether `x * y == y * x`. """ function is_commutative end +function is_commutative( + ::Type{P}, +) where {P<:Union{AbstractTerm,AbstractPolynomial}} + return is_commutative(monomial_type(P)) +end is_commutative(p::_APL) = is_commutative(typeof(p)) is_commutative(v::AbstractVector) = is_commutative(eltype(v)) +is_commutative(::Type{V}) where {V<:AbstractVector} = is_commutative(eltype(V)) is_commutative(v::Tuple) = all(is_commutative, v) +is_commutative(::Type{T}) where {T<:Tuple} = all(is_commutative, fieldtypes(T)) """ name(v::AbstractVariable)::AbstractString diff --git a/test/commutative/variable.jl b/test/commutative/variable.jl index 366ee680..53ee1391 100644 --- a/test/commutative/variable.jl +++ b/test/commutative/variable.jl @@ -2,6 +2,18 @@ import MultivariatePolynomials: AbstractVariable, similar_variable, @similar_variable @testset "Variable" begin + @testset "is_commutative" begin + function _is_comm_test(p) + @test MP.is_commutative(p) + @test MP.is_commutative(typeof(p)) + end + Mod.@polyvar x y[1:2] + _is_comm_test(x) + _is_comm_test(y) + _is_comm_test(x^2) + _is_comm_test(2x^2) + _is_comm_test(sum(y)) + end @testset "polyvar macro index set" begin Mod.@polyvar x y z Mod.@polyvar x[1:3] y z[1:2] diff --git a/test/noncommutative/monomial.jl b/test/noncommutative/monomial.jl index fe3252da..53ee1182 100644 --- a/test/noncommutative/monomial.jl +++ b/test/noncommutative/monomial.jl @@ -92,3 +92,15 @@ end @test collect(exponents(X1[i])) == collect(exponents(X2[i])) == Z[i] end end +@testset "is_commutative" begin + function _is_comm_test(p) + @test !MP.is_commutative(p) + @test !MP.is_commutative(typeof(p)) + end + Mod.@ncpolyvar x y[1:2] + _is_comm_test(x) + _is_comm_test(y) + _is_comm_test(x^2) + _is_comm_test(2x^2) + _is_comm_test(sum(y)) +end