File: standard_constructions.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 (87 lines) | stat: -rw-r--r-- 3,763 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
#  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 Producing a normal toric variety
# Takes one parameter //r// and returns the polyhedral fan corresponding the the
# Hirzebruch surface //H<sub>r</sub>//.
# @param Integer r Parameter
# @return NormalToricVariety
user_function hirzebruch_surface( $ ) {
  my $r=shift;
  $r >= 0 or die "hirzebruch_surface: index must be non-negative\n";
  my $m=new Matrix<Rational>(unit_matrix<Rational>(2) / -unit_matrix<Rational>(2));
  $m->elem(2,1)=$r;
  my $f=new NormalToricVariety(RAYS=>$m, MAXIMAL_CONES=>[[0,1],[1,2],[2,3],[0,3]],COMPLETE=>1,PROJECTIVE=>1,SIMPLICIAL=>1,DEGENERATE=>0);
  $f->description = "Hirzebruch surface of index $r";
  return $f;
}

# @category Producing a normal toric variety
# Takes one parameter //d// and returns the fan corresponding to the //d//-dimensional
# projective space.
# @param Int d Dimension
# @return NormalToricVariety
user_function projective_space( $ ) {
  my $d=shift;
  $d > 0 or die "projective_space: dimension must be positive\n";
  my $m=new Matrix<Rational>(unit_matrix<Rational>($d) / -ones_vector<Rational>($d));
  my $f=new NormalToricVariety(RAYS=>$m, MAXIMAL_CONES=>all_subsets_of_k(range(0,$d), $d),
                               COMPLETE=>true, PROJECTIVE=>true, SIMPLICIAL=>true, DEGENERATE=>false);
  $f->description = "$d-dimensional projective space"; 
  return $f;
}

# @category Producing a normal toric variety
# Takes a vector //a// and returns the fan corresponding to the weighted
# projective space associated to //a//.
# @param Vector<Int> a the weights
# @return NormalToricVariety
user_function weighted_projective_space( Vector<Int> ) {
   my $d = shift;
   $d->dim > 2 or die "weighted_projective_space: require at least 3 weights\n";
   my $n = $d->dim();

   # We use the construction described on p35 of
   # Fulton -- Introduction to Toric Varities.
   # 
   # Since we cannot work with lattices finer than ZZ^n, we instead coarsen
   # everything accordingly.
   my $lcms = new Vector<Integer>(map(lcm($d->[0],$d->[$_]), 1..$n-1));
   my $ray_gens = new Matrix<Rational>($n, $n-1);
   my $lattice_gens = new Matrix<Integer>($n, $n-1);
   $ray_gens->row(0) = -$lcms;
   $lattice_gens->row(0) = new Vector<Integer>(map(-div($lcms->[$_], $d->[0])->quot, 0..$n-2));
   foreach my $i (0..$n-2){
      $lattice_gens->elem($i+1, $i) = div($lcms->[$i], $d->[$i+1])->quot;
      $ray_gens->elem($i+1, $i) = $lcms->[$i];
   }
   $lattice_gens = transpose(hermite_normal_form(transpose($lattice_gens))->hnf);
   $lattice_gens = new Matrix<Rational>($lattice_gens->minor(sequence(0,$n-1), All));
   my $lginv = inv($lattice_gens);
   $ray_gens = $ray_gens * $lginv;
   my $maxcones = all_subsets_of_k(sequence(0,$d->dim), $d->dim-1);
   my $result = new NormalToricVariety(RAYS=>$ray_gens, MAXIMAL_CONES=>$maxcones, COMPLETE=>true, PROJECTIVE=>true);
   $result->description = "weighted projective space for weights $d";
   return $result;
}


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