Skip to content

Commit 18a737d

Browse files
authored
Add format action (#254)
1 parent 47b1a87 commit 18a737d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+2582
-935
lines changed

.JuliaFormatter.toml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Configuration file for JuliaFormatter.jl
2+
# For more information, see: https://domluna.github.io/JuliaFormatter.jl/stable/config/
3+
4+
always_for_in = true
5+
always_use_return = true
6+
margin = 80
7+
remove_extra_newlines = true
8+
short_to_long_function_def = true

.github/workflows/format_check.yml

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
2+
name: format-check
3+
on:
4+
push:
5+
branches:
6+
- master
7+
- release-*
8+
pull_request:
9+
types: [opened, synchronize, reopened]
10+
jobs:
11+
build:
12+
runs-on: ubuntu-latest
13+
steps:
14+
- uses: julia-actions/setup-julia@latest
15+
with:
16+
version: '1'
17+
- uses: actions/checkout@v3
18+
- name: Format check
19+
shell: julia --color=yes {0}
20+
run: |
21+
using Pkg
22+
Pkg.add(PackageSpec(name="JuliaFormatter", version="1"))
23+
using JuliaFormatter
24+
format("src", verbose=true)
25+
format("test", verbose=true)
26+
out = String(read(Cmd(`git diff`)))
27+
if isempty(out)
28+
exit(0)
29+
end
30+
@error "Some files have not been formatted !!!"
31+
write(stdout, out)
32+
exit(1)

src/antidifferentiation.jl

+33-9
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,24 @@ function antidifferentiate end
2828

2929
# Fallback for everything else
3030
antidifferentiate::T, v::AbstractVariable) where {T} = α * v
31-
antidifferentiate(v1::AbstractVariable, v2::AbstractVariable) = v1 == v2 ? 1 // 2 * v1 * v2 : v1 * v2
32-
antidifferentiate(t::AbstractTermLike, v::AbstractVariable) = coefficient(t) * antidifferentiate(monomial(t), v)
33-
antidifferentiate(p::APL, v::AbstractVariable) = polynomial!(antidifferentiate.(terms(p), v), SortedState())
31+
function antidifferentiate(v1::AbstractVariable, v2::AbstractVariable)
32+
return v1 == v2 ? 1 // 2 * v1 * v2 : v1 * v2
33+
end
34+
function antidifferentiate(t::AbstractTermLike, v::AbstractVariable)
35+
return coefficient(t) * antidifferentiate(monomial(t), v)
36+
end
37+
function antidifferentiate(p::APL, v::AbstractVariable)
38+
return polynomial!(antidifferentiate.(terms(p), v), SortedState())
39+
end
3440

3541
# TODO: this signature is probably too wide and creates the potential
3642
# for stack overflows
3743
antidifferentiate(p::APL, xs) = [antidifferentiate(p, x) for x in xs]
3844

3945
# antidifferentiate(p, [x, y]) with TypedPolynomials promote x to a Monomial
40-
antidifferentiate(p::APL, m::AbstractMonomial) = antidifferentiate(p, variable(m))
46+
function antidifferentiate(p::APL, m::AbstractMonomial)
47+
return antidifferentiate(p, variable(m))
48+
end
4149

4250
# The `R` argument indicates a desired result type. We use this in order
4351
# to attempt to preserve type-stability even though the value of `deg` cannot
@@ -55,11 +63,27 @@ function (_antidifferentiate_recursive(p, x, deg::Int, ::Type{R})::R) where {R}
5563
end
5664
end
5765

58-
antidifferentiate(p, x, deg::Int) = _antidifferentiate_recursive(p, x, deg, Base.promote_op(antidifferentiate, typeof(p), typeof(x)))
59-
antidifferentiate(p::AbstractArray, x, deg::Int) = _antidifferentiate_recursive(p, x, deg, Any)
60-
antidifferentiate(p, x::Union{AbstractArray,Tuple}, deg::Int) = _antidifferentiate_recursive(p, x, deg, Any)
61-
antidifferentiate(p::AbstractArray, x::Union{AbstractArray,Tuple}, deg::Int) = _antidifferentiate_recursive(p, x, deg, Any)
62-
66+
function antidifferentiate(p, x, deg::Int)
67+
return _antidifferentiate_recursive(
68+
p,
69+
x,
70+
deg,
71+
Base.promote_op(antidifferentiate, typeof(p), typeof(x)),
72+
)
73+
end
74+
function antidifferentiate(p::AbstractArray, x, deg::Int)
75+
return _antidifferentiate_recursive(p, x, deg, Any)
76+
end
77+
function antidifferentiate(p, x::Union{AbstractArray,Tuple}, deg::Int)
78+
return _antidifferentiate_recursive(p, x, deg, Any)
79+
end
80+
function antidifferentiate(
81+
p::AbstractArray,
82+
x::Union{AbstractArray,Tuple},
83+
deg::Int,
84+
)
85+
return _antidifferentiate_recursive(p, x, deg, Any)
86+
end
6387

6488
# This is alternative, Val-based interface for nested antidifferentiation.
6589
# It has the advantage of not requiring an conversion or calls to

src/chain_rules.jl

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ function ChainRulesCore.frule((_, Δp, _), ::typeof(differentiate), p, x)
2222
return differentiate(p, x), differentiate(Δp, x)
2323
end
2424
function pullback(Δdpdx, x)
25-
return ChainRulesCore.NoTangent(), x * differentiate(x * Δdpdx, x), ChainRulesCore.NoTangent()
25+
return ChainRulesCore.NoTangent(),
26+
x * differentiate(x * Δdpdx, x),
27+
ChainRulesCore.NoTangent()
2628
end
2729
function ChainRulesCore.rrule(::typeof(differentiate), p, x)
2830
dpdx = differentiate(p, x)

src/comparison.jl

+47-19
Original file line numberDiff line numberDiff line change
@@ -109,35 +109,63 @@ end
109109
# end
110110
# return true
111111
#end
112-
Base.:(==)(p1::AbstractPolynomial, p2::AbstractPolynomial) = compare_terms(p1, p2, iszero, ==)
112+
function Base.:(==)(p1::AbstractPolynomial, p2::AbstractPolynomial)
113+
return compare_terms(p1, p2, iszero, ==)
114+
end
113115

114-
Base.:(==)(p::RationalPoly, q::RationalPoly) = p.num*q.den == q.num*p.den
116+
Base.:(==)(p::RationalPoly, q::RationalPoly) = p.num * q.den == q.num * p.den
115117
# Solve ambiguity with (::PolyType, ::Any)
116-
Base.:(==)(p::APL, q::RationalPoly) = p*q.den == q.num
118+
Base.:(==)(p::APL, q::RationalPoly) = p * q.den == q.num
117119
Base.:(==)(q::RationalPoly, p::APL) = p == q
118-
Base.:(==)(α, q::RationalPoly) = α*q.den == q.num
120+
Base.:(==)(α, q::RationalPoly) = α * q.den == q.num
119121
Base.:(==)(q::RationalPoly, α) = α == q
120122

121123
# α could be a JuMP affine expression
122-
isapproxzero(α; ztol::Real=0.) = false
123-
function isapproxzero::Number; ztol::Real=Base.rtoldefault(α, α, 0))
124-
abs(α) <= ztol
124+
isapproxzero(α; ztol::Real = 0.0) = false
125+
function isapproxzero::Number; ztol::Real = Base.rtoldefault(α, α, 0))
126+
return abs(α) <= ztol
125127
end
126128

127129
isapproxzero(m::AbstractMonomialLike; kwargs...) = false
128-
isapproxzero(t::AbstractTermLike; kwargs...) = isapproxzero(coefficient(t); kwargs...)
129-
isapproxzero(p::APL; kwargs...) = all(term -> isapproxzero(term; kwargs...), terms(p))
130+
function isapproxzero(t::AbstractTermLike; kwargs...)
131+
return isapproxzero(coefficient(t); kwargs...)
132+
end
133+
function isapproxzero(p::APL; kwargs...)
134+
return all(term -> isapproxzero(term; kwargs...), terms(p))
135+
end
130136
isapproxzero(p::RationalPoly; kwargs...) = isapproxzero(p.num; kwargs...)
131137

