ruby-fann 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,4 @@
1
1
  #include "ruby.h"
2
- // #include "fann.h"
3
2
  #include "doublefann.h"
4
3
  #include "fann_data.h"
5
4
  #include "fann_augment.h"
@@ -44,6 +43,7 @@ Check_Type(attr_name, T_FLOAT); \
44
43
  struct fann* f; \
45
44
  Data_Get_Struct(self, struct fann, f); \
46
45
  fann_fn(f, NUM2DBL(attr_name)); \
46
+ return self;
47
47
 
48
48
  #define RETURN_FANN_DBL(fn) \
49
49
  struct fann* f; \
@@ -55,95 +55,95 @@ return rb_float_new(fn(f));
55
55
  // Convert ruby symbol to corresponding FANN enum type for activation function:
56
56
  enum fann_activationfunc_enum sym_to_activation_function(VALUE activation_func)
57
57
  {
58
- ID id=SYM2ID(activation_func);
59
- enum fann_activationfunc_enum activation_function;
60
- if(id==rb_intern("linear")) {
61
- activation_function = FANN_LINEAR;
62
- } else if(id==rb_intern("threshold")) {
63
- activation_function = FANN_THRESHOLD;
64
- } else if(id==rb_intern("threshold_symmetric")) {
65
- activation_function = FANN_THRESHOLD_SYMMETRIC;
66
- } else if(id==rb_intern("sigmoid")) {
67
- activation_function = FANN_SIGMOID;
68
- } else if(id==rb_intern("sigmoid_stepwise")) {
69
- activation_function = FANN_SIGMOID_STEPWISE;
70
- } else if(id==rb_intern("sigmoid_symmetric")) {
71
- activation_function = FANN_SIGMOID_SYMMETRIC;
72
- } else if(id==rb_intern("sigmoid_symmetric_stepwise")) {
73
- activation_function = FANN_SIGMOID_SYMMETRIC_STEPWISE;
74
- } else if(id==rb_intern("gaussian")) {
75
- activation_function = FANN_GAUSSIAN;
76
- } else if(id==rb_intern("gaussian_symmetric")) {
77
- activation_function = FANN_GAUSSIAN_SYMMETRIC;
78
- } else if(id==rb_intern("gaussian_stepwise")) {
79
- activation_function = FANN_GAUSSIAN_STEPWISE;
80
- } else if(id==rb_intern("elliot")) {
81
- activation_function = FANN_ELLIOT;
82
- } else if(id==rb_intern("elliot_symmetric")) {
83
- activation_function = FANN_ELLIOT_SYMMETRIC;
84
- } else if(id==rb_intern("linear_piece")) {
85
- activation_function = FANN_LINEAR_PIECE;
86
- } else if(id==rb_intern("linear_piece_symmetric")) {
87
- activation_function = FANN_LINEAR_PIECE_SYMMETRIC;
88
- } else if(id==rb_intern("sin_symmetric")) {
89
- activation_function = FANN_SIN_SYMMETRIC;
90
- } else if(id==rb_intern("cos_symmetric")) {
91
- activation_function = FANN_COS_SYMMETRIC;
92
- } else if(id==rb_intern("sin")) {
93
- activation_function = FANN_SIN;
94
- } else if(id==rb_intern("cos")) {
95
- activation_function = FANN_COS;
96
- } else {
97
- rb_raise(rb_eRuntimeError, "Unrecognized activation function: [%s]", rb_id2name(SYM2ID(activation_func)));
98
- }
99
- return activation_function;
58
+ ID id=SYM2ID(activation_func);
59
+ enum fann_activationfunc_enum activation_function;
60
+ if(id==rb_intern("linear")) {
61
+ activation_function = FANN_LINEAR;
62
+ } else if(id==rb_intern("threshold")) {
63
+ activation_function = FANN_THRESHOLD;
64
+ } else if(id==rb_intern("threshold_symmetric")) {
65
+ activation_function = FANN_THRESHOLD_SYMMETRIC;
66
+ } else if(id==rb_intern("sigmoid")) {
67
+ activation_function = FANN_SIGMOID;
68
+ } else if(id==rb_intern("sigmoid_stepwise")) {
69
+ activation_function = FANN_SIGMOID_STEPWISE;
70
+ } else if(id==rb_intern("sigmoid_symmetric")) {
71
+ activation_function = FANN_SIGMOID_SYMMETRIC;
72
+ } else if(id==rb_intern("sigmoid_symmetric_stepwise")) {
73
+ activation_function = FANN_SIGMOID_SYMMETRIC_STEPWISE;
74
+ } else if(id==rb_intern("gaussian")) {
75
+ activation_function = FANN_GAUSSIAN;
76
+ } else if(id==rb_intern("gaussian_symmetric")) {
77
+ activation_function = FANN_GAUSSIAN_SYMMETRIC;
78
+ } else if(id==rb_intern("gaussian_stepwise")) {
79
+ activation_function = FANN_GAUSSIAN_STEPWISE;
80
+ } else if(id==rb_intern("elliot")) {
81
+ activation_function = FANN_ELLIOT;
82
+ } else if(id==rb_intern("elliot_symmetric")) {
83
+ activation_function = FANN_ELLIOT_SYMMETRIC;
84
+ } else if(id==rb_intern("linear_piece")) {
85
+ activation_function = FANN_LINEAR_PIECE;
86
+ } else if(id==rb_intern("linear_piece_symmetric")) {
87
+ activation_function = FANN_LINEAR_PIECE_SYMMETRIC;
88
+ } else if(id==rb_intern("sin_symmetric")) {
89
+ activation_function = FANN_SIN_SYMMETRIC;
90
+ } else if(id==rb_intern("cos_symmetric")) {
91
+ activation_function = FANN_COS_SYMMETRIC;
92
+ } else if(id==rb_intern("sin")) {
93
+ activation_function = FANN_SIN;
94
+ } else if(id==rb_intern("cos")) {
95
+ activation_function = FANN_COS;
96
+ } else {
97
+ rb_raise(rb_eRuntimeError, "Unrecognized activation function: [%s]", rb_id2name(SYM2ID(activation_func)));
98
+ }
99
+ return activation_function;
100
100
  }
101
101
 
102
102
  // Convert FANN enum type for activation function to corresponding ruby symbol:
103
103
  VALUE activation_function_to_sym(enum fann_activationfunc_enum fn)
104
104
  {
105
- VALUE activation_function;
106
-
107
- if(fn==FANN_LINEAR) {
108
- activation_function = ID2SYM(rb_intern("linear"));
109
- } else if(fn==FANN_THRESHOLD) {
110
- activation_function = ID2SYM(rb_intern("threshold"));
111
- } else if(fn==FANN_THRESHOLD_SYMMETRIC) {
112
- activation_function = ID2SYM(rb_intern("threshold_symmetric"));
113
- } else if(fn==FANN_SIGMOID) {
114
- activation_function = ID2SYM(rb_intern("sigmoid"));
115
- } else if(fn==FANN_SIGMOID_STEPWISE) {
116
- activation_function = ID2SYM(rb_intern("sigmoid_stepwise"));
117
- } else if(fn==FANN_SIGMOID_SYMMETRIC) {
118
- activation_function = ID2SYM(rb_intern("sigmoid_symmetric"));
119
- } else if(fn==FANN_SIGMOID_SYMMETRIC_STEPWISE) {
120
- activation_function = ID2SYM(rb_intern("sigmoid_symmetric_stepwise"));
121
- } else if(fn==FANN_GAUSSIAN) {
122
- activation_function = ID2SYM(rb_intern("gaussian"));
123
- } else if(fn==FANN_GAUSSIAN_SYMMETRIC) {
124
- activation_function = ID2SYM(rb_intern("gaussian_symmetric"));
125
- } else if(fn==FANN_GAUSSIAN_STEPWISE) {
126
- activation_function = ID2SYM(rb_intern("gaussian_stepwise"));
127
- } else if(fn==FANN_ELLIOT) {
128
- activation_function = ID2SYM(rb_intern("elliot"));
129
- } else if(fn==FANN_ELLIOT_SYMMETRIC) {
130
- activation_function = ID2SYM(rb_intern("elliot_symmetric"));
131
- } else if(fn==FANN_LINEAR_PIECE) {
132
- activation_function = ID2SYM(rb_intern("linear_piece"));
133
- } else if(fn==FANN_LINEAR_PIECE_SYMMETRIC) {
134
- activation_function = ID2SYM(rb_intern("linear_piece_symmetric"));
135
- } else if(fn==FANN_SIN_SYMMETRIC) {
136
- activation_function = ID2SYM(rb_intern("sin_symmetric"));
137
- } else if(fn==FANN_COS_SYMMETRIC) {
138
- activation_function = ID2SYM(rb_intern("cos_symmetric"));
139
- } else if(fn==FANN_SIN) {
140
- activation_function = ID2SYM(rb_intern("sin"));
141
- } else if(fn==FANN_COS) {
142
- activation_function = ID2SYM(rb_intern("cos"));
143
- } else {
144
- rb_raise(rb_eRuntimeError, "Unrecognized activation function: [%d]", fn);
145
- }
146
- return activation_function;
105
+ VALUE activation_function;
106
+
107
+ if(fn==FANN_LINEAR) {
108
+ activation_function = ID2SYM(rb_intern("linear"));
109
+ } else if(fn==FANN_THRESHOLD) {
110
+ activation_function = ID2SYM(rb_intern("threshold"));
111
+ } else if(fn==FANN_THRESHOLD_SYMMETRIC) {
112
+ activation_function = ID2SYM(rb_intern("threshold_symmetric"));
113
+ } else if(fn==FANN_SIGMOID) {
114
+ activation_function = ID2SYM(rb_intern("sigmoid"));
115
+ } else if(fn==FANN_SIGMOID_STEPWISE) {
116
+ activation_function = ID2SYM(rb_intern("sigmoid_stepwise"));
117
+ } else if(fn==FANN_SIGMOID_SYMMETRIC) {
118
+ activation_function = ID2SYM(rb_intern("sigmoid_symmetric"));
119
+ } else if(fn==FANN_SIGMOID_SYMMETRIC_STEPWISE) {
120
+ activation_function = ID2SYM(rb_intern("sigmoid_symmetric_stepwise"));
121
+ } else if(fn==FANN_GAUSSIAN) {
122
+ activation_function = ID2SYM(rb_intern("gaussian"));
123
+ } else if(fn==FANN_GAUSSIAN_SYMMETRIC) {
124
+ activation_function = ID2SYM(rb_intern("gaussian_symmetric"));
125
+ } else if(fn==FANN_GAUSSIAN_STEPWISE) {
126
+ activation_function = ID2SYM(rb_intern("gaussian_stepwise"));
127
+ } else if(fn==FANN_ELLIOT) {
128
+ activation_function = ID2SYM(rb_intern("elliot"));
129
+ } else if(fn==FANN_ELLIOT_SYMMETRIC) {
130
+ activation_function = ID2SYM(rb_intern("elliot_symmetric"));
131
+ } else if(fn==FANN_LINEAR_PIECE) {
132
+ activation_function = ID2SYM(rb_intern("linear_piece"));
133
+ } else if(fn==FANN_LINEAR_PIECE_SYMMETRIC) {
134
+ activation_function = ID2SYM(rb_intern("linear_piece_symmetric"));
135
+ } else if(fn==FANN_SIN_SYMMETRIC) {
136
+ activation_function = ID2SYM(rb_intern("sin_symmetric"));
137
+ } else if(fn==FANN_COS_SYMMETRIC) {
138
+ activation_function = ID2SYM(rb_intern("cos_symmetric"));
139
+ } else if(fn==FANN_SIN) {
140
+ activation_function = ID2SYM(rb_intern("sin"));
141
+ } else if(fn==FANN_COS) {
142
+ activation_function = ID2SYM(rb_intern("cos"));
143
+ } else {
144
+ rb_raise(rb_eRuntimeError, "Unrecognized activation function: [%d]", fn);
145
+ }
146
+ return activation_function;
147
147
  }
148
148
 
149
149
 
@@ -156,28 +156,28 @@ static void fann_mark (struct fann* ann){}
156
156
  static void fann_free (struct fann* ann)
157
157
  {
158
158
  fann_destroy(ann);
159
- // ("Destroyed FANN network [%d].\n", ann);
159
+ // ("Destroyed FANN network [%d].\n", ann);
160
160
  }
161
161
 
162
162
  // Free memory associated with FANN Training data:
163
163
  static void fann_training_data_free (struct fann_train_data* train_data)
164
164
  {
165
165
  fann_destroy_train(train_data);
166
- // printf("Destroyed Training data [%d].\n", train_data);
166
+ // printf("Destroyed Training data [%d].\n", train_data);
167
167
  }
168
168
 
169
169
  // Create wrapper, but don't allocate anything...do that in
170
170
  // initialize, so we can construct with args:
171
171
  static VALUE fann_allocate (VALUE klass)
172
172
  {
173
- return Data_Wrap_Struct (klass, fann_mark, fann_free, 0);
173
+ return Data_Wrap_Struct (klass, fann_mark, fann_free, 0);
174
174
  }
175
175
 
176
176
  // Create wrapper, but don't allocate annything...do that in
177
177
  // initialize, so we can construct with args:
178
178
  static VALUE fann_training_data_allocate (VALUE klass)
179
179
  {
180
- return Data_Wrap_Struct (klass, fann_mark, fann_training_data_free, 0);
180
+ return Data_Wrap_Struct (klass, fann_mark, fann_training_data_free, 0);
181
181
  }
182
182
 
183
183
 
@@ -194,34 +194,34 @@ static int FANN_API fann_training_callback(struct fann *ann, struct fann_train_d
194
194
  unsigned int max_epochs, unsigned int epochs_between_reports,
195
195
  float desired_error, unsigned int epochs)
196
196
  {
197
- VALUE self = (VALUE)fann_get_user_data(ann);
197
+ VALUE self = (VALUE)fann_get_user_data(ann);
198
198
  VALUE args = rb_hash_new();
199
-
200
- // Set attributes on hash & push on array:
201
- VALUE max_epochs_sym = ID2SYM(rb_intern("max_epochs"));
202
- VALUE epochs_between_reports_sym = ID2SYM(rb_intern("epochs_between_reports"));
203
- VALUE desired_error_sym = ID2SYM(rb_intern("desired_error"));
204
- VALUE epochs_sym = ID2SYM(rb_intern("epochs"));
205
-
206
- rb_hash_aset(args, max_epochs_sym, INT2NUM(max_epochs));
207
- rb_hash_aset(args, epochs_between_reports_sym, INT2NUM(epochs_between_reports));
208
- rb_hash_aset(args, desired_error_sym, rb_float_new(desired_error));
209
- rb_hash_aset(args, epochs_sym, INT2NUM(epochs));
199
+
200
+ // Set attributes on hash & push on array:
201
+ VALUE max_epochs_sym = ID2SYM(rb_intern("max_epochs"));
202
+ VALUE epochs_between_reports_sym = ID2SYM(rb_intern("epochs_between_reports"));
203
+ VALUE desired_error_sym = ID2SYM(rb_intern("desired_error"));
204
+ VALUE epochs_sym = ID2SYM(rb_intern("epochs"));
205
+
206
+ rb_hash_aset(args, max_epochs_sym, INT2NUM(max_epochs));
207
+ rb_hash_aset(args, epochs_between_reports_sym, INT2NUM(epochs_between_reports));
208
+ rb_hash_aset(args, desired_error_sym, rb_float_new(desired_error));
209
+ rb_hash_aset(args, epochs_sym, INT2NUM(epochs));
210
210
 
211
- VALUE callback = rb_funcall(self, rb_intern("training_callback"), 1, args);
211
+ VALUE callback = rb_funcall(self, rb_intern("training_callback"), 1, args);
212
212
 
213
- if (TYPE(callback)!=T_FIXNUM)
214
- {
215
- rb_raise (rb_eRuntimeError, "Callback method must return an integer (-1 to stop training).");
216
- }
217
-
218
- int status = NUM2INT(callback);
219
- if (status==-1)
220
- {
221
- printf("Callback method returned -1; training will stop.\n");
222
- }
223
-
224
- return status;
213
+ if (TYPE(callback)!=T_FIXNUM)
214
+ {
215
+ rb_raise (rb_eRuntimeError, "Callback method must return an integer (-1 to stop training).");
216
+ }
217
+
218
+ int status = NUM2INT(callback);
219
+ if (status==-1)
220
+ {
221
+ printf("Callback method returned -1; training will stop.\n");
222
+ }
223
+
224
+ return status;
225
225
  }
226
226
 
227
227
  /** call-seq: new(hash) -> new ruby-fann neural network object
@@ -230,10 +230,10 @@ static int FANN_API fann_training_callback(struct fann *ann, struct fann_train_d
230
230
 
231
231
  Standard Initialization:
232
232
  RubyFann::Standard.new(:num_inputs=>1, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1)
233
-
233
+
234
234
  Shortcut Initialization (e.g., for use in cascade training):
235
235
  RubyFann::Shortcut.new(:num_inputs=>5, :num_outputs=>1)
236
-
236
+
237
237
  File Initialization
238
238
  RubyFann::Standard.new(:filename=>'xor_float.net')
239
239
 
@@ -242,76 +242,74 @@ static int FANN_API fann_training_callback(struct fann *ann, struct fann_train_d
242
242
  */
243
243
  static VALUE fann_initialize(VALUE self, VALUE hash)
