SONC Relaxations¶
The module sonc.py implements constrained SONC relaxations as geometric programs.
Formulation Focus¶
The implementation follows the Section 3 constrained SONC structure used in this project and supports the Example 3.3 workflow in the repository examples.
The central transformed object is:
For each relevant exponent term, the model introduces auxiliary variables and constraints that bound positive and negative parts of coefficients and connect them through barycentric weights.
For each \(\beta\) in the active delta set and each support point \(\alpha(j)\), the implementation uses the standard constrained SONC pattern with variables \(a_{\beta,j}\), \(b_\beta\), and multipliers \(\mu\). To align with the Section 3 constrained formulation (equation (3.3)), the key families implemented in code are:
Variable Roles¶
\(\mu\): Lagrange-style multipliers combining objective and constraints through \(G(\mu)\).
\(a_{\beta,j}\): circuit weights attached to support points for each active \(\beta\).
\(b_\beta\): auxiliary upper bounds controlling positive and negative parts of \(G(\mu)_\beta\).
(F1) support-point inequalities
(F2) circuit-product inequality
(F3) positive-part bound
(F4) negative-part bound
The GP objective minimized in this chapter is denoted by \(p(\mu, a, b)\), consistent with the Section 3 notation used by the constrained SONC formulation.
In implementation-oriented form, the objective can be read as:
This is the objective assembled in _build_objective after barycentric data
is available.
The barycentric weights \(\lambda^{(\beta)}\) are computed from support points via convex-combination routines before model assembly.
Branching on \(\lambda_0^{(\beta)}\)¶
The implementation distinguishes two geometric cases:
\(\lambda_0^{(\beta)} > 0\): objective includes a weighted exponential/product term for \(\beta\).
\(\lambda_0^{(\beta)} = 0\): circuit-product inequality (F2) controls \(b_\beta\) directly without the \(\lambda_0\) objective branch.
This split matches the constrained SONC structure implemented in the solver assembly pipeline.
Implementation Stages in SONCRelaxations¶
_build_delta_sets: collects candidate terms._build_support_points: computes support points/Newton vertices._build_beta_info: computes barycentric coordinates._initialize_variables: allocates variables for multipliers and circuit terms._build_constraintsand_build_objective: constructs the constrained GP.solve: solves and returns a lower bound.
Theory-to-Code Anchors¶
_build_delta_setscorresponds to active \(\beta\) extraction._build_support_pointsand_build_beta_infoprovide support vertices and barycentric weights \(\lambda^{(\beta)}\)._g_splitcomputes positive and negative parts of coefficients in \(G(\mu)\)._build_constraintsencodes the constrained SONC families._build_objectivebuilds the GP objective over \(\mu\), \(a\), and \(b\) terms.
Geometric Interpretation¶
At a high level, SONC uses support geometry to construct nonnegativity certificates from circuit-like structures rather than semidefinite moment matrices. Irene’s pipeline computes that geometry first, then injects it into the constrained GP model.
Repository Anchors¶
examples/SONCExample.py: minimal SONC run path.examples/SONCExample33.py: Section 3.3-style benchmark trace.tests/test_sonc_section3.py: checks for barycentric weights, setup, and solve behavior.