File Coverage

blib/lib/Graph/MoreUtils/Smooth.pm
Criterion Covered Total %
statement 33 35 94.2
branch 12 20 60.0
condition 3 6 50.0
subroutine 6 6 100.0
pod 0 1 0.0
total 54 68 79.4


line stmt bran cond sub pod time code
1             package Graph::MoreUtils::Smooth;
2              
3             # ABSTRACT: Generate smoothed graphs
4             our $VERSION = '0.3.0'; # VERSION
5              
6 9     9   150119 use strict;
  9         19  
  9         355  
7 9     9   115 use warnings;
  9         26  
  9         628  
8              
9 9     9   5146 use Graph::MoreUtils::Smooth::Intermediate;
  9         35  
  9         364  
10 9     9   634 use Graph::Undirected;
  9         71644  
  9         324  
11 9     9   51 use Scalar::Util qw( blessed );
  9         16  
  9         4545  
12              
13             sub smooth
14             {
15 3     3 0 11 my( $graph ) = @_;
16              
17 3 50 33     36 if( !blessed $graph || !$graph->isa( Graph::Undirected:: ) ) {
18 0         0 die 'only Graph::Undirected and its derivatives are accepted' . "\n";
19             }
20              
21 3         19 for ($graph->vertices) {
22 55 100       22977 next unless $graph->degree( $_ ) == 2;
23 51         20087 my( $a, $b ) = sort $graph->neighbours( $_ );
24              
25             # do not reduce cycles of three vertices:
26 51 100       5813 next if $graph->has_edge( $a, $b );
27              
28 48         2798 my $intermediate;
29 48 50 66     1763 if( $graph->has_edge_attribute( $a, $_, 'intermediate' ) &&
    100          
    100          
30             $graph->has_edge_attribute( $b, $_, 'intermediate' ) ) {
31 0 0       0 $intermediate = Graph::MoreUtils::Smooth::Intermediate->new(
    0          
32             $_ lt $a
33             ? $graph->get_edge_attribute( $a, $_, 'intermediate' )->reverse
34             : $graph->get_edge_attribute( $a, $_, 'intermediate' ),
35             $_,
36             $_ gt $b
37             ? $graph->get_edge_attribute( $b, $_, 'intermediate' )->reverse
38             : $graph->get_edge_attribute( $b, $_, 'intermediate' ) );
39             } elsif( $graph->has_edge_attribute( $a, $_, 'intermediate' ) ) {
40 23         16769 $intermediate = $graph->get_edge_attribute( $a, $_, 'intermediate' );
41 23 50       4895 $intermediate->reverse if $a gt $_; # getting natural order
42 23         78 push @$intermediate, $_;
43             } elsif( $graph->has_edge_attribute( $b, $_, 'intermediate' ) ) {
44 23         16491 $intermediate = $graph->get_edge_attribute( $b, $_, 'intermediate' );
45 23 50       5007 $intermediate->reverse if $_ gt $b; # getting natural order
46 23         83 unshift @$intermediate, $_;
47             } else {
48 2         1488 $intermediate = Graph::MoreUtils::Smooth::Intermediate->new( $_ );
49             }
50              
51 48         203 $graph->delete_vertex( $_ );
52 48         17152 $graph->set_edge_attribute( $a, $b, 'intermediate', $intermediate );
53             }
54              
55 3         664 return $graph;
56             }
57              
58             1;