tlearn 0.0.1 → 0.0.2
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.
- data/ext/tlearn/subs.c +2 -1
- data/ext/tlearn/tlearn_ext.c +74 -47
- data/ext/tlearn/update.c +3 -2
- data/lib/tlearn/config.rb +33 -11
- data/lib/tlearn/run.rb +4 -4
- data/lib/tlearn/run_tlearn.rb +6 -6
- metadata +5 -4
data/ext/tlearn/subs.c
CHANGED
@@ -47,6 +47,8 @@ extern long rms_report; /* report error every report sweeps */
|
|
47
47
|
|
48
48
|
extern float criterion; /* exit program when rms error < criterion */
|
49
49
|
|
50
|
+
extern int start = 1;
|
51
|
+
|
50
52
|
|
51
53
|
float rans(w)
|
52
54
|
float w;
|
@@ -109,7 +111,6 @@ print_output(aold)
|
|
109
111
|
print_error(e)
|
110
112
|
float *e;
|
111
113
|
{
|
112
|
-
static int start = 1;
|
113
114
|
static FILE *fp;
|
114
115
|
|
115
116
|
FILE *fopen();
|
data/ext/tlearn/tlearn_ext.c
CHANGED
@@ -76,6 +76,8 @@ extern int *outputs; /* (no) indices of output nodes */
|
|
76
76
|
extern int *selects; /* (nn+1) nodes selected for probe printout */
|
77
77
|
extern int *linput; /* (ni) localist input array */
|
78
78
|
|
79
|
+
extern float *otarget;
|
80
|
+
|
79
81
|
extern float *znew; /* (nt) inputs and activations at time t+1 */
|
80
82
|
extern float *zold; /* (nt) inputs and activations at time t */
|
81
83
|
extern float *zmem; /* (nt) inputs and activations at time t */
|
@@ -107,6 +109,7 @@ extern int localist; /* flag for speed-up with localist inputs */
|
|
107
109
|
extern int randomly; /* flag for presenting inputs in random order */
|
108
110
|
extern int limits; /* flag for limited weights */
|
109
111
|
extern int ce; /* flag for cross_entropy */
|
112
|
+
extern int start;
|
110
113
|
|
111
114
|
extern char root[128]; /* root filename for .cf, .data, .teach, etc.*/
|
112
115
|
extern char loadfile[128]; /* filename for weightfile to be read in */
|
@@ -152,6 +155,70 @@ int run_fitness(argc,argv, nsweeps, file_path, current_weights_output)
|
|
152
155
|
return(status);
|
153
156
|
}
|
154
157
|
|
158
|
+
void post_cleanup(){
|
159
|
+
free(outputs);
|
160
|
+
free(selects);
|
161
|
+
free(linput);
|
162
|
+
|
163
|
+
free(ninfo);
|
164
|
+
free(cinfo);
|
165
|
+
|
166
|
+
free(znew);
|
167
|
+
free(zold);
|
168
|
+
free(zmem);
|
169
|
+
free(wt);
|
170
|
+
free(dwt);
|
171
|
+
free(winc);
|
172
|
+
free(target);
|
173
|
+
free(error);
|
174
|
+
free(pnew);
|
175
|
+
free(pold);
|
176
|
+
|
177
|
+
free(otarget);
|
178
|
+
free(data);
|
179
|
+
}
|
180
|
+
|
181
|
+
void cleanup_horrid_globals(){
|
182
|
+
optind = 1;
|
183
|
+
sweep = 0;
|
184
|
+
tsweeps = 0;
|
185
|
+
rate = .1;
|
186
|
+
momentum = 0.;
|
187
|
+
weight_limit = 1.;
|
188
|
+
criterion = 0.;
|
189
|
+
init_bias = 0.;
|
190
|
+
rms_report = 0;
|
191
|
+
ngroups = 0;
|
192
|
+
teacher = 0;
|
193
|
+
localist = 0;
|
194
|
+
randomly = 0;
|
195
|
+
limits = 0;
|
196
|
+
ce = 0;
|
197
|
+
outputs = 0;
|
198
|
+
selects = 0;
|
199
|
+
linput = 0;
|
200
|
+
cinfo = 0;
|
201
|
+
ninfo = 0;
|
202
|
+
znew = 0;
|
203
|
+
zold = 0;
|
204
|
+
zmem = 0;
|
205
|
+
pnew = 0;
|
206
|
+
pold = 0;
|
207
|
+
wt = 0;
|
208
|
+
dwt = 0;
|
209
|
+
winc = 0;
|
210
|
+
target = 0;
|
211
|
+
error = 0;
|
212
|
+
cfp = 0;
|
213
|
+
data = 0;
|
214
|
+
ngroups = 0;
|
215
|
+
root[0] = 0;
|
216
|
+
loadfile[0] = 0;
|
217
|
+
|
218
|
+
otarget = 0;
|
219
|
+
start = 1;
|
220
|
+
}
|
221
|
+
|
155
222
|
int run(argc,argv, nsweeps, file_path, backprop, current_weights_output)
|
156
223
|
int argc;
|
157
224
|
char **argv;
|
@@ -160,42 +227,8 @@ int run(argc,argv, nsweeps, file_path, backprop, current_weights_output)
|
|
160
227
|
int backprop;
|
161
228
|
float *current_weights_output;
|
162
229
|
{
|
163
|
-
|
164
|
-
|
165
|
-
sweep = 0;
|
166
|
-
tsweeps = 0;
|
167
|
-
rate = .1;
|
168
|
-
momentum = 0.;
|
169
|
-
weight_limit = 1.;
|
170
|
-
criterion = 0.;
|
171
|
-
init_bias = 0.;
|
172
|
-
rms_report = 0;
|
173
|
-
ngroups = 0;
|
174
|
-
teacher = 0;
|
175
|
-
localist = 0;
|
176
|
-
randomly = 0;
|
177
|
-
limits = 0;
|
178
|
-
ce = 0;
|
179
|
-
outputs = 0;
|
180
|
-
selects = 0;
|
181
|
-
linput = 0;
|
182
|
-
cinfo = 0;
|
183
|
-
ninfo = 0;
|
184
|
-
znew = 0;
|
185
|
-
zold = 0;
|
186
|
-
zmem = 0;
|
187
|
-
pnew = 0;
|
188
|
-
pold = 0;
|
189
|
-
wt = 0;
|
190
|
-
dwt = 0;
|
191
|
-
winc = 0;
|
192
|
-
target = 0;
|
193
|
-
error = 0;
|
194
|
-
cfp = 0;
|
195
|
-
data = 0;
|
196
|
-
ngroups = 0;
|
197
|
-
root[0] = 0;
|
198
|
-
loadfile[0] = 0;
|
230
|
+
|
231
|
+
cleanup_horrid_globals();
|
199
232
|
|
200
233
|
FILE *fopen();
|
201
234
|
FILE *fpid;
|
@@ -479,8 +512,6 @@ int run(argc,argv, nsweeps, file_path, backprop, current_weights_output)
|
|
479
512
|
for (i = 0; i < no; i++){
|
480
513
|
current_weights_output[i] = zold[ni+outputs[i]];
|
481
514
|
}
|
482
|
-
|
483
|
-
//print_output(zold);
|
484
515
|
}
|
485
516
|
if (rms_report && (++rtime >= rms_report)){
|
486
517
|
rtime = 0;
|
@@ -513,15 +544,6 @@ int run(argc,argv, nsweeps, file_path, backprop, current_weights_output)
|
|
513
544
|
|
514
545
|
/* -- Ruby interface -- */
|
515
546
|
|
516
|
-
int do_print(VALUE key, VALUE val, VALUE in) {
|
517
|
-
fprintf(stderr, "Input data is %s\n", StringValueCStr(in));
|
518
|
-
|
519
|
-
fprintf(stderr, "Key %s=>Value %s\n", StringValueCStr(key),
|
520
|
-
StringValueCStr(val));
|
521
|
-
|
522
|
-
return ST_CONTINUE;
|
523
|
-
}
|
524
|
-
|
525
547
|
static VALUE tlearn_train(VALUE self, VALUE config) {
|
526
548
|
VALUE sweeps_value = rb_hash_aref(config, ID2SYM(rb_intern("sweeps")));
|
527
549
|
long nsweeps = NUM2DBL(sweeps_value);
|
@@ -532,6 +554,9 @@ static VALUE tlearn_train(VALUE self, VALUE config) {
|
|
532
554
|
float current_weights_output[6];
|
533
555
|
|
534
556
|
int result = run_training(nsweeps, file_root, current_weights_output);
|
557
|
+
|
558
|
+
post_cleanup();
|
559
|
+
|
535
560
|
return rb_int_new(result);
|
536
561
|
}
|
537
562
|
|
@@ -561,6 +586,8 @@ static VALUE tlearn_fitness(VALUE self, VALUE config) {
|
|
561
586
|
|
562
587
|
int failure = run_fitness(tlearn_args_count, tlearn_args, nsweeps, file_root, current_weights_output);
|
563
588
|
|
589
|
+
post_cleanup();
|
590
|
+
|
564
591
|
if(failure == 0){
|
565
592
|
float weight;
|
566
593
|
int result_index;
|
data/ext/tlearn/update.c
CHANGED
@@ -50,6 +50,9 @@ extern int randomly; /* flag for presenting inputs in random order */
|
|
50
50
|
extern int localist; /* flag for localist inputs */
|
51
51
|
extern int limits; /* flag for limited weights */
|
52
52
|
|
53
|
+
extern float *otarget = 0; /* (no) back-up copy of target values */
|
54
|
+
|
55
|
+
|
53
56
|
long dc = 0;
|
54
57
|
int *ldata = 0;
|
55
58
|
|
@@ -246,8 +249,6 @@ update_targets(atarget,time,tick,flag,maxtime)
|
|
246
249
|
|
247
250
|
static long next; /* next time tag in .teach file */
|
248
251
|
|
249
|
-
static float *otarget = 0; /* (no) back-up copy of target values */
|
250
|
-
|
251
252
|
static FILE *fp;
|
252
253
|
|
253
254
|
char buf[128];
|
data/lib/tlearn/config.rb
CHANGED
@@ -5,10 +5,14 @@ module TLearn
|
|
5
5
|
NUMBER_OF_RESET_TIMEPOINTS = 3497
|
6
6
|
DEFAULT_NUMBER_OF_SWEEPS = 1333000
|
7
7
|
|
8
|
-
def initialize(config)
|
9
|
-
@connections_config = config
|
10
|
-
@
|
11
|
-
@
|
8
|
+
def initialize(config, working_dir = nil)
|
9
|
+
@connections_config = config.delete(:connections) || {}
|
10
|
+
@config = config || {}
|
11
|
+
@working_dir = working_dir || WORKING_DIR
|
12
|
+
end
|
13
|
+
|
14
|
+
def working_dir
|
15
|
+
@working_dir
|
12
16
|
end
|
13
17
|
|
14
18
|
def setup_config(training_data)
|
@@ -30,21 +34,35 @@ module TLearn
|
|
30
34
|
end
|
31
35
|
|
32
36
|
def file_root
|
33
|
-
"#{
|
37
|
+
"#{working_dir}/#{TLEARN_NAMESPACE}"
|
34
38
|
end
|
35
39
|
|
36
40
|
private
|
37
41
|
|
38
42
|
def connections_ranges_to_strings(connections_config)
|
39
|
-
connections_config.map{|hash| {hash.keys[0]
|
43
|
+
connections_config.map{|hash| {input_to_config_string(hash.keys[0]) => input_to_config_string(hash.values[0])}}
|
44
|
+
end
|
45
|
+
|
46
|
+
def input_to_config_string(input)
|
47
|
+
if input.is_a?(Hash)
|
48
|
+
"#{input[:min]} & #{input[:max]}"
|
49
|
+
elsif input.is_a?(Range)
|
50
|
+
input.to_s.gsub('..','-')
|
51
|
+
elsif input.is_a?(Array)
|
52
|
+
values = input.map{|value| input_to_config_string(value)}
|
53
|
+
values[0] = values[0] + " ="
|
54
|
+
values.join(" ").gsub('one_to_one', 'one-to-one')
|
55
|
+
else
|
56
|
+
input
|
57
|
+
end
|
40
58
|
end
|
41
59
|
|
42
60
|
def evaulator_config(training_data)
|
43
61
|
nodes_config = {
|
44
|
-
:nodes => @
|
62
|
+
:nodes => @config[:number_of_nodes],
|
45
63
|
:inputs => training_data.no_of_inputs,
|
46
64
|
:outputs => training_data.no_of_outputs,
|
47
|
-
:output_nodes => @
|
65
|
+
:output_nodes => input_to_config_string(@config[:output_nodes])
|
48
66
|
}
|
49
67
|
|
50
68
|
@connections_config = connections_ranges_to_strings(@connections_config)
|
@@ -53,9 +71,13 @@ module TLearn
|
|
53
71
|
node_config_strings = nodes_config.map{|key,value| "#{key.to_s.gsub('_',' ')} = #{value}" }
|
54
72
|
node_config_strings << "output nodes are #{output_nodes}"
|
55
73
|
|
56
|
-
connection_config_strings = @connections_config.map{|mapping| "#{mapping.keys[0]} from #{mapping.values[0]}" }
|
74
|
+
connection_config_strings = @connections_config.map{|mapping| "#{mapping.keys[0]} from #{input_to_config_string(mapping.values[0])}" }
|
57
75
|
connection_config_strings = ["groups = #{0}"] + connection_config_strings
|
58
|
-
|
76
|
+
|
77
|
+
special_config = {}
|
78
|
+
special_config[:linear] = @config[:linear]
|
79
|
+
special_config[:weight_limit] = @config[:weight_limit]
|
80
|
+
special_config[:selected] = @config[:selected]
|
59
81
|
|
60
82
|
config = <<EOS
|
61
83
|
NODES:
|
@@ -63,7 +85,7 @@ NODES:
|
|
63
85
|
CONNECTIONS:
|
64
86
|
#{connection_config_strings.join("\n")}
|
65
87
|
SPECIAL:
|
66
|
-
#{
|
88
|
+
#{special_config.map{|key,value| "#{key} = #{input_to_config_string(value)}" }.join("\n")}
|
67
89
|
EOS
|
68
90
|
end
|
69
91
|
|
data/lib/tlearn/run.rb
CHANGED
@@ -6,8 +6,8 @@ module TLearn
|
|
6
6
|
@out = out
|
7
7
|
end
|
8
8
|
|
9
|
-
def train(data, number_of_sweeps = nil)
|
10
|
-
run_tlearn = RunTLearn.new(@config)
|
9
|
+
def train(data, number_of_sweeps = nil, working_dir = nil)
|
10
|
+
run_tlearn = RunTLearn.new(@config, working_dir)
|
11
11
|
|
12
12
|
results = run_tlearn.train(TrainingData.new(data), number_of_sweeps)
|
13
13
|
|
@@ -19,8 +19,8 @@ module TLearn
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
def fitness(data, number_of_sweeps = nil)
|
23
|
-
run_tlearn = RunTLearn.new(@config)
|
22
|
+
def fitness(data, number_of_sweeps = nil, working_dir = nil)
|
23
|
+
run_tlearn = RunTLearn.new(@config, working_dir)
|
24
24
|
|
25
25
|
run_tlearn.fitness(FitnessData.new(data), number_of_sweeps)
|
26
26
|
end
|
data/lib/tlearn/run_tlearn.rb
CHANGED
@@ -2,8 +2,8 @@ module TLearn
|
|
2
2
|
class RunTLearn
|
3
3
|
class UntrainedError < Exception; end;
|
4
4
|
|
5
|
-
def initialize(config = {})
|
6
|
-
@config = Config.new(config)
|
5
|
+
def initialize(config = {}, working_dir = nil)
|
6
|
+
@config = Config.new(config, working_dir)
|
7
7
|
end
|
8
8
|
|
9
9
|
def fitness(data, number_of_sweeps = @config.number_of_sweeps)
|
@@ -25,8 +25,8 @@ module TLearn
|
|
25
25
|
execute_tlearn_train(number_of_sweeps)
|
26
26
|
|
27
27
|
if training_successful?(number_of_sweeps)
|
28
|
-
weights = File.read("#{
|
29
|
-
`cp #{
|
28
|
+
weights = File.read("#{@config.working_dir}/#{Config::TLEARN_NAMESPACE}.#{number_of_sweeps}.wts").split("\n")
|
29
|
+
`cp #{@config.working_dir}/#{Config::TLEARN_NAMESPACE}.#{number_of_sweeps}.wts #{@config.working_dir}/#{Config::TLEARN_NAMESPACE}.wts`
|
30
30
|
weights.map{|line| line.split("\t").map{|number| number.strip}}
|
31
31
|
else
|
32
32
|
false
|
@@ -36,7 +36,7 @@ module TLearn
|
|
36
36
|
private
|
37
37
|
|
38
38
|
def file_root
|
39
|
-
"#{File.expand_path(
|
39
|
+
"#{File.expand_path(@config.working_dir)}/#{Config::TLEARN_NAMESPACE}"
|
40
40
|
end
|
41
41
|
|
42
42
|
def clear_previous_fitness_session
|
@@ -45,7 +45,7 @@ module TLearn
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def clear_entire_training_data
|
48
|
-
FileUtils.rm_f(Dir.glob("#{
|
48
|
+
FileUtils.rm_f(Dir.glob("#{@config.working_dir}/*"))
|
49
49
|
end
|
50
50
|
|
51
51
|
def training_successful?(number_of_sweeps)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tlearn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-26 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description:
|
15
15
|
email:
|
@@ -57,8 +57,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
57
57
|
version: '0'
|
58
58
|
requirements: []
|
59
59
|
rubyforge_project:
|
60
|
-
rubygems_version: 1.8.
|
60
|
+
rubygems_version: 1.8.6
|
61
61
|
signing_key:
|
62
62
|
specification_version: 3
|
63
|
-
summary:
|
63
|
+
summary: Ruby bindings for tlearn
|
64
64
|
test_files: []
|
65
|
+
has_rdoc:
|