aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGertjan van den Burg <burg@ese.eur.nl>2016-12-05 11:18:50 +0100
committerGertjan van den Burg <burg@ese.eur.nl>2016-12-05 11:18:50 +0100
commite616c9e2241b68faadec5dfd6d12c49002d1bdc1 (patch)
tree65ffec258c9583ea0c720eb2292b314f090a528f /src
parentcompute ZAZ in blocks to increase numerical precision (diff)
downloadgensvm-e616c9e2241b68faadec5dfd6d12c49002d1bdc1.tar.gz
gensvm-e616c9e2241b68faadec5dfd6d12c49002d1bdc1.zip
Improvements and tests for tasks and gridsearch
Diffstat (limited to 'src')
-rw-r--r--src/gensvm_consistency.c8
-rw-r--r--src/gensvm_task.c62
2 files changed, 65 insertions, 5 deletions
diff --git a/src/gensvm_consistency.c b/src/gensvm_consistency.c
index 0dc9108..eaa4f8c 100644
--- a/src/gensvm_consistency.c
+++ b/src/gensvm_consistency.c
@@ -61,7 +61,7 @@ struct GenQueue *gensvm_top_queue(struct GenQueue *q, double percentile)
long i, k, N = 0;
double boundary,
*perf = Calloc(double, q->N);
- struct GenQueue *nq = Malloc(struct GenQueue, 1);
+ struct GenQueue *nq = gensvm_init_queue();
// find the desired percentile of performance
for (i=0; i<q->N; i++) {
@@ -82,7 +82,7 @@ struct GenQueue *gensvm_top_queue(struct GenQueue *q, double percentile)
k = 0;
for (i=0; i<q->N; i++) {
if (q->tasks[i]->performance >= boundary)
- nq->tasks[k++] = q->tasks[i];
+ nq->tasks[k++] = gensvm_copy_task(q->tasks[i]);
}
nq->N = N;
nq->i = 0;
@@ -257,8 +257,8 @@ void gensvm_consistency_repeats(struct GenQueue *q, long repeats,
// make sure no double free occurs with the copied kernelparam
model->kernelparam = NULL;
gensvm_free_model(model);
- free(nq->tasks);
- free(nq);
+ gensvm_free_queue(nq);
+
free(perf);
free(std);
free(mean);
diff --git a/src/gensvm_task.c b/src/gensvm_task.c
index 2de0280..468705a 100644
--- a/src/gensvm_task.c
+++ b/src/gensvm_task.c
@@ -74,6 +74,52 @@ void gensvm_free_task(struct GenTask *t)
}
/**
+ * @brief Deepcopy a GenTask struct
+ *
+ * @details
+ * Create a deep copy of a GenTask struct. The kernelparameters are copied to
+ * a new array. Note that the datasets belonging to the tasks are not copied,
+ * only the pointers to the datasets.
+ *
+ * @param[in] t input GenTask struct to copy
+ *
+ * @return a deepcopy of the input GenTask
+ */
+struct GenTask *gensvm_copy_task(struct GenTask *t)
+{
+ struct GenTask *nt = gensvm_init_task();
+ nt->weight_idx = t->weight_idx;
+ nt->folds = t->folds;
+ nt->ID = t->ID;
+ nt->p = t->p;
+ nt->kappa = t->kappa;
+ nt->lambda = t->lambda;
+ nt->epsilon = t->epsilon;
+ nt->train_data = t->train_data;
+ nt->test_data = t->test_data;
+ nt->performance = t->performance;
+
+ nt->kerneltype = t->kerneltype;
+ if (nt->kerneltype == K_LINEAR) {
+ nt->kernelparam = NULL;
+ } else if (nt->kerneltype == K_RBF) {
+ nt->kernelparam = Malloc(double, 1);
+ nt->kernelparam[0] = t->kernelparam[0];
+ } else if (nt->kerneltype == K_POLY) {
+ nt->kernelparam = Malloc(double, 3);
+ nt->kernelparam[0] = t->kernelparam[0];
+ nt->kernelparam[1] = t->kernelparam[1];
+ nt->kernelparam[2] = t->kernelparam[2];
+ } else if (nt->kerneltype == K_SIGMOID) {
+ nt->kernelparam = Malloc(double, 2);
+ nt->kernelparam[0] = t->kernelparam[0];
+ nt->kernelparam[1] = t->kernelparam[1];
+ }
+
+ return nt;
+}
+
+/**
* @brief Copy parameters from GenTask to GenModel
*
* @details
@@ -94,5 +140,19 @@ void gensvm_task_to_model(struct GenTask *task, struct GenModel *model)
// copy kernel parameters
model->kerneltype = task->kerneltype;
- model->kernelparam = task->kernelparam;
+ if (model->kerneltype == K_LINEAR) {
+ model->kernelparam = NULL;
+ } else if (model->kerneltype == K_RBF) {
+ model->kernelparam = Malloc(double, 1);
+ model->kernelparam[0] = task->kernelparam[0];
+ } else if (model->kerneltype == K_POLY) {
+ model->kernelparam = Malloc(double, 3);
+ model->kernelparam[0] = task->kernelparam[0];
+ model->kernelparam[1] = task->kernelparam[1];
+ model->kernelparam[2] = task->kernelparam[2];
+ } else if (model->kerneltype == K_SIGMOID) {
+ model->kernelparam = Malloc(double, 2);
+ model->kernelparam[0] = task->kernelparam[0];
+ model->kernelparam[1] = task->kernelparam[1];
+ }
}