PrecompileTools.jl icon indicating copy to clipboard operation
PrecompileTools.jl copied to clipboard

Precompile workload works on 1.2.1, fails with method error on 1.3.1

Open kalmarek opened this issue 4 months ago • 2 comments

this is my precompile workload:

import PrecompileTools

PrecompileTools.@setup_workload begin
    struct Word{T}
        alphabet::Vector{T}
        letters::Vector{Int}

        function Word(
            a::AbstractVector{T},
            l::AbstractVector{<:Integer},
        ) where {T}
            all(i -> 1 <= i <= length(a), l) ||
                throw(ArgumentError("Invalid word over alphabet $a: $l"))
            return new{T}(a, l)
        end
    end
    Base.show(io::IO, w::Word) = join(io, w.alphabet[w.letters], "·")

    function Base.:(==)(w::Word, v::Word)
        return w.alphabet == v.alphabet && w.letters == v.letters
    end
    function Base.hash(w::Word, h::UInt = UInt(0))
        return hash(w.alphabet, hash(w.letters, hash(Word, h)))
    end

    struct OnLetters <: ByPermutations end
    function action(::OnLetters, p::AP.AbstractPermutation, w::Word)
        return Word(w.alphabet, [w.letters[i]^p for i in eachindex(w.letters)])
    end

    function allwords(A, radius)
        words = [Word(A, [i]) for i in 1:length(A)]
        for r in 2:radius
            append!(
                words,
                [
                    Word(A, collect(w)) for
                    w in Iterators.product(fill(1:3, r)...)
                ],
            )
        end
        return words
    end

    words = allwords([:a, :b, :c], 4)
    act = OnLetters()

    PrecompileTools.@compile_workload begin
        G = PG.PermGroup(PG.perm"(1,2,3)", PG.perm"(1,2)")
        wd = WedderburnDecomposition(Rational{Int}, G, act, words, words)
        wdfl = WedderburnDecomposition(Float64, G, act, words, words)
    end
end

With PercompileTools 1.2.1 things work as expected, on 1.3.3 (as well as on 1.3.1) I get method error:

Info Given SymbolicWedderburn was explicitly requested, output will be shown live 
ERROR: LoadError: MethodError: no method matching action(::SymbolicWedderburn.OnLetters, ::PermutationGroups.Permutation{PermutationGroups.Perm{UInt16}, PermutationGroups.PermGroup{PermutationGroups.Perm{UInt16}, PermutationGroups.Transversal{UInt16, PermutationGroups.Perm{UInt16}}}}, ::SymbolicWedderburn.Word{Symbol})
The function `action` exists, but no method is defined for this combination of argument types.

Closest candidates are:
  action(::SymbolicWedderburn.ByPermutations, ::AbstractPermutations.AbstractPermutation, ::AbstractVector)
   @ SymbolicWedderburn ~/.julia/dev/SymbolicWedderburn/src/actions.jl:16
  action(::SymbolicWedderburn.InducedActionHomomorphism{<:SymbolicWedderburn.ByLinearTransformation}, ::GroupsCore.GroupElement, ::AbstractVector)
   @ SymbolicWedderburn ~/.julia/dev/SymbolicWedderburn/src/actions.jl:62
  action(::SymbolicWedderburn.InducedActionHomomorphism{<:SymbolicWedderburn.ByPermutations}, ::GroupsCore.GroupElement, ::AbstractVector)
   @ SymbolicWedderburn ~/.julia/dev/SymbolicWedderburn/src/actions.jl:31
  ...

Here for some reason action(::OnLetters, p::AP.AbstractPermutation, w::Word) is not added to the methods of action.

The rest of the stack follows:

