00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef _APS_NN_H
00030 #define _APS_NN_H
00031
00032 #include <stdio.h>
00033
00038 struct _nnNode;
00039
00043 typedef struct _nnLink {
00044 struct _nnNode *source;
00045 double w,
00046 del_w;
00047 } nnLink;
00048
00052 typedef struct _nnNode {
00053 unsigned long id;
00055 double a;
00056 double in;
00058 double err;
00059 double del;
00061 int nlinks;
00062 nnLink *links;
00063 } nnNode;
00064
00068 typedef struct _nnLayer {
00069 int nnodes;
00070 nnNode *nodes;
00071 } nnLayer;
00072
00076 typedef struct _nnNet {
00077 double LearningRate;
00078 double Momentum;
00079 double (*ActivationF) (nnNode *node);
00080 double (*dActivationF) (nnNode *node);
00083 nnNode *biasNode;
00085 int nlayers;
00086 nnLayer *layers;
00087 } nnNet;
00088
00092 typedef enum _nnFileType {
00093 nnFileTypeUnknown,
00094 nnFileTypeBinary,
00095 nnFileTypeXML
00096 } nnFileType;
00097
00101 static inline nnLayer *
00102 nnGetNetworkOutputLayer (nnNet *net)
00103 {
00104 return &net->layers[0];
00105 }
00106
00110 static inline nnLayer *
00111 nnGetNetworkInputLayer (nnNet *net)
00112 {
00113 return &net->layers[net->nlayers - 1];
00114 }
00115
00116
00117 double nnSigmoid (nnNode *node);
00118 double nnDSigmoid (nnNode *node);
00119 void nnRunNetwork (nnNet *net);
00120 void nnSetNetworkInputs (nnNet *net, const double inputs[]);
00121 void nnGetNetworkOutputs (nnNet *net, double outputs[]);
00122
00123
00124 void nnCalculateOutputLayerError (nnLayer *layer, const double targets[]);
00125 void nnCalculateHiddenLayerError (nnLayer *layer, nnLayer *nextLayer);
00126 void nnUpdateLayer (nnLayer *layer, nnNet *net);
00127 void nnUpdateNetwork (nnNet *net, const double targets[]);
00128
00129
00130 void nnUpdateLayerBatch (nnLayer *layer, nnNet *net);
00131 void nnUpdateNetworkBatch (nnNet *net, double const targets[]);
00132 void nnClearNetworkWeightDeltas (nnNet *net);
00133 void nnUpdateNetworkWeights (nnNet *net);
00134
00135
00136 int nnSaveNetwork (nnNet *net, void *handle,
00137 int (*nnWrite) (void *handle, void *data, size_t len));
00138 int nnSaveNetworkFile (nnNet *net, FILE *f);
00139 int nnSaveNetworkMem (nnNet *net, void *data, size_t len);
00140 int nnSaveNetworkDynMem (nnNet *net, void **ptr, size_t *len);
00141 nnNet *nnLoadNetwork (void *handle,
00142 int (*nnRead) (void *handle, void *data, size_t len));
00143 nnNet *nnLoadNetworkFile (FILE *f);
00144 nnNet *nnLoadNetworkMem (void *data, size_t len);
00145 nnFileType nnGuessFileType (FILE *f);
00146
00147
00148 int nnSaveNetworkXML (nnNet *net, FILE *f);
00149 nnNet *nnLoadNetworkXML (FILE *f);
00150
00151
00152 double nnGetLayerError (nnLayer *layer);
00153 double nnGetLayerRMSError (nnLayer *layer);
00154 void nnIterateNetworkNodes (nnNet *net,
00155 void (*f) (nnLayer *layer, nnNode *node,
00156 void *data),
00157 void *data);
00158 void nnIterateNetworkLinks (nnNet *net,
00159 void (*f) (nnNode *dest, nnLink *link,
00160 void *data),
00161 void *data);
00162 void nnDestroyNetwork (nnNet *net);
00163 nnNet *nnCreateFullyConnectedNetwork (int nlayers, const int nnodes[]);
00164 nnNet *nnCopyNetwork (nnNet *net);
00165
00166 #endif