aboutsummaryrefslogtreecommitdiff
path: root/tests/src/test_gensvm_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/test_gensvm_init.c')
-rw-r--r--tests/src/test_gensvm_init.c215
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);