File: action_properties.rules

package info (click to toggle)
polymake 4.14-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 35,888 kB
  • sloc: cpp: 168,933; perl: 43,407; javascript: 31,575; ansic: 3,007; java: 2,654; python: 632; sh: 268; xml: 117; makefile: 61
file content (425 lines) | stat: -rw-r--r-- 20,544 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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
#  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.
#-------------------------------------------------------------------------------

object Action {

   # @category Symmetry
   # The generators of the group action.
   # @example Any alternating group of size at least 4 is generated by two elements.
   # > print alternating_group(20)->PERMUTATION_ACTION->GENERATORS;
   # | 1 2 0 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   # | 0 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1
   property GENERATORS : Array<GeneratorType>;

   # @category Symmetry
   # The degree of the representation. For permutation groups,
   # this is the number of permuted indices, for matrix groups
   # it is the dimension of the vector space the group acts on
   # @example [application polytope] The combinatorial/linear automoprhisms of a 3D-cube can be represented
   #          by its vertices or facets. The former has degree 8 (8 vertices), and
   #          the latter has degree 6 (6 facets).
   # > $p = cube(3, group=>true);
   # > print $p->GROUP->VERTICES_ACTION->DEGREE;
   # | 8
   # print $p->GROUP->FACETS_ACTION->DEGREE;
   # | 6
   property DEGREE : Int;

   # @category Symmetry
   # The character of the action. The ordering corresponds to the
   # columns of the CHARACTER_TABLE.
   # @example [application polytope] The following computes the character of the
   #          3D-cube symmetry group acting on its vertices.
   # > $p = cube(3, group=>true);
   # > print $p->GROUP->VERTICES_ACTION->CHARACTER;
   # | 8 4 2 0 0 0 0 0 0 0
   property CHARACTER : Vector<QuadraticExtension>;

   # @category Symmetry
   # The multiplicities of each irreducible representation in this action.
   # The ordering corresponds to the rows of the CHARACTER_TABLE
   # @example [application polytope] The following computes the irreducible
   #          decomposistion of the 3D-cube symmetry group
   #          acting on its vertices.
   # > $p = cube(3, group=>true);
   # > print $p->GROUP->VERTICES_ACTION->IRREDUCIBLE_DECOMPOSITION;
   # | 1 0 0 1 0 0 0 0 1 1
   property IRREDUCIBLE_DECOMPOSITION : Vector<Int>;

   # @category Symmetry
   # A set of representatives for each conjugacy class.
   # The order of these representatives must agree with the implicit
   # order of the columns of the [[Group::CHARACTER_TABLE|CHARACTER_TABLE]].
   # @example [application polytope] The following lists representatives of the
   #          3D-cube symmetry group acting on its facets.
   # > $p = cube(3, group=>true);
   # > print $p->GROUP->FACETS_ACTION->CONJUGACY_CLASS_REPRESENTATIVES;
   # | 0 1 2 3 4 5
   # | 0 1 4 5 2 3
   # | 4 5 0 1 2 3
   # | 1 0 2 3 4 5
   # | 1 0 4 5 2 3
   # | 3 2 0 1 4 5
   # | 5 4 0 1 2 3
   # | 1 0 3 2 4 5
   # | 1 0 5 4 2 3
   # | 1 0 3 2 5 4
   property CONJUGACY_CLASS_REPRESENTATIVES : Array<GeneratorType>;

   # @category Symmetry
   # The conjugacy classes themselves.
   # @example Every conjugacy class of the alternating group on 3 elements is a singleton, since it is abelian.
   # > print alternating_group(3)->PERMUTATION_ACTION->CONJUGACY_CLASSES;
   # | {<0 1 2>}
   # | {<1 2 0>}
   # | {<2 0 1>}
   property CONJUGACY_CLASSES : Array<Set<GeneratorType>>;

   # @category Symmetry
   # All elements of the group, as expressed in the present action
   # Notice that this is a temporary property; it will not be stored in any file.
   # @example The following lists all permutations on 3 elements.
   # > print symmetric_group(3)->PERMUTATION_ACTION->ALL_GROUP_ELEMENTS;
   # | 0 1 2
   # | 0 2 1
   # | 1 0 2
   # | 1 2 0
   # | 2 0 1
   # | 2 1 0
   property ALL_GROUP_ELEMENTS : Array<GeneratorType>;

   rule ALL_GROUP_ELEMENTS : GENERATORS {
       $this->ALL_GROUP_ELEMENTS(temporary) = all_group_elements($this);
   }

