From 6c2db0065528db6a4e0060c66a7d7ce750b90e51 Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Sat, 16 Dec 2023 15:12:59 +0100 Subject: [PATCH 01/12] bump GroupsCore to 0.5 and AbstractPermutations to 0.3 --- Project.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Project.toml b/Project.toml index ddc40d3..24adca8 100644 --- a/Project.toml +++ b/Project.toml @@ -10,8 +10,8 @@ PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" [compat] -AbstractPermutations = "0.2" -GroupsCore = "0.4" +AbstractPermutations = "0.3" +GroupsCore = "0.5" PrecompileTools = "1" julia = "1.6" From 7eeb98d076ad82c4f91004d18c124597a0bbb761 Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Sat, 16 Dec 2023 15:14:26 +0100 Subject: [PATCH 02/12] make Perm take ownership of the vector (when possible) This reduces the numbers of allocations/copies while constructing Perms --- src/Perms/perm_images.jl | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/Perms/perm_images.jl b/src/Perms/perm_images.jl index ccb9a69..2be0a2c 100644 --- a/src/Perms/perm_images.jl +++ b/src/Perms/perm_images.jl @@ -5,20 +5,15 @@ cycles::AP.CycleDecomposition{T} function Perm{T}( - images::AbstractVector{<:Integer}, + images::Vector{T}; check::Bool = true, ) where {T} if check && !isperm(images) throw(ArgumentError("Provided images are not permutation!")) end deg = __degree(images) - if deg == length(images) - return new{T}(images) - else - # for future: use @time one(Perm{Int}) - # to check if julia can elide the creation of view - return new{T}(@view images[Base.OneTo(deg)]) - end + resize!(images, deg) + return new{T}(images) end end else @@ -28,7 +23,7 @@ else @atomic cycles::AP.CycleDecomposition{T} function Perm{T}( - images::AbstractVector{<:Integer}, + images::Vector{T}; check::Bool = true, ) where {T} if check && !isperm(images) @@ -38,17 +33,23 @@ else deg = iszero(li) ? li : @inbounds images[li] ≠ li ? li : __degree(images) - if deg == length(images) - return new{T}(images) - else - # for future: use @time one(Perm{Int}) - # to check if julia can elide the creation of view - return new{T}(@view images[Base.OneTo(deg)]) - end + resize!(images, deg) + return new{T}(images) end end end +function Perm{T}( + images::AbstractVector{<:Integer}; + check::Bool = true, +) where {T} + deg = __degree(images) + return Perm{T}( + convert(Vector{T}, @view images[Base.OneTo(deg)]); + check = check, + ) +end + # convienience constructor: inttype(::Type{<:AbstractPermutation}) defaults to UInt32 function Perm(images::AbstractVector{<:Integer}, check = true) return Perm{AP.inttype(Perm)}(images, check) From 4c44eaccfbf213edd5839e29426c42395943cd88 Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Sat, 16 Dec 2023 15:15:26 +0100 Subject: [PATCH 03/12] use check kwarg in Perms constructors --- src/Perms/perm_images.jl | 16 ++++++++-------- src/Perms/perm_static.jl | 2 +- src/perm_group.jl | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Perms/perm_images.jl b/src/Perms/perm_images.jl index 2be0a2c..eb065a6 100644 --- a/src/Perms/perm_images.jl +++ b/src/Perms/perm_images.jl @@ -51,8 +51,8 @@ function Perm{T}( end # convienience constructor: inttype(::Type{<:AbstractPermutation}) defaults to UInt32 -function Perm(images::AbstractVector{<:Integer}, check = true) - return Perm{AP.inttype(Perm)}(images, check) +function Perm(images::AbstractVector{<:Integer}; check = true) + return Perm{AP.inttype(Perm)}(images; check = check) end # ## Interface of AbstractPermutation @@ -67,10 +67,10 @@ AP.inttype(::Type{Perm}) = UInt16 @static if VERSION < v"1.7" function Base.copy(p::Perm) imgs = copy(p.images) - q = typeof(p)(imgs, false) + q = typeof(p)(imgs; check = false) if isdefined(p, :inv) inv_imgs = copy(p.inv.images) - q⁻¹ = typeof(p)(inv_imgs, false) + q⁻¹ = typeof(p)(inv_imgs; check = false) q.inv = q⁻¹ q⁻¹.inv = q end @@ -79,7 +79,7 @@ AP.inttype(::Type{Perm}) = UInt16 function Base.inv(σ::Perm) if !isdefined(σ, :inv) - σ⁻¹ = typeof(σ)(invperm(σ.images), false) + σ⁻¹ = typeof(σ)(invperm(σ.images); check = false) σ.inv = σ⁻¹ σ⁻¹.inv = σ end @@ -96,10 +96,10 @@ AP.inttype(::Type{Perm}) = UInt16 else function Base.copy(p::Perm) imgs = copy(p.images) - q = typeof(p)(imgs, false) + q = typeof(p)(imgs; check = false) if isdefined(p, :inv, :sequentially_consistent) inv_imgs = copy(@atomic(p.inv).images) - q⁻¹ = typeof(p)(inv_imgs, false) + q⁻¹ = typeof(p)(inv_imgs; check = false) @atomic q.inv = q⁻¹ @atomic q⁻¹.inv = q end @@ -111,7 +111,7 @@ else if isone(σ) @atomic σ.inv = σ else - σ⁻¹ = typeof(σ)(invperm(σ.images), false) + σ⁻¹ = typeof(σ)(invperm(σ.images); check = false) # we don't want to end up with two copies of inverse σ floating around if !isdefined(σ, :inv, :sequentially_consistent) @atomic σ.inv = σ⁻¹ diff --git a/src/Perms/perm_static.jl b/src/Perms/perm_static.jl index 84ced6e..20ad45a 100644 --- a/src/Perms/perm_static.jl +++ b/src/Perms/perm_static.jl @@ -18,7 +18,7 @@ struct SPerm{N} <: AP.AbstractPermutation end function SPerm{N}( - images::AbstractVector{<:Integer}, + images::AbstractVector{<:Integer}; check::Bool = true, ) where {N} @assert length(images) ≤ N "vector too large for SPerm" diff --git a/src/perm_group.jl b/src/perm_group.jl index 4112425..ea7d2e3 100644 --- a/src/perm_group.jl +++ b/src/perm_group.jl @@ -87,7 +87,7 @@ function Base.:^(σ::Permutation{P}, τ::AbstractPermutation) where {P} img[i^τ] = (i^σ)^τ end - res = P(img, false) + res = P(img; check = false) @assert res in parent(σ) return Permutation(res, parent(σ)) end From bb42e7397aea3d925da8ee4d7cb20156eb9bc3fb Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Sat, 16 Dec 2023 15:16:36 +0100 Subject: [PATCH 04/12] implement AP.__unsafe_image for (S)Perms --- src/Perms/perm_images.jl | 1 + src/Perms/perm_static.jl | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Perms/perm_images.jl b/src/Perms/perm_images.jl index eb065a6..1520a6e 100644 --- a/src/Perms/perm_images.jl +++ b/src/Perms/perm_images.jl @@ -63,6 +63,7 @@ AP.degree(σ::Perm) = length(σ.images) # inttype must be T (UInt16 by default) since we store it in e.g. cycles AP.inttype(::Type{Perm{T}}) where {T} = T AP.inttype(::Type{Perm}) = UInt16 +AP.__unsafe_image(n::Integer, σ::Perm) = oftype(n, @inbounds σ.images[n]) @static if VERSION < v"1.7" function Base.copy(p::Perm) diff --git a/src/Perms/perm_static.jl b/src/Perms/perm_static.jl index 20ad45a..6d669ae 100644 --- a/src/Perms/perm_static.jl +++ b/src/Perms/perm_static.jl @@ -37,6 +37,7 @@ function Base.:^(n::Integer, σ::SPerm) end AP.degree(σ::SPerm) = σ.degree AP.inttype(::Type{<:SPerm}) = UInt8 +AP.__unsafe_image(n::Integer, σ::SPerm) = oftype(n, @inbounds σ.images[n]) function Base.inv(σ::SPerm{N}) where {N} return SPerm{N}(invperm(σ.images), AP.degree(σ)) From 76132c88a4494b0e92fa7d7cd3f3f760d4f3230c Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Sat, 16 Dec 2023 16:30:15 +0100 Subject: [PATCH 05/12] remove AbstractAlgebra based S8 benchmark --- test/benchmark.jl | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/test/benchmark.jl b/test/benchmark.jl index 07a2b5e..bd7e018 100644 --- a/test/benchmark.jl +++ b/test/benchmark.jl @@ -15,17 +15,12 @@ end @testset "GAP Docs examples$(BENCHMARK_TIME ? "/benchmark" : "")" begin @testset "test_perf$(BENCHMARK_TIME ? "/benchmark" : "") iteration" begin - import AbstractAlgebra - SymmetricGroup = AbstractAlgebra.SymmetricGroup - - Base.:^(i::Integer, p::AbstractAlgebra.Perm) = oftype(i, p.d[i]) - - G = SymmetricGroup(8) + G = PermGroup(parse.(Perm{UInt16}, ["($(i), $(i+1))" for i in 1:7])) K = PermGroup( Transversal, [perm"(1,5,6,2,4,8)", perm"(1,3,6)(2,5,7,4)(8)"], ) - @test order(Int, K) == order(Int, G) + @test order(Int, K) == order(Int, G) == factorial(8) @test test_perf(G) == test_perf(K) == 181440 K = PermGroup( SchreierTransversal, @@ -35,7 +30,7 @@ end @test test_perf(G) == test_perf(K) == 181440 if BENCHMARK_TIME - @info "Native iteration over S8 group:" + @info "Iteration over S8 PermGroup (7 transpositions)" @btime test_perf($G) # 1.303 ms (80644 allocations: 6.77 MiB) @info "Iteration over K ≅ S8 PermGroup:" From c1913181403171bdd2f3bed4c9ae4febd6865d78 Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Sun, 17 Dec 2023 10:59:52 +0100 Subject: [PATCH 06/12] move benchmark results so that they're easier to update --- test/benchmark.jl | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/test/benchmark.jl b/test/benchmark.jl index bd7e018..d83e705 100644 --- a/test/benchmark.jl +++ b/test/benchmark.jl @@ -32,13 +32,11 @@ end if BENCHMARK_TIME @info "Iteration over S8 PermGroup (7 transpositions)" @btime test_perf($G) - # 1.303 ms (80644 allocations: 6.77 MiB) @info "Iteration over K ≅ S8 PermGroup:" K = PermGroup( Transversal, [perm"(1,5,6,2,4,8)", perm"(1,3,6)(2,5,7,4)(8)"], ) - # 3.285 ms (125987 allocations: 6.46 MiB) @time order(Int, K) @btime test_perf($K) K = PermGroup( @@ -47,7 +45,6 @@ end ) @time order(Int, K) @btime test_perf($K) - # 6.833 ms (206127 allocations: 11.35 MiB) end end @@ -73,8 +70,6 @@ end 1 @btime order(Int, G) setup = (G = PermGroup(SchreierTransversal, $cube222)) evals = 1 - # 24.767 μs (533 allocations: 44.37 KiB) - # 63.420 μs (1239 allocations: 109.91 KiB) end cube333 = [ @@ -97,8 +92,6 @@ end (G = PermGroup(Transversal, $cube333)) evals = 1 @btime order(Int128, G) setup = (G = PermGroup(SchreierTransversal, $cube333)) evals = 1 - # 1.975 ms (26628 allocations: 2.59 MiB) - # 8.836 ms (116353 allocations: 11.42 MiB) end end @@ -141,10 +134,6 @@ end (G = PermGroup(Transversal, $([a, b]))) evals = 1 @btime order(Int64, G) setup = (G = PermGroup(SchreierTransversal, $([a, b]))) evals = 1 - # gap> G := Group([a,b]);; StabChain(G);; time; - # ~35ms - # 10.258 ms (30072 allocations: 11.49 MiB) - # 98.011 ms (240549 allocations: 102.46 MiB) end end @@ -213,16 +202,37 @@ end (G = PermGroup(Transversal, $([a, b, c, d]))) evals = 1 @btime order(Int, G) setup = (G = PermGroup(SchreierTransversal, $([a, b, c, d]))) evals = 1 - # gap> G := Group([a,b,c,d]);; StabChain(G);; time; - # ~35ms - # 2.759 ms (9133 allocations: 3.18 MiB) - # 83.738 ms (221318 allocations: 77.73 MiB) G = PermGroup(Transversal, [a, b, c, d]) + @info "Iteration over direct-product group of order 192480" @time test_perf(G) H = PermGroup(SchreierTransversal, [a, b, c, d]) @time test_perf(H) - # 0.146197 seconds (622.65 k allocations: 216.433 MiB, 3.77% gc time) - # 0.388392 seconds (1.24 M allocations: 473.432 MiB, 3.57% gc time) end end end + +#= +[ Info: Iteration over S8 PermGroup (7 transpositions) + 3.138 ms (120949 allocations: 6.15 MiB) +[ Info: Iteration over K ≅ S8 PermGroup: + 0.000039 seconds (562 allocations: 32.742 KiB) + 3.121 ms (120949 allocations: 6.15 MiB) + 0.000075 seconds (1.16 k allocations: 70.273 KiB) + 5.809 ms (201815 allocations: 11.09 MiB) +[ Info: Testing and benchmarking Schreier-Sims algorithm +[ Info: Rubik cube 2×2×2 group: + 18.565 μs (442 allocations: 29.43 KiB) + 52.597 μs (1148 allocations: 79.07 KiB) +[ Info: Schreier-Sims for Rubik cube 3×3×3 group: + 1.374 ms (24680 allocations: 2.31 MiB) + 6.975 ms (111829 allocations: 10.81 MiB) +[ Info: Schreier-Sims for SL(4,7): + 4.393 ms (25970 allocations: 10.22 MiB) + 53.474 ms (189388 allocations: 76.13 MiB) +[ Info: Schreier-Sims for a direct-product group: + 1.228 ms (9104 allocations: 3.15 MiB) + 58.843 ms (219502 allocations: 77.17 MiB) +[ Info: Iteration over direct-product group of order 192480 + 0.061710 seconds (585.73 k allocations: 184.881 MiB, 9.19% gc time) + 0.201417 seconds (1.20 M allocations: 441.331 MiB, 6.48% gc time) +=# From fadb9b0242bd0ddd0ecde0982a0872301bb25aa8 Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Sun, 17 Dec 2023 13:09:49 +0100 Subject: [PATCH 07/12] bump to v0.6 --- Project.toml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Project.toml b/Project.toml index 24adca8..2e5636d 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "PermutationGroups" uuid = "8bc5a954-2dfc-11e9-10e6-cd969bffa420" authors = ["Marek Kaluba ", "tweisser "] -version = "0.5.0" +version = "0.6.0" [deps] AbstractPermutations = "36d08e8a-54dd-435f-8c9e-38a475050b11" @@ -16,10 +16,9 @@ PrecompileTools = "1" julia = "1.6" [extras] -AbstractAlgebra = "c3fe647b-3220-5bb0-a1ea-a7954cac585d" BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test", "Random", "BenchmarkTools", "AbstractAlgebra"] +test = ["Test", "Random", "BenchmarkTools"] From 3706fdfe8d726e1b1a8d5fc197e09cc94dc1789d Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Sun, 17 Dec 2023 13:24:24 +0100 Subject: [PATCH 08/12] formatting --- src/Perms/perm_images.jl | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/Perms/perm_images.jl b/src/Perms/perm_images.jl index 1520a6e..c7d731b 100644 --- a/src/Perms/perm_images.jl +++ b/src/Perms/perm_images.jl @@ -4,10 +4,7 @@ inv::Perm{T} cycles::AP.CycleDecomposition{T} - function Perm{T}( - images::Vector{T}; - check::Bool = true, - ) where {T} + function Perm{T}(images::Vector{T}; check::Bool = true) where {T} if check && !isperm(images) throw(ArgumentError("Provided images are not permutation!")) end @@ -22,10 +19,7 @@ else @atomic inv::Perm{T} @atomic cycles::AP.CycleDecomposition{T} - function Perm{T}( - images::Vector{T}; - check::Bool = true, - ) where {T} + function Perm{T}(images::Vector{T}; check::Bool = true) where {T} if check && !isperm(images) throw(ArgumentError("Provided images are not permutation!")) end From b9d30d1c1b46a78af177ce9efd6904438c2e1607 Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Sun, 17 Dec 2023 14:36:56 +0100 Subject: [PATCH 09/12] return the TrivialSampler for AbstractPermutationGroups i.e. intercept the creation of PRASampler introduced in GroupsCore v0.5 --- src/group_interface.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/group_interface.jl b/src/group_interface.jl index fd0897b..df44b14 100644 --- a/src/group_interface.jl +++ b/src/group_interface.jl @@ -20,6 +20,14 @@ else end GroupsCore.gens(G::PermGroup) = Permutation.(G.__gens_raw, Ref(G)) +function Random.Sampler( + RNG::Type{<:Random.AbstractRNG}, + G::AbstractPermutationGroup, + repetition::Random.Repetition = Val(Inf), +) + return Random.SamplerTrivial(G) +end + function Base.rand( rng::Random.AbstractRNG, rs::Random.SamplerTrivial{Gr}, From ff830a4b7e750687b4ce0ca4c20d1d89a6c99a49 Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Sun, 17 Dec 2023 14:54:18 +0100 Subject: [PATCH 10/12] bring back show tests for permutation groups --- test/perm_groups.jl | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/test/perm_groups.jl b/test/perm_groups.jl index a3f5b8e..d927189 100644 --- a/test/perm_groups.jl +++ b/test/perm_groups.jl @@ -26,7 +26,7 @@ @test order(Int, H) == 3 @test AP.degree(H) == 3 - SN(n) = [Perm(circshift(collect(1:n), -1)), Perm([[2, 1]; 3:n])] + SN(n) = [Perm([2:n; 1]), Perm([[2, 1]; 3:n])] a = AP.perm(gens(G, 1)) @test gens(G, 1) * a == a * gens(G, 1) == a^2 @@ -39,9 +39,15 @@ end G = PermGroup(perm"(1,2)", perm"(1,2,3,4)") - # @test sprint(show, G) == "PermGroup( (1,2), (1,2,3,4) )" - # @test sprint(show, MIME"text/plain"(), G) == - # "Permutation group on 2 generators generated by\n (1,2)\n (1,2,3,4)" + showstr(x) = sprint((io, x) -> show(IOContext(io, :limit => true), x), x) + replstr(x) = sprint( + (io, x) -> + show(IOContext(io, :limit => true), MIME("text/plain"), x), + x, + ) + @test showstr(G) == "PermGroup( (1,2), (1,2,3,4) )" + @test replstr(G) == + "Permutation group on 2 generators generated by\n (1,2)\n (1,2,3,4)" m = match(r"order (\d+)", sprint(show, MIME"text/plain"(), G)) @test m === nothing From b66478336917a46bcb4730065aa9229d9452da66 Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Sun, 17 Dec 2023 14:54:34 +0100 Subject: [PATCH 11/12] remove old interface testing --- test/AbstractPerm_interface.jl | 83 ---------------------------------- 1 file changed, 83 deletions(-) delete mode 100644 test/AbstractPerm_interface.jl diff --git a/test/AbstractPerm_interface.jl b/test/AbstractPerm_interface.jl deleted file mode 100644 index 7d9b628..0000000 --- a/test/AbstractPerm_interface.jl +++ /dev/null @@ -1,83 +0,0 @@ -function abstract_perm_interface_test(P::Type{<:PG.AbstractPermutation}) - @testset "AbstractPermutation API test: $P" begin - @test one(P) isa PermutationGroups.AbstractPermutation - @test isone(one(P)) - @test 5^one(P) == 5 - @test UInt16(5)^one(P) isa UInt16 - - r = [3, 1, 2, 4] - p = P(r) - q = P(r[1:3]) - @test degree(p) == 3 - @test degree(q) == 3 - - @test p == q - @test q == Perm(r) - - @test hash(p) == hash(q) - @test length(unique([p, q])) == 1 - - @test collect(PermutationGroups.cycles(p)) == [[1, 3, 2]] - @test collect(PermutationGroups.cycles(q)) == [[1, 3, 2]] - - @test inv(p) isa PermutationGroups.AbstractPermutation - @test isone(inv(p) * p) - @test isone(p * inv(p)) - - @test isone(inv(q) * p) - @test isone(inv(p) * Perm(r)) - - a = P([2, 1, 3]) # (1,2) - b = P([2, 3, 1]) # (1,2,3) - - @test a * b == P([3, 2, 1]) # (1,2)*(1,2,3) == (1,3) - @test b * a == P([1, 3, 2]) # (1,2,3)*(1,2) == (2,3) - @test isone(a * a) - @test isone(b * b * b) - - @test p^q == p - @test p^Perm(r) == p - @test p^Perm(r) isa P - @test Perm(r)^p == p - @test Perm(r)^p isa Perm - - @test p * q == p^2 - @test p * Perm(r) == p^2 - @test p * Perm(r) * p isa P - @test p * Perm(r) * p * q isa P - - @test Perm(r) * p isa Perm - - @test *(p) == p - @test p * p * p * p == p^4 - - @test length(unique(p^i for i in 1:5)) == 3 - - @test (1:5) .^ p == [3, 1, 2, 4, 5] - @test sprint(show, p) == "(1,3,2)" - @test sprint(show, PG.cycles(p)) == "Cycle Decomposition: (1,3,2)" - - let x = P([2, 1]), y = P([1, 3, 4, 6, 5, 7, 2, 8]) - # x = (1,2), y = (1)(2,3,4,6,7) - - @test permtype(x) == [2] - @test permtype(y) == [5] - @test sign(x) == -1 - @test sign(y) == 1 - @test sign(x * y) == -1 - - @test PG.firstmoved(x) == 1 - @test PG.firstmoved(y) == 2 - @test PG.firstmoved(one(x)) === nothing - - @test PG.Perms.nfixedpoints(x) == 0 - @test PG.Perms.nfixedpoints(y) == 2 - - @test PG.Perms.fixedpoints(x) == Int[] - @test PG.Perms.fixedpoints(y) == Int[1, 5] - - @test PG.Perms.parity(x) == 1 - @test PG.Perms.parity(y) == 0 - end - end -end From dc97436ed5810a56682bc2ab1e5e11725aa39a35 Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Sun, 17 Dec 2023 17:27:38 +0100 Subject: [PATCH 12/12] update JuliaFormatter to version 1.0.45 --- .github/workflows/format.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 990072b..0fc9bd5 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v2 - name: Install JuliaFormatter and format run: | - julia -e 'using Pkg; Pkg.add(PackageSpec(name="JuliaFormatter", version="1.0.9"))' + julia -e 'using Pkg; Pkg.add(PackageSpec(name="JuliaFormatter", version="1.0.45"))' julia -e 'using JuliaFormatter; format(["./src", "./test"], verbose=true)' - name: Format check run: |