update AutFN.jl to latest changes in PropertyT

This commit is contained in:
kalmar 2017-03-27 22:43:58 +02:00
parent 05e9355c12
commit 4f37db5bde

View File

@ -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()