add functions to decompose vector in invariant basis

This commit is contained in:
Marek Kaluba 2023-10-06 14:20:34 +02:00
parent 5f54ecb515
commit 9434f5999d
No known key found for this signature in database
GPG Key ID: 8BF1A3855328FC15
1 changed files with 34 additions and 0 deletions

View File

@ -36,6 +36,40 @@ function sos_problem_dual(
return model
end
function decompose(
elt::StarAlgebras.AlgebraElement,
wd::WedderburnDecomposition,
)
v = StarAlgebras.coeffs(elt)
cfs, error = decompose(v, invariant_vectors(wd))
_eps = length(v) * eps(typeof(error))
error < _eps || @warn "elt does not seem to be invariant" error
return cfs
end
function decompose(v::AbstractVector, invariant_vecs)
# TODO: eltype for current, res ?
current = similar(v, Float64)
current .= 0.0
res = SparseArrays.spzeros(length(invariant_vecs))
_eps = length(current) * eps(eltype(res))
diff = zero(current)
for (i, iv) in enumerate(invariant_vecs)
cf = dot(v, iv) / dot(iv, iv)
if !iszero(cf)
res[i] = cf
current .+= cf .* iv
diff .= current .- v
if norm(diff) < _eps
break
end
end
end
return res, norm(current - v)
end
"""
sos_problem_primal(X, [u = zero(X); upper_bound=Inf])
Formulate sum of squares decomposition problem for `X - λ·u`.