|
| 1 | +use v6.d; |
| 2 | + |
| 3 | +use Graph; |
| 4 | + |
| 5 | +class Graph::Harary is Graph { |
| 6 | + has Int:D $.k is required; |
| 7 | + has Int:D $.n is required; |
| 8 | + |
| 9 | + submethod BUILD(:$!k!, :$!n!, Str:D :$prefix = '') { |
| 10 | + |
| 11 | + for ^$!n -> $i { |
| 12 | + for (1 ... $!k div 2) -> $j { |
| 13 | + self.edge-add($prefix ~ $i.Str, $prefix ~ (($i + $j) % $!n).Str, :!directed); |
| 14 | + self.edge-add($prefix ~ $i.Str, $prefix ~ (($i - $j) % $!n).Str, :!directed); |
| 15 | + } |
| 16 | + } |
| 17 | + |
| 18 | + if $!k !%% 2 { |
| 19 | + if $!n %% 2 { |
| 20 | + for ^($!n div 2) -> $i { |
| 21 | + self.edge-add($prefix ~ $i.Str, $prefix ~ ($i + $!n div 2).Str, :!directed); |
| 22 | + } |
| 23 | + } else { |
| 24 | + for ^(($!n - 1) div 2 + 1) -> $i { |
| 25 | + self.edge-add($prefix ~ $i.Str, $prefix ~ ($i + ($!n + 1) div 2).Str, :!directed); |
| 26 | + } |
| 27 | + self.edge-add($prefix ~ '0', $prefix ~ (($!n - 1) div 2).Str, :!directed); |
| 28 | + self.edge-add($prefix ~ '0', $prefix ~ (($!n + 1) div 2).Str, :!directed) |
| 29 | + } |
| 30 | + } |
| 31 | + |
| 32 | + # Same as Circulant |
| 33 | + self.vertex-coordinates = |
| 34 | + self.vertex-list.map({ my $i = $_.subst($prefix).Int - 1; $_ => [cos(2 * pi / $!n * $i), sin(2 * pi / $!n * $i)]}).Hash; |
| 35 | + } |
| 36 | + |
| 37 | + multi method new(Int:D $k, Int:D $n, Str:D :$prefix = '') { |
| 38 | + self.bless(:$k, :$n, :$prefix); |
| 39 | + } |
| 40 | + |
| 41 | + multi method new(Int:D :$n, Int:D :$k, Str:D :$prefix = '') { |
| 42 | + self.new($k, $n, :$prefix); |
| 43 | + } |
| 44 | +} |
| 45 | + |
0 commit comments