1
0
mirror of https://github.com/kalmarek/PropertyT.jl.git synced 2024-11-22 16:05:27 +01:00

update tests and test spectral_gap directly

This commit is contained in:
kalmarek 2019-07-01 01:38:30 +02:00
parent cc9d3db846
commit 75e997b2e8
No known key found for this signature in database
GPG Key ID: 8BF1A3855328FC15
5 changed files with 125 additions and 98 deletions

View File

@ -2,38 +2,50 @@
@testset "SL(2,Z)" begin @testset "SL(2,Z)" begin
N = 2 N = 2
G = MatrixSpace(Nemo.ZZ, N,N) G = MatrixAlgebra(zz, N)
S = Groups.gens(G) S = PropertyT.generating_set(G)
S = [S; inv.(S)]
rm("SL($N,Z)", recursive=true, force=true) rm("SL($N,Z)", recursive=true, force=true)
sett = PropertyT.Settings("SL($N,Z)", G, S, solver(20000, accel=20); upper_bound=0.1) sett = PropertyT.Settings("SL($N,Z)", G, S, with_SCS(20000, accel=20); upper_bound=0.1)
@test PropertyT.check_property_T(sett) == false PropertyT.print_summary(sett)
λ = PropertyT.spectral_gap(sett)
@test λ < 0.0
@test PropertyT.interpret_results(sett, λ) == false
end end
@testset "SL(3,Z)" begin @testset "SL(3,Z)" begin
N = 3 N = 3
G = MatrixSpace(Nemo.ZZ, N,N) G = MatrixAlgebra(zz, N)
S = Groups.gens(G) S = PropertyT.generating_set(G)
S = [S; inv.(S)]
rm("SL($N,Z)", recursive=true, force=true) rm("SL($N,Z)", recursive=true, force=true)
sett = PropertyT.Settings("SL($N,Z)", G, S, solver(1000, accel=20); upper_bound=0.1) sett = PropertyT.Settings("SL($N,Z)", G, S, with_SCS(1000, accel=20); upper_bound=0.1)
@test PropertyT.check_property_T(sett) == true PropertyT.print_summary(sett)
λ = PropertyT.spectral_gap(sett)
@test λ > 0.0999
@test PropertyT.interpret_results(sett, λ) == true
@test PropertyT.check_property_T(sett) == true #second run should be fast
end end
@testset "SAut(F₂)" begin @testset "SAut(F₂)" begin
N = 2 N = 2
G = SAut(FreeGroup(N)) G = SAut(FreeGroup(N))
S = Groups.gens(G) S = PropertyT.generating_set(G)
S = [S; inv.(S)]
rm("SAut(F$N)", recursive=true, force=true) rm("SAut(F$N)", recursive=true, force=true)
sett = PropertyT.Settings("SAut(F$N)", G, S, solver(20000); sett = PropertyT.Settings("SAut(F$N)", G, S, with_SCS(10000);
upper_bound=0.15, warmstart=false) upper_bound=0.15, warmstart=false)
@test PropertyT.check_property_T(sett) == false PropertyT.print_summary(sett)
λ = PropertyT.spectral_gap(sett)
@test λ < 0.0
@test PropertyT.interpret_results(sett, λ) == false
end end
end end

View File

