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:
|