1
0
mirror of https://github.com/kalmarek/PropertyT.jl.git synced 2024-11-25 08:45:28 +01:00

Compare commits

..

No commits in common. "d3873e1b3a833d87686f704460d78e10cb69d0b6" and "f4936dd50a14413d5d83b479fe7a2af69eb02812" have entirely different histories.

21 changed files with 287 additions and 316 deletions

View File

@ -1,35 +1,29 @@
name = "PropertyT"
uuid = "03b72c93-0167-51e2-8a1e-eb4ff1fb940d"
authors = ["Marek Kaluba <kalmar@amu.edu.pl>"]
version = "0.6.0"
version = "0.5.0"
[deps]
Groups = "5d8bd718-bd84-11e8-3b40-ad14f4a32557"
GroupsCore = "d5909c97-4eac-4ecc-a3dc-fdd0858a4120"
IntervalArithmetic = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253"
IntervalMatrices = "5c1f47dc-42dd-5697-8aaa-4d102d140ba9"
JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
PermutationGroups = "8bc5a954-2dfc-11e9-10e6-cd969bffa420"
ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
StarAlgebras = "0c0c59c1-dc5f-42e9-9a8b-b5dc384a6cd1"
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
SymbolicWedderburn = "858aa9a9-4c7c-4c62-b466-2421203962a2"
[compat]
COSMO = "0.8"
Groups = "0.8"
GroupsCore = "0.5"
Groups = "0.7"
IntervalArithmetic = "0.20"
IntervalMatrices = "0.10"
JuMP = ">=1.3"
PermutationGroups = "0.6.2"
IntervalMatrices = "0.8"
JuMP = "1.3"
ProgressMeter = "1.7"
SCS = "2"
StarAlgebras = "0.2.1"
SCS = "1.1"
StaticArrays = "1"
SymbolicWedderburn = "0.4"
SymbolicWedderburn = "0.3.4"
julia = "1.6"
[extras]

View File

