]> ruin.nu Git - germs.git/blobdiff - fann/src/fann_error.c
Make it possible to build statically against the included fann library.
[germs.git] / fann / src / fann_error.c
diff --git a/fann/src/fann_error.c b/fann/src/fann_error.c
new file mode 100644 (file)
index 0000000..034b99a
--- /dev/null
@@ -0,0 +1,202 @@
+/*
+  Fast Artificial Neural Network Library (fann)
+  Copyright (C) 2003 Steffen Nissen (lukesky@diku.dk)
+  
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+  
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+  
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include "config.h"
+#include "fann.h"
+
+#ifdef _MSC_VER
+#define vsnprintf _vsnprintf
+#define snprintf _snprintf
+#endif
+
+FILE * fann_default_error_log = (FILE *)-1;
+
+/* resets the last error number
+ */
+FANN_EXTERNAL void FANN_API fann_reset_errno(struct fann_error *errdat)
+{
+       errdat->errno_f = FANN_E_NO_ERROR;
+}
+
+/* resets the last errstr
+ */
+FANN_EXTERNAL void FANN_API fann_reset_errstr(struct fann_error *errdat)
+{
+       if(errdat->errstr != NULL)
+               free(errdat->errstr);
+       errdat->errstr = NULL;
+}
+
+/* returns the last error number
+ */
+FANN_EXTERNAL enum fann_errno_enum FANN_API fann_get_errno(struct fann_error *errdat)
+{
+       return errdat->errno_f;
+}
+
+/* returns the last errstr
+ */
+FANN_EXTERNAL char *FANN_API fann_get_errstr(struct fann_error *errdat)
+{
+       char *errstr = errdat->errstr;
+
+       fann_reset_errno(errdat);
+       fann_reset_errstr(errdat);
+
+       return errstr;
+}
+
+/* change where errors are logged to
+ */
+FANN_EXTERNAL void FANN_API fann_set_error_log(struct fann_error *errdat, FILE * log_file)
+{
+       if(errdat == NULL)
+               fann_default_error_log = log_file;
+       else
+               errdat->error_log = log_file;
+}
+
+/* prints the last error to stderr
+ */
+FANN_EXTERNAL void FANN_API fann_print_error(struct fann_error *errdat)
+{
+       if(errdat->errno_f != FANN_E_NO_ERROR && errdat->errstr != NULL)
+       {
+               fprintf(stderr, "FANN Error %d: %s", errdat->errno_f, errdat->errstr);
+       }
+}
+
+/* INTERNAL FUNCTION
+   Populate the error information
+ */
+void fann_error(struct fann_error *errdat, const enum fann_errno_enum errno_f, ...)
+{
+       va_list ap;
+       char *errstr;
+       FILE * error_log = fann_default_error_log;
+
+       if(errdat != NULL)
+               errdat->errno_f = errno_f;
+
+       if(errdat != NULL && errdat->errstr != NULL)
+       {
+               errstr = errdat->errstr;
+       }
+       else
+       {
+               errstr = (char *) malloc(FANN_ERRSTR_MAX);
+               if(errstr == NULL)
+               {
+                       fprintf(stderr, "Unable to allocate memory.\n");
+                       return;
+               }
+       }
+
+       va_start(ap, errno_f);
+       switch (errno_f)
+       {
+       case FANN_E_NO_ERROR:
+               break;
+       case FANN_E_CANT_OPEN_CONFIG_R:
+               vsprintf(errstr, "Unable to open configuration file \"%s\" for reading.\n", ap);
+               break;
+       case FANN_E_CANT_OPEN_CONFIG_W:
+               vsprintf(errstr, "Unable to open configuration file \"%s\" for writing.\n", ap);
+               break;
+       case FANN_E_WRONG_CONFIG_VERSION:
+               vsprintf(errstr,
+                                "Wrong version of configuration file, aborting read of configuration file \"%s\".\n",
+                                ap);
+               break;
+       case FANN_E_CANT_READ_CONFIG:
+               vsprintf(errstr, "Error reading \"%s\" from configuration file \"%s\".\n", ap);
+               break;
+       case FANN_E_CANT_READ_NEURON:
+               vsprintf(errstr, "Error reading neuron info from configuration file \"%s\".\n", ap);
+               break;
+       case FANN_E_CANT_READ_CONNECTIONS:
+               vsprintf(errstr, "Error reading connections from configuration file \"%s\".\n", ap);
+               break;
+       case FANN_E_WRONG_NUM_CONNECTIONS:
+               vsprintf(errstr, "ERROR connections_so_far=%d, total_connections=%d\n", ap);
+               break;
+       case FANN_E_CANT_OPEN_TD_W:
+               vsprintf(errstr, "Unable to open train data file \"%s\" for writing.\n", ap);
+               break;
+       case FANN_E_CANT_OPEN_TD_R:
+               vsprintf(errstr, "Unable to open train data file \"%s\" for writing.\n", ap);
+               break;
+       case FANN_E_CANT_READ_TD:
+               vsprintf(errstr, "Error reading info from train data file \"%s\", line: %d.\n", ap);
+               break;
+       case FANN_E_CANT_ALLOCATE_MEM:
+               sprintf(errstr, "Unable to allocate memory.\n");
+               break;
+       case FANN_E_CANT_TRAIN_ACTIVATION:
+               sprintf(errstr, "Unable to train with the selected activation function.\n");
+               break;
+       case FANN_E_CANT_USE_ACTIVATION:
+               sprintf(errstr, "Unable to use the selected activation function.\n");
+               break;
+       case FANN_E_TRAIN_DATA_MISMATCH:
+               sprintf(errstr, "Training data must be of equivalent structure.\n");
+               break;
+       case FANN_E_CANT_USE_TRAIN_ALG:
+               sprintf(errstr, "Unable to use the selected training algorithm.\n");
+               break;
+       case FANN_E_TRAIN_DATA_SUBSET:
+               vsprintf(errstr, "Subset from %d of length %d not valid in training set of length %d.\n", ap);
+               break;
+       case FANN_E_INDEX_OUT_OF_BOUND:
+               vsprintf(errstr, "Index %d is out of bound.\n", ap);
+               break;
+       }
+       va_end(ap);
+
+       if(errdat != NULL)
+       {
+               errdat->errstr = errstr;
+               error_log = errdat->error_log;
+               printf("setting errorlog\n");           
+       }
+
+       if(error_log == (FILE *)-1) /* This is the default behavior and will give stderr */
+       {
+               fprintf(stderr, "FANN Error %d: %s", errno_f, errstr);
+       }
+       else if(error_log != NULL)
+       {
+               fprintf(error_log, "FANN Error %d: %s", errno_f, errstr);
+       }
+}
+
+/* INTERNAL FUNCTION
+   Initialize an error data strcuture
+ */
+void fann_init_error_data(struct fann_error *errdat)
+{
+       errdat->errstr = NULL;
+       errdat->errno_f = FANN_E_NO_ERROR;
+       errdat->error_log = fann_default_error_log;
+}