diff options
Diffstat (limited to 'tests/src/test_gensvm_init.c')
| -rw-r--r-- | tests/src/test_gensvm_init.c | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/tests/src/test_gensvm_init.c b/tests/src/test_gensvm_init.c new file mode 100644 index 0000000..8cacd9b --- /dev/null +++ b/tests/src/test_gensvm_init.c @@ -0,0 +1,215 @@ +/** + * @file test_gensvm_init.c + * @author Gertjan van den Burg + * @date August, 2016 + * @brief Unit tests for gensvm_init.c functions + */ + +#include "minunit.h" +#include "gensvm_init.h" + +char *test_init_null() +{ + int i; + long n = 5, + m = 2, + K = 3; + double value; + struct GenModel *model = gensvm_init_model(); + struct GenData *data = gensvm_init_data(); + + // start test code + model->n = n; + model->m = m; + model->K = K; + gensvm_allocate_model(model); + + data->n = n; + data->m = m; + data->K = K; + data->RAW = Calloc(double, n*(m+1)); + for (i=0; i<n; i++) { + matrix_set(data->RAW, m+1, i, 0, 1.0); + matrix_set(data->RAW, m+1, i, 1, i); + matrix_set(data->RAW, m+1, i, 2, -i); + } + data->Z = data->RAW; + + gensvm_init_V(NULL, model, data); + + // first row all ones + value = matrix_get(model->V, K-1, 0, 0); + mu_assert(value == 1.0, "Incorrect value at 0, 0"); + value = matrix_get(model->V, K-1, 0, 1); + mu_assert(value == 1.0, "Incorrect value at 0, 1"); + + // second row between -1 and 0.25 + value = matrix_get(model->V, K-1, 1, 0); + mu_assert(value >= -1.0 && value <= 0.25, "Incorrect value at 1, 0"); + value = matrix_get(model->V, K-1, 1, 1); + mu_assert(value >= -1.0 && value <= 0.25, "Incorrect value at 1, 1"); + + // third row between -0.25 and 1 + value = matrix_get(model->V, K-1, 2, 0); + mu_assert(value >= -0.25 && value <= 1.0, "Incorrect value at 2, 0"); + value = matrix_get(model->V, K-1, 2, 1); + mu_assert(value >= -0.25 && value <= 1.0, "Incorrect value at 2, 1"); + + // end test code + + gensvm_free_model(model); + gensvm_free_data(data); + + return NULL; +} + +char *test_init_seed() +{ + + long n = 7, + m = 5, + K = 3; + struct GenModel *model = gensvm_init_model(); + struct GenModel *seed = gensvm_init_model(); + struct GenData *data = gensvm_init_data(); + + model->n = n; + model->m = m; + model->K = K; + seed->n = n; + seed->m = m; + seed->K = K; + data->n = n; + data->m = m; + data->K = K; + gensvm_allocate_model(model); + gensvm_allocate_model(seed); + + // start test code + matrix_set(seed->V, seed->K-1, 0, 0, 123.0); + matrix_set(seed->V, seed->K-1, 1, 1, 321.0); + matrix_set(seed->V, seed->K-1, 2, 0, 111.0); + matrix_set(seed->V, seed->K-1, 5, 0, 222.0); + matrix_set(seed->V, seed->K-1, 3, 1, 333.0); + + gensvm_init_V(seed, model, data); + + mu_assert(matrix_get(model->V, model->K-1, 0, 0) == 123.0, + "Incorrect V value at 0, 0"); + mu_assert(matrix_get(model->V, model->K-1, 0, 1) == 0.0, + "Incorrect V value at 0, 1"); + mu_assert(matrix_get(model->V, model->K-1, 1, 0) == 0.0, + "Incorrect V value at 1, 0"); + mu_assert(matrix_get(model->V, model->K-1, 1, 1) == 321.0, + "Incorrect V value at 1, 1"); + mu_assert(matrix_get(model->V, model->K-1, 2, 0) == 111.0, + "Incorrect V value at 2, 0"); + mu_assert(matrix_get(model->V, model->K-1, 2, 1) == 0.0, + "Incorrect V value at 2, 1"); + mu_assert(matrix_get(model->V, model->K-1, 3, 0) == 0.0, + "Incorrect V value at 3, 0"); + mu_assert(matrix_get(model->V, model->K-1, 3, 1) == 333.0, + "Incorrect V value at 3, 1"); + mu_assert(matrix_get(model->V, model->K-1, 4, 0) == 0.0, + "Incorrect V value at 4, 0"); + mu_assert(matrix_get(model->V, model->K-1, 4, 1) == 0.0, + "Incorrect V value at 4, 1"); + mu_assert(matrix_get(model->V, model->K-1, 5, 0) == 222.0, + "Incorrect V value at 5, 0"); + mu_assert(matrix_get(model->V, model->K-1, 5, 1) == 0.0, + "Incorrect V value at 5, 1"); + // end test code + + gensvm_free_model(model); + gensvm_free_model(seed); + gensvm_free_data(data); + + return NULL; +} + +char *test_init_weights_1() +{ + struct GenModel *model = gensvm_init_model(); + struct GenData *data = NULL; + model->n = 7; + model->m = 5; + model->K = 3; + model->weight_idx = 1; + gensvm_allocate_model(model); + + // start test code + int i; + gensvm_initialize_weights(data, model); + for (i=0; i<model->n; i++) { + mu_assert(model->rho[i] == 1.0, "incorrect weight in rho"); + } + // end test code + + gensvm_free_model(model); + gensvm_free_data(data); + + return NULL; +} + +char *test_init_weights_2() +{ + struct GenModel *model = gensvm_init_model(); + struct GenData *data = gensvm_init_data(); + model->n = 8; + model->m = 5; + model->K = 3; + model->weight_idx = 2; + gensvm_allocate_model(model); + + data->y = Calloc(long, model->n); + + data->y[0] = 1; + data->y[1] = 1; + data->y[2] = 1; + data->y[3] = 1; + data->y[4] = 2; + data->y[5] = 2; + data->y[6] = 2; + data->y[7] = 3; + + // start test code + gensvm_initialize_weights(data, model); + int i; + for (i=0; i<4; i++) { + mu_assert(model->rho[i] == 8.0/(4.0 * 3.0), + "Incorrect weight for class 1"); + } + for (i=0; i<3; i++) { + mu_assert(model->rho[4+i] == 8.0/(3.0 * 3.0), + "Incorrect weight for class 2"); + } + mu_assert(model->rho[7] == 8.0/(1.0 * 3.0), + "Incorrect weight for class 3"); + + // end test code + + gensvm_free_model(model); + gensvm_free_data(data); + + return NULL; +} + +char *test_init_weights_wrong() +{ + mu_test_missing(); + return NULL; +} + +char *all_tests() +{ + mu_suite_start(); + mu_run_test(test_init_null); + mu_run_test(test_init_seed); + mu_run_test(test_init_weights_1); + mu_run_test(test_init_weights_2); + mu_run_test(test_init_weights_wrong); + + return NULL; +} + +RUN_TESTS(all_tests); |
