JuliaApproximation / FastTransforms.jl

:rocket: Julia package for orthogonal polynomial transforms :snowboarder:
Other
265 stars 27 forks source link

tests hang possibly due to type inference #95

Open AshtonSBradley opened 4 years ago

AshtonSBradley commented 4 years ago

Tests have suddenly become extremely slow. I can't tell if they fail because they never seem to finish:

Screen Shot 2019-12-05 at 3 22 45 PM

not sure how long this goes on for, but at least half an hour I think...

MikaelSlevinsky commented 4 years ago

Can you go the full status and your versioninfo?

Cheers,

Mikael

On Dec 5, 2019, at 2:24 AM, Ashton Bradley notifications@github.com wrote:



Tests have suddenly become extremely slow. I can't tell if they fail because they never seem to finish:

[Screen Shot 2019-12-05 at 3 22 45 PM]https://user-images.githubusercontent.com/24194258/70198251-3a005680-1773-11ea-898a-b48cdd4a977c.png

not sure how long this goes on for, but at least half an hour I think...

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHubhttps://github.com/JuliaApproximation/FastTransforms.jl/issues/95?email_source=notifications&email_token=AB6MDJPWXPQNOLLWBP2D7E3QXBQ6FA5CNFSM4JVS657KYY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4H6GGRKQ, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AB6MDJPRGKUKFPZVRM7CIJLQXBQ6FANCNFSM4JVS657A.

AshtonSBradley commented 4 years ago
(v1.3) pkg> st
    Status `~/.julia/environments/v1.3/Project.toml`
  [537997a7] AbstractPlotting v0.9.11 #master (https://github.com/JuliaPlots/AbstractPlotting.jl.git)
  [c52e3926] Atom v0.11.3
  [6e4b80f9] BenchmarkTools v0.4.3
  [944b1d66] CodecZlib v0.6.0
  [35d6a980] ColorSchemes v3.5.0
  [17699382] ComplexPortraits v0.1.0 #master (https://github.com/luchr/ComplexPortraits.jl.git)
  [2e2c70e5] DataFitting v0.1.0
  [0c46a032] DifferentialEquations v6.9.0
  [aaf54ef3] DistributedArrays v0.6.4
  [31c24e10] Distributions v0.21.9
  [e30172f5] Documenter v0.24.2
  [7a1cc6ca] FFTW v1.1.0
  [6c09c9bc] FGPEexamples v0.1.0 [`~/.julia/dev/FGPEexamples`]
  [442a2c76] FastGaussQuadrature v0.4.1
  [057dd010] FastTransforms v0.8.1
  [5789e2e9] FileIO v1.1.0
  [f013a474] FourierGPE v0.1.0 [`~/.julia/dev/FourierGPE`]
  [e9467ef8] GLMakie v0.0.8 #master (https://github.com/JuliaPlots/GLMakie.jl.git)
  [92c85e6c] GSL v0.6.0
  [4d00f742] GeometryTypes v0.7.6
  [f67ccb44] HDF5 v0.12.5
  [7073ff75] IJulia v1.20.2
  [6218d12a] ImageMagick v0.7.5
  [916415d5] Images v0.19.0
  [c601a237] Interact v0.10.3
  [a98d9a8b] Interpolations v0.12.5
  [033835bb] JLD2 v0.1.9
  [e5e0dc1b] Juno v0.7.2
  [b964fa9f] LaTeXStrings v1.0.3
  [23fbe1c1] Latexify v0.12.3
  [2fda8390] LsqFit v0.8.1
  [ee78f7c6] Makie v0.9.5 #master (https://github.com/JuliaPlots/Makie.jl.git)
  [e6723b4c] Meshing v0.5.1
  [429524aa] Optim v0.19.5
  [69f2af54] OptionalGPUTest v0.1.0 #master (https://github.com/simonbyrne/OptionalGPUTest.jl.git)
  [1dea7af3] OrdinaryDiffEq v5.26.1
  [3b7a836e] PGFPlots v3.1.3
  [8314cec4] PGFPlotsX v1.2.0
  [65888b18] ParameterizedFunctions v4.2.1
  [d96e819e] Parameters v0.12.0
  [0e21426a] PhaseSpaceTools v0.1.0 [`~/.julia/dev/PhaseSpaceTools`]
  [91a5bcdd] Plots v0.28.2
  [92933f4c] ProgressMeter v1.2.0
  [d330b81b] PyPlot v2.8.2
  [1fd47b50] QuadGK v2.1.1
  [295af30f] Revise v2.3.2
  [276daf66] SpecialFunctions v0.8.0
  [fd094767] Suppressor v0.1.1
  [123dc426] SymEngine v0.7.0
  [24249f21] SymPy v1.0.8
  [c751599d] ToeplitzMatrices v0.6.0
  [b688e990] VortexDistributions v0.0.0 [`~/.julia/dev/VortexDistributions`]
  [44d3d7a6] Weave v0.9.1
  [0f1e0344] WebIO v0.8.11
  [c4c688b2] jlpkg v1.1.2
  [8ba89e20] Distributed 
  [2f01184e] SparseArrays 
  [8dfed614] Test 

