applications.ecxs_symbolic

ECXs symbolic example of [MPSZ25].

ECXs symbolic example

We compute the nonnegative circuits (elementary vectors) of a matrix with a parameter appearing in [MPSZ25].

The packages elementary_vectors and sign_vectors are required:

sage: from elementary_vectors import *
sage: from sign_vectors import *

We define a matrix with a parameter:

sage: var("mu")
mu
sage: M = matrix([[0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0],
....:             [0, 0, 1, 0, 0, -1, 0, 0, 0, -1, 0, 0],
....:             [1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
....:             [1, 1, 0, -mu, 0, 0, 0, 0, 0, 0, 0, 0],
....:             [0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0],
....:             [0, 0, 0, 0, 1, 1, 0, -mu, 0, 0, 0, 0],
....:             [-1, 0, 0, 1, 0, 0, 0, 0, 0, 0, -1, 0],
....:             [0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, -1]])
sage: M
[  0  -1   0   0   0   0   1   0  -1   0   0   0]
[  0   0   1   0   0  -1   0   0   0  -1   0   0]
[  1   0  -1   0   0   0   0   0   0   0   0   0]
[  1   1   0 -mu   0   0   0   0   0   0   0   0]
[  0   0   0   0   1   0  -1   0   0   0   0   0]
[  0   0   0   0   1   1   0 -mu   0   0   0   0]
[ -1   0   0   1   0   0   0   0   0   0  -1   0]
[  0   0   0   0  -1   0   0   1   0   0   0  -1]

We compute all circuits (of the matrix):

sage: elements = circuits(M)
sage: elements
[(mu - 1, mu^2 - 2*mu + 1, mu - 1, mu - 1, 1, mu - 1, 1, 1, -mu^2 + 2*mu, 0, 0, 0),
 (1, mu - 1, 1, 1, mu - 1, mu^2 - 2*mu + 1, mu - 1, mu - 1, 0, -mu^2 + 2*mu, 0, 0),
 (mu^2 - mu, mu, mu^2 - mu, mu, mu, mu^2 - mu, mu, mu, 0, 0, -mu^2 + 2*mu, 0),
 (mu, mu^2 - mu, mu, mu, mu^2 - mu, mu, mu^2 - mu, mu, 0, 0, 0, -mu^2 + 2*mu),
 (-1, -mu + 1, -1, -1, 0, 0, 0, 0, mu - 1, -1, 0, 0),
 (0, -mu, 0, -1, 0, 0, 0, 0, mu, 0, -1, 0),
 (-1, -mu + 1, -1, -1, 1, -1, 1, 0, mu, 0, 0, -1),
 (mu, 0, mu, 1, 0, 0, 0, 0, 0, mu, -mu + 1, 0),
 (1, mu - 1, 1, 1, mu - 1, -mu + 1, mu - 1, 0, 0, mu, 0, -mu + 1),
 (-mu, mu, -mu, 0, mu, -mu, mu, 0, 0, 0, mu, -mu),
 (mu, mu^2 - mu, mu, mu, 0, mu, 0, 1, -mu^2 + mu, 0, 0, 1),
 (0, 0, 0, 0, 0, mu^2 - mu, 0, mu - 1, 0, -mu^2 + mu, 0, mu - 1),
 (mu^2, 0, mu^2, mu, 0, mu^2, 0, mu, 0, 0, -mu^2 + mu, mu),
 (0, 0, 0, 0, mu, 0, mu, 1, mu, 0, 0, -mu + 1),
 (mu, mu^2 - mu, mu, mu, mu^2 - mu, 0, mu^2 - mu, mu - 1, 0, mu, 0, -mu^2 + 2*mu - 1),
 (0, mu^2, 0, mu, mu^2, 0, mu^2, mu, 0, 0, mu, -mu^2 + mu),
 (0, 0, 0, 0, 1, mu - 1, 1, 1, 1, -mu + 1, 0, 0),
 (mu - 1, -mu + 1, mu - 1, 0, 1, mu - 1, 1, 1, mu, 0, -mu + 1, 0),
 (1, -1, 1, 0, -1, -mu + 1, -1, -1, 0, mu, -1, 0),
 (-1, 1, -1, 0, 0, 0, 0, 0, -1, -1, 1, 0),
 (0, 0, 0, 0, -1, 1, -1, 0, -1, -1, 0, 1),
 (-mu, mu, -mu, 0, 0, -mu, 0, -1, -mu, 0, mu, -1),
 (-mu, mu, -mu, 0, mu, 0, mu, 1, 0, -mu, mu, -mu + 1),
 (0, mu, 0, 1, mu, mu^2 - mu, mu, mu, 0, -mu^2 + mu, 1, 0),
 (0, -mu, 0, -1, -mu, mu, -mu, 0, 0, -mu, -1, mu),
 (mu^2 - mu, 0, mu^2 - mu, mu - 1, mu, mu^2 - mu, mu, mu, mu, 0, -mu^2 + 2*mu - 1, 0),
 (mu, 0, mu, 1, -mu, mu, -mu, 0, -mu, 0, -mu + 1, mu)]

This module offers a utility function to filter for nonnegative vectors:

sage: from applications.ecxs_symbolic import non_negative_vectors

Case \(0 < \mu < 1\)

sage: assume(mu > 0, mu < 1)
sage: non_negative_vectors(elements)
[(mu, 0, mu, 1, 0, 0, 0, 0, 0, mu, -mu + 1, 0),
 (mu^2, 0, mu^2, mu, 0, mu^2, 0, mu, 0, 0, -mu^2 + mu, mu),
 (0, 0, 0, 0, mu, 0, mu, 1, mu, 0, 0, -mu + 1),
 (0, mu^2, 0, mu, mu^2, 0, mu^2, mu, 0, 0, mu, -mu^2 + mu)]

Case \(1 < \mu < 2\)

sage: forget()
sage: assume(mu > 1, mu < 2)
sage: non_negative_vectors(elements)
[(mu - 1, mu^2 - 2*mu + 1, mu - 1, mu - 1, 1, mu - 1, 1, 1, -mu^2 + 2*mu, 0, 0, 0),
 (1, mu - 1, 1, 1, mu - 1, mu^2 - 2*mu + 1, mu - 1, mu - 1, 0, -mu^2 + 2*mu, 0, 0),
 (mu^2 - mu, mu, mu^2 - mu, mu, mu, mu^2 - mu, mu, mu, 0, 0, -mu^2 + 2*mu, 0),
 (mu, mu^2 - mu, mu, mu, mu^2 - mu, mu, mu^2 - mu, mu, 0, 0, 0, -mu^2 + 2*mu)]

Case \(\mu = 1\)

sage: forget()
sage: non_negative_vectors(circuits(M(mu=1)))
[(0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0),
 (1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0),
 (0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0),
 (1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1)]

Functions

non_negative_vectors(vectors)

Return nonnegative vectors.

applications.ecxs_symbolic.non_negative_vectors(vectors: list[vector]) list[vector]

Return nonnegative vectors.

INPUT:

  • vectors – an iterable of vectors

OUTPUT:

Return all vectors that are nonnegative in each component. If a vector is nonpositive in each component, its negative is returned.

EXAMPLES:

sage: from applications.ecxs_symbolic import non_negative_vectors
sage: l = [vector([1, 1, 0, -1]), vector([0, 0, 0, 0]), vector([1, 0, 0, 1])]
sage: l
[(1, 1, 0, -1), (0, 0, 0, 0), (1, 0, 0, 1)]
sage: non_negative_vectors(l)
[(0, 0, 0, 0), (1, 0, 0, 1)]
sage: var("a")
a
sage: evs = [vector([0, 0, 1, 0, 0]), vector([0, 0, 0, 1, 0]), vector([-1, -a, 0, 0, a])]
sage: evs
[(0, 0, 1, 0, 0), (0, 0, 0, 1, 0), (-1, -a, 0, 0, a)]
sage: non_negative_vectors(evs)
...
UserWarning: Cannot determine sign of symbolic expression, using 0 instead.
[(0, 0, 1, 0, 0), (0, 0, 0, 1, 0), (1, a, 0, 0, -a)]
sage: assume(a > 0)
sage: non_negative_vectors(evs)
[(0, 0, 1, 0, 0), (0, 0, 0, 1, 0)]

TESTS:

sage: l = [vector([x, 0, 0])]
sage: non_negative_vectors(l)
[(x, 0, 0)]