[libfann] 79/242: Added fann_shuffle_train_data, fann_merge_train_data, and fann_duplicate_train_data
Christian Kastner
chrisk-guest at moszumanska.debian.org
Sat Oct 4 21:10:22 UTC 2014
This is an automated email from the git hooks/post-receive script.
chrisk-guest pushed a commit to tag Version2_0_0
in repository libfann.
commit 1e191caf376c9b145c10a6199d8afb4fb96557c0
Author: Evan Nemerson <evan at coeus-group.com>
Date: Mon Feb 16 09:48:35 2004 +0000
Added fann_shuffle_train_data, fann_merge_train_data, and fann_duplicate_train_data
---
src/fann.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++
src/fann_internal.c | 3 ++
src/include/fann.h | 12 ++++++
src/include/fann_errno.h | 5 ++-
4 files changed, 120 insertions(+), 1 deletion(-)
diff --git a/src/fann.c b/src/fann.c
index f1909af..422e5b7 100644
--- a/src/fann.c
+++ b/src/fann.c
@@ -1048,3 +1048,104 @@ void fann_print_error(struct fann *ann) {
fputs(ann->errstr, ann->error_log);
}
}
+
+/* shuffles training data, randomizing the order
+ */
+void fann_shuffle_train_data(struct fann_train_data *train_data) {
+ int dat = train_data->num_data - 1, elem;
+ unsigned int swap;
+ fann_type temp;
+
+ for ( ; dat >= 0 ; dat-- ) {
+ swap = (unsigned int)(rand() % train_data->num_data);
+ if ( swap != dat ) {
+ for ( elem = train_data->num_input ; elem >= 0 ; elem-- ) {
+ temp = train_data->input[dat][elem];
+ train_data->input[dat][elem] = train_data->input[swap][elem];
+ train_data->input[swap][elem] = temp;
+ }
+ for ( elem = train_data->num_output ; elem >= 0 ; elem-- ) {
+ temp = train_data->output[dat][elem];
+ train_data->output[dat][elem] = train_data->output[swap][elem];
+ train_data->output[swap][elem] = temp;
+ }
+ }
+ }
+}
+
+/* merges training data into a single struct.
+ */
+struct fann_train_data * fann_merge_train_data(struct fann_train_data *data1, struct fann_train_data *data2) {
+ struct fann_train_data * train_data;
+ int x;
+
+ if ( (data1->num_input != data2->num_input) ||
+ (data1->num_output != data2->num_output) ) {
+ fann_error(NULL, FANN_E_TRAIN_DATA_MISMATCH);
+ return NULL;
+ }
+
+ train_data = (struct fann_train_data *)malloc(sizeof(struct fann_train_data));
+
+ train_data->num_data = data1->num_data + data2->num_data;
+ train_data->num_input = data1->num_input;
+ train_data->num_output = data1->num_output;
+
+ if ( ((train_data->input = (fann_type **)calloc(train_data->num_data, sizeof(fann_type *))) == NULL) ||
+ ((train_data->output = (fann_type **)calloc(train_data->num_data, sizeof(fann_type *))) == NULL) ) {
+ fann_error(NULL, FANN_E_CANT_ALLOCATE_MEM);
+ fann_destroy_train(train_data);
+ return NULL;
+ }
+ for ( x = train_data->num_data - 1 ; x >= 0 ; x-- ) {
+ if ( ((train_data->input[x] = (fann_type *)calloc(train_data->num_input, sizeof(fann_type))) == NULL) ||
+ ((train_data->output[x] = (fann_type *)calloc(train_data->num_output, sizeof(fann_type))) == NULL) ) {
+ fann_error(NULL, FANN_E_CANT_ALLOCATE_MEM);
+ fann_destroy_train(train_data);
+ return NULL;
+ }
+ memcpy(train_data->input[x],
+ ( x < data1->num_data ) ? data1->input[x] : data2->input[x - data1->num_data],
+ train_data->num_input * sizeof(fann_type));
+ memcpy(train_data->output[x],
+ ( x < data1->num_data ) ? data1->output[x] : data2->output[x - data1->num_data],
+ train_data->num_output * sizeof(fann_type));
+ }
+
+ return train_data;
+}
+
+/* return a copy of a fann_train_data struct
+ */
+struct fann_train_data * fann_duplicate_train_data(struct fann_train_data *data) {
+ struct fann_train_data * dest;
+ int x;
+
+ if ( (dest = malloc(sizeof(struct fann_train_data))) == NULL ) {
+ fann_error(NULL, FANN_E_CANT_ALLOCATE_MEM);
+ return NULL;
+ }
+
+ dest->num_data = data->num_data;
+ dest->num_input = data->num_input;
+ dest->num_output = data->num_output;
+
+ if ( ((dest->input = (fann_type **)calloc(dest->num_data, sizeof(fann_type *))) == NULL) ||
+ ((dest->output = (fann_type **)calloc(dest->num_data, sizeof(fann_type *))) == NULL) ) {
+ fann_error(NULL, FANN_E_CANT_ALLOCATE_MEM);
+ fann_destroy_train(dest);
+ return NULL;
+ }
+
+ for ( x = dest->num_data - 1 ; x >= 0 ; x-- ) {
+ if ( ((dest->input[x] = (fann_type *)calloc(dest->num_input, sizeof(fann_type))) == NULL) ||
+ ((dest->output[x] = (fann_type *)calloc(dest->num_output, sizeof(fann_type))) == NULL) ) {
+ fann_error(NULL, FANN_E_CANT_ALLOCATE_MEM);
+ fann_destroy_train(dest);
+ return NULL;
+ }
+ memcpy(dest->input[x], data->input[x], dest->num_input * sizeof(fann_type));
+ memcpy(dest->output[x], data->output[x], dest->num_output * sizeof(fann_type));
+ }
+ return dest;
+}
diff --git a/src/fann_internal.c b/src/fann_internal.c
index efc4b4a..b4f58cb 100644
--- a/src/fann_internal.c
+++ b/src/fann_internal.c
@@ -647,6 +647,9 @@ void fann_error(struct fann *ann, const unsigned int errno, ...)
case FANN_E_CANT_USE_ACTIVATION:
snprintf(errstr, FANN_ERRSTR_MAX, "Unable to use the selected activation function.\n");
break;
+ case FANN_E_TRAIN_DATA_MISMATCH:
+ snprintf(errstr, FANN_ERRSTR_MAX, "Training data must be of equivalent structure.");
+ break;
default:
vsnprintf(errstr, FANN_ERRSTR_MAX, "Unknown error.\n", ap);
break;
diff --git a/src/include/fann.h b/src/include/fann.h
index 26e1000..40f2cfb 100644
--- a/src/include/fann.h
+++ b/src/include/fann.h
@@ -234,6 +234,18 @@ void fann_train_on_data_callback(struct fann *ann, struct fann_train_data *data,
/* Does the same as train_on_data, but reads the data directly from a file.
*/
void fann_train_on_file(struct fann *ann, char *filename, unsigned int max_epochs, unsigned int epochs_between_reports, float desired_error);
+
+/* shuffles training data, randomizing the order
+ */
+void fann_shuffle_train_data(struct fann_train_data *train_data);
+
+/* merges training data into a single struct.
+ */
+struct fann_train_data * fann_merge_train_data(struct fann_train_data *data1, struct fann_train_data *data2);
+
+/* return a copy of a fann_train_data struct
+ */
+struct fann_train_data * fann_duplicate_train_data(struct fann_train_data *data);
/* Does the same as train_on_data_callback, but
reads the data directly from a file.
diff --git a/src/include/fann_errno.h b/src/include/fann_errno.h
index c598029..99a87b4 100644
--- a/src/include/fann_errno.h
+++ b/src/include/fann_errno.h
@@ -68,7 +68,10 @@ enum {
FANN_E_CANT_TRAIN_ACTIVATION,
/* Unable to use the selected activation function */
- FANN_E_CANT_USE_ACTIVATION
+ FANN_E_CANT_USE_ACTIVATION,
+
+ /* Irreconcilable differences between two fann_train_data structures */
+ FANN_E_TRAIN_DATA_MISMATCH
};
#ifdef __cplusplus
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/libfann.git
More information about the debian-science-commits
mailing list