update AutFN.jl to latest changes in PropertyT
This commit is contained in:
parent
05e9355c12
commit
4f37db5bde
99
AutFN.jl
99
AutFN.jl
@ -1,5 +1,10 @@
|
|||||||
|
using ArgParse
|
||||||
|
|
||||||
using Groups
|
using Groups
|
||||||
using ProgressMeter
|
using GroupAlgebras
|
||||||
|
using PropertyT
|
||||||
|
|
||||||
|
import SCS.SCSSolver
|
||||||
|
|
||||||
#=
|
#=
|
||||||
Note that the element
|
Note that the element
|
||||||
@ -25,7 +30,7 @@ function generating_set_of_AutF(N::Int)
|
|||||||
S = vcat(ϱs,λs)
|
S = vcat(ϱs,λs)
|
||||||
S = vcat(S..., σs..., ɛs)
|
S = vcat(S..., σs..., ɛs)
|
||||||
S = vcat(S..., [inv(g) for g in S])
|
S = vcat(S..., [inv(g) for g in S])
|
||||||
return Vector{AutWord}(unique(S))
|
return Vector{AutWord}(unique(S)), one(AutWord)
|
||||||
end
|
end
|
||||||
|
|
||||||
function generating_set_of_OutF(N::Int)
|
function generating_set_of_OutF(N::Int)
|
||||||
@ -37,7 +42,8 @@ function generating_set_of_OutF(N::Int)
|
|||||||
S = ϱs
|
S = ϱs
|
||||||
push!(S, λs..., ɛs...)
|
push!(S, λs..., ɛs...)
|
||||||
push!(S,[inv(g) for g in S]...)
|
push!(S,[inv(g) for g in S]...)
|
||||||
return Vector{AutWord}(unique(S))
|
|
||||||
|
return Vector{AutWord}(unique(S)), one(AutWord)
|
||||||
end
|
end
|
||||||
|
|
||||||
function generating_set_of_Sym(N::Int)
|
function generating_set_of_Sym(N::Int)
|
||||||
@ -45,7 +51,7 @@ function generating_set_of_Sym(N::Int)
|
|||||||
|
|
||||||
S = σs
|
S = σs
|
||||||
push!(S, [inv(s) for s in S]...)
|
push!(S, [inv(s) for s in S]...)
|
||||||
return Vector{AutWord}(unique(S))
|
return Vector{AutWord}(unique(S)), one(AutWord)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -53,7 +59,6 @@ function products(S1::Vector{AutWord}, S2::Vector{AutWord})
|
|||||||
result = Vector{AutWord}()
|
result = Vector{AutWord}()
|
||||||
seen = Set{Vector{FGWord}}()
|
seen = Set{Vector{FGWord}}()
|
||||||
n = length(S1)
|
n = length(S1)
|
||||||
p = Progress(n, 1, "Computing complete products...", 50)
|
|
||||||
for (i,x) in enumerate(S1)
|
for (i,x) in enumerate(S1)
|
||||||
for y in S2
|
for y in S2
|
||||||
z::AutWord = x*y
|
z::AutWord = x*y
|
||||||
@ -63,7 +68,6 @@ function products(S1::Vector{AutWord}, S2::Vector{AutWord})
|
|||||||
push!(result, z)
|
push!(result, z)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
next!(p)
|
|
||||||
end
|
end
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
@ -72,8 +76,6 @@ function products_images(S1::Vector{AutWord}, S2::Vector{AutWord})
|
|||||||
result = Vector{Vector{FGWord}}()
|
result = Vector{Vector{FGWord}}()
|
||||||
seen = Set{Vector{FGWord}}()
|
seen = Set{Vector{FGWord}}()
|
||||||
n = length(S1)
|
n = length(S1)
|
||||||
|
|
||||||
p = Progress(n, 1, "Computing images of elts in B₄...", 50)
|
|
||||||
for (i,x) in enumerate(S1)
|
for (i,x) in enumerate(S1)
|
||||||
z = x(domain)
|
z = x(domain)
|
||||||
for y in S2
|
for y in S2
|
||||||
@ -83,7 +85,6 @@ function products_images(S1::Vector{AutWord}, S2::Vector{AutWord})
|
|||||||
push!(result, v)
|
push!(result, v)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
next!(p)
|
|
||||||
end
|
end
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
@ -108,11 +109,9 @@ function create_product_matrix(basis::Vector{AutWord}, images)
|
|||||||
@time images_dict = Dict{Vector{FGWord}, Int}(x => i
|
@time images_dict = Dict{Vector{FGWord}, Int}(x => i
|
||||||
for (i,x) in enumerate(images))
|
for (i,x) in enumerate(images))
|
||||||
|
|
||||||
p = Progress(n, 1, "Computing product matrix in basis...", 50)
|
|
||||||
for i in 1:n
|
for i in 1:n
|
||||||
z = (inv(basis[i]))(domain)
|
z = (inv(basis[i]))(domain)
|
||||||
product_matrix[i,:] = hashed_product(z, basis, images_dict)
|
product_matrix[i,:] = hashed_product(z, basis, images_dict)
|
||||||
next!(p)
|
|
||||||
end
|
end
|
||||||
return product_matrix
|
return product_matrix
|
||||||
end
|
end
|
||||||
@ -141,7 +140,7 @@ function ΔandSDPconstraints(identity::AutWord, S::Vector{AutWord})
|
|||||||
# @assert length(B₄_images) == 3425657
|
# @assert length(B₄_images) == 3425657
|
||||||
|
|
||||||
println("Creating product matrix...")
|
println("Creating product matrix...")
|
||||||
@time pm = PropertyT.create_product_matrix(B₂, B₄_images)
|
@time pm = create_product_matrix(B₂, B₄_images)
|
||||||
println("Creating sdp_constratints...")
|
println("Creating sdp_constratints...")
|
||||||
@time sdp_constraints = PropertyT.constraints_from_pm(pm)
|
@time sdp_constraints = PropertyT.constraints_from_pm(pm)
|
||||||
|
|
||||||
@ -151,16 +150,52 @@ function ΔandSDPconstraints(identity::AutWord, S::Vector{AutWord})
|
|||||||
return Δ, sdp_constraints
|
return Δ, sdp_constraints
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
using GroupAlgebras
|
|
||||||
using PropertyT
|
|
||||||
|
|
||||||
const symbols = [FGSymbol("x₁",1), FGSymbol("x₂",1), FGSymbol("x₃",1), FGSymbol("x₄",1), FGSymbol("x₅",1), FGSymbol("x₆",1)]
|
const symbols = [FGSymbol("x₁",1), FGSymbol("x₂",1), FGSymbol("x₃",1), FGSymbol("x₄",1), FGSymbol("x₅",1), FGSymbol("x₆",1)]
|
||||||
|
|
||||||
const TOL=1e-8
|
const TOL=1e-8
|
||||||
const N = 4
|
const N = 4
|
||||||
const domain = Vector{FGWord}(symbols[1:N])
|
const domain = Vector{FGWord}(symbols[1:N])
|
||||||
const ID = one(AutWord)
|
|
||||||
|
function cpuinfo_physicalcores()
|
||||||
|
maxcore = -1
|
||||||
|
for line in eachline("/proc/cpuinfo")
|
||||||
|
if startswith(line, "core id")
|
||||||
|
maxcore = max(maxcore, parse(Int, split(line, ':')[2]))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
maxcore < 0 && error("failure to read core ids from /proc/cpuinfo")
|
||||||
|
return maxcore + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
function parse_commandline()
|
||||||
|
s = ArgParseSettings()
|
||||||
|
|
||||||
|
@add_arg_table s begin
|
||||||
|
"--tol"
|
||||||
|
help = "set numerical tolerance for the SDP solver (default: 1e-5)"
|
||||||
|
arg_type = Float64
|
||||||
|
default = 1e-5
|
||||||
|
"--iterations"
|
||||||
|
help = "set maximal number of iterations for the SDP solver (default: 20000)"
|
||||||
|
arg_type = Int
|
||||||
|
default = 20000
|
||||||
|
"--upper-bound"
|
||||||
|
help = "Set an upper bound for the spectral gap (default: Inf)"
|
||||||
|
arg_type = Float64
|
||||||
|
default = Inf
|
||||||
|
"--cpus"
|
||||||
|
help = "Set number of cpus used by solver (default: auto)"
|
||||||
|
arg_type = Int
|
||||||
|
required = false
|
||||||
|
"-N"
|
||||||
|
help = "Consider automorphisms of free group on N generators (default: N=3)"
|
||||||
|
arg_type = Int
|
||||||
|
default = 3
|
||||||
|
end
|
||||||
|
|
||||||
|
return parse_args(s)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
# const name = "SYM$N"
|
# const name = "SYM$N"
|
||||||
# const upper_bound=factorial(N)-TOL^(1/5)
|
# const upper_bound=factorial(N)-TOL^(1/5)
|
||||||
@ -169,9 +204,29 @@ const ID = one(AutWord)
|
|||||||
# name = "AutF$N"
|
# name = "AutF$N"
|
||||||
# S() = generating_set_of_AutF(N)
|
# S() = generating_set_of_AutF(N)
|
||||||
|
|
||||||
name = "OutF$N"
|
function main()
|
||||||
S() = generating_set_of_OutF(N)
|
parsed_args = parse_commandline()
|
||||||
const upper_bound=0.05
|
|
||||||
|
|
||||||
BLAS.set_num_threads(4)
|
tol = parsed_args["tol"]
|
||||||
@time check_property_T(name, ID, S; verbose=true, tol=TOL, upper_bound=upper_bound)
|
iterations = parsed_args["iterations"]
|
||||||
|
|
||||||
|
solver = SCSSolver(eps=tol, max_iters=iterations, verbose=true, linearsolver=SCS.Indirect)
|
||||||
|
|
||||||
|
N = parsed_args["N"]
|
||||||
|
upper_bound = parsed_args["upper-bound"]
|
||||||
|
|
||||||
|
name = "OutF$N"
|
||||||
|
name = name*"-$(string(upper_bound))"
|
||||||
|
S() = generating_set_of_OutF(N)
|
||||||
|
|
||||||
|
if parsed_args["cpus"] ≠ nothing
|
||||||
|
if parsed_args["cpus"] > cpuinfo_physicalcores()
|
||||||
|
warn("Number of specified cores exceeds the physical core cound. Performance will suffer.")
|
||||||
|
end
|
||||||
|
Blas.set_num_threads(parsed_args["cpus"])
|
||||||
|
end
|
||||||
|
@time PropertyT.check_property_T(name, S, solver, upper_bound, tol)
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
|
main()
|
||||||
|
Loading…
Reference in New Issue
Block a user