[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