====== Using polymake to Check Whether a Matroid is 1-Flowing ====== The original PDF version was written by [[https://research-repository.uwa.edu.au/en/persons/gordon-royle|Gordon Royle]]. Transformed into ipynb by [[http://page.math.tu-berlin.de/~criado/index.html|Francisco Criado]], Daniel Oberländer, [[http://page.math.tu-berlin.de/~radons/|Manuel Radons]], and [[http://page.math.tu-berlin.de/~joswig/|Michael Joswig]]. ==== 1.Introduction ==== A binary matroid $M$ is said to be ${e}$-flowing if for every element $e \in E(M)$, a certain polytope defined using the circuits of $M$ that pass through $e$ has integral vertices. A matroid is called 1-flowing if it is ${e}$-flowing for every element of $E(M)$. In this tutorial-style note, we’ll work through an example, namely the matroid $\operatorname{AG}(3, 2)$ and demonstrate the computational process to checking whether or not it is 1-flowing, using polymake, which is a computer algebra system for polytopes and associated objects. > application "matroid"; The binary matroid $\operatorname{AG}(3, 2)$ consists of the binary vectors in $\operatorname{PG}(3, 2)$ which lie off a hyperplane (i.e. all the affine points) and so can easily be seen to be represented by the matrix consisting of every column vector with first coordinate equal to one. > $M = new Matrix([[1,1,1,1,1,1,1,1],[0,0,0,0,1,1,1,1],[0,0,1,1,0,0,1,1],[0,1,0,1,0,1,0,1]]); > print $M; 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 The 8 matroid elements (that is, matrix columns) are labeled 0, 1, . . ., 7 in the natural order. Then AG(3, 2) has 14 circuits, all of size 4, as follows: > $AG32 = new Matroid(BINARY_VECTORS=>cols($M)); > > print $AG32->CIRCUITS; {0 1 2 3} {0 1 4 5} {0 1 6 7} {0 2 4 6} {0 2 5 7} {0 3 4 7} {0 3 5 6} {1 2 4 7} {1 2 5 6} {1 3 4 6} {1 3 5 7} {2 3 4 5} {2 3 6 7} {4 5 6 7} The automorphism group of $\operatorname{AG}(3,2)$ is transitive on the ground set, and so to check whether the matrix is 1-flowing we only need to test that it is ${0}$-flowing. Each circuit containing 0 yields one constraint on a set of variables identified with $\operatorname{E}(M){0}$, which we will call ${x_1, x_2, \ldots , x_7}$ with the natural correspondence. Each of the circuit constraints is that the sum of the corresponding variables is at least 1. Thus we get the 7 constraints shown in table below. ^Circuit^                 Constraint         ^ |$0123$ | $x_1+x_2+x_3\geq 1$ | |$0145$ | $x_1+x_4+x_5\geq 1$ | |$0167$ | $x_1+x_6+x_7\geq 1$ | |$0246$ | $x_2+x_4+x_6\geq 1$ | |$0257$ | $x_2+x_5+x_7\geq 1$ | |$0347$ | $x_3+x_4+x_7\geq 1$ | |$0356$ | $x_3+x_5+x_6\geq 1$ | In addition to these constraints, each variable must be non-negative, and so we add $x_i \geq 0$ to the list of constraints. These gives us a total of fourteen constraints, each determining a half-space in $\mathbb{R}^7$, and the intersection of these half-spaces is an unbounded polytope; an expression for a polytope in this fashion is called an $H$-representation of the polytope ($H$ for half-space, I suppose). A polytope can also be described by its vertices or extreme points and, if it is unbounded, its rays in addition. The matroid is ${e}$-flowing if the polytope described above has integral vertices, that is, its vertices have integer coordinates. The description of a polytope by its vertices (and rays) is called its $V$-representation and so the task is to convert the H-representation into the $V$-representation and check integrality. Several algorithms for this task and their implementations exist. polymake has interfaces to many of them, e.g., cdd by Komei Fukuda. For a survey and extensive comparisons see Assarf et al, Math. Program. Comput. 9.1, pp. 1–38. [[https://link.springer.com/article/10.1007/s12532-016-0104-z|doi: 10.1007/s12532-016-0104-z]]. ==== 2. The Computation ==== The basic process is straightforward: - Construct a polytope in polymake using the H-representation - Ask polymake to return the $V$-representation. In practice, it is almost as straightforward, with just some possible teething troubles in mastering the syntax of polymake. A //constraint// in polymake of the form $$a^T x \geq b$$ (where a is a (column) vector of coefficients, $x$ the vector of variables and $b$ a vector of constants) must first be re-expressed in the form $$−b + a^T x \geq 0$$ and then the constant term and coefficients in this expression gathered into one row vector in this order, yielding the vector $$[b, a_1, a_2, \dots , a_n]$$. The matrix constructed below shows the circuit constraints expressed in polymake form. > $circuit_constraints = new Matrix([ > [-1,1,1,1,0,0,0,0], > [-1,1,0,0,1,1,0,0], > [-1,1,0,0,0,0,1,1], > [-1,0,1,0,1,0,1,0], > [-1,0,1,0,0,1,0,1], > [-1,0,0,1,1,0,0,1], > [-1,0,0,1,0,1,1,0]]); > > print $circuit_constraints; -1 1 1 1 0 0 0 0 -1 1 0 0 1 1 0 0 -1 1 0 0 0 0 1 1 -1 0 1 0 1 0 1 0 -1 0 1 0 0 1 0 1 -1 0 0 1 1 0 0 1 -1 0 0 1 0 1 1 0 We also need the constraints for non-negativity, but these can be constructed programatically rather than manually because the appropriate matrix is just a zero column vector adjacent to an identify matrix, > $nonneg_constraints = zero_vector(7) | unit_matrix(7); and the set of all constraints is obtained from the union of both matrices. > $all_ineq = $circuit_constraints / $nonneg_constraints; Let’s just check that all is in order > print_constraints($all_ineq); 0: x1 + x2 + x3 >= 1 1: x1 + x4 + x5 >= 1 2: x1 + x6 + x7 >= 1 3: x2 + x4 + x6 >= 1 4: x2 + x5 + x7 >= 1 5: x3 + x4 + x7 >= 1 6: x3 + x5 + x6 >= 1 7: x1 >= 0 8: x2 >= 0 9: x3 >= 0 10: x4 >= 0 11: x5 >= 0 12: x6 >= 0 13: x7 >= 0 Finally we can create the polytope and ask for its vertices! > application "polytope"; > $p = new Polytope(INEQUALITIES=>$all_ineq); > > print $p->VERTICES; 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1/3 1/3 1/3 1/3 1/3 1/3 1/3 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 1 1 Notice that each row listing the vertices has eight coordinates, rather than seven. This is because our $7$-dimensional space has been embedded as the plane $x_0=1$ in an $8$-dimensional space in order to accommodate vertices and rays in a uniform manner. The rows with first coordinate equal to 1 are the vertices, while the others are the rays. We immediately see that this matroid is not ${0}$-flowing because the point $$(1/3, 1/3, 1/3, 1/3, 1/3, 1/3, 1/3)$$ is a vertex of the associated polytope. A polytope whose vertices are integral is also called a lattice polytope. If this is satisfied can be checked directly. > print $p->LATTICE; false ==== 3. Seymour's Conjecture ==== The fact that $AG(3, 2)$ is not $1$-flowing has of course long been known. And because the property of being $1$-flowing is closed under taking minors, this means that no binary matroid with an $AG(3, 2)$ minor is $1$-flowing either. There are two other known minor-minimal matroids with no $AG(3, 2)$-minor that are not $1$-flowing; these are the dual pair $T_{11}$ and $T_{11}^*$. Seymour conjectured that this is the complete set of excluded minors. **Conjecture. (Seymour)** A binary matroid is 1-flowing if and only if it has no $AG(3,2)$, $T_{11}$ or $T_{11}^*$ minor.