The Counterpropagation Network -------------------------------------------------------------------------------- The Counterpropagation Network -------------------------------------------------------------------------------- This program is copyright (c) 1996 by the author. It is made available as is, and no warranty - about the program, its performance, or its conformity to any specification - is given or implied. It may be used, modified, and distributed freely for private and commercial purposes, as long as the original author is credited as part of the final work. Counterpropagation Network Simulator /****************************************************************************** ========================== Network: Counterpropagation Network ========================== Application: Vision Determination of the Angle of Rotation Author: Karsten Kutza Date: 30.4.96 Reference: R. Hecht-Nielsen Counterpropagation Networks Proceedings of the IEEE International Conference on Neural Networks, II, IEEE Press, New York, NY, pp. 19-32, 1987 ******************************************************************************/ /****************************************************************************** D E C L A R A T I O N S ******************************************************************************/ #include #include #include typedef int BOOL; typedef char CHAR; typedef int INT; typedef double REAL; #define FALSE 0 #define TRUE 1 #define NOT ! #define AND && #define OR || #define MIN_REAL -HUGE_VAL #define MAX_REAL +HUGE_VAL #define MIN(x,y) ((x)<(y) ? (x) : (y)) #define MAX(x,y) ((x)>(y) ? (x) : (y)) #define LO 0 #define HI 1 #define PI (2*asin(1)) #define sqr(x) ((x)*(x)) typedef struct { /* A LAYER OF A NET: */ INT Units; /* - number of units in this layer */ REAL* Output; /* - output of ith unit */ REAL** Weight; /* - connection weights to ith unit */ BOOL* Winner; /* - marker for winning instar */ } LAYER; typedef struct { /* A NET: */ LAYER* InputLayer; /* - input layer */ LAYER* InstarLayer; /* - instar layer */ LAYER* OutstarLayer; /* - outstar layer */ INT Winners; /* - allowed number of winning instars */ REAL Alpha; /* - hidden layer learning rate */ REAL Beta; /* - output layer learning rate */ } NET; /****************************************************************************** R A N D O M S D R A W N F R O M D I S T R I B U T I O N S ******************************************************************************/ void InitializeRandoms() { srand(4711); } INT RandomEqualINT(INT Low, INT High) { return rand() % (High-Low+1) + Low; } /****************************************************************************** A P P L I C A T I O N - S P E C I F I C C O D E ******************************************************************************/ #define NUM_DATA 8 #define X 11 #define Y 11 #define N (X * Y) #define C NUM_DATA #define M 2 CHAR Pattern[NUM_DATA][Y][X] = { { " ", " ", " O ", " O ", " OOO ", " OOO ", " OOO ", " OOOOO ", " OOOOO ", " ", " " }, { " ", " ", " O ", " O ", " OOO ", " OOO ", " OOO ", " OOOOO ", "OOOOO ", " ", " " }, { " ", " ", " ", " OO ", " OOOOO ", " OOOOOOO ", " OOOOO ", " OO ", " ", " ", " " }, { " ", " ", "OOOOO ", " OOOOO ", " OOO ", " OOO ", " OOO ", " O ", " O ", " ", " " }, { " ", " ", " OOOOO ", " OOOOO ", " OOO ", " OOO ", " OOO ", " O ", " O ", " ", " " }, { " ", " ", " OOOOO", " OOOOO ", " OOO ", " OOO ", " OOO ", " O ", " O ", " ", " " }, { " ", " ", " ", " OO ", " OOOOO ", " OOOOOOO ", " OOOOO ", " OO ", " ", " ", " " }, { " ", " ", " O ", " O ", " OOO ", " OOO ", " OOO ", " OOOOO ", " OOOOO", " ", " " } }; CHAR Pattern_[NUM_DATA][Y][X] = { { " ", " ", " O ", " O ", " O ", " OOO ", " OOO ", " OOO ", " OOOOO ", " ", " " }, { " ", " ", " O ", " O ", " O O ", " O O ", " O O ", " O O ", " O O ", " ", " " }, { " ", " ", " ",