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: circuits(M)
[(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)]

Case \(0 < \mu < 1\)

We compute the nonnegative circuits of the corresponding oriented matroid:

sage: forget()
sage: assume(mu > 0, mu < 1)
sage: om = OrientedMatroid(M)
sage: nn_om_circuits = [c for c in om.circuits() if c >= 0]
sage: nn_om_circuits
[(+0++00000++0), (+0++0+0+00++), (0000+0+++00+), (0+0++0++00++)]

Using their support, we find the nonnegative circuits (of the matrix):

sage: supports = [c.support() for c in nn_om_circuits]
sage: [c for c in circuits(M) if c.support() in supports]
[(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\)

We compute the nonnegative circuits of the corresponding oriented matroid:

sage: forget()
sage: assume(mu > 1, mu < 2)
sage: om = OrientedMatroid(M)
sage: nn_om_circuits = [c for c in om.circuits() if c >= 0]
sage: nn_om_circuits
[(++++++++0+00), (++++++++000+), (+++++++++000), (++++++++00+0)]

Using their support, we find the nonnegative circuits (of the matrix):

sage: supports = [c.support() for c in nn_om_circuits]
sage: [c for c in circuits(M) if c.support() in supports]
[(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\)

We compute the nonnegative circuits of the corresponding oriented matroid:

sage: om = OrientedMatroid(M(mu=1))
sage: nn_om_circuits = [c for c in om.circuits() if c >= 0]
sage: nn_om_circuits
[(0000+0+++000), (+0++00000+00), (0+0++0++00+0), (+0++0+0+000+)]

Using their support, we find the nonnegative circuits (of the matrix):

sage: supports = [c.support() for c in nn_om_circuits]
sage: [c for c in circuits(M(mu=1)) if c.support() in supports]
[(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)]