132-
Base.isapprox(t1::AbstractTerm, t2::AbstractTerm; kwargs...) = isapprox(coefficient(t1), coefficient(t2); kwargs...) && monomial(t1) == monomial(t2)
133-
function Base.isapprox(p1::AbstractPolynomial{S}, p2::AbstractPolynomial{T};
134-
atol=0, ztol::Real=iszero(atol) ? Base.rtoldefault(S, T, 0) : atol, kwargs...) where {S, T}
135-
return compare_terms(p1, p2, t -> isapproxzero(t; ztol=ztol),
136-
(x, y) -> isapprox(x, y; atol=atol, kwargs...))
138+
function Base.isapprox(t1::AbstractTerm, t2::AbstractTerm; kwargs...)
139+
return isapprox(coefficient(t1), coefficient(t2); kwargs...) &&
140+
monomial(t1) == monomial(t2)
141+
end
142+
function Base.isapprox(
143+
p1::AbstractPolynomial{S},
144+
p2::AbstractPolynomial{T};
145+
atol = 0,
146+
ztol::Real = iszero(atol) ? Base.rtoldefault(S, T, 0) : atol,
147+
kwargs...,
148+
) where {S,T}
149+
return compare_terms(
150+
p1,
151+
p2,
152+
t -> isapproxzero(t; ztol = ztol),
153+
(x, y) -> isapprox(x, y; atol = atol, kwargs...),
154+
)
137155
end
138156

139-
Base.isapprox(p::RationalPoly, q::RationalPoly; kwargs...) = isapprox(p.num*q.den, q.num*p.den; kwargs...)
140-
Base.isapprox(p::RationalPoly, q::APL; kwargs...) = isapprox(p.num, q*p.den; kwargs...)
141-
Base.isapprox(p::APL, q::RationalPoly; kwargs...) = isapprox(p*q.den, q.num; kwargs...)
142-
Base.isapprox(q::RationalPoly{C}, α; kwargs...) where {C} = isapprox(q, constant_term(α, q.den); kwargs...)
143-
Base.isapprox(α, q::RationalPoly{C}; kwargs...) where {C} = isapprox(constant_term(α, q.den), q; kwargs...)
157+
function Base.isapprox(p::RationalPoly, q::RationalPoly; kwargs...)
158+
return isapprox(p.num * q.den, q.num * p.den; kwargs...)
159+
end
160+
function Base.isapprox(p::RationalPoly, q::APL; kwargs...)
161+
return isapprox(p.num, q * p.den; kwargs...)
162+
end
163+
function Base.isapprox(p::APL, q::RationalPoly; kwargs...)
164+
return isapprox(p * q.den, q.num; kwargs...)
165+
end
166+
function Base.isapprox(q::RationalPoly{C}, α; kwargs...) where {C}
167+
return isapprox(q, constant_term(α, q.den); kwargs...)
168+
end
169+
function Base.isapprox(α, q::RationalPoly{C}; kwargs...) where {C}
170+
return isapprox(constant_term(α, q.den), q; kwargs...)
171+
end

src/conversion.jl

+30-12
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
export variable, convert_to_constant
22

33
function convert_constant end
4-
Base.convert(::Type{P}, α) where P<:APL = convert_constant(P, α)
4+
Base.convert(::Type{P}, α) where {P<:APL} = convert_constant(P, α)
55
function convert_constant(::Type{TT}, α) where {T,TT<:AbstractTerm{T}}
66
return term(convert(T, α), constant_monomial(TT))
77
end
88
function convert_constant(::Type{PT}, α) where {PT<:AbstractPolynomial}
99
return convert(PT, convert(term_type(PT), α))
1010
end
11-
function Base.convert(::Type{P}, p::APL) where {T, P<:AbstractPolynomial{T}}
12-
error("`convert` not implemented for $P")
11+
function Base.convert(::Type{P}, p::APL) where {T,P<:AbstractPolynomial{T}}
12+
return error("`convert` not implemented for $P")
1313
end
1414