julia> versioninfo()
Julia Version 1.3.0
Commit 46ce4d7933 (2019-11-26 06:09 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin19.0.0)
  CPU: Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.1 (ORCJIT, skylake)
Environment:
  JULIA_NUM_THREADS = 8
MikaelSlevinsky commented 4 years ago

Nothing seems strange with that to me...

If you run the libfasttransformstests.jl file line by line (section by section) can you narrow it down?

MikaelSlevinsky commented 4 years ago

As a backup, you can set the ENV["FT_BUILD_FROM_SOURCE"]=“true”, but this has to be set before every new ‘using’

AshtonSBradley commented 4 years ago

do you mean before I run line by line?

AshtonSBradley commented 4 years ago

ah, I see

AshtonSBradley commented 4 years ago

Ok, line by line everything runs fast and passes, provided I unroll the second type for loop for T in (Float64, Complex{Float64}).

In detail, this runs:

ENV["FT_BUILD_FROM_SOURCE"]="true"

using FastTransforms, LinearAlgebra, Test

FastTransforms.set_num_threads(ceil(Int, Base.Sys.CPU_THREADS/2))

n = 64

α, β, γ, δ, λ, μ = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6

#---
for T in (Float32, Float64, Complex{Float32}, Complex{Float64})
x = T(1) ./ (1:n)
Id = Matrix{T}(I, n, n)
for (p1, p2) in (
    (plan_leg2cheb(Id), plan_cheb2leg(Id)),
    (plan_ultra2ultra(Id, λ, μ), plan_ultra2ultra(Id, μ, λ)),
    (plan_jac2jac(Id, α, β, γ, δ), plan_jac2jac(Id, γ, δ, α, β)),
    (plan_lag2lag(Id, α, β), plan_lag2lag(Id, β, α)),
    (plan_jac2ultra(Id, α, β, λ), plan_ultra2jac(Id, λ, α, β)),
    (plan_jac2cheb(Id, α, β), plan_cheb2jac(Id, α, β)),
    (plan_ultra2cheb(Id, λ), plan_cheb2ultra(Id, λ)),
)
    y = p1 * x
    z = p2 * y
    @test z ≈ x
    y = p1 * x
    z = p1'y
    y = transpose(p1) * z
    z = transpose(p1) \ y
    y = p1' \ z
    z = p1 \ y
    @test z ≈ x
    y = p2 * x
    z = p2'y
    y = transpose(p2) * z
    z = transpose(p2) \ y
    y = p2' \ z
    z = p2 \ y
    @test z ≈ x
    P = p1 * Id
    Q = p2 * P
    @test Q ≈ Id
    P = p1 * Id
    Q = p1'P
    P = transpose(p1) * Q
    Q = transpose(p1) \ P
    P = p1' \ Q
    Q = p1 \ P
    @test Q ≈ Id
    P = p2 * Id
    Q = p2'P
    P = transpose(p2) * Q
    Q = transpose(p2) \ P
    P = p2' \ Q
    Q = p2 \ P
    @test Q ≈ Id
end
end

#---

