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

179 lines
7.5 KiB
C

/*
igraph library.
Copyright (C) 2021 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"
int main(void) {
igraph_t graph, graph_test;
igraph_vector_int_t shifts;
igraph_bool_t iso, same;
igraph_int_t i;
/* Testing invalid values */
/* n = -3, shifts = [1], undirected */
igraph_vector_int_init_int(&shifts, 1, 1);
CHECK_ERROR(igraph_circulant(&graph, -3, &shifts, IGRAPH_UNDIRECTED), IGRAPH_EINVAL);
igraph_vector_int_destroy(&shifts);
/* Testing n = 0 case */
/* n = 0, shifts = [1], undirected */
igraph_vector_int_init_int(&shifts, 1, 1);
IGRAPH_ASSERT(igraph_circulant(&graph, 0, &shifts, IGRAPH_UNDIRECTED) == IGRAPH_SUCCESS);
IGRAPH_ASSERT(igraph_vcount(&graph) == 0);
IGRAPH_ASSERT(igraph_ecount(&graph) == 0);
igraph_vector_int_destroy(&shifts);
igraph_destroy(&graph);
/* Testing n = 1 case */
/* n = 1, shifts = [1], undirected */
igraph_vector_int_init_int(&shifts, 1, 1);
IGRAPH_ASSERT(igraph_circulant(&graph, 1, &shifts, IGRAPH_UNDIRECTED) == IGRAPH_SUCCESS);
igraph_small(&graph_test, 1, IGRAPH_UNDIRECTED, -1);
IGRAPH_ASSERT(igraph_is_same_graph(&graph, &graph_test, &same) == IGRAPH_SUCCESS);
IGRAPH_ASSERT(same);
igraph_destroy(&graph);
igraph_destroy(&graph_test);
igraph_vector_int_destroy(&shifts);
/* Testing n = 2 case */
/* n = 2, shifts = [1], undirected */
igraph_vector_int_init_int(&shifts, 1, 1);
IGRAPH_ASSERT(igraph_circulant(&graph, 2, &shifts, IGRAPH_UNDIRECTED) == IGRAPH_SUCCESS);
igraph_small(&graph_test, 2, IGRAPH_UNDIRECTED, 0, 1, -1);
IGRAPH_ASSERT(igraph_is_same_graph(&graph, &graph_test, &same) == IGRAPH_SUCCESS);
IGRAPH_ASSERT(same);
igraph_destroy(&graph);
igraph_destroy(&graph_test);
igraph_vector_int_destroy(&shifts);
/* Testing empty list case */
/* n = 5, shifts = [], undirected */
igraph_vector_int_init(&shifts, 0);
IGRAPH_ASSERT(igraph_circulant(&graph, 5, &shifts, IGRAPH_UNDIRECTED) == IGRAPH_SUCCESS);
igraph_small(&graph_test, 5, IGRAPH_UNDIRECTED, -1);
IGRAPH_ASSERT(igraph_is_same_graph(&graph, &graph_test, &same) == IGRAPH_SUCCESS);
IGRAPH_ASSERT(same);
igraph_destroy(&graph);
igraph_destroy(&graph_test);
igraph_vector_int_destroy(&shifts);
/* Testing typical use case */
/* Test n = 5, shifts = [1, 2], undirected */
igraph_vector_int_init_int(&shifts, 2, 1, 2);
IGRAPH_ASSERT(igraph_circulant(&graph, 5, &shifts, IGRAPH_UNDIRECTED) == IGRAPH_SUCCESS);
igraph_small(&graph_test, 5, IGRAPH_UNDIRECTED, 0, 1, 1, 2, 2, 3, 3, 4, 4, 0, 0, 2,
2, 4, 4, 1, 1, 3, 3, 0, -1);
IGRAPH_ASSERT(igraph_isomorphic(&graph, &graph_test, &iso) == IGRAPH_SUCCESS);
IGRAPH_ASSERT(iso);
igraph_destroy(&graph);
igraph_destroy(&graph_test);
igraph_vector_int_destroy(&shifts);
/* Testing simplification */
/* n = 6, shifts = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], undirected */
igraph_vector_int_init(&shifts, 0);
for (i = 1; i <= 15; i++) {
igraph_vector_int_push_back(&shifts, i);
}
IGRAPH_ASSERT(igraph_circulant(&graph, 6, &shifts, IGRAPH_UNDIRECTED) == IGRAPH_SUCCESS);
igraph_full(&graph_test, 6, IGRAPH_UNDIRECTED, IGRAPH_NO_LOOPS);
IGRAPH_ASSERT(igraph_isomorphic(&graph, &graph_test, &iso) == IGRAPH_SUCCESS);
IGRAPH_ASSERT(iso);
igraph_destroy(&graph);
igraph_destroy(&graph_test);
igraph_vector_int_destroy(&shifts);
/* Testing simplification with negative values */
/* n = 7, shifts = [-15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5,
-4, -3, -2, -1, 0, 1, 2, 3, 4], undirected */
igraph_vector_int_init(&shifts, 0);
for (i = -15; i <= 4; i++) {
igraph_vector_int_push_back(&shifts, i);
}
IGRAPH_ASSERT(igraph_circulant(&graph, 7, &shifts, IGRAPH_UNDIRECTED) == IGRAPH_SUCCESS);
igraph_full(&graph_test, 7, IGRAPH_UNDIRECTED, IGRAPH_NO_LOOPS);
IGRAPH_ASSERT(igraph_isomorphic(&graph, &graph_test, &iso) == IGRAPH_SUCCESS);
IGRAPH_ASSERT(iso);
igraph_destroy(&graph);
igraph_destroy(&graph_test);
igraph_vector_int_destroy(&shifts);
/* Testing simplification when n is even, the offset = n/2, and the graph is undirected */
/* n = 6, shifts = [3], undirected */
igraph_vector_int_init_int(&shifts, 1, 3);
IGRAPH_ASSERT(igraph_circulant(&graph, 6, &shifts, IGRAPH_UNDIRECTED) == IGRAPH_SUCCESS);
igraph_small(&graph_test, 6, IGRAPH_UNDIRECTED, 0, 3, 1, 4, 2, 5, -1);
IGRAPH_ASSERT(igraph_isomorphic(&graph, &graph_test, &iso) == IGRAPH_SUCCESS);
IGRAPH_ASSERT(iso);
igraph_destroy(&graph);
igraph_destroy(&graph_test);
igraph_vector_int_destroy(&shifts);
/* Testing directed graph */
/* n = 7, shifts = [1, -2], directed */
igraph_vector_int_init_int(&shifts, 2, 1, -2);
IGRAPH_ASSERT(igraph_circulant(&graph, 7, &shifts, IGRAPH_DIRECTED) == IGRAPH_SUCCESS);
igraph_small(&graph_test, 7, IGRAPH_DIRECTED, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 0,
0, 5, 1, 6, 2, 0, 3, 1, 4, 2, 5, 3, 6, 4, -1);
IGRAPH_ASSERT(igraph_isomorphic(&graph, &graph_test, &iso) == IGRAPH_SUCCESS);
IGRAPH_ASSERT(iso);
igraph_destroy(&graph);
igraph_destroy(&graph_test);
igraph_vector_int_destroy(&shifts);
/* Testing simplification works for directed too */
/* n = 5, shifts = [-4, 1, 6], directed */
igraph_vector_int_init_int(&shifts, 3, -4, 1, 6);
IGRAPH_ASSERT(igraph_circulant(&graph, 5, &shifts, IGRAPH_DIRECTED) == IGRAPH_SUCCESS);
igraph_small(&graph_test, 5, IGRAPH_DIRECTED, 0, 1, 1, 2, 2, 3, 3, 4, 4, 0, -1);
IGRAPH_ASSERT(igraph_isomorphic(&graph, &graph_test, &iso) == IGRAPH_SUCCESS);
IGRAPH_ASSERT(iso);
igraph_destroy(&graph);
igraph_destroy(&graph_test);
igraph_vector_int_destroy(&shifts);
/* Testing that things that are normally simplified for undirected are not simplified for directed */
/* n = 5, shifts = [1, -1], directed */
igraph_vector_int_init_int(&shifts, 2, 1, -1);
IGRAPH_ASSERT(igraph_circulant(&graph, 5, &shifts, IGRAPH_DIRECTED) == IGRAPH_SUCCESS);
igraph_small(&graph_test, 5, IGRAPH_DIRECTED, 0, 1, 1, 2, 2, 3, 3, 4, 4, 0,
1, 0, 2, 1, 3, 2, 4, 3, 0, 4, -1);
IGRAPH_ASSERT(igraph_is_same_graph(&graph, &graph_test, &same) == IGRAPH_SUCCESS);
IGRAPH_ASSERT(same);
igraph_destroy(&graph);
igraph_destroy(&graph_test);
igraph_vector_int_destroy(&shifts);
/* n = 6, shifts = [3], directed */
igraph_vector_int_init_int(&shifts, 1, 3);
IGRAPH_ASSERT(igraph_circulant(&graph, 6, &shifts, IGRAPH_DIRECTED) == IGRAPH_SUCCESS);
igraph_small(&graph_test, 6, IGRAPH_DIRECTED, 0, 3, 1, 4, 2, 5, 3, 0, 4, 1, 5, 2, -1);
IGRAPH_ASSERT(igraph_is_same_graph(&graph, &graph_test, &same) == IGRAPH_SUCCESS);
IGRAPH_ASSERT(same);
igraph_destroy(&graph);
igraph_destroy(&graph_test);
igraph_vector_int_destroy(&shifts);
VERIFY_FINALLY_STACK();
return 0;
}