176 lines
4.8 KiB
C
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 * */
|
|
/* **************************************************************************** */
|
|
//
|