File: random_hirsch

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-- 2,925 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.
#-------------------------------------------------------------------------------

# application 'polytope';

sub truncateRational {
  my ($rational,$N_digits)=@_;
  my $shiftedRat=$rational*(10**$N_digits);
  my $truncatedRat=new Rational((numerator($shiftedRat)/denominator($shiftedRat)),10**$N_digits);
  return $truncatedRat;
}

sub truncateMatrix {
  my ($m,$N_digits)=@_;
  my $truncatedMatrix=new Matrix<Rational>($m->rows,$m->cols);
  for(my $i=0;$i<$m->rows;$i++){
    for(my $j=0;$j<$m->cols;$j++){
      $truncatedMatrix->row($i)->[$j]=truncateRational($m->row($i)->[$j],$N_digits);
    }
  }
  return $truncatedMatrix;
}

# n random simplicial d-polytopes with 2d vertices
sub random_hirsch {
  application 'polytope';

  my ($n, $d, $seed)=@_;
  my $logfile="log";
  
  # it does not harm to fix one standard (d-1)-simplex
  my $simplex1=simplex($d-1);
  
  open LOG, ">>$logfile";
  $|=1;
  print LOG "[ random_hirsch(#=$n,dim=$d,initial seed=$seed) on $ENV{HOSTNAME}; format: N_VERTICES N_FACETS SIMPLICIAL DUAL_DIAMETER ]\n";
  
# for dimension below 10 beneath_beyond will be (slightly) faster
  $d<=10 ? prefer_now "beneath_beyond" : prefer_now "lrs";

  # generate random (d-1)-simplices and construct the Cayley embedding of the two simplices 
  # check for the Hirsch bound and save the output (if interesting)
  for (my $i=$seed; $i<$seed+$n; ++$i) {
    my $simplex2=new Polytope<Rational>(VERTICES=>truncateMatrix(rand_sphere($d-1,$d)->VERTICES,3));
    my $p=cayley_embedding($simplex1,$simplex2);
    # let create all properties at once
    $p->provide("N_VERTICES", "N_FACETS", "SIMPLICIAL", "DIM", "GRAPH");
    my ($nv, $nf, $simplicial, $dim, $dual_diam)=($p->N_VERTICES,$p->N_FACETS,$p->SIMPLICIAL,$p->DIM,$p->DUAL_DIAMETER);
    my $now=localtime();
    print LOG "$now $ENV{HOSTNAME} ($d,$i): $nv $nf $simplicial $dual_diam";
    if ($dual_diam > $nv - $dim) {
      print LOG "*";
      $p->name= "hirsch_" . $dim . "_" . $i;
      save($p);
    }
      print LOG "\n";
   }

   close LOG;
}

if (@ARGV == 2) {
   push @ARGV, time;
} elsif (@ARGV != 3) {
   die "usage: polymake --script random_hirsch #polytopes dim [ seed ]\n";
}

random_hirsch(@ARGV);


# Local Variables:
# mode: perl
# c-basic-offset:3
# End: