1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
/*
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"
void check(igraph_bool_t volume, igraph_integer_t dim, igraph_integer_t n, igraph_real_t radius, igraph_bool_t positive) {
igraph_matrix_t samples;
igraph_matrix_init(&samples, 0, 0);
if (volume) {
igraph_sample_sphere_volume(dim, n, radius, positive, &samples);
} else {
igraph_sample_sphere_surface(dim, n, radius, positive, &samples);
}
IGRAPH_ASSERT(igraph_matrix_ncol(&samples) == n);
IGRAPH_ASSERT(igraph_matrix_nrow(&samples) == dim);
for (igraph_integer_t col = 0; col < n; col++) {
igraph_real_t sum = 0;
for (igraph_integer_t row = 0; row < dim; row++) {
if (positive) {
IGRAPH_ASSERT(MATRIX(samples, row, col) >= 0);
}
sum += MATRIX(samples, row, col) * MATRIX(samples, row, col);
}
if (volume) {
IGRAPH_ASSERT(sum <= radius * radius);
} else {
IGRAPH_ASSERT(igraph_almost_equals(sum, radius * radius, 0.00001));
}
}
igraph_matrix_destroy(&samples);
}
int main(void) {
igraph_rng_seed(igraph_rng_default(), 42);
//No samples
check(0, 2, 0, 1, 0);
check(1, 2, 0, 1, 0);
//Five samples, four-dimensions, radius 2
check(0, 4, 5, 2, 0);
check(1, 4, 5, 2, 0);
//Same, positive orthant
check(0, 4, 5, 2, 1);
check(1, 4, 5, 2, 1);
VERIFY_FINALLY_STACK();
return 0;
}
|