for T in (BigFloat, Complex{BigFloat})
    x = T(1) ./ (1:n)
    Id = Matrix{T}(I, n, n)
    for (p1, p2) in (
        (plan_leg2cheb(Id), plan_cheb2leg(Id)),
        (plan_ultra2ultra(Id, λ, μ), plan_ultra2ultra(Id, μ, λ)),
        (plan_jac2jac(Id, α, β, γ, δ), plan_jac2jac(Id, γ, δ, α, β)),
        (plan_lag2lag(Id, α, β), plan_lag2lag(Id, β, α)),
        (plan_jac2ultra(Id, α, β, λ), plan_ultra2jac(Id, λ, α, β)),
        (plan_jac2cheb(Id, α, β), plan_cheb2jac(Id, α, β)),
        (plan_ultra2cheb(Id, λ), plan_cheb2ultra(Id, λ)),
    )
        y = p1 * x
        z = p2 * y
        @test z ≈ x
        y = p1 * x
        z = p1'y
        y = transpose(p1) * z
        z = transpose(p1) \ y
        y = p1' \ z
        z = p1 \ y
        @test z ≈ x
        y = p2 * x
        z = p2'y
        y = transpose(p2) * z
        z = transpose(p2) \ y
        y = p2' \ z
        z = p2 \ y
        @test z ≈ x
        P = p1 * Id
        Q = p2 * P
        @test_skip Q ≈ Id
        P = p1 * Id
        Q = p1'P
        P = transpose(p1) * Q
        Q = transpose(p1) \ P
        P = p1' \ Q
        Q = p1 \ P
        @test_skip Q ≈ Id
        P = p2 * Id
        Q = p2'P
        P = transpose(p2) * Q
        Q = transpose(p2) \ P
        P = p2' \ Q
        Q = p2 \ P
        @test_skip Q ≈ Id
    end
end

#---

# for T in (Float64, Complex{Float64})
T = Float64
    A = T <: Real ? sphones(T, n, 2n - 1) :
        sphones(T, n, 2n - 1) + im * sphones(T, n, 2n - 1)
    p = plan_sph2fourier(A)
    ps = plan_sph_synthesis(A)
    pa = plan_sph_analysis(A)
    B = copy(A)
    C = ps * (p * A)
    A = p \ (pa * C)
    @test A ≈ B

    A = T <: Real ? sphvones(T, n, 2n - 1) :
        sphvones(T, n, 2n - 1) + im * sphvones(T, n, 2n - 1)
    p = plan_sphv2fourier(A)
    ps = plan_sphv_synthesis(A)
    pa = plan_sphv_analysis(A)
    B = copy(A)
    C = ps * (p * A)
    A = p \ (pa * C)
    @test A ≈ B

    A = T <: Real ? diskones(T, n, 4n - 3) :
        diskones(T, n, 4n - 3) + im * diskones(T, n, 4n - 3)
    p = plan_disk2cxf(A)
    ps = plan_disk_synthesis(A)
    pa = plan_disk_analysis(A)
    B = copy(A)
    C = ps * (p * A)
    A = p \ (pa * C)
    @test A ≈ B

    A = T <: Real ? triones(T, n, n) : triones(T, n, n) + im * triones(T, n, n)
    p = plan_tri2cheb(A, α, β, γ)
    ps = plan_tri_synthesis(A)
    pa = plan_tri_analysis(A)
    B = copy(A)
    C = ps * (p * A)
    A = p \ (pa * C)
    @test A ≈ B

    A = T <: Real ? tetones(T, n, n, n) :
        tetones(T, n, n, n) + im * tetones(T, n, n, n)
    p = plan_tet2cheb(A, α, β, γ, δ)
    ps = plan_tet_synthesis(A)
    pa = plan_tet_analysis(A)
    B = copy(A)
    C = ps * (p * A)
    A = p \ (pa * C)
    @test A ≈ B
# end

#---
T =  Complex{Float64}
A = T <: Real ? sphones(T, n, 2n - 1) :
    sphones(T, n, 2n - 1) + im * sphones(T, n, 2n - 1)
p = plan_sph2fourier(A)
ps = plan_sph_synthesis(A)
pa = plan_sph_analysis(A)
B = copy(A)
C = ps * (p * A)
A = p \ (pa * C)
@test A ≈ B

#---
A = T <: Real ? sphvones(T, n, 2n - 1) :
    sphvones(T, n, 2n - 1) + im * sphvones(T, n, 2n - 1)
p = plan_sphv2fourier(A)
ps = plan_sphv_synthesis(A)
pa = plan_sphv_analysis(A)
B = copy(A)
C = ps * (p * A)
A = p \ (pa * C)
@test A ≈ B

#---
A = T <: Real ? diskones(T, n, 4n - 3) :
    diskones(T, n, 4n - 3) + im * diskones(T, n, 4n - 3)
