CHSH

Contributed by: Marek Kaluba and Benoît Legat Adapted from: Talk at JuMP-dev 2024

The goal of this tutorial is to show how to use SumOfSquares.jl with a custom algebra that is not defined with DynamicPolynomials or TypedPolynomials. Even though some part of SumOfSquares.jl only works for monomials defined by these packages, there is an effort to abstract away as much as possible on top of StarAlgebras.

This illustrate this, in this tutorial, we are doing to define a custom monoid structure implementing the rewriting rules of the CHSH inequality using KnuthBendix.

using SumOfSquares
include(joinpath(dirname(dirname(pathof(SumOfSquares))), "examples", "monoids.jl"))

import StarAlgebras as SA
import KnuthBendix as KB
import GroupsCore

The rewriting rule are as follows:

monoid, A, C = trace_monoid(2, 2, A=:A, C=:C)
monoid.rws
reduced, confluent rewriting system with 8 active rules.
rewriting ordering: LenLex: A1 < A2 < C1 < C2
┌──────┬──────────────────────────────────┬──────────────────────────────────┐
│ Rule │                              lhs │ rhs                              │
├──────┼──────────────────────────────────┼──────────────────────────────────┤
│    1 │                             A1^2 │ (id)                             │
│    2 │                             A2^2 │ (id)                             │
│    3 │                            C1*A1 │ A1*C1                            │
│    4 │                            C1*A2 │ A2*C1                            │
│    5 │                             C1^2 │ (id)                             │
│    6 │                            C2*A1 │ A1*C2                            │
│    7 │                            C2*A2 │ A2*C2                            │
│    8 │                             C2^2 │ (id)                             │
└──────┴──────────────────────────────────┴──────────────────────────────────┘

We now define a StarAlgebra from StarAlgebras

RM = let monoid = monoid, A = A, C = C, level = 4
    A_l, sizesA = Monoids.wlmetric_ball(A, radius=level)
    C_l, sizesC = Monoids.wlmetric_ball(C, radius=level)
    @time words, sizes = Monoids.wlmetric_ball(
        unique!([a * c for a in A_l for c in C_l]);
        radius=2,
    )
    @info "Sizes of generated balls:" (A, C, combined) =
        (sizesA, sizesC, sizes)
    basis = SA.FixedBasis(words)
    dirac = SA.DiracMStructure(basis, *)
    table = SA.MTable(dirac, (sizes[1], sizes[1]))
    SA.StarAlgebra(monoid, table)
end
*-algebra of monoid with 8 relations over Alphabet{Symbol}: [:A1, :A2, :C1, :C2]

We can convert a monoid element:

A[1], typeof(A[1])
(A1, Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}})

to an element of the algebra RM (so essentially 1 ⋅ A) as follows:

RM(A[1])

\[ 1 \cdot A1 \]

Then, we can do arithmetic on these algebra element to form the CHSH inequality:

chsh = let A = RM.(A), C = RM.(C)
    A[1] * C[1] + A[1] * C[2] + A[2] * C[1] - A[2] * C[2]
end

\[ 1 \cdot A1·C1 + 1 \cdot A1·C2 + 1 \cdot A2·C1 - 1 \cdot A2·C2 \]

SumOfSquares needs the ambient implicit basis containing all the monoid elements so we define it as follows:

struct Full{B} <: SA.ImplicitBasis{B,B} end
Base.in(::B, ::Full{B}) where {B} = true
Base.getindex(::Full{B}, b::B) where {B} = b
import MultivariateBases as MB
MB.implicit_basis(::SA.FixedBasis{B}) where {B} = Full{B}()
function MB.algebra(b::Full{B}) where {B}
    return SA.StarAlgebra(monoid, SA.DiracMStructure(b, *))
end
SA.comparable(::Full) = isless

The chsh polynomial can be rewritten in this basis as follows:

f = SA.AlgebraElement(
    SA.SparseCoefficients(
        [SA.basis(chsh)[k] for (k, _) in SA.nonzero_pairs(SA.coeffs(chsh))],
        [v for (_, v) in SA.nonzero_pairs(SA.coeffs(chsh))],
    ),
    MB.algebra(Full{eltype(SA.basis(chsh))}()),
)

\[ 1 \cdot A1·C1 + 1 \cdot A1·C2 + 1 \cdot A2·C1 - 1 \cdot A2·C2 \]

We pick the SCS solver:

import SCS
scs = optimizer_with_attributes(
    SCS.Optimizer,
    "eps_abs" => 1e-9,
    "eps_rel" => 1e-9,
    "max_iters" => 1000,
)
MathOptInterface.OptimizerWithAttributes(SCS.Optimizer, Pair{MathOptInterface.AbstractOptimizerAttribute, Any}[MathOptInterface.RawOptimizerAttribute("eps_abs") => 1.0e-9, MathOptInterface.RawOptimizerAttribute("eps_rel") => 1.0e-9, MathOptInterface.RawOptimizerAttribute("max_iters") => 1000])

We currently need to manually add all SumOfSquares bridges as follows:

model = Model(scs)
SumOfSquares.Bridges.add_all_bridges(backend(model).optimizer, Float64)
@variable(model, λ)
@objective(model, Min, λ)

\[ λ \]

Adding the SumOfSquares constraint is currently not as user-friendly than with monomials:

n = size(SA.mstructure(RM).table, 1)
gram_basis = SA.FixedBasis(SA.basis(chsh).elts[1:n])
cone = SumOfSquares.WeightedSOSCone{MOI.PositiveSemidefiniteConeTriangle}(
    SA.basis(chsh),
    [gram_basis],
    [one(f)],
)
@constraint(model, SA.coeffs(λ * one(f) - f, SA.basis(chsh)) in cone);

optimize!(model)
solution_summary(model)
objective_value(model) ≈ 2√2
true

Let's look at the size of the generated SDP:

function _add!(f, psd, model, F, S)
    return append!(
        psd,
        [
            f(MOI.get(model, MOI.ConstraintSet(), ci)) for
            ci in MOI.get(model, MOI.ListOfConstraintIndices{F,S}())
        ],
    )
end
function summary(model)
    free = MOI.get(model, MOI.NumberOfVariables())
    psd = Int[]
    F = MOI.VectorOfVariables
    S = MOI.PositiveSemidefiniteConeTriangle
    _add!(MOI.side_dimension, psd, model, F, S)
    S = SCS.ScaledPSDCone
    _add!(MOI.side_dimension, psd, model, F, S)
    free -= sum(psd, init=0) do d
        return div(d * (d + 1), 2)
    end
    F = MOI.VectorAffineFunction{Float64}
    S = MOI.PositiveSemidefiniteConeTriangle
    _add!(MOI.side_dimension, psd, model, F, S)
    S = SCS.ScaledPSDCone
    _add!(MOI.side_dimension, psd, model, F, S)
    eq = Int[]
    F = MOI.VectorAffineFunction{Float64}
    S = MOI.Zeros
    _add!(MOI.dimension, eq, model, F, S)
    F = MOI.ScalarAffineFunction{Float64}
    S = MOI.EqualTo{Float64}
    _add!(MOI.dimension, eq, model, F, S)
    println(
        "$free free variables, $(sum(eq, init = 0)) equality constraints, PSD block sizes: $psd",
    )
    return
end
summary(backend(model).optimizer.model)
3051 free variables, 18 equality constraints, PSD block sizes: [81]

We can see that the FreeBridge was used because SCS supports free variables and affine-in-PSD constraints.

