diff options
| author | Gertjan van den Burg <burg@ese.eur.nl> | 2016-12-05 11:18:50 +0100 |
|---|---|---|
| committer | Gertjan van den Burg <burg@ese.eur.nl> | 2016-12-05 11:18:50 +0100 |
| commit | e616c9e2241b68faadec5dfd6d12c49002d1bdc1 (patch) | |
| tree | 65ffec258c9583ea0c720eb2292b314f090a528f /src | |
| parent | compute ZAZ in blocks to increase numerical precision (diff) | |
| download | gensvm-e616c9e2241b68faadec5dfd6d12c49002d1bdc1.tar.gz gensvm-e616c9e2241b68faadec5dfd6d12c49002d1bdc1.zip | |
Improvements and tests for tasks and gridsearch
Diffstat (limited to 'src')
| -rw-r--r-- | src/gensvm_consistency.c | 8 | ||||
| -rw-r--r-- | src/gensvm_task.c | 62 |
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]; + } } |
