File: grass_plucker.rules

package info (click to toggle)
polymake 4.12-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 35,992 kB
  • sloc: cpp: 168,768; perl: 43,375; javascript: 31,575; ansic: 3,007; java: 2,654; python: 633; sh: 268; xml: 117; makefile: 61
file content (170 lines) | stat: -rw-r--r-- 6,555 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#  Copyright (c) 1997-2024
#  Ewgenij Gawrilow, Michael Joswig, and the polymake team
#  Technische Universität Berlin, Germany
#  https://polymake.org
#
#  This program is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by the
#  Free Software Foundation; either version 2, or (at your option) any
#  later version: http://www.gnu.org/licenses/gpl.txt.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#-------------------------------------------------------------------------------

# @category Geometry
# This object encodes a decorated graph that certifies that a given
# simplicial complex is not realizable as the boundary of a convex
# polytope.
#
# The simplicial complex itself should either be a simplicial sphere,
# or an oriented simplicial complex with boundary. In the latter case,
# each component of the boundary will be coned over by a new point,
# and the resulting complex should then be a simplicial sphere.  (This
# is important when handling Criado & Santos's topological
# prismatoids, for example.)
#
# The nodes of the graph are decorated with Grassmann-Plücker
# polynomials, and the edges with "undetermined solids", ie, solids
# whose orientation can vary according to the realization.
#
# The point of the certificate is that no matter how these
# undetermined solids are oriented, there will always be some
# Grassmann-Plücker polynomial in the tree all of whose terms are
# positive.
#
# But this contradicts realizability, because the matrix of
# homogeneous coordinates of any putative convex realization of a
# d-sphere on n vertices determines a point in the Grassmann manifold
# G(d,n), which means that all GP-polynomials should vanish -- but
# the special one can't, because all its terms are positive.
declare object GrassPluckerCertificate : Graph<Undirected> {

    # @category Geometry
    # This property encodes the Grassmann-Plücker relations of a
    # simplicial complex of dimension d on n vertices that participate
    # in the nonrealizability certificate.
    #
    # Each relation is of the form
    #    Gamma(I|J) = sum_{j in J} sign(j,I,J) [I cup j] [J minus j],
    # where I in ([n] choose d) and J in ([n] choose d+2), 
    # and where sign(j,I,J) in {-1,+1} is determined by j, I and J.
    # Compare Thm 14.6 in Miller & Sturmfels, Combinatorial Commutative Algebra.
    # 
    # The Array<Set<Int>> has length 3, and consists of
    # a singleton set with entry +-1 for the sign, followed by I and J.
    property PLUCKER_RELATIONS : NodeMap<Undirected, Array<Set<Int>>> : construct(ADJACENCY);

    # @category Geometry
    # For each edge, store the undetermined solids across that edge.
    # There can be more than one in the case of dummy edges connecting
    # a cube node to a cube vertex node.
    # The sign of each undetermined solid is incorporated into the
    # inner Array as a possible leading "-1".
    property UNDETERMINED_SOLIDS : EdgeMap<Undirected, Array<Array<Int>>> : construct(ADJACENCY);

    # @category Geometry
    # A string representation of the UNDETERMINED_SOLIDS
    # It indexes the participating solids using the ordering given in SOLIDS
    property EDGE_LABELS : EdgeMap<Undirected, String> : construct(ADJACENCY);
    
    # @category Geometry
    # The ordering of the solids used in NODE_LABELS and EDGE_LABELS
    property SOLIDS : Array<Array<Int>>;
};

object SimplicialComplex {

    # @category Geometry
    # A Grassmann-Plücker certificate for non-realizability,
    # as described in J. Pfeifle, Positive Plücker tree certificates for non-realizability, Experimental Math. 2022 https://doi.org/10.1080/10586458.2021.1994487
    # and J. Pfeifle, A polymake implementation of Positive Plücker tree certificates for non-realizability, MEGA 2022
    # @example
    # > $s = new SimplicialComplex(FACETS=>[[0,1,2,3],[0,1,2,4],[0,1,3,5],[0,1,4,6],[0,1,5,7],[0,1,6,7],[0,2,3,4],[0,3,4,5],[0,4,5,6],[0,5,6,7],[1,2,3,7],[1,2,4,6],[1,2,6,7],[1,3,5,7],[2,3,4,7],[2,4,5,6],[2,4,5,7],[2,5,6,7],[3,4,5,7]]);
    # > print $s->NON_REALIZABLE;
    # | true
    #
    # > $s->GRASS_PLUCKER_CERTIFICATE->properties();
    # | type: GrassPluckerCertificate
    # | 
    # | ADJACENCY
    # | {1}
    # | {0}
    # | 
    # | 
    # | EDGE_LABELS
    # | [5?]
    # | 
    # | NODE_LABELS
    # | +[0][6]+[7][8]+[5?][9]+[3][10] +[0][1]+[2][3]-[4][5?]
    # | 
    # | PLUCKER_RELATIONS
    # | <{1}
    # | {0 1 2 5}
    # | {2 3 4 5 6 7}
    # | >
    # | <{1}
    # | {0 1 2 3}
    # | {0 1 2 5 6 7}
    # | >
    # | 
    # | 
    # | SOLIDS
    # | 0 1 3 5 2
    # | 1 2 7 6 0
    # | 0 1 2 3 6
    # | 0 1 5 7 2
    # | 1 2 3 7 0
    # | 0 1 2 5 6
    # | 2 5 7 6 4
    # | 0 1 4 2 5
    # | 2 5 7 6 3
    # | 3 4 5 7 2
    # | 2 4 5 6 3
    # | 
    # | 
    # | UNDETERMINED_SOLIDS
    # | <0 1 2 5 6
    # | >
    property GRASS_PLUCKER_CERTIFICATE : GrassPluckerCertificate;

    rule GRASS_PLUCKER_CERTIFICATE : FACETS, ORIENTATION {
        $this->GRASS_PLUCKER_CERTIFICATE = grass_plucker($this);
    }
    weight 4.10;
    
    # @category Geometry
    # True if a certificate for convex non-realizability has been found
    # False means that no such certificate has been found
    # @example For some simplicial complexes, polymake can certify that they are not realizable in a convex way.
    # Currently, the only available proofs of non-realizability are Grassmann-Plücker certificates.
    # > $s = new SimplicialComplex(FACETS=>[[0,1,2,3],[0,1,2,4],[0,1,3,5],[0,1,4,6],[0,1,5,7],[0,1,6,7],[0,2,3,4],[0,3,4,5],[0,4,5,6],[0,5,6,7],[1,2,3,7],[1,2,4,6],[1,2,6,7],[1,3,5,7],[2,3,4,7],[2,4,5,6],[2,4,5,7],[2,5,6,7],[3,4,5,7]]);
    # > print $s->NON_REALIZABLE;
    # | true
    # @example
    # > print jockusch_3_sphere(4)->NON_REALIZABLE
    # | false
    # @example
    # > print jockusch_3_sphere(5)->NON_REALIZABLE
    # | true
    property NON_REALIZABLE : Bool;

    rule NON_REALIZABLE : GRASS_PLUCKER_CERTIFICATE {
        my $s = $this->GRASS_PLUCKER_CERTIFICATE->lookup("SOLIDS");
        if (defined($s)) {
            $this->NON_REALIZABLE = 1;
        } else {
            $this->NON_REALIZABLE = 0;
        }
    }
    weight 0.1;
}

                                  
# Local Variables:
# mode: perl
# cperl-indent-level:3
# indent-tabs-mode:nil
# End: