File Coverage

blib/lib/Graph/BitMatrix.pm
Criterion Covered Total %
statement 62 62 100.0
branch 16 22 72.7
condition n/a
subroutine 13 13 100.0
pod 8 9 88.8
total 99 106 93.4


line stmt bran cond sub pod time code
1             package Graph::BitMatrix;
2              
3 8     8   860 use strict;
  8         18  
  8         292  
4 8     8   37 use warnings;
  8         12  
  8         8531  
5              
6             # $SIG{__DIE__ } = \&Graph::__carp_confess;
7             # $SIG{__WARN__} = \&Graph::__carp_confess;
8              
9             sub _E () { 3 } # Graph::_E()
10             sub _i () { 3 } # Index to path.
11              
12             sub new {
13 78     78 1 232 my ($class, $g, %opt) = @_;
14 78         232 my @V = $g->vertices;
15 78         177 my $V = @V;
16 78         325 my $Z = "\0" x (($V + 7) / 8);
17 78         134 my %V; @V{ @V } = 0 .. $#V;
  78         570  
18 78         515 my $bm = bless [ [ ( $Z ) x $V ], \%V ], $class;
19 78         201 my $bm0 = $bm->[0];
20 78         162 my $connect_edges = delete $opt{connect_edges};
21 78 50       206 $connect_edges = 1 unless defined $connect_edges;
22 78         146 my $transpose = delete $opt{transpose};
23 78         272 Graph::_opt_unknown(\%opt);
24 77 50       208 return $bm if !$connect_edges;
25             # for (my $i = 0; $i <= $#V; $i++) {
26             # my $u = $V[$i];
27             # for (my $j = 0; $j <= $#V; $j++) {
28             # vec($bm0->[$i], $j, 1) = 1 if $g->has_edge($u, $V[$j]);
29             # }
30             # }
31 77         329 my $undirected = $g->is_undirected;
32 77         375 for my $e ($g->edges) {
33 714         1857 my ($i0, $j0) = map $V{$_}, @$e;
34 714 100       1465 ($j0, $i0) = ($i0, $j0) if $transpose;
35 714         1565 vec($bm0->[$i0], $j0, 1) = 1;
36 714 100       1746 vec($bm0->[$j0], $i0, 1) = 1 if $undirected;
37             }
38 77         549 $bm;
39             }
40              
41             sub stringify {
42 3     3 0 5 my ($m) = @_;
43 3         5 my @V = sort keys %{ $m->[1] };
  3         18  
44 3         23 my $top = join ' ', map sprintf('%4s', $_), 'to:', @V;
45 3         12 my @indices = map $m->[1]{$_}, @V;
46 3         4 my @rows;
47 3         5 for my $n (@V) {
48 16         23 my @vals = $m->get_row($n, @V);
49 16 50       106 push @rows, join ' ', map sprintf('%4s', defined()?$_:''), $n, @vals;
50             }
51 3         27 join '', map "$_\n", $top, @rows;
52             }
53              
54 1     1 1 3 sub set { push @_, 1; goto &_get_set }
  1         3  
55 1     1 1 2 sub unset { push @_, 0; goto &_get_set }
  1         4  
56 14093     14093 1 18769 sub get { push @_, undef; goto &_get_set }
  14093         26798  
57             sub _get_set {
58 14095     14095   16677 my $val = pop;
59 14095         36839 my ($m, $u, $v) = @_;
60 14095         23020 my ($m0, $m1) = @$m[0, 1];
61 14095 100       43788 return if grep !defined, my ($i, $j) = @$m1{ $u, $v };
62 14094 100       41620 defined $val ? vec($m0->[$i], $j, 1) = $val : vec($m0->[$i], $j, 1);
63             }
64              
65             sub _set_row {
66 2     2   3 my $val = pop;
67 2         6 my ($m, $u) = splice @_, 0, 2;
68 2         3 my ($m0, $m1) = @$m[0, 1];
69 2 50       6 return unless defined(my $i = $m1->{ $u });
70 2         15 vec($m0->[$i], $_, 1) = $val for grep defined, @$m1{ @_ };
71             }
72 1     1 1 2 sub set_row { push @_, 1; goto &_set_row }
  1         3  
73 1     1 1 3 sub unset_row { push @_, 0; goto &_set_row }
  1         3  
74              
75             sub get_row {
76 22     22 1 36 my ($m, $u) = splice @_, 0, 2;
77 22         28 my ($m0, $m1) = @$m[0, 1];
78 22 50       49 return () x @_ unless defined(my $i = $m1->{ $u });
79 22 100       145 map defined() ? (vec($m0->[$i], $_, 1) ? 1 : 0) : undef, @$m1{ @_ };
    50          
80             }
81              
82             sub vertices {
83 3     3 1 816 keys %{ $_[0]->[1] };
  3         25  
84             }
85              
86             1;
87             __END__