Graph-Maker-Other
view release on metacpan or search on metacpan
xt/BiStar-isomorphic.t view on Meta::CPAN
BEGIN { MyTestHelpers::nowarnings() }
use File::Spec;
use lib File::Spec->catdir('devel','lib');
use MyGraphs;
plan tests => 96;
sub make_star {
my %params = @_;
my $graph = Graph::Maker->new('star', %params);
# fix for Graph::Maker::Star version 0.01 makes empty for 1-vertex
if ($params{'N'}==1 && $graph->vertices==0) { $graph->add_vertex(1); }
return $graph;
}
#------------------------------------------------------------------------------
# bistar_W(n,m) = n--; m--; n + 2*n*(n-1)/2 + 2*n + 3*n*m \
# + 1 + 2*m \
# + m + 2*m*(m-1)/2;
# bistar_W(n,m) = (n+m)^2 + (n+1)*(m+2) - 5*n - 4*m;
# bistar_W(n,m) = (n+m)*(n+m-3) + n*m + 2;
# bistar_W('n,'m)
# bistar_W(10,6) == 270
# bistar_W(11,6) == 306
# 306/bistar_pairs(11,6)/3 == 3/4
# bistar_pairs(n,m) = (n+m)*(n+m-1)/2;
# diameter=3
# matrix(16,16,n,m, floor(bistar_W(n,m) / bistar_pairs(n,m) / 3 *1000))
# bistar_W(n,m) / bistar_pairs(n,m) / 3 = 3/4
# 4*bistar_W(n,m) = 9*bistar_pairs(n,m)
# 4*bistar_W(n,m) - 9*bistar_pairs(n,m) == \
# -1/2*n^2 + 3*m*n - 15/2*n + -1/2*m^2 - 15/2*m + 8
# 2*(4*bistar_W(n,m) - 9*bistar_pairs(n,m)) == \
# -n^2 + 6*m*n - m^2 - 15*n - 15*m + 16
# bistar_W_diff(n,m) = -n^2 + 6*m*n - m^2 - 15*n - 15*m + 16;
# my(len=10000);for(n=1,len,for(m=1,n, my(d=bistar_W_diff(n,m)); if(d==0,print(n","m" = "n+m); if(d>0,break()))));
#
# my(a='a,b='b); -(n+a)^2 + 6*(m+b)*(n+a) - (m+b)^2 - 15*(n+a) - 15*(m+b) + 16
# 6*a - 2*b = 15
# -2*a + 6*b = 15
# [6,-2;-2,6]^-1*[15;15]
# my(a=15/4,b=15/4); -(n+a)^2 + 6*(m+b)*(n+a) - (m+b)^2 - 15*(n+a) - 15*(m+b) + 16
# 4*n^2 - 24*m*n + 4*m^2 = -161
# 24-4*4*4 == -40 \\ positive definite
sub BiStar_Wiener {
my ($N,$M) = @_;
return ($N+$M)*($N+$M-3) + $N*$M + 2
+ ($M==0 ? $N-1 : 0)
+ ($N==0 ? $M-1 : 0);
}
{
foreach my $N (0 .. 5) {
foreach my $M (0 .. $N) {
my $bistar = Graph::Maker->new('bi_star', N=>$N, M=>$M, undirected=>1);
my $W_graph = MyGraphs::Graph_Wiener_index($bistar);
my $W_formula = BiStar_Wiener($N,$M);
ok ($W_formula, $W_graph, "BiStar Wiener N=$N, M=$M");
}
}
}
sub Star_Wiener {
my ($N) = @_;
return ($N-1)**2 + ($N==0 ? -1 : 0);
}
{
foreach my $N (0 .. 5) {
my $star = make_star(N=>$N, undirected=>1);
my $W_graph = MyGraphs::Graph_Wiener_index($star);
my $W_formula = Star_Wiener($N);
ok ($W_formula, $W_graph, "Star Wiener N=$N");
}
}
#------------------------------------------------------------------------------
sub BiStar_diameter {
my ($N,$M) = @_;
return ($N>=2) + ($M>=2) + ($N>=3 || $M>=3 || ($N>=1&&$M>=1));
}
{
foreach my $N (0 .. 5) {
foreach my $M (0 .. 5) {
my $graph = Graph::Maker->new('bi_star', N=>$N, M=>$M, undirected=>1);
my $d_graph = $graph->diameter || 0;
my $d_formula = BiStar_diameter($N,$M);
ok ($d_formula, $d_graph, "BiStar diameter N=$N, M=$M");
}
}
}
#------------------------------------------------------------------------------
# N=1 or M=1 or N=0 or M=0 same as star N+M
{
foreach my $N (0, 1) {
foreach my $M (0 .. 4) {
foreach my $swap (0,1) {
my $N = $N;
my $M = $M;
if ($swap) { ($N,$M) = ($M,$N); }
my $star = make_star(N=>$N+$M, undirected=>1);
my $bistar = Graph::Maker->new('bi_star', N=>$N, M=>$M, undirected=>1);
# MyGraphs::Graph_view($star);
# MyGraphs::Graph_view($bistar);
ok (!! MyGraphs::Graph_is_isomorphic($bistar, $star),
1,
"N=$N, M=$M");
}
}
}
}
#------------------------------------------------------------------------------
# N,M swap is isomorphic
{
foreach my $undirected (0,1) {
foreach my $N (0, 4) {
foreach my $M (0 .. $N) {
my $bistar1 = Graph::Maker->new('bi_star', N=>$N, M=>$M,
undirected=>$undirected);
my $bistar2 = Graph::Maker->new('bi_star', N=>$M, M=>$N,
undirected=>$undirected);
ok (!! MyGraphs::Graph_is_isomorphic($bistar1, $bistar2),
1,
"N=$N, M=$M");
}
}
}
}
#------------------------------------------------------------------------------
# POD HOG Shown
{
my %shown = ('2,2' => 594,
'3,2' => 30,
'3,3' => 334,
'4,2' => 208,
'4,3' => 452,
'4,4' => 586,
( run in 0.553 second using v1.01-cache-2.11-cpan-39bf76dae61 )