print_active_bridges(model)
 * Unsupported objective: MOI.VariableIndex
 |  bridged by:
 |   MOIB.Objective.FunctionConversionBridge{Float64, MOI.ScalarAffineFunction{Float64}, MOI.VariableIndex}
 |  may introduce:
 |   * Supported objective: MOI.ScalarAffineFunction{Float64}
 * Unsupported constraint: MOI.VectorAffineFunction{Float64}-in-SumOfSquares.WeightedSOSCone{MOI.PositiveSemidefiniteConeTriangle, StarAlgebras.FixedBasis{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Int64, Vector{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}}, StarAlgebras.FixedBasis{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Int64, Vector{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}}, StarAlgebras.AlgebraElement{Int64, StarAlgebras.StarAlgebra{Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}, Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, StarAlgebras.DiracMStructure{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Main.Full{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}, typeof(*)}}, StarAlgebras.SparseCoefficients{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Int64, Vector{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}, Vector{Int64}, typeof(isless)}}}
 |  bridged by:
 |   SumOfSquares.Bridges.Constraint.ImageBridge{Float64, MOI.VectorAffineFunction{Float64}, MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle}
 |  may introduce:
 |   * Unsupported constraint: MOI.VectorAffineFunction{Float64}-in-SumOfSquares.EmptyCone
 |   |  bridged by:
 |   |   SumOfSquares.Bridges.Constraint.EmptyBridge{Float64, MOI.VectorAffineFunction{Float64}}
 |   |  may introduce:
 |   * Supported constraint: MOI.VectorAffineFunction{Float64}-in-MOI.Nonnegatives
 |   * Unsupported constraint: MOI.VectorAffineFunction{Float64}-in-SumOfSquares.PositiveSemidefinite2x2ConeTriangle
 |   |  bridged by:
 |   |   SumOfSquares.Bridges.Constraint.PositiveSemidefinite2x2Bridge{Float64, MOI.VectorAffineFunction{Float64}}
 |   |  may introduce:
 |   |   * Unsupported constraint: MOI.VectorAffineFunction{Float64}-in-MOI.RotatedSecondOrderCone
 |   |   |  bridged by:
 |   |   |   MOIB.Constraint.RSOCtoSOCBridge{Float64, MOI.VectorAffineFunction{Float64}, MOI.VectorAffineFunction{Float64}}
 |   |   |  may introduce:
 |   |   |   * Supported constraint: MOI.VectorAffineFunction{Float64}-in-MOI.SecondOrderCone
 |   * Unsupported constraint: MOI.VectorAffineFunction{Float64}-in-MOI.PositiveSemidefiniteConeTriangle
 |   |  bridged by:
 |   |   MOIB.Constraint.SetDotScalingBridge{Float64, MOI.PositiveSemidefiniteConeTriangle, MOI.VectorAffineFunction{Float64}, MOI.VectorAffineFunction{Float64}}
 |   |  may introduce:
 |   |   * Unsupported constraint: MOI.VectorAffineFunction{Float64}-in-MOI.Scaled{MOI.PositiveSemidefiniteConeTriangle}
 |   |   |  bridged by:
 |   |   |   SCS.ScaledPSDConeBridge{Float64, MOI.VectorAffineFunction{Float64}}
 |   |   |  may introduce:
 |   |   |   * Supported constraint: MOI.VectorAffineFunction{Float64}-in-SCS.ScaledPSDCone
 |   * Supported constraint: MOI.VectorAffineFunction{Float64}-in-MOI.Zeros
 |   * Supported variable: MOI.Reals

As a workaround for this MOI issue, we need to remove the Image bridge

import Dualization
model = Model(Dualization.dual_optimizer(scs))
SumOfSquares.Bridges.add_all_bridges(backend(model).optimizer, Float64)
MOI.Bridges.remove_bridge(
    backend(model).optimizer,
    SumOfSquares.Bridges.Constraint.ImageBridge{Float64},
)
@variable(model, λ)
@objective(model, Min, λ)
@constraint(model, SA.coeffs(λ * one(f) - f, SA.basis(chsh)) in cone);
optimize!(model)
solution_summary(model)
objective_value(model) ≈ 2√2
true

The model is much smaller this time, with 289 equality constraints and 1 free variable.

summary(backend(model).optimizer.model)
1 free variables, 289 equality constraints, PSD block sizes: [81]

After dualization that is 289 free variables and 1 equality constraints. This is a big improvement compared to the 3051 free variables, 18 equality constraints without dualization.