@ -2,58 +2,85 @@
@testset "oSL(3,Z)" begin @testset "oSL(3,Z)" begin
N = 3 N = 3
G = MatrixSpace(Nemo.ZZ, N,N) G = MatrixAlgebra(zz, N)
S = Groups.gens(G) S = PropertyT.generating_set(G)
S = [S; inv.(S)]
autS = WreathProduct(PermGroup(2), PermGroup(N)) autS = WreathProduct(PermGroup(2), PermGroup(N))
rm("oSL($N,Z)", recursive=true, force=true) rm("oSL($N,Z)", recursive=true, force=true)
sett = PropertyT.Settings("SL($N,Z)", G, S, autS, solver(2000, accel=20); sett = PropertyT.Settings("SL($N,Z)", G, S, autS, with_SCS(2000, accel=20);
upper_bound=0.27, warmstart=false) upper_bound=0.27, warmstart=false)
@test PropertyT.check_property_T(sett) == false PropertyT.print_summary(sett)
#second run just checks the solution
λ = PropertyT.spectral_gap(sett)
@test λ < 0.0
@test PropertyT.interpret_results(sett, λ) == false
# second run just checks the solution due to warmstart=false above
@test λ == PropertyT.spectral_gap(sett)
@test PropertyT.check_property_T(sett) == false @test PropertyT.check_property_T(sett) == false
sett = PropertyT.Settings("SL($N,Z)", G, S, autS, solver(2000, accel=20); sett = PropertyT.Settings("SL($N,Z)", G, S, autS, with_SCS(2000, accel=20);
upper_bound=0.27, warmstart=true) upper_bound=0.27, warmstart=true)
PropertyT.print_summary(sett)
λ = PropertyT.spectral_gap(sett)
@test λ > 0.269999
@test PropertyT.interpret_results(sett, λ) == true
# this should be very fast due to warmstarting:
@test λ PropertyT.spectral_gap(sett) atol=1e-5
@test PropertyT.check_property_T(sett) == true @test PropertyT.check_property_T(sett) == true
end end
@testset "oSL(4,Z)" begin @testset "oSL(4,Z)" begin
N = 4 N = 4
G = MatrixSpace(Nemo.ZZ, N,N) G = MatrixAlgebra(zz, N)
S = Groups.gens(G) S = PropertyT.generating_set(G)
S = [S; inv.(S)]
autS = WreathProduct(PermGroup(2), PermGroup(N)) autS = WreathProduct(PermGroup(2), PermGroup(N))
rm("oSL($N,Z)", recursive=true, force=true) rm("oSL($N,Z)", recursive=true, force=true)
sett = PropertyT.Settings("SL($N,Z)", G, S, autS, solver(2000, accel=20); sett = PropertyT.Settings("SL($N,Z)", G, S, autS, with_SCS(2000, accel=20);
upper_bound=1.3, warmstart=false) upper_bound=1.3, warmstart=false)
@test PropertyT.check_property_T(sett) == false PropertyT.print_summary(sett)
#second run just checks the obtained solution
λ = PropertyT.spectral_gap(sett)
@test λ < 0.0
@test PropertyT.interpret_results(sett, λ) == false
# second run just checks the solution due to warmstart=false above
@test λ == PropertyT.spectral_gap(sett)
@test PropertyT.check_property_T(sett) == false @test PropertyT.check_property_T(sett) == false
sett = PropertyT.Settings("SL($N,Z)", G, S, autS, solver(5000, accel=20); sett = PropertyT.Settings("SL($N,Z)", G, S, autS, with_SCS(5000, accel=20);
upper_bound=1.3, warmstart=true) upper_bound=1.3, warmstart=true)
PropertyT.print_summary(sett)
λ = PropertyT.spectral_gap(sett)
@test λ > 1.2999
@test PropertyT.interpret_results(sett, λ) == true
# this should be very fast due to warmstarting:
@test λ PropertyT.spectral_gap(sett) atol=1e-5
@test PropertyT.check_property_T(sett) == true @test PropertyT.check_property_T(sett) == true
end end
@testset "SAut(F₃)" begin @testset "SAut(F₃)" begin
N = 3 N = 3
G = SAut(FreeGroup(N)) G = SAut(FreeGroup(N))
S = Groups.gens(G) S = PropertyT.generating_set(G)
S = [S; inv.(S)]
autS = WreathProduct(PermGroup(2), PermGroup(N)) autS = WreathProduct(PermGroup(2), PermGroup(N))
rm("oSAut(F$N)", recursive=true, force=true) rm("oSAut(F$N)", recursive=true, force=true)
sett = PropertyT.Settings("SAut(F$N)", G, S, autS, solver(5000); sett = PropertyT.Settings("SAut(F$N)", G, S, autS, with_SCS(1000);
upper_bound=0.15, warmstart=false) upper_bound=0.15, warmstart=false)
PropertyT.print_summary(sett)
@test PropertyT.check_property_T(sett) == false @test PropertyT.check_property_T(sett) == false
end end
end end

View File

