Files
agent_compositor_test/references/igraph-1.0.1/tests/unit/jdm.c
T
Abdelrahman Said a11edf0c53 Add graph references
2026-06-28 13:49:01 +01:00

323 lines
10 KiB
C

/*
igraph library.
Copyright (C) 2023 The igraph development team <igraph@igraph.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <igraph.h>
#include "test_utilities.h"
void print_and_destroy(igraph_t* g, igraph_matrix_t* jdm, igraph_vector_t* weights) {
print_matrix(jdm);
igraph_destroy(g);
if (weights) {
igraph_vector_destroy(weights);
}
}
int main (void) {
igraph_t g;
igraph_matrix_t jdm;
igraph_vector_t weights;
// This matrix will be re-used throughout the test
igraph_matrix_init(&jdm, 0, 0);
printf("Graph with no vertices\n");
igraph_small(&g, 0, false, -1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
printf("3-cycle\n");
igraph_ring(&g, 3, IGRAPH_UNDIRECTED, false, true);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
printf("Three self-loops\n");
igraph_small(&g, 3, IGRAPH_UNDIRECTED,
0,0, 1,1, 2,2,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
printf("One self-loop and two parallel edges\n");
igraph_small(&g, 3, IGRAPH_UNDIRECTED,
0,0, 1,2, 1,2,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
printf("Simple, undirected graph\n");
igraph_small(&g, 5, false,
0, 1, 0, 2, 0, 4,
1, 4,
2, 3, 2, 4,
3, 4,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
printf("Simple, directed graph\n");
igraph_small(&g, 5, true,
0, 1, 0, 2, 0, 4,
1, 0,
3, 2, 3, 4,
4, 0, 4, 1, 4, 2, 4, 3,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
printf("Undirected, self-loops, no multiedges\n");
igraph_small(&g, 5, false,
0, 1, 0, 2, 0, 4,
1, 1, 1, 4,
2, 3, 2, 4,
3, 4,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
printf("Directed, self-loops, no multiedges\n");
igraph_small(&g, 5, true,
0, 1, 0, 2, 0, 4,
1, 1, 1, 0,
3, 2, 3, 4,
4, 0, 4, 1, 4, 2, 4, 3,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
printf("Undirected multigraph, no self-loops\n");
igraph_small(&g, 5, false,
0, 1, 0, 2, 0, 4,
1, 4, 1, 4,
2, 3, 2, 4,
3, 4,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
printf("Directed multigraph, no self-loops\n");
igraph_small(&g, 5, true,
0, 1, 0, 2, 0, 4,
1, 0,
3, 2, 3, 4,
4, 0, 4, 1, 4, 2, 4, 3, 4, 3,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
printf("Undirected multigraph with self-loops\n");
igraph_small(&g, 5, false,
0, 1, 0, 2, 0, 4,
1, 1, 1, 4, 1, 4,
2, 3, 2, 4,
3, 4,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
printf("Directed multigraph with self-loops\n");
igraph_small(&g, 5, true,
0, 1, 0, 2, 0, 4,
1, 1, 1, 0,
3, 2, 3, 4,
4, 0, 4, 1, 4, 2, 4, 3, 4, 3,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
// Weight tests
printf("Weighted, simple, undirected graph\n");
igraph_small(&g, 5, false,
0, 1, 0, 2, 0, 4,
1, 4,
2, 3, 2, 4,
3, 4,
-1);
igraph_vector_init_range(&weights, -1,6);
igraph_joint_degree_matrix(&g, &weights, &jdm, -1, -1);
print_and_destroy(&g, &jdm, &weights);
printf("Weighted, simple, directed graph\n");
igraph_small(&g, 5, true,
0, 1, 0, 2, 0, 4,
1, 0,
3, 2, 3, 4,
4, 0, 4, 1, 4, 2, 4, 3,
-1);
igraph_vector_init_range(&weights, -2,8);
igraph_joint_degree_matrix(&g, &weights, &jdm, -1, -1);
print_and_destroy(&g, &jdm, &weights);
printf("Weighted, undirected, self-loops, no multiedges\n");
igraph_small(&g, 5, false,
0, 1, 0, 2, 0, 4,
1, 1, 1, 4,
2, 3, 2, 4,
3, 4,
-1);
igraph_vector_init_range(&weights, 1,9);
igraph_joint_degree_matrix(&g, &weights, &jdm, -1, -1);
print_and_destroy(&g, &jdm, &weights);
printf("Weighted, directed, self-loops, no multiedges\n");
igraph_small(&g, 5, true,
0, 1, 0, 2, 0, 4,
1, 1, 1, 0,
3, 2, 3, 4,
4, 0, 4, 1, 4, 2, 4, 3,
-1);
igraph_vector_init_range(&weights, 1,12);
igraph_joint_degree_matrix(&g, &weights, &jdm, -1, -1);
print_and_destroy(&g, &jdm, &weights);
printf("Weighted, undirected multigraph, no self-loops\n");
igraph_small(&g, 5, false,
0, 1, 0, 2, 0, 4,
1, 4, 1, 4,
2, 3, 2, 4,
3, 4,
-1);
igraph_vector_init_range(&weights, 1,9);
igraph_joint_degree_matrix(&g, &weights, &jdm, -1, -1);
print_and_destroy(&g, &jdm, &weights);
printf("Weighted, directed multigraph, no self-loops\n");
igraph_small(&g, 5, true,
0, 1, 0, 2, 0, 4,
1, 0,
3, 2, 3, 4,
4, 0, 4, 1, 4, 2, 4, 3, 4, 3,
-1);
igraph_vector_init_range(&weights, 1,12);
igraph_joint_degree_matrix(&g, &weights, &jdm, -1, -1);
print_and_destroy(&g, &jdm, &weights);
printf("Weighted, undirected multigraph with self-loops\n");
igraph_small(&g, 5, false,
0, 1, 0, 2, 0, 4,
1, 1, 1, 4, 1, 4,
2, 3, 2, 4,
3, 4,
-1);
igraph_vector_init_range(&weights, 1,10);
igraph_joint_degree_matrix(&g, &weights, &jdm, -1, -1);
print_and_destroy(&g, &jdm, &weights);
printf("Weighted, directed multigraph with self-loops\n");
igraph_small(&g, 5, true,
0, 1, 0, 2, 0, 4,
1, 1, 1, 0,
3, 2, 3, 4,
4, 0, 4, 1, 4, 2, 4, 3, 4, 3,
-1);
igraph_vector_init_range(&weights, 1,13);
igraph_joint_degree_matrix(&g, &weights, &jdm, -1, -1);
print_and_destroy(&g, &jdm, &weights);
// dout din tests
// Directed
printf("Directed: dout is small, cropped JDM (3x3)\n");
igraph_small(&g, 5, true,
0, 1, 0, 2, 0, 4,
1, 0,
3, 2, 3, 4,
4, 0, 4, 1, 4, 2, 4, 3,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, 3, 3);
print_and_destroy(&g, &jdm, NULL);
printf("Directed: din is small, cropped JDM (4, 2)\n");
igraph_small(&g, 5, true,
0, 1, 0, 2, 0, 4,
1, 0,
3, 2, 3, 4,
4, 0, 4, 1, 4, 2, 4, 3,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, 4, 2);
print_and_destroy(&g, &jdm, NULL);
printf("Directed: Automatic resize, dout < 0 (4x2)\n");
igraph_small(&g, 5, true,
0, 1, 0, 2, 0, 4,
1, 0,
3, 2, 3, 4,
4, 0, 4, 1, 4, 2, 4, 3,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, 2);
print_and_destroy(&g, &jdm, NULL);
printf("Directed: Valid dout and din (5x5)\n");
igraph_small(&g, 5, true,
0, 1, 0, 2, 0, 4,
1, 0,
3, 2, 3, 4,
4, 0, 4, 1, 4, 2, 4, 3,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, 5, 5);
print_and_destroy(&g, &jdm, NULL);
// Undirected
printf("Undirected: dout is small, cropped JDM (3x4)\n");
igraph_small(&g, 5, false,
0, 1, 0, 2, 0, 4,
1, 4,
2, 3, 2, 4,
3, 4,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, 3, 4);
print_and_destroy(&g, &jdm, NULL);
printf("Undirected: din is small, cropped JDM (4x3)\n");
igraph_small(&g, 5, false,
0, 1, 0, 2, 0, 4,
1, 4,
2, 3, 2, 4,
3, 4,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, 4, 3);
print_and_destroy(&g, &jdm, NULL);
printf("Undirected: Automatic resize, dout or din < 0 (4x4)\n");
igraph_small(&g, 5, false,
0, 1, 0, 2, 0, 4,
1, 4,
2, 3, 2, 4,
3, 4,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, -1, -1);
print_and_destroy(&g, &jdm, NULL);
printf("Undirected: Valid dout and din (5x5)\n");
igraph_small(&g, 5, false,
0, 1, 0, 2, 0, 4,
1, 4,
2, 3, 2, 4,
3, 4,
-1);
igraph_joint_degree_matrix(&g, NULL, &jdm, 5, 5);
print_and_destroy(&g, &jdm, NULL);
// Clean up
igraph_matrix_destroy(&jdm);
VERIFY_FINALLY_STACK();
return 0;
}