/************************************************************ * * runNet.h * * Bare bones net. * Use this implementation to build and run a net * (Not for training) * * mrevow * ***********************************************************/ #ifndef H_RUN_NET_H #define H_RUN_NET_H // Versioning infrmation // December 2001 Introduced versioning information. Prior to this the version // number did not exist. The first element was eNetType which had value < 10 // // Changes introduce lossType, txfer and unitType into runNet description // // March 2002 // Incompatible changes: // Add upfront scaling of features (Added the range vector for input vars) // Also add data-type sizes for all weight, bias and range vectors // #define RUN_NET_VER_START (10) // First version number introduced December 2001 #define RUN_NET_VER_10 (10) // December 2001 - March 2002 #define RUN_NET_VER_11 (11) // March 2002 Current Version Number //#define NET_FLOAT typedef int RREAL; // Used for intermediate calculation and unit activations typedef short RREAL_WEIGHT; // Used for Net weights (excluding bias) typedef int RREAL_BIAS; // Used for bias weights typedef __int64 RREAL_INPUT; // Used for scaling inputs which are of type RREAL // This types is shared between the train and run time nets // It is defined here and in netTypes.h - kkep them in sync #ifndef CAMEL_NET_TYPE_DEFINED typedef enum tagNET_TYPE {NO_NET_TYPE, FULLY_CONNECTED, LOCALLY_CONNECTED} NET_TYPE; typedef enum tagLOSS_TYPE {SUMSQUARE, SUMSQUARE_CLASS, CROSSENTROPY, CROSSENTROPY_FULL, C_LOSS_TYPE} LOSS_TYPE; typedef enum tagTXF_TYPE {TXF_LINEAR, TXF_INT_SIGMOID, TXF_SIGMOID, TXF_TANH, TXF_SOFTMAX, CTXF_TYPE} TXF_TYPE; typedef enum tagLAYER_TYPE {INPUT_LAYER, HIDDEN_LAYER, OUTPUT_LAYER, BIAS_LAYER, CLAYER_TYPE} LAYER_TYPE; #define CAMEL_NET_TYPE_DEFINED #endif #define MIN_PREC_VAL 0 #define SOFT_MAX_UNITY 10000 // Value of 1.0 in the softMax // Describes a net. In a running net the description // up to and including the weight vector will be loaded // from a resource typedef struct tagRUN_NET { WORD iVer; // Added December 2001 - Versioning information -> 0 implies none present WORD cLayer; // Number of layers in net LOSS_TYPE lossType; // Added December 2001 - Type of output loss - only present for net versions > 10 TXF_TYPE *txfType; // Added December 2001 - Txfer type for each layer - only present for net versions > 10 LAYER_TYPE *layerType; // Added December 2001 - Unit type of eachlayer - only present for net versions > 10 WORD cWeight; // Total # of weights in network WORD cTotUnit; // Total number of units in network WORD *cUnitsPerLayer; // # of units per layer WORD *bUseBias; // Use bias units? per layer WORD *pWeightScale; // Amount by which each layers incoming weights are scaled WORD iInputScaledMeanDataSize; // Data type size for pInputMean (Introduced March 2002) WORD iInputRangeDataSize;// Data type size for Input Range Vector (Introduced March 2002) WORD iWeightDataSize; // Data Type size for weight vector (Introduced March 2002) RREAL *pInputRange; // Ranges for each input variable > 0 (Introduced March 2002) RREAL_INPUT *pInputScaledMean; // Scaled Means for input data (Introduced March 2002 to replace pInputMean) RREAL *pInputMean; // Means for input data UINT cWeightByte; // Count of bytes used for weights RREAL_WEIGHT *pWeight; // All network weights. } RUN_NET; // describes the outgoing connections of a unit // as the start and end unit offsets to which it connects typedef struct tagOUT_CONNECTIONS { WORD iUnit; // The unit in question WORD iStartUnitOffset; WORD iEndUnitOffset; } OUT_CONNECTIONS; // Describes a locally connected network typedef struct tagLOCAL_NET { WORD iVer; // Version Number (Started December 2001, Before all nets had eNetType as the first element set to LOCALLY_CONNECT ( WORD eNetType; // Must be of type LOCALLY_CONNECTED RUN_NET runNet; // How to run the Net int cConnect; // Number of connections OUT_CONNECTIONS *pOutConnect; } LOCAL_NET; #ifdef __cplusplus extern "C" { #endif // API functions extern BYTE *restoreRunNet( BYTE *pBuf, BYTE *pBCurr, RUN_NET *pNet, WORD iVer) ; extern LOCAL_NET * restoreLocalConnectNet( void *pBuf, wchar_t wNetId, LOCAL_NET *pNet ) ; extern RREAL *runFullConnectNet( RUN_NET *pNet, RREAL *pfUnits, UINT *piWinner ) ; extern RREAL *runLocalConnectNet( LOCAL_NET *pNet, RREAL *pfUnits, UINT *piWinner, UINT *pcOut ) ; extern int getRunTimeNetMemoryRequirements(void *pBuf); extern LOCAL_NET *loadNet(HINSTANCE hInst, int iKey, int *iNetSize, LOCAL_NET *pNet); extern void *loadNetFromResource(HINSTANCE hInst, int iKey, int *iSize); #ifdef NET_FLOAT #define SIGMOID fsigmoid #define EXP(x) exp((x)/65536.0F) * 65536.0F RREAL * fsigmoid(RREAL *pVec, int cVec, WORD scale); #else #define SIGMOID isigmoid #define EXP(x) iexp(x) RREAL * isigmoid(RREAL *pVec, int cVec, WORD scale); RREAL iexp(RREAL val); #endif #ifdef HWX_INTERNAL LOCAL_NET * LoadRunNetFromFp(LOCAL_NET *pNet, int *iNetSize, char * fname); #endif #ifdef __cplusplus } #endif #endif