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

176 lines
4.8 KiB
C

/* **************************************************************************** */
/* **************************************************************************** */
/* * AVP 1996 * */
/* **************************************************************************** */
#ifndef MLP_HEADER_INCLUDED
#define MLP_HEADER_INCLUDED
#include "snn.h"
#if !MLP_PRELOAD_MODE
#include "stdio.h"
#endif
// -------------------- Defines ------------------------------------------------
#define MLP_EXPTABL_MAX 8
#define MLP_EXPTABL_SIZE 512
// -------------------- Defines ------------------------------------------------
#define MLP_UNROLL_CYCLES 1
#define MLP_ROLLING_LEARN 0
#define MLP_F_CELL_CMASK 0x0001
#define MLP_F_CELL_PMASK 0x0002
// -----------------------------------------------------------------------------
#define MLP_ABS(x) (((x) > 0) ? (x):(-(x)))
#define MLP_ERR(e) ((e)*(e)*(e))
//#define MLP_ERR(e) (((e) > 0) ? (e)*(e) : -((e)*(e)))
#if MLP_UPSCALE
#if MLP_BYTE_NET
#define MLP_MAX_INT_C 127
#define MLP_MAX_INT_S 255
#if MLP_INT_MODE
#define x_UPCO_C << 3
#define x_DNCO_C >> 3
#define x_UPCO_S << 8
#define x_DNCO_S >> 8
#define x_DNDNCO_S >> 16
#else
#define x_UPCO_C *(8)
#define x_DNCO_C *(0.125)
#define x_UPCO_S *(256)
#define x_DNCO_S *(0.00390625)
#define x_DNDNCO_S *(1.52587890625E-05)
#endif
#else // SHORT mode
#define MLP_MAX_INT_C 32767
#define MLP_MAX_INT_S 4095
#if MLP_INT_MODE
#define x_UPCO_C << 9
#define x_DNCO_C >> 9
#define x_UPCO_S << 12
#define x_DNCO_S >> 12
#define x_DNDNCO_S >> 24
#else
#define x_UPCO_C *(512)
#define x_DNCO_C *(0.001953125)
#define x_UPCO_S *(4096)
#define x_DNCO_S *(0.000244140625)
#define x_DNDNCO_S *(5.96046447753906E-08)
#endif
#endif // MLP_BYTE_NET
#else
// #define MLP_MAX_INT_C 63.9
// #define MLP_MAX_INT_C 15.875
#define MLP_MAX_INT_C 127
#define MLP_MAX_INT_S 1.0
#define x_UPCO_C
#define x_DNCO_C
#define x_UPCO_S
#define x_DNCO_S
#define x_DNDNCO_S
#endif
#if MLP_EMULATE_INT && !(MLP_INT_MODE)
#define FINT_C_OF(x) ((fint_c)(x))
#define FINT_S_OF(x) ((fint_s)(x))
#else
#define FINT_C_OF(x) ((flong)(x))
#define FINT_S_OF(x) ((flong)(x))
#endif
#if MLP_INT_MODE
#define FINT_C_LD(x) (((x) > -MLP_MAX_INT_C && (x) < MLP_MAX_INT_C) ? (fint_c)(x) : (((x) > 0) ? MLP_MAX_INT_C : -MLP_MAX_INT_C))
#else
#define FINT_C_LD(x) (x)
#endif
// -------------------- Structures and classes ---------------------------------
typedef struct
{
_USHORT inp_ind;
fint_c bias;
fint_c weights[MLP_CELL_MAXINPUTS];
#if MLP_LEARN_MODE // Debug + learning
float err;
float sbias;
float psbias;
float sws[MLP_CELL_MAXINPUTS];
float psws[MLP_CELL_MAXINPUTS];
_INT num_sws;
_INT num_psws;
_UCHAR flags;
// _USHORT out_ind;
_INT num_changes;
float prev_val;
#endif
} mlp_cell_type, * p_mlp_cell_type;
typedef struct
{
flong sum_delt;
_INT num_sum;
} mlp_layer_type, * p_mlp_layer_type;
typedef struct
{
_UCHAR id_str[32];
_INT num_layers;
_INT num_inputs;
_INT num_outputs;
fint_s exp_tabl[MLP_EXPTABL_SIZE];
mlp_cell_type cells[MLP_NET_NUMCELLS];
mlp_layer_type layers[MLP_NET_NUMLAYERS];
} mlp_net_type, * p_mlp_net_type;
// ---------------- Functions --------------------------------------------------
_INT CountNetResult(p_UCHAR inps, p_UCHAR outs, p_mlp_data_type mlpd);
fint_s CountCellSignal(_INT nc, p_mlp_data_type mlpd);
#if !MLP_PRELOAD_MODE
_INT LoadNet(FILE * file, p_mlp_data_type mlpd);
_INT InitNet(_INT type, p_mlp_data_type mlpd);
_INT FillExpTable(flong ic, p_mlp_data_type mlpd);
#endif
#if MLP_LEARN_MODE
_INT InitNetWeights(_INT type, flong ic, p_mlp_data_type mlpd);
_INT CountNetError(float * desired_outputs, flong zc, p_mlp_data_type mlpd);
_INT ModifyNetDeltas(_INT flags, p_mlp_data_type mlpd);
_INT AdjustNetWeights(_INT flags, float * lcs, float ic, p_mlp_data_type mlpd);
_INT ShakeNetWeights(_INT flags, float lc, p_mlp_data_type mlpd);
_INT CountNetStats(_INT mode, p_mlp_data_type mlpd);
_INT SaveNet(FILE *file, p_mlp_data_type mlpd);
_INT DumpNet(FILE *file, p_mlp_data_type mlpd);
_INT CalcHiddenLayerError(_INT layer_st, _INT layer_len, p_mlp_data_type mlpd);
_INT CountLayerStats(_INT mode, _INT layer_num, _INT layer_st, _INT layer_len, p_mlp_data_type mlpd);
_INT InitCellWeights(_INT type, float ic, _INT ncell, p_mlp_data_type mlpd);
#endif
#endif // MLP_HEADER_INCLUDED
/* **************************************************************************** */
/* * End OF all * */
/* **************************************************************************** */
//