aboutsummaryrefslogtreecommitdiff
path: root/src/gensvm_task.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gensvm_task.c')
-rw-r--r--src/gensvm_task.c62
1 files changed, 61 insertions, 1 deletions
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];
+ }
}