Stacktrace:
  [1] induce(::SymbolicWedderburn.OnLetters, hom::SymbolicWedderburn.ExtensionHomomorphism{SymbolicWedderburn.OnLetters, SymbolicWedderburn.Word{Symbol}, StarAlgebras.Basis{SymbolicWedderburn.Word{Symbol}, UInt32, StarAlgebras.Basis{SymbolicWedderburn.Word{Symbol}, UInt32, Vector{SymbolicWedderburn.Word{Symbol}}}}}, g::PermutationGroups.Permutation{PermutationGroups.Perm{UInt16}, PermutationGroups.PermGroup{PermutationGroups.Perm{UInt16}, PermutationGroups.Transversal{UInt16, PermutationGroups.Perm{UInt16}}}})
    @ SymbolicWedderburn ~/.julia/dev/SymbolicWedderburn/src/actions.jl:43
  [2] induce
    @ ~/.julia/dev/SymbolicWedderburn/src/ext_homomorphisms.jl:30 [inlined]
  [3] SymbolicWedderburn.CachedExtensionHomomorphism(::Type{UInt32}, G::PermutationGroups.PermGroup{PermutationGroups.Perm{UInt16}, PermutationGroups.Transversal{UInt16, PermutationGroups.Perm{UInt16}}}, action::SymbolicWedderburn.OnLetters, basis::StarAlgebras.Basis{SymbolicWedderburn.Word{Symbol}, UInt32, Vector{SymbolicWedderburn.Word{Symbol}}}; precompute::Bool)
    @ SymbolicWedderburn ~/.julia/dev/SymbolicWedderburn/src/ext_homomorphisms.jl:91
  [4] CachedExtensionHomomorphism
    @ ~/.julia/dev/SymbolicWedderburn/src/ext_homomorphisms.jl:83 [inlined]
  [5] #CachedExtensionHomomorphism#5
    @ ~/.julia/dev/SymbolicWedderburn/src/ext_homomorphisms.jl:109 [inlined]
  [6] CachedExtensionHomomorphism
    @ ~/.julia/dev/SymbolicWedderburn/src/ext_homomorphisms.jl:103 [inlined]
  [7] SymbolicWedderburn.WedderburnDecomposition(T::Type, G::PermutationGroups.PermGroup{PermutationGroups.Perm{UInt16}, PermutationGroups.Transversal{UInt16, PermutationGroups.Perm{UInt16}}}, action::SymbolicWedderburn.OnLetters, basis_full::StarAlgebras.Basis{SymbolicWedderburn.Word{Symbol}, UInt32, Vector{SymbolicWedderburn.Word{Symbol}}}, basis_half::StarAlgebras.Basis{SymbolicWedderburn.Word{Symbol}, UInt32, Vector{SymbolicWedderburn.Word{Symbol}}}, S::Type; semisimple::Bool)
    @ SymbolicWedderburn ~/.julia/dev/SymbolicWedderburn/src/wedderburn_decomposition.jl:65
  [8] WedderburnDecomposition
    @ ~/.julia/dev/SymbolicWedderburn/src/wedderburn_decomposition.jl:53 [inlined]
  [9] SymbolicWedderburn.WedderburnDecomposition(T::Type, G::PermutationGroups.PermGroup{PermutationGroups.Perm{UInt16}, PermutationGroups.Transversal{UInt16, PermutationGroups.Perm{UInt16}}}, action::SymbolicWedderburn.OnLetters, basis_full::Vector{SymbolicWedderburn.Word{Symbol}}, basis_half::Vector{SymbolicWedderburn.Word{Symbol}}, S::Type; semisimple::Bool)
    @ SymbolicWedderburn ~/.julia/dev/SymbolicWedderburn/src/wedderburn_decomposition.jl:42
 [10] WedderburnDecomposition
    @ ~/.julia/dev/SymbolicWedderburn/src/wedderburn_decomposition.jl:33 [inlined]
 [11] SymbolicWedderburn.WedderburnDecomposition(T::Type, G::PermutationGroups.PermGroup{PermutationGroups.Perm{UInt16}, PermutationGroups.Transversal{UInt16, PermutationGroups.Perm{UInt16}}}, action::SymbolicWedderburn.OnLetters, basis_full::Vector{SymbolicWedderburn.Word{Symbol}}, basis_half::Vector{SymbolicWedderburn.Word{Symbol}})
    @ SymbolicWedderburn ~/.julia/dev/SymbolicWedderburn/src/wedderburn_decomposition.jl:33
 [12] macro expansion
    @ ~/.julia/dev/SymbolicWedderburn/src/precompile.jl:50 [inlined]
 [13] macro expansion
    @ ~/.julia/packages/PrecompileTools/gn08A/src/workloads.jl:73 [inlined]
 [14] macro expansion
    @ ~/.julia/dev/SymbolicWedderburn/src/precompile.jl:48 [inlined]
 [15] macro expansion
    @ ~/.julia/packages/PrecompileTools/gn08A/src/workloads.jl:121 [inlined]
 [16] top-level scope
    @ ~/.julia/dev/SymbolicWedderburn/src/precompile.jl:118
 [17] include(mapexpr::Function, mod::Module, _path::String)
    @ Base ./Base.jl:306
 [18] top-level scope
    @ ~/.julia/dev/SymbolicWedderburn/src/SymbolicWedderburn.jl:46
 [19] include(mod::Module, _path::String)
    @ Base ./Base.jl:305
 [20] include_package_for_output(pkg::Base.PkgId, input::String, depot_path::Vector{String}, dl_load_path::Vector{String}, load_path::Vector{String}, concrete_deps::Vector{Pair{Base.PkgId, UInt128}}, source::Nothing)
    @ Base ./loading.jl:2997
 [21] top-level scope
    @ stdin:5
 [22] eval(m::Module, e::Any)
    @ Core ./boot.jl:489
 [23] include_string(mapexpr::typeof(identity), mod::Module, code::String, filename::String)
    @ Base ./loading.jl:2843
 [24] include_string
    @ ./loading.jl:2853 [inlined]
 [25] exec_options(opts::Base.JLOptions)
    @ Base ./client.jl:319
 [26] _start()
    @ Base ./client.jl:554
in expression starting at /home/kalmar/.julia/dev/SymbolicWedderburn/src/precompile.jl:3
in expression starting at /home/kalmar/.julia/dev/SymbolicWedderburn/src/SymbolicWedderburn.jl:1
in expression starting at stdin:5
  ✗ SymbolicWedderburn

For leading issue see: https://github.com/kalmarek/SymbolicWedderburn.jl/issues/94

kalmarek avatar Sep 16 '25 17:09 kalmarek

Ping! Since v1.12 is the latest official release now, this breaks lots of CI runs.

schillic avatar Oct 11 '25 16:10 schillic

This can just be fixed in SymbolicWedderburn (https://github.com/kalmarek/SymbolicWedderburn.jl/pull/98). It's pretty weird for a package to define new types and methods only for precompile, since you're generated stuff that can never be called by the user?

odow avatar Oct 14 '25 00:10 odow