p = plan_disk2cxf(A)
ps = plan_disk_synthesis(A)
pa = plan_disk_analysis(A)
B = copy(A)
C = ps * (p * A)
A = p \ (pa * C)
@test A ≈ B

#---
A = T <: Real ? triones(T, n, n) : triones(T, n, n) + im * triones(T, n, n)
p = plan_tri2cheb(A, α, β, γ)
ps = plan_tri_synthesis(A)
pa = plan_tri_analysis(A)
B = copy(A)
C = ps * (p * A)
A = p \ (pa * C)
@test A ≈ B

#---
A = T <: Real ? tetones(T, n, n, n) :
    tetones(T, n, n, n) + im * tetones(T, n, n, n)
p = plan_tet2cheb(A, α, β, γ, δ)
ps = plan_tet_synthesis(A)
pa = plan_tet_analysis(A)
B = copy(A)
C = ps * (p * A)
A = p \ (pa * C)
@test A ≈ B
# end

but if I leave that last loop, then it freezes

MikaelSlevinsky commented 4 years ago

Great, thanks for reporting this. I don’t know what’s going on, but it seems that all the ccall’s are ok (that would’ve been a much bigger problem). Perhaps it’s some kind of type inference bug in Julia itself?

Does it work when you use the Artifact, I.e. the default build? To re-trigger this, you’ll have to trick Julia into recompiling the package (and ensure that ENV[“FT_BUILD_FROM_SOURCE”]=“false” or is not set).

AshtonSBradley commented 4 years ago

maybe aliasing? There is something strangely non-reproducible going on though. Each time starting fresh julia session.

This seems to be an MWE on the final block:

Works:

ENV["FT_BUILD_FROM_SOURCE"]="true"

using FastTransforms, LinearAlgebra, Test

FastTransforms.set_num_threads(ceil(Int, Base.Sys.CPU_THREADS/2))

n = 64

α, β, γ, δ, λ, μ = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6

#---
for T in (Float64, Complex{Float64})
    A = T <: Real ? sphones(T, n, 2n - 1) :
        sphones(T, n, 2n - 1) + im * sphones(T, n, 2n - 1)
    p = plan_sph2fourier(A)
    ps = plan_sph_synthesis(A)
    pa = plan_sph_analysis(A)
    B = copy(A)
    C = ps * (p * A)
    A = p \ (pa * C)
    @test A ≈ B

    # A = T <: Real ? sphvones(T, n, 2n - 1) :
    #     sphvones(T, n, 2n - 1) + im * sphvones(T, n, 2n - 1)
    # p = plan_sphv2fourier(A)
    # ps = plan_sphv_synthesis(A)
    # pa = plan_sphv_analysis(A)
    # B = copy(A)
    # C = ps * (p * A)
    # A = p \ (pa * C)
    # @test A ≈ B

    # A = T <: Real ? diskones(T, n, 4n - 3) :
    #     diskones(T, n, 4n - 3) + im * diskones(T, n, 4n - 3)
    # p = plan_disk2cxf(A)
    # ps = plan_disk_synthesis(A)
    # pa = plan_disk_analysis(A)
    # B = copy(A)
    # C = ps * (p * A)
    # A = p \ (pa * C)
    # @test A ≈ B

    # A = T <: Real ? triones(T, n, n) : triones(T, n, n) + im * triones(T, n, n)
    # p = plan_tri2cheb(A, α, β, γ)
    # ps = plan_tri_synthesis(A)
    # pa = plan_tri_analysis(A)
    # B = copy(A)
    # C = ps * (p * A)
    # A = p \ (pa * C)
    # @test A ≈ B

    # A = T <: Real ? tetones(T, n, n, n) :
    #     tetones(T, n, n, n) + im * tetones(T, n, n, n)
    # p = plan_tet2cheb(A, α, β, γ, δ)
    # ps = plan_tet_synthesis(A)
    # pa = plan_tet_analysis(A)
    # B = copy(A)
    # C = ps * (p * A)
    # A = p \ (pa * C)
    # @test A ≈ B
end

Hangs:

ENV["FT_BUILD_FROM_SOURCE"]="true"

using FastTransforms, LinearAlgebra, Test

FastTransforms.set_num_threads(ceil(Int, Base.Sys.CPU_THREADS/2))

n = 64

α, β, γ, δ, λ, μ = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6

#---
for T in (Float64, Complex{Float64})
    A = T <: Real ? sphones(T, n, 2n - 1) :
        sphones(T, n, 2n - 1) + im * sphones(T, n, 2n - 1)
    p = plan_sph2fourier(A)
    ps = plan_sph_synthesis(A)
    pa = plan_sph_analysis(A)
    B = copy(A)
    C = ps * (p * A)
    A = p \ (pa * C)
    @test A ≈ B

    A = T <: Real ? sphvones(T, n, 2n - 1) :
        sphvones(T, n, 2n - 1) + im * sphvones(T, n, 2n - 1)
    p = plan_sphv2fourier(A)
    ps = plan_sphv_synthesis(A)
    pa = plan_sphv_analysis(A)
    B = copy(A)
    C = ps * (p * A)
    A = p \ (pa * C)
    @test A ≈ B

    A = T <: Real ? diskones(T, n, 4n - 3) :
        diskones(T, n, 4n - 3) + im * diskones(T, n, 4n - 3)
    p = plan_disk2cxf(A)
    ps = plan_disk_synthesis(A)
    pa = plan_disk_analysis(A)
    B = copy(A)
    C = ps * (p * A)
    A = p \ (pa * C)
    @test A ≈ B

    A = T <: Real ? triones(T, n, n) : triones(T, n, n) + im * triones(T, n, n)
    p = plan_tri2cheb(A, α, β, γ)
    ps = plan_tri_synthesis(A)
    pa = plan_tri_analysis(A)
    B = copy(A)
    C = ps * (p * A)
    A = p \ (pa * C)
    @test A ≈ B

    # A = T <: Real ? tetones(T, n, n, n) :
    #     tetones(T, n, n, n) + im * tetones(T, n, n, n)
    # p = plan_tet2cheb(A, α, β, γ, δ)
    # ps = plan_tet_synthesis(A)
    # pa = plan_tet_analysis(A)
    # B = copy(A)
    # C = ps * (p * A)
    # A = p \ (pa * C)
    # @test A ≈ B
end

Strangely, precisely how many of the intermediate blocks between 1 and 5 have to be un-commented to cause a freeze seems to vary from run to run. It could be as little as 1 and as many as 3

AshtonSBradley commented 4 years ago

ah, it seems to depend on when saving happens in Juno... maybe... I don't know. I feel like a ghost has entered the machine

MikaelSlevinsky commented 4 years ago

Does this version of the test set work for you? If so, I'll push to master.