   # @category Symmetry
   # the name of the property that we act on, for example MAX_INTERIOR_SIMPLICES or INTERIOR_RIDGES
   # @example [application polytope] The following induces the action of the cube symmetry group on the MAX_INTERIOR_SIMPLICES
   # > $p = cube(3, group=>true);
   # > $a = group::induce_set_action($p, $p->GROUP->VERTICES_ACTION, "MAX_INTERIOR_SIMPLICES");
   # > print $a->DOMAIN_NAME;
   # | MAX_INTERIOR_SIMPLICES
   property DOMAIN_NAME : String;

   # @category Symmetry
   # This is populated, when the action was induced by [[induce_set_action]].
   # In this case, the action corresponds to permuations of sets. However,
   # internally (i.e. in the output of other properties) these sets are referred
   # to by their indices in some array. This property stores the map which takes
   # a set which is being permuted, and outputs the corresponding index in the array.
   # This is a temporary property; it will not be stored in any file.
   # @example [application polytope] [nocompare]  Consider the induced action on the four interior triangles of a square.
   #          The following shows an assigment from each triangle (represented as the
   #          set of its vertices) to a number between 0 and 3.
   # > $p = cube(2, group=>true);
   # > $a = group::induce_set_action($p, $p->GROUP->VERTICES_ACTION, "MAX_INTERIOR_SIMPLICES");
   # > print $p->GROUP->SET_ACTION->INDEX_OF;
   # | {({1 2 3} 3) ({0 1 2} 0) ({0 2 3} 2) ({0 1 3} 1)}
   property INDEX_OF : HashMap<DomainType, Int>;

   rule INDEX_OF : DOMAIN_NAME {
       my $dom = $this->DOMAIN_NAME;
       $this->INDEX_OF(temporary) = index_of($this->$dom);
   }

   # @category Symmetry
   # The orbits of the domain, represented via their indices.
   # @example [application polytope] [require bundled:sympol] Consider the linear symmetries over an Egyptian pyramid
   #          (pyramid with a square base) acting on the vertices.
   #          All four of the vertices of the base may be exchanged by 90/180-degree rotations.
   #          However, the apex vertex is a fixed point under any symmetry.
   #          This means that there should be two orbits - one of size 4, one of size 1.
   # > $c = cube(2);
   # > $p = pyramid($c);
   # > linear_symmetries($p);
   # > print $p->GROUP->VERTICES_ACTION->ORBITS;
   # | {0 1 2 3}
   # | {4}
   property ORBITS : Array<Set<Int>>;

   # @category Symmetry
   # The number of orbits in the domain under the group action.
   # @example Under the action of the symmetric group any element may be moved to any other element.
   # > print symmetric_group(20)->PERMUTATION_ACTION->N_ORBITS;
   # | 1
   property N_ORBITS : Int;

   # @category Symmetry
   # The cardinality of each orbit
   property ORBIT_SIZES : Array<Int>;

   # @category Symmetry
   # The images of all domain elements under each group element: [ [ g(x) for x in D ] for g in G ]
   property IMAGES : Array<Array<DomainType>>;
   
   # @category Symmetry
   # A set of generators for input rays, stored as the rows of a matrix.
   # The list of generators may be redundant and non-canonical.
   # This may also refer to points, when this stores an action corresponding to a polytope.
   # @example [application polytope] Consider the point (2,1), and consider the symmetry group of
   #          linear symmetries on the square, where each symmetry is represented
   #          as a matrix. The following computes the polytope whose vertices are
   #          the image of (2,1) under the matrices corresponding
   #          to linear symmetries. You can recover (2,1) (in homogenous coordinates)
   #          by asking the underlying symmetry group for its INPUT_RAYS_GENERATORS.
   # > $g = orbit_polytope(new Vector([1,1,2]), polytope::cube(2,group=>1)->GROUP->MATRIX_ACTION);
   # > print $g->GROUP->MATRIX_ACTION->INPUT_RAYS_GENERATORS;
   # | 1 1 2
   property INPUT_RAYS_GENERATORS : Matrix<OrbitGeneratorScalarType>;
   
   # @category Symmetry
   # The number of input ray generators, see [[INPUT_RAYS_GENERATORS]].
   # @example [application polytope] Consider the point (1,2,3), where we may permute the
   #          coordinates as we wish. Taking the convex hull, we arrive at
   #          a polytope. Since we permuted (1,2,3) to get the vertices, we 
   #          naturally have a group associated with the polytope. This
   #          has one input ray generator (in this case a point), namely
   #          (1,2,3).
   # > $g = polytope::orbit_polytope(new Vector([1,1,2,3]), group::symmetric_group(3));
   # > print $g->GROUP->COORDINATE_ACTION->N_INPUT_RAYS_GENERATORS;
   # | 1
   property N_INPUT_RAYS_GENERATORS : Int;

   # @category Symmetry
   # A set of generators for rays, stored as the rows of a matrix.
   # The list of generators may be redundant and non-canonical.
   # @example [application fan] Consider a polyhedral fan. We consider the orbit fan of this fan -
   #          i.e. we consider the rays, upon which we may apply elements
   #          of a finite matrix group. This will result in new rays, and
   #          this collection of rays defines a new a new polyhedral fan.
   #          The original rays we had may be recovered using this property.
   # > $f = new PolyhedralFan(RAYS=>[[1,1],[1,0],[-1,-1]], MAXIMAL_CONES=>[[0,1],[1,2]]);
   # > $of = orbit_fan($f,polytope::cube(2,group=>1)->GROUP->MATRIX_ACTION);
   # > print $of->GROUP->MATRIX_ACTION->RAYS_GENERATORS;
   # | 1 1
   # | 1 0
   # | -1 -1
   property RAYS_GENERATORS : Matrix<OrbitGeneratorScalarType>;
   
   # @category Symmetry
   # The number of generators for orbits. See [[RAYS_GENERATORS]].
   # @example [application fan] Consider a polyhedral fan. We may the coordinates of the rays
   #          to obtain new rays. We define a new polyhedral by the rays
   #          we obtain in this way. This property lets us recover the
   #          number of generators we gave in this construction.
   # > $f = new PolyhedralFan(RAYS=>[[1,1],[1,0],[-1,-1]], MAXIMAL_CONES=>[[0,1],[1,2]]);
   # > $of = orbit_fan($f,[[1,0]]);
   # > print $of->GROUP->HOMOGENEOUS_COORDINATE_ACTION->N_RAYS_GENERATORS;
   # | 3
   property N_RAYS_GENERATORS : Int;

   # @category Symmetry
   # A set of generators for inequalities, stored as the rows of a matrix.
   # The list of generators may be redundant and non-canonical.
   # @example [application polytope] [prefer lrs] [require bundled:lrs] The following constructs a truncated orbit polytope.
   #          The inequalites used to generate the polytope can then
   #          be recovered by this property.
   # > $p = orbit_polytope(new Matrix([ [1,6,0,5,-5,0,-5], [1,1,2,3,4,5,6] ]), group::cyclic_group(6));
   # > $p->GROUP->FACETS_ACTION;
   # > $tp = truncated_orbit_polytope($p, 1/2);
   # > print $tp->GROUP->COORDINATE_ACTION->INEQUALITIES_GENERATORS;
   # | 1 -3/23 -1/23 -1/23 -1/23 -1/23 1/23
   # | 1 -1/21 -1/21 -1/21 -1/21 -1/21 -1/21
   # | 1 -63/313 -29/939 -29/939 -29/939 47/313 -13/313
   # | 1 -101/1651 1919/1651 -1701/1651 109/1651 2029/1651 -1601/1651
   # | 1 1/19 21/19 -1 1/19 21/19 -1
   # | 1 -17/167 -7/167 -7/167 3/167 -17/167 3/167
   # | 1 -103/718 -17/718 -17/718 48/359 16/359 -93/718
   # | 1 43/2157 2363/2157 -2057/2157 683/2157 2143/2157 -2257/2157
   # | 1 109/1651 1769/1651 -1551/1651 529/1651 1549/1651 -1751/1651
   # | 1 -19/219 1/219 -19/219 1/219 -19/219 1/219
   # | 1 16769/5331 -6431/5331 -6331/5331 19189/5331 -4231/5331 -4331/5331
   # | 1 23219/23181 -26681/23181 2339/23181 30919/23181 -19681/23181 3919/23181
   # | 1 3 -1 -1 3 -1 -1
   # | -1 1 1 1 1 1 1
   # | 111/2 -6 -1 -1 -1 -1 4
   # | 661/2 -31 9 -11 -11 -11 -11
   property INEQUALITIES_GENERATORS : Matrix<OrbitGeneratorScalarType>;
   
