ruby-fann 2.0.0 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -9,94 +9,131 @@ static VALUE m_rb_fann_standard_class;
9
9
  static VALUE m_rb_fann_shortcut_class;
10
10
  static VALUE m_rb_fann_train_data_class;
11
11
 
12
- #define RETURN_FANN_INT(fn) \
13
- struct fann* f; \
14
- Data_Get_Struct (self, struct fann, f); \
15
- return INT2NUM(fn(f));
16
-
17
- #define SET_FANN_INT(attr_name, fann_fn) \
18
- Check_Type(attr_name, T_FIXNUM); \
19
- struct fann* f; \
20
- Data_Get_Struct(self, struct fann, f); \
21
- fann_fn(f, NUM2INT(attr_name)); \
22
- return 0;
23
-
24
- #define RETURN_FANN_UINT(fn) \
25
- struct fann* f; \
26
- Data_Get_Struct (self, struct fann, f); \
27
- return rb_int_new(fn(f));
28
-
29
- #define SET_FANN_UINT(attr_name, fann_fn) \
30
- Check_Type(attr_name, T_FIXNUM); \
31
- struct fann* f; \
32
- Data_Get_Struct(self, struct fann, f); \
33
- fann_fn(f, NUM2UINT(attr_name)); \
34
- return 0;
12
+ #define RETURN_FANN_INT(fn) \
13
+ struct fann *f; \
14
+ Data_Get_Struct(self, struct fann, f); \
15
+ return INT2NUM(fn(f));
16
+
17
+ #define SET_FANN_INT(attr_name, fann_fn) \
18
+ Check_Type(attr_name, T_FIXNUM); \
19
+ struct fann *f; \
20
+ Data_Get_Struct(self, struct fann, f); \
21
+ fann_fn(f, NUM2INT(attr_name)); \
22
+ return 0;
23
+
24
+ #define RETURN_FANN_UINT(fn) \
25
+ struct fann *f; \
26
+ Data_Get_Struct(self, struct fann, f); \
27
+ return rb_int_new(fn(f));
28
+
29
+ #define SET_FANN_UINT(attr_name, fann_fn) \
30
+ Check_Type(attr_name, T_FIXNUM); \
31
+ struct fann *f; \
32
+ Data_Get_Struct(self, struct fann, f); \
33
+ fann_fn(f, NUM2UINT(attr_name)); \
34
+ return 0;
35
35
 
36
36
  // Converts float return values to a double with same precision, avoids floating point errors.
37
- #define RETURN_FANN_FLT(fn) \
38
- struct fann* f; \
39
- Data_Get_Struct (self, struct fann, f); \
40
- char buffy[20]; \
41
- sprintf(buffy, "%0.6g", fn(f)); \
42
- return rb_float_new(atof(buffy));
43
-
44
- #define SET_FANN_FLT(attr_name, fann_fn) \
45
- Check_Type(attr_name, T_FLOAT); \
46
- struct fann* f; \
47
- Data_Get_Struct(self, struct fann, f); \
48
- fann_fn(f, NUM2DBL(attr_name)); \
49
- return self;
50
-
51
- #define RETURN_FANN_DBL(fn) \
52
- struct fann* f; \
53
- Data_Get_Struct (self, struct fann, f); \
54
- return rb_float_new(fn(f));
37
+ #define RETURN_FANN_FLT(fn) \
38
+ struct fann *f; \
39
+ Data_Get_Struct(self, struct fann, f); \
40
+ char buffy[20]; \
41
+ sprintf(buffy, "%0.6g", fn(f)); \
42
+ return rb_float_new(atof(buffy));
43
+
44
+ #define SET_FANN_FLT(attr_name, fann_fn) \
45
+ Check_Type(attr_name, T_FLOAT); \
46
+ struct fann *f; \
47
+ Data_Get_Struct(self, struct fann, f); \
48
+ fann_fn(f, NUM2DBL(attr_name)); \
49
+ return self;
50
+
51
+ #define RETURN_FANN_DBL(fn) \
52
+ struct fann *f; \
53
+ Data_Get_Struct(self, struct fann, f); \
54
+ return rb_float_new(fn(f));
55
55
 
56
56
  #define SET_FANN_DBL SET_FANN_FLT
57
57
 
58
58
  // Convert ruby symbol to corresponding FANN enum type for activation function:
59
59
  enum fann_activationfunc_enum sym_to_activation_function(VALUE activation_func)