244
244
  {
245
- // Get args:
246
- VALUE filename = rb_hash_aref(hash, ID2SYM(rb_intern("filename")));
247
- VALUE num_inputs = rb_hash_aref(hash, ID2SYM(rb_intern("num_inputs")));
248
- VALUE num_outputs = rb_hash_aref(hash, ID2SYM(rb_intern("num_outputs")));
249
- VALUE hidden_neurons = rb_hash_aref(hash, ID2SYM(rb_intern("hidden_neurons")));
245
+ // Get args:
246
+ VALUE filename = rb_hash_aref(hash, ID2SYM(rb_intern("filename")));
247
+ VALUE num_inputs = rb_hash_aref(hash, ID2SYM(rb_intern("num_inputs")));
248
+ VALUE num_outputs = rb_hash_aref(hash, ID2SYM(rb_intern("num_outputs")));
249
+ VALUE hidden_neurons = rb_hash_aref(hash, ID2SYM(rb_intern("hidden_neurons")));
250
250
  // printf("initializing\n\n\n");
251
- struct fann* ann;
252
- if (TYPE(filename)==T_STRING)
253
- {
254
- // Initialize with file:
255
- // train_data = fann_read_train_from_file(StringValuePtr(filename));
256
- // DATA_PTR(self) = train_data;
257
- ann = fann_create_from_file(StringValuePtr(filename));
258
- // printf("Created RubyFann::Standard [%d] from file [%s].\n", ann, StringValuePtr(filename));
259
- }
260
- else if(rb_obj_is_kind_of(self, m_rb_fann_shortcut_class))
261
- {
262
- // Initialize as shortcut, suitable for cascade training:
263
- //ann = fann_create_shortcut_array(num_layers, layers);
264
- Check_Type(num_inputs, T_FIXNUM);
265
- Check_Type(num_outputs, T_FIXNUM);
266
-
267
- ann = fann_create_shortcut(2, NUM2INT(num_inputs), NUM2INT(num_outputs));
268
- // printf("Created RubyFann::Shortcut [%d].\n", ann);
269
- }
270
- else
271
- {
272
- // Initialize as standard:
273
- Check_Type(num_inputs, T_FIXNUM);
274
- Check_Type(hidden_neurons, T_ARRAY);
275
- Check_Type(num_outputs, T_FIXNUM);
276
-
277
- // Initialize layers:
278
- unsigned int num_layers=RARRAY(hidden_neurons)->len + 2; // NUM2INT(num_inputs) + NUM2INT(num_outputs) + RARRAY(hidden_neurons)->len;
279
- unsigned int layers[num_layers];
280
-
281
- // Input:
282
- layers[0]=NUM2INT(num_inputs);
283
- // Output:
284
- layers[num_layers-1]=NUM2INT(num_outputs);
285
- // Hidden:
286
- int i;
287
- for (i=1; i<=num_layers-2; i++) {
288
- layers[i]=NUM2UINT(RARRAY(hidden_neurons)->ptr[i-1]);
289
- }
290
-
291
- ann = fann_create_standard_array(num_layers, layers);
292
- // printf("Created RubyFann::Standard [%d].\n", ann);
293
- }
294
-
295
- DATA_PTR(self) = ann;
296
-
297
- // printf("Checking for callback...");
298
-
299
- //int callback = rb_protect(invoke_training_callback, (self), &status);
300
- // VALUE callback = rb_funcall(DATA_PTR(self), "training_callback", 0);
301
- if(rb_respond_to(self, rb_intern("training_callback")))
302
- {
303
- fann_set_callback(ann, &fann_training_callback);
304
- fann_set_user_data(ann, self);
305
- // printf("found(%d).\n", ann->callback);
306
- }
307
- else
308
- {
309
- // printf("none found.\n");
310
- }
251
+ struct fann* ann;
252
+ if (TYPE(filename)==T_STRING)
253
+ {
254
+ // Initialize with file:
255
+ // train_data = fann_read_train_from_file(StringValuePtr(filename));
256
+ // DATA_PTR(self) = train_data;
257
+ ann = fann_create_from_file(StringValuePtr(filename));
258
+ // printf("Created RubyFann::Standard [%d] from file [%s].\n", ann, StringValuePtr(filename));
259
+ }
260
+ else if(rb_obj_is_kind_of(self, m_rb_fann_shortcut_class))
261
+ {
262
+ // Initialize as shortcut, suitable for cascade training:
263
+ //ann = fann_create_shortcut_array(num_layers, layers);
264
+ Check_Type(num_inputs, T_FIXNUM);
265
+ Check_Type(num_outputs, T_FIXNUM);
266
+
267
+ ann = fann_create_shortcut(2, NUM2INT(num_inputs), NUM2INT(num_outputs));
268
+ // printf("Created RubyFann::Shortcut [%d].\n", ann);
269
+ }
270
+ else
271
+ {
272
+ // Initialize as standard:
273
+ Check_Type(num_inputs, T_FIXNUM);
274
+ Check_Type(hidden_neurons, T_ARRAY);
275
+ Check_Type(num_outputs, T_FIXNUM);
276
+
277
+ // Initialize layers:
278
+ unsigned int num_layers=RARRAY(hidden_neurons)->len + 2; // NUM2INT(num_inputs) + NUM2INT(num_outputs) + RARRAY(hidden_neurons)->len;
279
+ unsigned int layers[num_layers];
280
+
281
+ // Input:
282
+ layers[0]=NUM2INT(num_inputs);
283
+ // Output:
284
+ layers[num_layers-1]=NUM2INT(num_outputs);
285
+ // Hidden:
286
+ int i;
287
+ for (i=1; i<=num_layers-2; i++) {
288
+ layers[i]=NUM2UINT(RARRAY(hidden_neurons)->ptr[i-1]);
289
+ }
290
+
291
+ ann = fann_create_standard_array(num_layers, layers);
292
+ // printf("Created RubyFann::Standard [%d].\n", ann);
293
+ }
294
+
295
+ DATA_PTR(self) = ann;
296
+
297
+ // printf("Checking for callback...");
298
+
299
+ //int callback = rb_protect(invoke_training_callback, (self), &status);
300
+ // VALUE callback = rb_funcall(DATA_PTR(self), "training_callback", 0);
301
+ if(rb_respond_to(self, rb_intern("training_callback")))
302
+ {
303
+ fann_set_callback(ann, &fann_training_callback);
304
+ fann_set_user_data(ann, self);
305
+ // printf("found(%d).\n", ann->callback);
306
+ }
307
+ else
308
+ {
309
+ // printf("none found.\n");
310
+ }
311
311
 
312
-
313
- //DATA_PTR(self) = ann;
314
- return (VALUE)ann;
312
+ return (VALUE)ann;
315
313
  }
316
314
 
317
315
  /** call-seq: new(hash) -> new ruby-fann training data object (RubyFann::TrainData)
@@ -327,55 +325,52 @@ static VALUE fann_initialize(VALUE self, VALUE hash)
327
325
  # All sub-arrays on desired_outputs should be of same length
328
326
  # Sub-arrays on inputs & desired_outputs can be different sizes from one another
329
327
  RubyFann::TrainData.new(:inputs=>[[0.2, 0.3, 0.4], [0.8, 0.9, 0.7]], :desired_outputs=>[[3.14], [6.33]])
330
-
331
-
332
-
333
328
  */
334
329
  static VALUE fann_train_data_initialize(VALUE self, VALUE hash)
335
330
  {
336
- struct fann_train_data* train_data;
337
- Check_Type(hash, T_HASH);
331
+ struct fann_train_data* train_data;
332
+ Check_Type(hash, T_HASH);
338
333
 
339
- VALUE filename = rb_hash_aref(hash, ID2SYM(rb_intern("filename")));
340
- VALUE inputs = rb_hash_aref(hash, ID2SYM(rb_intern("inputs")));
341
- VALUE desired_outputs = rb_hash_aref(hash, ID2SYM(rb_intern("desired_outputs")));
342
-
343
- if (TYPE(filename)==T_STRING)
344
- {
345
- train_data = fann_read_train_from_file(StringValuePtr(filename));
346
- DATA_PTR(self) = train_data;
347
- }
348
- else if (TYPE(inputs)==T_ARRAY)
349
- {
350
- if (TYPE(desired_outputs)!=T_ARRAY)
351
- {
352
- rb_raise (rb_eRuntimeError, "[desired_outputs] must be present when [inputs] used.");
353
- }
354
-
355
- if (RARRAY(inputs)->len < 1)
356
- {
357
- rb_raise (rb_eRuntimeError, "[inputs/desired_outputs] must contain at least one value.");
358
- }
359
-
360
- // The data is here, start constructing:
361
- if(RARRAY(inputs)->len != RARRAY(desired_outputs)->len)
362
- {
363
- rb_raise (
364
- rb_eRuntimeError,
365
- "Number of inputs must match number of outputs: (%d != %d)",
366
- RARRAY(inputs)->len,
367
- RARRAY(desired_outputs)->len);
368
- }
369
-
370
- train_data = fann_create_train_from_rb_ary(inputs, desired_outputs);
371
- DATA_PTR(self) = train_data;
372
- }
373
- else
374
- {
375
- rb_raise (rb_eRuntimeError, "Must construct with a filename(string) or inputs/desired_outputs(arrays). All args passed via hash with symbols as keys.");
376
- }
377
-
378
- return (VALUE)train_data;
334
+ VALUE filename = rb_hash_aref(hash, ID2SYM(rb_intern("filename")));
335
+ VALUE inputs = rb_hash_aref(hash, ID2SYM(rb_intern("inputs")));
336
+ VALUE desired_outputs = rb_hash_aref(hash, ID2SYM(rb_intern("desired_outputs")));
337
+
338
+ if (TYPE(filename)==T_STRING)
339
+ {
340
+ train_data = fann_read_train_from_file(StringValuePtr(filename));
341
+ DATA_PTR(self) = train_data;
342
+ }
343
+ else if (TYPE(inputs)==T_ARRAY)
344
+ {
345
+ if (TYPE(desired_outputs)!=T_ARRAY)
346
+ {
347
+ rb_raise (rb_eRuntimeError, "[desired_outputs] must be present when [inputs] used.");
348
+ }
349
+
350
+ if (RARRAY(inputs)->len < 1)
351
+ {
352
+ rb_raise (rb_eRuntimeError, "[inputs/desired_outputs] must contain at least one value.");
353
+ }
354
+
355
+ // The data is here, start constructing:
356
+ if(RARRAY(inputs)->len != RARRAY(desired_outputs)->len)
357
+ {
358
+ rb_raise (
359
+ rb_eRuntimeError,
360
+ "Number of inputs must match number of outputs: (%d != %d)",
361
+ RARRAY(inputs)->len,
362
+ RARRAY(desired_outputs)->len);
363
+ }
364
+
365
+ train_data = fann_create_train_from_rb_ary(inputs, desired_outputs);
366
+ DATA_PTR(self) = train_data;
367
+ }
368
+ else
369
+ {
370
+ rb_raise (rb_eRuntimeError, "Must construct with a filename(string) or inputs/desired_outputs(arrays). All args passed via hash with symbols as keys.");
371
+ }
372
+
373
+ return (VALUE)train_data;
379
374
  }
380
375
 
381
376
 
@@ -385,81 +380,87 @@ static VALUE fann_train_data_initialize(VALUE self, VALUE hash)
385
380
  */
386
381
  static VALUE training_save(VALUE self, VALUE filename)
387
382
  {
388
- Check_Type(filename, T_STRING);
389
- struct fann_train_data* t;
390
- Data_Get_Struct (self, struct fann_train_data, t);
391
- fann_save_train(t, StringValuePtr(filename));
383
+ Check_Type(filename, T_STRING);
384
+ struct fann_train_data* t;
385
+ Data_Get_Struct (self, struct fann_train_data, t);
386
+ fann_save_train(t, StringValuePtr(filename));
387
+ return self;
392
388
  }
393
389
 
394
390
  /** Shuffles training data, randomizing the order.
395
391
  This is recommended for incremental training, while it will have no influence during batch training.*/
396
392
  static VALUE shuffle(VALUE self)
397
393
  {
398
- struct fann_train_data* t;
399
- Data_Get_Struct (self, struct fann_train_data, t);
400
- fann_shuffle_train_data(t);
394
+ struct fann_train_data* t;
395
+ Data_Get_Struct (self, struct fann_train_data, t);
396
+ fann_shuffle_train_data(t);
397
+ return self;
401
398
  }
402
399
 
403
400
  /** Length of training data*/
404
401
  static VALUE length_train_data(VALUE self)
405
402
  {
406
- struct fann_train_data* t;
407
- Data_Get_Struct (self, struct fann_train_data, t);
408
- return(UINT2NUM(fann_length_train_data(t)));
403
+ struct fann_train_data* t;
404
+ Data_Get_Struct (self, struct fann_train_data, t);
405
+ return(UINT2NUM(fann_length_train_data(t)));
406
+ return self;
409
407
  }
410
408
 
411
409
  /** call-seq: set_activation_function(activation_func, layer, neuron)
412
410
 
413
411
  Set the activation function for neuron number *neuron* in layer number *layer*,
414
- counting the input layer as layer 0. activation_func must be one of the following symbols:
415
- :linear, :threshold, :threshold_symmetric, :sigmoid, :sigmoid_stepwise, :sigmoid_symmetric,
416
- :sigmoid_symmetric_stepwise, :gaussian, :gaussian_symmetric, :gaussian_stepwise, :elliot,
417
- :elliot_symmetric, :linear_piece, :linear_piece_symmetric, :sin_symmetric, :cos_symmetric,
418
- :sin, :cos*/
412
+ counting the input layer as layer 0. activation_func must be one of the following symbols:
413
+ :linear, :threshold, :threshold_symmetric, :sigmoid, :sigmoid_stepwise, :sigmoid_symmetric,
414
+ :sigmoid_symmetric_stepwise, :gaussian, :gaussian_symmetric, :gaussian_stepwise, :elliot,
415
+ :elliot_symmetric, :linear_piece, :linear_piece_symmetric, :sin_symmetric, :cos_symmetric,
416
+ :sin, :cos*/
419
417
  static VALUE set_activation_function(VALUE self, VALUE activation_func, VALUE layer, VALUE neuron)
420
418
  {
421
- Check_Type(activation_func, T_SYMBOL);
422
- Check_Type(layer, T_FIXNUM);
423
- Check_Type(neuron, T_FIXNUM);
424
-
425
- struct fann* f;
426
- Data_Get_Struct(self, struct fann, f);
427
- fann_set_activation_function(f, sym_to_activation_function(activation_func), NUM2INT(layer), NUM2INT(neuron));
419
+ Check_Type(activation_func, T_SYMBOL);
420
+ Check_Type(layer, T_FIXNUM);
421
+ Check_Type(neuron, T_FIXNUM);
422
+
423
+ struct fann* f;
424
+ Data_Get_Struct(self, struct fann, f);
425
+ fann_set_activation_function(f, sym_to_activation_function(activation_func), NUM2INT(layer), NUM2INT(neuron));
426
+ return self;
428
427
  }
429
428
 
430
429
  /** call-seq: set_activation_function_hidden(activation_func)
431
430
 
432
431
  Set the activation function for all of the hidden layers. activation_func must be one of the following symbols:
433
- :linear, :threshold, :threshold_symmetric, :sigmoid, :sigmoid_stepwise, :sigmoid_symmetric,
434
- :sigmoid_symmetric_stepwise, :gaussian, :gaussian_symmetric, :gaussian_stepwise, :elliot,
435
- :elliot_symmetric, :linear_piece, :linear_piece_symmetric, :sin_symmetric, :cos_symmetric,
436
- :sin, :cos*/
432
+ :linear, :threshold, :threshold_symmetric, :sigmoid, :sigmoid_stepwise, :sigmoid_symmetric,
433
+ :sigmoid_symmetric_stepwise, :gaussian, :gaussian_symmetric, :gaussian_stepwise, :elliot,
434
+ :elliot_symmetric, :linear_piece, :linear_piece_symmetric, :sin_symmetric, :cos_symmetric,
435
+ :sin, :cos*/
437
436
  static VALUE set_activation_function_hidden(VALUE self, VALUE activation_func)
438
437
  {
439
- Check_Type(activation_func, T_SYMBOL);
440
- struct fann* f;
441
- Data_Get_Struct(self, struct fann, f);
442
- fann_set_activation_function_hidden(f, sym_to_activation_function(activation_func));
438
+ Check_Type(activation_func, T_SYMBOL);
439
+ struct fann* f;
440
+ Data_Get_Struct(self, struct fann, f);
441
+ fann_set_activation_function_hidden(f, sym_to_activation_function(activation_func));
442
+ return self;
443
443
  }
444
444
 
445
445
  /** call-seq: set_activation_function_layer(activation_func, layer)
446
446
 
447
447
  Set the activation function for all the neurons in the layer number *layer*,
448
- counting the input layer as layer 0. activation_func must be one of the following symbols:
449
- :linear, :threshold, :threshold_symmetric, :sigmoid, :sigmoid_stepwise, :sigmoid_symmetric,
450
- :sigmoid_symmetric_stepwise, :gaussian, :gaussian_symmetric, :gaussian_stepwise, :elliot,
451
- :elliot_symmetric, :linear_piece, :linear_piece_symmetric, :sin_symmetric, :cos_symmetric,
452
- :sin, :cos
453
-
448
+ counting the input layer as layer 0. activation_func must be one of the following symbols:
449
+ :linear, :threshold, :threshold_symmetric, :sigmoid, :sigmoid_stepwise, :sigmoid_symmetric,
450
+ :sigmoid_symmetric_stepwise, :gaussian, :gaussian_symmetric, :gaussian_stepwise, :elliot,
451
+ :elliot_symmetric, :linear_piece, :linear_piece_symmetric, :sin_symmetric, :cos_symmetric,
452
+ :sin, :cos
453
+
454
454
  It is not possible to set activation functions for the neurons in the input layer.
455
- */
455
+ */
456
456
  static VALUE set_activation_function_layer(VALUE self, VALUE activation_func, VALUE layer)
457
457
  {
458
- Check_Type(activation_func, T_SYMBOL);
459
- Check_Type(layer, T_FIXNUM);
460
- struct fann* f;
461
- Data_Get_Struct(self, struct fann, f);
462
- fann_set_activation_function_layer(f, sym_to_activation_function(activation_func), NUM2INT(layer));
458
+ Check_Type(activation_func, T_SYMBOL);
459
+ Check_Type(layer, T_FIXNUM);
460
+ struct fann* f;
461
+ Data_Get_Struct(self, struct fann, f);
462
+ fann_set_activation_function_layer(f, sym_to_activation_function(activation_func), NUM2INT(layer));
463
+ return self;
463
464
  }
464
465
 
465
466
  /** call-seq: get_activation_function(layer) -> return value
@@ -471,28 +472,29 @@ static VALUE set_activation_function_layer(VALUE self, VALUE activation_func, VA
471
472
  */
472
473
  static VALUE get_activation_function(VALUE self, VALUE layer, VALUE neuron)
473
474
  {
474
- Check_Type(layer, T_FIXNUM);
475
- Check_Type(neuron, T_FIXNUM);
476
- struct fann* f;
477
- Data_Get_Struct(self, struct fann, f);
478
- fann_type val = fann_get_activation_function(f, NUM2INT(layer), NUM2INT(neuron));
479
- return activation_function_to_sym(val);
475
+ Check_Type(layer, T_FIXNUM);
476
+ Check_Type(neuron, T_FIXNUM);
477
+ struct fann* f;
478
+ Data_Get_Struct(self, struct fann, f);
479
+ fann_type val = fann_get_activation_function(f, NUM2INT(layer), NUM2INT(neuron));
480
+ return activation_function_to_sym(val);
480
481
  }
481
482
 
482
483
  /** call-seq: set_activation_function_output(activation_func)
483
484
 
484
- Set the activation function for the output layer. activation_func must be one of the following symbols:
485
- :linear, :threshold, :threshold_symmetric, :sigmoid, :sigmoid_stepwise, :sigmoid_symmetric,
486
- :sigmoid_symmetric_stepwise, :gaussian, :gaussian_symmetric, :gaussian_stepwise, :elliot,
487
- :elliot_symmetric, :linear_piece, :linear_piece_symmetric, :sin_symmetric, :cos_symmetric,
488
- :sin, :cos*/
485
+ Set the activation function for the output layer. activation_func must be one of the following symbols:
486
+ :linear, :threshold, :threshold_symmetric, :sigmoid, :sigmoid_stepwise, :sigmoid_symmetric,
487
+ :sigmoid_symmetric_stepwise, :gaussian, :gaussian_symmetric, :gaussian_stepwise, :elliot,
488
+ :elliot_symmetric, :linear_piece, :linear_piece_symmetric, :sin_symmetric, :cos_symmetric,
489
+ :sin, :cos*/
489
490
 
490
491
  static VALUE set_activation_function_output(VALUE self, VALUE activation_func)
491
492
  {
492
- Check_Type(activation_func, T_SYMBOL);
493
- struct fann* f;
494
- Data_Get_Struct(self, struct fann, f);
495
- fann_set_activation_function_output(f, sym_to_activation_function(activation_func));
493
+ Check_Type(activation_func, T_SYMBOL);
494
+ struct fann* f;
495
+ Data_Get_Struct(self, struct fann, f);
496
+ fann_set_activation_function_output(f, sym_to_activation_function(activation_func));
497
+ return self;
496
498
  }
497
499
 
498
500
  /** call-seq: get_activation_steepness(layer, neuron) -> return value
@@ -501,12 +503,12 @@ static VALUE set_activation_function_output(VALUE self, VALUE activation_func)
501
503
  */
502
504
  static VALUE get_activation_steepness(VALUE self, VALUE layer, VALUE neuron)
503
505
  {
504
- Check_Type(layer, T_FIXNUM);
505
- Check_Type(neuron, T_FIXNUM);
506
- struct fann* f;
507
- Data_Get_Struct(self, struct fann, f);
508
- fann_type val = fann_get_activation_steepness(f, NUM2INT(layer), NUM2INT(neuron));
509
- return rb_float_new(val);
506
+ Check_Type(layer, T_FIXNUM);
507
+ Check_Type(neuron, T_FIXNUM);
508
+ struct fann* f;
509
+ Data_Get_Struct(self, struct fann, f);
510
+ fann_type val = fann_get_activation_steepness(f, NUM2INT(layer), NUM2INT(neuron));
511
+ return rb_float_new(val);
510
512
  }
511
513
 
512
514
  /** call-seq: set_activation_steepness(steepness, layer, neuron)
@@ -515,13 +517,14 @@ static VALUE get_activation_steepness(VALUE self, VALUE layer, VALUE neuron)
515
517
  counting the input layer as layer 0.*/
516
518
  static VALUE set_activation_steepness(VALUE self, VALUE steepness, VALUE layer, VALUE neuron)
517
519
  {
518
- Check_Type(steepness, T_FLOAT);
519
- Check_Type(layer, T_FIXNUM);
520
- Check_Type(neuron, T_FIXNUM);
521
-
522
- struct fann* f;
523
- Data_Get_Struct(self, struct fann, f);
524
- fann_set_activation_steepness(f, NUM2DBL(steepness), NUM2INT(layer), NUM2INT(neuron));
520
+ Check_Type(steepness, T_FLOAT);
521
+ Check_Type(layer, T_FIXNUM);
522
+ Check_Type(neuron, T_FIXNUM);
523
+
524
+ struct fann* f;
525
+ Data_Get_Struct(self, struct fann, f);
526
+ fann_set_activation_steepness(f, NUM2DBL(steepness), NUM2INT(layer), NUM2INT(neuron));
527
+ return self;
525
528
  }
526
529
 
527
530
  /** call-seq: set_activation_steepness_hidden(arg) -> return value
@@ -529,7 +532,7 @@ static VALUE set_activation_steepness(VALUE self, VALUE steepness, VALUE layer,
529
532
  Set the activation steepness in all of the hidden layers.*/
530
533
  static VALUE set_activation_steepness_hidden(VALUE self, VALUE steepness)
531
534
  {
532
- SET_FANN_FLT(steepness, fann_set_activation_steepness_hidden);
535
+ SET_FANN_FLT(steepness, fann_set_activation_steepness_hidden);
533
536
  }
534
537
 
535
538
  /** call-seq: set_activation_steepness_layer(steepness, layer)
@@ -538,12 +541,13 @@ static VALUE set_activation_steepness_hidden(VALUE self, VALUE steepness)
538
541
  counting the input layer as layer 0.*/
539
542
  static VALUE set_activation_steepness_layer(VALUE self, VALUE steepness, VALUE layer)
540
543
  {
541
- Check_Type(steepness, T_FLOAT);
542
- Check_Type(layer, T_FIXNUM);
543
-
544
- struct fann* f;
545
- Data_Get_Struct(self, struct fann, f);
546
- fann_set_activation_steepness_layer(f, NUM2DBL(steepness), NUM2INT(layer));
544
+ Check_Type(steepness, T_FLOAT);
545
+ Check_Type(layer, T_FIXNUM);
546
+
547
+ struct fann* f;
548
+ Data_Get_Struct(self, struct fann, f);
549
+ fann_set_activation_steepness_layer(f, NUM2DBL(steepness), NUM2INT(layer));
550
+ return self;
547
551
  }
548
552
 
549
553
  /** call-seq: set_activation_steepness_output(steepness)
@@ -551,13 +555,13 @@ static VALUE set_activation_steepness_layer(VALUE self, VALUE steepness, VALUE l
551
555
  Set the activation steepness in the output layer.*/
552
556
  static VALUE set_activation_steepness_output(VALUE self, VALUE steepness)
553
557
  {
554
- SET_FANN_FLT(steepness, fann_set_activation_steepness_output);
558
+ SET_FANN_FLT(steepness, fann_set_activation_steepness_output);
555
559
  }
556
560
 
557
561
  /** Returns the bit fail limit used during training.*/
558
562
  static VALUE get_bit_fail_limit(VALUE self)
559
563
  {
560
- RETURN_FANN_DBL(fann_get_bit_fail_limit);
564
+ RETURN_FANN_DBL(fann_get_bit_fail_limit);
561
565
  }
562
566
 
563
567
  /** call-seq: set_bit_fail_limit(bit_fail_limit)
@@ -565,7 +569,7 @@ static VALUE get_bit_fail_limit(VALUE self)
565
569
  Sets the bit fail limit used during training.*/
566
570
  static VALUE set_bit_fail_limit(VALUE self, VALUE bit_fail_limit)
567
571
  {
568
- SET_FANN_FLT(bit_fail_limit, fann_set_bit_fail_limit);
572
+ SET_FANN_FLT(bit_fail_limit, fann_set_bit_fail_limit);
569
573
  }
570
574
 
571
575
  /** The decay is a small negative valued number which is the factor that the weights
@@ -573,7 +577,7 @@ static VALUE set_bit_fail_limit(VALUE self, VALUE bit_fail_limit)
573
577
  to make sure that the weights do not become too high during training.*/
574
578
  static VALUE get_quickprop_decay(VALUE self)
575
579
  {
576
- RETURN_FANN_FLT(fann_get_quickprop_decay);
580
+ RETURN_FANN_FLT(fann_get_quickprop_decay);
577
581
  }
578
582
 
579
583
  /** call-seq: set_quickprop_decay(quickprop_decay)
@@ -581,7 +585,7 @@ static VALUE get_quickprop_decay(VALUE self)
581
585
  Sets the quickprop decay factor*/
582
586
  static VALUE set_quickprop_decay(VALUE self, VALUE quickprop_decay)
583
587
  {
584
- SET_FANN_FLT(quickprop_decay, fann_set_quickprop_decay);
588
+ SET_FANN_FLT(quickprop_decay, fann_set_quickprop_decay);
585
589
  }
586
590
 
587
591
  /** The mu factor is used to increase and decrease the step-size during quickprop training.
@@ -589,7 +593,7 @@ static VALUE set_quickprop_decay(VALUE self, VALUE quickprop_decay)
589
593
  when it was suppose to increase it. */
590
594
  static VALUE get_quickprop_mu(VALUE self)
591
595
  {
592
- RETURN_FANN_FLT(fann_get_quickprop_mu);
596
+ RETURN_FANN_FLT(fann_get_quickprop_mu);
593
597
  }
594
598
 
595
599
  /** call-seq: set_quickprop_mu(quickprop_mu)
@@ -597,14 +601,14 @@ static VALUE get_quickprop_mu(VALUE self)
597
601
  Sets the quickprop mu factor.*/
598
602
  static VALUE set_quickprop_mu(VALUE self, VALUE quickprop_mu)
599
603
  {
600
- SET_FANN_FLT(quickprop_mu, fann_set_quickprop_mu);
604
+ SET_FANN_FLT(quickprop_mu, fann_set_quickprop_mu);
601
605
  }
602
606
 
603
607
  /** The increase factor is a value larger than 1, which is used to
604
608
  increase the step-size during RPROP training.*/
605
609
  static VALUE get_rprop_increase_factor(VALUE self)
606
610
  {
607
- RETURN_FANN_FLT(fann_get_rprop_increase_factor);
611
+ RETURN_FANN_FLT(fann_get_rprop_increase_factor);
608
612
  }
609
613
 
610
614
  /** call-seq: set_rprop_increase_factor(rprop_increase_factor)
@@ -612,13 +616,13 @@ static VALUE get_rprop_increase_factor(VALUE self)
612
616
  The increase factor used during RPROP training. */
613
617
  static VALUE set_rprop_increase_factor(VALUE self, VALUE rprop_increase_factor)
614
618
  {
615
- SET_FANN_FLT(rprop_increase_factor, fann_set_rprop_increase_factor);
619
+ SET_FANN_FLT(rprop_increase_factor, fann_set_rprop_increase_factor);
616
620
  }
617
621
 
618
622
  /** The decrease factor is a value smaller than 1, which is used to decrease the step-size during RPROP training.*/
619
623
  static VALUE get_rprop_decrease_factor(VALUE self)
620
624
  {
621
- RETURN_FANN_FLT(fann_get_rprop_decrease_factor);
625
+ RETURN_FANN_FLT(fann_get_rprop_decrease_factor);
622
626
  }
623
627
 
624
628
  /** call-seq: set_rprop_decrease_factor(rprop_decrease_factor)
@@ -626,13 +630,13 @@ static VALUE get_rprop_decrease_factor(VALUE self)
626
630
  The decrease factor is a value smaller than 1, which is used to decrease the step-size during RPROP training.*/
627
631
  static VALUE set_rprop_decrease_factor(VALUE self, VALUE rprop_decrease_factor)
628
632
  {
629
- SET_FANN_FLT(rprop_decrease_factor, fann_set_rprop_decrease_factor);
633
+ SET_FANN_FLT(rprop_decrease_factor, fann_set_rprop_decrease_factor);
630
634
  }
631
635
 
632
636
  /** The minimum step-size is a small positive number determining how small the minimum step-size may be.*/
633
637
  static VALUE get_rprop_delta_min(VALUE self)
634
638
  {
635
- RETURN_FANN_FLT(fann_get_rprop_delta_min);
639
+ RETURN_FANN_FLT(fann_get_rprop_delta_min);
636
640
  }
637
641
 
638
642
  /** call-seq: set_rprop_delta_min(rprop_delta_min)
@@ -640,13 +644,13 @@ static VALUE get_rprop_delta_min(VALUE self)
640
644
  The minimum step-size is a small positive number determining how small the minimum step-size may be.*/
641
645
  static VALUE set_rprop_delta_min(VALUE self, VALUE rprop_delta_min)
642
646
  {
643
- SET_FANN_FLT(rprop_delta_min, fann_set_rprop_delta_min);
647
+ SET_FANN_FLT(rprop_delta_min, fann_set_rprop_delta_min);
644
648
  }
645
649
 
646
650
  /** The maximum step-size is a positive number determining how large the maximum step-size may be.*/
647
651
  static VALUE get_rprop_delta_max(VALUE self)
648
652
  {
649
- RETURN_FANN_FLT(fann_get_rprop_delta_max);
653
+ RETURN_FANN_FLT(fann_get_rprop_delta_max);
650
654
  }
651
655
 
652
656
  /** call-seq: set_rprop_delta_max(rprop_delta_max)
@@ -654,13 +658,13 @@ static VALUE get_rprop_delta_max(VALUE self)
654
658
  The maximum step-size is a positive number determining how large the maximum step-size may be.*/
655
659
  static VALUE set_rprop_delta_max(VALUE self, VALUE rprop_delta_max)
656
660
  {
657
- SET_FANN_FLT(rprop_delta_max, fann_set_rprop_delta_max);
661
+ SET_FANN_FLT(rprop_delta_max, fann_set_rprop_delta_max);
658
662
  }
659
663
 
660
664
  /** The initial step-size is a positive number determining the initial step size.*/
661
665
  static VALUE get_rprop_delta_zero(VALUE self)
662
666
  {
663
- RETURN_FANN_FLT(fann_get_rprop_delta_zero);
667
+ RETURN_FANN_FLT(fann_get_rprop_delta_zero);
664
668
  }
665
669
 
666
670
  /** call-seq: set_rprop_delta_zero(rprop_delta_zero)
@@ -668,29 +672,29 @@ static VALUE get_rprop_delta_zero(VALUE self)
668
672
  The initial step-size is a positive number determining the initial step size.*/
669
673
  static VALUE set_rprop_delta_zero(VALUE self, VALUE rprop_delta_zero)
670
674
  {
671
- SET_FANN_FLT(rprop_delta_zero, fann_set_rprop_delta_zero);
675
+ SET_FANN_FLT(rprop_delta_zero, fann_set_rprop_delta_zero);
672
676
  }
673
677
 
674
678
  /** Return array of bias(es)*/
675
679
  static VALUE get_bias_array(VALUE self)
676
680
  {
677
- struct fann* f;
678
- unsigned int num_layers;
679
- Data_Get_Struct (self, struct fann, f);
680
- num_layers = fann_get_num_layers(f);
681
- unsigned int layers[num_layers];
682
- fann_get_bias_array(f, layers);
683
-
684
- // Create ruby array & set outputs:
685
- VALUE arr;
686
- arr = rb_ary_new();
687
- int i;
688
- for (i=0; i<num_layers; i++)
689
- {
690
- rb_ary_push(arr, INT2NUM(layers[i]));
691
- }
692
-
693
- return arr;
681
+ struct fann* f;
682
+ unsigned int num_layers;
683
+ Data_Get_Struct (self, struct fann, f);
684
+ num_layers = fann_get_num_layers(f);
685
+ unsigned int layers[num_layers];
686
+ fann_get_bias_array(f, layers);
687
+
688
+ // Create ruby array & set outputs:
689
+ VALUE arr;
690
+ arr = rb_ary_new();
691
+ int i;
692
+ for (i=0; i<num_layers; i++)
693
+ {
694
+ rb_ary_push(arr, INT2NUM(layers[i]));
695
+ }
696
+
697
+ return arr;
694
698
  }
695
699
 
696
700
  /** The number of fail bits; means the number of output neurons which differ more
@@ -699,74 +703,74 @@ The bits are counted in all of the training data, so this number can be higher t
699
703
  the number of training data.*/
700
704
  static VALUE get_bit_fail(VALUE self)
701
705
  {
702
- RETURN_FANN_INT(fann_get_bit_fail);
706
+ RETURN_FANN_INT(fann_get_bit_fail);
703
707
  }
704
708
 
705
709
  /** Get the connection rate used when the network was created.*/
706
710
  static VALUE get_connection_rate(VALUE self)
707
711
  {
708
- RETURN_FANN_INT(fann_get_connection_rate);
712
+ RETURN_FANN_INT(fann_get_connection_rate);
709
713
  }
710
714
 
711
715
  /** call-seq: get_neurons(layer) -> return value
712
716
 
713
717
  Return array<hash> where each array element is a hash
714
718
  representing a neuron. It contains the following keys:
715
- :activation_function, symbol -- the activation function
716
- :activation_steepness=float -- The steepness of the activation function
717
- :sum=float -- The sum of the inputs multiplied with the weights
718
- :value=float -- The value of the activation fuction applied to the sum
719
- :connections=array<int> -- indices of connected neurons(inputs)
720
-
721
- This could be done more elegantly (e.g., defining more ruby ext classes).
722
- This method does not directly correlate to anything in FANN, and accesses
723
- structs that are not guaranteed to not change.
719
+ :activation_function, symbol -- the activation function
720
+ :activation_steepness=float -- The steepness of the activation function
721
+ :sum=float -- The sum of the inputs multiplied with the weights
722
+ :value=float -- The value of the activation fuction applied to the sum
723
+ :connections=array<int> -- indices of connected neurons(inputs)
724
+
725
+ This could be done more elegantly (e.g., defining more ruby ext classes).
726
+ This method does not directly correlate to anything in FANN, and accesses
727
+ structs that are not guaranteed to not change.
724
728
  */
725
729
  static VALUE get_neurons(VALUE self, VALUE layer)
726
730
  {
727
- struct fann_layer *layer_it;
728
- struct fann_neuron *neuron_it;
729
-
730
- struct fann* f;
731
- unsigned int i;
732
- Data_Get_Struct (self, struct fann, f);
733
-
734
- VALUE neuron_array = rb_ary_new();
735
- VALUE activation_function_sym = ID2SYM(rb_intern("activation_function"));
736
- VALUE activation_steepness_sym = ID2SYM(rb_intern("activation_steepness"));
737
- VALUE layer_sym = ID2SYM(rb_intern("layer"));
738
- VALUE sum_sym = ID2SYM(rb_intern("sum"));
739
- VALUE value_sym = ID2SYM(rb_intern("value"));
740
- VALUE connections_sym = ID2SYM(rb_intern("connections"));
741
- unsigned int layer_num = 0;
742
-
743
-
744
- int nuke_bias_neuron = (fann_get_network_type(f)==FANN_NETTYPE_LAYER);
745
- for(layer_it = f->first_layer; layer_it != f->last_layer; layer_it++)
746
- {
747
- for(neuron_it = layer_it->first_neuron; neuron_it != layer_it->last_neuron; neuron_it++)
748
- {
749
- if (nuke_bias_neuron && (neuron_it==(layer_it->last_neuron)-1)) continue;
750
- // Create array of connection indicies:
751
- VALUE connection_array = rb_ary_new();
752
- for (i = neuron_it->first_con; i < neuron_it->last_con; i++) {
753
- rb_ary_push(connection_array, INT2NUM(f->connections[i] - f->first_layer->first_neuron));
754
- }
755
-
756
- VALUE neuron = rb_hash_new();
757
-
758
- // Set attributes on hash & push on array:
759
- rb_hash_aset(neuron, activation_function_sym, activation_function_to_sym(neuron_it->activation_function));
760
- rb_hash_aset(neuron, activation_steepness_sym, rb_float_new(neuron_it->activation_steepness));
761
- rb_hash_aset(neuron, layer_sym, INT2NUM(layer_num));
762
- rb_hash_aset(neuron, sum_sym, rb_float_new(neuron_it->sum));
763
- rb_hash_aset(neuron, value_sym, rb_float_new(neuron_it->value));
764
- rb_hash_aset(neuron, connections_sym, connection_array);
765
-
766
- rb_ary_push(neuron_array, neuron);
767
- }
768
- ++layer_num;
769
- }
731
+ struct fann_layer *layer_it;
732
+ struct fann_neuron *neuron_it;
733
+
734
+ struct fann* f;
735
+ unsigned int i;
736
+ Data_Get_Struct (self, struct fann, f);
737
+
738
+ VALUE neuron_array = rb_ary_new();
739
+ VALUE activation_function_sym = ID2SYM(rb_intern("activation_function"));
740
+ VALUE activation_steepness_sym = ID2SYM(rb_intern("activation_steepness"));
741
+ VALUE layer_sym = ID2SYM(rb_intern("layer"));
742
+ VALUE sum_sym = ID2SYM(rb_intern("sum"));
743
+ VALUE value_sym = ID2SYM(rb_intern("value"));
744
+ VALUE connections_sym = ID2SYM(rb_intern("connections"));
745
+ unsigned int layer_num = 0;
746
+
747
+
748
+ int nuke_bias_neuron = (fann_get_network_type(f)==FANN_NETTYPE_LAYER);
749
+ for(layer_it = f->first_layer; layer_it != f->last_layer; layer_it++)
750
+ {
751
+ for(neuron_it = layer_it->first_neuron; neuron_it != layer_it->last_neuron; neuron_it++)
752
+ {
753
+ if (nuke_bias_neuron && (neuron_it==(layer_it->last_neuron)-1)) continue;
754
+ // Create array of connection indicies:
755
+ VALUE connection_array = rb_ary_new();
756
+ for (i = neuron_it->first_con; i < neuron_it->last_con; i++) {
757
+ rb_ary_push(connection_array, INT2NUM(f->connections[i] - f->first_layer->first_neuron));
758
+ }
759
+
760
+ VALUE neuron = rb_hash_new();
761
+
762
+ // Set attributes on hash & push on array:
763
+ rb_hash_aset(neuron, activation_function_sym, activation_function_to_sym(neuron_it->activation_function));
764
+ rb_hash_aset(neuron, activation_steepness_sym, rb_float_new(neuron_it->activation_steepness));
765
+ rb_hash_aset(neuron, layer_sym, INT2NUM(layer_num));
766
+ rb_hash_aset(neuron, sum_sym, rb_float_new(neuron_it->sum));
767
+ rb_hash_aset(neuron, value_sym, rb_float_new(neuron_it->value));
768
+ rb_hash_aset(neuron, connections_sym, connection_array);
769
+
770
+ rb_ary_push(neuron_array, neuron);
771
+ }
772
+ ++layer_num;
773
+ }
770
774
 
771
775
  // switch (fann_get_network_type(ann)) {
772
776
  // case FANN_NETTYPE_LAYER: {
@@ -780,256 +784,261 @@ static VALUE get_neurons(VALUE self, VALUE layer)
780
784
  // case FANN_NETTYPE_SHORTCUT: {
781
785
 
782
786
 
783
- return neuron_array;
787
+ return neuron_array;
784
788
  }
785
789
 
786
790
  /** Get list of layers in array format where each element contains number of neurons in that layer*/
787
791
  static VALUE get_layer_array(VALUE self)
788
792
  {
789
- struct fann* f;
790
- unsigned int num_layers;
791
- Data_Get_Struct (self, struct fann, f);
792
- num_layers = fann_get_num_layers(f);
793
- unsigned int layers[num_layers];
794
- fann_get_layer_array(f, layers);
795
-
796
- // Create ruby array & set outputs:
797
- VALUE arr;
798
- arr = rb_ary_new();
799
- int i;
800
- for (i=0; i<num_layers; i++)
801
- {
802
- rb_ary_push(arr, INT2NUM(layers[i]));
803
- }
804
-
793
+ struct fann* f;
794
+ unsigned int num_layers;
795
+ Data_Get_Struct (self, struct fann, f);
796
+ num_layers = fann_get_num_layers(f);
797
+ unsigned int layers[num_layers];
798
+ fann_get_layer_array(f, layers);
799
+
800
+ // Create ruby array & set outputs:
801
+ VALUE arr;
802
+ arr = rb_ary_new();
803
+ int i;
804
+ for (i=0; i<num_layers; i++)
805
+ {
806
+ rb_ary_push(arr, INT2NUM(layers[i]));
807
+ }
808
+
805
809
  return arr;
806
810
  }
807
811
 
808
812
  /** Reads the mean square error from the network.*/
809
813
  static VALUE get_MSE(VALUE self)
810
814
  {
811
- RETURN_FANN_DBL(fann_get_MSE);
815
+ RETURN_FANN_DBL(fann_get_MSE);
812
816
  }
813
817
 
814
818
  /** Resets the mean square error from the network.
815
- This function also resets the number of bits that fail.*/
819
+ This function also resets the number of bits that fail.*/
816
820
  static VALUE reset_MSE(VALUE self)
817
821
  {
818
- struct fann* f;
819
- Data_Get_Struct (self, struct fann, f);
820
- fann_reset_MSE(f);
822
+ struct fann* f;
823
+ Data_Get_Struct (self, struct fann, f);
824
+ fann_reset_MSE(f);
825
+ return self;
821
826
  }
822
827
 
823
828
  /** Get the type of network. Returns as ruby symbol (one of :shortcut, :layer)*/
824
829
  static VALUE get_network_type(VALUE self)
825
830
  {
826
- struct fann* f;
827
- enum fann_nettype_enum net_type;
828
- VALUE ret_val;
829
- Data_Get_Struct (self, struct fann, f);
831
+ struct fann* f;
832
+ enum fann_nettype_enum net_type;
833
+ VALUE ret_val;
834
+ Data_Get_Struct (self, struct fann, f);
830
835
 
831
- net_type = fann_get_network_type(f);
832
-
833
- if(net_type==FANN_NETTYPE_LAYER)
834
- {
835
- ret_val = ID2SYM(rb_intern("layer")); // (rb_str_new2("FANN_NETTYPE_LAYER"));
836
- }
837
- else if(net_type==FANN_NETTYPE_SHORTCUT)
838
- {
839
- ret_val = ID2SYM(rb_intern("shortcut")); // (rb_str_new2("FANN_NETTYPE_SHORTCUT"));
840
- }
841
- return ret_val;
836
+ net_type = fann_get_network_type(f);
837
+
838
+ if(net_type==FANN_NETTYPE_LAYER)
839
+ {
840
+ ret_val = ID2SYM(rb_intern("layer")); // (rb_str_new2("FANN_NETTYPE_LAYER"));
841
+ }
842
+ else if(net_type==FANN_NETTYPE_SHORTCUT)
843
+ {
844
+ ret_val = ID2SYM(rb_intern("shortcut")); // (rb_str_new2("FANN_NETTYPE_SHORTCUT"));
845
+ }
846
+ return ret_val;
842
847
  }
843
848
 
844
849
  /** Get the number of input neurons.*/
845
850
  static VALUE get_num_input(VALUE self)
846
851
  {
847
- RETURN_FANN_INT(fann_get_num_input);
852
+ RETURN_FANN_INT(fann_get_num_input);
848
853
  }
849
-
854
+
850
855
  /** Get the number of layers in the network.*/
851
856
  static VALUE get_num_layers(VALUE self)
852
857
  {
853
- RETURN_FANN_INT(fann_get_num_layers);
858
+ RETURN_FANN_INT(fann_get_num_layers);
854
859
  }
855
860
 
856
861
  /** Get the number of output neurons.*/
857
862
  static VALUE get_num_output(VALUE self)
858
863
  {
859
- RETURN_FANN_INT(fann_get_num_output);
864
+ RETURN_FANN_INT(fann_get_num_output);
860
865
  }
861
866
 
862
867
  /** Get the total number of connections in the entire network.*/
863
868
  static VALUE get_total_connections(VALUE self)
864
869
  {
865
- RETURN_FANN_INT(fann_get_total_connections);
870
+ RETURN_FANN_INT(fann_get_total_connections);
866
871
  }
867
872
 
868
873
  /** Get the total number of neurons in the entire network.*/
869
874
  static VALUE get_total_neurons(VALUE self)
870
875
  {
871
- RETURN_FANN_INT(fann_get_total_neurons);
876
+ RETURN_FANN_INT(fann_get_total_neurons);
872
877
  }
873
878
 
874
879
  /** call-seq: set_train_error_function(train_error_function)
875
880
 
876
881
  Sets the error function used during training. One of the following symbols:
877
- :linear, :tanh */
882
+ :linear, :tanh */
878
883
  static VALUE set_train_error_function(VALUE self, VALUE train_error_function)
879
884
  {
880
- Check_Type(train_error_function, T_SYMBOL);
881
-
882
- ID id=SYM2ID(train_error_function);
883
- enum fann_errorfunc_enum fann_train_error_function;
885
+ Check_Type(train_error_function, T_SYMBOL);
886
+
887
+ ID id=SYM2ID(train_error_function);
888
+ enum fann_errorfunc_enum fann_train_error_function;
884
889
 
885
- if(id==rb_intern("linear")) {
886
- fann_train_error_function = FANN_ERRORFUNC_LINEAR;
887
- } else if(id==rb_intern("tanh")) {
888
- fann_train_error_function = FANN_ERRORFUNC_TANH;
889
- } else {
890
- rb_raise(rb_eRuntimeError, "Unrecognized train error function: [%s]", rb_id2name(SYM2ID(train_error_function)));
891
- }
890
+ if(id==rb_intern("linear")) {
891
+ fann_train_error_function = FANN_ERRORFUNC_LINEAR;
892
+ } else if(id==rb_intern("tanh")) {
893
+ fann_train_error_function = FANN_ERRORFUNC_TANH;
894
+ } else {
895
+ rb_raise(rb_eRuntimeError, "Unrecognized train error function: [%s]", rb_id2name(SYM2ID(train_error_function)));
896
+ }
892
897
 
893
- struct fann* f;
894
- Data_Get_Struct (self, struct fann, f);
895
- fann_set_train_error_function(f, fann_train_error_function);
898
+ struct fann* f;
899
+ Data_Get_Struct (self, struct fann, f);
900
+ fann_set_train_error_function(f, fann_train_error_function);
901
+ return self;
896
902
  }
897
903
 
898
904
  /** Returns the error function used during training. One of the following symbols:
899
- :linear, :tanh*/
905
+ :linear, :tanh*/
900
906
  static VALUE get_train_error_function(VALUE self)
901
907
  {
902
- struct fann* f;
903
- enum fann_errorfunc_enum train_error;
904
- VALUE ret_val;
905
- Data_Get_Struct (self, struct fann, f);
908
+ struct fann* f;
909
+ enum fann_errorfunc_enum train_error;
910
+ VALUE ret_val;
911
+ Data_Get_Struct (self, struct fann, f);
906
912
 
907
- train_error = fann_get_train_error_function(f);
908
-
909
- if(train_error==FANN_ERRORFUNC_LINEAR)
910
- {
911
- ret_val = ID2SYM(rb_intern("linear"));
912
- }
913
- else if(train_error==FANN_ERRORFUNC_TANH)
914
- {
915
- ret_val = ID2SYM(rb_intern("tanh"));
916
- }
917
- return ret_val;
913
+ train_error = fann_get_train_error_function(f);
914
+
915
+ if(train_error==FANN_ERRORFUNC_LINEAR)
916
+ {
917
+ ret_val = ID2SYM(rb_intern("linear"));
918
+ }
919
+ else if(train_error==FANN_ERRORFUNC_TANH)
920
+ {
921
+ ret_val = ID2SYM(rb_intern("tanh"));
922
+ }
923
+ return ret_val;
918
924
  }
919
925
 
920
926
  /** call-seq: set_training_algorithm(train_error_function)
921
927
 
922
928
  Set the training algorithm. One of the following symbols:
923
- :incremental, :batch, :rprop, :quickprop */
929
+ :incremental, :batch, :rprop, :quickprop */
924
930
  static VALUE set_training_algorithm(VALUE self, VALUE train_error_function)
925
931
  {
926
- Check_Type(train_error_function, T_SYMBOL);
927
-
928
- ID id=SYM2ID(train_error_function);
929
- enum fann_train_enum fann_train_algorithm;
930
-
931
- if(id==rb_intern("incremental")) {
932
- fann_train_algorithm = FANN_TRAIN_INCREMENTAL;
933
- } else if(id==rb_intern("batch")) {
934
- fann_train_algorithm = FANN_TRAIN_BATCH;
935
- } else if(id==rb_intern("rprop")) {
936
- fann_train_algorithm = FANN_TRAIN_RPROP;
937
- } else if(id==rb_intern("quickprop")) {
938
- fann_train_algorithm = FANN_TRAIN_QUICKPROP;
939
- } else {
940
- rb_raise(rb_eRuntimeError, "Unrecognized training algorithm function: [%s]", rb_id2name(SYM2ID(train_error_function)));
941
- }
942
-
943
- struct fann* f;
944
- Data_Get_Struct (self, struct fann, f);
945
- fann_set_training_algorithm(f, fann_train_algorithm);
932
+ Check_Type(train_error_function, T_SYMBOL);
933
+
934
+ ID id=SYM2ID(train_error_function);
935
+ enum fann_train_enum fann_train_algorithm;
936
+
937
+ if(id==rb_intern("incremental")) {
938
+ fann_train_algorithm = FANN_TRAIN_INCREMENTAL;
939
+ } else if(id==rb_intern("batch")) {
940
+ fann_train_algorithm = FANN_TRAIN_BATCH;
941
+ } else if(id==rb_intern("rprop")) {
942
+ fann_train_algorithm = FANN_TRAIN_RPROP;
943
+ } else if(id==rb_intern("quickprop")) {
944
+ fann_train_algorithm = FANN_TRAIN_QUICKPROP;
945
+ } else {
946
+ rb_raise(rb_eRuntimeError, "Unrecognized training algorithm function: [%s]", rb_id2name(SYM2ID(train_error_function)));
947
+ }
948
+
949
+ struct fann* f;
950
+ Data_Get_Struct (self, struct fann, f);
951
+ fann_set_training_algorithm(f, fann_train_algorithm);
952
+ return self;
946
953
  }
947
954
 
948
955
  /** Returns the training algorithm. One of the following symbols:
949
- :incremental, :batch, :rprop, :quickprop */
956
+ :incremental, :batch, :rprop, :quickprop */
950
957
  static VALUE get_training_algorithm(VALUE self)
951
958
  {
952
- struct fann* f;
953
- enum fann_train_enum fann_train_algorithm;
954
- VALUE ret_val;
955
- Data_Get_Struct (self, struct fann, f);
956
-
957
- fann_train_algorithm = fann_get_training_algorithm(f);
958
-
959
- if(fann_train_algorithm==FANN_TRAIN_INCREMENTAL) {
960
- ret_val = ID2SYM(rb_intern("incremental"));
961
- } else if(fann_train_algorithm==FANN_TRAIN_BATCH) {
962
- ret_val = ID2SYM(rb_intern("batch"));
963
- } else if(fann_train_algorithm==FANN_TRAIN_RPROP) {
964
- ret_val = ID2SYM(rb_intern("rprop"));
965
- } else if(fann_train_algorithm==FANN_TRAIN_QUICKPROP) {
966
- ret_val = ID2SYM(rb_intern("quickprop"));
967
- }
968
- return ret_val;
959
+ struct fann* f;
960
+ enum fann_train_enum fann_train_algorithm;
961
+ VALUE ret_val;
962
+ Data_Get_Struct (self, struct fann, f);
963
+
964
+ fann_train_algorithm = fann_get_training_algorithm(f);
965
+
966
+ if(fann_train_algorithm==FANN_TRAIN_INCREMENTAL) {
967
+ ret_val = ID2SYM(rb_intern("incremental"));
968
+ } else if(fann_train_algorithm==FANN_TRAIN_BATCH) {
969
+ ret_val = ID2SYM(rb_intern("batch"));
970
+ } else if(fann_train_algorithm==FANN_TRAIN_RPROP) {
971
+ ret_val = ID2SYM(rb_intern("rprop"));
972
+ } else if(fann_train_algorithm==FANN_TRAIN_QUICKPROP) {
973
+ ret_val = ID2SYM(rb_intern("quickprop"));
974
+ }
975
+ return ret_val;
969
976
  }
970
977
 
971
978
  /** call-seq: set_train_stop_function(train_stop_function) -> return value
972
979
 
973
980
  Set the training stop function. One of the following symbols:
974
- :mse, :bit */
981
+ :mse, :bit */
975
982
  static VALUE set_train_stop_function(VALUE self, VALUE train_stop_function)
976
983
  {
977
- Check_Type(train_stop_function, T_SYMBOL);
978
- ID id=SYM2ID(train_stop_function);
979
- enum fann_stopfunc_enum fann_train_stop_function;
984
+ Check_Type(train_stop_function, T_SYMBOL);
985
+ ID id=SYM2ID(train_stop_function);
986
+ enum fann_stopfunc_enum fann_train_stop_function;
980
987
 
981
- if(id==rb_intern("mse")) {
982
- fann_train_stop_function = FANN_STOPFUNC_MSE;
983
- } else if(id==rb_intern("bit")) {
984
- fann_train_stop_function = FANN_STOPFUNC_BIT;
985
- } else {
986
- rb_raise(rb_eRuntimeError, "Unrecognized stop function: [%s]", rb_id2name(SYM2ID(train_stop_function)));
987
- }
988
+ if(id==rb_intern("mse")) {
989
+ fann_train_stop_function = FANN_STOPFUNC_MSE;
990
+ } else if(id==rb_intern("bit")) {
991
+ fann_train_stop_function = FANN_STOPFUNC_BIT;
992
+ } else {
993
+ rb_raise(rb_eRuntimeError, "Unrecognized stop function: [%s]", rb_id2name(SYM2ID(train_stop_function)));
994
+ }
988
995
 
989
- struct fann* f;
990
- Data_Get_Struct (self, struct fann, f);
991
- fann_set_train_stop_function(f, fann_train_stop_function);
996
+ struct fann* f;
997
+ Data_Get_Struct (self, struct fann, f);
998
+ fann_set_train_stop_function(f, fann_train_stop_function);
999
+ return self;
992
1000
  }
993
1001
 
994
1002
  /** Returns the training stop function. One of the following symbols:
995
- :mse, :bit */
1003
+ :mse, :bit */
996
1004
  static VALUE get_train_stop_function(VALUE self)
997
1005
  {
998
- struct fann* f;
999
- enum fann_stopfunc_enum train_stop;
1000
- VALUE ret_val;
1001
- Data_Get_Struct (self, struct fann, f);
1006
+ struct fann* f;
1007
+ enum fann_stopfunc_enum train_stop;
1008
+ VALUE ret_val;
1009
+ Data_Get_Struct (self, struct fann, f);
1002
1010
 
1003
- train_stop = fann_get_train_stop_function(f);
1004
-
1005
- if(train_stop==FANN_STOPFUNC_MSE)
1006
- {
1007
- ret_val = ID2SYM(rb_intern("mse")); // (rb_str_new2("FANN_NETTYPE_LAYER"));
1008
- }
1009
- else if(train_stop==FANN_STOPFUNC_BIT)
1010
- {
1011
- ret_val = ID2SYM(rb_intern("bit")); // (rb_str_new2("FANN_NETTYPE_SHORTCUT"));
1012
- }
1013
- return ret_val;
1011
+ train_stop = fann_get_train_stop_function(f);
1012
+
1013
+ if(train_stop==FANN_STOPFUNC_MSE)
1014
+ {
1015
+ ret_val = ID2SYM(rb_intern("mse")); // (rb_str_new2("FANN_NETTYPE_LAYER"));
1016
+ }
1017
+ else if(train_stop==FANN_STOPFUNC_BIT)
1018
+ {
1019
+ ret_val = ID2SYM(rb_intern("bit")); // (rb_str_new2("FANN_NETTYPE_SHORTCUT"));
1020
+ }
1021
+ return ret_val;
1014
1022
  }
1015
1023
 
1016
1024
 
1017
1025
  /** Will print the connections of the ann in a compact matrix,
1018
- for easy viewing of the internals of the ann. */
1026
+ for easy viewing of the internals of the ann. */
1019
1027
  static VALUE print_connections(VALUE self)
1020
1028
  {
1021
- struct fann* f;
1022
- Data_Get_Struct (self, struct fann, f);
1023
- fann_print_connections(f);
1029
+ struct fann* f;
1030
+ Data_Get_Struct (self, struct fann, f);
1031
+ fann_print_connections(f);
1032
+ return self;
1024
1033
  }
1025
1034
 
1026
1035
  /** Print current NN parameters to stdout */
1027
1036
  static VALUE print_parameters(VALUE self)
1028
1037
  {
1029
- struct fann* f;
1030
- Data_Get_Struct (self, struct fann, f);
1031
- fann_print_parameters(f);
1032
- return Qnil;
1038
+ struct fann* f;
1039
+ Data_Get_Struct (self, struct fann, f);
1040
+ fann_print_parameters(f);
1041
+ return Qnil;
1033
1042
  }
1034
1043
 
1035
1044
  /** call-seq: randomize_weights(min_weight, max_weight)
@@ -1037,11 +1046,12 @@ static VALUE print_parameters(VALUE self)
1037
1046
  Give each connection a random weight between *min_weight* and *max_weight* */
1038
1047
  static VALUE randomize_weights(VALUE self, VALUE min_weight, VALUE max_weight)
1039
1048
  {
1040
- Check_Type(min_weight, T_FLOAT);
1041
- Check_Type(max_weight, T_FLOAT);
1042
- struct fann* f;
1043
- Data_Get_Struct (self, struct fann, f);
1044
- fann_randomize_weights(f, NUM2DBL(min_weight), NUM2DBL(max_weight));
1049
+ Check_Type(min_weight, T_FLOAT);
1050
+ Check_Type(max_weight, T_FLOAT);
1051
+ struct fann* f;
1052
+ Data_Get_Struct (self, struct fann, f);
1053
+ fann_randomize_weights(f, NUM2DBL(min_weight), NUM2DBL(max_weight));
1054
+ return self;
1045
1055
  }
1046
1056
 
1047
1057
  /** call-seq: run(inputs) -> return value
@@ -1050,34 +1060,34 @@ static VALUE randomize_weights(VALUE self, VALUE min_weight, VALUE max_weight)
1050
1060
  Returns array<Float> as output */
1051
1061
  static VALUE run (VALUE self, VALUE inputs)