   # @category Symmetry
   # The number of generators for orbits. See [[INEQUALITIES_GENERATORS]]
   # @example [application polytope] As in the example for [[INEQUALITIES_GENERATORS]], constructs a
   #          truncated orbit polytope. The number of inequalities used to
   #          generate the polytope may be recovered by this property.
   # > $p = orbit_polytope(new Matrix([ [1,6,0,5,-5,0,-5], [1,1,2,3,4,5,6] ]), group::cyclic_group(6));
   # > $p->GROUP->FACETS_ACTION;
   # > $tp = truncated_orbit_polytope($p, 1/2);
   # > print $tp->GROUP->COORDINATE_ACTION->N_INEQUALITIES_GENERATORS;
   # | 16
   property N_INEQUALITIES_GENERATORS : Int;

   # @category Symmetry
   # A set of generators for facets, stored as the rows of a matrix.
   # This set of generators together with an action on the facets results in a set of facets,
   # which induce a polyhedron.
   # The list of generators may be redundant and non-canonical.
   # @example [application polytope] Consider the generating facets (stored as row vectors) (1,0,3), (-4,5,6),
   #          where we allow ourselves to permute the first and second coordinate to
   #          create the new facets (5,-4,6) and (0,1,3). This results in an
   #          unbounded polyhedron. The creation of the new facets may be done
   #          automatically in polymake via
   # > $a = new group::PermutationAction(GENERATORS=>[[1,0,2]], FACETS_GENERATORS=>[[1,1,0,3], [1,-4,5,6]]);
   # > $g = new group::Group(HOMOGENEOUS_COORDINATE_ACTION=>$a);
   # > $p = new polytope::Polytope<Rational>(GROUP=>$g);
   # > print $p->FACETS;
   # | 1 0 1 3
   # | 1 1 0 3
   # | 1 -4 5 6
   # | 1 5 -4 6
   # > print $p->BOUNDED;
   # | false
   property FACETS_GENERATORS : Matrix<OrbitGeneratorScalarType>;
   
   # @category Symmetry
   # The number of generators for orbits.
   property N_FACETS_GENERATORS : Int;

   # @category Symmetry
   # A set of generators for equations, stored as the rows of a matrix.
   # The list of generators may be redundant and non-canonical.
   property EQUATIONS_GENERATORS : Matrix<OrbitGeneratorScalarType>;
   
   # @category Symmetry
   # The number of generators for orbits.
   property N_EQUATIONS_GENERATORS : Int;

   # @category Symmetry
   # A set of generators for input lineality, stored as the rows of a matrix.
   # The list of generators may be redundant and non-canonical.
   property INPUT_LINEALITY_GENERATORS : Matrix<OrbitGeneratorScalarType>;
   
   # @category Symmetry
   # The number of generators for orbits.
   property N_INPUT_LINEALITY_GENERATORS : Int;

   # @category Symmetry
   # A set of generators for input lineality, stored as the rows of a matrix.
   # The list of generators may be redundant and non-canonical.
   property LINEALITY_SPACE_GENERATORS : Matrix<OrbitGeneratorScalarType>;
   
   # @category Symmetry
   # The number of generators for orbits.
   property N_LINEALITY_SPACE_GENERATORS : Int;

   # @category Symmetry
   # A set of generators for the maximal cones of a fan, stored in terms of indices of vertex generators.
   # The list of generators may be redundant and non-canonical.
   # @example [application fan] [nocompare] Consider a PolyhedralFan where we know what the rays are,
   #          and we know the symmetries of this polyhedral fan
   #          with respect to its rays and its maximal cones.
   #          We can fully describe the action on the rays, but we
   #          only know a few of the maximal cones. By applying the
   #          symmetries on the rays, we may deduce the PolyhedralFan
   #          with the least amount of maximal cones which respect
   #          the action of the symmetry group on its maximal cones.
   # > $ra = new group::PermutationAction(GENERATORS=>[[0,3,2,1]]);
   # > $a = new group::PermutationAction(MAXIMAL_CONES_GENERATORS=>[[0,1],[1,2]]);
   # > $g = new group::Group(MAXIMAL_CONES_ACTION=>$a, RAYS_ACTION=>$ra);
   # > $f = new PolyhedralFan(GROUP=>$g, RAYS=>[[1,1],[1,0],[-1,-1],[0,1]]);
   # > print $f->MAXIMAL_CONES;
   # | {2 3}
   # | {1 2}
   # | {0 1}
   # | {0 3}
   property MAXIMAL_CONES_GENERATORS : IncidenceMatrix;
   
