ANN  0.1.1.5
A library containing multiple neural network models written in C
layer.c
Go to the documentation of this file.
1 #include <stdlib.h>
3 #include "ANN/tools.h"
4 
6 
7 
8 struct PCFNN_LAYER *PCFNN_LAYER_new(double(*f_init)(), double(*f_act)(double), double(*f_act_de)(double))
9 {
10  struct PCFNN_LAYER *l = malloc(sizeof(struct PCFNN_LAYER));
11  if (l == NULL) return NULL;
12  l->size = l->nblinks = l->index = 0;
13  l->neurons = malloc(sizeof(struct PCFNN_NEURON*) * l->size);
14  if (l->neurons == NULL)
15  { free(l); return NULL; }
16  l->links = malloc(sizeof(struct PCFNN_LAYER_link*) * l->nblinks);
17  if (l->links == NULL)
18  { free(l->neurons); free(l); return NULL; }
19  l->f_init = f_init;
20  l->f_act = f_act;
21  l->f_act_de = f_act_de;
22  return l;
23 }
24 
25 
27 {
28  if (l == NULL) return;
29  for(size_t i = 0; i < l->size; ++i)
31 }
32 
33 
35 {
36  if (l != NULL)
37  {
38  for(size_t i = 0; i < l->size; ++i)
40  for(size_t i = 0; i < l->nblinks; ++i)
41  {
42  if (l->links[i] != NULL)
43  {
44  if (l->links[i]->from == l)
45  l->links[i]->to->links[l->links[i]->index_to] = NULL;
46  else
47  l->links[i]->from->links[l->links[i]->index_from] = NULL;
48  free(l->links[i]);
49  l->links[i] = NULL;
50  }
51  }
52  free(l->neurons);
53  free(l->links);
54  free(l);
55  }
56 }
57 
58 
59 int PCFNN_LAYER_addn(struct PCFNN_LAYER *l, size_t size, size_t inputs, double(*f_init)(), double(*f_act)(double), double(*f_act_de)(double))
60 {
61  if (f_init == NULL && l->f_init != NULL) f_init = l->f_init;
62  if (f_act == NULL && l->f_act != NULL) f_act = l->f_act;
63  if (f_act_de == NULL && l->f_act_de != NULL) f_act_de = l->f_act_de;
64  if ((size <= 0 && inputs == 0) || f_act_de == NULL || f_act == NULL || f_init == NULL) return 1;
65 
66  l->size += size;
67  l->neurons = realloc(l->neurons, sizeof(struct PCFNN_NEURON*) * l->size);
68  if (l->neurons == NULL) return -1;
69  for(size_t i = l->size - size; i < l->size; ++i)
70  {
71  l->neurons[i] = PCFNN_NEURON_new(inputs, f_init, f_act, f_act_de);
72  if (l->neurons[i] == NULL) return -1;
73  }
74  return 0;
75 }
76 
77 
78 struct PCFNN_LAYER *PCFNN_LAYER_new_input(size_t size, double(*f_act)(double), double(*f_act_de)(double))
79 {
81  if (l == NULL) return NULL;
82  if (PCFNN_LAYER_addn(l, size, 0, f_init_input, f_act, f_act_de) != 0)
83  { PCFNN_LAYER_free(l); return NULL; }
85  return l;
86 }
87 
88 
89 int PCFNN_LAYER_connect(struct PCFNN_LAYER *from, struct PCFNN_LAYER *to,
90  size_t size_from, size_t size_to,
91  size_t offset_from, size_t offset_to,
92  double(*f_init_to)(), double(*f_act_to)(double), double(*f_act_de_to)(double))
93 {
94  if (from == NULL || to == NULL) return 1;
95  size_t ifrom = from->nblinks;
96  size_t ito = to->nblinks;
97 
98  struct PCFNN_LAYER_LINK *link = malloc(sizeof(struct PCFNN_LAYER_LINK));
99 
100  if (link == NULL) return -1;
101 
102  ++from->nblinks; ++to->nblinks;
103  from->links = realloc(from->links, sizeof(struct PCFNN_LAYER_LINK*) * from->nblinks);
104  if (from->links == NULL) { free(link); return -1; }
105  to->links = realloc(to->links, sizeof(struct PCFNN_LAYER_LINK*) * to->nblinks);
106  if (to->links == NULL) { free(link); return -1; }
107 
108  link->from = from;
109  link->to = to;
110  link->index_from = ifrom;
111  link->index_to = ito;
112 
113  link->size_from = size_from;
114  link->size_to = size_to;
115 
116  link->f_init_to = f_init_to;
117  link->f_act_to = f_act_to;
118  link->f_act_de_to = f_act_de_to;
119 
120  link->offset_from = offset_from;
121  link->offset_to = offset_to;
122  link->isInit = 0;
123 
124  from->links[ifrom] = to->links[ito] = link;
125 
126  return 0;
127 }
128 
129 
131 {
132  size_t nblinks[2]; nblinks[0] = nblinks[1] = 0;
133  if (l == NULL) return 1;
134  for(size_t k = 0; k < l->nblinks; ++k)
135  {
136  struct PCFNN_LAYER_LINK *link = l->links[k];
137  if (link == NULL) continue;
138  if (link->from == l)
139  ++(nblinks[0]);
140 
141  if (link->to == l && !link->isInit) {
142  if (link->offset_to > l->size) return 1;
143  for(size_t i = link->offset_to; i < l->size && i < link->size_to; ++i)
144  if (link->size_from > l->neurons[i]->size)
145  PCFNN_NEURON_addinputs(l->neurons[i], link->size_from - l->neurons[i]->size);
146  if (link->size_to + link->offset_to > l->size)
147  if (PCFNN_LAYER_addn(l, link->size_to + link->offset_to - l->size, link->size_from, link->f_init_to, link->f_act_to, link->f_act_de_to))
148  return -1;
149 
150  link->isInit = 1; ++(nblinks[1]);
151  }
152  }
153 
154  size_t w[l->size];
155  for(size_t i = 0; i < l->size; ++i)
156  {
158  w[i] = 0;
159  }
160  for(size_t k = 0; k < l->nblinks; ++k)
161  {
162  struct PCFNN_LAYER_LINK *link = l->links[k];
163  if (link != NULL && link->to == l && link->isInit)
164  for(size_t i = link->offset_to; i < link->size_to + link->offset_to; ++i)
165  for(size_t j = link->offset_from; j < link->size_from + link->offset_from && w[i] < l->neurons[i]->size; ++j, ++w[i])
166  l->neurons[i]->inputs[w[i]] = link->from->neurons[j];
167  }
168 
169  if (nblinks[0] == 0)
171  else if (nblinks[1] == 0)
172  l->type = PCFNN_LAYER_INPUT;
173  else
175  return 0;
176 }
177 
178 
180 {
181  if (l == NULL) return 0;
182  size_t usage = sizeof(struct PCFNN_LAYER);
183  usage += sizeof(struct PCFNN_NEURON*) * l->size;
184  for (size_t i = 0; i < l->size; ++i)
185  usage += PCFNN_NEURON_get_ram_usage(l->neurons[i]);
186  usage += sizeof(struct PCFNN_LAYER_LINK*) + sizeof(struct PCFNN_LAYER_LINK) * l->nblinks;
187  return usage;
188 }
189 
190 
191 void PCFNN_LAYER_set_lock_state(struct PCFNN_LAYER *l, enum PCFNN_NEURON_LOCK_STATE state, size_t size, size_t offset)
192 {
193  if (l == NULL || size + offset > l->size) return;
194  for (size_t i = offset; i < offset + size; ++i)
195  PCFNN_NEURON_set_state_lock(l->neurons[i], state);
196 }
197 
198 
199 void PCFNN_LAYER_summary(struct PCFNN_LAYER *l, size_t param[2])
200 {
201  if (l == NULL || param == NULL) return;
202  for (size_t i = 0; i < l->size; ++i)
203  PCFNN_NEURON_summary(l->neurons[i], param);
204 }
Neuron unit.
Definition: neuron.h:35
int PCFNN_LAYER_addn(struct PCFNN_LAYER *l, size_t size, size_t inputs, double(*f_init)(), double(*f_act)(double), double(*f_act_de)(double))
Add neurons in the PCFNN_LAYER l.
Definition: layer.c:59
Layer unit.
Definition: layer.h:53
void PCFNN_NEURON_free(struct PCFNN_NEURON *n)
Free all memory allocation of an PCFNN_NEURON.
Definition: neuron.c:28
PCFNN_LAYER.
void PCFNN_NEURON_clear(struct PCFNN_NEURON *n)
Clear a PCFNN_NEURON.
Definition: neuron.c:21
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
size_t size_to
Definition: layer.h:39
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
int index_to
Definition: layer.h:37
size_t size
Definition: layer.h:55
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 * to
Definition: layer.h:38
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
double(* f_act_to)(double)
Definition: layer.h:41
struct PCFNN_NEURON ** inputs
Definition: neuron.h:42
PCFNN_NEURON.
struct PCFNN_NEURON * PCFNN_NEURON_new(size_t size, double(*f_init)(), double(*f_act)(double), double(*f_act_de)(double))
Initialize a PCFNN_NEURON.
Definition: neuron.c:6
size_t size_from
Definition: layer.h:39
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
double f_init_input()
Weight and bias initialization function input layer.
Definition: tools.c:12
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
void PCFNN_NEURON_build(struct PCFNN_NEURON *n)
Initialize all internal data of a PCFNN_NEURON.
Definition: neuron.c:48
double(* f_init_to)()
Definition: layer.h:40
void PCFNN_NEURON_summary(struct PCFNN_NEURON *n, size_t param[2])
Write on param the number of unlocked parameters and locked parameters.
Definition: neuron.c:103
void PCFNN_NEURON_addinputs(struct PCFNN_NEURON *n, size_t inputs)
Increase the input size of the PCFNN_NEURON.
Definition: neuron.c:41
size_t index
Definition: layer.h:54
void PCFNN_NEURON_set_state_lock(struct PCFNN_NEURON *n, enum PCFNN_NEURON_LOCK_STATE state)
Set lock state of the neuron n.
Definition: neuron.c:97
size_t PCFNN_NEURON_get_ram_usage(struct PCFNN_NEURON *n)
Give the number of bytes used by the PCFNN_NEURON n.
Definition: neuron.c:60
struct PCFNN_NEURON ** neurons
Definition: layer.h:56
int index_from
Definition: layer.h:37
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
double(* f_act)(double)
Definition: layer.h:60
size_t offset_from
Definition: layer.h:44
enum PCFNN_LAYER_TYPE type
Definition: layer.h:62
Some useful functions.
void PCFNN_LAYER_set_lock_state(struct PCFNN_LAYER *l, enum PCFNN_NEURON_LOCK_STATE state, size_t size, size_t offset)
Set lock state of size neurons of l starting by offset neuron of l.
Definition: layer.c:191
double(* f_init)()
Definition: layer.h:59
size_t size
Definition: neuron.h:36
size_t nblinks
Definition: layer.h:57
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
struct PCFNN_LAYER * PCFNN_LAYER_new(double(*f_init)(), double(*f_act)(double), double(*f_act_de)(double))
Definition: layer.c:8
struct PCFNN_LAYER * from
Definition: layer.h:38
PCFNN_NEURON_LOCK_STATE
Lock state of a neuron.
Definition: neuron.h:22
double(* f_act_de_to)(double)
Definition: layer.h:42
size_t offset_to
Definition: layer.h:44