File: BitMatrix_AdjacencyMatrix_Deleted_Vertex.patch

package info (click to toggle)
libgraph-perl 1%3A0.9716-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,108 kB
  • sloc: perl: 4,067; sh: 8; makefile: 2
file content (127 lines) | stat: -rw-r--r-- 3,618 bytes parent folder | download
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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);