ruby-fann 0.7.1

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.
@@ -0,0 +1,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
@@ -0,0 +1,17 @@
1
+ desc 'Generate website files'
2
+ task :website_generate => :ruby_env do
3
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
+ end
6
+ end
7
+
8
+ desc 'Upload website files to rubyforge'
9
+ task :website_upload do
10
+ host = "#{rubyforge_username}@rubyforge.org"
11
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
+ local_dir = 'website'
13
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
+ end
15
+
16
+ desc 'Generate and upload website files'
17
+ task :website => [:website_generate, :website_upload, :publish_docs]
@@ -0,0 +1,2 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/ruby_fann'
@@ -0,0 +1,36 @@
1
+ require 'test/unit'
2
+ require "rubygems"
3
+ require "graphviz"
4
+ require 'ext/ruby_fann/neural_network'
5
+ require 'lib/ruby_fann/neurotica'
6
+
7
+ class NeuroticaTest < Test::Unit::TestCase
8
+ def test_basic_output
9
+
10
+ train = RubyFann::TrainData.new(
11
+ :inputs=>[[0.3, 0.4, 0.5, 1.0, -1.0], [0.1, 0.2, 0.3, 1.0, 1.0], [0.6, 0.74, 0.58, -1.0, -1.0], [0.109, 0.677, 0.21, -1.0, 1.0]],
12
+ :desired_outputs=>[[0.7, 0.4, 0.9], [0.8, -0.2, -0.5], [-0.33, 0.34, -0.22], [0.129, -0.87, 0.25]])
13
+
14
+ neural_net = RubyFann::Standard.new(:num_inputs=>3, :hidden_neurons=>[4, 7, 9, 3, 5], :num_outputs=>3)
15
+ neural_net.train_on_data(train, 100, 20, 0.01)
16
+
17
+ # train = RubyFann::TrainData.new(:inputs=>[[0.3, 0.4, 0.5], [0.1, 0.2, 0.3]], :desired_outputs=>[[0.7], [0.8]])
18
+ neural_net = RubyFann::Shortcut.new(:num_inputs=>3, :num_outputs=>3)
19
+ neural_net.cascadetrain_on_data(train, 5, 10, 0.1)
20
+
21
+
22
+ neurotica = RubyFann::Neurotica.new
23
+
24
+ neurotica.graph(neural_net, "neurotica1.png")
25
+ end
26
+
27
+ def test_3d_output
28
+ train = RubyFann::TrainData.new(:inputs=>[[0.3, 0.4, 0.5], [0.1, 0.2, 0.3]], :desired_outputs=>[[0.7], [0.8]])
29
+ #neural_net = RubyFann::Shortcut.new(9, 5, [2, 4, 12, 8, 4, 3, 4], 1)
30
+ neural_net = RubyFann::Shortcut.new(:num_inputs=>4, :num_outputs=>1)
31
+ neural_net.cascadetrain_on_data(train, 1000, 100, 0.1)
32
+ neurotica = RubyFann::Neurotica.new
33
+ neurotica.graph(neural_net, "neurotica2.vrml", :three_dimensional=>true)
34
+ assert(File.exist?('neurotica2.vrml'))
35
+ end
36
+ end
@@ -0,0 +1,390 @@
1
+ require 'test/unit'
2
+ require 'ext/ruby_fann/neural_network'
3
+
4
+ class MyShortcut < RubyFann::Shortcut
5
+ def initialize
6
+ super(:num_inputs=>5, :num_outputs=>1)
7
+ end
8
+ end
9
+
10
+ class RubyFannTest < Test::Unit::TestCase
11
+ def test_create_standard
12
+ fann = RubyFann::Standard.new(:num_inputs=>1, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1)
13
+ assert(fann)
14
+ end
15
+
16
+ def test_create_shortcut
17
+ fann = RubyFann::Shortcut.new(:num_inputs=>5, :num_outputs=>1)
18
+
19
+ assert(fann)
20
+
21
+ assert_equal(2, fann.get_num_layers)
22
+ assert_equal(5, fann.get_num_input)
23
+ assert_equal(1, fann.get_num_output)
24
+
25
+ fann2 = RubyFann::Shortcut.new(:num_inputs=>1, :num_outputs=>2)
26
+ assert(fann2)
27
+ assert_equal(2, fann2.get_num_layers)
28
+ assert_equal(1, fann2.get_num_input)
29
+ assert_equal(2, fann2.get_num_output)
30
+ assert_equal(:fann_nettype_shortcut, fann.get_network_type)
31
+
32
+ sc = MyShortcut.new
33
+ end
34
+
35
+ def test_raises
36
+ fann = nil
37
+ assert_raises(TypeError) { fann = RubyFann::Standard.new(:num_inputs=>'foo', :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1)}
38
+ assert_nil(fann)
39
+ assert_raises(ArgumentError) { fann = RubyFann::Standard.new(4, 1, [3, 4], 1) }
40
+ assert_nil(fann)
41
+ assert_nothing_raised { fann = RubyFann::Standard.new(:num_inputs=>4, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1) }
42
+ assert(fann)
43
+ end
44
+
45
+ def test_run
46
+ fann = RubyFann::Standard.new(:num_inputs=>4, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1)
47
+ outputs = fann.run([3.0, 2.0, 3.0, 4.0])
48
+ assert_equal(1, outputs.length)
49
+ end
50
+
51
+ def test_print_parameters
52
+ fann = RubyFann::Standard.new(:num_inputs=>4, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1)
53
+ fann.print_parameters
54
+ end
55
+
56
+ def test_accessors
57
+ fann = RubyFann::Standard.new(:num_inputs=>4, :hidden_neurons=>[3, 4, 3], :num_outputs=>1)
58
+ assert_equal(5, fann.get_num_layers)
59
+ assert_equal(4, fann.get_num_input)
60
+ assert_equal(1, fann.get_num_output)
61
+ puts "TN: #{fann.get_total_neurons}"
62
+ puts "TC: #{fann.get_total_connections}"
63
+ fann.print_parameters
64
+ assert_equal(19, fann.get_total_neurons)
65
+ end
66
+
67
+ def test_randomize_weights
68
+ fann = RubyFann::Standard.new(:num_inputs=>4, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1)
69
+ fann.randomize_weights(-1.0, 1.0)
70
+ end
71
+
72
+ def test_init_weights
73
+ fann = RubyFann::Standard.new(:num_inputs=>4, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1)
74
+ training = RubyFann::TrainData.new(:filename=>'test/test.train')
75
+ fann.init_weights(training)
76
+ end
77
+
78
+
79
+ def test_print_connections
80
+ fann = RubyFann::Standard.new(:num_inputs=>4, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1)
81
+ fann.print_connections
82
+ end
83
+
84
+ def test_connection_rate
85
+ fann = RubyFann::Standard.new(:num_inputs=>4, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1)
86
+ cr = fann.get_connection_rate
87
+ assert_equal(1, cr)
88
+ end
89
+
90
+ def test_layer_array
91
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
92
+ layers = fann.get_layer_array
93
+ assert_equal([5, 2, 8, 4, 3, 4, 1], layers)
94
+ end
95
+
96
+ def test_bias_array
97
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 4, 3, 4], :num_outputs=>1)
98
+ bias = fann.get_bias_array
99
+ assert_equal([1, 1, 1, 1, 1, 0], bias)
100
+ end
101
+
102
+
103
+ def test_get_network_type
104
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
105
+ assert_equal(:fann_nettype_layer, fann.get_network_type)
106
+ puts "fann.get_network_type: #{fann.get_network_type}"
107
+ end
108
+
109
+ def test_train_file
110
+ training = RubyFann::TrainData.new(:filename=>'test/test.train')
111
+ training.save('verify.train')
112
+ assert(File.exist?('verify.train'))
113
+ test_train_txt = File.read('test/test.train')
114
+ verify_train_txt = File.read('verify.train')
115
+ assert_equal(verify_train_txt, test_train_txt)
116
+ end
117
+
118
+ def test_train_creation_data
119
+ training = RubyFann::TrainData.new(:inputs=>[[0.3, 0.4, 0.5], [0.1, 0.2, 0.3]], :desired_outputs=>[[0.7], [0.8]])
120
+ training.save('verify.train')
121
+ verify_lines = File.readlines('verify.train')
122
+ assert_equal(5, verify_lines.length)
123
+ assert_match(/2 3 1/, verify_lines[0])
124
+ assert_match(/0.30* 0.40* 0.50*/, verify_lines[1])
125
+ assert_match(/0.7/, verify_lines[2])
126
+ assert_match(/0.10* 0.20* 0.30*/, verify_lines[3])
127
+ assert_match(/0.8/, verify_lines[4])
128
+ end
129
+
130
+ def test_train_on_data
131
+ train = RubyFann::TrainData.new(:inputs=>[[0.3, 0.4, 0.5], [0.1, 0.2, 0.3]], :desired_outputs=>[[0.7], [0.8]])
132
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
133
+ fann.train_on_data(train, 1000, 10, 0.1)
134
+ outputs = fann.run([3.0, 2.0, 3.0])
135
+ puts "OUTPUT FROM RUN WAS #{outputs.inspect}"
136
+ end
137
+
138
+ def test_activation_function
139
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
140
+ fann.set_activation_function(:linear, 1, 2)
141
+ assert_raises(TypeError) { fann.set_activation_function('linear', 1, 2) }
142
+ end
143
+
144
+ def test_activation_function_hidden
145
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
146
+ fann.set_activation_function_hidden(:linear)
147
+ assert_raises(RuntimeError) { fann.set_activation_function_hidden(:fake) }
148
+ fann.set_activation_function_hidden(:elliot)
149
+ end
150
+
151
+ def test_activation_function_output
152
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
153
+ fann.set_activation_function_output(:linear)
154
+ assert_raises(RuntimeError) { fann.set_activation_function_output(:fake) }
155
+ fann.set_activation_function_output(:elliot)
156
+ end
157
+
158
+ def test_activation_steepness
159
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
160
+ fann.set_activation_steepness(0.2, 2, 3)
161
+ assert_equal(0.2, fann.get_activation_steepness(2, 3))
162
+ end
163
+
164
+ def test_activation_steepness_hidden
165
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
166
+ fann.set_activation_steepness_hidden(0.345)
167
+ 1.upto(5) {|i|assert_equal(0.345, fann.get_activation_steepness(i, 1)) }
168
+ end
169
+
170
+ def test_activation_steepness_layer
171
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
172
+ fann.set_activation_steepness_layer(0.7000, 3)
173
+ assert_equal(0.7000, fann.get_activation_steepness(3, 1))
174
+ end
175
+
176
+ def test_activation_steepness_output
177
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
178
+ fann.set_activation_steepness_output(0.888)
179
+ assert_equal(0.888, fann.get_activation_steepness(6, 1))
180
+ end
181
+
182
+ def test_training_function
183
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
184
+ fann.set_train_error_function(:tanh)
185
+ assert_equal(:tanh, fann.get_train_error_function())
186
+
187
+ fann2 = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
188
+ fann2.set_train_error_function(:linear)
189
+ assert_equal(:linear, fann2.get_train_error_function())
190
+ assert_raises(RuntimeError) { fann2.set_train_error_function(:fake) }
191
+ end
192
+
193
+ def test_training_stop
194
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
195
+ fann.set_train_stop_function(:mse)
196
+ assert_equal(:mse, fann.get_train_stop_function())
197
+
198
+ fann2 = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
199
+ fann2.set_train_stop_function(:bit)
200
+ assert_equal(:bit, fann2.get_train_stop_function())
201
+
202
+ assert_raises(RuntimeError) { fann2.set_train_stop_function(:fake) }
203
+ end
204
+
205
+ def test_save
206
+ fann = RubyFann::Standard.new(:num_inputs=>5, :hidden_neurons=>[2, 8, 4, 3, 4], :num_outputs=>1)
207
+ fann.save('foo.net')
208
+ assert(File.exist?('foo.net'))
209
+ File.delete('foo.net')
210
+ end
211
+
212
+ def test_training_algorithm
213
+ verify_fann_attribute(:training_algorithm, :rprop)
214
+ end
215
+
216
+ def test_bit_fail_limit
217
+ verify_fann_attribute(:bit_fail_limit, 0.743)
218
+ end
219
+
220
+ def test_quickprop_decay
221
+ verify_fann_attribute(:quickprop_decay, 0.211)
222
+ end
223
+
224
+ def test_quickprop_mu
225
+ verify_fann_attribute(:quickprop_mu, 0.912)
226
+ end
227
+
228
+ def test_rprop_increase_factor
229
+ verify_fann_attribute(:rprop_increase_factor, 0.743)
230
+ end
231
+
232
+ def test_rprop_decrease_factor
233
+ verify_fann_attribute(:rprop_decrease_factor, 0.190)
234
+ end
235
+
236
+ def test_rprop_delta_min
237
+ verify_fann_attribute(:rprop_delta_min, 0.277)
238
+ end
239
+
240
+ def test_rprop_delta_max
241
+ verify_fann_attribute(:rprop_delta_max, 0.157)
242
+ end
243
+
244
+ def test_rprop_delta_zero
245
+ verify_fann_attribute(:rprop_delta_zero, 0.571)
246
+ end
247
+
248
+ def test_learning_momentum
249
+ verify_fann_attribute(:learning_momentum, 0.231)
250
+ end
251
+
252
+ def test_learning_rate
253
+ verify_fann_attribute(:learning_rate, 0.012)
254
+ end
255
+
256
+ def test_cascade_train
257
+ train = RubyFann::TrainData.new(:inputs=>[[0.3, 0.4, 0.5], [0.1, 0.2, 0.3]], :desired_outputs=>[[0.7], [0.8]])
258
+ fann = RubyFann::Shortcut.new(:num_inputs=>5, :num_outputs=>1) # RubyFann::Shortcut.new(7, 5, [2, 8, 4, 3, 4], 1)
259
+ fann.cascadetrain_on_data(train, 1000, 10, 0.1)
260
+ end
261
+
262
+ def test_get_neurons
263
+ train = RubyFann::TrainData.new(:inputs=>[[0.3, 0.4, 0.5], [0.1, 0.2, 0.3]], :desired_outputs=>[[0.7, 0.3], [0.8, 0.4]])
264
+ fann = RubyFann::Shortcut.new(:num_inputs=>5, :num_outputs=>2) # RubyFann::Shortcut.new(7, 5, [2, 8, 4, 3, 4], 1)
265
+ fann.cascadetrain_on_data(train, 30, 10, 0.0000000000001)
266
+ neurons = fann.get_neurons()
267
+ assert_equal(38, neurons.length)
268
+ neurons.each_with_index {|n, i| puts "NEURON[#{i}]: #{n.inspect}" }
269
+ end
270
+
271
+ def test_cascade_output_change_fraction
272
+ verify_fann_attribute(:cascade_output_change_fraction, 0.222)
273
+ end
274
+
275
+ def test_cascade_output_stagnation_epochs
276
+ verify_fann_attribute(:cascade_output_stagnation_epochs, 4)
277
+ end
278
+
279
+ def test_cascade_candidate_change_fraction
280
+ verify_fann_attribute(:cascade_candidate_change_fraction, 0.987)
281
+ end
282
+
283
+ def test_cascade_candidate_stagnation_epochs
284
+ verify_fann_attribute(:cascade_candidate_stagnation_epochs, 5)
285
+ end
286
+
287
+ def test_cascade_weight_multiplier
288
+ verify_fann_attribute(:cascade_weight_multiplier, 0.754)
289
+ end
290
+
291
+ def test_cascade_candidate_limit
292
+ verify_fann_attribute(:cascade_candidate_limit, 0.222)
293
+ end
294
+
295
+ def test_cascade_cascade_max_out_epochs
296
+ verify_fann_attribute(:cascade_max_out_epochs, 77)
297
+ end
298
+
299
+ def test_cascade_max_cand_epochs
300
+ verify_fann_attribute(:cascade_max_cand_epochs, 66)
301
+ end
302
+
303
+ def test_cascade_num_candidate_groups
304
+ verify_fann_attribute(:cascade_num_candidate_groups, 6)
305
+ end
306
+
307
+ def test_cascade_num_candidates
308
+ fann = RubyFann::Standard.new(:num_inputs=>1, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1) # RubyFann::Standard.new(7, 5, [2, 8, 4, 3, 4], 1)
309
+ x = fann.get_cascade_activation_functions_count
310
+ y = fann.get_cascade_activation_steepnesses_count
311
+ z = fann.get_cascade_num_candidate_groups
312
+ assert_equal((x * y * z), fann.get_cascade_num_candidates)
313
+ end
314
+
315
+ def test_cascade_activation_functions
316
+ fann = RubyFann::Standard.new(:num_inputs=>1, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1) # RubyFann::Standard.new(7, 5, [2, 8, 4, 3, 4], 1)
317
+ fann.set_cascade_activation_functions([:threshold, :sigmoid])
318
+ assert_equal(2, fann.get_cascade_activation_functions_count)
319
+ assert_equal([:threshold, :sigmoid], fann.get_cascade_activation_functions)
320
+ end
321
+
322
+ def test_cascade_activation_steepness
323
+ fann = RubyFann::Standard.new(:num_inputs=>1, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1) # RubyFann::Standard.new(7, 5, [2, 8, 4, 3, 4], 1)
324
+ fann.set_cascade_activation_steepnesses([0.1, 0.3, 0.7, 0.5])
325
+ assert_equal(4, fann.get_cascade_activation_steepnesses_count)
326
+ assert_equal([0.1, 0.3, 0.7, 0.5], fann.get_cascade_activation_steepnesses)
327
+ end
328
+
329
+ def test_train_exception
330
+ # Mismatched inputs & outputs
331
+ assert_raises(RuntimeError) {
332
+ RubyFann::TrainData.new(
333
+ {
334
+ :inputs=>[[0.2, 0.3, 0.4], [0.8, 0.9, 0.7]],
335
+ :desired_outputs=>[[3.14]]
336
+ }
337
+ )
338
+ }
339
+
340
+ # Wrong arg type:
341
+ assert_raises(TypeError) { RubyFann::TrainData.new('not_a_hash') }
342
+
343
+ # Bad key in hash:
344
+ assert_raises(RuntimeError) { RubyFann::TrainData.new({:not_a_real_value=>1}) }
345
+
346
+ # Bad value in hash:
347
+ assert_raises(RuntimeError) { RubyFann::TrainData.new({:inputs=>1, :desired_outputs=>2}) }
348
+
349
+ # Inconsistent inputs
350
+ assert_raises(RuntimeError) {
351
+ RubyFann::TrainData.new(
352
+ {
353
+ :inputs=>[[0.2, 0.3, 0.4], [0.8]],
354
+ :desired_outputs=>[[3.14], [4.33]]
355
+ }
356
+ )
357
+ }
358
+
359
+ # Inconsistent outputs
360
+ assert_raises(RuntimeError) {
361
+ RubyFann::TrainData.new(
362
+ {
363
+ :inputs=>[[0.2, 0.3, 0.4], [0.5, 0.8, 0.7]],
364
+ :desired_outputs=>[[3.14], [0.4, 0.5]]
365
+ }
366
+ )
367
+ }
368
+
369
+ # No errors:
370
+ assert_nothing_raised(){
371
+ RubyFann::TrainData.new(
372
+ {
373
+ :inputs=>[[0.2, 0.3, 0.4], [0.8, 0.9, 0.7]],
374
+ :desired_outputs=>[[3.14], [6.33]]
375
+ }
376
+ )
377
+ }
378
+
379
+ end
380
+
381
+ private
382
+ # Set & get fann attribute & verify:
383
+ def verify_fann_attribute(attr, val)
384
+ fann = RubyFann::Standard.new(:num_inputs=>1, :hidden_neurons=>[3, 4, 3, 4], :num_outputs=>1)
385
+ fann.send("set_#{attr}", val)
386
+ assert_equal(val, fann.send("get_#{attr}"))
387
+ end
388
+
389
+ end
390
+