# Copyright (c) 1997-2005
# 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: Scheduler_debug.pm 6646 2005-12-21 18:56:09Z gawrilow $
use strict;
use namespaces;
package Poly::RuleChain;
my $dump_full=$Switches::d>2;
sub dump($) {
my ($var)=@_;
if (!instanceof RuleChain($var)) {
dbg_print( "not a RuleChain ref: $var" );
return;
}
local $Poly::dbg_prefix="";
dbg_print( "weight=", $var->weight );
if (!is_ARRAY($var->rules)) {
dbg_print( "invalid field 'rules': ", $var->rules );
return;
}
dbg_print( map { $_->header, "\n" } @{$var->rules} );
return unless $dump_full;
if (!is_hash($var->supplier)) {
dbg_print( "invalid field 'supplier': ", $var->supplier );
return;
}
if (!is_hash($var->consumer)) {
dbg_print( "invalid field 'consumer': ", $var->consumer );
return;
}
while (my ($rule, $supp_list)=each %{$var->supplier}) {
if (!is_ARRAY($supp_list)) {
if ($supp_list ne 'incl' and $supp_list ne 'run') {
dbg_print( "invalid supplier list of ", $rule->header, ": $supp_list" );
}
next;
}
dbg_print( "supplier of ", $rule->header, ":\n" );
foreach my $supp_group (@$supp_list) {
if (!is_hash($supp_group)) {
dbg_print( "invalid element in supplier list: $supp_group\n" );
next;
}
dbg_print( (map { (" ", $_->header, "\n") } keys %$supp_group),
"---" );
}
}
while (my ($rule, $cons)=each %{$var->consumer}) {
if (!is_hash($cons)) {
dbg_print( "invalid consumer list of ", $rule->header, ": $cons" );
next;
}
dbg_print( "consumer of ", $rule->header, ":\n",
(map { (" ", $_->header, "\n") } keys %$cons), "---" );
}
while (my ($rule, $dict)=each %{$var->sensitive_supplier}) {
if (!is_hash($dict)) {
dbg_print( "invalid sensitive_supplier of ", $rule->header, ": $dict" );
next;
}
dbg_print( "sensitive_supplier of ", $rule->header, ":\n" );
while (my ($generator, $supp_list)=each %$dict) {
if (!is_hash($supp_list)) {
dbg_print( "invalid list for diff(", $generator->name, "): $supp_list" );
next;
}
dbg_print( " diff(", $generator->name, "):\n",
map { " ".$_->header."\n" } keys %$supp_list );
}
}
while (my ($rule, $dict)=each %{$var->sensitive_consumer}) {
if (!is_hash($dict)) {
dbg_print( "invalid sensitive_consumer of ", $rule->header, ": $dict" );
next;
}
dbg_print( "sensitive_consumer of ", $rule->header, ":\n" );
while (my ($generator, $list)=each %$dict) {
if (!is_ARRAY($list)) {
dbg_print( "invalid list for diff(", $generator->name, "): $list" );
next;
}
dbg_print( " diff(", $generator->name, "):\n",
map { " ".$_->header."\n" } @$list );
}
}
return unless instanceof InitRuleChain($var);
if (!is_hash($var->run)) {
dbg_print( "invalid field 'run': ", $var->run );
} else {
dbg_print( "exec codes:\n" );
while (my ($rule, $code)=each %{$var->run}) {
dbg_print( $rule->header, " -> ",
is_object($code) ? $code : $code==$exec_OK ? "OK" : $code==$exec_failed ? "FAIL" : $code );
}
}
}
sub dump_list($) {
my ($varlist)=@_;
foreach my $var (@$varlist) {
dbg_print( $var->id );
$var->dump;
dbg_print( "\n" );
}
}
sub check_rule_graph($) {
my ($self)=@_;
while (my ($rule, $cons)=each %{$self->consumer}) {
my @errormsg;
foreach my $cons_rule (keys %$cons) {
my $supp=$self->supplier->{$cons_rule};
if (!defined $supp) {
push @errormsg, "undefined supplier of ", $cons_rule->header, "\n";
next;
}
next if !is_ARRAY($supp); # will report this later
my $found;
foreach my $supp_group (@$supp) {
next if !is_hash($supp_group); # and this too
if (exists $supp_group->{$rule}) {
$found=1; last;
}
}
if (!$found) {
push @errormsg, "not found in supplier of ", $cons_rule->header, "\n";
}
}
if (@errormsg) {
dbg_print( "from consumer of ", $rule->header, ":\n", @errormsg );
}
}
while (my ($rule, $supp_list)=each %{$self->supplier}) {
if (is_ARRAY($supp_list)) {
my @errormsg;
foreach my $supp_group (@$supp_list) {
if (!is_hash($supp_group)) {
push @errormsg, "invalid element in supplier list: $supp_group\n";
next;
}
foreach my $supp_rule (keys %$supp_group) {
if (!defined $self->consumer->{$supp_rule}) {
push @errormsg, "undefined consumer of ", $supp_rule->header, "\n";
next;
}
if (!exists $self->consumer->{$supp_rule}->{$rule}) {
push @errormsg, "not found in consumer of ", $supp_rule->header, "\n";
}
}
}
if (@errormsg) {
dbg_print( "from supplier of ", $rule->header, ":\n", @errormsg );
}
} else {
dbg_print( "invalid supplier of ", $rule->header, ": $supp_list" );
}
}
}
sub announce_pop($) {
my ($self)=@_;
dbg_print( "======= pop ", $self->id, " =======" );
}
sub announce_push($) {
my ($self)=@_;
dbg_print( "======= push ", $self->id, " ======" );
$self->dump;
}
####################################################################################
package Poly::Scheduler::Heap;
sub find($$) {
my ($self, $id)=@_;
foreach my $var (@$self) {
return $var if $var->id eq $id;
}
}
####################################################################################
1;
syntax highlighted by Code2HTML, v. 0.9.1