@ -7,26 +7,25 @@
@testset "unit tests" begin @testset "unit tests" begin
for N in [3,4] for N in [3,4]
M = MatrixSpace(Nemo.ZZ, N,N) M = MatrixAlgebra(zz, N)
A = SAut(FreeGroup(N))
@test length(PropertyT.generating_set(M)) == 2N*(N-1) @test PropertyT.E(M, 1, 2) isa MatAlgElem
e12 = PropertyT.E(M, 1, 2)
@test e12[1,2] == 1
@test inv(e12)[1,2] == -1
S = PropertyT.generating_set(M) S = PropertyT.generating_set(M)
@test e12 S
@test length(PropertyT.generating_set(M)) == 2N*(N-1)
@test all(inv(s) S for s in S) @test all(inv(s) S for s in S)
A = SAut(FreeGroup(N))
@test length(PropertyT.generating_set(A)) == 4N*(N-1) @test length(PropertyT.generating_set(A)) == 4N*(N-1)
S = PropertyT.generating_set(A) S = PropertyT.generating_set(A)
@test all(inv(s) S for s in S) @test all(inv(s) S for s in S)
end end
N = 4
M = MatrixSpace(Nemo.ZZ, N,N)
S = PropertyT.generating_set(M)
@test PropertyT.E(M, 1, 2) isa MatElem
e12 = PropertyT.E(M, 1, 2)
@test e12[1,2] == 1
@test inv(e12)[1,2] == -1
@test e12 S
@test PropertyT.isopposite(perm"(1,2,3)(4)", perm"(1,4,2)") @test PropertyT.isopposite(perm"(1,2,3)(4)", perm"(1,4,2)")
@test PropertyT.isadjacent(perm"(1,2,3)", perm"(1,2)(3)") @test PropertyT.isadjacent(perm"(1,2,3)", perm"(1,2)(3)")
@ -40,7 +39,7 @@
@testset "Sq, Adj, Op" begin @testset "Sq, Adj, Op" begin
N = 4 N = 4
M = MatrixSpace(Nemo.ZZ, N,N) M = MatrixAlgebra(zz, N)
S = PropertyT.generating_set(M) S = PropertyT.generating_set(M)
Δ = PropertyT.Laplacian(S, 2) Δ = PropertyT.Laplacian(S, 2)
RG = parent(Δ) RG = parent(Δ)
@ -94,24 +93,17 @@ end
@testset "1812.03456 examples" begin @testset "1812.03456 examples" begin
with_SCS = with_optimizer(SCS.Optimizer,
linear_solver=SCS.Direct,
eps=2e-10,
max_iters=20000,
alpha=1.5,
acceleration_lookback=10,
warm_start=true)
function SOS_residual(x::GroupRingElem, Q::Matrix) function SOS_residual(x::GroupRingElem, Q::Matrix)
RG = parent(x) RG = parent(x)
@time sos = PropertyT.compute_SOS(RG, Q); @time sos = PropertyT.compute_SOS(RG, Q);
return x - sos return x - sos
end end
function check_positivity(elt, Δ, orbit_data, upper_bound, warm=nothing; with_solver=with_SCS) function check_positivity(elt, Δ, orbit_data, upper_bound, warm=nothing; with_solver=with_SCS(20_000, accel=10))
SDP_problem, varP = PropertyT.SOS_problem(elt, Δ, orbit_data; upper_bound=upper_bound) SDP_problem, varP = PropertyT.SOS_problem(elt, Δ, orbit_data; upper_bound=upper_bound)
status, warm = PropertyT.solve(SDP_problem, with_solver, warm); status, warm = PropertyT.solve(SDP_problem, with_solver, warm);
Base.Libc.flush_cstdio()
@info "Optimization status:" status @info "Optimization status:" status
λ = value(SDP_problem[]) λ = value(SDP_problem[])
@ -127,7 +119,7 @@ end
@testset "SL(3,Z)" begin @testset "SL(3,Z)" begin
N = 3 N = 3
halfradius = 2 halfradius = 2
M = MatrixSpace(Nemo.ZZ, N,N) M = MatrixAlgebra(zz, N)
S = PropertyT.generating_set(M) S = PropertyT.generating_set(M)
Δ = PropertyT.Laplacian(S, halfradius) Δ = PropertyT.Laplacian(S, halfradius)
RG = parent(Δ) RG = parent(Δ)
@ -139,6 +131,7 @@ end
UB = 0.05 # 0.105? UB = 0.05 # 0.105?
residual, λ, _ = check_positivity(elt, Δ, orbit_data, UB) residual, λ, _ = check_positivity(elt, Δ, orbit_data, UB)
Base.Libc.flush_cstdio()
@info "obtained λ and residual" λ norm(residual, 1) @info "obtained λ and residual" λ norm(residual, 1)
@test 2^2*norm(residual, 1) < λ # i.e. we can certify positivity @test 2^2*norm(residual, 1) < λ # i.e. we can certify positivity
@ -151,6 +144,7 @@ end
UB = 0.1 # 0.157? UB = 0.1 # 0.157?
residual, λ, _ = check_positivity(elt, Δ, orbit_data, UB) residual, λ, _ = check_positivity(elt, Δ, orbit_data, UB)
Base.Libc.flush_cstdio()
@info "obtained λ and residual" λ norm(residual, 1) @info "obtained λ and residual" λ norm(residual, 1)
@test 2^2*norm(residual, 1) < λ @test 2^2*norm(residual, 1) < λ
@ -162,6 +156,7 @@ end
UB = Inf UB = Inf
residual, λ, _ = check_positivity(elt, Δ, orbit_data, UB) residual, λ, _ = check_positivity(elt, Δ, orbit_data, UB)
Base.Libc.flush_cstdio()
@info "obtained λ and residual" λ norm(residual, 1) @info "obtained λ and residual" λ norm(residual, 1)
@test 2^2*norm(residual, 1) > λ @test 2^2*norm(residual, 1) > λ
@ -171,7 +166,7 @@ end
@testset "SL(4,Z)" begin @testset "SL(4,Z)" begin
N = 4 N = 4
halfradius = 2 halfradius = 2
M = MatrixSpace(Nemo.ZZ, N,N) M = MatrixAlgebra(zz, N)
S = PropertyT.generating_set(M) S = PropertyT.generating_set(M)
Δ = PropertyT.Laplacian(S, halfradius) Δ = PropertyT.Laplacian(S, halfradius)
RG = parent(Δ) RG = parent(Δ)
@ -183,6 +178,7 @@ end
UB = 0.2 # 0.3172 UB = 0.2 # 0.3172
residual, λ, _ = check_positivity(elt, Δ, orbit_data, UB) residual, λ, _ = check_positivity(elt, Δ, orbit_data, UB)
Base.Libc.flush_cstdio()
@info "obtained λ and residual" λ norm(residual, 1) @info "obtained λ and residual" λ norm(residual, 1)
@test 2^2*norm(residual, 1) < λ # i.e. we can certify positivity @test 2^2*norm(residual, 1) < λ # i.e. we can certify positivity
@ -204,7 +200,9 @@ end
elt = PropertyT.Op(RG) elt = PropertyT.Op(RG)
UB = 2.0 UB = 2.0
residual, λ, _ = check_positivity(elt, Δ, orbit_data, UB) residual, λ, _ = check_positivity(elt, Δ, orbit_data, UB,
with_solver=with_SCS(20_000, accel=10, eps=2e-10))
Base.Libc.flush_cstdio()
@info "obtained λ and residual" λ norm(residual, 1) @info "obtained λ and residual" λ norm(residual, 1)
@test 2^2*norm(residual, 1) > λ # i.e. we can certify positivity @test 2^2*norm(residual, 1) > λ # i.e. we can certify positivity
@ -215,6 +213,7 @@ end
UB = 0.6 # 0.82005 UB = 0.6 # 0.82005
residual, λ, _ = check_positivity(elt, Δ, orbit_data, UB) residual, λ, _ = check_positivity(elt, Δ, orbit_data, UB)
Base.Libc.flush_cstdio()
@info "obtained λ and residual" λ norm(residual, 1) @info "obtained λ and residual" λ norm(residual, 1)
@test 2^2*norm(residual, 1) < λ # i.e. we can certify positivity @test 2^2*norm(residual, 1) < λ # i.e. we can certify positivity

