Correlative sparsity

If the variables couple only in small groups (a chain, a grid, a network with layers), the single big moment block can be replaced by one smaller block per clique of the correlative-sparsity graph. The relaxation is weaker or equal to the dense one and far cheaper.

import moment_sos as po

n = 8
x = po.variables(n)
f = sum(x[i]*x[i+1] - 0.5*x[i]**2*x[i+1]**2 for i in range(n - 1))      # chain
problem = po.Problem(f, [], sense="max", box=(-1, 1))
print(po.correlative_sparsity_cliques(problem))

dense = po.solve(problem, order=2, cliques="dense")
sparse = po.solve(problem, order=2, cliques="auto")
print(dense.bound, sparse.bound)

cliques accepts "dense" (one clique), "auto" (maximal cliques of a min-fill-in chordal extension of the correlative-sparsity graph) or an explicit list of index lists. Two requirements, checked with clear error messages:

  • every constraint must involve variables from a single clique;

  • every objective monomial must be a product of two monomials of one clique.

Term sparsity

term_sparsity=k additionally splits each clique’s moment block into overlapping sub-blocks (TSSOS-style): a graph on the monomial basis connects two monomials when their product occurs in the support (objective monomials and the products arising from the constraints); the blocks are the maximal cliques of a chordal extension, and k iterations of the support closure refine them ("max" iterates until the blocks stop changing).

import moment_sos as po

n = 8
s = po.variables(n)
edges = [(i, (i + 1) % n) for i in range(n)] + [(0, 4)]
problem = po.Problem(sum((1 - s[i]*s[j]) / 2 for i, j in edges), boolean=True)

dense = po.Relaxation(problem, 2)
sparse = po.Relaxation(problem, 2, term_sparsity=1)
print(max(dense.sizes()), "->", max(sparse.sizes()), "largest block;", len(sparse.blocks), "blocks")
assert max(sparse.sizes()) < max(dense.sizes())

res = po.solve(problem, order=2, term_sparsity=1)
print(res.bound)

What is guaranteed: the bound is valid for any block structure (the certificate only needs the polynomial identity and the norm bound of each sub-basis). What is not guaranteed: the relaxation is weaker than the dense (or the correlatively-sparse) one, and more closure steps tighten it. Warm start is switched off, and only moment blocks are split (localizing blocks keep their clique size).

Warning

Term sparsity did not pay off on the problems we tried. On MAX-CUT with random \(\pm1\) weights on a \(6\times6\) torus (\(n=36\), best cut 30; raw output in research/experiments/results/term_sparsity_torus6.txt), order 2:

relaxation

blocks (largest)

bound

time

dense

1 (667)

30.339

156 s

correlative sparsity

24 (92)

30.204

28 s

term sparsity, 1 step

422 (212)

33.853

302 s (time limit)

correlative + term, 1 step

566 (5)

34.715

67 s

correlative + term, 2 steps

440 (9)

32.036

77 s

correlative + term, until stable

404 (11)

32.019

53 s

Only the first two certify the optimum (\(\lfloor U\rfloor=30\)). Term sparsity gives tiny blocks but a much weaker bound, and with hundreds of overlapping blocks the smoothing solver is not faster. (The dense value 30.339 is above the correlative one, 30.204, although the dense relaxation is the tighter of the two: the dense run had not converged to solver accuracy.) Use correlative sparsity first; try term sparsity on problems whose objective and constraints have very few monomials relative to the basis, and compare the bound before trusting the speed-up.