ruby-fann 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+