1052
1062
  {
1053
- Check_Type(inputs, T_ARRAY);
1063
+ Check_Type(inputs, T_ARRAY);
1054
1064
 
1055
1065
  struct fann* f;
1056
- int i;
1057
- fann_type* outputs;
1058
-
1059
- // Convert inputs to type needed for NN:
1060
- unsigned int len = RARRAY(inputs)->len;
1061
- fann_type fann_inputs[len];
1062
- for (i=0; i<len; i++)
1063
- {
1064
- fann_inputs[i] = NUM2DBL(RARRAY(inputs)->ptr[i]);
1065
- }
1066
-
1067
-
1068
- // Obtain NN & run method:
1066
+ int i;
1067
+ fann_type* outputs;
1068
+
1069
+ // Convert inputs to type needed for NN:
1070
+ unsigned int len = RARRAY(inputs)->len;
1071
+ fann_type fann_inputs[len];
1072
+ for (i=0; i<len; i++)
1073
+ {
1074
+ fann_inputs[i] = NUM2DBL(RARRAY(inputs)->ptr[i]);
1075
+ }
1076
+
1077
+
1078
+ // Obtain NN & run method:
1069
1079
  Data_Get_Struct (self, struct fann, f);
1070
- outputs = fann_run(f, fann_inputs);
1071
-
1072
- // Create ruby array & set outputs:
1073
- VALUE arr;
1074
- arr = rb_ary_new();
1075
- unsigned int output_len=fann_get_num_output(f);
1076
- for (i=0; i<output_len; i++)
1077
- {
1078
- rb_ary_push(arr, rb_float_new(outputs[i]));
1079
- }
1080
-
1080
+ outputs = fann_run(f, fann_inputs);
1081
+
1082
+ // Create ruby array & set outputs:
1083
+ VALUE arr;
1084
+ arr = rb_ary_new();
1085
+ unsigned int output_len=fann_get_num_output(f);
1086
+ for (i=0; i<output_len; i++)
1087
+ {
1088
+ rb_ary_push(arr, rb_float_new(outputs[i]));
1089
+ }
1090
+
1081
1091
  return arr;
1082
1092
  }
1083
1093
 
@@ -1086,15 +1096,16 @@ static VALUE run (VALUE self, VALUE inputs)
1086
1096
  Initialize the weights using Widrow + Nguyen's algorithm. */
1087
1097
  static VALUE init_weights(VALUE self, VALUE train_data)
1088
1098
  {
1089
-
1090
- Check_Type(train_data, T_DATA);
1091
-
1092
- struct fann* f;
1093
- struct fann_train_data* t;
1094
- Data_Get_Struct (self, struct fann, f);
1095
- Data_Get_Struct (train_data, struct fann_train_data, t);
1099
+
1100
+ Check_Type(train_data, T_DATA);
1101
+
1102
+ struct fann* f;
1103
+ struct fann_train_data* t;
1104
+ Data_Get_Struct (self, struct fann, f);
1105
+ Data_Get_Struct (train_data, struct fann_train_data, t);
1096
1106
 
1097
- fann_init_weights(f, t);
1107
+ fann_init_weights(f, t);
1108
+ return self;
1098
1109
  }
1099
1110
 
1100
1111
 
@@ -1102,26 +1113,27 @@ static VALUE init_weights(VALUE self, VALUE train_data)
1102
1113
  /** call-seq: train_on_data(train_data, max_epochs, epochs_between_reports, desired_error)
1103
1114
 
1104
1115
  Train with training data created with RubyFann::TrainData.new
1105
- max_epochs - The maximum number of epochs the training should continue
1106
- epochs_between_reports - The number of epochs between printing a status report to stdout.
1107
- desired_error - The desired <get_MSE> or <get_bit_fail>, depending on which stop function
1108
- is chosen by <set_train_stop_function>. */
1116
+ max_epochs - The maximum number of epochs the training should continue
1117
+ epochs_between_reports - The number of epochs between printing a status report to stdout.
1118
+ desired_error - The desired <get_MSE> or <get_bit_fail>, depending on which stop function
1119
+ is chosen by <set_train_stop_function>. */
1109
1120
  static VALUE train_on_data(VALUE self, VALUE train_data, VALUE max_epochs, VALUE epochs_between_reports, VALUE desired_error)
1110
1121
  {
1111
- Check_Type(train_data, T_DATA);
1112
- Check_Type(max_epochs, T_FIXNUM);
1113
- Check_Type(epochs_between_reports, T_FIXNUM);
1114
- Check_Type(desired_error, T_FLOAT);
1115
-
1116
- struct fann* f;
1117
- struct fann_train_data* t;
1118
- Data_Get_Struct (self, struct fann, f);
1119
- Data_Get_Struct (train_data, struct fann_train_data, t);
1122
+ Check_Type(train_data, T_DATA);
1123
+ Check_Type(max_epochs, T_FIXNUM);
1124
+ Check_Type(epochs_between_reports, T_FIXNUM);
1125
+ Check_Type(desired_error, T_FLOAT);
1126
+
1127
+ struct fann* f;
1128
+ struct fann_train_data* t;
1129
+ Data_Get_Struct (self, struct fann, f);
1130
+ Data_Get_Struct (train_data, struct fann_train_data, t);
1120
1131
 
1121
- unsigned int fann_max_epochs = NUM2INT(max_epochs);
1122
- unsigned int fann_epochs_between_reports = NUM2INT(epochs_between_reports);
1123
- float fann_desired_error = NUM2DBL(desired_error);
1124
- fann_train_on_data(f, t, fann_max_epochs, fann_epochs_between_reports, fann_desired_error);
1132
+ unsigned int fann_max_epochs = NUM2INT(max_epochs);
1133
+ unsigned int fann_epochs_between_reports = NUM2INT(epochs_between_reports);
1134
+ float fann_desired_error = NUM2DBL(desired_error);
1135
+ fann_train_on_data(f, t, fann_max_epochs, fann_epochs_between_reports, fann_desired_error);
1136
+ return rb_int_new(0);
1125
1137
  }
1126
1138
 
1127
1139
  /** call-seq: train_epoch(train_data) -> return value
@@ -1129,12 +1141,12 @@ static VALUE train_on_data(VALUE self, VALUE train_data, VALUE max_epochs, VALUE
1129
1141
  Train one epoch with a set of training data, created with RubyFann::TrainData.new */
1130
1142
  static VALUE train_epoch(VALUE self, VALUE train_data)
1131
1143
  {
1132
- Check_Type(train_data, T_DATA);
1133
- struct fann* f;
1134
- struct fann_train_data* t;
1135
- Data_Get_Struct (self, struct fann, f);
1136
- Data_Get_Struct (train_data, struct fann_train_data, t);
1137
- return rb_float_new(fann_train_epoch(f, t));
1144
+ Check_Type(train_data, T_DATA);
1145
+ struct fann* f;
1146
+ struct fann_train_data* t;
1147
+ Data_Get_Struct (self, struct fann, f);
1148
+ Data_Get_Struct (train_data, struct fann_train_data, t);
1149
+ return rb_float_new(fann_train_epoch(f, t));
1138
1150
  }
1139
1151
 
1140
1152
  /** call-seq: test_data(train_data) -> return value
@@ -1142,64 +1154,64 @@ static VALUE train_epoch(VALUE self, VALUE train_data)
1142
1154
  Test a set of training data and calculates the MSE for the training data. */
1143
1155
  static VALUE test_data(VALUE self, VALUE train_data)
1144
1156
  {
1145
- Check_Type(train_data, T_DATA);
1146
- struct fann* f;
1147
- struct fann_train_data* t;
1148
- Data_Get_Struct (self, struct fann, f);
1149
- Data_Get_Struct (train_data, struct fann_train_data, t);
1150
- return rb_float_new(fann_test_data(f, t));
1157
+ Check_Type(train_data, T_DATA);
1158
+ struct fann* f;
1159
+ struct fann_train_data* t;
1160
+ Data_Get_Struct (self, struct fann, f);
1161
+ Data_Get_Struct (train_data, struct fann_train_data, t);
1162
+ return rb_float_new(fann_test_data(f, t));
1151
1163
  }
1152
1164
 
1153
1165
  // Returns the position of the decimal point in the ann.
1154
1166
  // Only available in fixed-point mode, which we don't need:
1155
1167
  // static VALUE get_decimal_point(VALUE self)
1156
1168
  // {
1157
- // struct fann* f;
1158
- // Data_Get_Struct (self, struct fann, f);
1159
- // return INT2NUM(fann_get_decimal_point(f));
1169
+ // struct fann* f;
1170
+ // Data_Get_Struct (self, struct fann, f);
1171
+ // return INT2NUM(fann_get_decimal_point(f));
1160
1172
  // }
1161
-
1173
+
1162
1174
  // returns the multiplier that fix point data is multiplied with.
1163
1175
 
1164
1176
  // Only available in fixed-point mode, which we don't need:
1165
1177
  // static VALUE get_multiplier(VALUE self)
1166
1178
  // {
1167
- // struct fann* f;
1168
- // Data_Get_Struct (self, struct fann, f);
1169
- // return INT2NUM(fann_get_multiplier(f));
1179
+ // struct fann* f;
1180
+ // Data_Get_Struct (self, struct fann, f);
1181
+ // return INT2NUM(fann_get_multiplier(f));
1170
1182
  // }
1171
1183
 
1172
1184
  /** call-seq: cascadetrain_on_data(train_data, max_neurons, neurons_between_reports, desired_error)
1173
1185
 
1174
1186
  Perform cascade training with training data created with RubyFann::TrainData.new
1175
- max_epochs - The maximum number of neurons in trained network
1176
- neurons_between_reports - The number of neurons between printing a status report to stdout.
1177
- desired_error - The desired <get_MSE> or <get_bit_fail>, depending on which stop function
1178
- is chosen by <set_train_stop_function>. */
1187
+ max_epochs - The maximum number of neurons in trained network
1188
+ neurons_between_reports - The number of neurons between printing a status report to stdout.
1189
+ desired_error - The desired <get_MSE> or <get_bit_fail>, depending on which stop function
1190
+ is chosen by <set_train_stop_function>. */
1179
1191
  static VALUE cascadetrain_on_data(VALUE self, VALUE train_data, VALUE max_neurons, VALUE neurons_between_reports, VALUE desired_error)
1180
1192
  {
1181
- Check_Type(train_data, T_DATA);
1182
- Check_Type(max_neurons, T_FIXNUM);
1183
- Check_Type(neurons_between_reports, T_FIXNUM);
1184
- Check_Type(desired_error, T_FLOAT);
1185
-
1186
- struct fann* f;
1187
- struct fann_train_data* t;
1188
- Data_Get_Struct (self, struct fann, f);
1189
- Data_Get_Struct (train_data, struct fann_train_data, t);
1190
-
1191
- unsigned int fann_max_neurons = NUM2INT(max_neurons);
1192
- unsigned int fann_neurons_between_reports = NUM2INT(neurons_between_reports);
1193
- float fann_desired_error = NUM2DBL(desired_error);
1194
-
1195
- fann_cascadetrain_on_data(f, t, fann_max_neurons, fann_neurons_between_reports, fann_desired_error);
1196
-
1197
- }
1193
+ Check_Type(train_data, T_DATA);
1194
+ Check_Type(max_neurons, T_FIXNUM);
1195
+ Check_Type(neurons_between_reports, T_FIXNUM);
1196
+ Check_Type(desired_error, T_FLOAT);
1197
+
1198
+ struct fann* f;
1199
+ struct fann_train_data* t;
1200
+ Data_Get_Struct (self, struct fann, f);
1201
+ Data_Get_Struct (train_data, struct fann_train_data, t);
1202
+
1203
+ unsigned int fann_max_neurons = NUM2INT(max_neurons);
1204
+ unsigned int fann_neurons_between_reports = NUM2INT(neurons_between_reports);
1205
+ float fann_desired_error = NUM2DBL(desired_error);
1206
+
1207
+ fann_cascadetrain_on_data(f, t, fann_max_neurons, fann_neurons_between_reports, fann_desired_error);
1208
+ return self;
1209
+ }
1198
1210
 
1199
1211
  /** The cascade output change fraction is a number between 0 and 1 */
1200
1212
  static VALUE get_cascade_output_change_fraction(VALUE self)
1201
1213
  {
1202
- RETURN_FANN_FLT(fann_get_cascade_output_change_fraction);
1214
+ RETURN_FANN_FLT(fann_get_cascade_output_change_fraction);
1203
1215
  }
1204
1216
 
1205
1217
  /** call-seq: set_cascade_output_change_fraction(cascade_output_change_fraction)
@@ -1207,29 +1219,29 @@ static VALUE get_cascade_output_change_fraction(VALUE self)
1207
1219
  The cascade output change fraction is a number between 0 and 1 */
1208
1220
  static VALUE set_cascade_output_change_fraction(VALUE self, VALUE cascade_output_change_fraction)
1209
1221
  {
1210
- SET_FANN_FLT(cascade_output_change_fraction, fann_set_cascade_output_change_fraction);
1222
+ SET_FANN_FLT(cascade_output_change_fraction, fann_set_cascade_output_change_fraction);
1211
1223
  }
1212
1224
 
1213
1225
  /** The number of cascade output stagnation epochs determines the number of epochs training is allowed to
1214
- continue without changing the MSE by a fraction of <get_cascade_output_change_fraction>. */
1226
+ continue without changing the MSE by a fraction of <get_cascade_output_change_fraction>. */
1215
1227
  static VALUE get_cascade_output_stagnation_epochs(VALUE self)
1216
1228
  {
1217
- RETURN_FANN_INT(fann_get_cascade_output_stagnation_epochs);
1229
+ RETURN_FANN_INT(fann_get_cascade_output_stagnation_epochs);
1218
1230
  }
1219
1231
 
1220
1232
  /** call-seq: set_cascade_output_stagnation_epochs(cascade_output_stagnation_epochs)
1221
1233
 
1222
1234
  The number of cascade output stagnation epochs determines the number of epochs training is allowed to
1223
- continue without changing the MSE by a fraction of <get_cascade_output_change_fraction>. */
1235
+ continue without changing the MSE by a fraction of <get_cascade_output_change_fraction>. */
1224
1236
  static VALUE set_cascade_output_stagnation_epochs(VALUE self, VALUE cascade_output_stagnation_epochs)
1225
1237
  {
1226
- SET_FANN_INT(cascade_output_stagnation_epochs, fann_set_cascade_output_stagnation_epochs);
1238
+ SET_FANN_INT(cascade_output_stagnation_epochs, fann_set_cascade_output_stagnation_epochs);
1227
1239
  }
1228
1240
 
1229
1241
  /** The cascade candidate change fraction is a number between 0 and 1 */
1230
1242
  static VALUE get_cascade_candidate_change_fraction(VALUE self)
1231
1243
  {
1232
- RETURN_FANN_FLT(fann_get_cascade_candidate_change_fraction);
1244
+ RETURN_FANN_FLT(fann_get_cascade_candidate_change_fraction);
1233
1245
  }
1234
1246
 
1235
1247
  /** call-seq: set_cascade_candidate_change_fraction(cascade_candidate_change_fraction)
@@ -1237,128 +1249,128 @@ static VALUE get_cascade_candidate_change_fraction(VALUE self)
1237
1249
  The cascade candidate change fraction is a number between 0 and 1 */
1238
1250
  static VALUE set_cascade_candidate_change_fraction(VALUE self, VALUE cascade_candidate_change_fraction)
1239
1251
  {
1240
- SET_FANN_FLT(cascade_candidate_change_fraction, fann_set_cascade_candidate_change_fraction);
1252
+ SET_FANN_FLT(cascade_candidate_change_fraction, fann_set_cascade_candidate_change_fraction);
1241
1253
  }
1242
1254
 
1243
1255
  /** The number of cascade candidate stagnation epochs determines the number of epochs training is allowed to
1244
- continue without changing the MSE by a fraction of <get_cascade_candidate_change_fraction>. */
1256
+ continue without changing the MSE by a fraction of <get_cascade_candidate_change_fraction>. */
1245
1257
  static VALUE get_cascade_candidate_stagnation_epochs(VALUE self)
1246
1258
  {
1247
- RETURN_FANN_UINT(fann_get_cascade_candidate_stagnation_epochs);
1259
+ RETURN_FANN_UINT(fann_get_cascade_candidate_stagnation_epochs);
1248
1260
  }
1249
1261
 
1250
1262
  /** call-seq: set_cascade_candidate_stagnation_epochs(cascade_candidate_stagnation_epochs)
1251
1263
 
1252
1264
  The number of cascade candidate stagnation epochs determines the number of epochs training is allowed to
1253
- continue without changing the MSE by a fraction of <get_cascade_candidate_change_fraction>. */
1265
+ continue without changing the MSE by a fraction of <get_cascade_candidate_change_fraction>. */
1254
1266
  static VALUE set_cascade_candidate_stagnation_epochs(VALUE self, VALUE cascade_candidate_stagnation_epochs)
1255
1267
  {
1256
- SET_FANN_UINT(cascade_candidate_stagnation_epochs, fann_set_cascade_candidate_stagnation_epochs);
1257
- }
1268
+ SET_FANN_UINT(cascade_candidate_stagnation_epochs, fann_set_cascade_candidate_stagnation_epochs);
1269
+ }
1258
1270
 
1259
1271
  /** The weight multiplier is a parameter which is used to multiply the weights from the candidate neuron
1260
- before adding the neuron to the neural network. This parameter is usually between 0 and 1, and is used
1261
- to make the training a bit less aggressive. */
1272
+ before adding the neuron to the neural network. This parameter is usually between 0 and 1, and is used
1273
+ to make the training a bit less aggressive. */
1262
1274
  static VALUE get_cascade_weight_multiplier(VALUE self)
1263
1275
  {
1264
- RETURN_FANN_DBL(fann_get_cascade_weight_multiplier);
1276
+ RETURN_FANN_DBL(fann_get_cascade_weight_multiplier);
1265
1277
  }
1266
1278
 
1267
1279
  /** call-seq: set_cascade_weight_multiplier(cascade_weight_multiplier)
1268
1280
 
1269
1281
  The weight multiplier is a parameter which is used to multiply the weights from the candidate neuron
1270
- before adding the neuron to the neural network. This parameter is usually between 0 and 1, and is used
1271
- to make the training a bit less aggressive. */
1282
+ before adding the neuron to the neural network. This parameter is usually between 0 and 1, and is used
1283
+ to make the training a bit less aggressive. */
1272
1284
  static VALUE set_cascade_weight_multiplier(VALUE self, VALUE cascade_weight_multiplier)
1273
1285
  {
1274
- SET_FANN_DBL(cascade_weight_multiplier, fann_set_cascade_weight_multiplier);
1286
+ SET_FANN_DBL(cascade_weight_multiplier, fann_set_cascade_weight_multiplier);
1275
1287
  }
1276
1288
 
1277
1289
  /** The candidate limit is a limit for how much the candidate neuron may be trained.
1278
- The limit is a limit on the proportion between the MSE and candidate score. */
1290
+ The limit is a limit on the proportion between the MSE and candidate score. */
1279
1291
  static VALUE get_cascade_candidate_limit(VALUE self)
1280
1292
  {
1281
- RETURN_FANN_DBL(fann_get_cascade_candidate_limit);
1293
+ RETURN_FANN_DBL(fann_get_cascade_candidate_limit);
1282
1294
  }
1283
1295
 
1284
1296
  /** call-seq: set_cascade_candidate_limit(cascade_candidate_limit)
1285
1297
 
1286
1298
  The candidate limit is a limit for how much the candidate neuron may be trained.
1287
- The limit is a limit on the proportion between the MSE and candidate score. */
1299
+ The limit is a limit on the proportion between the MSE and candidate score. */
1288
1300
  static VALUE set_cascade_candidate_limit(VALUE self, VALUE cascade_candidate_limit)
1289
1301
  {
1290
- SET_FANN_DBL(cascade_candidate_limit, fann_set_cascade_candidate_limit);
1302
+ SET_FANN_DBL(cascade_candidate_limit, fann_set_cascade_candidate_limit);
1291
1303
  }
1292
1304
 
1293
1305
  /** The maximum out epochs determines the maximum number of epochs the output connections
1294
- may be trained after adding a new candidate neuron. */
1306
+ may be trained after adding a new candidate neuron. */
1295
1307
  static VALUE get_cascade_max_out_epochs(VALUE self)
