#  Copyright (c) 1997-2006
#  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: homology.rules 7207 2006-03-11 19:24:45Z gawrilow $


# path to the Heckenbach's @c homology program
custom $homology;

CONFIGURE {
   $homology=find_via_path("homology")
   or die "'homology' program not found\n";
}

# Category: Topology
# Use the Heckenbach's @see external.homology program to compute the homology groups instead of the
# default client @see t_homology.
label heckenbach

object SimplicialComplex;

heckenbach.homology: HOMOLOGY : FACETS
WEIGHT 4.20
   my $hom=new Poly::ProgramPipe($homology);
   print $hom join(",\n", map { "{" . join(",", /\d+/g) ."}" } @{$this->FACETS}), "\n";
   my $last_line;
   while (<$hom>) {
      $last_line=$_;
   }
   $last_line =~ s/.*\((.*)\).*/$1/;
   $this->HOMOLOGY=[
      map {
	 my ($betti, @torsion) = split / *\+ *Z_/;
	 "({" .
	 join(" ", map { /\^/ ? "($` $')" : "($_ 1)" } @torsion) .
	 "} $betti)"
      } split /, */, $last_line
   ];


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