60
60
  {
61
- ID id=SYM2ID(activation_func);
61
+ ID id = SYM2ID(activation_func);
62
62
  enum fann_activationfunc_enum activation_function;
63
- if(id==rb_intern("linear")) {
63
+ if (id == rb_intern("linear"))
64
+ {
64
65
  activation_function = FANN_LINEAR;
65
- } else if(id==rb_intern("threshold")) {
66
+ }
67
+ else if (id == rb_intern("threshold"))
68
+ {
66
69
  activation_function = FANN_THRESHOLD;
67
- } else if(id==rb_intern("threshold_symmetric")) {
70
+ }
71
+ else if (id == rb_intern("threshold_symmetric"))
72
+ {
68
73
  activation_function = FANN_THRESHOLD_SYMMETRIC;
69
- } else if(id==rb_intern("sigmoid")) {
74
+ }
75
+ else if (id == rb_intern("sigmoid"))
76
+ {
70
77
  activation_function = FANN_SIGMOID;
71
- } else if(id==rb_intern("sigmoid_stepwise")) {
78
+ }
79
+ else if (id == rb_intern("sigmoid_stepwise"))
80
+ {
72
81
  activation_function = FANN_SIGMOID_STEPWISE;
73
- } else if(id==rb_intern("sigmoid_symmetric")) {
82
+ }
83
+ else if (id == rb_intern("sigmoid_symmetric"))
84
+ {
74
85
  activation_function = FANN_SIGMOID_SYMMETRIC;
75
- } else if(id==rb_intern("sigmoid_symmetric_stepwise")) {
86
+ }
87
+ else if (id == rb_intern("sigmoid_symmetric_stepwise"))
88
+ {
76
89
  activation_function = FANN_SIGMOID_SYMMETRIC_STEPWISE;
77
- } else if(id==rb_intern("gaussian")) {
90
+ }
91
+ else if (id == rb_intern("gaussian"))
92
+ {
78
93
  activation_function = FANN_GAUSSIAN;
79
- } else if(id==rb_intern("gaussian_symmetric")) {
94
+ }
95
+ else if (id == rb_intern("gaussian_symmetric"))
96
+ {
80
97
  activation_function = FANN_GAUSSIAN_SYMMETRIC;
81
- } else if(id==rb_intern("gaussian_stepwise")) {
98
+ }
99
+ else if (id == rb_intern("gaussian_stepwise"))
100
+ {
82
101
  activation_function = FANN_GAUSSIAN_STEPWISE;
83
- } else if(id==rb_intern("elliot")) {
102
+ }
103
+ else if (id == rb_intern("elliot"))
104
+ {
84
105
  activation_function = FANN_ELLIOT;
85
- } else if(id==rb_intern("elliot_symmetric")) {
106
+ }
107
+ else if (id == rb_intern("elliot_symmetric"))
108
+ {
86
109
  activation_function = FANN_ELLIOT_SYMMETRIC;
87
- } else if(id==rb_intern("linear_piece")) {
110
+ }
111
+ else if (id == rb_intern("linear_piece"))
112
+ {
88
113
  activation_function = FANN_LINEAR_PIECE;
89
- } else if(id==rb_intern("linear_piece_symmetric")) {
114
+ }
115
+ else if (id == rb_intern("linear_piece_symmetric"))
116
+ {
90
117
  activation_function = FANN_LINEAR_PIECE_SYMMETRIC;
91
- } else if(id==rb_intern("sin_symmetric")) {
118
+ }
119
+ else if (id == rb_intern("sin_symmetric"))
120
+ {
92
121
  activation_function = FANN_SIN_SYMMETRIC;
93
- } else if(id==rb_intern("cos_symmetric")) {
122
+ }
123
+ else if (id == rb_intern("cos_symmetric"))
124
+ {
94
125
  activation_function = FANN_COS_SYMMETRIC;
95
- } else if(id==rb_intern("sin")) {
126
+ }
127
+ else if (id == rb_intern("sin"))
128
+ {
96
129
  activation_function = FANN_SIN;
97
- } else if(id==rb_intern("cos")) {
130
+ }
131
+ else if (id == rb_intern("cos"))
132
+ {
98
133
  activation_function = FANN_COS;
99
- } else {
134
+ }
135
+ else
136
+ {
100
137
  rb_raise(rb_eRuntimeError, "Unrecognized activation function: [%s]", rb_id2name(SYM2ID(activation_func)));
101
138
  }
102
139
  return activation_function;
@@ -107,83 +144,118 @@ VALUE activation_function_to_sym(enum fann_activationfunc_enum fn)
107
144
  {
108
145
  VALUE activation_function;
109
146
 
110
- if(fn==FANN_LINEAR) {
147
+ if (fn == FANN_LINEAR)
148
+ {
111
149
  activation_function = ID2SYM(rb_intern("linear"));
112
- } else if(fn==FANN_THRESHOLD) {
150
+ }
151
+ else if (fn == FANN_THRESHOLD)
152
+ {
113
153
  activation_function = ID2SYM(rb_intern("threshold"));
114
- } else if(fn==FANN_THRESHOLD_SYMMETRIC) {
154
+ }
155
+ else if (fn == FANN_THRESHOLD_SYMMETRIC)
156
+ {
115
157
  activation_function = ID2SYM(rb_intern("threshold_symmetric"));
116
- } else if(fn==FANN_SIGMOID) {
158
+ }
159
+ else if (fn == FANN_SIGMOID)
160
+ {
117
161
  activation_function = ID2SYM(rb_intern("sigmoid"));
118
- } else if(fn==FANN_SIGMOID_STEPWISE) {
162
+ }
163
+ else if (fn == FANN_SIGMOID_STEPWISE)
164
+ {
119
165
  activation_function = ID2SYM(rb_intern("sigmoid_stepwise"));
120
- } else if(fn==FANN_SIGMOID_SYMMETRIC) {
166
+ }
167
+ else if (fn == FANN_SIGMOID_SYMMETRIC)
168
+ {
121
169
  activation_function = ID2SYM(rb_intern("sigmoid_symmetric"));
122
- } else if(fn==FANN_SIGMOID_SYMMETRIC_STEPWISE) {
170
+ }
171
+ else if (fn == FANN_SIGMOID_SYMMETRIC_STEPWISE)
172
+ {
123
173
  activation_function = ID2SYM(rb_intern("sigmoid_symmetric_stepwise"));
124
- } else if(fn==FANN_GAUSSIAN) {
174
+ }
175
+ else if (fn == FANN_GAUSSIAN)
176
+ {
125
177
  activation_function = ID2SYM(rb_intern("gaussian"));
126
- } else if(fn==FANN_GAUSSIAN_SYMMETRIC) {
178
+ }
179
+ else if (fn == FANN_GAUSSIAN_SYMMETRIC)
180
+ {
127
181
  activation_function = ID2SYM(rb_intern("gaussian_symmetric"));
128
- } else if(fn==FANN_GAUSSIAN_STEPWISE) {
182
+ }
183
+ else if (fn == FANN_GAUSSIAN_STEPWISE)
184
+ {
129
185
  activation_function = ID2SYM(rb_intern("gaussian_stepwise"));
130
- } else if(fn==FANN_ELLIOT) {
186
+ }
187
+ else if (fn == FANN_ELLIOT)
188
+ {
131
189
  activation_function = ID2SYM(rb_intern("elliot"));
132
- } else if(fn==FANN_ELLIOT_SYMMETRIC) {
190
+ }
191
+ else if (fn == FANN_ELLIOT_SYMMETRIC)
192
+ {
133
193
  activation_function = ID2SYM(rb_intern("elliot_symmetric"));
134
- } else if(fn==FANN_LINEAR_PIECE) {
194
+ }
195
+ else if (fn == FANN_LINEAR_PIECE)
196
+ {
135
197
  activation_function = ID2SYM(rb_intern("linear_piece"));
136
- } else if(fn==FANN_LINEAR_PIECE_SYMMETRIC) {
198
+ }
199
+ else if (fn == FANN_LINEAR_PIECE_SYMMETRIC)
200
+ {
137
201
  activation_function = ID2SYM(rb_intern("linear_piece_symmetric"));
138
- } else if(fn==FANN_SIN_SYMMETRIC) {
202
+ }
203
+ else if (fn == FANN_SIN_SYMMETRIC)
204
+ {
139
205
  activation_function = ID2SYM(rb_intern("sin_symmetric"));
140
- } else if(fn==FANN_COS_SYMMETRIC) {
206
+ }
207
+ else if (fn == FANN_COS_SYMMETRIC)
208
+ {
141
209
  activation_function = ID2SYM(rb_intern("cos_symmetric"));
142
- } else if(fn==FANN_SIN) {
210
+ }
211
+ else if (fn == FANN_SIN)
212
+ {
143
213
  activation_function = ID2SYM(rb_intern("sin"));
144
- } else if(fn==FANN_COS) {
214
+ }
215
+ else if (fn == FANN_COS)
216
+ {
145
217
  activation_function = ID2SYM(rb_intern("cos"));
146
- } else {
218
+ }
219
+ else
220
+ {
147
221
  rb_raise(rb_eRuntimeError, "Unrecognized activation function: [%d]", fn);
148
222
  }
149
223
  return activation_function;
150
224
  }
151
225
 
152
-
153
226
  // Unused for now:
154
- static void fann_mark (struct fann* ann){}
227
+ static void fann_mark(struct fann *ann) {}
155
228
 
156
229
  // #define DEBUG 1
157
230
 
158
231
  // Free memory associated with FANN:
159
- static void fann_free (struct fann* ann)
232
+ static void fann_free(struct fann *ann)
160
233
  {
161
- fann_destroy(ann);
234
+ fann_destroy(ann);
162
235
  // ("Destroyed FANN network [%d].\n", ann);
163
236
  }
164
237
 
165
238
  // Free memory associated with FANN Training data:
166
- static void fann_training_data_free (struct fann_train_data* train_data)
239
+ static void fann_training_data_free(struct fann_train_data *train_data)
167
240
  {
168
- fann_destroy_train(train_data);
241
+ fann_destroy_train(train_data);
169
242
  // printf("Destroyed Training data [%d].\n", train_data);
170
243
  }
171
244
 
172
245
  // Create wrapper, but don't allocate anything...do that in
173
246
  // initialize, so we can construct with args:
174
- static VALUE fann_allocate (VALUE klass)
247
+ static VALUE fann_allocate(VALUE klass)
175
248
  {
176
- return Data_Wrap_Struct (klass, fann_mark, fann_free, 0);
249
+ return Data_Wrap_Struct(klass, fann_mark, fann_free, 0);
177
250
  }
178
251
 
179
252
  // Create wrapper, but don't allocate annything...do that in
180
253
  // initialize, so we can construct with args:
181
- static VALUE fann_training_data_allocate (VALUE klass)
254
+ static VALUE fann_training_data_allocate(VALUE klass)
182
255
  {
183
- return Data_Wrap_Struct (klass, fann_mark, fann_training_data_free, 0);
256
+ return Data_Wrap_Struct(klass, fann_mark, fann_training_data_free, 0);
184
257
  }
185
258
 
186
-
187
259
  // static VALUE invoke_training_callback(VALUE self)
188
260
  // {
189
261
  // VALUE callback = rb_funcall(self, rb_intern("training_callback"), 0);
@@ -194,8 +266,8 @@ static VALUE fann_training_data_allocate (VALUE klass)
194
266
  // unsigned int max_epochs, unsigned int epochs_between_reports, float desired_error, unsigned int epochs)
195
267
 
196
268
  static int FANN_API fann_training_callback(struct fann *ann, struct fann_train_data *train,
197
- unsigned int max_epochs, unsigned int epochs_between_reports,
198
- float desired_error, unsigned int epochs)
269
+ unsigned int max_epochs, unsigned int epochs_between_reports,
270
+ float desired_error, unsigned int epochs)
199
271
  {
200
272
  VALUE self = (VALUE)fann_get_user_data(ann);
201
273
  VALUE args = rb_hash_new();
@@ -213,13 +285,13 @@ static int FANN_API fann_training_callback(struct fann *ann, struct fann_train_d
213
285
 
214
286
  VALUE callback = rb_funcall(self, rb_intern("training_callback"), 1, args);
215
287
 
216
- if (TYPE(callback)!=T_FIXNUM)
288
+ if (TYPE(callback) != T_FIXNUM)
217
289
  {
218
- rb_raise (rb_eRuntimeError, "Callback method must return an integer (-1 to stop training).");
290
+ rb_raise(rb_eRuntimeError, "Callback method must return an integer (-1 to stop training).");
219
291
  }
220
292
 
221
293
  int status = NUM2INT(callback);
222
- if (status==-1)
294
+ if (status == -1)
223
295
  {
224
296
  printf("Callback method returned -1; training will stop.\n");
225
297
  }
@@ -251,19 +323,19 @@ static VALUE fann_initialize(VALUE self, VALUE hash)
251
323
  VALUE num_outputs = rb_hash_aref(hash, ID2SYM(rb_intern("num_outputs")));
252
324
  VALUE hidden_neurons = rb_hash_aref(hash, ID2SYM(rb_intern("hidden_neurons")));
253
325
  // printf("initializing\n\n\n");
254
- struct fann* ann;
255
- if (TYPE(filename)==T_STRING)
326
+ struct fann *ann;
327
+ if (TYPE(filename) == T_STRING)
256
328
  {
257
329
  // Initialize with file:
258
330
  // train_data = fann_read_train_from_file(StringValuePtr(filename));
259
331
  // DATA_PTR(self) = train_data;
260
332
  ann = fann_create_from_file(StringValuePtr(filename));
261
- // printf("Created RubyFann::Standard [%d] from file [%s].\n", ann, StringValuePtr(filename));
333
+ // printf("Created RubyFann::Standard [%d] from file [%s].\n", ann, StringValuePtr(filename));
262
334
  }
263
- else if(rb_obj_is_kind_of(self, m_rb_fann_shortcut_class))
335
+ else if (rb_obj_is_kind_of(self, m_rb_fann_shortcut_class))
264
336
  {
265
337
  // Initialize as shortcut, suitable for cascade training:
266
- //ann = fann_create_shortcut_array(num_layers, layers);
338
+ // ann = fann_create_shortcut_array(num_layers, layers);
267
339
  Check_Type(num_inputs, T_FIXNUM);
268
340
  Check_Type(num_outputs, T_FIXNUM);
269
341
 
@@ -278,17 +350,18 @@ static VALUE fann_initialize(VALUE self, VALUE hash)
278
350
  Check_Type(num_outputs, T_FIXNUM);
279
351
 
280
352
  // Initialize layers:
281
- unsigned int num_layers=RARRAY_LEN(hidden_neurons) + 2;
353
+ unsigned int num_layers = RARRAY_LEN(hidden_neurons) + 2;
282
354
  unsigned int layers[num_layers];
283
355
 
284
356
  // Input:
285
- layers[0]=NUM2INT(num_inputs);
357
+ layers[0] = NUM2INT(num_inputs);
286
358
  // Output:
287
- layers[num_layers-1]=NUM2INT(num_outputs);
359
+ layers[num_layers - 1] = NUM2INT(num_outputs);
288
360
  // Hidden:
289
361
  unsigned int i;
290
- for (i=1; i<=num_layers-2; i++) {
291
- layers[i]=NUM2INT(RARRAY_PTR(hidden_neurons)[i-1]);
362
+ for (i = 1; i <= num_layers - 2; i++)
363
+ {
364
+ layers[i] = NUM2INT(RARRAY_PTR(hidden_neurons)[i - 1]);
292
365
  }
293
366
  ann = fann_create_standard_array(num_layers, layers);
294
367
  }
@@ -297,9 +370,9 @@ static VALUE fann_initialize(VALUE self, VALUE hash)
297
370
 
298
371
  // printf("Checking for callback...");
299
372
 
300
- //int callback = rb_protect(invoke_training_callback, (self), &status);
301
- // VALUE callback = rb_funcall(DATA_PTR(self), "training_callback", 0);
302
- if(rb_respond_to(self, rb_intern("training_callback")))
373
+ // int callback = rb_protect(invoke_training_callback, (self), &status);
374
+ // VALUE callback = rb_funcall(DATA_PTR(self), "training_callback", 0);
375
+ if (rb_respond_to(self, rb_intern("training_callback")))
303
376
  {
304
377
  fann_set_callback(ann, &fann_training_callback);
305
378
  fann_set_user_data(ann, self);
@@ -329,39 +402,39 @@ static VALUE fann_initialize(VALUE self, VALUE hash)
329
402
  */
330
403
  static VALUE fann_train_data_initialize(VALUE self, VALUE hash)
331
404
  {
332
- struct fann_train_data* train_data;
405
+ struct fann_train_data *train_data;
333
406
  Check_Type(hash, T_HASH);
334
407
 
335
408
  VALUE filename = rb_hash_aref(hash, ID2SYM(rb_intern("filename")));
336
409
  VALUE inputs = rb_hash_aref(hash, ID2SYM(rb_intern("inputs")));
337
410
  VALUE desired_outputs = rb_hash_aref(hash, ID2SYM(rb_intern("desired_outputs")));
338
411
 
339
- if (TYPE(filename)==T_STRING)
412
+ if (TYPE(filename) == T_STRING)
340
413
  {
341
414
  train_data = fann_read_train_from_file(StringValuePtr(filename));
342
415
  DATA_PTR(self) = train_data;
343
416
  }
344
- else if (TYPE(inputs)==T_ARRAY)
417
+ else if (TYPE(inputs) == T_ARRAY)
345
418
  {
346
- if (TYPE(desired_outputs)!=T_ARRAY)
419
+ if (TYPE(desired_outputs) != T_ARRAY)
347
420
  {
348
- rb_raise (rb_eRuntimeError, "[desired_outputs] must be present when [inputs] used.");
421
+ rb_raise(rb_eRuntimeError, "[desired_outputs] must be present when [inputs] used.");
349
422
  }
350
423
 
351
424
  if (RARRAY_LEN(inputs) < 1)
352
425
  {
353
- rb_raise (rb_eRuntimeError, "[inputs] must contain at least one value.");
426
+ rb_raise(rb_eRuntimeError, "[inputs] must contain at least one value.");
354
427
  }
355
428
 
356
429
  if (RARRAY_LEN(desired_outputs) < 1)
357
430
  {
358
- rb_raise (rb_eRuntimeError, "[desired_outputs] must contain at least one value.");
431
+ rb_raise(rb_eRuntimeError, "[desired_outputs] must contain at least one value.");
359
432
  }
360
433
 
361
434
  // The data is here, start constructing:
362
- if(RARRAY_LEN(inputs) != RARRAY_LEN(desired_outputs))
435
+ if (RARRAY_LEN(inputs) != RARRAY_LEN(desired_outputs))
363
436
  {
364
- rb_raise (
437
+ rb_raise(
365
438
  rb_eRuntimeError,
366
439
  "Number of inputs must match number of outputs: (%d != %d)",
367
440
  (int)RARRAY_LEN(inputs),
@@ -373,13 +446,12 @@ static VALUE fann_train_data_initialize(VALUE self, VALUE hash)
373
446
  }
374
447
  else
375
448
  {
376
- rb_raise (rb_eRuntimeError, "Must construct with a filename(string) or inputs/desired_outputs(arrays). All args passed via hash with symbols as keys.");
449
+ rb_raise(rb_eRuntimeError, "Must construct with a filename(string) or inputs/desired_outputs(arrays). All args passed via hash with symbols as keys.");
377
450
  }
378
451
 
379
452
  return (VALUE)train_data;
380
453
  }
381
454
 
382
-
383
455
  /** call-seq: save(filename)
384
456
 
385
457
  Save to given filename
@@ -387,8 +459,8 @@ static VALUE fann_train_data_initialize(VALUE self, VALUE hash)
387
459
  static VALUE training_save(VALUE self, VALUE filename)
388
460
  {
389
461
  Check_Type(filename, T_STRING);
390
- struct fann_train_data* t;
391
- Data_Get_Struct (self, struct fann_train_data, t);
462
+ struct fann_train_data *t;
463
+ Data_Get_Struct(self, struct fann_train_data, t);
392
464
  fann_save_train(t, StringValuePtr(filename));
393
465
  return self;
394
466
  }
@@ -397,8 +469,8 @@ static VALUE training_save(VALUE self, VALUE filename)
397
469
  This is recommended for incremental training, while it will have no influence during batch training.*/
398
470
  static VALUE shuffle(VALUE self)
399
471
  {
400
- struct fann_train_data* t;
401
- Data_Get_Struct (self, struct fann_train_data, t);
472
+ struct fann_train_data *t;
473
+ Data_Get_Struct(self, struct fann_train_data, t);
402
474
  fann_shuffle_train_data(t);
403
475
  return self;
404
476
  }
@@ -406,9 +478,9 @@ static VALUE shuffle(VALUE self)
406
478
  /** Length of training data*/
407
479
  static VALUE length_train_data(VALUE self)
408
480
  {
409
- struct fann_train_data* t;
410
- Data_Get_Struct (self, struct fann_train_data, t);
411
- return(UINT2NUM(fann_length_train_data(t)));
481
+ struct fann_train_data *t;
482
+ Data_Get_Struct(self, struct fann_train_data, t);
483
+ return (UINT2NUM(fann_length_train_data(t)));
412
484
  return self;
413
485
  }
414
486
 
@@ -426,7 +498,7 @@ static VALUE set_activation_function(VALUE self, VALUE activation_func, VALUE la
426
498
  Check_Type(layer, T_FIXNUM);
427
499
  Check_Type(neuron, T_FIXNUM);
428
500
 
429
- struct fann* f;
501
+ struct fann *f;
430
502
  Data_Get_Struct(self, struct fann, f);
431
503
  fann_set_activation_function(f, sym_to_activation_function(activation_func), NUM2INT(layer), NUM2INT(neuron));
432
504
  return self;
@@ -442,7 +514,7 @@ static VALUE set_activation_function(VALUE self, VALUE activation_func, VALUE la
442
514
  static VALUE set_activation_function_hidden(VALUE self, VALUE activation_func)
443
515
  {
444
516
  Check_Type(activation_func, T_SYMBOL);
445
- struct fann* f;
517
+ struct fann *f;
446
518
  Data_Get_Struct(self, struct fann, f);
447
519
  fann_set_activation_function_hidden(f, sym_to_activation_function(activation_func));
448
520
  return self;
@@ -463,7 +535,7 @@ static VALUE set_activation_function_layer(VALUE self, VALUE activation_func, VA
463
535
  {
464
536
  Check_Type(activation_func, T_SYMBOL);
465
537
  Check_Type(layer, T_FIXNUM);
466
- struct fann* f;
538
+ struct fann *f;
467
539
  Data_Get_Struct(self, struct fann, f);
468
540
  fann_set_activation_function_layer(f, sym_to_activation_function(activation_func), NUM2INT(layer));
469
541
  return self;
@@ -480,7 +552,7 @@ static VALUE get_activation_function(VALUE self, VALUE layer, VALUE neuron)
480
552
  {
481
553
  Check_Type(layer, T_FIXNUM);
482
554
  Check_Type(neuron, T_FIXNUM);
483
- struct fann* f;
555
+ struct fann *f;
484
556
  Data_Get_Struct(self, struct fann, f);
485
557
  fann_type val = fann_get_activation_function(f, NUM2INT(layer), NUM2INT(neuron));
486
558
  return activation_function_to_sym(val);
@@ -497,7 +569,7 @@ static VALUE get_activation_function(VALUE self, VALUE layer, VALUE neuron)
497
569
  static VALUE set_activation_function_output(VALUE self, VALUE activation_func)
498
570
  {
499
571
  Check_Type(activation_func, T_SYMBOL);
500
- struct fann* f;
572
+ struct fann *f;
501
573
  Data_Get_Struct(self, struct fann, f);
502
574
  fann_set_activation_function_output(f, sym_to_activation_function(activation_func));
503
575
  return self;
@@ -511,7 +583,7 @@ static VALUE get_activation_steepness(VALUE self, VALUE layer, VALUE neuron)
511
583
  {
512
584
  Check_Type(layer, T_FIXNUM);
513
585
  Check_Type(neuron, T_FIXNUM);
514
- struct fann* f;
586
+ struct fann *f;
515
587
  Data_Get_Struct(self, struct fann, f);
516
588
  fann_type val = fann_get_activation_steepness(f, NUM2INT(layer), NUM2INT(neuron));
517
589
  return rb_float_new(val);
@@ -527,7 +599,7 @@ static VALUE set_activation_steepness(VALUE self, VALUE steepness, VALUE layer,
527
599
  Check_Type(layer, T_FIXNUM);
528
600
  Check_Type(neuron, T_FIXNUM);
529
601
 
530
- struct fann* f;
602
+ struct fann *f;
531
603
  Data_Get_Struct(self, struct fann, f);
532
604
  fann_set_activation_steepness(f, NUM2DBL(steepness), NUM2INT(layer), NUM2INT(neuron));
533
605
  return self;
@@ -550,7 +622,7 @@ static VALUE set_activation_steepness_layer(VALUE self, VALUE steepness, VALUE l
550
622
  Check_Type(steepness, T_FLOAT);
551
623
  Check_Type(layer, T_FIXNUM);
552
624
 
553
- struct fann* f;
625
+ struct fann *f;
554
626
  Data_Get_Struct(self, struct fann, f);
555
627
  fann_set_activation_steepness_layer(f, NUM2DBL(steepness), NUM2INT(layer));
556
628
  return self;
@@ -684,9 +756,9 @@ static VALUE set_rprop_delta_zero(VALUE self, VALUE rprop_delta_zero)
684
756
  /** Return array of bias(es)*/
685
757
  static VALUE get_bias_array(VALUE self)
686
758
  {
687
- struct fann* f;
759
+ struct fann *f;
688
760
  unsigned int num_layers;
689
- Data_Get_Struct (self, struct fann, f);
761
+ Data_Get_Struct(self, struct fann, f);
690
762
  num_layers = fann_get_num_layers(f);
691
763
  unsigned int layers[num_layers];
692
764
  fann_get_bias_array(f, layers);
@@ -695,7 +767,7 @@ static VALUE get_bias_array(VALUE self)
695
767
  VALUE arr;
696
768
  arr = rb_ary_new();
697
769
  unsigned int i;
698
- for (i=0; i<num_layers; i++)
770
+ for (i = 0; i < num_layers; i++)
699
771
  {
700
772
  rb_ary_push(arr, INT2NUM(layers[i]));
701
773
  }
@@ -737,9 +809,9 @@ static VALUE get_neurons(VALUE self, VALUE layer)
737
809
  struct fann_layer *layer_it;
738
810
  struct fann_neuron *neuron_it;
739
811
 
740
- struct fann* f;
812
+ struct fann *f;
741
813
  unsigned int i;
742
- Data_Get_Struct (self, struct fann, f);
814
+ Data_Get_Struct(self, struct fann, f);
743
815
 
744
816
  VALUE neuron_array = rb_ary_new();
745
817
  VALUE activation_function_sym = ID2SYM(rb_intern("activation_function"));
@@ -750,16 +822,17 @@ static VALUE get_neurons(VALUE self, VALUE layer)
750
822
  VALUE connections_sym = ID2SYM(rb_intern("connections"));
751
823
  unsigned int layer_num = 0;
752
824
 
753
-
754
- int nuke_bias_neuron = (fann_get_network_type(f)==FANN_NETTYPE_LAYER);
755
- for(layer_it = f->first_layer; layer_it != f->last_layer; layer_it++)
825
+ int nuke_bias_neuron = (fann_get_network_type(f) == FANN_NETTYPE_LAYER);
826
+ for (layer_it = f->first_layer; layer_it != f->last_layer; layer_it++)
756
827
  {
757
- for(neuron_it = layer_it->first_neuron; neuron_it != layer_it->last_neuron; neuron_it++)
828
+ for (neuron_it = layer_it->first_neuron; neuron_it != layer_it->last_neuron; neuron_it++)
758
829
  {
759
- if (nuke_bias_neuron && (neuron_it==(layer_it->last_neuron)-1)) continue;
830
+ if (nuke_bias_neuron && (neuron_it == (layer_it->last_neuron) - 1))
831
+ continue;
760
832
  // Create array of connection indicies:
761
833
  VALUE connection_array = rb_ary_new();
762
- for (i = neuron_it->first_con; i < neuron_it->last_con; i++) {
834
+ for (i = neuron_it->first_con; i < neuron_it->last_con; i++)
835
+ {
763
836
  rb_ary_push(connection_array, INT2NUM(f->connections[i] - f->first_layer->first_neuron));
764
837
  }
765
838
 
@@ -778,17 +851,16 @@ static VALUE get_neurons(VALUE self, VALUE layer)
778
851
  ++layer_num;
779
852
  }
780
853
 
781
- // switch (fann_get_network_type(ann)) {
782
- // case FANN_NETTYPE_LAYER: {
783
- // /* Report one bias in each layer except the last */
784
- // if (layer_it != ann->last_layer-1)
785
- // *bias = 1;
786
- // else
787
- // *bias = 0;
788
- // break;
789
- // }
790
- // case FANN_NETTYPE_SHORTCUT: {
791
-
854
+ // switch (fann_get_network_type(ann)) {
855
+ // case FANN_NETTYPE_LAYER: {
856
+ // /* Report one bias in each layer except the last */
857
+ // if (layer_it != ann->last_layer-1)
858
+ // *bias = 1;
859
+ // else
860
+ // *bias = 0;
861
+ // break;
862
+ // }
863
+ // case FANN_NETTYPE_SHORTCUT: {
792
864
 
793
865
  return neuron_array;
794
866
  }
@@ -796,9 +868,9 @@ static VALUE get_neurons(VALUE self, VALUE layer)
796
868
  /** Get list of layers in array format where each element contains number of neurons in that layer*/
797
869
  static VALUE get_layer_array(VALUE self)
798
870
  {
799
- struct fann* f;
871
+ struct fann *f;
800
872
  unsigned int num_layers;
801
- Data_Get_Struct (self, struct fann, f);
873
+ Data_Get_Struct(self, struct fann, f);
802
874
  num_layers = fann_get_num_layers(f);
803
875
  unsigned int layers[num_layers];
804
876
  fann_get_layer_array(f, layers);
@@ -807,12 +879,12 @@ static VALUE get_layer_array(VALUE self)
807
879
  VALUE arr;
808
880
  arr = rb_ary_new();
809
881
  unsigned int i;
810
- for (i=0; i<num_layers; i++)
882
+ for (i = 0; i < num_layers; i++)
811
883
  {
812
884
  rb_ary_push(arr, INT2NUM(layers[i]));
813
885
  }
814
886
 
815
- return arr;
887
+ return arr;
816
888
  }
817
889
 
818
890
  /** Reads the mean square error from the network.*/
@@ -825,8 +897,8 @@ static VALUE get_MSE(VALUE self)
825
897
  This function also resets the number of bits that fail.*/
826
898
  static VALUE reset_MSE(VALUE self)
827
899
  {
828
- struct fann* f;
829
- Data_Get_Struct (self, struct fann, f);
900
+ struct fann *f;
901
+ Data_Get_Struct(self, struct fann, f);
830
902
  fann_reset_MSE(f);
831
903
  return self;
832
904
  }
@@ -834,18 +906,18 @@ static VALUE reset_MSE(VALUE self)
834
906
  /** Get the type of network. Returns as ruby symbol (one of :shortcut, :layer)*/
835
907
  static VALUE get_network_type(VALUE self)
836
908
  {
837
- struct fann* f;
909
+ struct fann *f;
838
910
  enum fann_nettype_enum net_type;
839
911
  VALUE ret_val;
840
- Data_Get_Struct (self, struct fann, f);
912
+ Data_Get_Struct(self, struct fann, f);
841
913
 
842
914
  net_type = fann_get_network_type(f);
843
915
 
844
- if(net_type==FANN_NETTYPE_LAYER)
916
+ if (net_type == FANN_NETTYPE_LAYER)
845
917
  {
846
918
  ret_val = ID2SYM(rb_intern("layer")); // (rb_str_new2("FANN_NETTYPE_LAYER"));
847
919
  }
848
- else if(net_type==FANN_NETTYPE_SHORTCUT)
920
+ else if (net_type == FANN_NETTYPE_SHORTCUT)
849
921
  {
850
922
  ret_val = ID2SYM(rb_intern("shortcut")); // (rb_str_new2("FANN_NETTYPE_SHORTCUT"));
851
923
  }
@@ -890,19 +962,24 @@ static VALUE set_train_error_function(VALUE self, VALUE train_error_function)
890
962
  {
891
963
  Check_Type(train_error_function, T_SYMBOL);
892
964
 
893
- ID id=SYM2ID(train_error_function);
965
+ ID id = SYM2ID(train_error_function);
894
966
  enum fann_errorfunc_enum fann_train_error_function;
895
967
 
896
- if(id==rb_intern("linear")) {
968
+ if (id == rb_intern("linear"))
969
+ {
897
970
  fann_train_error_function = FANN_ERRORFUNC_LINEAR;
898
- } else if(id==rb_intern("tanh")) {
971
+ }
972
+ else if (id == rb_intern("tanh"))
973
+ {
899
974
  fann_train_error_function = FANN_ERRORFUNC_TANH;
900
- } else {
975
+ }
976
+ else
977
+ {
901
978
  rb_raise(rb_eRuntimeError, "Unrecognized train error function: [%s]", rb_id2name(SYM2ID(train_error_function)));
902
979
  }
903
980
 
904
- struct fann* f;
905
- Data_Get_Struct (self, struct fann, f);
981
+ struct fann *f;
982
+ Data_Get_Struct(self, struct fann, f);
906
983
  fann_set_train_error_function(f, fann_train_error_function);
907
984
  return self;
908
985
  }
@@ -911,14 +988,14 @@ static VALUE set_train_error_function(VALUE self, VALUE train_error_function)
911
988
  :linear, :tanh*/
912
989
  static VALUE get_train_error_function(VALUE self)
913
990
  {
914
- struct fann* f;
991
+ struct fann *f;
915
992
  enum fann_errorfunc_enum train_error;
916
993
  VALUE ret_val;
917
- Data_Get_Struct (self, struct fann, f);
994
+ Data_Get_Struct(self, struct fann, f);
918
995
 
919
996
  train_error = fann_get_train_error_function(f);
920
997
 
921
- if(train_error==FANN_ERRORFUNC_LINEAR)
998
+ if (train_error == FANN_ERRORFUNC_LINEAR)
922
999
  {
923
1000
  ret_val = ID2SYM(rb_intern("linear"));
924
1001
  }
@@ -937,23 +1014,32 @@ static VALUE set_training_algorithm(VALUE self, VALUE train_error_function)
937
1014
  {
938
1015
  Check_Type(train_error_function, T_SYMBOL);
939
1016
 
940
- ID id=SYM2ID(train_error_function);
1017
+ ID id = SYM2ID(train_error_function);
941
1018
  enum fann_train_enum fann_train_algorithm;
942
1019
 
943
- if(id==rb_intern("incremental")) {
1020
+ if (id == rb_intern("incremental"))
1021
+ {
944
1022
  fann_train_algorithm = FANN_TRAIN_INCREMENTAL;
945
- } else if(id==rb_intern("batch")) {
1023
+ }
1024
+ else if (id == rb_intern("batch"))
1025
+ {
946
1026
  fann_train_algorithm = FANN_TRAIN_BATCH;
947
- } else if(id==rb_intern("rprop")) {
1027
+ }
1028
+ else if (id == rb_intern("rprop"))
1029
+ {
948
1030
  fann_train_algorithm = FANN_TRAIN_RPROP;
949
- } else if(id==rb_intern("quickprop")) {
1031
+ }
1032
+ else if (id == rb_intern("quickprop"))
1033
+ {
950
1034
  fann_train_algorithm = FANN_TRAIN_QUICKPROP;
951
- } else {
1035
+ }
1036
+ else
1037
+ {
952
1038
  rb_raise(rb_eRuntimeError, "Unrecognized training algorithm function: [%s]", rb_id2name(SYM2ID(train_error_function)));
953
1039
  }
954
1040
 
955
- struct fann* f;
956
- Data_Get_Struct (self, struct fann, f);
1041
+ struct fann *f;
1042
+ Data_Get_Struct(self, struct fann, f);
957
1043
  fann_set_training_algorithm(f, fann_train_algorithm);
958
1044
  return self;
959
1045
  }
@@ -962,20 +1048,27 @@ static VALUE set_training_algorithm(VALUE self, VALUE train_error_function)
962
1048
  :incremental, :batch, :rprop, :quickprop */
963
1049
  static VALUE get_training_algorithm(VALUE self)
964
1050
  {
965
- struct fann* f;
1051
+ struct fann *f;
966
1052
  enum fann_train_enum fann_train_algorithm;
967
1053
  VALUE ret_val;
968
- Data_Get_Struct (self, struct fann, f);
1054
+ Data_Get_Struct(self, struct fann, f);
969
1055
 
970
1056
  fann_train_algorithm = fann_get_training_algorithm(f);
971
1057
 
972
- if(fann_train_algorithm==FANN_TRAIN_INCREMENTAL) {
1058
+ if (fann_train_algorithm == FANN_TRAIN_INCREMENTAL)
1059
+ {
973
1060
  ret_val = ID2SYM(rb_intern("incremental"));
974
- } else if(fann_train_algorithm==FANN_TRAIN_BATCH) {
1061
+ }
1062
+ else if (fann_train_algorithm == FANN_TRAIN_BATCH)
1063
+ {
975
1064
  ret_val = ID2SYM(rb_intern("batch"));
976
- } else if(fann_train_algorithm==FANN_TRAIN_RPROP) {
1065
+ }
1066
+ else if (fann_train_algorithm == FANN_TRAIN_RPROP)
1067
+ {
977
1068
  ret_val = ID2SYM(rb_intern("rprop"));
978
- } else if(fann_train_algorithm==FANN_TRAIN_QUICKPROP) {
1069
+ }
1070
+ else if (fann_train_algorithm == FANN_TRAIN_QUICKPROP)
1071
+ {
979
1072
  ret_val = ID2SYM(rb_intern("quickprop"));
980
1073
  }
981
1074
  return ret_val;
@@ -988,19 +1081,24 @@ static VALUE get_training_algorithm(VALUE self)
988
1081
  static VALUE set_train_stop_function(VALUE self, VALUE train_stop_function)
989
1082
  {
990
1083
  Check_Type(train_stop_function, T_SYMBOL);
991
- ID id=SYM2ID(train_stop_function);
1084
+ ID id = SYM2ID(train_stop_function);
992
1085
  enum fann_stopfunc_enum fann_train_stop_function;
993
1086
 
994
- if(id==rb_intern("mse")) {
1087
+ if (id == rb_intern("mse"))
1088
+ {
995
1089
  fann_train_stop_function = FANN_STOPFUNC_MSE;
996
- } else if(id==rb_intern("bit")) {
1090
+ }
1091
+ else if (id == rb_intern("bit"))
1092
+ {
997
1093
  fann_train_stop_function = FANN_STOPFUNC_BIT;
998
- } else {
1094
+ }
1095
+ else
1096
+ {
999
1097
  rb_raise(rb_eRuntimeError, "Unrecognized stop function: [%s]", rb_id2name(SYM2ID(train_stop_function)));
1000
1098
  }
1001
1099
 
1002
- struct fann* f;
1003
- Data_Get_Struct (self, struct fann, f);
1100
+ struct fann *f;
1101
+ Data_Get_Struct(self, struct fann, f);
1004
1102
  fann_set_train_stop_function(f, fann_train_stop_function);
1005
1103
  return self;
1006
1104
  }
@@ -1009,14 +1107,14 @@ static VALUE set_train_stop_function(VALUE self, VALUE train_stop_function)
1009
1107
  :mse, :bit */
1010
1108
  static VALUE get_train_stop_function(VALUE self)
1011
1109
  {
1012
- struct fann* f;
1110
+ struct fann *f;
1013
1111
  enum fann_stopfunc_enum train_stop;
1014
1112
  VALUE ret_val;
1015
- Data_Get_Struct (self, struct fann, f);
1113
+ Data_Get_Struct(self, struct fann, f);
1016
1114
 
1017
1115
  train_stop = fann_get_train_stop_function(f);
1018
1116
 
1019
- if(train_stop==FANN_STOPFUNC_MSE)
1117
+ if (train_stop == FANN_STOPFUNC_MSE)
1020
1118
  {
1021
1119
  ret_val = ID2SYM(rb_intern("mse")); // (rb_str_new2("FANN_NETTYPE_LAYER"));
1022
1120
  }
@@ -1027,13 +1125,12 @@ static VALUE get_train_stop_function(VALUE self)
1027
1125
  return ret_val;
1028
1126
  }
1029
1127
 
1030
-
1031
1128
  /** Will print the connections of the ann in a compact matrix,
1032
1129
  for easy viewing of the internals of the ann. */
1033
1130
  static VALUE print_connections(VALUE self)
1034
1131
  {
1035
- struct fann* f;
1036
- Data_Get_Struct (self, struct fann, f);
1132
+ struct fann *f;
1133
+ Data_Get_Struct(self, struct fann, f);
1037
1134
  fann_print_connections(f);
1038
1135
  return self;
1039
1136
  }
@@ -1041,8 +1138,8 @@ static VALUE print_connections(VALUE self)
1041
1138
  /** Print current NN parameters to stdout */
1042
1139
  static VALUE print_parameters(VALUE self)
1043
1140
  {
1044
- struct fann* f;
1045
- Data_Get_Struct (self, struct fann, f);
1141
+ struct fann *f;
1142
+ Data_Get_Struct(self, struct fann, f);
1046
1143
  fann_print_parameters(f);
1047
1144
  return Qnil;
1048
1145
  }
@@ -1054,8 +1151,8 @@ static VALUE randomize_weights(VALUE self, VALUE min_weight, VALUE max_weight)
1054
1151
  {
1055
1152
  Check_Type(min_weight, T_FLOAT);
1056
1153
  Check_Type(max_weight, T_FLOAT);
1057
- struct fann* f;
1058
- Data_Get_Struct (self, struct fann, f);
1154
+ struct fann *f;
1155
+ Data_Get_Struct(self, struct fann, f);
1059
1156
  fann_randomize_weights(f, NUM2DBL(min_weight), NUM2DBL(max_weight));
1060
1157
  return self;
1061
1158
  }
@@ -1064,37 +1161,36 @@ static VALUE randomize_weights(VALUE self, VALUE min_weight, VALUE max_weight)
1064
1161
 
1065
1162
  Run neural net on array<Float> of inputs with current parameters.
1066
1163
  Returns array<Float> as output */
1067
- static VALUE run (VALUE self, VALUE inputs)
1164
+ static VALUE run(VALUE self, VALUE inputs)
1068
1165
  {
1069
1166
  Check_Type(inputs, T_ARRAY);
1070
1167
 
1071
- struct fann* f;
1168
+ struct fann *f;
1072
1169
  unsigned int i;
1073
- fann_type* outputs;
1170
+ fann_type *outputs;
1074
1171
 
1075
1172
  // Convert inputs to type needed for NN:
1076
1173
  unsigned int len = RARRAY_LEN(inputs);
1077
1174
  fann_type fann_inputs[len];
1078
- for (i=0; i<len; i++)
1175
+ for (i = 0; i < len; i++)
1079
1176
  {
1080
1177
  fann_inputs[i] = NUM2DBL(RARRAY_PTR(inputs)[i]);
1081
1178
  }
1082
1179
 
1083
-
1084
1180
  // Obtain NN & run method:
1085
- Data_Get_Struct (self, struct fann, f);
1181
+ Data_Get_Struct(self, struct fann, f);
1086
1182
  outputs = fann_run(f, fann_inputs);
1087
1183
 
1088
1184
  // Create ruby array & set outputs:
1089
1185
  VALUE arr;
1090
1186
  arr = rb_ary_new();
1091
- unsigned int output_len=fann_get_num_output(f);
1092
- for (i=0; i<output_len; i++)
1187
+ unsigned int output_len = fann_get_num_output(f);
1188
+ for (i = 0; i < output_len; i++)
1093
1189
  {
1094
1190
  rb_ary_push(arr, rb_float_new(outputs[i]));
1095
1191
  }
1096
1192
 
1097
- return arr;
1193
+ return arr;
1098
1194
  }
1099
1195
 
1100
1196
  /** call-seq: init_weights(train_data) -> return value
@@ -1105,10 +1201,10 @@ static VALUE init_weights(VALUE self, VALUE train_data)
1105
1201
 
1106
1202
  Check_Type(train_data, T_DATA);
1107
1203
 
1108
- struct fann* f;
1109
- struct fann_train_data* t;
1110
- Data_Get_Struct (self, struct fann, f);
1111
- Data_Get_Struct (train_data, struct fann_train_data, t);
1204
+ struct fann *f;
1205
+ struct fann_train_data *t;
1206
+ Data_Get_Struct(self, struct fann, f);
1207
+ Data_Get_Struct(train_data, struct fann_train_data, t);
1112
1208
 
1113
1209
  fann_init_weights(f, t);
1114
1210
  return self;
@@ -1124,7 +1220,7 @@ static VALUE train(VALUE self, VALUE input, VALUE expected_output)
1124
1220
  Check_Type(input, T_ARRAY);
1125
1221
  Check_Type(expected_output, T_ARRAY);
1126
1222
 
1127
- struct fann* f;
1223
+ struct fann *f;
1128
1224
  Data_Get_Struct(self, struct fann, f);
1129
1225
 
1130
1226
  unsigned int num_input = RARRAY_LEN(input);
@@ -1134,11 +1230,13 @@ static VALUE train(VALUE self, VALUE input, VALUE expected_output)
1134
1230
 
1135
1231
  unsigned int i;
1136
1232
 
1137
- for (i = 0; i < num_input; i++) {
1233
+ for (i = 0; i < num_input; i++)
1234
+ {
1138
1235
  data_input[i] = NUM2DBL(RARRAY_PTR(input)[i]);
1139
1236
  }
1140
1237
 
1141
- for (i = 0; i < num_output; i++) {
1238
+ for (i = 0; i < num_output; i++)
1239
+ {
1142
1240
  data_output[i] = NUM2DBL(RARRAY_PTR(expected_output)[i]);
1143
1241
  }
1144
1242
 
@@ -1161,10 +1259,10 @@ static VALUE train_on_data(VALUE self, VALUE train_data, VALUE max_epochs, VALUE
1161
1259
  Check_Type(epochs_between_reports, T_FIXNUM);
1162
1260
  Check_Type(desired_error, T_FLOAT);
1163
1261
 
1164
- struct fann* f;
1165
- struct fann_train_data* t;
1166
- Data_Get_Struct (self, struct fann, f);
1167
- Data_Get_Struct (train_data, struct fann_train_data, t);
1262
+ struct fann *f;
1263
+ struct fann_train_data *t;
1264
+ Data_Get_Struct(self, struct fann, f);
1265
+ Data_Get_Struct(train_data, struct fann_train_data, t);
1168
1266
 
1169
1267
  unsigned int fann_max_epochs = NUM2INT(max_epochs);
1170
1268
  unsigned int fann_epochs_between_reports = NUM2INT(epochs_between_reports);
@@ -1179,10 +1277,10 @@ static VALUE train_on_data(VALUE self, VALUE train_data, VALUE max_epochs, VALUE
1179
1277
  static VALUE train_epoch(VALUE self, VALUE train_data)
1180
1278
  {
1181
1279
  Check_Type(train_data, T_DATA);
1182
- struct fann* f;
1183
- struct fann_train_data* t;
1184
- Data_Get_Struct (self, struct fann, f);
1185
- Data_Get_Struct (train_data, struct fann_train_data, t);
1280
+ struct fann *f;
1281
+ struct fann_train_data *t;
1282
+ Data_Get_Struct(self, struct fann, f);
1283
+ Data_Get_Struct(train_data, struct fann_train_data, t);
1186
1284
  return rb_float_new(fann_train_epoch(f, t));
1187
1285
  }
1188
1286
 
@@ -1192,10 +1290,10 @@ static VALUE train_epoch(VALUE self, VALUE train_data)
1192
1290
  static VALUE test_data(VALUE self, VALUE train_data)
1193
1291
  {
1194
1292
  Check_Type(train_data, T_DATA);
1195
- struct fann* f;
1196
- struct fann_train_data* t;
1197
- Data_Get_Struct (self, struct fann, f);
1198
- Data_Get_Struct (train_data, struct fann_train_data, t);
1293
+ struct fann *f;
1294
+ struct fann_train_data *t;
1295
+ Data_Get_Struct(self, struct fann, f);
1296
+ Data_Get_Struct(train_data, struct fann_train_data, t);
1199
1297
  return rb_float_new(fann_test_data(f, t));
1200
1298
  }
1201
1299
 
@@ -1232,10 +1330,10 @@ static VALUE cascadetrain_on_data(VALUE self, VALUE train_data, VALUE max_neuron
1232
1330
  Check_Type(neurons_between_reports, T_FIXNUM);
1233
1331
  Check_Type(desired_error, T_FLOAT);
1234
1332
 
1235
- struct fann* f;
1236
- struct fann_train_data* t;
1237
- Data_Get_Struct (self, struct fann, f);
1238
- Data_Get_Struct (train_data, struct fann_train_data, t);
1333
+ struct fann *f;
1334
+ struct fann_train_data *t;
1335
+ Data_Get_Struct(self, struct fann, f);
1336
+ Data_Get_Struct(train_data, struct fann_train_data, t);
1239
1337
 
1240
1338
  unsigned int fann_max_neurons = NUM2INT(max_neurons);
1241
1339
  unsigned int fann_neurons_between_reports = NUM2INT(neurons_between_reports);
@@ -1305,7 +1403,6 @@ static VALUE set_cascade_candidate_stagnation_epochs(VALUE self, VALUE cascade_c
1305
1403
  SET_FANN_UINT(cascade_candidate_stagnation_epochs, fann_set_cascade_candidate_stagnation_epochs);
1306
1404
  }
1307
1405
 
1308
-
1309
1406
  /** The weight multiplier is a parameter which is used to multiply the weights from the candidate neuron
1310
1407
  before adding the neuron to the neural network. This parameter is usually between 0 and 1, and is used
1311
1408
  to make the training a bit less aggressive. */
@@ -1426,13 +1523,13 @@ static VALUE set_learning_momentum(VALUE self, VALUE learning_momentum)
1426
1523
  static VALUE set_cascade_activation_functions(VALUE self, VALUE cascade_activation_functions)
1427
1524
  {
1428
1525
  Check_Type(cascade_activation_functions, T_ARRAY);
1429
- struct fann* f;
1430
- Data_Get_Struct (self, struct fann, f);
1526
+ struct fann *f;
1527
+ Data_Get_Struct(self, struct fann, f);
1431
1528
 
1432
1529
  unsigned long cnt = RARRAY_LEN(cascade_activation_functions);
1433
1530
  enum fann_activationfunc_enum fann_activation_functions[cnt];
1434
1531
  unsigned int i;
1435
- for (i=0; i<cnt; i++)
1532
+ for (i = 0; i < cnt; i++)
1436
1533
  {
1437
1534
  fann_activation_functions[i] = sym_to_activation_function(RARRAY_PTR(cascade_activation_functions)[i]);
1438
1535
  }
@@ -1445,16 +1542,16 @@ static VALUE set_cascade_activation_functions(VALUE self, VALUE cascade_activati
1445
1542
  the candidates. The default is [:sigmoid, :sigmoid_symmetric, :gaussian, :gaussian_symmetric, :elliot, :elliot_symmetric] */
1446
1543
  static VALUE get_cascade_activation_functions(VALUE self)
1447
1544
  {
1448
- struct fann* f;
1449
- Data_Get_Struct (self, struct fann, f);
1545
+ struct fann *f;
1546
+ Data_Get_Struct(self, struct fann, f);
1450
1547
  unsigned int cnt = fann_get_cascade_activation_functions_count(f);
1451
- enum fann_activationfunc_enum* fann_functions = fann_get_cascade_activation_functions(f);
1548
+ enum fann_activationfunc_enum *fann_functions = fann_get_cascade_activation_functions(f);
1452
1549
 
1453
1550
  // Create ruby array & set outputs:
1454
1551
  VALUE arr;
1455
1552
  arr = rb_ary_new();
1456
1553
  unsigned int i;
1457
- for (i=0; i<cnt; i++)
1554
+ for (i = 0; i < cnt; i++)
1458
1555
  {
1459
1556
  rb_ary_push(arr, activation_function_to_sym(fann_functions[i]));
1460
1557
  }
@@ -1490,13 +1587,13 @@ static VALUE set_cascade_num_candidate_groups(VALUE self, VALUE cascade_num_cand
1490
1587
  static VALUE set_cascade_activation_steepnesses(VALUE self, VALUE cascade_activation_steepnesses)
1491
1588
  {
1492
1589
  Check_Type(cascade_activation_steepnesses, T_ARRAY);
1493
- struct fann* f;
1494
- Data_Get_Struct (self, struct fann, f);
1590
+ struct fann *f;
1591
+ Data_Get_Struct(self, struct fann, f);
1495
1592
 
1496
1593
  unsigned int cnt = RARRAY_LEN(cascade_activation_steepnesses);
1497
1594
  fann_type fann_activation_steepnesses[cnt];
1498
1595
  unsigned int i;
1499
- for (i=0; i<cnt; i++)
1596
+ for (i = 0; i < cnt; i++)
1500
1597
  {
1501
1598
  fann_activation_steepnesses[i] = NUM2DBL(RARRAY_PTR(cascade_activation_steepnesses)[i]);
1502
1599
  }
@@ -1509,16 +1606,16 @@ static VALUE set_cascade_activation_steepnesses(VALUE self, VALUE cascade_activa
1509
1606
  the candidates. */
1510
1607
  static VALUE get_cascade_activation_steepnesses(VALUE self)
1511
1608
  {
1512
- struct fann* f;
1513
- Data_Get_Struct (self, struct fann, f);
1514
- fann_type* fann_steepnesses = fann_get_cascade_activation_steepnesses(f);
1609
+ struct fann *f;
1610
+ Data_Get_Struct(self, struct fann, f);
1611
+ fann_type *fann_steepnesses = fann_get_cascade_activation_steepnesses(f);
1515
1612
  unsigned int cnt = fann_get_cascade_activation_steepnesses_count(f);
1516
1613
 
1517
1614
  // Create ruby array & set outputs:
1518
1615
  VALUE arr;
1519
1616
  arr = rb_ary_new();
1520
1617
  unsigned int i;
1521
- for (i=0; i<cnt; i++)
1618
+ for (i = 0; i < cnt; i++)
1522
1619
  {
1523
1620
  rb_ary_push(arr, rb_float_new(fann_steepnesses[i]));
1524
1621
  }
@@ -1531,21 +1628,21 @@ static VALUE get_cascade_activation_steepnesses(VALUE self)
1531
1628
  Save the entire network to configuration file with given name */
1532
1629
  static VALUE nn_save(VALUE self, VALUE filename)
1533
1630
  {
1534
- struct fann* f;
1535
- Data_Get_Struct (self, struct fann, f);
1631
+ struct fann *f;
1632
+ Data_Get_Struct(self, struct fann, f);
1536
1633
  int status = fann_save(f, StringValuePtr(filename));
1537
1634
  return INT2NUM(status);
1538
1635
  }
1539
1636
 
1540
1637
  /** Initializes class under RubyFann module/namespace. */
1541
- void Init_ruby_fann ()
1638
+ void Init_ruby_fann()
1542
1639
  {
1543
1640
  // RubyFann module/namespace:
1544
- m_rb_fann_module = rb_define_module ("RubyFann");
1641
+ m_rb_fann_module = rb_define_module("RubyFann");
1545
1642
 
1546
1643
  // Standard NN class:
1547
- m_rb_fann_standard_class = rb_define_class_under (m_rb_fann_module, "Standard", rb_cObject);
1548
- rb_define_alloc_func (m_rb_fann_standard_class, fann_allocate);
1644
+ m_rb_fann_standard_class = rb_define_class_under(m_rb_fann_module, "Standard", rb_cObject);
1645
+ rb_define_alloc_func(m_rb_fann_standard_class, fann_allocate);
1549
1646
  rb_define_method(m_rb_fann_standard_class, "initialize", fann_initialize, 1);
1550
1647
  rb_define_method(m_rb_fann_standard_class, "init_weights", init_weights, 1);
1551
1648
  rb_define_method(m_rb_fann_standard_class, "set_activation_function", set_activation_function, 3);
@@ -1608,7 +1705,6 @@ void Init_ruby_fann ()
1608
1705
  rb_define_method(m_rb_fann_standard_class, "get_training_algorithm", get_training_algorithm, 0);
1609
1706
  rb_define_method(m_rb_fann_standard_class, "set_training_algorithm", set_training_algorithm, 1);
1610
1707
 
1611
-
1612
1708
  // Cascade functions:
1613
1709
  rb_define_method(m_rb_fann_standard_class, "cascadetrain_on_data", cascadetrain_on_data, 4);
1614
1710
  rb_define_method(m_rb_fann_standard_class, "get_cascade_output_change_fraction", get_cascade_output_change_fraction, 0);
@@ -1638,14 +1734,13 @@ void Init_ruby_fann ()
1638
1734
  rb_define_method(m_rb_fann_standard_class, "set_cascade_num_candidate_groups", set_cascade_num_candidate_groups, 1);
1639
1735
  rb_define_method(m_rb_fann_standard_class, "save", nn_save, 1);
1640
1736
 
1641
-
1642
1737
  // Uncomment for fixed-point mode (also recompile fann). Probably not going to be needed:
1643
- //rb_define_method(clazz, "get_decimal_point", get_decimal_point, 0);
1644
- //rb_define_method(clazz, "get_multiplier", get_multiplier, 0);
1738
+ // rb_define_method(clazz, "get_decimal_point", get_decimal_point, 0);
1739
+ // rb_define_method(clazz, "get_multiplier", get_multiplier, 0);
1645
1740
 
1646
1741
  // Shortcut NN class (duplicated from above so that rdoc generation tools can find the methods:):
1647
- m_rb_fann_shortcut_class = rb_define_class_under (m_rb_fann_module, "Shortcut", rb_cObject);
1648
- rb_define_alloc_func (m_rb_fann_shortcut_class, fann_allocate);
1742
+ m_rb_fann_shortcut_class = rb_define_class_under(m_rb_fann_module, "Shortcut", rb_cObject);
1743
+ rb_define_alloc_func(m_rb_fann_shortcut_class, fann_allocate);
1649
1744
  rb_define_method(m_rb_fann_shortcut_class, "initialize", fann_initialize, 1);
1650
1745
  rb_define_method(m_rb_fann_shortcut_class, "init_weights", init_weights, 1);
1651
1746
  rb_define_method(m_rb_fann_shortcut_class, "set_activation_function", set_activation_function, 3);
@@ -1737,10 +1832,9 @@ void Init_ruby_fann ()
1737
1832
  rb_define_method(m_rb_fann_shortcut_class, "set_cascade_num_candidate_groups", set_cascade_num_candidate_groups, 1);
1738
1833
  rb_define_method(m_rb_fann_shortcut_class, "save", nn_save, 1);
1739
1834
 
1740
-
1741
1835
  // TrainData NN class:
1742
- m_rb_fann_train_data_class = rb_define_class_under (m_rb_fann_module, "TrainData", rb_cObject);
1743
- rb_define_alloc_func (m_rb_fann_train_data_class, fann_training_data_allocate);
1836
+ m_rb_fann_train_data_class = rb_define_class_under(m_rb_fann_module, "TrainData", rb_cObject);
1837
+ rb_define_alloc_func(m_rb_fann_train_data_class, fann_training_data_allocate);
1744
1838
  rb_define_method(m_rb_fann_train_data_class, "initialize", fann_train_data_initialize, 1);
1745
1839
  rb_define_method(m_rb_fann_train_data_class, "length", length_train_data, 0);
1746
1840
  rb_define_method(m_rb_fann_train_data_class, "shuffle", shuffle, 0);