1296
1308
  {
1297
- RETURN_FANN_UINT(fann_get_cascade_max_out_epochs);
1309
+ RETURN_FANN_UINT(fann_get_cascade_max_out_epochs);
1298
1310
  }
1299
1311
 
1300
1312
  /** call-seq: set_cascade_max_out_epochs(cascade_max_out_epochs)
1301
1313
 
1302
1314
  The maximum out epochs determines the maximum number of epochs the output connections
1303
- may be trained after adding a new candidate neuron. */
1315
+ may be trained after adding a new candidate neuron. */
1304
1316
  static VALUE set_cascade_max_out_epochs(VALUE self, VALUE cascade_max_out_epochs)
1305
1317
  {
1306
- SET_FANN_UINT(cascade_max_out_epochs, fann_set_cascade_max_out_epochs);
1318
+ SET_FANN_UINT(cascade_max_out_epochs, fann_set_cascade_max_out_epochs);
1307
1319
  }
1308
1320
 
1309
1321
  /** The maximum candidate epochs determines the maximum number of epochs the input
1310
- connections to the candidates may be trained before adding a new candidate neuron. */
1322
+ connections to the candidates may be trained before adding a new candidate neuron. */
1311
1323
  static VALUE get_cascade_max_cand_epochs(VALUE self)
1312
1324
  {
1313
- RETURN_FANN_UINT(fann_get_cascade_max_cand_epochs);
1325
+ RETURN_FANN_UINT(fann_get_cascade_max_cand_epochs);
1314
1326
  }
1315
1327
 
1316
1328
  /** call-seq: set_cascade_max_cand_epochs(cascade_max_cand_epochs)
1317
1329
 
1318
1330
  The maximum candidate epochs determines the maximum number of epochs the input
1319
- connections to the candidates may be trained before adding a new candidate neuron. */
1331
+ connections to the candidates may be trained before adding a new candidate neuron. */
1320
1332
  static VALUE set_cascade_max_cand_epochs(VALUE self, VALUE cascade_max_cand_epochs)
1321
1333
  {
1322
- SET_FANN_UINT(cascade_max_cand_epochs, fann_set_cascade_max_cand_epochs);
1334
+ SET_FANN_UINT(cascade_max_cand_epochs, fann_set_cascade_max_cand_epochs);
1323
1335
  }
1324
1336
 
1325
1337
  /** The number of candidates used during training (calculated by multiplying <get_cascade_activation_functions_count>,
1326
- <get_cascade_activation_steepnesses_count> and <get_cascade_num_candidate_groups>). */
1338
+ <get_cascade_activation_steepnesses_count> and <get_cascade_num_candidate_groups>). */
1327
1339
  static VALUE get_cascade_num_candidates(VALUE self)
1328
1340
  {
1329
- RETURN_FANN_UINT(fann_get_cascade_num_candidates);
1341
+ RETURN_FANN_UINT(fann_get_cascade_num_candidates);
1330
1342
  }
1331
1343
 
1332
1344
  /** The number of activation functions in the <get_cascade_activation_functions> array */
1333
1345
  static VALUE get_cascade_activation_functions_count(VALUE self)
1334
1346
  {
1335
- RETURN_FANN_UINT(fann_get_cascade_activation_functions_count);
1347
+ RETURN_FANN_UINT(fann_get_cascade_activation_functions_count);
1336
1348
  }
1337
1349
 
1338
1350
  /** The learning rate is used to determine how aggressive training should be for some of the
1339
- training algorithms (:incremental, :batch, :quickprop).
1340
- Do however note that it is not used in :rprop.
1341
- The default learning rate is 0.7. */
1351
+ training algorithms (:incremental, :batch, :quickprop).
1352
+ Do however note that it is not used in :rprop.
1353
+ The default learning rate is 0.7. */
1342
1354
  static VALUE get_learning_rate(VALUE self)
1343
1355
  {
1344
- RETURN_FANN_FLT(fann_get_learning_rate);
1356
+ RETURN_FANN_FLT(fann_get_learning_rate);
1345
1357
  }
1346
1358
 
1347
1359
  /** call-seq: set_learning_rate(learning_rate) -> return value
1348
1360
 
1349
1361
  The learning rate is used to determine how aggressive training should be for some of the
1350
- training algorithms (:incremental, :batch, :quickprop).
1351
- Do however note that it is not used in :rprop.
1352
- The default learning rate is 0.7. */
1362
+ training algorithms (:incremental, :batch, :quickprop).
1363
+ Do however note that it is not used in :rprop.
1364
+ The default learning rate is 0.7. */
1353
1365
  static VALUE set_learning_rate(VALUE self, VALUE learning_rate)
1354
1366
  {
1355
- SET_FANN_FLT(learning_rate, fann_set_learning_rate);
1367
+ SET_FANN_FLT(learning_rate, fann_set_learning_rate);
1356
1368
  }
1357
1369
 
1358
1370
  /** Get the learning momentum. */
1359
1371
  static VALUE get_learning_momentum(VALUE self)
1360
1372
  {
1361
- RETURN_FANN_FLT(fann_get_learning_momentum);
1373
+ RETURN_FANN_FLT(fann_get_learning_momentum);
1362
1374
  }
1363
1375
 
1364
1376
  /** call-seq: set_learning_momentum(learning_momentum) -> return value
@@ -1366,111 +1378,113 @@ static VALUE get_learning_momentum(VALUE self)
1366
1378
  Set the learning momentum. */
1367
1379
  static VALUE set_learning_momentum(VALUE self, VALUE learning_momentum)
1368
1380
  {
1369
- SET_FANN_FLT(learning_momentum, fann_set_learning_momentum);
1381
+ SET_FANN_FLT(learning_momentum, fann_set_learning_momentum);
1370
1382
  }
1371
1383
 
1372
1384
  /** call-seq: set_cascade_activation_functions(cascade_activation_functions)
1373
1385
 
1374
1386
  The cascade activation functions is an array of the different activation functions used by
1375
- the candidates. The default is [:sigmoid, :sigmoid_symmetric, :gaussian, :gaussian_symmetric, :elliot, :elliot_symmetric] */
1387
+ the candidates. The default is [:sigmoid, :sigmoid_symmetric, :gaussian, :gaussian_symmetric, :elliot, :elliot_symmetric] */
1376
1388
  static VALUE set_cascade_activation_functions(VALUE self, VALUE cascade_activation_functions)
1377
1389
  {
1378
- Check_Type(cascade_activation_functions, T_ARRAY);
1379
- struct fann* f;
1380
- Data_Get_Struct (self, struct fann, f);
1381
-
1382
- unsigned int cnt = RARRAY(cascade_activation_functions)->len;
1383
- enum fann_activationfunc_enum fann_activation_functions[cnt];
1384
- int i;
1385
- for (i=0; i<cnt; i++)
1386
- {
1387
- fann_activation_functions[i] = sym_to_activation_function(RARRAY(cascade_activation_functions)->ptr[i]);
1388
- }
1389
-
1390
- fann_set_cascade_activation_functions(f, fann_activation_functions, cnt);
1390
+ Check_Type(cascade_activation_functions, T_ARRAY);
1391
+ struct fann* f;
1392
+ Data_Get_Struct (self, struct fann, f);
1393
+
1394
+ unsigned int cnt = RARRAY(cascade_activation_functions)->len;
1395
+ enum fann_activationfunc_enum fann_activation_functions[cnt];
1396
+ int i;
1397
+ for (i=0; i<cnt; i++)
1398
+ {
1399
+ fann_activation_functions[i] = sym_to_activation_function(RARRAY(cascade_activation_functions)->ptr[i]);
1400
+ }
1401
+
1402
+ fann_set_cascade_activation_functions(f, fann_activation_functions, cnt);
1403
+ return self;
1391
1404
  }
1392
1405
 
1393
1406
  /** The cascade activation functions is an array of the different activation functions used by
1394
- the candidates. The default is [:sigmoid, :sigmoid_symmetric, :gaussian, :gaussian_symmetric, :elliot, :elliot_symmetric] */
1407
+ the candidates. The default is [:sigmoid, :sigmoid_symmetric, :gaussian, :gaussian_symmetric, :elliot, :elliot_symmetric] */
1395
1408
  static VALUE get_cascade_activation_functions(VALUE self)
1396
1409
  {
1397
- struct fann* f;
1398
- Data_Get_Struct (self, struct fann, f);
1399
- unsigned int cnt = fann_get_cascade_activation_functions_count(f);
1400
- enum fann_activationfunc_enum* fann_functions = fann_get_cascade_activation_functions(f);
1410
+ struct fann* f;
1411
+ Data_Get_Struct (self, struct fann, f);
1412
+ unsigned int cnt = fann_get_cascade_activation_functions_count(f);
1413
+ enum fann_activationfunc_enum* fann_functions = fann_get_cascade_activation_functions(f);
1401
1414
 
1402
- // Create ruby array & set outputs:
1403
- VALUE arr;
1404
- arr = rb_ary_new();
1405
- int i;
1406
- for (i=0; i<cnt; i++)
1407
- {
1408
- rb_ary_push(arr, activation_function_to_sym(fann_functions[i]));
1409
- }
1415
+ // Create ruby array & set outputs:
1416
+ VALUE arr;
1417
+ arr = rb_ary_new();
1418
+ int i;
1419
+ for (i=0; i<cnt; i++)
1420
+ {
1421
+ rb_ary_push(arr, activation_function_to_sym(fann_functions[i]));
1422
+ }
1410
1423
 
1411
- return arr;
1424
+ return arr;
1412
1425
  }
1413
1426
 
1414
1427
  /** The number of activation steepnesses in the <get_cascade_activation_functions> array. */
1415
1428
  static VALUE get_cascade_activation_steepnesses_count(VALUE self)
1416
1429
  {
1417
- RETURN_FANN_UINT(fann_get_cascade_activation_steepnesses_count);
1430
+ RETURN_FANN_UINT(fann_get_cascade_activation_steepnesses_count);
1418
1431
  }
1419
1432
 
1420
1433
  /** The number of candidate groups is the number of groups of identical candidates which will be used
1421
- during training. */
1434
+ during training. */
1422
1435
  static VALUE get_cascade_num_candidate_groups(VALUE self)
1423
1436
  {
1424
- RETURN_FANN_UINT(fann_get_cascade_num_candidate_groups);
1437
+ RETURN_FANN_UINT(fann_get_cascade_num_candidate_groups);
1425
1438
  }
1426
1439
 
1427
1440
  /** call-seq: set_cascade_num_candidate_groups(cascade_num_candidate_groups)
1428
1441
 
1429
1442
  The number of candidate groups is the number of groups of identical candidates which will be used
1430
- during training. */
1443
+ during training. */
1431
1444
  static VALUE set_cascade_num_candidate_groups(VALUE self, VALUE cascade_num_candidate_groups)
1432
1445
  {
1433
- SET_FANN_UINT(cascade_num_candidate_groups, fann_set_cascade_num_candidate_groups);
1446
+ SET_FANN_UINT(cascade_num_candidate_groups, fann_set_cascade_num_candidate_groups);
1434
1447
  }
1435
1448
 
1436
1449
  /** The cascade activation steepnesses array is an array of the different activation functions used by
1437
- the candidates. */
1450
+ the candidates. */
1438
1451
  static VALUE set_cascade_activation_steepnesses(VALUE self, VALUE cascade_activation_steepnesses)
1439
1452
  {
1440
- Check_Type(cascade_activation_steepnesses, T_ARRAY);
1441
- struct fann* f;
1442
- Data_Get_Struct (self, struct fann, f);
1443
-
1444
- unsigned int cnt = RARRAY(cascade_activation_steepnesses)->len;
1445
- fann_type fann_activation_steepnesses[cnt];
1446
- int i;
1447
- for (i=0; i<cnt; i++)
1448
- {
1449
- fann_activation_steepnesses[i] = NUM2DBL(RARRAY(cascade_activation_steepnesses)->ptr[i]);
1450
- }
1451
-
1452
- fann_set_cascade_activation_steepnesses(f, fann_activation_steepnesses, cnt);
1453
+ Check_Type(cascade_activation_steepnesses, T_ARRAY);
1454
+ struct fann* f;
1455
+ Data_Get_Struct (self, struct fann, f);
1456
+
1457
+ unsigned int cnt = RARRAY(cascade_activation_steepnesses)->len;
1458
+ fann_type fann_activation_steepnesses[cnt];
1459
+ int i;
1460
+ for (i=0; i<cnt; i++)
1461
+ {
1462
+ fann_activation_steepnesses[i] = NUM2DBL(RARRAY(cascade_activation_steepnesses)->ptr[i]);
1463
+ }
1464
+
1465
+ fann_set_cascade_activation_steepnesses(f, fann_activation_steepnesses, cnt);
1466
+ return self;
1453
1467
  }
1454
1468
 
1455
1469
  /** The cascade activation steepnesses array is an array of the different activation functions used by
1456
- the candidates. */
1470
+ the candidates. */
1457
1471
  static VALUE get_cascade_activation_steepnesses(VALUE self)
1458
1472
  {
1459
- struct fann* f;
1460
- Data_Get_Struct (self, struct fann, f);
1461
- fann_type* fann_steepnesses = fann_get_cascade_activation_steepnesses(f);
1462
- unsigned int cnt = fann_get_cascade_activation_steepnesses_count(f);
1473
+ struct fann* f;
1474
+ Data_Get_Struct (self, struct fann, f);
1475
+ fann_type* fann_steepnesses = fann_get_cascade_activation_steepnesses(f);
1476
+ unsigned int cnt = fann_get_cascade_activation_steepnesses_count(f);
1463
1477
 
1464
- // Create ruby array & set outputs:
1465
- VALUE arr;
1466
- arr = rb_ary_new();
1467
- int i;
1468
- for (i=0; i<cnt; i++)
1469
- {
1470
- rb_ary_push(arr, rb_float_new(fann_steepnesses[i]));
1471
- }
1478
+ // Create ruby array & set outputs:
1479
+ VALUE arr;
1480
+ arr = rb_ary_new();
1481
+ int i;
1482
+ for (i=0; i<cnt; i++)
1483
+ {
1484
+ rb_ary_push(arr, rb_float_new(fann_steepnesses[i]));
1485
+ }
1472
1486
 
1473
- return arr;
1487
+ return arr;
1474
1488
  }
1475
1489
 
1476
1490
  /** call-seq: save(filename) -> return status
@@ -1478,219 +1492,219 @@ static VALUE get_cascade_activation_steepnesses(VALUE self)
1478
1492
  Save the entire network to configuration file with given name */
1479
1493
  static VALUE nn_save(VALUE self, VALUE filename)
1480
1494
  {
1481
- struct fann* f;
1482
- Data_Get_Struct (self, struct fann, f);
1483
- int status = fann_save(f, StringValuePtr(filename));
1484
- return INT2NUM(status);
1495
+ struct fann* f;
1496
+ Data_Get_Struct (self, struct fann, f);
1497
+ int status = fann_save(f, StringValuePtr(filename));
1498
+ return INT2NUM(status);
1485
1499
  }
1486
1500
 
1487
1501
  /** Initializes class under RubyFann module/namespace. */
1488
1502
  void Init_neural_network ()
