From c73b41c04ce364b142e3ecbaf210bb58a55f771d Mon Sep 17 00:00:00 2001 From: Thomas Breuer Date: Wed, 6 Nov 2024 13:46:21 +0100 Subject: [PATCH 01/15] fix `_as_subgroups` (#4277) and extend tests accordingly, and fix `==` for group homomorphisms (cherry picked from commit 8bea0b6e53d1db5ed79e0282d43de0b3fd85ef94) --- src/Groups/homomorphisms.jl | 2 +- src/Groups/sub.jl | 10 +---- test/Groups/subgroups_and_cosets.jl | 60 +++++++++++++++++------------ 3 files changed, 38 insertions(+), 34 deletions(-) diff --git a/src/Groups/homomorphisms.jl b/src/Groups/homomorphisms.jl index e42a1cc7d151..6b1424491325 100644 --- a/src/Groups/homomorphisms.jl +++ b/src/Groups/homomorphisms.jl @@ -9,7 +9,7 @@ function Base.show(io::IO, x::GAPGroupHomomorphism) end -function ==(f::GAPGroupHomomorphism{S,T}, g::GAPGroupHomomorphism{S,T}) where S where T +function ==(f::GAPGroupHomomorphism, g::GAPGroupHomomorphism) return GapObj(f) == GapObj(g) end diff --git a/src/Groups/sub.jl b/src/Groups/sub.jl index b107a3062912..95162c68fa3c 100644 --- a/src/Groups/sub.jl +++ b/src/Groups/sub.jl @@ -157,15 +157,7 @@ end # convert a GAP list of subgroups into a vector of Julia groups objects function _as_subgroups(G::T, subs::GapObj) where T <: GAPGroup - res = Vector{T}(undef, length(subs)) - for i = 1:length(res) - res[i] = _as_subgroup_bare(G, subs[i]::GapObj) - end - return res -end - -function _as_subgroups(G::PcGroup, subs::GapObj) - res = Vector{SubPcGroup}(undef, length(subs)) + res = Vector{sub_type(T)}(undef, length(subs)) for i = 1:length(res) res[i] = _as_subgroup_bare(G, subs[i]::GapObj) end diff --git a/test/Groups/subgroups_and_cosets.jl b/test/Groups/subgroups_and_cosets.jl index abf2fcea09b9..298fc50958c0 100644 --- a/test/Groups/subgroups_and_cosets.jl +++ b/test/Groups/subgroups_and_cosets.jl @@ -1,29 +1,41 @@ @testset "Subgroups" begin - G = symmetric_group(7) - x = cperm(G,[1,2,3,4,5,6,7]) - y = cperm(G,[1,2,3]) - z = cperm(G,[1,2]) - - H,f=sub(G,[x,y]) - K,g=sub(x,y) - @test H isa PermGroup - @test H==alternating_group(7) - @test domain(f)==H - @test codomain(f)==G - @test [f(x) for x in gens(H)]==gens(H) - @test (H,f)==(K,g) - @test is_subset(K, G) - flag, emb = is_subgroup(K, G) - @test flag - @test g == emb - @test g == embedding(K, G) - @test K === domain(emb) - @test G === codomain(emb) - @test is_normal_subgroup(H, G) - H,f=sub(G,[x,z]) - @test H==G - @test f==id_hom(G) + S = symmetric_group(7) + Sx = cperm(S, [1, 2, 3, 4, 5, 6, 7]) + Sy = cperm(S, [1, 2, 3]) + Sz = cperm(S, [1, 2]) + + for T in [PermGroup, FPGroup] + iso = isomorphism(T, S) + G = codomain(iso) + x = iso(Sx) + y = iso(Sy) + z = iso(Sz) + + H, f = sub(G, [x, y]) + K, g = sub(x, y) + @test H isa Oscar.sub_type(T) + @test domain(f) == H + @test codomain(f) == G + @test [f(x) for x in gens(H)] == gens(H) + @test (H, f) == (K, g) + @test is_subset(K, G) + flag, emb = is_subgroup(K, G) + @test flag + @test g == emb + @test g == embedding(K, G) + @test K === domain(emb) + @test G === codomain(emb) + @test is_normal_subgroup(H, G) + H, f = sub(G, [x, z]) + @test H == G + @test f == id_hom(G) + end + G = symmetric_group(7) + x = cperm(G, [1, 2, 3, 4, 5, 6, 7]) + y = cperm(G, [1, 2, 3]) + H, f = sub(G, [x, y]) + @test H == alternating_group(7) @test !is_subset(symmetric_group(8), G) @test_throws ArgumentError embedding(symmetric_group(8), G) From 8b9da3420c4f28c8c80fd02b47fdedb053c4b0e7 Mon Sep 17 00:00:00 2001 From: JohnAAbbott <124266874+JohnAAbbott@users.noreply.github.com> Date: Wed, 6 Nov 2024 11:44:01 +0100 Subject: [PATCH 02/15] Resolves `BoundError` in `weights(hook_lengths(...))` (#4270) * Added arg check to weights * weight seq of non-semi-standard YT gives error * Inputs for weight seq tests are now semi-standard (cherry picked from commit c40f14e614bed3394a7a8dd25226c8b475701bd5) --- .../EnumerativeCombinatorics/tableaux.jl | 12 ++++++++---- .../EnumerativeCombinatorics/tableaux.jl | 4 ++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Combinatorics/EnumerativeCombinatorics/tableaux.jl b/src/Combinatorics/EnumerativeCombinatorics/tableaux.jl index 522c13f0fdbb..61aa41ad3241 100644 --- a/src/Combinatorics/EnumerativeCombinatorics/tableaux.jl +++ b/src/Combinatorics/EnumerativeCombinatorics/tableaux.jl @@ -48,7 +48,7 @@ young_tableau function young_tableau(::Type{T}, v::Vector{Vector{TT}}; check::Bool = true) where {T <: IntegerUnion, TT <: IntegerUnion} if check - @req _defines_partition(map(length, v)) "The input does not define a Young tableau" + @req _defines_partition(map(length, v)) "The input does not define a Young tableau: lengths of rows must be weakly decreasing" end return YoungTableau{T}(v) end @@ -222,20 +222,24 @@ Return the shape of the tableau `tab`, i.e. the partition given by the lengths of the rows of the tableau. """ function shape(tab::YoungTableau{T}) where T - return partition(T[ length(tab[i]) for i = 1:length(tab) ], check = false) + # Line below DOES NOT CHECK that the lengths of the rows are weakly decreasing + return partition(T[ length(tab[i]) for i = 1:length(tab) ]; check = false) end @doc raw""" weight(tab::YoungTableau) -Return the weight of the tableau `tab` as an array whose `i`-th element gives -the number of times the integer `i` appears in the tableau. +Return the weight sequence of the tableau `tab` as an array whose `i`-th element +gives the number of times the integer `i` appears in the tableau. """ function weight(tab::YoungTableau) + @req is_semistandard(tab) "Tableau must be (semi-)standard" + if isempty(tab) return Int[] end + # Computation of max must be changed if we want to permit non-semi-standard YT max = 0 for i = 1:length(tab) if max < tab[i][end] diff --git a/test/Combinatorics/EnumerativeCombinatorics/tableaux.jl b/test/Combinatorics/EnumerativeCombinatorics/tableaux.jl index c3f539917395..16d1f844c703 100644 --- a/test/Combinatorics/EnumerativeCombinatorics/tableaux.jl +++ b/test/Combinatorics/EnumerativeCombinatorics/tableaux.jl @@ -6,9 +6,9 @@ @test reading_word(young_tableau(Array{Int,1}[])) == Int[] # weight - @test weight(young_tableau([[1,2,3],[1,2],[1]])) == [3,2,1] + @test weight(young_tableau([[1,2,3],[2,3],[3]])) == [1,2,3] @test weight(young_tableau([[1,2,3,4,5]])) == [1,1,1,1,1] - @test weight(young_tableau([[1],[1],[1]])) == [3] + @test_throws ArgumentError weight(young_tableau([[1],[1],[1]])) @test weight(young_tableau(Array{Int,1}[])) == Int[] # is_standard From 62cb44c526dfda2acac52a4290b6a8b39f1145de Mon Sep 17 00:00:00 2001 From: Marcel Wack <63490664+Sequenzer@users.noreply.github.com> Date: Tue, 12 Nov 2024 13:03:15 +0100 Subject: [PATCH 03/15] fixed the leading zero bug in matroid_hex (#4299) (cherry picked from commit 2d7a2b06d176a883f3bd9fcc873937f5d872823a) --- src/Combinatorics/Matroids/properties.jl | 6 ++---- test/Combinatorics/Matroids/Matroids.jl | 7 +++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Combinatorics/Matroids/properties.jl b/src/Combinatorics/Matroids/properties.jl index 56bf952a350f..addae6cad2e0 100644 --- a/src/Combinatorics/Matroids/properties.jl +++ b/src/Combinatorics/Matroids/properties.jl @@ -1059,11 +1059,9 @@ julia> matroid_hex(fano_matroid()) function matroid_hex(M::Matroid) rvlx = min_revlex_basis_encoding(M) r,n = rank(M), length(M) + v = zeros(Int, 4*ceil(Int, length(rvlx)/4)) + v[length(v)-length(rvlx)+1:end] = _revlex_basis_to_vector(rvlx) - v = _revlex_basis_to_vector(rvlx) - for _ in 1:(4-length(v)%4) - pushfirst!(v,0) - end v = reshape(v,4,:) v = [string(parse(Int, join(v[:, j]), base=2), base=16) for j in 1:size(v)[2]] diff --git a/test/Combinatorics/Matroids/Matroids.jl b/test/Combinatorics/Matroids/Matroids.jl index 94474e845106..5cd0f76521dc 100644 --- a/test/Combinatorics/Matroids/Matroids.jl +++ b/test/Combinatorics/Matroids/Matroids.jl @@ -422,10 +422,17 @@ @testset "matroid_hex" begin M = fano_matroid() N = uniform_matroid(2, 4) + NN = uniform_matroid(1, 4) M1 = matroid_from_matroid_hex(matroid_hex(M)) N1 = matroid_from_matroid_hex(matroid_hex(N)) + NN1 = matroid_from_matroid_hex(matroid_hex(NN)) + @test is_isomorphic(M, M1) @test is_isomorphic(N, N1) + + @test matroid_hex(NN) == "r1n4_f" + @test is_isomorphic(NN, NN1) + end end From 9a881b86bab058cf2499d1c7c5869bca7b00e2bd Mon Sep 17 00:00:00 2001 From: Erik Paemurru <143521159+paemurru@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:21:32 +0100 Subject: [PATCH 04/15] Update license (#4257) Co-authored-by: Max Horn (cherry picked from commit 953ad2324b879b0c9c2aedb0048ec1d196d5c618) --- LICENSE.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index d5ab55d1895a..2faf769ff70e 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,11 @@ The Oscar.jl package is licensed under the GNU Public License, Version 3.0+: -> Copyright (c) 2019 The OSCAR Development Team. +> Copyright (c) 2019-2024 The OSCAR Development Team +> +> See for a list of OSCAR +> Development Team members. Note that this list may occasionally be slightly +> outdated. Additional contributors may be found in the `git log` of the main +> OSCAR repository and other related repositories. > This program is free software: you can redistribute it and/or modify > it under the terms of the GNU General Public License as published by > the Free Software Foundation, either version 3 of the License, or From 6b1ba5fbf68f1c9a4fc00940004c438df3afe7b9 Mon Sep 17 00:00:00 2001 From: Simon Brandhorst Date: Wed, 6 Nov 2024 15:28:22 +0100 Subject: [PATCH 05/15] Fixes small_generating_set, mininimal_primes over a number field (#4279) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --------- Co-authored-by: HechtiDerLachs Co-authored-by: ederc Co-authored-by: Lars Göttgens Co-authored-by: Max Horn (cherry picked from commit e91af4152646749a856e987cb640e0eac4512c21) --- src/Rings/mpoly-ideals.jl | 16 +++++++++++++--- test/Rings/mpoly.jl | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/Rings/mpoly-ideals.jl b/src/Rings/mpoly-ideals.jl index 629681cc028c..6f69dd8d0068 100644 --- a/src/Rings/mpoly-ideals.jl +++ b/src/Rings/mpoly-ideals.jl @@ -1203,17 +1203,27 @@ function minimal_primes( # This will in many cases lead to an easy simplification of the problem if factor_generators - J = typeof(I)[ideal(R, elem_type(R)[])] + J = [ideal(R, gens(I))] # A copy of I as initialization for g in gens(I) K = typeof(I)[] is_zero(g) && continue for (b, k) in factor(g) + # Split the already collected components with b for j in J push!(K, j + ideal(R, b)) end end J = K end + + unique_comp = typeof(I)[] + for q in J + is_one(q) && continue + q in unique_comp && continue + push!(unique_comp, q) + end + J = unique_comp + # unique! seems to fail here. We have to do it manually. pre_result = filter!(!is_one, vcat([minimal_primes(j; algorithm, factor_generators=false) for j in J]...)) result = typeof(I)[] @@ -2110,7 +2120,8 @@ function small_generating_set( computed_gb = IdealGens(ring, sing_gb, true) if !haskey(I.gb,computed_gb.ord) # if not yet present, store gb for later use - I.gb[computed_gb.ord] = computed_gb + I.gb[computed_gb.ord] = computed_gb + I.gb[computed_gb.ord].isGB = true end # we do not have a notion of minimal generating set in this context! @@ -2328,4 +2339,3 @@ end function hash(I::Ideal, c::UInt) return hash(base_ring(I), c) end - diff --git a/test/Rings/mpoly.jl b/test/Rings/mpoly.jl index 8c81bdd1d30b..1f9c33a9dcae 100644 --- a/test/Rings/mpoly.jl +++ b/test/Rings/mpoly.jl @@ -159,7 +159,6 @@ end l = minimal_primes(i, algorithm=:charSets) @test length(l) == 2 @test l[1] == i1 && l[2] == i2 || l[1] == i2 && l[2] == i1 - R, (a, b, c, d) = polynomial_ring(ZZ, [:a, :b, :c, :d]) i = ideal(R, [R(9), (a+3)*(b+3)]) i1 = ideal(R, [R(3), a]) @@ -232,6 +231,19 @@ end R, (x, y) = polynomial_ring(QQ, [:x, :y]) I = ideal(R, [one(R)]) @test is_prime(I) == false + + J = ideal(R, [x*(x-1), y*(y-1), x*y]) + l = minimal_primes(J) + @test length(l) == 3 + + QQt, t = QQ[:t] + kk, a = extension_field(t^2 + 1) + + R, (x, y) = kk[:x, :y] + J = ideal(R, [x^2 + 1, y^2 + 1, (x - a)*(y - a)]) + l = minimal_primes(J) + @test length(l) == 3 + end @testset "Groebner" begin @@ -601,4 +613,3 @@ end I = ideal(P, elem_type(P)[]) @test !radical_membership(x, I) end - From a47f69eaa4c3eb1fa94ad0f2e5be2789d7613761 Mon Sep 17 00:00:00 2001 From: Marcel Wack <63490664+Sequenzer@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:38:02 +0100 Subject: [PATCH 06/15] changes to the check argument in matroid_from_matrix_columns (#4287) (cherry picked from commit b3ab222d48dcfdd96b5e06922f881a87d16a44bd) --- src/Combinatorics/Matroids/matroids.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Combinatorics/Matroids/matroids.jl b/src/Combinatorics/Matroids/matroids.jl index 4e028825fd1f..af2a530d4556 100644 --- a/src/Combinatorics/Matroids/matroids.jl +++ b/src/Combinatorics/Matroids/matroids.jl @@ -278,9 +278,9 @@ function matroid_from_hyperplanes(hyperplanes::Union{AbstractVector{T},AbstractS end @doc raw""" - matroid_from_matrix_columns(A::MatrixElem) + matroid_from_matrix_columns(A::MatrixElem; check::Bool=true) -A matroid represented by the column vectors of a matrix `A`. +A matroid represented by the column vectors of a matrix `A`. The value of `check` is currently ignored. See Section 1.1 of [Oxl11](@cite). @@ -310,13 +310,13 @@ function matroid_from_matrix_columns(A::MatrixElem; check::Bool=true) end end - return matroid_from_bases(bases, ncols(A); check=check) + return matroid_from_bases(bases, ncols(A); check=false) end @doc raw""" - matroid_from_matrix_columns(A::MatrixElem) + matroid_from_matrix_rows(A::MatrixElem, check::Bool=true) -A matroid represented by the row vectors of a matrix. +A matroid represented by the row vectors of a matrix. The value of `check` is currently ignored. See Section 1.1 of [Oxl11](@cite). From 9956d02dfbf67d968250c0879430748d835c3d19 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 13 Nov 2024 08:20:35 +0100 Subject: [PATCH 07/15] Test and fix `norm_equation` for `RelNumFieldOrder` (#4282) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tommy Hofmann Co-authored-by: Lars Göttgens (cherry picked from commit a0d60ee9c62e18f12802a7a6ae597f8a0a8fece7) --- src/NumberTheory/NmbThy.jl | 22 +++++++++++----------- test/NumberTheory/nmbthy.jl | 17 +++++++++++++++-- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/NumberTheory/NmbThy.jl b/src/NumberTheory/NmbThy.jl index 7f8921b85823..d82d3142dab6 100644 --- a/src/NumberTheory/NmbThy.jl +++ b/src/NumberTheory/NmbThy.jl @@ -126,10 +126,10 @@ end norm_equation(R::AbsNumFieldOrder, k::Base.Integer; abs::Bool = false) = norm_equation(R, ZZRingElem(k), abs = abs) -function norm_equation_fac_elem(R::Hecke.RelNumFieldOrder{AbsSimpleNumFieldElem,Hecke.AbsSimpleNumFieldOrderFractionalIdeal}, a::AbsNumFieldOrderElem{AbsSimpleNumField,AbsSimpleNumFieldElem}) +function norm_equation_fac_elem(R::Hecke.RelNumFieldOrder{AbsSimpleNumFieldElem,Hecke.AbsSimpleNumFieldOrderFractionalIdeal}, a::AbsSimpleNumFieldOrderElem) @assert Hecke.is_maximal(R) - Ka, mKa, mkK = absolute_field(Hecke.nf(R)) + Ka, mKa, mkK = collapse_top_layer(Hecke.nf(R)) Ra = maximal_order(Ka) class_group(Ra) k = Hecke.nf(parent(a)) @@ -144,9 +144,9 @@ function norm_equation_fac_elem(R::Hecke.RelNumFieldOrder{AbsSimpleNumFieldElem, q, mms = snf(q) mq = mq*inv(mms) - C = vcat([matrix(FlintZZ, 1, ngens(q), [valuation(mS(preimage(mq, q[i])), p) for i=1:ngens(q)]) for p = keys(lp)]) + C = reduce(vcat, (matrix(FlintZZ, 1, ngens(q), [valuation(mS(preimage(mq, q[i])), p) for i=1:ngens(q)]) for p = keys(lp))) - A = vcat([matrix(FlintZZ, 1, ngens(q), [valuation(norm(mkK, mS(preimage(mq, g))), p) for g in gens(q)]) for p = keys(la)]) + A = reduce(vcat, (matrix(FlintZZ, 1, ngens(q), [valuation(norm(mkK, mS(preimage(mq, g))), p) for g in gens(q)]) for p = keys(la))) b = matrix(FlintZZ, length(la), 1, [valuation(a, p) for p = keys(la)]) so = solve_mixed(A, b, C) @@ -168,9 +168,9 @@ function norm_equation_fac_elem(R::Hecke.RelNumFieldOrder{AbsSimpleNumFieldElem, return sol end -norm_equation(R::Hecke.RelNumFieldOrder{AbsSimpleNumFieldElem,Hecke.AbsSimpleNumFieldOrderFractionalIdeal}, a::AbsNumFieldOrderElem{AbsSimpleNumField,AbsSimpleNumFieldElem}) = map(x -> R(evaluate(x)), norm_equation_fac_elem(R, a)) +norm_equation(R::Hecke.RelNumFieldOrder{AbsSimpleNumFieldElem,Hecke.AbsSimpleNumFieldOrderFractionalIdeal}, a::AbsSimpleNumFieldOrderElem) = map(x -> R(evaluate(x)), norm_equation_fac_elem(R, a)) -function is_irreducible(a::AbsNumFieldOrderElem{AbsSimpleNumField,AbsSimpleNumFieldElem}) +function is_irreducible(a::AbsSimpleNumFieldOrderElem) if iszero(a) return false end @@ -206,11 +206,11 @@ function is_irreducible(a::AbsNumFieldOrderElem{AbsSimpleNumField,AbsSimpleNumFi end @doc raw""" - irreducibles(S::Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField,AbsSimpleNumFieldElem}}) -> Vector{AbsNumFieldOrderElem} + irreducibles(S::Vector{AbsSimpleNumFieldOrderIdeal}) -> Vector{AbsNumFieldOrderElem} Return all irreducibles whose support is contained in $S$. """ -function irreducibles(S::Vector{AbsNumFieldOrderIdeal{AbsSimpleNumField,AbsSimpleNumFieldElem}}) +function irreducibles(S::Vector{AbsSimpleNumFieldOrderIdeal}) if length(S) == 0 return [] end @@ -268,11 +268,11 @@ end =# @doc raw""" - factorizations(a::AbsNumFieldOrderElem{AbsSimpleNumField,AbsSimpleNumFieldElem}) -> Vector{Fac{OrdElem}} + factorizations(a::AbsSimpleNumFieldOrderElem) -> Vector{Fac{OrdElem}} Return all factorizations of $a$ into irreducibles. """ -function factorizations(a::AbsNumFieldOrderElem{AbsSimpleNumField,AbsSimpleNumFieldElem}) +function factorizations(a::AbsSimpleNumFieldOrderElem) O = parent(a) S = collect(keys(factor(a*O))) if length(S) == 0 @@ -302,7 +302,7 @@ function factorizations(a::AbsNumFieldOrderElem{AbsSimpleNumField,AbsSimpleNumFi end end sol = solve_non_negative(A, b) - res = Fac{AbsNumFieldOrderElem{AbsSimpleNumField,AbsSimpleNumFieldElem}}[] + res = Fac{AbsSimpleNumFieldOrderElem}[] for j=1:nrows(sol) x = Dict{typeof(a), Int}() y = a diff --git a/test/NumberTheory/nmbthy.jl b/test/NumberTheory/nmbthy.jl index f4e628df5ccc..bc6790ac17a3 100644 --- a/test/NumberTheory/nmbthy.jl +++ b/test/NumberTheory/nmbthy.jl @@ -4,7 +4,8 @@ using Test function evalu(x::Fac) return x.unit * prod(p*k for (p,k) = x.fac) end -@testset "Polymake.factorizations" begin + +@testset "factorizations" begin k, a = quadratic_field(-5) zk = maximal_order(k) f = factorizations(zk(6)) @@ -12,7 +13,7 @@ end @test all(x -> evalu(x) == 6, f) end -@testset "Polymake.norm_equation" begin +@testset "norm_equation.absolute" begin k, a = wildanger_field(3, 13) zk = maximal_order(k) na = norm(rand(zk, 1:10)) @@ -20,6 +21,18 @@ end @test all(x->norm(x) == na, s) end +@testset "norm_equation.relative" begin + L, _ = quadratic_field(-1) + _, x = L[:x] + f = x^3 - 2; + k, _ = number_field(f) + + zk = maximal_order(k) + na = norm(rand(zk, 10)) + s = norm_equation(zk, na) + @test all(x->norm(x) == na, s) +end + @testset "DiscreteLog" begin F = GF(3,4); From bac9829ec6243d739312d254a39e4a85685e739c Mon Sep 17 00:00:00 2001 From: Benjamin Lorenz Date: Fri, 15 Nov 2024 17:35:21 +0100 Subject: [PATCH 08/15] add missing doctest markers (#4321) (cherry picked from commit 56c8f1f42fae7aa22a85107689189d085c3198fd) --- experimental/SetPartitions/src/SetPartition.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/experimental/SetPartitions/src/SetPartition.jl b/experimental/SetPartitions/src/SetPartition.jl index dab1433dc8d7..3bb6a44ec548 100644 --- a/experimental/SetPartitions/src/SetPartition.jl +++ b/experimental/SetPartitions/src/SetPartition.jl @@ -84,6 +84,7 @@ julia> lower_points(set_partition([2, 4], [4, 99])) 2-element Vector{Int64}: 2 3 +``` """ function lower_points(p::SetPartition) return p.lower_points From 1ca4ab9d633ad3613913607c739228b123d36624 Mon Sep 17 00:00:00 2001 From: Benjamin Lorenz Date: Mon, 18 Nov 2024 11:44:10 +0100 Subject: [PATCH 09/15] CI: check for jldoctest end markers and unknown admonitions (#4325) * CI: check for jldoctest end markers and unknown admonitions * docs: fix two admonitions * add explanation * use !== nothing (cherry picked from commit e8f8ecc5039fe49de8b8d6bef111c39aed83a722) --- .github/workflows/Docstrings.yml | 29 +++++ etc/check_docstrings.jl | 107 ++++++++++++++++++ .../src/UserFunctions.jl | 4 +- 3 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/Docstrings.yml create mode 100644 etc/check_docstrings.jl diff --git a/.github/workflows/Docstrings.yml b/.github/workflows/Docstrings.yml new file mode 100644 index 000000000000..c3ae6a2f5780 --- /dev/null +++ b/.github/workflows/Docstrings.yml @@ -0,0 +1,29 @@ +name: docstring test + +on: + push: + branches: + - master + - 'release-*' + pull_request: + workflow_dispatch: + +concurrency: + # group by workflow and ref; the last slightly strange component ensures that for pull + # requests, we limit to 1 concurrent job, but for the master branch we don't + group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref != 'refs/heads/master' || github.run_number }} + # Cancel intermediate builds, but only if it is a pull request build. + cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }} + +jobs: + check-docstrings: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: julia-actions/setup-julia@v2 + - uses: julia-actions/cache@v2 + - name: Build package + uses: julia-actions/julia-buildpkg@v1 + - name: 'Check issues in docstrings' + run: | + julia --project=. -e 'using Oscar; include("etc/check_docstrings.jl")' diff --git a/etc/check_docstrings.jl b/etc/check_docstrings.jl new file mode 100644 index 000000000000..72caa4d49495 --- /dev/null +++ b/etc/check_docstrings.jl @@ -0,0 +1,107 @@ +# this can be run from the command line with: +# > julia --project=. -e 'using Oscar; include("etc/check_docstrings.jl")' +# +# it is also possible to test more packages at once (as long as Main.X exists) +# > julia --project=. -e 'using Oscar; include("etc/check_docstrings.jl")' Nemo Singular Hecke Polymake GAP Oscar +# +# note: the @main function requires julia 1.11 or newer + + +using Markdown + +admonition_types = string.((:note, :info, :tip, :danger, :warning, :compat, :todo, :details)) + +# this might not catch all broken jldoctests but seems to work for now +function has_broken_doctest(md::Markdown.MD) + todo = copy(md.content) + while !isempty(todo) + elem = popfirst!(todo) + # nested + if elem isa Markdown.MD + append!(todo, elem.content) + else + # proper docstrings are in a Markdown.Code block + if elem isa Markdown.Paragraph + for block in elem.content + # unterminated jldoctests seem to end up inside some string in a Paragraph block + if contains(string(block),"```jldoctest") + return "Unterminated jldoctest: $(string(block))" + end + end + elseif elem isa Markdown.Admonition + if !(elem.category in admonition_types) + return "Unknown admonition category: $(string(elem.category))" + end + end + end + end + return nothing +end + +function find_docstr_src(docs) + locs = [] + res = docs.meta[:results] + for i in 1:length(docs.content) + msg = has_broken_doctest(docs.content[i]) + if msg !== nothing + file = res[i].data[:path] + line = res[i].data[:linenumber] + mod = res[i].data[:module] + push!(locs, (mod, file, line, msg)) + end + end + return locs +end + +function get_broken_docstrings(m::Module) + allpairs = collect(zip(Iterators.repeated(m), names(m; all=true, imported=false))); + broken = [] + locs = [] + done = [m] + + while !isempty(allpairs) + (src, name) = popfirst!(allpairs) + memberobj = try + getfield(src,name) + catch + nothing + end + if memberobj isa Module + if !(memberobj in done) + push!(done, memberobj) + # we only want to consider one pkg + # but note that we still seem to pick up some reexported names + # even though imported=false and the check below + if (pkgdir(memberobj) == pkgdir(m)) + newnames = names(memberobj; all=true, imported=false) + filter!(x->!((memberobj, x) in allpairs || x in done), newnames) + append!(allpairs, collect(zip(Iterators.repeated(memberobj), newnames))) + end + end + elseif !isnothing(memberobj) + docs = Base.Docs.doc(memberobj) + if docs isa Markdown.MD + if has_broken_doctest(docs) !== nothing && !(memberobj in broken) + loc = find_docstr_src(docs) + push!(broken, memberobj) + # we could filter out docs from other packages via startswith(x, pkgdir(m)) + append!(locs, loc) + end + end + end + end + return locs +end + +function (@main)(args) + modnames = length(args) > 0 ? args : ["Oscar"] + mod = getfield.(Ref(Main), Symbol.(modnames)) + locs = reduce(vcat, get_broken_docstrings.(mod)) + isempty(locs) && exit(0) + for (mod, file, line, msg) in locs + dir = joinpath(pkgdir(mod),"") # add trailing / + relfile = replace(file, dir => "") + println("::error file=$relfile,line=$line,title=$(string(mod))::$msg") + end + exit(-1) +end diff --git a/experimental/BasisLieHighestWeight/src/UserFunctions.jl b/experimental/BasisLieHighestWeight/src/UserFunctions.jl index 8a69177f94dc..d9bb839a79ae 100644 --- a/experimental/BasisLieHighestWeight/src/UserFunctions.jl +++ b/experimental/BasisLieHighestWeight/src/UserFunctions.jl @@ -406,7 +406,7 @@ with highest weight `highest_weight` for a simple Lie algebra $L$ of type `type` Furthermore, for each degree, return the monomials that are not contained in the Minkowski sum of the bases of the lower degrees. -!!! warn +!!! warning Currently, this function expects $-w_0(\lambda)$ instead of $\lambda$ as the `highest_weight` input. This might change in a minor release. @@ -515,7 +515,7 @@ with highest weight `highest_weight` for a simple Lie algebra $L$ of type `type` Furthermore, for each degree, return the monomials that are not contained in the Minkowski sum of the bases of the lower degrees. -!!! warn +!!! warning Currently, this function expects $-w_0(\lambda)$ instead of $\lambda$ as the `highest_weight` input. This might change in a minor release. From 5a9daa805970aa03883fba63ee6bfc161b9f33bd Mon Sep 17 00:00:00 2001 From: Matthias Zach <85350711+HechtiDerLachs@users.noreply.github.com> Date: Thu, 14 Nov 2024 15:25:37 +0100 Subject: [PATCH 10/15] Add some dummy hash functions for the geometry (#4305) (cherry picked from commit f96891f916fee79c570ce2ba3f3ea89488ffb16c) --- .../Schemes/AffineSchemes/Objects/Methods.jl | 5 +++++ .../Schemes/Divisors/AlgebraicCycles.jl | 4 ++++ src/AlgebraicGeometry/Schemes/Divisors/CartierDivisor.jl | 9 +++++++++ src/AlgebraicGeometry/Schemes/Gluing/Methods.jl | 4 ++++ .../Schemes/ProjectiveSchemes/Objects/Methods.jl | 3 +++ src/AlgebraicGeometry/Schemes/Sheaves/CoherentSheaves.jl | 3 +++ 6 files changed, 28 insertions(+) diff --git a/src/AlgebraicGeometry/Schemes/AffineSchemes/Objects/Methods.jl b/src/AlgebraicGeometry/Schemes/AffineSchemes/Objects/Methods.jl index 724c56802dcf..6319cd4d9887 100644 --- a/src/AlgebraicGeometry/Schemes/AffineSchemes/Objects/Methods.jl +++ b/src/AlgebraicGeometry/Schemes/AffineSchemes/Objects/Methods.jl @@ -473,3 +473,8 @@ function _change_base_ring(phi::Any, @assert _has_coefficient_map(res_map) return L_red, res_map end + +function Base.hash(X::Scheme, u::UInt) + return u +end + diff --git a/src/AlgebraicGeometry/Schemes/Divisors/AlgebraicCycles.jl b/src/AlgebraicGeometry/Schemes/Divisors/AlgebraicCycles.jl index 82806d80c191..ea7b74e85290 100644 --- a/src/AlgebraicGeometry/Schemes/Divisors/AlgebraicCycles.jl +++ b/src/AlgebraicGeometry/Schemes/Divisors/AlgebraicCycles.jl @@ -534,3 +534,7 @@ function integral(W::AbsAlgebraicCycle; check::Bool=true) return result end +function Base.hash(X::AbsAlgebraicCycle, u::UInt) + return u +end + diff --git a/src/AlgebraicGeometry/Schemes/Divisors/CartierDivisor.jl b/src/AlgebraicGeometry/Schemes/Divisors/CartierDivisor.jl index 34c5e1255791..36f7e74ae448 100644 --- a/src/AlgebraicGeometry/Schemes/Divisors/CartierDivisor.jl +++ b/src/AlgebraicGeometry/Schemes/Divisors/CartierDivisor.jl @@ -530,3 +530,12 @@ function _show_semi_compact(io::IO, C::CartierDivisor, cov::Covering, n::String) print(io, Dedent()) end end + +function Base.hash(X::CartierDivisor, u::UInt) + return u +end + +function Base.hash(X::EffectiveCartierDivisor, u::UInt) + return u +end + diff --git a/src/AlgebraicGeometry/Schemes/Gluing/Methods.jl b/src/AlgebraicGeometry/Schemes/Gluing/Methods.jl index 7024fc902e00..70b9e81c97e4 100644 --- a/src/AlgebraicGeometry/Schemes/Gluing/Methods.jl +++ b/src/AlgebraicGeometry/Schemes/Gluing/Methods.jl @@ -236,3 +236,7 @@ function base_change(phi::Any, G::AbsGluing; return LazyGluing(domain(patch_change1), domain(patch_change2), gd) end +function Base.hash(X::AbsGluing, u::UInt) + return u +end + diff --git a/src/AlgebraicGeometry/Schemes/ProjectiveSchemes/Objects/Methods.jl b/src/AlgebraicGeometry/Schemes/ProjectiveSchemes/Objects/Methods.jl index 20e2c51d5841..cb9bbb3b3543 100644 --- a/src/AlgebraicGeometry/Schemes/ProjectiveSchemes/Objects/Methods.jl +++ b/src/AlgebraicGeometry/Schemes/ProjectiveSchemes/Objects/Methods.jl @@ -433,5 +433,8 @@ function Base.union(comp::Vector{<:AbsProjectiveScheme}) return result end +function Base.hash(X::AbsProjectiveScheme, u::UInt) + return u +end diff --git a/src/AlgebraicGeometry/Schemes/Sheaves/CoherentSheaves.jl b/src/AlgebraicGeometry/Schemes/Sheaves/CoherentSheaves.jl index 2bf4fb32bdc8..cdd99771ec45 100644 --- a/src/AlgebraicGeometry/Schemes/Sheaves/CoherentSheaves.jl +++ b/src/AlgebraicGeometry/Schemes/Sheaves/CoherentSheaves.jl @@ -1116,4 +1116,7 @@ function projectivization(E::AbsCoherentSheaf; return CoveredProjectiveScheme(X, C, on_patches, projective_gluings, check=false) end +function Base.hash(X::AbsCoherentSheaf, u::UInt) + return u +end From 0aaadb89e5227552703c95d1587f3f0ac7b14d5e Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 15 Nov 2024 14:07:00 +0100 Subject: [PATCH 11/15] bib: add a bunch of DOIs, minor corrections (#4317) DOIs added via script from . The DOIs were then checked with and in a few cases further adjustments were made to the bib data. (cherry picked from commit fb767f2294d2f0781b5253e538426298e49c1efd) --- docs/oscar_references.bib | 83 ++++++++++++++++--------- docs/src/Groups/tom.md | 2 +- src/Combinatorics/Matroids/ChowRings.jl | 4 +- 3 files changed, 58 insertions(+), 31 deletions(-) diff --git a/docs/oscar_references.bib b/docs/oscar_references.bib index c6e93053f394..f4d98cea61df 100644 --- a/docs/oscar_references.bib +++ b/docs/oscar_references.bib @@ -34,7 +34,7 @@ @Article{AG10 number = {1}, pages = {3--24}, year = {2010}, - eprint = {0810.1148} + doi = {10.1070/SM2010v201n01ABEH004063} } @InProceedings{AGK96, @@ -155,6 +155,7 @@ @InProceedings{BDLP19 booktitle = {MEGA 2019 - International Conference on Effective Methods in Algebraic Geometry}, address = {Madrid, Spain}, year = {2019}, + doi = {10.1016/j.jsc.2020.07.007}, archiveprefix = {HAL}, eprint = {hal-02912148} } @@ -193,13 +194,17 @@ @InProceedings{BES-E-D21 location = {Virtual Event, Russian Federation} } -@Misc{BES19, +@Article{BES23, author = {Backman, Spencer and Eur, Christopher and Simpson, Connor}, title = {Simplicial generation of Chow rings of matroids}, - year = {2019}, - eprint = {1905.07114}, - archiveprefix = {arXiv}, - primaryclass = {math.CO} + journal = {JEMS}, + fjournal = {Journal of the European Mathematical Society}, + volume = {26}, + number = {11}, + pages = {4491--4535}, + year = {2023}, + month = jun, + doi = {10.4171/jems/1350} } @Book{BGV03, @@ -236,13 +241,15 @@ @Article{BH23 doi = {10.1017/fms.2023.50} } -@Misc{BHMPW20, +@Article{BHMPW22, author = {Braden, Tom and Huh, June and Matherne, Jacob P. and Proudfoot, Nicholas and Wang, Botong}, title = {A semi-small decomposition of the Chow ring of a matroid}, - year = {2020}, - eprint = {2002.03341}, - archiveprefix = {arXiv}, - primaryclass = {math.AG} + journal = {Advances in Mathematics}, + volume = {409}, + pages = {108646}, + year = {2022}, + month = nov, + doi = {10.1016/j.aim.2022.108646} } @Book{BHPV-D-V04, @@ -254,6 +261,7 @@ @Book{BHPV-D-V04 publisher = {Berlin: Springer}, edition = {2nd enlarged ed.}, year = {2004}, + doi = {10.1007/978-3-642-57739-0}, fseries = {Ergebnisse der Mathematik und ihrer Grenzgebiete. 3. Folge}, language = {English}, zbmath = {2008523} @@ -364,7 +372,8 @@ @Book{Ben93 volume = {190}, address = {Cambridge}, publisher = {Cambridge University Press}, - year = {1993} + year = {1993}, + doi = {10.1017/CBO9780511565809} } @MastersThesis{Bhm99, @@ -409,14 +418,15 @@ @Article{Bis96 doi = {10.1112/S0025579300011773} } -@Book{Bur55, +@Book{Bur11, author = {Burnside, W.}, title = {Theory of groups of finite order}, mrnumber = {69818}, note = {2d ed}, publisher = {Dover Publications, Inc., New York}, pages = {xxiv+512}, - year = {1955} + year = {1911}, + doi = {10.1017/CBO9781139237253} } @Book{C-MLS20, @@ -633,6 +643,7 @@ @InCollection{DE02 publisher = {Berlin: Springer}, pages = {215--249}, year = {2002}, + doi = {10.1007/978-3-662-04851-1_9}, language = {English}, zbmath = {1693054} } @@ -742,7 +753,8 @@ @Article{DK17 fjournal = {Journal of Algebra}, volume = {472}, pages = {546--572}, - year = {2017} + year = {2017}, + doi = {10.1016/j.jalgebra.2016.10.042} } @Book{DL06, @@ -803,6 +815,7 @@ @Book{DSS09 volume = {39}, publisher = {Basel: Birkhäuser}, year = {2009}, + doi = {10.1007/978-3-7643-8905-5}, fseries = {Oberwolfach Seminars}, language = {English}, zbmath = {5303649} @@ -1001,6 +1014,7 @@ @InProceedings{FLINT publisher = {Springer-Verlag}, pages = {88--91}, year = {2010}, + doi = {10.1007/978-3-642-15582-6_18}, location = {Kobe, Japan}, numpages = {4} } @@ -1050,7 +1064,8 @@ @Book{Ful97 note = {With applications to representation theory and geometry}, publisher = {Cambridge University Press, Cambridge}, pages = {x+260}, - year = {1997} + year = {1997}, + doi = {10.1017/CBO9780511626241} } @Book{Ful98, @@ -1087,7 +1102,8 @@ @InProceedings{GHJ16 address = {Cham}, publisher = {Springer International Publishing}, pages = {403--410}, - year = {2016} + year = {2016}, + doi = {10.1007/978-3-319-42432-3_50} } @Article{GIR96, @@ -1133,7 +1149,8 @@ @InProceedings{GK14 booktitle = {Proceedings of the fifteenth ACM conference on Economics and computation}, publisher = {Association for Computing Machinery, New York}, pages = {259--276}, - year = {2014} + year = {2014}, + doi = {10.1145/2600057.2602883} } @Book{GLS07, @@ -1418,7 +1435,8 @@ @Article{JKS22 number = {4}, publisher = {SIAM}, pages = {711--739}, - year = {2022} + year = {2022}, + doi = {10.1137/21M1441286} } @Article{JLLT22, @@ -1522,7 +1540,8 @@ @Book{Jos21 volume = {219}, address = {Providence, RI}, publisher = {American Mathematical Society}, - year = {2021} + year = {2021}, + doi = {10.1090/gsm/219} } @Article{Jow11, @@ -1616,7 +1635,8 @@ @InCollection{KS99 volume = {173}, publisher = {Birkhäuser, Basel}, pages = {267--285}, - year = {1999} + year = {1999}, + doi = {10.1007/978-3-0348-8716-8_17} } @Article{Kah10, @@ -1692,6 +1712,7 @@ @Book{Kol13 note = {With a collaboration of Sándor Kovács}, publisher = {Cambridge University Press}, year = {2013}, + doi = {10.1017/CBO9781139547895}, location = {Cambridge} } @@ -1774,7 +1795,8 @@ @Book{Loo84 volume = {77}, publisher = {Cambridge University Press, Cambridge}, pages = {xi+200}, - year = {1984} + year = {1984}, + doi = {10.1017/CBO9780511662720} } @Misc{MNP24, @@ -1834,7 +1856,8 @@ @Book{MS15 volume = {161}, publisher = {Providence, RI: American Mathematical Society (AMS)}, pages = {xii + 363}, - year = {2015} + year = {2015}, + doi = {10.1090/gsm/161} } @Book{MS21, @@ -2012,7 +2035,8 @@ @Article{Pos09 number = {6}, publisher = {OUP}, pages = {1026--1106}, - year = {2009} + year = {2009}, + doi = {10.1093/imrn/rnn153} } @Article{Pos18, @@ -2048,13 +2072,14 @@ @Article{RR10 doi = {10.1063/1.3501135} } -@Article{RSS03, +@InBook{RSS03, author = {Rote, Günter and Santos, Francisco and Streinu, Ileana}, title = {Expansive motions and the polytope of pointed pseudo-triangulations}, - journal = {Discrete and Computational Geometry: The Goodman-Pollack Festschrift}, + booktitle = {Discrete and Computational Geometry}, publisher = {Springer}, pages = {699--736}, - year = {2003} + year = {2003}, + doi = {10.1007/978-3-642-55566-4_33} } @Article{Rin13, @@ -2078,6 +2103,7 @@ @Book{SS03 volume = {24}, publisher = {Oxford University Press}, year = {2003}, + doi = {10.1093/oso/9780198509424.001.0001}, fseries = {Oxford Lecture Series in Mathematics and its Applications} } @@ -2191,7 +2217,8 @@ @Article{Sta79 volume = {1}, number = {3}, pages = {475--511}, - year = {1979} + year = {1979}, + doi = {10.1090/S0273-0979-1979-14597-X} } @Misc{Stacks, diff --git a/docs/src/Groups/tom.md b/docs/src/Groups/tom.md index fb04e7274c40..05f64e78bfe2 100644 --- a/docs/src/Groups/tom.md +++ b/docs/src/Groups/tom.md @@ -6,7 +6,7 @@ DocTestSetup = Oscar.doctestsetup() # Tables of Marks The concept of a *Table of Marks* was introduced by W. Burnside in his book -Theory of Groups of Finite Order [Bur55](@cite). +Theory of Groups of Finite Order [Bur11](@cite). Therefore a table of marks is sometimes called a *Burnside matrix*. The table of marks of a finite group ``G`` is a matrix whose rows and columns are labelled by the conjugacy classes of subgroups of ``G`` and where for diff --git a/src/Combinatorics/Matroids/ChowRings.jl b/src/Combinatorics/Matroids/ChowRings.jl index 6e98d0cec084..dbcefb19380c 100644 --- a/src/Combinatorics/Matroids/ChowRings.jl +++ b/src/Combinatorics/Matroids/ChowRings.jl @@ -3,7 +3,7 @@ Return the Chow ring of a matroid, optionally also with the simplicial generators and the polynomial ring. -See [AHK18](@cite) and [BES19](@cite). +See [AHK18](@cite) and [BES23](@cite). # Examples The following computes the Chow ring of the Fano matroid. @@ -141,7 +141,7 @@ end @doc raw""" augmented_chow_ring(M::Matroid) -Return an augmented Chow ring of a matroid. As described in [BHMPW20](@cite). +Return an augmented Chow ring of a matroid. As described in [BHMPW22](@cite). # Examples ```jldoctest From 5c874c9a838934a39033e1ffd0051502d7458850 Mon Sep 17 00:00:00 2001 From: Lars Kastner Date: Thu, 14 Nov 2024 12:08:34 +0100 Subject: [PATCH 12/15] issue/2142: Add subtype info to docs (cherry picked from commit 46d028f2ac342af8143ac28bf5971eb783fec613) --- src/PolyhedralGeometry/Cone/properties.jl | 2 +- src/PolyhedralGeometry/Polyhedron/properties.jl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PolyhedralGeometry/Cone/properties.jl b/src/PolyhedralGeometry/Cone/properties.jl index 9aaf989ef0cb..6e56e125921c 100644 --- a/src/PolyhedralGeometry/Cone/properties.jl +++ b/src/PolyhedralGeometry/Cone/properties.jl @@ -534,7 +534,7 @@ is_fulldimensional(C::Cone) = pm_object(C).FULL_DIM::Bool Return the facets of `C` in the format defined by `as`. The allowed values for `as` are -* `Halfspace`, +* `Halfspace` (or its subtype `LinearHalfspace`), * `Cone`. # Examples diff --git a/src/PolyhedralGeometry/Polyhedron/properties.jl b/src/PolyhedralGeometry/Polyhedron/properties.jl index a7ad3ae9656a..c400ea1bce88 100644 --- a/src/PolyhedralGeometry/Polyhedron/properties.jl +++ b/src/PolyhedralGeometry/Polyhedron/properties.jl @@ -491,7 +491,7 @@ end Return the facets of `P` in the format defined by `as`. The allowed values for `as` are -* `Halfspace`, +* `Halfspace` (or its subtype `AffineHalfspace`), * `Polyhedron`, * `Pair`. From a10b49afcb68d97740c75264bad7be92d9e5ddcd Mon Sep 17 00:00:00 2001 From: Aaruni Kaushik Date: Wed, 13 Nov 2024 14:03:46 +0100 Subject: [PATCH 13/15] Patch search index (#4292) * Patch search index This removes anything in search index that is not also present in doc.main. That is, the search function will not return "hidden" pages, which are not available via normal navigation. * Move code to the right place, so its trigerred not just on interactive use * Add JSON to docs Project.toml * docs/search: improve doc.main parsing, use .html or / depending on local_build --------- Co-authored-by: Benjamin Lorenz (cherry picked from commit d15b0c94bc16c002a9334f7ed998aca48e17f8f5) --- docs/Project.toml | 2 ++ docs/make_work.jl | 52 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/docs/Project.toml b/docs/Project.toml index 07d7ae149a80..6dad0075f817 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -1,7 +1,9 @@ [deps] Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" DocumenterCitations = "daee34ce-89f3-4625-b898-19384cb65244" +JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" [compat] Documenter = "1.1" DocumenterCitations = "~1.3.4" +JSON = "0.21.4" diff --git a/docs/make_work.jl b/docs/make_work.jl index b3a0aec16741..91efab27a67c 100644 --- a/docs/make_work.jl +++ b/docs/make_work.jl @@ -4,7 +4,7 @@ # module BuildDoc -using Documenter, DocumenterCitations +using Documenter, DocumenterCitations, JSON include("documenter_helpers.jl") include("citation_style.jl") @@ -210,6 +210,56 @@ function doit( dstbase = normpath(Oscar.oscardir, "docs", "src", string(nameof(pkg))) rm(dstbase; recursive=true, force=true) end + + # postprocessing, for the search index + docspath = normpath(joinpath(Oscar.oscardir, "docs")) + @info "Patching search index." + # extract valid json from search_index.js + run(pipeline(`sed -n '2p;3q' $(joinpath(docspath, "build", "search_index.js"))`, stdout=(joinpath(docspath, "build", "search_index.json")))) # imperfect file, but JSON parses it + + # extract paths from doc.main + filelist=String[] + docmain = include(joinpath(docspath, "doc.main")) + while !isempty(docmain) + n = pop!(docmain) + if n isa Pair + push!(docmain, last(n)) + elseif n isa String + push!(filelist, n) + elseif n isa Array{String} + append!(filelist,n) + elseif n isa Array + append!(docmain,n) + else + error("err: $(typeof(n))") + end + end + suffix = local_build ? ".html" : "/" + filelist = replace.(filelist, r"\.md$"=>suffix) + + # read these files + iosearchindex = open(joinpath(docspath, "build", "search_index.json"), "r") + searchindex = JSON.parse(iosearchindex) + close(iosearchindex) + + newsearchindex = [] + + for item in searchindex + if split(item["location"], "#")[1] in filelist + push!(newsearchindex, item) + end + end + + + # combine this to valid javascript again, and overwrite input + ionewsearchindex = open(joinpath(docspath, "build", "search_index.js"), "w") + write(ionewsearchindex, """var documenterSearchIndex = {"docs":\n""") + JSON.print(ionewsearchindex, newsearchindex) + write(ionewsearchindex, "\n}") + close(ionewsearchindex) + + # clean up + rm(joinpath(docspath, "build", "search_index.json")) end end # module BuildDoc From b8fe19bf1106bb2b733bf06ace5c1a73aedf594f Mon Sep 17 00:00:00 2001 From: Benjamin Lorenz Date: Wed, 20 Nov 2024 14:32:24 +0100 Subject: [PATCH 14/15] Version 1.2.1 --- Project.toml | 2 +- README.md | 7 ++++--- gap/OscarInterface/PackageInfo.g | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Project.toml b/Project.toml index a8f6d8da0485..ff89d27f55f9 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Oscar" uuid = "f1435218-dba5-11e9-1e4d-f1a5fab5fc13" authors = ["The OSCAR Team "] -version = "1.2.0" +version = "1.2.1" [deps] AbstractAlgebra = "c3fe647b-3220-5bb0-a1ea-a7954cac585d" diff --git a/README.md b/README.md index 5dba2c6a242c..912401b4c4c6 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,8 @@ julia> using Oscar / _ \ / ___| / ___| / \ | _ \ | Combining ANTIC, GAP, Polymake, Singular | | | |\___ \| | / _ \ | |_) | | Type "?Oscar" for more information | |_| | ___) | |___ / ___ \| _ < | Manual: https://docs.oscar-system.org - \___/ |____/ \____/_/ \_\_| \_\ | Version 1.2.0 + \___/ |____/ \____/_/ \_\_| \_\ | Version 1.2.1 + julia> k, a = quadratic_field(-5) (Imaginary quadratic field defined by x^2 + 5, sqrt(-5)) @@ -113,7 +114,7 @@ pm::Array > If you have used OSCAR in the preparation of a paper please cite it as described below: [OSCAR] - OSCAR -- Open Source Computer Algebra Research system, Version 1.2.0, + OSCAR -- Open Source Computer Algebra Research system, Version 1.2.1, The OSCAR Team, 2024. (https://www.oscar-system.org) [OSCAR-book] Wolfram Decker, Christian Eder, Claus Fieker, Max Horn, Michael Joswig, eds. @@ -126,7 +127,7 @@ If you are using BibTeX, you can use the following BibTeX entries: key = {OSCAR}, organization = {The OSCAR Team}, title = {OSCAR -- Open Source Computer Algebra Research system, - Version 1.2.0}, + Version 1.2.1}, year = {2024}, url = {https://www.oscar-system.org}, } diff --git a/gap/OscarInterface/PackageInfo.g b/gap/OscarInterface/PackageInfo.g index 8a7bbc2c1a8c..70ccf1e30b3d 100644 --- a/gap/OscarInterface/PackageInfo.g +++ b/gap/OscarInterface/PackageInfo.g @@ -10,8 +10,8 @@ SetPackageInfo( rec( PackageName := "OscarInterface", Subtitle := "GAP interface to OSCAR", -Version := "1.2.0", -Date := "30/10/2024", # dd/mm/yyyy format +Version := "1.2.1", +Date := "20/11/2024", # dd/mm/yyyy format License := "GPL-2.0-or-later", Persons := [ From b5cb6483e126e1f1d05a884e1eb4488d28ff57a8 Mon Sep 17 00:00:00 2001 From: antonydellavecchia Date: Thu, 21 Nov 2024 11:45:31 +0100 Subject: [PATCH 15/15] fixes regression and adds test for file format paper (#4335) (cherry picked from commit 5a737af78b4358675bbea8313acab7ab30dd9dc8) versions adjusted for release branch --- src/Serialization/Fields.jl | 4 +- src/Serialization/Upgrades/1.2.1.jl | 24 +++++ src/Serialization/Upgrades/main.jl | 1 + test/Serialization/loading.jl | 38 ++++--- test/Serialization/polynomial-example.mrdi | 36 +++++++ test/Serialization/upgrades/GF_2.json | 11 +++ test/Serialization/upgrades/GF_2_2.json | 45 +++++++++ test/Serialization/upgrades/poly1.0.5.json | 110 +++++++++++++++++++++ test/Serialization/upgrades/runtests.jl | 7 ++ 9 files changed, 259 insertions(+), 17 deletions(-) create mode 100644 src/Serialization/Upgrades/1.2.1.jl create mode 100644 test/Serialization/polynomial-example.mrdi create mode 100644 test/Serialization/upgrades/GF_2.json create mode 100644 test/Serialization/upgrades/GF_2_2.json create mode 100644 test/Serialization/upgrades/poly1.0.5.json diff --git a/src/Serialization/Fields.jl b/src/Serialization/Fields.jl index 4176250d0e58..043ff7c23184 100644 --- a/src/Serialization/Fields.jl +++ b/src/Serialization/Fields.jl @@ -191,7 +191,7 @@ function save_object(s::SerializerState, K::FqField) save_object(s, order(K)) else save_data_dict(s) do - save_typed_object(s, defining_polynomial(K)) + save_typed_object(s, defining_polynomial(K), :def_pol) end end end @@ -202,7 +202,7 @@ function load_object(s::DeserializerState, ::Type{<: FqField}) order = ZZRingElem(node) return finite_field(order)[1] else - def_pol = load_typed_object(s) + def_pol = load_typed_object(s, :def_pol) return finite_field(def_pol, cached=false)[1] end end diff --git a/src/Serialization/Upgrades/1.2.1.jl b/src/Serialization/Upgrades/1.2.1.jl new file mode 100644 index 000000000000..3e33f35c831f --- /dev/null +++ b/src/Serialization/Upgrades/1.2.1.jl @@ -0,0 +1,24 @@ +push!(upgrade_scripts_set, UpgradeScript( + v"1.2.1", + function upgrade_1_2_1(s::UpgradeState, dict::Dict) + upgraded_dict = dict + if haskey(dict, :_type) && dict[:_type] == "FqField" + if dict[:data] isa Dict + if !(haskey(dict[:data], :def_pol)) + upgraded_dict[:data][:def_pol] = copy(dict[:data]) + end + end + elseif haskey(dict, :data) && dict[:data] isa Dict + upgraded_dict[:data] = upgrade_1_2_1(s, dict[:data]) + end + if haskey(dict, :_refs) + upgraded_refs = Dict() + for (k, v) in dict[:_refs] + upgraded_refs[k] = upgrade_1_2_1(s, v) + end + upgraded_dict[:_refs] = upgraded_refs + end + + return upgraded_dict + end +)) diff --git a/src/Serialization/Upgrades/main.jl b/src/Serialization/Upgrades/main.jl index fa297ff5e03f..40c9f321aa08 100644 --- a/src/Serialization/Upgrades/main.jl +++ b/src/Serialization/Upgrades/main.jl @@ -141,6 +141,7 @@ include("0.13.0.jl") include("0.15.0.jl") include("1.1.0.jl") include("1.2.0.jl") +include("1.2.1.jl") const upgrade_scripts = collect(upgrade_scripts_set) sort!(upgrade_scripts; by=version) diff --git a/test/Serialization/loading.jl b/test/Serialization/loading.jl index 299688d5f1b3..346bcd4b4245 100644 --- a/test/Serialization/loading.jl +++ b/test/Serialization/loading.jl @@ -1,17 +1,25 @@ @testset "loading" begin - - @testset "loading Vector{LinearProgram}" begin - c = cube(3) - LP0 = linear_program(c, [2,2,-3]) - LP1 = linear_program(c, [2,2,4]) - v = [LP0, LP1] - loaded = load(joinpath(@__DIR__,"vlp.json")) - @test length(v) == length(loaded) - @test feasible_region(loaded[1]) == feasible_region(loaded[2]) - @test feasible_region(loaded[1]) == feasible_region(LP0) - @test objective_function(loaded[1]) == objective_function(v[1]) - @test objective_function(loaded[2]) == objective_function(v[2]) - @test optimal_value(loaded[1]) == optimal_value(v[1]) - @test optimal_value(loaded[2]) == optimal_value(v[2]) - end + @testset "loading file format paper example" begin + F = GF(7, 2) + o = gen(F) + Fyz, (y, z) = F[:x, :y] + load(joinpath(@__DIR__,"polynomial-example.mrdi");) + loaded = load(joinpath(@__DIR__,"polynomial-example.mrdi"); params=Fyz) + @test loaded == 2*y^3*z^4 + 5*o*y + (o + 3)*z^2 + 1 + end + + @testset "loading Vector{LinearProgram}" begin + c = cube(3) + LP0 = linear_program(c, [2,2,-3]) + LP1 = linear_program(c, [2,2,4]) + v = [LP0, LP1] + loaded = load(joinpath(@__DIR__,"vlp.json")) + @test length(v) == length(loaded) + @test feasible_region(loaded[1]) == feasible_region(loaded[2]) + @test feasible_region(loaded[1]) == feasible_region(LP0) + @test objective_function(loaded[1]) == objective_function(v[1]) + @test objective_function(loaded[2]) == objective_function(v[2]) + @test optimal_value(loaded[1]) == optimal_value(v[1]) + @test optimal_value(loaded[2]) == optimal_value(v[2]) + end end diff --git a/test/Serialization/polynomial-example.mrdi b/test/Serialization/polynomial-example.mrdi new file mode 100644 index 000000000000..0ad82300e7b4 --- /dev/null +++ b/test/Serialization/polynomial-example.mrdi @@ -0,0 +1,36 @@ +{ + "_ns": { "Oscar": [ "https://github.com/oscar-system/Oscar.jl", "1.0.0" ] }, + "_type": { + "name": "MPolyRingElem", + "params": "869a359a-43d3-43f4-9821-0af9346be019" + }, + "data": [[["3", "4"], [["0", "2"]]], + [["0", "2"], [["0", "3"], ["1", "1"]]], + [["1", "0"], [["1", "5"]]], + [["0", "0"], [["0", "1"]]]], + "_refs": { + "152ac7bd-e85a-4b36-acc2-743ade2cad4f": { + "data": { "base_ring": { "data": "7", "_type": "FqField"}, + "symbols": ["x"] }, + "_type": "PolyRing" + }, + "869a359a-43d3-43f4-9821-0af9346be019": { + "data": { + "base_ring": "a8309b96-caec-443c-bedb-e23bb0634c14", + "symbols": [ "y", "z" ] + }, + "_type": "MPolyRing" }, + "a8309b96-caec-443c-bedb-e23bb0634c14": { + "data": { + "def_pol": { + "data": [["0", "1"], ["2", "1"]], + "_type": { + "name": "PolyRingElem", + "params": "152ac7bd-e85a-4b36-acc2-743ade2cad4f" + } + } + }, + "_type": "FqField" + } + } +} diff --git a/test/Serialization/upgrades/GF_2.json b/test/Serialization/upgrades/GF_2.json new file mode 100644 index 000000000000..812d8d1a467c --- /dev/null +++ b/test/Serialization/upgrades/GF_2.json @@ -0,0 +1,11 @@ +{ + "_ns": { + "Oscar": [ + "https://github.com/oscar-system/Oscar.jl", + "1.2.0" + ] + }, + "_type": "FqField", + "data": "2", + "id": "4e298c21-11cb-45f1-bac0-62e2df5e6454" +} diff --git a/test/Serialization/upgrades/GF_2_2.json b/test/Serialization/upgrades/GF_2_2.json new file mode 100644 index 000000000000..51d9a4e6b4da --- /dev/null +++ b/test/Serialization/upgrades/GF_2_2.json @@ -0,0 +1,45 @@ +{ + "_ns": { + "Oscar": [ + "https://github.com/oscar-system/Oscar.jl", + "1.2.0" + ] + }, + "_refs": { + "15ec4d5e-409d-4e80-a7a2-aa1b22b0db9d": { + "_type": "PolyRing", + "data": { + "base_ring": "4e298c21-11cb-45f1-bac0-62e2df5e6454", + "symbols": [ + "x" + ] + } + }, + "4e298c21-11cb-45f1-bac0-62e2df5e6454": { + "_type": "FqField", + "data": "2" + } + }, + "_type": "FqField", + "data": { + "_type": { + "name": "PolyRingElem", + "params": "15ec4d5e-409d-4e80-a7a2-aa1b22b0db9d" + }, + "data": [ + [ + "0", + "1" + ], + [ + "1", + "1" + ], + [ + "2", + "1" + ] + ] + }, + "id": "b2e7bf06-d89a-4fea-8bf4-215a61c16ca2" +} diff --git a/test/Serialization/upgrades/poly1.0.5.json b/test/Serialization/upgrades/poly1.0.5.json new file mode 100644 index 000000000000..b26acd897b02 --- /dev/null +++ b/test/Serialization/upgrades/poly1.0.5.json @@ -0,0 +1,110 @@ +{ + "_ns": { + "Oscar": [ + "https://github.com/oscar-system/Oscar.jl", + "1.0.5" + ] + }, + "_type": { + "name": "MPolyRingElem", + "params": "f0885e3e-71ff-4813-88fd-7ee05eeb3657" + }, + "data": [ + [ + [ + "3", + "4" + ], + [ + [ + "0", + "2" + ] + ] + ], + [ + [ + "1", + "0" + ], + [ + [ + "1", + "5" + ] + ] + ], + [ + [ + "0", + "2" + ], + [ + [ + "0", + "3" + ], + [ + "1", + "1" + ] + ] + ], + [ + [ + "0", + "0" + ], + [ + [ + "0", + "1" + ] + ] + ] + ], + "_refs": { + "f0885e3e-71ff-4813-88fd-7ee05eeb3657": { + "_type": "MPolyRing", + "data": { + "base_ring": "e06a6ac9-954b-4fb7-89c6-f2a25489440e", + "symbols": [ + "y", + "z" + ] + } + }, + "e06a6ac9-954b-4fb7-89c6-f2a25489440e": { + "_type": "FqField", + "data": { + "_type": { + "name": "PolyRingElem", + "params": "3a66dcbd-bd73-4bb7-8b99-42d9f5177893" + }, + "data": [ + [ + "0", + "1" + ], + [ + "2", + "1" + ] + ] + } + }, + "3a66dcbd-bd73-4bb7-8b99-42d9f5177893": { + "_type": "PolyRing", + "data": { + "base_ring": "221dfa92-69df-4b5a-8f30-166aafddfaa9", + "symbols": [ + "x" + ] + } + }, + "221dfa92-69df-4b5a-8f30-166aafddfaa9": { + "_type": "FqField", + "data": "7" + } + } +} diff --git a/test/Serialization/upgrades/runtests.jl b/test/Serialization/upgrades/runtests.jl index 222da8093629..282678fa9a3c 100644 --- a/test/Serialization/upgrades/runtests.jl +++ b/test/Serialization/upgrades/runtests.jl @@ -27,4 +27,11 @@ loaded = load(joinpath(@__DIR__, "file_version_less_than_1.2.0.json")); @test loaded isa Dict end + + @testset "< 1.2.1 Upgrade" begin + load(joinpath(@__DIR__, "GF_2_2.json")); + load(joinpath(@__DIR__, "GF_2.json")); + Oscar.reset_global_serializer_state() + load(joinpath(@__DIR__, "poly1.0.5.json")); + end end