@testset "libfasttransforms" begin
    n = 64
    α, β, γ, δ, λ, μ = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6
    function test_1d_plans(p1, p2, x; skip::Bool=false)
        y = p1*x
        z = p2*y
        @test z ≈ x
        y = p1*x
        z = p1'y
        y = transpose(p1)*z
        z = transpose(p1)\y
        y = p1'\z
        z = p1\y
        @test z ≈ x
        y = p2*x
        z = p2'y
        y = transpose(p2)*z
        z = transpose(p2)\y
        y = p2'\z
        z = p2\y
        @test z ≈ x
        P = p1*I
        Q = p2*P
        skip ? (@test_skip Q ≈ I) : (@test Q ≈ I)
        P = p1*I
        Q = p1'P
        P = transpose(p1)*Q
        Q = transpose(p1)\P
        P = p1'\Q
        Q = p1\P
        skip ? (@test_skip Q ≈ I) : (@test Q ≈ I)
        P = p2*I
        Q = p2'P
        P = transpose(p2)*Q
        Q = transpose(p2)\P
        P = p2'\Q
        Q = p2\P
        skip ? (@test_skip Q ≈ I) : (@test Q ≈ I)
    end
    for T in (Float32, Float64, Complex{Float32}, Complex{Float64})
        x = T(1)./(1:n)
        Id = Matrix{T}(I, n, n)
        for (p1, p2) in ((plan_leg2cheb(Id), plan_cheb2leg(Id)),
                          (plan_ultra2ultra(Id, λ, μ), plan_ultra2ultra(Id, μ, λ)),
                          (plan_jac2jac(Id, α, β, γ, δ), plan_jac2jac(Id, γ, δ, α, β)),
                          (plan_lag2lag(Id, α, β), plan_lag2lag(Id, β, α)),
                          (plan_jac2ultra(Id, α, β, λ), plan_ultra2jac(Id, λ, α, β)),
                          (plan_jac2cheb(Id, α, β), plan_cheb2jac(Id, α, β)),
                          (plan_ultra2cheb(Id, λ), plan_cheb2ultra(Id, λ)))
            test_1d_plans(p1, p2, x)
        end
    end
    for T in (BigFloat, Complex{BigFloat})
        x = T(1)./(1:n)
        Id = Matrix{T}(I, n, n)
        for (p1, p2) in ((plan_leg2cheb(Id), plan_cheb2leg(Id)),
                          (plan_ultra2ultra(Id, λ, μ), plan_ultra2ultra(Id, μ, λ)),
                          (plan_jac2jac(Id, α, β, γ, δ), plan_jac2jac(Id, γ, δ, α, β)),
                          (plan_lag2lag(Id, α, β), plan_lag2lag(Id, β, α)),
                          (plan_jac2ultra(Id, α, β, λ), plan_ultra2jac(Id, λ, α, β)),
                          (plan_jac2cheb(Id, α, β), plan_cheb2jac(Id, α, β)),
                          (plan_ultra2cheb(Id, λ), plan_cheb2ultra(Id, λ)))
            test_1d_plans(p1, p2, x; skip=true)
        end
    end
    function test_nd_plans(p, ps, pa, A)
        B = copy(A)
        C = ps*(p*A)
        A = p\(pa*C)
        @test A ≈ B
    end
    for A in (sphones(Float64, n, 2n-1), sphones(Float64, n, 2n-1) + im*sphones(Float64, n, 2n-1))
        p = plan_sph2fourier(A)
        ps = plan_sph_synthesis(A)
        pa = plan_sph_analysis(A)
        test_nd_plans(p, ps, pa, A)
    end
    for A in (sphvones(Float64, n, 2n-1), sphvones(Float64, n, 2n-1) + im*sphvones(Float64, n, 2n-1))
        p = plan_sphv2fourier(A)
        ps = plan_sphv_synthesis(A)
        pa = plan_sphv_analysis(A)
        test_nd_plans(p, ps, pa, A)
    end
    for A in (diskones(Float64, n, 4n-3), diskones(Float64, n, 4n-3) + im*diskones(Float64, n, 4n-3))
        p = plan_disk2cxf(A)
        ps = plan_disk_synthesis(A)
        pa = plan_disk_analysis(A)
        test_nd_plans(p, ps, pa, A)
    end
    for A in (triones(Float64, n, n), triones(Float64, n, n) + im*triones(Float64, n, n))
        p = plan_tri2cheb(A, α, β, γ)
        ps = plan_tri_synthesis(A)
        pa = plan_tri_analysis(A)
        test_nd_plans(p, ps, pa, A)
    end
    for A in (tetones(Float64, n, n, n), tetones(Float64, n, n, n) + im*tetones(Float64, n, n, n))
        p = plan_tet2cheb(A, α, β, γ, δ)
        ps = plan_tet_synthesis(A)
        pa = plan_tet_analysis(A)
        test_nd_plans(p, ps, pa, A)
    end
end
AshtonSBradley commented 4 years ago
Test Summary:     | Pass  Total
Special functions |   19     19
Test Summary:       | Pass  Total
Chebyshev transform |  250    250
Test Summary:                         | Pass  Total
Fejér and Clenshaw--Curtis quadrature |    9      9
libfasttransforms: Error During Test at /Users/abradley/.julia/packages/FastTransforms/OShrg/test/libfasttransformstests.jl:5
  Got exception outside of a @test
  MethodError: no method matching *(::FastTransforms.FTPlan{Float32,1,0}, ::UniformScaling{Bool})
  Closest candidates are:
    *(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:529
    *(!Matched::BitArray{2}, ::UniformScaling) at /Users/sabae/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.3/LinearAlgebra/src/uniformscaling.jl:195
    *(!Matched::UniformScaling, ::UniformScaling) at /Users/sabae/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.3/LinearAlgebra/src/uniformscaling.jl:194
    ...
  Stacktrace:
   [1] (::var"#test_1d_plans#21#23")(::Bool, ::var"#test_1d_plans#22"{var"#test_1d_plans#21#23"}, ::FastTransforms.FTPlan{Float32,1,0}, ::FastTransforms.FTPlan{Float32,1,1}, ::Array{Float32,1}) at /Users/abradley/.julia/packages/FastTransforms/OShrg/test/libfasttransformstests.jl:26
   [2] (::var"#test_1d_plans#22"{var"#test_1d_plans#21#23"})(::FastTransforms.FTPlan{Float32,1,0}, ::FastTransforms.FTPlan{Float32,1,1}, ::Array{Float32,1}) at /Users/abradley/.julia/packages/FastTransforms/OShrg/test/libfasttransformstests.jl:9
   [3] top-level scope at /Users/abradley/.julia/packages/FastTransforms/OShrg/test/libfasttransformstests.jl:56
   [4] top-level scope at /Users/sabae/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.3/Test/src/Test.jl:1107
   [5] top-level scope at /Users/abradley/.julia/packages/FastTransforms/OShrg/test/libfasttransformstests.jl:6
   [6] include at ./boot.jl:328 [inlined]
   [7] include_relative(::Module, ::String) at ./loading.jl:1105
   [8] include(::Module, ::String) at ./Base.jl:31
   [9] include(::String) at ./client.jl:424
   [10] top-level scope at /Users/abradley/.julia/packages/FastTransforms/OShrg/test/runtests.jl:10
   [11] include at ./boot.jl:328 [inlined]
   [12] include_relative(::Module, ::String) at ./loading.jl:1105
   [13] include(::Module, ::String) at ./Base.jl:31
   [14] include(::String) at ./client.jl:424
   [15] top-level scope at none:6
   [16] eval(::Module, ::Any) at ./boot.jl:330
   [17] exec_options(::Base.JLOptions) at ./client.jl:263
   [18] _start() at ./client.jl:460

Test Summary:     | Pass  Error  Total
libfasttransforms |    3      1      4
ERROR: LoadError: LoadError: Some tests did not pass: 3 passed, 0 failed, 1 errored, 0 broken.
in expression starting at /Users/abradley/.julia/packages/FastTransforms/OShrg/test/libfasttransformstests.jl:5
in expression starting at /Users/abradley/.julia/packages/FastTransforms/OShrg/test/runtests.jl:9
ERROR: Package FastTransforms errored during testing
MikaelSlevinsky commented 4 years ago

Ah, sorry, I recently added some better syntax to handle p*I for I::UniformScaling.

Try this instead

@testset "libfasttransforms" begin
    n = 64
    α, β, γ, δ, λ, μ = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6
    function test_1d_plans(p1, p2, x, Id; skip::Bool=false)
        y = p1*x
        z = p2*y
        @test z ≈ x
        y = p1*x
        z = p1'y
        y = transpose(p1)*z
        z = transpose(p1)\y
        y = p1'\z
        z = p1\y
        @test z ≈ x
        y = p2*x
        z = p2'y
        y = transpose(p2)*z
        z = transpose(p2)\y
        y = p2'\z
        z = p2\y
        @test z ≈ x
        P = p1*Id
        Q = p2*P
        skip ? (@test_skip Q ≈ Id) : (@test Q ≈ Id)
        P = p1*Id
        Q = p1'P
        P = transpose(p1)*Q
        Q = transpose(p1)\P
        P = p1'\Q
        Q = p1\P
        skip ? (@test_skip Q ≈ Id) : (@test Q ≈ Id)
        P = p2*Id
        Q = p2'P
        P = transpose(p2)*Q
        Q = transpose(p2)\P
        P = p2'\Q
        Q = p2\P
        skip ? (@test_skip Q ≈ Id) : (@test Q ≈ Id)
    end
    for T in (Float32, Float64, Complex{Float32}, Complex{Float64})
        x = T(1)./(1:n)
        Id = Matrix{T}(I, n, n)
        for (p1, p2) in ((plan_leg2cheb(Id), plan_cheb2leg(Id)),
                          (plan_ultra2ultra(Id, λ, μ), plan_ultra2ultra(Id, μ, λ)),
                          (plan_jac2jac(Id, α, β, γ, δ), plan_jac2jac(Id, γ, δ, α, β)),
                          (plan_lag2lag(Id, α, β), plan_lag2lag(Id, β, α)),
                          (plan_jac2ultra(Id, α, β, λ), plan_ultra2jac(Id, λ, α, β)),
                          (plan_jac2cheb(Id, α, β), plan_cheb2jac(Id, α, β)),
                          (plan_ultra2cheb(Id, λ), plan_cheb2ultra(Id, λ)))
            test_1d_plans(p1, p2, x, Id)
        end
    end
    for T in (BigFloat, Complex{BigFloat})
        x = T(1)./(1:n)
        Id = Matrix{T}(I, n, n)
        for (p1, p2) in ((plan_leg2cheb(Id), plan_cheb2leg(Id)),
                          (plan_ultra2ultra(Id, λ, μ), plan_ultra2ultra(Id, μ, λ)),
                          (plan_jac2jac(Id, α, β, γ, δ), plan_jac2jac(Id, γ, δ, α, β)),
                          (plan_lag2lag(Id, α, β), plan_lag2lag(Id, β, α)),
                          (plan_jac2ultra(Id, α, β, λ), plan_ultra2jac(Id, λ, α, β)),
                          (plan_jac2cheb(Id, α, β), plan_cheb2jac(Id, α, β)),
                          (plan_ultra2cheb(Id, λ), plan_cheb2ultra(Id, λ)))
            test_1d_plans(p1, p2, x, Id; skip=true)
        end
    end
    function test_nd_plans(p, ps, pa, A)
        B = copy(A)
        C = ps*(p*A)
        A = p\(pa*C)
        @test A ≈ B
    end
    for A in (sphones(Float64, n, 2n-1), sphones(Float64, n, 2n-1) + im*sphones(Float64, n, 2n-1))
        p = plan_sph2fourier(A)
        ps = plan_sph_synthesis(A)
        pa = plan_sph_analysis(A)
        test_nd_plans(p, ps, pa, A)
    end
    for A in (sphvones(Float64, n, 2n-1), sphvones(Float64, n, 2n-1) + im*sphvones(Float64, n, 2n-1))
        p = plan_sphv2fourier(A)
        ps = plan_sphv_synthesis(A)
        pa = plan_sphv_analysis(A)
        test_nd_plans(p, ps, pa, A)
    end
    for A in (diskones(Float64, n, 4n-3), diskones(Float64, n, 4n-3) + im*diskones(Float64, n, 4n-3))
        p = plan_disk2cxf(A)
        ps = plan_disk_synthesis(A)
        pa = plan_disk_analysis(A)
        test_nd_plans(p, ps, pa, A)
    end
    for A in (triones(Float64, n, n), triones(Float64, n, n) + im*triones(Float64, n, n))
        p = plan_tri2cheb(A, α, β, γ)
        ps = plan_tri_synthesis(A)
        pa = plan_tri_analysis(A)
        test_nd_plans(p, ps, pa, A)
    end
    for A in (tetones(Float64, n, n, n), tetones(Float64, n, n, n) + im*tetones(Float64, n, n, n))
        p = plan_tet2cheb(A, α, β, γ, δ)
        ps = plan_tet_synthesis(A)
        pa = plan_tet_analysis(A)
        test_nd_plans(p, ps, pa, A)
    end
end
AshtonSBradley commented 4 years ago

same problem, frozen at the same place:

Test Summary:     | Pass  Total
Special functions |   19     19
Test Summary:       | Pass  Total
Chebyshev transform |  250    250
Test Summary:                         | Pass  Total
Fejér and Clenshaw--Curtis quadrature |    9      9
MikaelSlevinsky commented 4 years ago

Just to isolate whether it's to do with the typing of the arrays (A = sphones(Float64, n, 2n-1) vs. the complex case) or if it has to do with threading, what happens when you set FastTransforms.set_num_threads(1)?

AshtonSBradley commented 4 years ago

that doesn't fix it

MikaelSlevinsky commented 4 years ago

That’s good.

So what if all the ‘for A in ...’ loops are unrolled?

Cheers,

Mikael

On Dec 5, 2019, at 11:19 PM, Ashton Bradley notifications@github.com wrote:



that doesn't fix it

— You are receiving this because you commented. Reply to this email directly, view it on GitHubhttps://github.com/JuliaApproximation/FastTransforms.jl/issues/95?email_source=notifications&email_token=AB6MDJMDS4YFHDBSUST22CDQXGD6RA5CNFSM4JVS657KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEGCPODI#issuecomment-562362125, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AB6MDJLEZXE7GTMI536ENP3QXGD6RANCNFSM4JVS657A.

AshtonSBradley commented 4 years ago

that worked in the original form

AshtonSBradley commented 4 years ago

just checking this... it doesn't seem to be fixed @MikaelSlevinsky

MikaelSlevinsky commented 4 years ago

Any chance v0.9.2 fixes this? (Probably not, but thought I’d ask just in case)

AshtonSBradley commented 4 years ago

doesn't seem to have fixed it