   # @category Symmetry
   # The number of generators for orbits.
   property N_MAXIMAL_CONES_GENERATORS : Int;

   
   # @category Symmetry
   # A collection of representatives for each orbit, represented via their indices
   # @example [application polytope] [require bundled:sympol] Consider the linear symmetries over an Egyptian pyramid
   #          (pyramid with a square base). There are two orbits - one orbit consisting
   #          of the four vertices of the base square, and one consisting of the apex vertex.
   #          This returns a vertex of the square, and the apex vertex (by their indices).
   # > $s = cube(2);
   # > $p = pyramid($s);
   # > linear_symmetries($p);
   # > print $p->GROUP->VERTICES_ACTION->ORBIT_REPRESENTATIVES;
   # | 0 4
   property ORBIT_REPRESENTATIVES : Array<Int>;

   # @category Symmetry
   # Labels for the orbit representatives
   property ORBIT_REPRESENTATIVE_LABELS : Array<String> : mutable;
   
   # @category Symmetry
   # The representatives of orbits explicitly, not via their indices.
   # @example Consider the symmetries of a cube. These symmetres act on the cube's
   #          maximal interior simplices. Note that there are four orbits, which
   #          correspond to the four possible configurations of four vertices in
   #          general position up to symmetry. This property then returns four sets
   #          of vertices by their indices, each of which represent a single orbit.
   # > $c = polytope::cube(3, group=>1);
   # > induce_implicit_action($c, $c->GROUP->VERTICES_ACTION, $c->GROUP->REPRESENTATIVE_MAX_INTERIOR_SIMPLICES, "MAX_INTERIOR_SIMPLICES");
   # > print $c->GROUP->IMPLICIT_SET_ACTION->EXPLICIT_ORBIT_REPRESENTATIVES;
   # | {0 1 2 4}
   # | {0 1 2 5}
   # | {0 1 2 7}
   # | {0 3 5 6}
   property EXPLICIT_ORBIT_REPRESENTATIVES : Array<DomainType>;

   # @category Symmetry
   # The representatives of orbits explicitly, not via their indices
   # @example [application fan] We begin with a polyhedral fan. Consider the orbit fan of the
   #          original fan, which is the fan defined to be the minimal fan
   #          invariant under (in this case) the linear symmetries of the square (in homogenous coordinates),
   #          which also contains the rays and maximal cones of the original fan.
   #          It is reasonable to ask for the action of the cube on the rays.
   #          This property allows us to extract explicit rays which represent
   #          the orbits of this action.
   # > $f = new PolyhedralFan(RAYS=>[[1,1,1],[1,1,0],[1,1/2,1/4]],MAXIMAL_CONES=>[[0,2],[1,2]]);
   # > $of  = orbit_fan($f,polytope::cube(2,group=>1)->GROUP->MATRIX_ACTION);
   # > print $of->GROUP->RAYS_ACTION->EXPLICIT_ORBIT_REPRESENTATIVE_MATRIX;
   # | 1 -1 -1
   # | 1 -1 0
   # | 1 -1/2 -1/4
   property EXPLICIT_ORBIT_REPRESENTATIVE_MATRIX : Matrix<OrbitGeneratorScalarType>;

   # @category Symmetry
   # the number of representatives of orbits
   property N_ORBIT_REPRESENTATIVES : Int;

   # @category Symmetry
   # A permutation that orders the domain elements by orbits.
   # After permutation, the first elements will be the ones in the first orbit
   # (as ordered in [[ORBITS]]), and the ones after will be in the second orbit,
   # and so on.
   # @example [application fan] [nocompare] Begin with a polyhedral fan, and consider its orbit fan
   #          with respect to the linear symmetries of a square in
   #          homogenous coordinates. Then the following returns
   #          a permutation on the orbit fan's maximal cones, which encodes
   #          the sequence 0 6 9 10 11 12 13 15 1 2 3 4 5 7 8 14, which
   #          is a sequence respecting the orbit order.
   # > $f = new PolyhedralFan(RAYS=>[[1,1,1],[1,1,0],[1,1/2,1/4]],MAXIMAL_CONES=>[[0,2],[1,2]]);
   # > $of = orbit_fan($f,polytope::cube(2,group=>1)->GROUP->MATRIX_ACTION);
   # > $of->GROUP->RAYS_ACTION;
   # > print $of->GROUP->MAXIMAL_CONES_ACTION->ORBITS;
   # | {0 6 9 10 11 12 13 15}
   # | {1 2 3 4 5 7 8 14}
   # > print $of->GROUP->MAXIMAL_CONES_ACTION->PERMUTATION_TO_ORBIT_ORDER;
   # | 0 8 9 10 11 12 1 13 14 2 3 4 5 6 15 7
   property PERMUTATION_TO_ORBIT_ORDER : Array<Int>;

}

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