View File

@ -1,5 +1,3 @@
using PropertyT.GroupRings
@testset "Correctness of HPC SOS computation" begin @testset "Correctness of HPC SOS computation" begin
function prepare(G_name, λ, S_size) function prepare(G_name, λ, S_size)

View File

@ -1,24 +1,15 @@
using AbstractAlgebra, Nemo, Groups, SCS
using SparseArrays
using JLD
using PropertyT
using Test using Test
using JuMP using LinearAlgebra, SparseArrays
using AbstractAlgebra, Groups, GroupRings
using PropertyT
using JLD
indexing(n) = [(i,j) for i in 1:n for j in (i+1):n] using JuMP, SCS
function Groups.gens(M::MatSpace)
@assert ncols(M) == nrows(M)
N = ncols(M)
E(i,j) = begin g = M(1); g[i,j] = 1; g end
S = [E(i,j) for (i,j) in indexing(N)]
S = [S; transpose.(S)]
return S
end
solver(iters; accel=1) = with_SCS(iters; accel=1, eps=1e-10) =
with_optimizer(SCS.Optimizer, with_optimizer(SCS.Optimizer,
linear_solver=SCS.Direct, max_iters=iters, linear_solver=SCS.Direct, max_iters=iters,
acceleration_lookback=accel, eps=1e-10, warm_start=true) acceleration_lookback=accel, eps=eps, warm_start=true)
include("1703.09680.jl") include("1703.09680.jl")
include("1712.07167.jl") include("1712.07167.jl")