@ -6,10 +6,10 @@ using SparseArrays
using JuMP
using Groups
import GroupsCore
import PermutationGroups as PG
import SymbolicWedderburn as SW
import StarAlgebras as SA
import Groups.GroupsCore
using SymbolicWedderburn
import SymbolicWedderburn.StarAlgebras
import SymbolicWedderburn.PermutationGroups
include("constraint_matrix.jl")
include("sos_sdps.jl")
@ -31,9 +31,9 @@ function group_algebra(G::Groups.Group, S = gens(G); halfradius::Integer)
@time E, sizes = Groups.wlmetric_ball(S; radius = 2halfradius)
@info "sizes = $(sizes)"
@info "computing the *-algebra structure for G"
@time RG = SA.StarAlgebra(
@time RG = StarAlgebras.StarAlgebra(
G,
SA.Basis{UInt32}(E),
StarAlgebras.Basis{UInt32}(E),
(sizes[halfradius], sizes[halfradius]);
precompute = false,
)

View File

@ -1,24 +1,29 @@
import SymbolicWedderburn.action
include("alphabet_permutation.jl")
include("sln_conjugation.jl")
include("spn_conjugation.jl")
include("autfn_conjugation.jl")
function SW.action(
act::SW.ByPermutations,
function SymbolicWedderburn.action(
act::SymbolicWedderburn.ByPermutations,
g::Groups.GroupElement,
α::SA.AlgebraElement,
α::StarAlgebras.AlgebraElement,
)
res = SA.zero!(similar(α))
B = SA.basis(parent(α))
for (idx, val) in SA._nzpairs(SA.coeffs(α))
res = StarAlgebras.zero!(similar(α))
B = basis(parent(α))
for (idx, val) in StarAlgebras._nzpairs(StarAlgebras.coeffs(α))
a = B[idx]
a_g = SW.action(act, g, a)
a_g = SymbolicWedderburn.action(act, g, a)
res[a_g] += val
end
return res
end
function Base.:^(w::W, p::PG.AbstractPermutation) where {W<:Groups.AbstractWord}
function Base.:^(
w::W,
p::PermutationGroups.AbstractPerm,
) where {W<:Groups.AbstractWord}
return W([l^p for l in w])
end

View File

@ -2,37 +2,43 @@
import Groups: Constructions
struct AlphabetPermutation{GEl,I} <: SW.ByPermutations
perms::Dict{GEl,PG.Perm{I}}
struct AlphabetPermutation{GEl,I} <: SymbolicWedderburn.ByPermutations
perms::Dict{GEl,PermutationGroups.Perm{I}}
end
function AlphabetPermutation(
A::Alphabet,
Γ::PG.AbstractPermutationGroup,
Γ::PermutationGroups.AbstractPermutationGroup,
op,
)
return AlphabetPermutation(
Dict(γ => inv(PG.Perm([A[op(l, γ)] for l in A])) for γ in Γ),
Dict(γ => inv(PermutationGroups.Perm([A[op(l, γ)] for l in A])) for γ in Γ),
)
end
function AlphabetPermutation(A::Alphabet, W::Constructions.WreathProduct, op)
return AlphabetPermutation(
Dict(
w => inv(PG.Perm([A[op(op(l, w.p), w.n)] for l in A])) for
w => inv(PermutationGroups.Perm([A[op(op(l, w.p), w.n)] for l in A])) for
w in W
),
)
end
function SW.action(
function SymbolicWedderburn.action(
act::AlphabetPermutation,
γ::Groups.GroupElement,
g::Groups.AbstractFPGroupElement,
)
G = parent(g)
# w = SW.action(act, γ, word(g))
w = word(g)^(act.perms[γ])
w = SymbolicWedderburn.action(act, γ, word(g))
return G(w)
end
function SymbolicWedderburn.action(
act::AlphabetPermutation,
γ::Groups.GroupElement,
w::Groups.AbstractWord,
)
return w^(act.perms[γ])
end

View File

@ -2,7 +2,7 @@
function _conj(
t::Groups.Transvection,
σ::PG.AbstractPermutation,
σ::PermutationGroups.AbstractPerm,
)
return Groups.Transvection(t.id, t.i^inv(σ), t.j^inv(σ), t.inv)
end
@ -22,9 +22,5 @@ function _conj(
return _flip(t, x.elts[i])
end
function action_by_conjugation(
sautfn::Groups.AutomorphismGroup{<:Groups.FreeGroup},
Σ::Groups.Group,
)
return AlphabetPermutation(alphabet(sautfn), Σ, _conj)
end
action_by_conjugation(sautfn::Groups.AutomorphismGroup{<:Groups.FreeGroup}, Σ::Groups.Group) =
AlphabetPermutation(alphabet(sautfn), Σ, _conj)

View File

@ -2,7 +2,7 @@
function _conj(
t::MatrixGroups.ElementaryMatrix{N},
σ::PG.AbstractPermutation,
σ::PermutationGroups.AbstractPerm,
) where {N}
return MatrixGroups.ElementaryMatrix{N}(t.i^inv(σ), t.j^inv(σ), t.val)
end
@ -16,9 +16,5 @@ function _conj(
return ifelse(just_one_flips, inv(t), t)
end
function action_by_conjugation(
sln::Groups.MatrixGroups.SpecialLinearGroup,
Σ::Groups.Group,
)
return AlphabetPermutation(alphabet(sln), Σ, _conj)
end
action_by_conjugation(sln::Groups.MatrixGroups.SpecialLinearGroup, Σ::Groups.Group) =
AlphabetPermutation(alphabet(sln), Σ, _conj)

View File

@ -2,10 +2,10 @@
function _conj(
s::MatrixGroups.ElementarySymplectic{N,T},
σ::PG.AbstractPermutation,
σ::PermutationGroups.AbstractPerm,
) where {N,T}
@assert iseven(N)
@assert PG.degree(σ) N ÷ 2 "Got degree = $(PG.degree(σ)); N = $N"
@assert PermutationGroups.degree(σ) == N ÷ 2 "Got degree = $(PermutationGroups.degree(σ)); N = $N"
n = N ÷ 2
@assert 1 s.i N
@assert 1 s.j N
@ -40,9 +40,5 @@ function _conj(
return ifelse(just_one_flips, inv(s), s)
end
function action_by_conjugation(
sln::Groups.MatrixGroups.SymplecticGroup,
Σ::Groups.Group,
)
return AlphabetPermutation(alphabet(sln), Σ, _conj)
end
action_by_conjugation(sln::Groups.MatrixGroups.SymplecticGroup, Σ::Groups.Group) =
AlphabetPermutation(alphabet(sln), Σ, _conj)

View File

@ -9,16 +9,16 @@ function augment_columns!(Q::AbstractMatrix)
end
function __sos_via_sqr!(
res::SA.AlgebraElement,
res::StarAlgebras.AlgebraElement,
P::AbstractMatrix;
augmented::Bool,
id = (b = SA.basis(parent(res)); b[one(first(b))]),
id = (b = basis(parent(res)); b[one(first(b))]),
)
A = parent(res)
mstr = A.mstructure
@assert size(mstr) == size(P)
SA.zero!(res)
StarAlgebras.zero!(res)
for j in axes(mstr, 2)
for i in axes(mstr, 1)
p = P[i, j]
@ -39,11 +39,11 @@ function __sos_via_sqr!(
end
function __sos_via_cnstr!(
res::SA.AlgebraElement,
res::StarAlgebras.AlgebraElement,
::AbstractMatrix,
cnstrs,
)
SA.zero!(res)
StarAlgebras.zero!(res)
for (g, A_g) in cnstrs
res[g] = dot(A_g, )
end
@ -51,17 +51,17 @@ function __sos_via_cnstr!(
end
function compute_sos(
A::SA.StarAlgebra,
A::StarAlgebras.StarAlgebra,
Q::AbstractMatrix;
augmented::Bool,
)
= Q' * Q
res = SA.AlgebraElement(zeros(eltype(), length(SA.basis(A))), A)
res = StarAlgebras.AlgebraElement(zeros(eltype(), length(basis(A))), A)
res = __sos_via_sqr!(res, ; augmented = augmented)
return res
end
function sufficient_λ(residual::SA.AlgebraElement, λ; halfradius)
function sufficient_λ(residual::StarAlgebras.AlgebraElement, λ; halfradius)
L1_norm = norm(residual, 1)
suff_λ = λ - 2.0^(2ceil(log2(halfradius))) * L1_norm
@ -77,10 +77,8 @@ function sufficient_λ(residual::SA.AlgebraElement, λ; halfradius)
info_strs = [
"Numerical metrics of the obtained SOS:",
"ɛ(elt - λu - ∑ξᵢ*ξᵢ) $eq_sign " *
sprint(show, SA.aug(residual); context = :compact => true),
"‖elt - λu - ∑ξᵢ*ξᵢ‖₁ $eq_sign " *
sprint(show, L1_norm; context = :compact => true),
"ɛ(elt - λu - ∑ξᵢ*ξᵢ) $eq_sign $(StarAlgebras.aug(residual))",
"‖elt - λu - ∑ξᵢ*ξᵢ‖₁ $eq_sign $(L1_norm)",
" λ $eq_sign $suff_λ",
]
@info join(info_strs, "\n")
@ -89,10 +87,10 @@ function sufficient_λ(residual::SA.AlgebraElement, λ; halfradius)
end
function sufficient_λ(
elt::SA.AlgebraElement,
order_unit::SA.AlgebraElement,
elt::StarAlgebras.AlgebraElement,
order_unit::StarAlgebras.AlgebraElement,
λ,
sos::SA.AlgebraElement;
sos::StarAlgebras.AlgebraElement;
halfradius,
)
@assert parent(elt) === parent(order_unit) == parent(sos)
@ -102,15 +100,16 @@ function sufficient_λ(
end
function certify_solution(
elt::SA.AlgebraElement,
orderunit::SA.AlgebraElement,
elt::StarAlgebras.AlgebraElement,
orderunit::StarAlgebras.AlgebraElement,
λ,
Q::AbstractMatrix{<:AbstractFloat};
halfradius,
augmented = iszero(SA.aug(elt)) && iszero(SA.aug(orderunit)),
augmented = iszero(StarAlgebras.aug(elt)) &&
iszero(StarAlgebras.aug(orderunit)),
)
should_we_augment =
!augmented && SA.aug(elt) == SA.aug(orderunit) == 0
!augmented && StarAlgebras.aug(elt) == StarAlgebras.aug(orderunit) == 0
Q = should_we_augment ? augment_columns!(Q) : Q
@time sos = compute_sos(parent(elt), Q; augmented = augmented)
@ -123,8 +122,10 @@ function certify_solution(
return false, λ_flpoint
end
λ_int = IntervalArithmetic.interval(λ)
Q_int = IntervalMatrices.IntervalMatrix(IntervalArithmetic.interval.(Q))
λ_int = IntervalArithmetic.@interval(λ)
Q_int = IntervalMatrices.IntervalMatrix([
IntervalArithmetic.@interval(q) for q in Q
])
check, sos_int = @time if should_we_augment
@info("Projecting columns of Q to the augmentation ideal...")

View File

@ -147,13 +147,13 @@ function LinearAlgebra.dot(cm::ConstraintMatrix, m::AbstractMatrix{T}) where {T}
return convert(eltype(cm), cm.val) * (pos - neg)
end
function constraints(A::SA.StarAlgebra; augmented::Bool)
return constraints(SA.basis(A), A.mstructure; augmented = augmented)
function constraints(A::StarAlgebras.StarAlgebra; augmented::Bool)
return constraints(basis(A), A.mstructure; augmented = augmented)
end
function constraints(
basis::SA.AbstractBasis,
mstr::SA.MultiplicativeStructure;
basis::StarAlgebras.AbstractBasis,
mstr::StarAlgebras.MultiplicativeStructure;
augmented = false,
)
cnstrs = _constraints(
@ -170,7 +170,7 @@ function constraints(
end
function _constraints(
mstr::SA.MultiplicativeStructure;
mstr::StarAlgebras.MultiplicativeStructure;
augmented::Bool = false,
num_constraints = maximum(mstr),
id,

View File

@ -37,7 +37,7 @@ function _groupby(keys::AbstractVector{K}, vals::AbstractVector{V}) where {K,V}
return d
end
function laplacians(RG::SA.StarAlgebra, S, grading)
function laplacians(RG::StarAlgebras.StarAlgebra, S, grading)
d = _groupby(grading, S)
Δs = Dict(α => RG(length(Sα)) - sum(RG(s) for s in Sα) for (α, Sα) in d)
return Δs

View File

@ -1,18 +1,16 @@
function __outer_dim(wd::SW.WedderburnDecomposition)
return size(first(SW.direct_summands(wd)), 2)
end
__outer_dim(wd::WedderburnDecomposition) = size(first(direct_summands(wd)), 2)
function __group_of(wd::SW.WedderburnDecomposition)
function __group_of(wd::WedderburnDecomposition)
# this is veeeery hacky... ;)
return parent(first(keys(wd.hom.cache)))
end
function reconstruct(
Ms::AbstractVector{<:AbstractMatrix},
wbdec::SW.WedderburnDecomposition,
wbdec::WedderburnDecomposition,
)
n = __outer_dim(wbdec)
res = sum(zip(Ms, SW.direct_summands(wbdec))) do (M, ds)
res = sum(zip(Ms, SymbolicWedderburn.direct_summands(wbdec))) do (M, ds)
res = similar(M, n, n)
res = _reconstruct!(res, M, ds)
return res
@ -24,12 +22,12 @@ end
function _reconstruct!(
res::AbstractMatrix,
M::AbstractMatrix,
ds::SW.DirectSummand,
ds::SymbolicWedderburn.DirectSummand,
)
res .= zero(eltype(res))
if !iszero(M)
U = SW.image_basis(ds)
d = SW.degree(ds)
U = SymbolicWedderburn.image_basis(ds)
d = SymbolicWedderburn.degree(ds)
res = (U' * M * U) .* d
end
return res
@ -49,15 +47,15 @@ function average!(
res::AbstractMatrix,
M::AbstractMatrix,
G::Groups.Group,
hom::SW.InducedActionHomomorphism{
<:SW.ByPermutations,
hom::SymbolicWedderburn.InducedActionHomomorphism{
<:SymbolicWedderburn.ByPermutations,
},
)
res .= zero(eltype(res))
@assert size(M) == size(res)
o = Groups.order(Int, G)
for g in G
p = SW.induce(hom, g)
p = SymbolicWedderburn.induce(hom, g)
Threads.@threads for c in axes(res, 2)
for r in axes(res, 1)
if !iszero(M[r, c])

View File

@ -5,8 +5,8 @@ Formulate the dual to the sum of squares decomposition problem for `X - λ·u`.
See also [sos_problem_primal](@ref).
"""
function sos_problem_dual(
elt::SA.AlgebraElement,
order_unit::SA.AlgebraElement = zero(elt);
elt::StarAlgebras.AlgebraElement,
order_unit::StarAlgebras.AlgebraElement = zero(elt);
lower_bound = -Inf,
)
@assert parent(elt) == parent(order_unit)
@ -20,7 +20,7 @@ function sos_problem_dual(
# Symmetrized:
# 1 dual variable for every orbit of G acting on basis
model = Model()
JuMP.@variable(model, y[1:length(SA.basis(algebra))])
JuMP.@variable(model, y[1:length(basis(algebra))])
JuMP.@constraint(model, λ_dual, dot(order_unit, y) == 1)
JuMP.@constraint(model, psd, y[moment_matrix] in PSDCone())
@ -54,10 +54,11 @@ be added to the model. This may improve the accuracy of the solution if
The default `u = zero(X)` formulates a simple feasibility problem.
"""
function sos_problem_primal(
elt::SA.AlgebraElement,
order_unit::SA.AlgebraElement = zero(elt);
elt::StarAlgebras.AlgebraElement,
order_unit::StarAlgebras.AlgebraElement = zero(elt);
upper_bound = Inf,
augmented::Bool = iszero(SA.aug(elt)) && iszero(SA.aug(order_unit)),
augmented::Bool = iszero(StarAlgebras.aug(elt)) &&
iszero(StarAlgebras.aug(order_unit)),
)
@assert parent(elt) === parent(order_unit)
@ -79,11 +80,11 @@ function sos_problem_primal(
end
JuMP.@objective(model, Max, λ)
for b in SA.basis(parent(elt))
for b in basis(parent(elt))
JuMP.@constraint(model, elt(b) - λ * order_unit(b) == dot(A[b], P))
end
else
for b in SA.basis(parent(elt))
for b in basis(parent(elt))
JuMP.@constraint(model, elt(b) == dot(A[b], P))
end
end
@ -93,7 +94,7 @@ end
function invariant_constraint!(
result::AbstractMatrix,
basis::SA.AbstractBasis,
basis::StarAlgebras.AbstractBasis,
cnstrs::AbstractDict{K,<:ConstraintMatrix},
invariant_vec::SparseVector,
) where {K}
@ -127,14 +128,14 @@ function invariant_constraint(basis, cnstrs, invariant_vec)
return sparse(I, J, V, size(_M)...)
end
function isorth_projection(ds::SW.DirectSummand)
U = SW.image_basis(ds)
function isorth_projection(ds::SymbolicWedderburn.DirectSummand)
U = SymbolicWedderburn.image_basis(ds)
return isapprox(U * U', I)
end
function sos_problem_primal(
elt::SA.AlgebraElement,
wedderburn::SW.WedderburnDecomposition;
elt::StarAlgebras.AlgebraElement,
wedderburn::WedderburnDecomposition;
kwargs...,
)
return sos_problem_primal(elt, zero(elt), wedderburn; kwargs...)
@ -175,30 +176,31 @@ import ProgressMeter
__show_itrs(n, total) = () -> [(Symbol("constraint"), "$n/$total")]
function sos_problem_primal(
elt::SA.AlgebraElement,
orderunit::SA.AlgebraElement,
wedderburn::SW.WedderburnDecomposition;
elt::StarAlgebras.AlgebraElement,
orderunit::StarAlgebras.AlgebraElement,
wedderburn::WedderburnDecomposition;
upper_bound = Inf,
augmented = iszero(SA.aug(elt)) && iszero(SA.aug(orderunit)),
augmented = iszero(StarAlgebras.aug(elt)) &&
iszero(StarAlgebras.aug(orderunit)),
check_orthogonality = true,
show_progress = false,
)
@assert parent(elt) === parent(orderunit)
if check_orthogonality
if any(!isorth_projection, SW.direct_summands(wedderburn))
if any(!isorth_projection, direct_summands(wedderburn))
error(
"Wedderburn decomposition contains a non-orthogonal projection",
)
end
end
id_one = findfirst(SW.invariant_vectors(wedderburn)) do v
b = SA.basis(parent(elt))
id_one = findfirst(invariant_vectors(wedderburn)) do v
b = basis(parent(elt))
return sparsevec([b[one(first(b))]], [1 // 1], length(v)) == v
end
prog = ProgressMeter.Progress(
length(SW.invariant_vectors(wedderburn));
length(invariant_vectors(wedderburn));
dt = 1,
desc = "Adding constraints: ",
enabled = show_progress,
@ -223,7 +225,7 @@ function sos_problem_primal(
end
# semidefinite constraints as described by wedderburn
Ps = map(SW.direct_summands(wedderburn)) do ds
Ps = map(direct_summands(wedderburn)) do ds
dim = size(ds, 1)
P = JuMP.@variable(model, [1:dim, 1:dim], Symmetric)
JuMP.@constraint(model, P in PSDCone())
@ -236,14 +238,14 @@ function sos_problem_primal(
_eps = 10 * eps(T) * max(size(parent(elt).mstructure)...)
end
X = SA.coeffs(elt)
U = SA.coeffs(orderunit)
X = StarAlgebras.coeffs(elt)
U = StarAlgebras.coeffs(orderunit)
# defining constraints based on the multiplicative structure
cnstrs = constraints(parent(elt); augmented = augmented)
# adding linear constraints: one per orbit
for (i, iv) in enumerate(SW.invariant_vectors(wedderburn))
for (i, iv) in enumerate(invariant_vectors(wedderburn))
ProgressMeter.next!(prog; showvalues = __show_itrs(i, prog.n))
augmented && i == id_one && continue
# i == 500 && break
@ -251,9 +253,9 @@ function sos_problem_primal(
x = dot(X, iv)
u = dot(U, iv)
spM_orb = invariant_constraint(SA.basis(parent(elt)), cnstrs, iv)
spM_orb = invariant_constraint(basis(parent(elt)), cnstrs, iv)
Ms = SW.diagonalize!(
Ms = SymbolicWedderburn.diagonalize!(
Ms,
spM_orb,
wedderburn;

View File

@ -1,40 +1,30 @@
import SymbolicWedderburn.PermutationGroups.AbstractPerm
# move to Groups
Base.keys(a::Alphabet) = keys(1:length(a))
## the old 1812.03456 definitions
function isopposite(
σ::PG.AbstractPermutation,
τ::PG.AbstractPermutation,
i = 1,
j = 2,
)
return i^σ i^τ && i^σ j^τ && j^σ i^τ && j^σ j^τ
end
isopposite(σ::AbstractPerm, τ::AbstractPerm, i=1, j=2) =
i^σ i^τ && i^σ j^τ && j^σ i^τ && j^σ j^τ
function isadjacent(
σ::PG.AbstractPermutation,
τ::PG.AbstractPermutation,
i = 1,
j = 2,
)
return (i^σ == i^τ && j^σ j^τ) || # first equal, second differ
isadjacent(σ::AbstractPerm, τ::AbstractPerm, i=1, j=2) =
(i^σ == i^τ && j^σ j^τ) || # first equal, second differ
(j^σ == j^τ && i^σ i^τ) || # second equal, first differ
(i^σ == j^τ && j^σ i^τ) || # first σ equal to second τ
(j^σ == i^τ && i^σ j^τ) # second σ equal to first τ
end
function _ncycle(start, length, n=start + length - 1)
p = Vector{UInt8}(1:n)
p = PermutationGroups.Perm(Int8(n))
@assert n start + length - 1
for k in start:start+length-2
p[k] = k + 1
end
p[start+length-1] = start
return PG.Perm(p)
return p
end
alternating_group(n::Integer) = PG.PermGroup([_ncycle(i, 3) for i in 1:n-2])
alternating_group(n::Integer) = PermutationGroups.PermGroup([_ncycle(i, 3) for i in 1:n-2])
function small_gens(G::MatrixGroups.SpecialLinearGroup)
A = alphabet(G)
@ -56,31 +46,31 @@ function small_gens(G::Groups.AutomorphismGroup{<:FreeGroup})
return union!(S, inv.(S))
end
function small_laplacian(RG::SA.StarAlgebra)
G = SA.object(RG)
function small_laplacian(RG::StarAlgebras.StarAlgebra)
G = StarAlgebras.object(RG)
S₂ = small_gens(G)
return length(S₂) * one(RG) - sum(RG(s) for s in S₂)
end
function SqAdjOp(A::SA.StarAlgebra, n::Integer, Δ₂ = small_laplacian(A))
function SqAdjOp(A::StarAlgebras.StarAlgebra, n::Integer, Δ₂=small_laplacian(A))
@assert parent(Δ₂) === A
alt_n = alternating_group(n)
G = SA.object(A)
G = StarAlgebras.object(A)
act = action_by_conjugation(G, alt_n)
Δ₂s = Dict(σ => SW.action(act, σ, Δ₂) for σ in alt_n)
Δ₂s = Dict(σ => SymbolicWedderburn.action(act, σ, Δ₂) for σ in alt_n)
sq, adj, op = zero(A), zero(A), zero(A)
tmp = zero(A)
for σ in alt_n
SA.add!(sq, sq, SA.mul!(tmp, Δ₂s[σ], Δ₂s[σ]))
StarAlgebras.add!(sq, sq, StarAlgebras.mul!(tmp, Δ₂s[σ], Δ₂s[σ]))
for τ in alt_n
if isopposite(σ, τ)
SA.add!(op, op, SA.mul!(tmp, Δ₂s[σ], Δ₂s[τ]))
StarAlgebras.add!(op, op, StarAlgebras.mul!(tmp, Δ₂s[σ], Δ₂s[τ]))
elseif isadjacent(σ, τ)
SA.add!(adj, adj, SA.mul!(tmp, Δ₂s[σ], Δ₂s[τ]))
StarAlgebras.add!(adj, adj, StarAlgebras.mul!(tmp, Δ₂s[σ], Δ₂s[τ]))
end
end
end

View File

@ -20,12 +20,12 @@
optimizer = scs_optimizer(;
eps = 1e-10,
max_iters = 5_000,
accel = -50,
accel = 50,
alpha = 1.9,
),
)
@test status == JuMP.OPTIMAL
@test status == JuMP.ALMOST_OPTIMAL
@test !certified
@test λ < 0
end
@ -33,7 +33,7 @@
@testset "SL(3,F₅)" begin
N = 3
G = MatrixGroups.SpecialLinearGroup{N}(
SW.Characters.FiniteFields.GF{5},
SymbolicWedderburn.Characters.FiniteFields.GF{5},
)
RG, S, sizes = PropertyT.group_algebra(G; halfradius = 2)
@ -53,7 +53,7 @@
optimizer = scs_optimizer(;
eps = 1e-10,
max_iters = 5_000,
accel = -50,
accel = 50,
alpha = 1.9,
),
)
@ -65,16 +65,15 @@
m = PropertyT.sos_problem_dual(elt, unit)
PropertyT.solve(
m,
scs_optimizer(;
eps = 1e-3,
cosmo_optimizer(;
eps = 1e-6,
max_iters = 5_000,
accel = -50,
accel = 50,
alpha = 1.9,
),
)
@test JuMP.termination_status(m) in
(JuMP.ITERATION_LIMIT, JuMP.ALMOST_OPTIMAL, JuMP.OPTIMAL)
@test JuMP.termination_status(m) in (JuMP.ALMOST_OPTIMAL, JuMP.OPTIMAL)
@test JuMP.objective_value(m) 1.5 atol = 1e-2
end
@ -99,12 +98,12 @@
optimizer = scs_optimizer(;
eps = 1e-10,
max_iters = 5_000,
accel = -50,
accel = 50,
alpha = 1.9,
),
)
@test status in (JuMP.ALMOST_OPTIMAL, JuMP.ITERATION_LIMIT)
@test status == JuMP.ALMOST_OPTIMAL
@test λ < 0
@test !certified
@ -112,14 +111,14 @@
status, _ = PropertyT.solve(
sos_problem,
scs_optimizer(;
cosmo_optimizer(;
eps = 1e-7,
max_iters = 5_000,
accel = -50,
max_iters = 10_000,
accel = 0,
alpha = 1.9,
),
)
@test status in (JuMP.OPTIMAL, JuMP.ITERATION_LIMIT)
@test status == JuMP.OPTIMAL
P = JuMP.value.(sos_problem[:P])
Q = real.(sqrt(P))
certified, λ_cert =
@ -150,11 +149,11 @@
status, _ = PropertyT.solve(
opt_problem,
scs_optimizer(;
cosmo_optimizer(;
eps = 1e-10,
max_iters = 10_000,
accel = 50,
alpha = 1.9,
accel = 0,
alpha = 1.5,
),
)
@ -174,11 +173,7 @@
)
@test certified
@test isapprox(
PropertyT.IntervalArithmetic.inf(λ_cert),
λ,
rtol = 1e-5,
)
@test isapprox(λ_cert, λ, rtol = 1e-5)
end
@testset "augmented formulation" begin
@ -218,11 +213,7 @@
)
@test certified
@test isapprox(
PropertyT.IntervalArithmetic.inf(λ_cert),
λ,
rtol = 1e-5,
)
@test isapprox(λ_cert, λ, rtol = 1e-5)
@test λ_cert > 2 // 10
end
end

View File

@ -5,15 +5,15 @@
@info "running tests for" G
RG, S, sizes = PropertyT.group_algebra(G; halfradius = 2)
P = PG.PermGroup(PG.perm"(1,2)", PG.Perm(circshift(1:N, -1)))
Σ = Groups.Constructions.WreathProduct(PG.PermGroup(PG.perm"(1,2)"), P)
P = PermGroup(perm"(1,2)", Perm(circshift(1:N, -1)))
Σ = PropertyT.Constructions.WreathProduct(PermGroup(perm"(1,2)"), P)
act = PropertyT.action_by_conjugation(G, Σ)
wd = SW.WedderburnDecomposition(
wd = WedderburnDecomposition(
Float64,
Σ,
act,
SA.basis(RG),
SA.Basis{UInt16}(@view SA.basis(RG)[1:sizes[2]]),
basis(RG),
StarAlgebras.Basis{UInt16}(@view basis(RG)[1:sizes[2]]),
)
@info wd
@ -54,18 +54,15 @@
Δ = RSL(length(S)) - sum(RSL(s) for s in S)
@testset "Wedderburn formulation" begin
P = PG.PermGroup(PG.perm"(1,2)", PG.Perm(circshift(1:n, -1)))
Σ = Groups.Constructions.WreathProduct(
PG.PermGroup(PG.perm"(1,2)"),
P,
)
P = PermGroup(perm"(1,2)", Perm(circshift(1:n, -1)))
Σ = PropertyT.Constructions.WreathProduct(PermGroup(perm"(1,2)"), P)
act = PropertyT.action_by_conjugation(SL, Σ)
wd = SW.WedderburnDecomposition(
wd = WedderburnDecomposition(
Rational{Int},
Σ,
act,
SA.basis(RSL),
SA.Basis{UInt16}(@view SA.basis(RSL)[1:sizes[2]]),
basis(RSL),
StarAlgebras.Basis{UInt16}(@view basis(RSL)[1:sizes[2]]),
)
@info wd
@ -81,12 +78,12 @@
augmented = false,
)
wdfl = SW.WedderburnDecomposition(
wdfl = SymbolicWedderburn.WedderburnDecomposition(
Float64,
Σ,
act,
SA.basis(RSL),
SA.Basis{UInt16}(@view SA.basis(RSL)[1:sizes[2]]),
basis(RSL),
StarAlgebras.Basis{UInt16}(@view basis(RSL)[1:sizes[2]]),
)
model, varP = PropertyT.sos_problem_primal(
@ -150,19 +147,16 @@
unit = Δ
ub = Inf
P = PG.PermGroup(PG.perm"(1,2)", PG.Perm(circshift(1:n, -1)))
Σ = Groups.Constructions.WreathProduct(
PG.PermGroup(PG.perm"(1,2)"),
P,
)
P = PermGroup(perm"(1,2)", Perm(circshift(1:n, -1)))
Σ = PropertyT.Constructions.WreathProduct(PermGroup(perm"(1,2)"), P)
act = PropertyT.action_by_conjugation(SL, Σ)
wdfl = SW.WedderburnDecomposition(
wdfl = SymbolicWedderburn.WedderburnDecomposition(
Float64,
Σ,
act,
SA.basis(RSL),
SA.Basis{UInt16}(@view SA.basis(RSL)[1:sizes[2]]),
basis(RSL),
StarAlgebras.Basis{UInt16}(@view basis(RSL)[1:sizes[2]]),
)
@info wdfl
@ -176,10 +170,10 @@
status, _ = PropertyT.solve(
opt_problem,
cosmo_optimizer(;
scs_optimizer(;
eps = 1e-8,
max_iters = 20_000,
accel = 50,
accel = 0,
alpha = 1.9,
),
)

View File

@ -8,11 +8,11 @@ using SparseArrays
end
@testset "unit tests" begin
@test PropertyT.isopposite(PG.perm"(1,2,3)(4)", PG.perm"(1,4,2)")
@test PropertyT.isadjacent(PG.perm"(1,2,3)", PG.perm"(1,2)(3)")
@test PropertyT.isopposite(perm"(1,2,3)(4)", perm"(1,4,2)")
@test PropertyT.isadjacent(perm"(1,2,3)", perm"(1,2)(3)")
@test !PropertyT.isopposite(PG.perm"(1,2,3)", PG.perm"(1,2)(3)")
@test !PropertyT.isadjacent(PG.perm"(1,4)", PG.perm"(2,3)(4)")
@test !PropertyT.isopposite(perm"(1,2,3)", perm"(1,2)(3)")
@test !PropertyT.isadjacent(perm"(1,4)", perm"(2,3)(4)")
@test isconstant_on_orbit([1, 1, 1, 2, 2], [2, 3])
@test !isconstant_on_orbit([1, 1, 1, 2, 2], [2, 3, 4])
@ -29,19 +29,19 @@ using SparseArrays
RG(length(S)) - sum(RG(s) for s in S)
end
P = PG.PermGroup(PG.perm"(1,2)", PG.Perm(circshift(1:N, -1)))
Σ = Groups.Constructions.WreathProduct(PG.PermGroup(PG.perm"(1,2)"), P)
P = PermGroup(perm"(1,2)", Perm(circshift(1:N, -1)))
Σ = PropertyT.Constructions.WreathProduct(PermGroup(perm"(1,2)"), P)
act = PropertyT.action_by_conjugation(G, Σ)
wd = SW.WedderburnDecomposition(
wd = WedderburnDecomposition(
Float64,
Σ,
act,
SA.basis(RG),
SA.Basis{UInt16}(@view SA.basis(RG)[1:sizes[2]]),
basis(RG),
StarAlgebras.Basis{UInt16}(@view basis(RG)[1:sizes[2]]),
)
@info wd
ivs = SW.invariant_vectors(wd)
ivs = SymbolicWedderburn.invariant_vectors(wd)
sq, adj, op = PropertyT.SqAdjOp(RG, N)
@ -105,16 +105,16 @@ end
Δ = RG(length(S)) - sum(RG(s) for s in S)
P = PG.PermGroup(PG.perm"(1,2)", PG.Perm(circshift(1:n, -1)))
Σ = Groups.Constructions.WreathProduct(PG.PermGroup(PG.perm"(1,2)"), P)
P = PermGroup(perm"(1,2)", Perm(circshift(1:n, -1)))
Σ = PropertyT.Constructions.WreathProduct(PermGroup(perm"(1,2)"), P)
act = PropertyT.action_by_conjugation(G, Σ)
wd = SW.WedderburnDecomposition(
wd = SymbolicWedderburn.WedderburnDecomposition(
Float64,
Σ,
act,
SA.basis(RG),
SA.Basis{UInt16}(@view SA.basis(RG)[1:sizes[2]]),
basis(RG),
StarAlgebras.Basis{UInt16}(@view basis(RG)[1:sizes[2]]),
)
@info wd
@ -130,7 +130,7 @@ end
wd;
upper_bound = UB,
halfradius = 2,
optimizer = scs_optimizer(; accel = -50, alpha = 1.9),
optimizer = cosmo_optimizer(; accel = 50, alpha = 1.9),
)
@test status == JuMP.OPTIMAL
@test certified
@ -156,7 +156,7 @@ end
m, _ = PropertyT.sos_problem_primal(elt, wd)
PropertyT.solve(
m,
scs_optimizer(; max_iters = 1000, accel = 50, alpha = 1.9),
scs_optimizer(; max_iters = 5000, accel = 50, alpha = 1.9),
)
@test JuMP.termination_status(m) in
@ -193,16 +193,16 @@ end
Δ = RG(length(S)) - sum(RG(s) for s in S)
P = PG.PermGroup(PG.perm"(1,2)", PG.Perm(circshift(1:n, -1)))
Σ = Groups.Constructions.WreathProduct(PG.PermGroup(PG.perm"(1,2)"), P)
P = PermGroup(perm"(1,2)", Perm(circshift(1:n, -1)))
Σ = PropertyT.Constructions.WreathProduct(PermGroup(perm"(1,2)"), P)
act = PropertyT.action_by_conjugation(G, Σ)
wd = SW.WedderburnDecomposition(
wd = SymbolicWedderburn.WedderburnDecomposition(
Float64,
Σ,
act,
SA.basis(RG),
SA.Basis{UInt16}(@view SA.basis(RG)[1:sizes[2]]),
basis(RG),
StarAlgebras.Basis{UInt16}(@view basis(RG)[1:sizes[2]]),
)
@info wd

View File

@ -20,10 +20,8 @@ end
end
@testset "Exceptional root systems" begin
Base.:^(t::NTuple{N}, p::PG.AbstractPermutation) where {N} =
ntuple(i -> t[i^p], N)
@testset "F4" begin
F4 = let Σ = PG.PermGroup(PG.perm"(1,2,3,4)", PG.perm"(1,2)")
F4 = let Σ = PermutationGroups.PermGroup(perm"(1,2,3,4)", perm"(1,2)")
long = let x = (1, 1, 0, 0) .// 1
PropertyT.Roots.Root.(
union(
@ -52,7 +50,7 @@ end
a = F4[1]
@test isapprox(PropertyT.Roots.₂length(a), sqrt(2))
b = F4[4]
b = F4[6]
@test isapprox(PropertyT.Roots.₂length(b), sqrt(2))
c = a + b
@test isapprox(PropertyT.Roots.₂length(c), 2.0)
@ -92,9 +90,9 @@ end
@testset "E6-7-8 exceptional root systems" begin
E8 =
let Σ = PG.PermGroup(
PG.perm"(1,2,3,4,5,6,7,8)",
PG.perm"(1,2)",
let Σ = PermutationGroups.PermGroup(
perm"(1,2,3,4,5,6,7,8)",
perm"(1,2)",
)
long = let x = (1, 1, 0, 0, 0, 0, 0, 0) .// 1
PropertyT.Roots.Root.(
@ -162,6 +160,7 @@ end
])
@test Set(keys(counts)) == subtypes
d, r = divrem(counts[:A₂], 4)
@info d, r
@test r == 0 && d == 10
end
end

View File

@ -1,5 +1,5 @@
function test_action(basis, group, act)
action = SW.action
action = SymbolicWedderburn.action
return @testset "action definition" begin
@test all(basis) do b
e = one(group)
@ -22,7 +22,7 @@ function test_action(basis, group, act)
g_h
end
action = SW.action
action = SymbolicWedderburn.action
@test action(act, g, a) in basis
@test action(act, h, a) in basis
@test action(act, h, action(act, g, a)) == action(act, g * h, a)
@ -33,7 +33,7 @@ function test_action(basis, group, act)
return x == y
end
if act isa SW.ByPermutations
if act isa SymbolicWedderburn.ByPermutations
@test all(basis) do b
return action(act, g, b) basis && action(act, h, b) basis
end
@ -50,73 +50,75 @@ end
RSL, S, sizes = PropertyT.group_algebra(SL; halfradius = 2)
@testset "Permutation action" begin
Γ = PG.PermGroup(PG.perm"(1,2)", PG.Perm(circshift(1:n, -1)))
Γ = PermGroup(perm"(1,2)", Perm(circshift(1:n, -1)))
ΓpA = PropertyT.action_by_conjugation(SL, Γ)
test_action(SA.basis(RSL), Γ, ΓpA)
test_action(basis(RSL), Γ, ΓpA)
@testset "mps is successful" begin
charsΓ =
SW.Character{
SymbolicWedderburn.Character{
Rational{Int},
}.(SW.irreducible_characters(Γ))
}.(SymbolicWedderburn.irreducible_characters(Γ))
= SW._group_algebra(Γ)
= SymbolicWedderburn._group_algebra(Γ)
@time mps, ranks =
SW.minimal_projection_system(charsΓ, )
SymbolicWedderburn.minimal_projection_system(charsΓ, )
@test all(isone, ranks)
end
@testset "Wedderburn decomposition" begin
wd = SW.WedderburnDecomposition(
wd = SymbolicWedderburn.WedderburnDecomposition(
Rational{Int},
Γ,
ΓpA,
SA.basis(RSL),
SA.Basis{UInt16}(@view SA.basis(RSL)[1:sizes[2]]),
basis(RSL),
StarAlgebras.Basis{UInt16}(@view basis(RSL)[1:sizes[2]]),
)
@test length(SW.invariant_vectors(wd)) == 918
@test size.(SW.direct_summands(wd), 1) == [23, 18, 40]
@test all(SW.issimple, SW.direct_summands(wd))
@test length(invariant_vectors(wd)) == 918
@test SymbolicWedderburn.size.(direct_summands(wd), 1) ==
[40, 23, 18]
@test all(issimple, direct_summands(wd))
end
end
@testset "Wreath action" begin
Γ = let P = PG.PermGroup(PG.perm"(1,2)", PG.Perm(circshift(1:n, -1)))
Groups.Constructions.WreathProduct(PG.PermGroup(PG.perm"(1,2)"), P)
Γ = let P = PermGroup(perm"(1,2)", Perm(circshift(1:n, -1)))
PropertyT.Constructions.WreathProduct(PermGroup(perm"(1,2)"), P)
end
ΓpA = PropertyT.action_by_conjugation(SL, Γ)
test_action(SA.basis(RSL), Γ, ΓpA)
test_action(basis(RSL), Γ, ΓpA)
@testset "mps is successful" begin
charsΓ =
SW.Character{
SymbolicWedderburn.Character{
Rational{Int},
}.(SW.irreducible_characters(Γ))
}.(SymbolicWedderburn.irreducible_characters(Γ))
= SW._group_algebra(Γ)
= SymbolicWedderburn._group_algebra(Γ)
@time mps, ranks =
SW.minimal_projection_system(charsΓ, )
SymbolicWedderburn.minimal_projection_system(charsΓ, )
@test all(isone, ranks)
end
@testset "Wedderburn decomposition" begin
wd = SW.WedderburnDecomposition(
wd = SymbolicWedderburn.WedderburnDecomposition(
Rational{Int},
Γ,
ΓpA,
SA.basis(RSL),
SA.Basis{UInt16}(@view SA.basis(RSL)[1:sizes[2]]),
basis(RSL),
StarAlgebras.Basis{UInt16}(@view basis(RSL)[1:sizes[2]]),
)
@test length(SW.invariant_vectors(wd)) == 247
@test size.(SW.direct_summands(wd), 1) == [9, 6, 14, 14, 12]
@test all(SW.issimple, SW.direct_summands(wd))
@test length(invariant_vectors(wd)) == 247
@test SymbolicWedderburn.size.(direct_summands(wd), 1) ==
[14, 9, 6, 14, 12]
@test all(issimple, direct_summands(wd))
end
end
end
@ -128,73 +130,75 @@ end
RSAutFn, S, sizes = PropertyT.group_algebra(SAutFn; halfradius = 1)
@testset "Permutation action" begin
Γ = PG.PermGroup(PG.perm"(1,2)", PG.Perm(circshift(1:n, -1)))
Γ = PermGroup(perm"(1,2)", Perm(circshift(1:n, -1)))
ΓpA = PropertyT.action_by_conjugation(SAutFn, Γ)
test_action(SA.basis(RSAutFn), Γ, ΓpA)
test_action(basis(RSAutFn), Γ, ΓpA)
@testset "mps is successful" begin
charsΓ =
SW.Character{
SymbolicWedderburn.Character{
Rational{Int},
}.(SW.irreducible_characters(Γ))
}.(SymbolicWedderburn.irreducible_characters(Γ))
= SW._group_algebra(Γ)
= SymbolicWedderburn._group_algebra(Γ)
@time mps, ranks =
SW.minimal_projection_system(charsΓ, )
SymbolicWedderburn.minimal_projection_system(charsΓ, )
@test all(isone, ranks)
end
@testset "Wedderburn decomposition" begin
wd = SW.WedderburnDecomposition(
wd = SymbolicWedderburn.WedderburnDecomposition(
Rational{Int},
Γ,
ΓpA,
SA.basis(RSAutFn),
SA.Basis{UInt16}(@view SA.basis(RSAutFn)[1:sizes[1]]),
basis(RSAutFn),
StarAlgebras.Basis{UInt16}(@view basis(RSAutFn)[1:sizes[1]]),
)
@test length(SW.invariant_vectors(wd)) == 93
@test size.(SW.direct_summands(wd), 1) == [5, 4, 8, 4]
@test all(SW.issimple, SW.direct_summands(wd))
@test length(invariant_vectors(wd)) == 93
@test SymbolicWedderburn.size.(direct_summands(wd), 1) ==
[4, 8, 5, 4]
@test all(issimple, direct_summands(wd))
end
end
@testset "Wreath action" begin
Γ = let P = PG.PermGroup(PG.perm"(1,2)", PG.Perm(circshift(1:n, -1)))
Groups.Constructions.WreathProduct(PG.PermGroup(PG.perm"(1,2)"), P)
Γ = let P = PermGroup(perm"(1,2)", Perm(circshift(1:n, -1)))
PropertyT.Constructions.WreathProduct(PermGroup(perm"(1,2)"), P)
end
ΓpA = PropertyT.action_by_conjugation(SAutFn, Γ)
test_action(SA.basis(RSAutFn), Γ, ΓpA)
test_action(basis(RSAutFn), Γ, ΓpA)
@testset "mps is successful" begin
charsΓ =
SW.Character{
SymbolicWedderburn.Character{
Rational{Int},
}.(SW.irreducible_characters(Γ))
}.(SymbolicWedderburn.irreducible_characters(Γ))
= SW._group_algebra(Γ)
= SymbolicWedderburn._group_algebra(Γ)
@time mps, ranks =
SW.minimal_projection_system(charsΓ, )
SymbolicWedderburn.minimal_projection_system(charsΓ, )
@test all(isone, ranks)
end
@testset "Wedderburn decomposition" begin
wd = SW.WedderburnDecomposition(
wd = SymbolicWedderburn.WedderburnDecomposition(
Rational{Int},
Γ,
ΓpA,
SA.basis(RSAutFn),
SA.Basis{UInt16}(@view SA.basis(RSAutFn)[1:sizes[1]]),
basis(RSAutFn),
StarAlgebras.Basis{UInt16}(@view basis(RSAutFn)[1:sizes[1]]),
)
@test length(SW.invariant_vectors(wd)) == 18
@test size.(SW.direct_summands(wd), 1) == [2, 1, 2, 1, 2, 1, 1, 2]
@test all(SW.issimple, SW.direct_summands(wd))
@test length(invariant_vectors(wd)) == 18
@test SymbolicWedderburn.size.(direct_summands(wd), 1) ==
[1, 1, 2, 2, 1, 2, 2, 1]
@test all(issimple, direct_summands(wd))
end
end
end

View File

@ -29,7 +29,7 @@ function check_positivity(
halfradius = 2,
optimizer,
)
@assert SA.aug(elt) == SA.aug(unit) == 0
@assert aug(elt) == aug(unit) == 0
@time sos_problem, Ps =
PropertyT.sos_problem_primal(elt, unit, wd; upper_bound = upper_bound)

View File

@ -4,7 +4,7 @@
p = 7
halfradius = 3
G = MatrixGroups.SpecialLinearGroup{N}(
SW.Characters.FiniteFields.GF{p},
SymbolicWedderburn.Characters.FiniteFields.GF{p},
)
RG, S, sizes = PropertyT.group_algebra(G; halfradius = 3)
@ -22,11 +22,11 @@
unit;
upper_bound = ub,
halfradius = 2,
optimizer = scs_optimizer(;
eps = 1e-8,
max_iters = 20_000,
accel = -50,
alpha = 1.9,
optimizer = cosmo_optimizer(;
eps = 1e-7,
max_iters = 5_000,
accel = 50,
alpha = 1.95,
),
)
@ -37,34 +37,32 @@
m = PropertyT.sos_problem_dual(elt, unit)
PropertyT.solve(
m,
scs_optimizer(;
eps = 1e-8,
cosmo_optimizer(;
eps = 1e-7,
max_iters = 10_000,
accel = -50,
alpha = 1.9,
accel = 50,
alpha = 1.95,
),
)
@test JuMP.termination_status(m) in
(JuMP.ALMOST_OPTIMAL, JuMP.OPTIMAL)
@test JuMP.objective_value(m)
PropertyT.IntervalArithmetic.mid(λ_cert) atol = 1e-2
@test JuMP.objective_value(m) λ_cert atol = 1e-2
end
@testset "Wedderburn decomposition" begin
P = PG.PermGroup(PG.perm"(1,2)", PG.Perm(circshift(1:N, -1)))
Σ = Groups.Constructions.WreathProduct(
PG.PermGroup(PG.perm"(1,2)"),
P,
)
P = PermGroup(perm"(1,2)", Perm(circshift(1:N, -1)))
Σ = PropertyT.Constructions.WreathProduct(PermGroup(perm"(1,2)"), P)
act = PropertyT.action_by_conjugation(G, Σ)
wd = SW.WedderburnDecomposition(
wd = WedderburnDecomposition(
Float64,
Σ,
act,
SA.basis(RG),
SA.Basis{UInt16}(@view SA.basis(RG)[1:sizes[halfradius]]),
basis(RG),
StarAlgebras.Basis{UInt16}(
@view basis(RG)[1:sizes[halfradius]]
),
)
status, certified, λ_cert = check_positivity(
@ -73,10 +71,10 @@
wd;
upper_bound = ub,
halfradius = 2,
optimizer = scs_optimizer(;
eps = 1e-8,
optimizer = cosmo_optimizer(;
eps = 1e-7,
max_iters = 10_000,
accel = -50,
accel = 50,
alpha = 1.9,
),
)

View File

@ -3,18 +3,19 @@ using LinearAlgebra
using SparseArrays
using Groups
using Groups.GroupsCore
import Groups.MatrixGroups
using PropertyT
import SymbolicWedderburn as SW
import StarAlgebras as SA
import PermutationGroups as PG
using SymbolicWedderburn
using SymbolicWedderburn.StarAlgebras
using SymbolicWedderburn.PermutationGroups
include("optimizers.jl")
include("check_positivity.jl")
include("quick_tests.jl")
if haskey(ENV, "CI")
if haskey(ENV, "FULL_TEST") || haskey(ENV, "CI")
@testset "PropertyT" begin
include("constratint_matrices.jl")
include("actions.jl")