From 54b6fda9e8f69c59c3727cd18b1fe0b71d88cc6c Mon Sep 17 00:00:00 2001 From: kalmar Date: Mon, 5 Jun 2017 13:55:24 +0200 Subject: [PATCH 1/8] @variable(m, ..., SDP) and @SDconstraint(m,... >=0) are equivalent --- src/sdps.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sdps.jl b/src/sdps.jl index 834218a..0046319 100644 --- a/src/sdps.jl +++ b/src/sdps.jl @@ -50,7 +50,7 @@ function create_SDP_problem(Δ::GroupRingElem, matrix_constraints; upper_bound=I Δ² = Δ*Δ @assert length(Δ.coeffs) == length(matrix_constraints) m = JuMP.Model(); - JuMP.@variable(m, P[1:N, 1:N], SDP) + JuMP.@variable(m, P[1:N, 1:N]) JuMP.@SDconstraint(m, P >= 0) JuMP.@constraint(m, sum(P[i] for i in eachindex(P)) == 0) From 936c2851550aebec79020ba436e7bb84eaccfba4 Mon Sep 17 00:00:00 2001 From: kalmar Date: Mon, 5 Jun 2017 17:24:45 +0200 Subject: [PATCH 2/8] less unicode --- src/checksolution.jl | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/checksolution.jl b/src/checksolution.jl index 4e04c92..f29b2b5 100644 --- a/src/checksolution.jl +++ b/src/checksolution.jl @@ -91,7 +91,7 @@ function distance_to_cone{T<:Rational, S<:Interval}(λ::T, sqrt_matrix::Array{S, info(logger, "ɛ(Δ² - λΔ - ∑ξᵢ*ξᵢ) ∈ $(ɛ_dist)") info(logger, "‖Δ² - λΔ - ∑ξᵢ*ξᵢ‖₁ ∈ $(eoi_SOS_L1_dist)") - distance_to_cone = λ - 2^(len-1)*eoi_SOS_L₁_dist + distance_to_cone = λ - 2^(len-1)*eoi_SOS_L1_dist return distance_to_cone end @@ -99,14 +99,14 @@ function distance_to_cone{T<:AbstractFloat}(λ::T, sqrt_matrix::Array{T,2}, Δ:: SOS = compute_SOS(sqrt_matrix, Δ) SOS_diff = EOI(Δ, λ) - SOS - eoi_SOS_L₁_dist = norm(SOS_diff,1) + eoi_SOS_L1_dist = norm(SOS_diff,1) info(logger, "λ = $λ") ɛ_dist = GroupRings.augmentation(SOS_diff) info(logger, "ɛ(Δ² - λΔ - ∑ξᵢ*ξᵢ) ≈ $(@sprintf("%.10f", ɛ_dist))") - info(logger, "‖Δ² - λΔ - ∑ξᵢ*ξᵢ‖₁ ≈ $(@sprintf("%.10f", eoi_SOS_L₁_dist))") + info(logger, "‖Δ² - λΔ - ∑ξᵢ*ξᵢ‖₁ ≈ $(@sprintf("%.10f", eoi_SOS_L1_dist))") - distance_to_cone = λ - 2^(len-1)*eoi_SOS_L₁_dist + distance_to_cone = λ - 2^(len-1)*eoi_SOS_L1_dist return distance_to_cone end @@ -140,20 +140,20 @@ function check_distance_to_positive_cone(Δ::GroupRingElem, λ, P; info(logger, "Checking in interval arithmetic") Q_ℚω_int = Float64.(Q_ℚω) ± δ - t = @timed Interval_dist_to_Σ² = distance_to_cone(λ_ℚ, Q_ℚω_int, Δ_ℚ, len=len) + t = @timed Interval_dist_to_ΣSq = distance_to_cone(λ_ℚ, Q_ℚω_int, Δ_ℚ, len=len) info(logger, timed_msg(t)) - info(logger, "The Augmentation-projected actual distance (to positive cone) ∈ $(Interval_dist_to_Σ²)") + info(logger, "The Augmentation-projected actual distance (to positive cone) ∈ $(Interval_dist_to_ΣSq)") info(logger, "------------------------------------------------------------") - if Interval_dist_to_Σ².lo ≤ 0 || !rational - return Interval_dist_to_Σ² + if Interval_dist_to_ΣSq.lo ≤ 0 || !rational + return Interval_dist_to_ΣSq else info(logger, "Checking Projected SOS decomposition in exact rational arithmetic...") - t = @timed ℚ_dist_to_Σ² = distance_to_cone(λ_ℚ, Q_ℚω, Δ_ℚ, len=len) + t = @timed ℚ_dist_to_ΣSq = distance_to_cone(λ_ℚ, Q_ℚω, Δ_ℚ, len=len) info(logger, timed_msg(t)) - @assert isa(ℚ_dist_to_Σ², Rational) - info(logger, "Augmentation-projected rational distance (to positive cone) ≥ $(Float64(trunc(ℚ_dist_to_Σ²,8)))") + @assert isa(ℚ_dist_to_ΣSq, Rational) + info(logger, "Augmentation-projected rational distance (to positive cone) ≥ $(Float64(trunc(ℚ_dist_to_ΣSq,8)))") info(logger, "------------------------------------------------------------") - return ℚ_dist_to_Σ² + return ℚ_dist_to_ΣSq end end From 3420aa5504fe38b60b893490332d36822e21b7b0 Mon Sep 17 00:00:00 2001 From: kalmar Date: Mon, 5 Jun 2017 17:25:00 +0200 Subject: [PATCH 3/8] symmetry assertion is not necessary --- src/checksolution.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/checksolution.jl b/src/checksolution.jl index f29b2b5..d151afd 100644 --- a/src/checksolution.jl +++ b/src/checksolution.jl @@ -115,7 +115,7 @@ function check_distance_to_positive_cone(Δ::GroupRingElem, λ, P; isapprox(eigvals(P), abs(eigvals(P)), atol=tol) || warn("The solution matrix doesn't seem to be positive definite!") - @assert P == Symmetric(P) + # @assert P == Symmetric(P) Q = real(sqrtm(P)) info(logger, "------------------------------------------------------------") From 5a9f103049502d2789e396a47654ff189ac996b7 Mon Sep 17 00:00:00 2001 From: kalmar Date: Mon, 5 Jun 2017 17:26:55 +0200 Subject: [PATCH 4/8] can load splaplacian as GroupRingElem --- src/PropertyT.jl | 25 ++++++++++++++----------- src/sdps.jl | 4 ++-- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/PropertyT.jl b/src/PropertyT.jl index 7744b3b..a14707a 100644 --- a/src/PropertyT.jl +++ b/src/PropertyT.jl @@ -4,6 +4,11 @@ using JLD using GroupRings using Memento + +using Groups +import Nemo: Group, GroupElem + + const logger = Memento.config("info", fmt="{msg}") const solver_logger = Memento.config("info", fmt="{msg}") @@ -43,23 +48,21 @@ function ΔandSDPconstraints(name::String, G::Group) return Δ, sdp_constraints end -function ΔandSDPconstraints{T<:GroupElem}(name::String, S::Vector{T}, radius::Int) - S, Id = generating_set() +function ΔandSDPconstraints{T<:GroupElem}(name::String, S::Vector{T}, Id::T; radius::Int=2) info(logger, "Computing pm, Δ, sdp_constraints...") - t = @timed Δ, sdp_constraints = ΔandSDPconstraints(S, radius) - info(logger, timed_msg(t)) + Δ, sdp_constraints = ΔandSDPconstraints(S, Id, radius=radius) pm_fname, Δ_fname = pmΔfilenames(name) save(pm_fname, "pm", parent(Δ).pm) save(Δ_fname, "Δ", Δ.coeffs) + return Δ, sdp_constraints end -function ΔandSDPconstraints{T<:GroupElem}(S::Vector{T}, r::Int=2) - Id = parent(S[1])() - B, sizes = Groups.generate_balls(S, Id, radius=2*r) +function ΔandSDPconstraints{T<:GroupElem}(S::Vector{T}, Id::T; radius::Int=2) + B, sizes = Groups.generate_balls(S, Id, radius=2*radius) info(logger, "Generated balls of sizes $sizes") info(logger, "Creating product matrix...") - t = @timed pm = GroupRings.create_pm(B, GroupRings.reverse_dict(B), sizes[r]; twisted=true) + t = @timed pm = GroupRings.create_pm(B, GroupRings.reverse_dict(B), sizes[radius]; twisted=true) info(logger, timed_msg(t)) info(logger, "Creating sdp_constratints...") @@ -68,7 +71,7 @@ function ΔandSDPconstraints{T<:GroupElem}(S::Vector{T}, r::Int=2) RG = GroupRing(parent(Id), B, pm) - Δ = splaplacian(RG, S, B[1:sizes[r]], sizes[2*r]) + Δ = splaplacian(RG, S, Id, sizes[2*radius]) return Δ, sdp_constraints end @@ -153,7 +156,7 @@ function setup_logging(name::String) end -function check_property_T(name::String, S, solver, upper_bound, tol, radius) +function check_property_T(name::String, S, Id, solver, upper_bound, tol, radius) if !isdir(name) mkdir(name) @@ -166,7 +169,7 @@ function check_property_T(name::String, S, solver, upper_bound, tol, radius) Δ, sdp_constraints = ΔandSDPconstraints(name, parent(S[1])) else # compute - Δ, sdp_constraints = ΔandSDPconstraints(name, S, radius) + Δ, sdp_constraints = ΔandSDPconstraints(name, S, Id, radius=radius) end info(logger, "|S| = $(length(S))") diff --git a/src/sdps.jl b/src/sdps.jl index 0046319..1b510dc 100644 --- a/src/sdps.jl +++ b/src/sdps.jl @@ -36,9 +36,9 @@ function constraints_from_pm(pm, total_length=maximum(pm)) return constraints end -function splaplacian(RG::GroupRing, S, basis, n=length(basis)) +function splaplacian(RG::GroupRing, S, Id=RG.group(), n=length(basis)) result = RG(spzeros(n)) - result[RG.group()] = float(length(S)) + result[Id] = float(length(S)) for s in S result[s] += -1.0 end From eac9ad2083865fca2e2e6667f91ecd8d2b2679db Mon Sep 17 00:00:00 2001 From: kalmar Date: Mon, 5 Jun 2017 17:27:55 +0200 Subject: [PATCH 5/8] fix GroupRingElem creation --- src/checksolution.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/checksolution.jl b/src/checksolution.jl index d151afd..85213de 100644 --- a/src/checksolution.jl +++ b/src/checksolution.jl @@ -81,7 +81,7 @@ function distance_to_cone{T<:Rational, S<:Interval}(λ::T, sqrt_matrix::Array{S, SOS = compute_SOS(sqrt_matrix, Δ) info(logger, "ɛ(∑ξᵢ*ξᵢ) ∈ $(GroupRings.augmentation(SOS))") λ_int = @interval(λ) - Δ_int = GroupRingElem([@interval(c) for c in Δ.coeffs], parent(Δ).pm) + Δ_int = GroupRingElem([@interval(c) for c in Δ.coeffs], parent(Δ)) SOS_diff = EOI(Δ_int, λ_int) - SOS eoi_SOS_L1_dist = norm(SOS_diff,1) From 8a3e0ae62ae36072a14644a7376b003f6a5fbde1 Mon Sep 17 00:00:00 2001 From: kalmar Date: Mon, 5 Jun 2017 17:28:39 +0200 Subject: [PATCH 6/8] fix: S is a generating set, we need its length --- src/PropertyT.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PropertyT.jl b/src/PropertyT.jl index a14707a..1f63b95 100644 --- a/src/PropertyT.jl +++ b/src/PropertyT.jl @@ -203,7 +203,7 @@ function check_property_T(name::String, S, Id, solver, upper_bound, tol, radius) end if sgap > 0 info(logger, "λ ≥ $(Float64(trunc(sgap,12)))") - Kazhdan_κ = Kazhdan_from_sgap(sgap, S) + Kazhdan_κ = Kazhdan_from_sgap(sgap, length(S)) Kazhdan_κ = Float64(trunc(Kazhdan_κ, 12)) info(logger, "κ($name, S) ≥ $Kazhdan_κ: Group HAS property (T)!") return true From d9e6f5991ee27e77e2813f9eb940e0dbdda9ec43 Mon Sep 17 00:00:00 2001 From: kalmar Date: Mon, 5 Jun 2017 17:29:05 +0200 Subject: [PATCH 7/8] short circut for directory creation --- src/PropertyT.jl | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/PropertyT.jl b/src/PropertyT.jl index 1f63b95..e5b8fd3 100644 --- a/src/PropertyT.jl +++ b/src/PropertyT.jl @@ -144,6 +144,7 @@ end Kazhdan_from_sgap(λ,N) = sqrt(2*λ/N) function setup_logging(name::String) + isdir(name) || mkdir(name) Memento.add_handler(logger, Memento.DefaultHandler(joinpath(name,"full_$(string((now()))).log"), @@ -158,11 +159,7 @@ end function check_property_T(name::String, S, Id, solver, upper_bound, tol, radius) - if !isdir(name) - mkdir(name) - end - - setup_logging(name) + isdir(name) || mkdir(name) if all(isfile.(pmΔfilenames(name))) # cached From 73c9e655589bf3d4e9c6d12891b5fab44cda65eb Mon Sep 17 00:00:00 2001 From: kalmar Date: Mon, 5 Jun 2017 17:29:22 +0200 Subject: [PATCH 8/8] cosmetic --- src/PropertyT.jl | 1 - src/checksolution.jl | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PropertyT.jl b/src/PropertyT.jl index e5b8fd3..f4ab032 100644 --- a/src/PropertyT.jl +++ b/src/PropertyT.jl @@ -4,7 +4,6 @@ using JLD using GroupRings using Memento - using Groups import Nemo: Group, GroupElem diff --git a/src/checksolution.jl b/src/checksolution.jl index 85213de..2db075e 100644 --- a/src/checksolution.jl +++ b/src/checksolution.jl @@ -130,6 +130,7 @@ function check_distance_to_positive_cone(Δ::GroupRingElem, λ, P; return fp_distance end + info(logger, "") info(logger, "Projecting columns of rationalized Q to the augmentation ideal...") δ = eps(λ) Q_ℚ = ℚ(Q, δ)