windows-nt/Source/XPSP1/NT/drivers/tpg/hwx/common/inc/runnet.h
2020-09-26 16:20:57 +08:00

132 lines
5.1 KiB
C

/************************************************************
*
* 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