#  Copyright (c) 1997-2004
#  Ewgenij Gawrilow, Michael Joswig (Technische Universitaet Berlin, Germany)
#  http://www.math.tu-berlin.de/polymake,  mailto:polymake@math.tu-berlin.de
#
#  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.
#-----------------------------------------------------------------------------
#  $Project: polymake $$Id: random_hirsch,v 1.2 2004/12/17 21:36:25 gawrilow Exp $

application 'polytope';

# n random simplicial d-polytopes with 2d vertices
sub random_hirsch {
   my ($n, $d, $seed)=@_;
   my $logfile="log";

   # this is a standard (d-1)-simplex
   my $simplex1=new Apps::polytope::RationalPolytope("simplex1");
   Modules::client("simplex", $simplex1, $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 ? beneath_beyond : 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 Apps::polytope::RationalPolytope("simplex2");
      Modules::client("rand", $simplex2, $simplex1, $d, "-seed", $i);
      $simplex2->commit;
      my $p=new Apps::polytope::RationalPolytope("rand_$i");
      Modules::client("cayley_embedding", $p, $simplex1, $simplex2);
      # let create all properties at once
      my ($nv, $nf, $simplicial, $dd)=$p->give("N_VERTICES", "N_FACETS", "SIMPLICIAL", "DUAL_DIAMETER");
      my $now=localtime();
      print LOG "$now $ENV{HOSTNAME} ($d,$i): $nv $nf $simplicial $dd";
      if ($dd > $nv - $p->DIM) {
	 print LOG "*";
	 my $filename= "hirsch_" . $p->DIM . "_" . $i;
	 $p->commit;
	 save($p, $filename, 1);
      }
      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:
