Skip to content
Snippets Groups Projects
Commit 2cb350fa authored by gregor herrmann's avatar gregor herrmann
Browse files

Add patch BitMatrix_AdjacencyMatrix_Deleted_Vertex.patch.

The patch is taken from the upstream 0.9721 release, and fixes BitMatrix and
AdjacencyMatrix problems in combination with deleted vertices.

Thanks: Ian Jackson for the bug report with reproducer, which is now part of the testsuite.
Closes: #987095
parent a15eeaca
No related branches found
No related tags found
No related merge requests found
Description: fix BitMatrix and AdjacencyMatrix problems
Origin: upstream git, diff 0.9720..0.9721
Bug: https://github.com/graphviz-perl/Graph/issues/20
Bug-Debian: https://bugs.debian.org/987095
Author: Ed J <mohawk2@users.noreply.github.com>
Reviewed-by: gregor herrmann <gregoa@debian.org>
Last-Update: 2021-04-18
--- a/lib/Graph.pm
+++ b/lib/Graph.pm
@@ -356,6 +356,7 @@
sub _vertex_ids_maybe_ensure {
my $ensure = pop;
my ($g, @args) = @_;
+ __carp_confess "Graph: given undefined vertex" if grep !defined, @args;
my $V = $g->[ _V ];
if (($V->[ _f ] & _LIGHT)) {
my $s = $V->[ _s ];
--- a/lib/Graph/AdjacencyMatrix.pm
+++ b/lib/Graph/AdjacencyMatrix.pm
@@ -29,31 +29,22 @@
my $m = Graph::BitMatrix->new($g);
my $self = bless [ $m, undef, \@V ], $class;
return $self if !$want_distance;
- # for my $u (@V) {
- # for my $v (@V) {
- # if ($g->has_edge($u, $v)) {
- # $n->set($u, $v,
- # $g->get_edge_attribute($u, $v, $d));
- # }
- # }
- # }
my $n = $self->[ _DM ] = Graph::Matrix->new($g);
$n->set($_, $_, 0) for @V;
- my $Ei = $g->[_E][_i];
my $n0 = $n->[0];
my $n1 = $n->[1];
my $undirected = $g->is_undirected;
my $multiedged = $g->multiedged;
- for my $t (grep defined, @$Ei) {
- my ($i0, $j0) = @$t;
- my $u = $V[ $i0 ];
- my $v = $V[ $j0 ];
- $n0->[ $i0 ]->[ $j0 ] = $multiedged
+ for my $e ($g->edges) {
+ my ($u, $v) = @$e;
+ $n->set($u, $v, $multiedged
? _multiedged_distances($g, $u, $v, $d)
- : $g->get_edge_attribute($u, $v, $d);
- $n0->[ $j0 ]->[ $i0 ] = $multiedged
+ : $g->get_edge_attribute($u, $v, $d)
+ );
+ $n->set($v, $u, $multiedged
? _multiedged_distances($g, $v, $u, $d)
- : $g->get_edge_attribute($v, $u, $d) if $undirected;
+ : $g->get_edge_attribute($v, $u, $d)
+ ) if $undirected;
}
$self;
}
--- a/lib/Graph/BitMatrix.pm
+++ b/lib/Graph/BitMatrix.pm
@@ -30,19 +30,12 @@
# vec($bm0->[$i], $j, 1) = 1 if $g->has_edge($u, $V[$j]);
# }
# }
- my $Ei = $g->[_E]->[_i];
- if ($g->is_undirected) {
- for my $e (grep defined, @{ $Ei }) {
- my ($i0, $j0) = @$e;
- vec($bm0->[$i0], $j0, 1) = 1;
- vec($bm0->[$j0], $i0, 1) = 1;
- }
- } else {
- for my $e (grep defined, @{ $Ei }) {
- my ($i0, $j0) = @$e;
- ($j0, $i0) = ($i0, $j0) if $transpose;
- vec($bm0->[$i0], $j0, 1) = 1;
- }
+ my $undirected = $g->is_undirected;
+ for my $e ($g->edges) {
+ my ($i0, $j0) = map $V{$_}, @$e;
+ ($j0, $i0) = ($i0, $j0) if $transpose;
+ vec($bm0->[$i0], $j0, 1) = 1;
+ vec($bm0->[$j0], $i0, 1) = 1 if $undirected;
}
$bm;
}
--- a/t/72_transitive.t
+++ b/t/72_transitive.t
@@ -1,5 +1,5 @@
use strict; use warnings;
-use Test::More tests => 235;
+use Test::More tests => 237;
use Graph::Directed;
use Graph::Undirected;
@@ -506,3 +506,14 @@
EOF
ok $tcg->is_reachable(7, 8), '7-8 reachable when on cycle';
}
+
+{
+ my $g = Graph::Directed->new(edges => [
+ [qw(A C)], [qw(A NOTA)], [qw(B A)], [qw(B C)], [qw(B NOTA)],
+ ]);
+ $g->delete_vertex('C');
+ my $tc = $g->transitive_closure;
+ is $tc, 'A-A,A-NOTA,B-A,B-B,B-NOTA,NOTA-NOTA';
+ $tc->delete_edge($_,$_) for qw(A B C N);
+ is $tc, 'A-NOTA,B-A,B-NOTA,NOTA-NOTA';
+}
--- a/t/83_bitmatrix.t
+++ b/t/83_bitmatrix.t
@@ -6,10 +6,12 @@
my $g = Graph->new;
+$g->add_edge(qw(e a));
$g->add_edge(qw(a b));
$g->add_edge(qw(b c));
$g->add_edge(qw(b d));
$g->add_edge(qw(d d));
+$g->delete_vertex('e');
my $m = Graph::BitMatrix->new($g);
BitMatrix_AdjacencyMatrix_Deleted_Vertex.patch
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment