Skip to content

Commit 56da4ed

Browse files
authored
Merge pull request #124 from JuliaAlgebra/bl/mutable_arithmetics
Implement MutableArithmetics
2 parents 361c8d3 + 4032432 commit 56da4ed

13 files changed

+434
-38
lines changed

.travis.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ os:
55
julia:
66
- 1.0
77
- 1.1
8+
- 1.2
9+
- 1.3
810
- nightly
911

1012
matrix:

Project.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,20 @@ repo = "https://github.com/JuliaAlgebra/MultivariatePolynomials.jl"
55
version = "0.3.2"
66

77
[deps]
8+
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
89
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
10+
MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0"
911

1012
[compat]
13+
DataStructures = "0.17"
14+
MutableArithmetics = "0.1.1"
1115
julia = "1"
1216

1317
[extras]
1418
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
1519
DynamicPolynomials = "7c1d4256-1411-5781-91ec-d7bc3513ac07"
16-
TypedPolynomials = "afbbf031-7a57-5f58-a1b9-b774a0fad08d"
1720
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
21+
TypedPolynomials = "afbbf031-7a57-5f58-a1b9-b774a0fad08d"
1822

1923
[targets]
2024
test = ["BenchmarkTools", "DynamicPolynomials", "Test", "TypedPolynomials"]

appveyor.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
environment:
22
matrix:
3-
- julia_version: 0.7
3+
- julia_version: 1.0
4+
- julia_version: 1.1
5+
- julia_version: 1.2
6+
- julia_version: 1.3
47
- julia_version: latest
58

69
platform:

src/MultivariatePolynomials.jl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ module MultivariatePolynomials
22

33
import LinearAlgebra
44

5+
import DataStructures
6+
7+
import MutableArithmetics
8+
const MA = MutableArithmetics
9+
510
export AbstractPolynomialLike, AbstractTermLike, AbstractMonomialLike
611
"""
712
AbstractPolynomialLike{T}
@@ -10,13 +15,15 @@ Abstract type for a value that can act like a polynomial. For instance, an
1015
`AbstractTerm{T}` is an `AbstractPolynomialLike{T}` since it can act as a
1116
polynomial of only one term.
1217
"""
13-
abstract type AbstractPolynomialLike{T} end
18+
abstract type AbstractPolynomialLike{T} <: MA.AbstractMutable end
19+
1420
"""
1521
AbstractTermLike{T}
1622
1723
Abstract type for a value that can act like a term. For instance, an `AbstractMonomial` is an `AbstractTermLike{Int}` since it can act as a term with coefficient `1`.
1824
"""
1925
abstract type AbstractTermLike{T} <: AbstractPolynomialLike{T} end
26+
2027
"""
2128
AbstractMonomialLike
2229

src/conversion.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ export variable
22

33
function convertconstant end
44
Base.convert(::Type{P}, α) where P<:APL = convertconstant(P, α)
5-
function Base.convert(::Type{P}, p::P) where P<:AbstractPolynomial
5+
function Base.convert(::Type{P}, p::P) where {T, P<:AbstractPolynomial{T}}
66
return p
77
end
88
function Base.convert(::Type{P}, p::APL) where {T, P<:AbstractPolynomial{T}}
99
return convert(P, polynomial(p, T))
1010
end
1111

12+
MA.scaling(p::AbstractPolynomialLike{T}) where {T} = convert(T, p)
1213
Base.convert(::Type{Any}, p::APL) = p
1314
# Conversion polynomial -> scalar
1415
function Base.convert(S::Type{<:Union{Number, T}}, p::APL{T}) where T

src/differentiation.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ differentiate(α::T, v::AbstractVariable) where T = zero(T)
3737
differentiate(v1::AbstractVariable, v2::AbstractVariable) = v1 == v2 ? 1 : 0
3838
differentiate(t::AbstractTermLike, v::AbstractVariable) = coefficient(t) * differentiate(monomial(t), v)
3939
# The polynomial function will take care of removing the zeros
40-
differentiate(p::APL, v::AbstractVariable) = polynomial(differentiate.(terms(p), v), SortedState())
40+
differentiate(p::APL, v::AbstractVariable) = polynomial!(differentiate.(terms(p), v), SortedState())
4141
differentiate(p::RationalPoly, v::AbstractVariable) = (differentiate(p.num, v) * p.den - p.num * differentiate(p.den, v)) / p.den^2
4242

4343
const ARPL = Union{APL, RationalPoly}

src/monomial.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,12 @@ The multiplication `m1 * m2` is equivalent to `mapexponents(+, m1, m2)`, the uns
122122
"""
123123
mapexponents(f, m1::AbstractMonomialLike, m2::AbstractMonomialLike) = mapexponents(f, monomial(m1), monomial(m2))
124124

125+
function mapexponents_to! end
126+
function mapexponents! end
127+
125128
Base.one(::Type{TT}) where {TT<:AbstractMonomialLike} = constantmonomial(TT)
126129
Base.one(t::AbstractMonomialLike) = constantmonomial(t)
130+
MA.promote_operation(::typeof(one), MT::Type{<:AbstractMonomialLike}) = monomialtype(MT)
127131
# See https://github.com/JuliaAlgebra/MultivariatePolynomials.jl/issues/82
128132
# By default, Base do oneunit(v::VT) = VT(one(v)).
129133
# This tries to convert a monomial to a variable which does not work.

0 commit comments

Comments
 (0)