diff --git a/src/1712.07167.jl b/src/1712.07167.jl index c20b62a..222ba46 100644 --- a/src/1712.07167.jl +++ b/src/1712.07167.jl @@ -84,13 +84,13 @@ end function computeλandP(sett::Naive, Δ::GroupRingElem; solverlog=tempname()*".log") - @info("Creating SDP problem...") + @info "Creating SDP problem..." SDP_problem = SOS_problem(Δ^2, Δ, upper_bound=sett.upper_bound) @info(Base.repr(SDP_problem)) ws = warmstart(sett) @time status, ws = PropertyT.solve(solverlog, SDP_problem, sett.solver, ws) - @info("Solver's status: $status") + @info "Optimization has finished:" status P = value.(SDP_problem[:P]) λ = value(SDP_problem[:λ]) @@ -112,14 +112,13 @@ function computeλandP(sett::Symmetrized, Δ::GroupRingElem; orbit_data = load(filename(sett, :OrbitData), "OrbitData") orbit_data = decimate(orbit_data) - @info("Creating SDP problem...") + @info "Creating SDP problem..." SDP_problem, varP = SOS_problem(Δ^2, Δ, orbit_data, upper_bound=sett.upper_bound) @info(Base.repr(SDP_problem)) ws = warmstart(sett) @time status, ws = PropertyT.solve(solverlog, SDP_problem, sett.solver, ws) - @info("Solver's status: $status") - + @info "Optimization has finished:" status λ = value(SDP_problem[:λ]) Ps = [value.(P) for P in varP] @@ -127,7 +126,7 @@ function computeλandP(sett::Symmetrized, Δ::GroupRingElem; save(filename(sett, :warmstart), "warmstart", (ws.primal, ws.dual, ws.slack), "Ps", Ps, "λ", λ) - @info("Reconstructing P...") + @info "Reconstructing P..." @time P = reconstruct(Ps, orbit_data) return λ, P @@ -141,10 +140,7 @@ end function distance_to_positive_cone(Δ::GroupRingElem, λ, Q; R::Int=2) separator = "-"^76 - info_strs = [separator, - "Checking in floating-point arithmetic...", - "λ = $λ"] - @info(join(info_strs, "\n")) + @info "$separator\nChecking in floating-point arithmetic..." λ eoi = Δ^2-λ*Δ @info("Computing sum of squares decomposition...") @@ -153,12 +149,11 @@ function distance_to_positive_cone(Δ::GroupRingElem, λ, Q; R::Int=2) L1_norm = norm(residual,1) distance = λ - 2.0^(2ceil(log2(R)))*L1_norm - info_strs = ["Numerical metrics:", - "ɛ(Δ² - λΔ - ∑ξᵢ*ξᵢ) ≈ $(@sprintf("%.10f", aug(residual)))", - "‖Δ² - λΔ - ∑ξᵢ*ξᵢ‖₁ ≈ $(@sprintf("%.10f", L1_norm))", - "Floating point distance (to positive cone) ≈", - "$(@sprintf("%.10f", distance))"] - @info(join(info_strs, "\n")) + info_strs = ["Numerical metrics of the obtained SOS:", + "ɛ(Δ² - λΔ - ∑ξᵢ*ξᵢ) ≈ $(aug(residual))", + "‖Δ² - λΔ - ∑ξᵢ*ξᵢ‖₁ ≈ $(L1_norm)", + "Floating point distance (to positive cone) ≈"] + @info join(info_strs, "\n") distance if distance ≤ 0 return distance @@ -173,9 +168,8 @@ function distance_to_positive_cone(Δ::GroupRingElem, λ, Q; R::Int=2) @info("Projecting columns of Q to the augmentation ideal...") @time Q, check = augIdproj(Interval, Q) - info_strs = ["Checking that sum of every column contains 0.0...", - (check ? "DONE!" : "FAILED!")] - @info(join(info_strs, "\n")) + result = (check ? "Correct." : "FAILED!") + @info "Checking that sum of every column contains 0.0..." result check || @warn("The following numbers are meaningless!") @info("Computing sum of squares decomposition...") @@ -184,13 +178,11 @@ function distance_to_positive_cone(Δ::GroupRingElem, λ, Q; R::Int=2) L1_norm = norm(residual,1) distance = λ - 2.0^(2ceil(log2(R)))*L1_norm - info_strs = ["Numerical metrics:", + info_strs = ["Numerical metrics of the obtained SOS:", "ɛ(Δ² - λΔ - ∑ξᵢ*ξᵢ) ∈ $(aug(residual))", "‖Δ² - λΔ - ∑ξᵢ*ξᵢ‖₁ ∈ $(L1_norm)", - "Interval distance (to positive cone) ∈", - "$(distance)", - separator] - @info(join(info_strs, "\n")) + "Interval distance (to positive cone) ∈"] + @info join(info_strs, "\n") distance return distance.lo end @@ -220,21 +212,21 @@ function print_summary(sett::Settings) "Solvers options: "] append!(info_strs, [rpad(" $k", 30)* "→ \t$v" for (k,v) in sett.solver().options]) push!(info_strs, separator) - @info(join(info_strs, "\n")) + @info join(info_strs, "\n") end function interpret_results(sett::Settings, sgap::Number) if sgap > 0 Kazhdan_κ = Kazhdan(sgap, length(sett.S)) if Kazhdan_κ > 0 - @info("κ($(sett.name), S) ≥ $Kazhdan_κ: Group HAS property (T)!") + @info "κ($(sett.name), S) ≥ $Kazhdan_κ: Group HAS property (T)!" return true end end info_strs = ["The certified lower bound on the spectral gap is negative:", "λ($(sett.name), S) ≥ 0.0 > $sgap", "This tells us nothing about property (T)"] - @info(join(info_strs, "\n")) + @info join(info_strs, "\n") return false end @@ -242,11 +234,9 @@ function spectral_gap(sett::Settings) fp = PropertyT.fullpath(sett) isdir(fp) || mkpath(fp) - - if isfile(filename(sett,:Δ)) # cached - @info("Loading precomputed Δ...") + @info "Loading precomputed Δ..." Δ = loadGRElem(filename(sett,:Δ), sett.G) else # compute @@ -263,20 +253,20 @@ function spectral_gap(sett::Settings) save(filename(sett, :solution), "λ", λ, "P", P) if λ < 0 - @warn("Solver did not produce a valid solution!") + @warn "Solver did not produce a valid solution!" end end - info_strs = ["λ = $λ", + info_strs = ["Numerical metrics of matrix solution:", "sum(P) = $(sum(P))", "maximum(P) = $(maximum(P))", "minimum(P) = $(minimum(P))"] - @info(join(info_strs, "\n")) + @info join(info_strs, "\n") isapprox(eigvals(P), abs.(eigvals(P))) || - @warn("The solution matrix doesn't seem to be positive definite!") + @warn "The solution matrix doesn't seem to be positive definite!" - @time Q = real(sqrt( (P.+ P')./2 )) + @time Q = real(sqrt(Symmetric( (P.+ P')./2 ))) certified_sgap = distance_to_positive_cone(Δ, λ, Q, R=sett.radius) return certified_sgap diff --git a/src/laplacians.jl b/src/laplacians.jl index e2c5822..252fcdc 100644 --- a/src/laplacians.jl +++ b/src/laplacians.jl @@ -33,11 +33,11 @@ function Laplacian(S::Vector{E}, radius) where E<:AbstractAlgebra.GroupElem end function Laplacian(S, Id, radius) - @info("Generating metric ball of radius $(2radius)...") + @info "Generating metric ball of radius" radius=2radius @time E_R, sizes = Groups.generate_balls(S, Id, radius=2radius) - @info("Generated balls of sizes $sizes.") + @info "Generated balls:" sizes - @info("Creating product matrix...") + @info "Creating product matrix..." rdict = GroupRings.reverse_dict(E_R) @time pm = GroupRings.create_pm(E_R, rdict, sizes[radius]; twisted=true) diff --git a/src/orbitdata.jl b/src/orbitdata.jl index 70e8438..6cfe73f 100644 --- a/src/orbitdata.jl +++ b/src/orbitdata.jl @@ -12,19 +12,19 @@ struct OrbitData{T<:AbstractArray{Float64, 2}, GEl<:GroupElem, P<:perm} end function OrbitData(RG::GroupRing, autS::Group, verbose=true) - verbose && @info("Decomposing basis of RG into orbits of $(autS)") + verbose && @info "Decomposing basis of RG into orbits of" autS @time orbs = orbit_decomposition(autS, RG.basis, RG.basis_dict) @assert sum(length(o) for o in orbs) == length(RG.basis) - verbose && @info("The action has $(length(orbs)) orbits") + verbose && @info "The action has $(length(orbs)) orbits" - verbose && @info("Finding projections in the Group Ring of $(autS)") + verbose && @info "Finding projections in the Group Ring of" autS @time autS_mps = Projections.rankOne_projections(GroupRing(autS, collect(autS))) - verbose && @info("Finding AutS-action matrix representation") + verbose && @info "Finding AutS-action matrix representation" @time preps = perm_reps(autS, RG.basis[1:size(RG.pm,1)], RG.basis_dict) @time mreps = matrix_reps(preps) - verbose && @info("Computing the projection matrices Uπs") + verbose && @info "Computing the projection matrices Uπs" @time Uπs = [orthSVD(matrix_repr(p, mreps)) for p in autS_mps] multiplicities = size.(Uπs,2) @@ -34,7 +34,7 @@ function OrbitData(RG::GroupRing, autS::Group, verbose=true) lpad("multiplicities", 14) * " =" * join(lpad.(multiplicities, 4), ""), lpad("dimensions", 14) * " =" * join(lpad.(dimensions, 4), "") ] - @info(join(info_strs, "\n")) + @info join(info_strs, "\n") end @assert dot(multiplicities, dimensions) == size(RG.pm,1) diff --git a/src/sos_sdps.jl b/src/sos_sdps.jl index 60cf368..b159287 100644 --- a/src/sos_sdps.jl +++ b/src/sos_sdps.jl @@ -90,7 +90,7 @@ function SOS_problem(X::GroupRingElem, orderunit::GroupRingElem, data::OrbitData λ = JuMP.@variable(m, λ) end - @info("Adding $(length(data.orbits)) constraints... ") + @info "Adding $(length(data.orbits)) constraints..." @time addconstraints!(m, Ps, X, orderunit, data) JuMP.@objective(m, Max, λ)