summary(backend(model).optimizer.model.optimizer.dual_problem.dual_model)
289 free variables, 1 equality constraints, PSD block sizes: [81]

We can see that the bridge used is the KernelBridge this time.

print_active_bridges(model)
 * Supported objective: MOI.VariableIndex
 * Unsupported constraint: MOI.VectorAffineFunction{Float64}-in-SumOfSquares.WeightedSOSCone{MOI.PositiveSemidefiniteConeTriangle, StarAlgebras.FixedBasis{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Int64, Vector{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}}, StarAlgebras.FixedBasis{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Int64, Vector{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}}, StarAlgebras.AlgebraElement{Int64, StarAlgebras.StarAlgebra{Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}, Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, StarAlgebras.DiracMStructure{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Main.Full{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}, typeof(*)}}, StarAlgebras.SparseCoefficients{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Int64, Vector{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}, Vector{Int64}, typeof(isless)}}}
 |  bridged by:
 |   MOIB.Constraint.VectorSlackBridge{Float64, MOI.VectorAffineFunction{Float64}, SumOfSquares.WeightedSOSCone{MOI.PositiveSemidefiniteConeTriangle, StarAlgebras.FixedBasis{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Int64, Vector{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}}, StarAlgebras.FixedBasis{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Int64, Vector{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}}, StarAlgebras.AlgebraElement{Int64, StarAlgebras.StarAlgebra{Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}, Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, StarAlgebras.DiracMStructure{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Main.Full{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}, typeof(*)}}, StarAlgebras.SparseCoefficients{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Int64, Vector{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}, Vector{Int64}, typeof(isless)}}}}
 |  may introduce:
 |   * Supported constraint: MOI.VectorAffineFunction{Float64}-in-MOI.Zeros
 |   * Unsupported variable: SumOfSquares.WeightedSOSCone{MOI.PositiveSemidefiniteConeTriangle, StarAlgebras.FixedBasis{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Int64, Vector{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}}, StarAlgebras.FixedBasis{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Int64, Vector{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}}, StarAlgebras.AlgebraElement{Int64, StarAlgebras.StarAlgebra{Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}, Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, StarAlgebras.DiracMStructure{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Main.Full{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}, typeof(*)}}, StarAlgebras.SparseCoefficients{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}, Int64, Vector{Main.Monoids.MonoidElement{UInt16, Main.Monoids.Monoid{UInt16, KnuthBendix.Alphabet{Symbol}, KnuthBendix.RewritingSystem{KnuthBendix.Words.Word{UInt16}, KnuthBendix.LenLex{Symbol}}}}}, Vector{Int64}, typeof(isless)}}}
 |   |  bridged by:
 |   |    SumOfSquares.Bridges.Variable.KernelBridge{Float64, MOI.PositiveSemidefiniteConeTriangle}
 |   |  may introduce:
 |   |   * Unsupported variable: SumOfSquares.EmptyCone
 |   |   |  adding as constraint:
 |   |   |   * Supported variable: MOI.Reals
 |   |   |   * Unsupported constraint: MOI.VectorOfVariables-in-SumOfSquares.EmptyCone
 |   |   |   |  bridged by:
 |   |   |   |   SumOfSquares.Bridges.Constraint.EmptyBridge{Float64, MOI.VectorOfVariables}
 |   |   |   |  may introduce:
 |   |   * Supported variable: MOI.Nonnegatives
 |   |   * Unsupported variable: SumOfSquares.PositiveSemidefinite2x2ConeTriangle
 |   |   |  bridged by:
 |   |   |    SumOfSquares.Bridges.Variable.PositiveSemidefinite2x2Bridge{Float64}
 |   |   |  may introduce:
 |   |   |   * Supported variable: MOI.RotatedSecondOrderCone
 |   |   * Supported variable: MOI.PositiveSemidefiniteConeTriangle

We didn't test using the ImageBridge with dualization or using the KernelBridge without dualization. However, these will always produce larger models, which is why the choice o bridge can be need automatically once you choose whether you want to dualize the problem or not.


This page was generated using Literate.jl.