1712.07167/bin/check_SpNs.jl
2019-04-03 19:38:01 +02:00

92 lines
2.5 KiB
Julia
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Pkg
Pkg.activate(".")
using Test
using PropertyT
using Nemo
using PropertyT.LinearAlgebra
using PropertyT.SparseArrays
using PropertyT.JuMP
using PropertyT.AbstractAlgebra
using PropertyT.Groups
using PropertyT.GroupRings
using PropertyT.JLD
# include("../1712.07167/Roots.jl")
include(joinpath("..", "src", "SpNs.jl"))
using .SpNs
using .SpNs.Roots
BLAS.set_num_threads(Threads.nthreads())
ENV["OMP_NUM_THREADS"] = Threads.nthreads()
const N = 2
const RADIUS = 3
const UPPER_BOUND = 0.801
root_system = SpNs.gens_roots(N)
S = [g.matrix for g in root_system]
G = parent(S[1])
autS = WreathProduct(PermGroup(2), PermGroup(N))
using SCS
with_SCS = with_optimizer(SCS.Optimizer, linear_solver=SCS.Direct, max_iters=400000, eps=1e-11, alpha=1.95, acceleration_lookback=1, warm_start=true)
sett = PropertyT.Settings("Sp($(2N),Z)_r$RADIUS", G, S, autS, with_SCS;
radius=RADIUS, upper_bound=UPPER_BOUND, warmstart=true)
PropertyT.print_summary(sett)
fp = PropertyT.fullpath(sett)
isdir(fp) || mkpath(fp)
Δ = PropertyT.Laplacian(S, RADIUS)
RG = parent(Δ)
Δs = SpNs.laplacians(RG, root_system)
Sq = sum( Δα^2 for (α, Δα) in Δs );
# Op = sum( Δα * sum(Δβ for (β, Δβ) in Δs if isorthogonal(α, β)) for (α, Δα) in Δs );
Adj = sum( Δα * sum(Δβ for (β, Δβ) in Δs if !isproportional(α, β)) for (α, Δα) in Δs );
const elt = Adj
solver_logfile(sett) = joinpath(PropertyT.fullpath(sett), "Adj_solver_$(PropertyT.Dates.now()).log")
λ, P = PropertyT.approximate_by_SOS(sett, elt, Δ,
solverlog=solver_logfile(sett))
save(PropertyT.filename(sett, :solution), "λ", λ, "P", P)
λ < 0 && @warn "Solver did not produce a valid solution!"
Q = real(sqrt(P));
certified_λ = PropertyT.certify_SOS_decomposition(elt, Δ, λ, Q, R=RADIUS)
@info "The obtained SOS can be use to certify λ ≥" certified_λ
#
# od = PropertyT.OrbitData(RG, WreathProduct(PermGroup(2), PermGroup(N)))
# orbit_data = PropertyT.decimate(od);
#
# using SCS
# using JuMP
# warmstart = nothing
#
# UB = 0.88 # for elt = Δ²;
# SDP_problem, varP = PropertyT.SOS_problem(elt, Δ, orbit_data, upper_bound=UB);
# # SDP_problem, varP = PropertyT.SOS_problem(elt, Δ, orbit_data);
#
# sett = PropertyT.Settings("Sp($(2N),Z)", G, S, autS, solver(2000, accel=20);
# upper_bound=1.3, warmstart=false)
#
# with_SCS = with_optimizer(SCS.Optimizer, linear_solver=SCS.Direct, max_iters=100000, eps=1e-12, alpha=1.95, acceleration_lookback=1, warm_start=true)
#
# status, warmstart = PropertyT.solve(SDP_problem, with_SCS, warmstart)