15-
function Base.convert(::Type{V}, mono::AbstractMonomial) where V <: AbstractVariable
15+
function Base.convert(
16+
::Type{V},
17+
mono::AbstractMonomial,
18+
) where {V<:AbstractVariable}
1619
variable = nothing
1720
for v in variables(mono)
1821
d = degree(mono, v)
@@ -32,27 +35,42 @@ function Base.convert(::Type{V}, mono::AbstractMonomial) where V <: AbstractVari
3235
return variable
3336
end
3437

35-
function Base.convert(::Type{M}, t::AbstractTerm) where M <: AbstractMonomialLike
38+
function Base.convert(
39+
::Type{M},
40+
t::AbstractTerm,
41+
) where {M<:AbstractMonomialLike}
3642
if isone(coefficient(t))
3743
return convert(M, monomial(t))
3844
else
3945
throw(InexactError(:convert, M, t))
4046
end
4147
end
42-
function Base.convert(TT::Type{<:AbstractTerm{T}}, m::AbstractMonomialLike) where T
48+
function Base.convert(
49+
TT::Type{<:AbstractTerm{T}},
50+
m::AbstractMonomialLike,
51+
) where {T}
4352
return convert(TT, term(one(T), convert(monomial_type(TT), m)))
4453
end
45-
function Base.convert(TT::Type{<:AbstractTerm{T}}, t::AbstractTerm) where T
46-
return convert(TT, term(convert(T, coefficient(t)), convert(monomial_type(TT), monomial(t))))
54+
function Base.convert(TT::Type{<:AbstractTerm{T}}, t::AbstractTerm) where {T}
55+
return convert(
56+
TT,
57+
term(
58+
convert(T, coefficient(t)),
59+
convert(monomial_type(TT), monomial(t)),
60+
),
61+
)
4762
end
4863

4964
# Base.convert(::Type{T}, t::T) where {T <: AbstractTerm} is ambiguous with above method.
5065
# we need the following:
51-
function Base.convert(::Type{TT}, t::TT) where {T, TT <: AbstractTerm{T}}
66+
function Base.convert(::Type{TT}, t::TT) where {T,TT<:AbstractTerm{T}}
5267
return t
5368
end
5469

55-
function Base.convert(::Type{T}, p::AbstractPolynomial) where T <: AbstractTermLike
70+
function Base.convert(
71+
::Type{T},
72+
p::AbstractPolynomial,
73+
) where {T<:AbstractTermLike}
5674
if iszero(nterms(p))
5775
convert(T, zero_term(p))
5876
elseif isone(nterms(p))
@@ -66,7 +84,7 @@ MA.scaling(p::AbstractPolynomialLike{T}) where {T} = convert(T, p)
6684
# Conversion polynomial -> constant
6785
# We don't define a method for `Base.convert` to reduce invalidations;
6886
# see https://github.com/JuliaAlgebra/MultivariatePolynomials.jl/pull/172
69-
function convert_to_constant(::Type{S}, p::APL) where S
87+
function convert_to_constant(::Type{S}, p::APL) where {S}
7088
s = zero(S)
7189
for t in terms(p)
7290
if !isconstant(t)
@@ -77,7 +95,7 @@ function convert_to_constant(::Type{S}, p::APL) where S
7795
end
7896
return s
7997
end
80-
Base.convert(::Type{T}, p::APL) where T<:Number = convert_to_constant(T, p)
98+
Base.convert(::Type{T}, p::APL) where {T<:Number} = convert_to_constant(T, p)
8199
function convert_to_constant(p::APL{S}) where {S}
82100
return convert_to_constant(S, p)
83101
end

0 commit comments

Comments
 (0)