1489
1503
  {
1490
- // RubyFann module/namespace:
1491
- m_rb_fann_module = rb_define_module ("RubyFann");
1492
-
1493
- // Standard NN class:
1494
- m_rb_fann_standard_class = rb_define_class_under (m_rb_fann_module, "Standard", rb_cObject);
1495
- rb_define_alloc_func (m_rb_fann_standard_class, fann_allocate);
1496
- rb_define_method(m_rb_fann_standard_class, "initialize", fann_initialize, 1);
1497
- rb_define_method(m_rb_fann_standard_class, "init_weights", init_weights, 1);
1498
- rb_define_method(m_rb_fann_standard_class, "set_activation_function", set_activation_function, 3);
1499
- rb_define_method(m_rb_fann_standard_class, "set_activation_function_hidden", set_activation_function_hidden, 1);
1500
- rb_define_method(m_rb_fann_standard_class, "set_activation_function_layer", set_activation_function_layer, 2);
1501
- rb_define_method(m_rb_fann_standard_class, "get_activation_function", get_activation_function, 2);
1502
- rb_define_method(m_rb_fann_standard_class, "set_activation_function_output", set_activation_function_output, 1);
1503
- rb_define_method(m_rb_fann_standard_class, "get_activation_steepness", get_activation_steepness, 2);
1504
- rb_define_method(m_rb_fann_standard_class, "set_activation_steepness", set_activation_steepness, 3);
1505
- rb_define_method(m_rb_fann_standard_class, "set_activation_steepness_hidden", set_activation_steepness_hidden, 1);
1506
- rb_define_method(m_rb_fann_standard_class, "set_activation_steepness_layer", set_activation_steepness_layer, 2);
1507
- rb_define_method(m_rb_fann_standard_class, "set_activation_steepness_output", set_activation_steepness_output, 1);
1508
- rb_define_method(m_rb_fann_standard_class, "get_train_error_function", get_train_error_function, 0);
1509
- rb_define_method(m_rb_fann_standard_class, "set_train_error_function", set_train_error_function, 1);
1510
- rb_define_method(m_rb_fann_standard_class, "get_train_stop_function", get_train_stop_function, 0);
1511
- rb_define_method(m_rb_fann_standard_class, "set_train_stop_function", set_train_stop_function, 1);
1512
- rb_define_method(m_rb_fann_standard_class, "get_bit_fail_limit", get_bit_fail_limit, 0);
1513
- rb_define_method(m_rb_fann_standard_class, "set_bit_fail_limit", set_bit_fail_limit, 1);
1514
- rb_define_method(m_rb_fann_standard_class, "get_quickprop_decay", get_quickprop_decay, 0);
1515
- rb_define_method(m_rb_fann_standard_class, "set_quickprop_decay", set_quickprop_decay, 1);
1516
- rb_define_method(m_rb_fann_standard_class, "get_quickprop_mu", get_quickprop_mu, 0);
1517
- rb_define_method(m_rb_fann_standard_class, "set_quickprop_mu", set_quickprop_mu, 1);
1518
- rb_define_method(m_rb_fann_standard_class, "get_rprop_increase_factor", get_rprop_increase_factor, 0);
1519
- rb_define_method(m_rb_fann_standard_class, "set_rprop_increase_factor", set_rprop_increase_factor, 1);
1520
- rb_define_method(m_rb_fann_standard_class, "get_rprop_decrease_factor", get_rprop_decrease_factor, 0);
1521
- rb_define_method(m_rb_fann_standard_class, "set_rprop_decrease_factor", set_rprop_decrease_factor, 1);
1522
- rb_define_method(m_rb_fann_standard_class, "get_rprop_delta_max", get_rprop_delta_max, 0);
1523
- rb_define_method(m_rb_fann_standard_class, "set_rprop_delta_max", set_rprop_delta_max, 1);
1524
- rb_define_method(m_rb_fann_standard_class, "get_rprop_delta_min", get_rprop_delta_min, 0);
1525
- rb_define_method(m_rb_fann_standard_class, "set_rprop_delta_min", set_rprop_delta_min, 1);
1526
- rb_define_method(m_rb_fann_standard_class, "get_rprop_delta_zero", get_rprop_delta_zero, 0);
1527
- rb_define_method(m_rb_fann_standard_class, "set_rprop_delta_zero", set_rprop_delta_zero, 1);
1528
- rb_define_method(m_rb_fann_standard_class, "get_bias_array", get_bias_array, 0);
1529
- rb_define_method(m_rb_fann_standard_class, "get_connection_rate", get_connection_rate, 0);
1530
- rb_define_method(m_rb_fann_standard_class, "get_layer_array", get_layer_array, 0);
1531
- rb_define_method(m_rb_fann_standard_class, "get_network_type", get_network_type, 0);
1532
- rb_define_method(m_rb_fann_standard_class, "get_neurons", get_neurons, 0);
1533
- rb_define_method(m_rb_fann_standard_class, "get_num_input", get_num_input, 0);
1534
- rb_define_method(m_rb_fann_standard_class, "get_num_layers", get_num_layers, 0);
1535
- rb_define_method(m_rb_fann_standard_class, "get_num_output", get_num_output, 0);
1536
- rb_define_method(m_rb_fann_standard_class, "get_total_connections", get_total_connections, 0);
1537
- rb_define_method(m_rb_fann_standard_class, "get_total_neurons", get_total_neurons, 0);
1538
- rb_define_method(m_rb_fann_standard_class, "get_train_error_function", get_train_error_function, 0);
1539
- rb_define_method(m_rb_fann_standard_class, "set_train_error_function", set_train_error_function, 1);
1540
- rb_define_method(m_rb_fann_standard_class, "print_connections", print_connections, 0);
1541
- rb_define_method(m_rb_fann_standard_class, "print_parameters", print_parameters, 0);
1542
- rb_define_method(m_rb_fann_standard_class, "randomize_weights", randomize_weights, 2);
1543
- rb_define_method(m_rb_fann_standard_class, "run", run, 1);
1544
- rb_define_method(m_rb_fann_standard_class, "train_on_data", train_on_data, 4);
1545
- rb_define_method(m_rb_fann_standard_class, "train_epoch", train_epoch, 1);
1546
- rb_define_method(m_rb_fann_standard_class, "test_data", test_data, 1);
1547
- rb_define_method(m_rb_fann_standard_class, "get_MSE", get_MSE, 0);
1548
- rb_define_method(m_rb_fann_standard_class, "get_bit_fail", get_bit_fail, 0);
1549
- rb_define_method(m_rb_fann_standard_class, "reset_MSE", reset_MSE, 0);
1550
- rb_define_method(m_rb_fann_standard_class, "get_learning_rate", get_learning_rate, 0);
1551
- rb_define_method(m_rb_fann_standard_class, "set_learning_rate", set_learning_rate, 1);
1552
- rb_define_method(m_rb_fann_standard_class, "get_learning_momentum", get_learning_momentum, 0);
1553
- rb_define_method(m_rb_fann_standard_class, "set_learning_momentum", set_learning_momentum, 1);
1554
- rb_define_method(m_rb_fann_standard_class, "get_training_algorithm", get_training_algorithm, 0);
1555
- rb_define_method(m_rb_fann_standard_class, "set_training_algorithm", set_training_algorithm, 1);
1556
-
1557
-
1558
- // Cascade functions:
1559
- rb_define_method(m_rb_fann_standard_class, "cascadetrain_on_data", cascadetrain_on_data, 4);
1560
- rb_define_method(m_rb_fann_standard_class, "get_cascade_output_change_fraction", get_cascade_output_change_fraction, 0);
1561
- rb_define_method(m_rb_fann_standard_class, "set_cascade_output_change_fraction", set_cascade_output_change_fraction, 1);
1562
- rb_define_method(m_rb_fann_standard_class, "get_cascade_output_stagnation_epochs", get_cascade_output_stagnation_epochs, 0);
1563
- rb_define_method(m_rb_fann_standard_class, "set_cascade_output_stagnation_epochs", set_cascade_output_stagnation_epochs, 1);
1564
- rb_define_method(m_rb_fann_standard_class, "get_cascade_candidate_change_fraction", get_cascade_candidate_change_fraction, 0);
1565
- rb_define_method(m_rb_fann_standard_class, "set_cascade_candidate_change_fraction", set_cascade_candidate_change_fraction, 1);
1566
- rb_define_method(m_rb_fann_standard_class, "get_cascade_candidate_stagnation_epochs", get_cascade_candidate_stagnation_epochs, 0);
1567
- rb_define_method(m_rb_fann_standard_class, "set_cascade_candidate_stagnation_epochs", set_cascade_candidate_stagnation_epochs, 1);
1568
- rb_define_method(m_rb_fann_standard_class, "get_cascade_weight_multiplier", get_cascade_weight_multiplier, 0);
1569
- rb_define_method(m_rb_fann_standard_class, "set_cascade_weight_multiplier", set_cascade_weight_multiplier, 1);
1570
- rb_define_method(m_rb_fann_standard_class, "get_cascade_candidate_limit", get_cascade_candidate_limit, 0);
1571
- rb_define_method(m_rb_fann_standard_class, "set_cascade_candidate_limit", set_cascade_candidate_limit, 1);
1572
- rb_define_method(m_rb_fann_standard_class, "get_cascade_max_out_epochs", get_cascade_max_out_epochs, 0);
1573
- rb_define_method(m_rb_fann_standard_class, "set_cascade_max_out_epochs", set_cascade_max_out_epochs, 1);
1574
- rb_define_method(m_rb_fann_standard_class, "get_cascade_max_cand_epochs", get_cascade_max_cand_epochs, 0);
1575
- rb_define_method(m_rb_fann_standard_class, "set_cascade_max_cand_epochs", set_cascade_max_cand_epochs, 1);
1576
- rb_define_method(m_rb_fann_standard_class, "get_cascade_num_candidates", get_cascade_num_candidates, 0);
1577
- rb_define_method(m_rb_fann_standard_class, "get_cascade_activation_functions_count", get_cascade_activation_functions_count, 0);
1578
- rb_define_method(m_rb_fann_standard_class, "get_cascade_activation_functions", get_cascade_activation_functions, 0);
1579
- rb_define_method(m_rb_fann_standard_class, "set_cascade_activation_functions", set_cascade_activation_functions, 1);
1580
- rb_define_method(m_rb_fann_standard_class, "get_cascade_activation_steepnesses_count", get_cascade_activation_steepnesses_count, 0);
1581
- rb_define_method(m_rb_fann_standard_class, "get_cascade_activation_steepnesses", get_cascade_activation_steepnesses, 0);
1582
- rb_define_method(m_rb_fann_standard_class, "set_cascade_activation_steepnesses", set_cascade_activation_steepnesses, 1);
1583
- rb_define_method(m_rb_fann_standard_class, "get_cascade_num_candidate_groups", get_cascade_num_candidate_groups, 0);
1584
- rb_define_method(m_rb_fann_standard_class, "set_cascade_num_candidate_groups", set_cascade_num_candidate_groups, 1);
1585
- rb_define_method(m_rb_fann_standard_class, "save", nn_save, 1);
1586
-
1587
-
1588
- // Uncomment for fixed-point mode (also recompile fann). Probably not going to be needed:
1589
- //rb_define_method(clazz, "get_decimal_point", get_decimal_point, 0);
1590
- //rb_define_method(clazz, "get_multiplier", get_multiplier, 0);
1591
-
1592
- // Shortcut NN class (duplicated from above so that rdoc generation tools can find the methods:):
1593
- m_rb_fann_shortcut_class = rb_define_class_under (m_rb_fann_module, "Shortcut", rb_cObject);
1594
- rb_define_alloc_func (m_rb_fann_shortcut_class, fann_allocate);
1595
- rb_define_method(m_rb_fann_shortcut_class, "initialize", fann_initialize, 1);
1596
- rb_define_method(m_rb_fann_shortcut_class, "init_weights", init_weights, 1);
1597
- rb_define_method(m_rb_fann_shortcut_class, "set_activation_function", set_activation_function, 3);
1598
- rb_define_method(m_rb_fann_shortcut_class, "set_activation_function_hidden", set_activation_function_hidden, 1);
1599
- rb_define_method(m_rb_fann_shortcut_class, "set_activation_function_layer", set_activation_function_layer, 2);
1600
- rb_define_method(m_rb_fann_standard_class, "get_activation_function", get_activation_function, 2);
1601
- rb_define_method(m_rb_fann_shortcut_class, "set_activation_function_output", set_activation_function_output, 1);
1602
- rb_define_method(m_rb_fann_shortcut_class, "get_activation_steepness", get_activation_steepness, 2);
1603
- rb_define_method(m_rb_fann_shortcut_class, "set_activation_steepness", set_activation_steepness, 3);
1604
- rb_define_method(m_rb_fann_shortcut_class, "set_activation_steepness_hidden", set_activation_steepness_hidden, 1);
1605
- rb_define_method(m_rb_fann_shortcut_class, "set_activation_steepness_layer", set_activation_steepness_layer, 2);
1606
- rb_define_method(m_rb_fann_shortcut_class, "set_activation_steepness_output", set_activation_steepness_output, 1);
1607
- rb_define_method(m_rb_fann_shortcut_class, "get_train_error_function", get_train_error_function, 0);
1608
- rb_define_method(m_rb_fann_shortcut_class, "set_train_error_function", set_train_error_function, 1);
1609
- rb_define_method(m_rb_fann_shortcut_class, "get_train_stop_function", get_train_stop_function, 0);
1610
- rb_define_method(m_rb_fann_shortcut_class, "set_train_stop_function", set_train_stop_function, 1);
1611
- rb_define_method(m_rb_fann_shortcut_class, "get_bit_fail_limit", get_bit_fail_limit, 0);
1612
- rb_define_method(m_rb_fann_shortcut_class, "set_bit_fail_limit", set_bit_fail_limit, 1);
1613
- rb_define_method(m_rb_fann_shortcut_class, "get_quickprop_decay", get_quickprop_decay, 0);
1614
- rb_define_method(m_rb_fann_shortcut_class, "set_quickprop_decay", set_quickprop_decay, 1);
1615
- rb_define_method(m_rb_fann_shortcut_class, "get_quickprop_mu", get_quickprop_mu, 0);
1616
- rb_define_method(m_rb_fann_shortcut_class, "set_quickprop_mu", set_quickprop_mu, 1);
1617
- rb_define_method(m_rb_fann_shortcut_class, "get_rprop_increase_factor", get_rprop_increase_factor, 0);
1618
- rb_define_method(m_rb_fann_shortcut_class, "set_rprop_increase_factor", set_rprop_increase_factor, 1);
1619
- rb_define_method(m_rb_fann_shortcut_class, "get_rprop_decrease_factor", get_rprop_decrease_factor, 0);
1620
- rb_define_method(m_rb_fann_shortcut_class, "set_rprop_decrease_factor", set_rprop_decrease_factor, 1);
1621
- rb_define_method(m_rb_fann_shortcut_class, "get_rprop_delta_max", get_rprop_delta_max, 0);
1622
- rb_define_method(m_rb_fann_shortcut_class, "set_rprop_delta_max", set_rprop_delta_max, 1);
1623
- rb_define_method(m_rb_fann_shortcut_class, "get_rprop_delta_min", get_rprop_delta_min, 0);
1624
- rb_define_method(m_rb_fann_shortcut_class, "set_rprop_delta_min", set_rprop_delta_min, 1);
1625
- rb_define_method(m_rb_fann_shortcut_class, "get_rprop_delta_zero", get_rprop_delta_zero, 0);
1626
- rb_define_method(m_rb_fann_shortcut_class, "set_rprop_delta_zero", set_rprop_delta_zero, 1);
1627
- rb_define_method(m_rb_fann_shortcut_class, "get_bias_array", get_bias_array, 0);
1628
- rb_define_method(m_rb_fann_shortcut_class, "get_connection_rate", get_connection_rate, 0);
1629
- rb_define_method(m_rb_fann_shortcut_class, "get_layer_array", get_layer_array, 0);
1630
- rb_define_method(m_rb_fann_shortcut_class, "get_network_type", get_network_type, 0);
1631
- rb_define_method(m_rb_fann_shortcut_class, "get_neurons", get_neurons, 0);
1632
- rb_define_method(m_rb_fann_shortcut_class, "get_num_input", get_num_input, 0);
1633
- rb_define_method(m_rb_fann_shortcut_class, "get_num_layers", get_num_layers, 0);
1634
- rb_define_method(m_rb_fann_shortcut_class, "get_num_output", get_num_output, 0);
1635
- rb_define_method(m_rb_fann_shortcut_class, "get_total_connections", get_total_connections, 0);
1636
- rb_define_method(m_rb_fann_shortcut_class, "get_total_neurons", get_total_neurons, 0);
1637
- rb_define_method(m_rb_fann_shortcut_class, "get_train_error_function", get_train_error_function, 0);
1638
- rb_define_method(m_rb_fann_shortcut_class, "set_train_error_function", set_train_error_function, 1);
1639
- rb_define_method(m_rb_fann_shortcut_class, "print_connections", print_connections, 0);
1640
- rb_define_method(m_rb_fann_shortcut_class, "print_parameters", print_parameters, 0);
1641
- rb_define_method(m_rb_fann_shortcut_class, "randomize_weights", randomize_weights, 2);
1642
- rb_define_method(m_rb_fann_shortcut_class, "run", run, 1);
1643
- rb_define_method(m_rb_fann_shortcut_class, "train_on_data", train_on_data, 4);
1644
- rb_define_method(m_rb_fann_shortcut_class, "train_epoch", train_epoch, 1);
1645
- rb_define_method(m_rb_fann_shortcut_class, "test_data", test_data, 1);
1646
- rb_define_method(m_rb_fann_shortcut_class, "get_MSE", get_MSE, 0);
1647
- rb_define_method(m_rb_fann_shortcut_class, "get_bit_fail", get_bit_fail, 0);
1648
- rb_define_method(m_rb_fann_shortcut_class, "reset_MSE", reset_MSE, 0);
1649
- rb_define_method(m_rb_fann_shortcut_class, "get_learning_rate", get_learning_rate, 0);
1650
- rb_define_method(m_rb_fann_shortcut_class, "set_learning_rate", set_learning_rate, 1);
1651
- rb_define_method(m_rb_fann_shortcut_class, "get_learning_momentum", get_learning_momentum, 0);
1652
- rb_define_method(m_rb_fann_shortcut_class, "set_learning_momentum", set_learning_momentum, 1);
1653
- rb_define_method(m_rb_fann_shortcut_class, "get_training_algorithm", get_training_algorithm, 0);
1654
- rb_define_method(m_rb_fann_shortcut_class, "set_training_algorithm", set_training_algorithm, 1);
1655
-
1656
- // Cascade functions:
1657
- rb_define_method(m_rb_fann_shortcut_class, "cascadetrain_on_data", cascadetrain_on_data, 4);
1658
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_output_change_fraction", get_cascade_output_change_fraction, 0);
1659
- rb_define_method(m_rb_fann_shortcut_class, "set_cascade_output_change_fraction", set_cascade_output_change_fraction, 1);
1660
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_output_stagnation_epochs", get_cascade_output_stagnation_epochs, 0);
1661
- rb_define_method(m_rb_fann_shortcut_class, "set_cascade_output_stagnation_epochs", set_cascade_output_stagnation_epochs, 1);
1662
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_candidate_change_fraction", get_cascade_candidate_change_fraction, 0);
1663
- rb_define_method(m_rb_fann_shortcut_class, "set_cascade_candidate_change_fraction", set_cascade_candidate_change_fraction, 1);
1664
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_candidate_stagnation_epochs", get_cascade_candidate_stagnation_epochs, 0);
1665
- rb_define_method(m_rb_fann_shortcut_class, "set_cascade_candidate_stagnation_epochs", set_cascade_candidate_stagnation_epochs, 1);
1666
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_weight_multiplier", get_cascade_weight_multiplier, 0);
1667
- rb_define_method(m_rb_fann_shortcut_class, "set_cascade_weight_multiplier", set_cascade_weight_multiplier, 1);
1668
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_candidate_limit", get_cascade_candidate_limit, 0);
1669
- rb_define_method(m_rb_fann_shortcut_class, "set_cascade_candidate_limit", set_cascade_candidate_limit, 1);
1670
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_max_out_epochs", get_cascade_max_out_epochs, 0);
1671
- rb_define_method(m_rb_fann_shortcut_class, "set_cascade_max_out_epochs", set_cascade_max_out_epochs, 1);
1672
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_max_cand_epochs", get_cascade_max_cand_epochs, 0);
1673
- rb_define_method(m_rb_fann_shortcut_class, "set_cascade_max_cand_epochs", set_cascade_max_cand_epochs, 1);
1674
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_num_candidates", get_cascade_num_candidates, 0);
1675
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_activation_functions_count", get_cascade_activation_functions_count, 0);
1676
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_activation_functions", get_cascade_activation_functions, 0);
1677
- rb_define_method(m_rb_fann_shortcut_class, "set_cascade_activation_functions", set_cascade_activation_functions, 1);
1678
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_activation_steepnesses_count", get_cascade_activation_steepnesses_count, 0);
1679
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_activation_steepnesses", get_cascade_activation_steepnesses, 0);
1680
- rb_define_method(m_rb_fann_shortcut_class, "set_cascade_activation_steepnesses", set_cascade_activation_steepnesses, 1);
1681
- rb_define_method(m_rb_fann_shortcut_class, "get_cascade_num_candidate_groups", get_cascade_num_candidate_groups, 0);
1682
- rb_define_method(m_rb_fann_shortcut_class, "set_cascade_num_candidate_groups", set_cascade_num_candidate_groups, 1);
1683
- rb_define_method(m_rb_fann_shortcut_class, "save", nn_save, 1);
1684
-
1685
-
1686
- // TrainData NN class:
1687
- m_rb_fann_train_data_class = rb_define_class_under (m_rb_fann_module, "TrainData", rb_cObject);
1688
- rb_define_alloc_func (m_rb_fann_train_data_class, fann_training_data_allocate);
1689
- rb_define_method(m_rb_fann_train_data_class, "initialize", fann_train_data_initialize, 1);
1690
- rb_define_method(m_rb_fann_train_data_class, "length", length_train_data, 0);
1691
- rb_define_method(m_rb_fann_train_data_class, "shuffle", shuffle, 0);
1692
- rb_define_method(m_rb_fann_train_data_class, "save", training_save, 1);
1693
-
1694
- // printf("Initialized Ruby Bindings for FANN.\n");
1504
+ // RubyFann module/namespace:
1505
+ m_rb_fann_module = rb_define_module ("RubyFann");
1506
+
1507
+ // Standard NN class:
1508
+ m_rb_fann_standard_class = rb_define_class_under (m_rb_fann_module, "Standard", rb_cObject);
1509
+ rb_define_alloc_func (m_rb_fann_standard_class, fann_allocate);
1510
+ rb_define_method(m_rb_fann_standard_class, "initialize", fann_initialize, 1);
1511
+ rb_define_method(m_rb_fann_standard_class, "init_weights", init_weights, 1);
1512
+ rb_define_method(m_rb_fann_standard_class, "set_activation_function", set_activation_function, 3);
1513
+ rb_define_method(m_rb_fann_standard_class, "set_activation_function_hidden", set_activation_function_hidden, 1);
1514
+ rb_define_method(m_rb_fann_standard_class, "set_activation_function_layer", set_activation_function_layer, 2);
1515
+ rb_define_method(m_rb_fann_standard_class, "get_activation_function", get_activation_function, 2);
1516
+ rb_define_method(m_rb_fann_standard_class, "set_activation_function_output", set_activation_function_output, 1);
1517
+ rb_define_method(m_rb_fann_standard_class, "get_activation_steepness", get_activation_steepness, 2);
1518
+ rb_define_method(m_rb_fann_standard_class, "set_activation_steepness", set_activation_steepness, 3);
1519
+ rb_define_method(m_rb_fann_standard_class, "set_activation_steepness_hidden", set_activation_steepness_hidden, 1);
1520
+ rb_define_method(m_rb_fann_standard_class, "set_activation_steepness_layer", set_activation_steepness_layer, 2);
1521
+ rb_define_method(m_rb_fann_standard_class, "set_activation_steepness_output", set_activation_steepness_output, 1);
1522
+ rb_define_method(m_rb_fann_standard_class, "get_train_error_function", get_train_error_function, 0);
1523
+ rb_define_method(m_rb_fann_standard_class, "set_train_error_function", set_train_error_function, 1);
1524
+ rb_define_method(m_rb_fann_standard_class, "get_train_stop_function", get_train_stop_function, 0);
1525
+ rb_define_method(m_rb_fann_standard_class, "set_train_stop_function", set_train_stop_function, 1);
1526
+ rb_define_method(m_rb_fann_standard_class, "get_bit_fail_limit", get_bit_fail_limit, 0);
1527
+ rb_define_method(m_rb_fann_standard_class, "set_bit_fail_limit", set_bit_fail_limit, 1);
1528
+ rb_define_method(m_rb_fann_standard_class, "get_quickprop_decay", get_quickprop_decay, 0);
1529
+ rb_define_method(m_rb_fann_standard_class, "set_quickprop_decay", set_quickprop_decay, 1);
1530
+ rb_define_method(m_rb_fann_standard_class, "get_quickprop_mu", get_quickprop_mu, 0);
1531
+ rb_define_method(m_rb_fann_standard_class, "set_quickprop_mu", set_quickprop_mu, 1);
1532
+ rb_define_method(m_rb_fann_standard_class, "get_rprop_increase_factor", get_rprop_increase_factor, 0);
1533
+ rb_define_method(m_rb_fann_standard_class, "set_rprop_increase_factor", set_rprop_increase_factor, 1);
1534
+ rb_define_method(m_rb_fann_standard_class, "get_rprop_decrease_factor", get_rprop_decrease_factor, 0);
1535
+ rb_define_method(m_rb_fann_standard_class, "set_rprop_decrease_factor", set_rprop_decrease_factor, 1);
1536
+ rb_define_method(m_rb_fann_standard_class, "get_rprop_delta_max", get_rprop_delta_max, 0);
1537
+ rb_define_method(m_rb_fann_standard_class, "set_rprop_delta_max", set_rprop_delta_max, 1);
1538
+ rb_define_method(m_rb_fann_standard_class, "get_rprop_delta_min", get_rprop_delta_min, 0);
1539
+ rb_define_method(m_rb_fann_standard_class, "set_rprop_delta_min", set_rprop_delta_min, 1);
1540
+ rb_define_method(m_rb_fann_standard_class, "get_rprop_delta_zero", get_rprop_delta_zero, 0);
1541
+ rb_define_method(m_rb_fann_standard_class, "set_rprop_delta_zero", set_rprop_delta_zero, 1);
1542
+ rb_define_method(m_rb_fann_standard_class, "get_bias_array", get_bias_array, 0);
1543
+ rb_define_method(m_rb_fann_standard_class, "get_connection_rate", get_connection_rate, 0);
1544
+ rb_define_method(m_rb_fann_standard_class, "get_layer_array", get_layer_array, 0);
1545
+ rb_define_method(m_rb_fann_standard_class, "get_network_type", get_network_type, 0);
1546
+ rb_define_method(m_rb_fann_standard_class, "get_neurons", get_neurons, 0);
1547
+ rb_define_method(m_rb_fann_standard_class, "get_num_input", get_num_input, 0);
1548
+ rb_define_method(m_rb_fann_standard_class, "get_num_layers", get_num_layers, 0);
1549
+ rb_define_method(m_rb_fann_standard_class, "get_num_output", get_num_output, 0);
1550
+ rb_define_method(m_rb_fann_standard_class, "get_total_connections", get_total_connections, 0);
1551
+ rb_define_method(m_rb_fann_standard_class, "get_total_neurons", get_total_neurons, 0);
1552
+ rb_define_method(m_rb_fann_standard_class, "get_train_error_function", get_train_error_function, 0);
1553
+ rb_define_method(m_rb_fann_standard_class, "set_train_error_function", set_train_error_function, 1);
1554
+ rb_define_method(m_rb_fann_standard_class, "print_connections", print_connections, 0);
1555
+ rb_define_method(m_rb_fann_standard_class, "print_parameters", print_parameters, 0);
1556
+ rb_define_method(m_rb_fann_standard_class, "randomize_weights", randomize_weights, 2);
1557
+ rb_define_method(m_rb_fann_standard_class, "run", run, 1);
1558
+ rb_define_method(m_rb_fann_standard_class, "train_on_data", train_on_data, 4);
1559
+ rb_define_method(m_rb_fann_standard_class, "train_epoch", train_epoch, 1);
1560
+ rb_define_method(m_rb_fann_standard_class, "test_data", test_data, 1);
1561
+ rb_define_method(m_rb_fann_standard_class, "get_MSE", get_MSE, 0);
1562
+ rb_define_method(m_rb_fann_standard_class, "get_bit_fail", get_bit_fail, 0);
1563
+ rb_define_method(m_rb_fann_standard_class, "reset_MSE", reset_MSE, 0);
1564
+ rb_define_method(m_rb_fann_standard_class, "get_learning_rate", get_learning_rate, 0);
1565
+ rb_define_method(m_rb_fann_standard_class, "set_learning_rate", set_learning_rate, 1);
1566
+ rb_define_method(m_rb_fann_standard_class, "get_learning_momentum", get_learning_momentum, 0);
1567
+ rb_define_method(m_rb_fann_standard_class, "set_learning_momentum", set_learning_momentum, 1);
1568
+ rb_define_method(m_rb_fann_standard_class, "get_training_algorithm", get_training_algorithm, 0);
1569
+ rb_define_method(m_rb_fann_standard_class, "set_training_algorithm", set_training_algorithm, 1);
1570
+
1571
+
1572
+ // Cascade functions:
1573
+ rb_define_method(m_rb_fann_standard_class, "cascadetrain_on_data", cascadetrain_on_data, 4);
1574
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_output_change_fraction", get_cascade_output_change_fraction, 0);
1575
+ rb_define_method(m_rb_fann_standard_class, "set_cascade_output_change_fraction", set_cascade_output_change_fraction, 1);
1576
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_output_stagnation_epochs", get_cascade_output_stagnation_epochs, 0);
1577
+ rb_define_method(m_rb_fann_standard_class, "set_cascade_output_stagnation_epochs", set_cascade_output_stagnation_epochs, 1);
1578
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_candidate_change_fraction", get_cascade_candidate_change_fraction, 0);
1579
+ rb_define_method(m_rb_fann_standard_class, "set_cascade_candidate_change_fraction", set_cascade_candidate_change_fraction, 1);
1580
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_candidate_stagnation_epochs", get_cascade_candidate_stagnation_epochs, 0);
1581
+ rb_define_method(m_rb_fann_standard_class, "set_cascade_candidate_stagnation_epochs", set_cascade_candidate_stagnation_epochs, 1);
1582
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_weight_multiplier", get_cascade_weight_multiplier, 0);
1583
+ rb_define_method(m_rb_fann_standard_class, "set_cascade_weight_multiplier", set_cascade_weight_multiplier, 1);
1584
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_candidate_limit", get_cascade_candidate_limit, 0);
1585
+ rb_define_method(m_rb_fann_standard_class, "set_cascade_candidate_limit", set_cascade_candidate_limit, 1);
1586
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_max_out_epochs", get_cascade_max_out_epochs, 0);
1587
+ rb_define_method(m_rb_fann_standard_class, "set_cascade_max_out_epochs", set_cascade_max_out_epochs, 1);
1588
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_max_cand_epochs", get_cascade_max_cand_epochs, 0);
1589
+ rb_define_method(m_rb_fann_standard_class, "set_cascade_max_cand_epochs", set_cascade_max_cand_epochs, 1);
1590
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_num_candidates", get_cascade_num_candidates, 0);
1591
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_activation_functions_count", get_cascade_activation_functions_count, 0);
1592
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_activation_functions", get_cascade_activation_functions, 0);
1593
+ rb_define_method(m_rb_fann_standard_class, "set_cascade_activation_functions", set_cascade_activation_functions, 1);
1594
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_activation_steepnesses_count", get_cascade_activation_steepnesses_count, 0);
1595
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_activation_steepnesses", get_cascade_activation_steepnesses, 0);
1596
+ rb_define_method(m_rb_fann_standard_class, "set_cascade_activation_steepnesses", set_cascade_activation_steepnesses, 1);
1597
+ rb_define_method(m_rb_fann_standard_class, "get_cascade_num_candidate_groups", get_cascade_num_candidate_groups, 0);
1598
+ rb_define_method(m_rb_fann_standard_class, "set_cascade_num_candidate_groups", set_cascade_num_candidate_groups, 1);
1599
+ rb_define_method(m_rb_fann_standard_class, "save", nn_save, 1);
1600
+
1601
+
1602
+ // Uncomment for fixed-point mode (also recompile fann). Probably not going to be needed:
1603
+ //rb_define_method(clazz, "get_decimal_point", get_decimal_point, 0);
1604
+ //rb_define_method(clazz, "get_multiplier", get_multiplier, 0);
1605
+
1606
+ // Shortcut NN class (duplicated from above so that rdoc generation tools can find the methods:):
1607
+ m_rb_fann_shortcut_class = rb_define_class_under (m_rb_fann_module, "Shortcut", rb_cObject);
1608
+ rb_define_alloc_func (m_rb_fann_shortcut_class, fann_allocate);
1609
+ rb_define_method(m_rb_fann_shortcut_class, "initialize", fann_initialize, 1);
1610
+ rb_define_method(m_rb_fann_shortcut_class, "init_weights", init_weights, 1);
1611
+ rb_define_method(m_rb_fann_shortcut_class, "set_activation_function", set_activation_function, 3);
1612
+ rb_define_method(m_rb_fann_shortcut_class, "set_activation_function_hidden", set_activation_function_hidden, 1);
1613
+ rb_define_method(m_rb_fann_shortcut_class, "set_activation_function_layer", set_activation_function_layer, 2);
1614
+ rb_define_method(m_rb_fann_standard_class, "get_activation_function", get_activation_function, 2);
1615
+ rb_define_method(m_rb_fann_shortcut_class, "set_activation_function_output", set_activation_function_output, 1);
1616
+ rb_define_method(m_rb_fann_shortcut_class, "get_activation_steepness", get_activation_steepness, 2);
1617
+ rb_define_method(m_rb_fann_shortcut_class, "set_activation_steepness", set_activation_steepness, 3);
1618
+ rb_define_method(m_rb_fann_shortcut_class, "set_activation_steepness_hidden", set_activation_steepness_hidden, 1);
1619
+ rb_define_method(m_rb_fann_shortcut_class, "set_activation_steepness_layer", set_activation_steepness_layer, 2);
1620
+ rb_define_method(m_rb_fann_shortcut_class, "set_activation_steepness_output", set_activation_steepness_output, 1);
1621
+ rb_define_method(m_rb_fann_shortcut_class, "get_train_error_function", get_train_error_function, 0);
1622
+ rb_define_method(m_rb_fann_shortcut_class, "set_train_error_function", set_train_error_function, 1);
1623
+ rb_define_method(m_rb_fann_shortcut_class, "get_train_stop_function", get_train_stop_function, 0);
1624
+ rb_define_method(m_rb_fann_shortcut_class, "set_train_stop_function", set_train_stop_function, 1);
1625
+ rb_define_method(m_rb_fann_shortcut_class, "get_bit_fail_limit", get_bit_fail_limit, 0);
1626
+ rb_define_method(m_rb_fann_shortcut_class, "set_bit_fail_limit", set_bit_fail_limit, 1);
1627
+ rb_define_method(m_rb_fann_shortcut_class, "get_quickprop_decay", get_quickprop_decay, 0);
1628
+ rb_define_method(m_rb_fann_shortcut_class, "set_quickprop_decay", set_quickprop_decay, 1);
1629
+ rb_define_method(m_rb_fann_shortcut_class, "get_quickprop_mu", get_quickprop_mu, 0);
1630
+ rb_define_method(m_rb_fann_shortcut_class, "set_quickprop_mu", set_quickprop_mu, 1);
1631
+ rb_define_method(m_rb_fann_shortcut_class, "get_rprop_increase_factor", get_rprop_increase_factor, 0);
1632
+ rb_define_method(m_rb_fann_shortcut_class, "set_rprop_increase_factor", set_rprop_increase_factor, 1);
1633
+ rb_define_method(m_rb_fann_shortcut_class, "get_rprop_decrease_factor", get_rprop_decrease_factor, 0);
1634
+ rb_define_method(m_rb_fann_shortcut_class, "set_rprop_decrease_factor", set_rprop_decrease_factor, 1);
1635
+ rb_define_method(m_rb_fann_shortcut_class, "get_rprop_delta_max", get_rprop_delta_max, 0);
1636
+ rb_define_method(m_rb_fann_shortcut_class, "set_rprop_delta_max", set_rprop_delta_max, 1);
1637
+ rb_define_method(m_rb_fann_shortcut_class, "get_rprop_delta_min", get_rprop_delta_min, 0);
1638
+ rb_define_method(m_rb_fann_shortcut_class, "set_rprop_delta_min", set_rprop_delta_min, 1);
1639
+ rb_define_method(m_rb_fann_shortcut_class, "get_rprop_delta_zero", get_rprop_delta_zero, 0);
1640
+ rb_define_method(m_rb_fann_shortcut_class, "set_rprop_delta_zero", set_rprop_delta_zero, 1);
1641
+ rb_define_method(m_rb_fann_shortcut_class, "get_bias_array", get_bias_array, 0);
1642
+ rb_define_method(m_rb_fann_shortcut_class, "get_connection_rate", get_connection_rate, 0);
1643
+ rb_define_method(m_rb_fann_shortcut_class, "get_layer_array", get_layer_array, 0);
1644
+ rb_define_method(m_rb_fann_shortcut_class, "get_network_type", get_network_type, 0);
1645
+ rb_define_method(m_rb_fann_shortcut_class, "get_neurons", get_neurons, 0);
1646
+ rb_define_method(m_rb_fann_shortcut_class, "get_num_input", get_num_input, 0);
1647
+ rb_define_method(m_rb_fann_shortcut_class, "get_num_layers", get_num_layers, 0);
1648
+ rb_define_method(m_rb_fann_shortcut_class, "get_num_output", get_num_output, 0);
1649
+ rb_define_method(m_rb_fann_shortcut_class, "get_total_connections", get_total_connections, 0);
1650
+ rb_define_method(m_rb_fann_shortcut_class, "get_total_neurons", get_total_neurons, 0);
1651
+ rb_define_method(m_rb_fann_shortcut_class, "get_train_error_function", get_train_error_function, 0);
1652
+ rb_define_method(m_rb_fann_shortcut_class, "set_train_error_function", set_train_error_function, 1);
1653
+ rb_define_method(m_rb_fann_shortcut_class, "print_connections", print_connections, 0);
1654
+ rb_define_method(m_rb_fann_shortcut_class, "print_parameters", print_parameters, 0);
1655
+ rb_define_method(m_rb_fann_shortcut_class, "randomize_weights", randomize_weights, 2);
1656
+ rb_define_method(m_rb_fann_shortcut_class, "run", run, 1);
1657
+ rb_define_method(m_rb_fann_shortcut_class, "train_on_data", train_on_data, 4);
1658
+ rb_define_method(m_rb_fann_shortcut_class, "train_epoch", train_epoch, 1);
1659
+ rb_define_method(m_rb_fann_shortcut_class, "test_data", test_data, 1);
1660
+ rb_define_method(m_rb_fann_shortcut_class, "get_MSE", get_MSE, 0);
1661
+ rb_define_method(m_rb_fann_shortcut_class, "get_bit_fail", get_bit_fail, 0);
1662
+ rb_define_method(m_rb_fann_shortcut_class, "reset_MSE", reset_MSE, 0);
1663
+ rb_define_method(m_rb_fann_shortcut_class, "get_learning_rate", get_learning_rate, 0);
1664
+ rb_define_method(m_rb_fann_shortcut_class, "set_learning_rate", set_learning_rate, 1);
1665
+ rb_define_method(m_rb_fann_shortcut_class, "get_learning_momentum", get_learning_momentum, 0);
1666
+ rb_define_method(m_rb_fann_shortcut_class, "set_learning_momentum", set_learning_momentum, 1);
1667
+ rb_define_method(m_rb_fann_shortcut_class, "get_training_algorithm", get_training_algorithm, 0);
1668
+ rb_define_method(m_rb_fann_shortcut_class, "set_training_algorithm", set_training_algorithm, 1);
1669
+
1670
+ // Cascade functions:
1671
+ rb_define_method(m_rb_fann_shortcut_class, "cascadetrain_on_data", cascadetrain_on_data, 4);
1672
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_output_change_fraction", get_cascade_output_change_fraction, 0);
1673
+ rb_define_method(m_rb_fann_shortcut_class, "set_cascade_output_change_fraction", set_cascade_output_change_fraction, 1);
1674
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_output_stagnation_epochs", get_cascade_output_stagnation_epochs, 0);
1675
+ rb_define_method(m_rb_fann_shortcut_class, "set_cascade_output_stagnation_epochs", set_cascade_output_stagnation_epochs, 1);
1676
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_candidate_change_fraction", get_cascade_candidate_change_fraction, 0);
1677
+ rb_define_method(m_rb_fann_shortcut_class, "set_cascade_candidate_change_fraction", set_cascade_candidate_change_fraction, 1);
1678
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_candidate_stagnation_epochs", get_cascade_candidate_stagnation_epochs, 0);
1679
+ rb_define_method(m_rb_fann_shortcut_class, "set_cascade_candidate_stagnation_epochs", set_cascade_candidate_stagnation_epochs, 1);
1680
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_weight_multiplier", get_cascade_weight_multiplier, 0);
1681
+ rb_define_method(m_rb_fann_shortcut_class, "set_cascade_weight_multiplier", set_cascade_weight_multiplier, 1);
1682
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_candidate_limit", get_cascade_candidate_limit, 0);
1683
+ rb_define_method(m_rb_fann_shortcut_class, "set_cascade_candidate_limit", set_cascade_candidate_limit, 1);
1684
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_max_out_epochs", get_cascade_max_out_epochs, 0);
1685
+ rb_define_method(m_rb_fann_shortcut_class, "set_cascade_max_out_epochs", set_cascade_max_out_epochs, 1);
1686
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_max_cand_epochs", get_cascade_max_cand_epochs, 0);
1687
+ rb_define_method(m_rb_fann_shortcut_class, "set_cascade_max_cand_epochs", set_cascade_max_cand_epochs, 1);
1688
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_num_candidates", get_cascade_num_candidates, 0);
1689
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_activation_functions_count", get_cascade_activation_functions_count, 0);
1690
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_activation_functions", get_cascade_activation_functions, 0);
1691
+ rb_define_method(m_rb_fann_shortcut_class, "set_cascade_activation_functions", set_cascade_activation_functions, 1);
1692
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_activation_steepnesses_count", get_cascade_activation_steepnesses_count, 0);
1693
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_activation_steepnesses", get_cascade_activation_steepnesses, 0);
1694
+ rb_define_method(m_rb_fann_shortcut_class, "set_cascade_activation_steepnesses", set_cascade_activation_steepnesses, 1);
1695
+ rb_define_method(m_rb_fann_shortcut_class, "get_cascade_num_candidate_groups", get_cascade_num_candidate_groups, 0);
1696
+ rb_define_method(m_rb_fann_shortcut_class, "set_cascade_num_candidate_groups", set_cascade_num_candidate_groups, 1);
1697
+ rb_define_method(m_rb_fann_shortcut_class, "save", nn_save, 1);
1698
+
1699
+
1700
+ // TrainData NN class:
1701
+ m_rb_fann_train_data_class = rb_define_class_under (m_rb_fann_module, "TrainData", rb_cObject);
1702
+ rb_define_alloc_func (m_rb_fann_train_data_class, fann_training_data_allocate);
1703
+ rb_define_method(m_rb_fann_train_data_class, "initialize", fann_train_data_initialize, 1);
1704
+ rb_define_method(m_rb_fann_train_data_class, "length", length_train_data, 0);
1705
+ rb_define_method(m_rb_fann_train_data_class, "shuffle", shuffle, 0);
1706
+ rb_define_method(m_rb_fann_train_data_class, "save", training_save, 1);
1707
+
1708
+ // printf("Initialized Ruby Bindings for FANN.\n");
1695
1709
  }
1696
1710