ANN  0.1.1.5
A library containing multiple neural network models written in C
network.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <stdio.h>
4 #include "ANN/tools.h"
5 
7 
8 
10 {
11  struct PCFNN_NETWORK *net = malloc(sizeof(struct PCFNN_NETWORK));
12  if (net == NULL) return NULL;
13  net->size = 0;
14  net->layers = malloc(sizeof(struct PCFNN_LAYER*) * net->size);
15  if (net->layers == NULL) return NULL;
16  net->inputl = net->outputl = NULL;
17  return net;
18 }
19 
20 
22 {
23  if (net == NULL) return;
24  for(size_t i = 0; i < net->size; ++i)
25  PCFNN_LAYER_free(net->layers[i]);
26  free(net->layers);
27  free(net);
28 }
29 
30 
32 {
33  if (net == NULL) return;
34  for(size_t i = 0; i < net->size; ++i)
35  PCFNN_LAYER_clear(net->layers[i]);
36 }
37 
38 
39 int PCFNN_NETWORK_addl(struct PCFNN_NETWORK *net, struct PCFNN_LAYER *l)
40 {
41  if (net == NULL || l == NULL) return 1;
42  ++net->size;
43  net->layers = realloc(net->layers, sizeof(struct PCFNN_LAYER*) * net->size);
44  if (net->layers == NULL) return -1;
45  net->layers[net->size - 1] = l;
46  return 0;
47 }
48 
49 
51 {
52  if (net == NULL) return 1;
53  int e = 0;
54  for(size_t i = 0; i < net->size && e == 0; ++i)
55  {
56  e = PCFNN_LAYER_build(net->layers[i]);
57  net->layers[i]->index = i;
58  }
59  for(size_t i = 0; e == 0 && i < net->size; ++i)
60  {
61  if (net->inputl == NULL && net->layers[i]->type == PCFNN_LAYER_INPUT)
62  { net->inputl = net->layers[i]; continue; }
63  if (net->outputl == NULL && net->layers[i]->type == PCFNN_LAYER_OUTPUT)
64  { net->outputl = net->layers[i]; continue; }
65  }
66  return e;
67 }
68 
69 
70 struct PCFNN_NETWORK *PCFNN_NETWORK_build_from_array(size_t *spec, size_t len, double(*f_init)(double), double(*f_act)(double), double(*f_act_de)(double))
71 {
72  if (len < 1 || spec == NULL || f_act == NULL || f_act_de == NULL)
73  return NULL;
74  struct PCFNN_NETWORK *net = PCFNN_NETWORK_new();
75  if (net == NULL) return NULL;
76 
77  for(size_t i = 0; i < len; ++i)
78  {
79  if (i == 0) {
81  PCFNN_NETWORK_addl(net, l);
82  } else {
84  PCFNN_NETWORK_addl(net, l);
85  PCFNN_LAYER_connect(net->layers[i-1], l, spec[i-1], spec[i], 0, 0, f_init, f_act, f_act_de);
86  }
87  }
88 
90 
91  return net;
92 }
93 
94 
96 {
97  if (net == NULL) return 0;
98  size_t usage = sizeof(struct PCFNN_NETWORK);
99  usage += sizeof(struct PCFNN_LAYER*);
100  for (size_t i = 0; i < net->size; ++i)
101  usage += PCFNN_LAYER_get_ram_usage(net->layers[i]);
102  return usage;
103 }
104 
105 
106 void PCFNN_NETWORK_summary(struct PCFNN_NETWORK *net, size_t param[5])
107 {
108  /* 0: number of unlocked parameters
109  * 1: number of locked parameters
110  * 2: ram usage in bytes
111  * 3: number of layer
112  * 4: number of neurons
113  */
114  if (net == NULL || param == NULL) return;
115  param[0] = param[1] = param[2] = param[4]= 0;
116  param[3] = net->size;
117  param[2] = PCFNN_NETWORK_get_ram_usage(net);
118  for (size_t i = 0; i < net->size; ++i)
119  {
120  if (net->layers[i]->type != PCFNN_LAYER_INPUT)
121  PCFNN_LAYER_summary(net->layers[i], param);
122  param[4] += net->layers[i]->size;
123  }
124 }
125 
127 {
128  if (net == NULL) return;
129  size_t param[5];
130  PCFNN_NETWORK_summary(net, param);
131 
132  printf("===\n PCFNN_NETWORK: summary\n* Neural network ram usage: ");
133  if (param[2] < 1000)
134  printf("%ld o", param[2]);
135  else if (param[2] < 1000000 && param[2] > 1000)
136  printf("%.2f Ko", (double)param[2] / 1000.);
137  else if (param[2] < 1000000000 && param[2] > 1000000)
138  printf("%.2f Mo", (double)param[2] / 1000000.);
139  else if (param[2] < 1000000000000 && param[2] > 1000000000)
140  printf("%.2f Go", (double)param[2] / 1000000000.);
141  else
142  printf("%.2f To", (double)param[2] / 1000000000000.);
143  printf("\n* Number of layers: %ld\n* Number of neurons: %ld\n--\n* Layer summary: \n", param[3], param[4]);
144  for (size_t i = 0; i < net->size; ++i)
145  {
146  char type = 'H';
147  if (net->layers[i]->type == PCFNN_LAYER_INPUT)
148  type = 'I';
149  if (net->layers[i]->type == PCFNN_LAYER_OUTPUT)
150  type = 'O';
151  printf(" - [%c] layer: n°%ld : %ld neurons\n"
152  " links: \n", type, i, net->layers[i]->size);
153  for (size_t j = 0; j < net->layers[i]->nblinks; ++j)
154  {
155  struct PCFNN_LAYER_LINK *link = net->layers[i]->links[j];
156  printf(" - %ld -> %ld | (%ld, %ld) -> (%ld, %ld)\n",
157  link->from->index, link->to->index, link->offset_from, link->size_from, link->offset_to, link->size_to);
158  }
159  }
160  printf("--\n* Number of unlocked parameters: %ld\n* Number of locked parameters: %ld\n===\n", param[0], param[1]);
161 }
Layer unit.
Definition: layer.h:53
int PCFNN_LAYER_connect(struct PCFNN_LAYER *from, struct PCFNN_LAYER *to, size_t size_from, size_t size_to, size_t offset_from, size_t offset_to, double(*f_init_to)(), double(*f_act_to)(double), double(*f_act_de_to)(double))
Connect two PCFNN_LAYER. It will create a link between from and to.
Definition: layer.c:89
void PCFNN_LAYER_free(struct PCFNN_LAYER *l)
Free all memory allocation of an PCFNN_LAYER (It will call PCFNN_NEURON_free)
Definition: layer.c:34
PCFNN_LAYER.
void PCFNN_LAYER_clear(struct PCFNN_LAYER *l)
Clear all neurons in the layer l (It will call PCFNN_NEURON_clear)
Definition: layer.c:26
struct PCFNN_LAYER * inputl
Definition: network.h:30
size_t size_to
Definition: layer.h:39
int PCFNN_LAYER_build(struct PCFNN_LAYER *l)
Initialize all internal data of the layer l and build of PCFNN_NEURON it contains.
Definition: layer.c:130
struct PCFNN_LAYER ** layers
Definition: network.h:29
double(* f_act_de)(double)
Definition: layer.h:61
Structure to represent a link between to PCFNN_LAYER.
Definition: layer.h:36
struct PCFNN_LAYER_LINK ** links
Definition: layer.h:58
size_t size
Definition: layer.h:55
void PCFNN_NETWORK_print_summary(struct PCFNN_NETWORK *net)
Print neural network summary.
Definition: network.c:126
struct PCFNN_LAYER * to
Definition: layer.h:38
size_t PCFNN_LAYER_get_ram_usage(struct PCFNN_LAYER *l)
Give the number of bytes used by the PCFNN_LAYER l and all PCFNN_NEURON it contains.
Definition: layer.c:179
struct PCFNN_LAYER * outputl
Definition: network.h:30
size_t size
Definition: network.h:28
struct PCFNN_LAYER * PCFNN_LAYER_new_input(size_t size, double(*f_act)(double), double(*f_act_de)(double))
Initialize a PCFNN_LAYER as an input layer.
Definition: layer.c:78
struct PCFNN_NETWORK * PCFNN_NETWORK_build_from_array(size_t *spec, size_t len, double(*f_init)(double), double(*f_act)(double), double(*f_act_de)(double))
Initialize a new PCFNN_NETWORK from an array of number that represent the number of neurons for each ...
Definition: network.c:70
size_t size_from
Definition: layer.h:39
void PCFNN_NETWORK_clear(struct PCFNN_NETWORK *net)
Clear all layers in the PCFNN_NETWORK net (It will call PCFNN_LAYER_clear)
Definition: network.c:31
void PCFNN_NETWORK_free(struct PCFNN_NETWORK *net)
Free all memory allocation of an PCFNN_NETWORK (It will call PCFNN_LAYER_free)
Definition: network.c:21
PCFNN_NETWORK.
void PCFNN_LAYER_summary(struct PCFNN_LAYER *l, size_t param[2])
Write on param the number of unlocked parameters and locked parameters.
Definition: layer.c:199
size_t index
Definition: layer.h:54
int PCFNN_NETWORK_addl(struct PCFNN_NETWORK *net, struct PCFNN_LAYER *l)
Add the PCFNN_LAYER l to the PCFNN_NETWORK net.
Definition: network.c:39
double(* f_act)(double)
Definition: layer.h:60
void PCFNN_NETWORK_summary(struct PCFNN_NETWORK *net, size_t param[5])
Write on param network statistics.
Definition: network.c:106
size_t offset_from
Definition: layer.h:44
struct PCFNN_NETWORK * PCFNN_NETWORK_new()
Initialize a PCFNN_NETWORK.
Definition: network.c:9
size_t PCFNN_NETWORK_get_ram_usage(struct PCFNN_NETWORK *net)
Give the number of bytes used by the PCFNN_NETWORK net and all PCFNN_LAYER it contains.
Definition: network.c:95
enum PCFNN_LAYER_TYPE type
Definition: layer.h:62
Some useful functions.
double f_act_input_de(double n)
Derivative activation function for input layer (for backpropagation algorithm)
Network unit.
Definition: network.h:27
double(* f_init)()
Definition: layer.h:59
int PCFNN_NETWORK_build(struct PCFNN_NETWORK *net)
Initialize all internal data of the PCFNN_NETWORK l and build of PCFNN_LAYER it contains.
Definition: network.c:50
size_t nblinks
Definition: layer.h:57
struct PCFNN_LAYER * from
Definition: layer.h:38
double f_act_input(double n)
Activation function for input layer (for feedforward algorithm)
Definition: tools.c:29
struct PCFNN_LAYER * PCFNN_LAYER_new(double(*f_init)(), double(*f_act)(double), double(*f_act_de)(double))
Definition: layer.c:8
size_t offset_to
Definition: layer.h:44