tomz-liblinear-ruby-swig 0.1.0 → 0.1.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.
@@ -1,3 +1,5 @@
1
1
  2009-05-10 Tom Zeng (tom.z.zeng@gmail.com)
2
2
  * initial check-in into github
3
3
 
4
+ 2009-07-10 Tom Zeng (tom.z.zeng@gmail.com)
5
+ * incorporated the _convert_to_feature_node_array fix from the LIBSVM development group
@@ -9,7 +9,7 @@ This is the Ruby LIBLINEAR SWIG (Simplified Wrapper and Interface Generator)
9
9
  interface. LIBLINEAR is a high performance machine learning library for large
10
10
  scale text mining(http://www.csie.ntu.edu.tw/~cjlin/liblinear).
11
11
 
12
- A slightly modified version of LIBLINEAR 1.33 is included which allow turnning
12
+ A slightly modified version of LIBLINEAR 1.33 is included which allows turning
13
13
  on/off the default debuging/logging messages. You don't need your own copy of
14
14
  SWIG to use this library - all needed files are generated using SWIG already.
15
15
 
@@ -25,8 +25,8 @@ Currently the gem is available on linux only(tested on Ubuntu 8 and Fedora 9/10,
25
25
  and should work on OS X), and you will need g++ installed to compile the native
26
26
  code.
27
27
 
28
- sudo gem sources -a http://gems.github.com (you only have to do this once)
29
- sudo gem install tomz-liblinear-ruby-swig
28
+ sudo gem sources -a http://gems.github.com (you only have to do this once)
29
+ sudo gem install tomz-liblinear-ruby-swig
30
30
 
31
31
  == SYNOPSIS:
32
32
 
@@ -60,6 +60,7 @@ Try the following multiclass problem in irb:
60
60
  irb(main):021:0> pred = m.predict({1=>-0.1,2=>-0.2,3=>0.1,4=>1.1,5=>0.1})
61
61
  => 3
62
62
  irb(main):022:0> m.save("test.model")
63
+ irb(main):023:0> "your imagination " * 10
63
64
 
64
65
 
65
66
  For more examples see test*.rb in the liblinear-ruby-swig/liblinear-1.33/ruby
@@ -68,7 +69,7 @@ directory
68
69
  == AUTHOR:
69
70
 
70
71
  Tom Zeng
71
- http://www.tomzconsulting.com
72
- http://www.linkedin.com/in/tomzeng
73
- tom.z.zeng _at_ gmail _dot_ com
72
+ - http://www.tomzconsulting.com
73
+ - http://www.linkedin.com/in/tomzeng
74
+ - tom.z.zeng _at_ gmail _dot_ com
74
75
 
data/Rakefile CHANGED
@@ -1,11 +1,13 @@
1
1
  require 'rubygems'
2
+ gem 'hoe', '>=1.8.3','<= 1.12.2'
2
3
  require 'hoe'
3
4
 
5
+
4
6
  task :default => ["sync_files","make_gem"]
5
7
 
6
8
  EXT = "ext/liblinear?.#{Hoe::DLEXT}"
7
9
 
8
- Hoe.new('liblinear-ruby-swig', '0.1.0') do |p|
10
+ Hoe.new('liblinear-ruby-swig', '0.1.1') do |p|
9
11
  p.author = 'Tom Zeng'
10
12
  p.email = 'tom.z.zeng@gmail.com'
11
13
  p.url = 'http://www.tomzconsulting.com'
@@ -2120,6 +2120,13 @@ void feature_node_matrix_set(struct feature_node **matrix, int i, struct feature
2120
2120
  matrix[i] = array;
2121
2121
  }
2122
2122
 
2123
+ void set_bias_index(struct feature_node **matrix, int size, int maxlen, int *len_array)
2124
+ {
2125
+ int i;
2126
+ for(i=0; i<size; i++)
2127
+ (matrix[i]+len_array[i])->index = maxlen+1;
2128
+ }
2129
+
2123
2130
  void feature_node_matrix_destroy(struct feature_node **matrix)
2124
2131
  {
2125
2132
  free(matrix);
@@ -4095,6 +4102,51 @@ fail:
4095
4102
  }
4096
4103
 
4097
4104
 
4105
+ SWIGINTERN VALUE
4106
+ _wrap_set_bias_index(int argc, VALUE *argv, VALUE self) {
4107
+ feature_node **arg1 = (feature_node **) 0 ;
4108
+ int arg2 ;
4109
+ int arg3 ;
4110
+ int *arg4 = (int *) 0 ;
4111
+ void *argp1 = 0 ;
4112
+ int res1 = 0 ;
4113
+ int val2 ;
4114
+ int ecode2 = 0 ;
4115
+ int val3 ;
4116
+ int ecode3 = 0 ;
4117
+ void *argp4 = 0 ;
4118
+ int res4 = 0 ;
4119
+
4120
+ if ((argc < 4) || (argc > 4)) {
4121
+ rb_raise(rb_eArgError, "wrong # of arguments(%d for 4)",argc); SWIG_fail;
4122
+ }
4123
+ res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_p_feature_node, 0 | 0 );
4124
+ if (!SWIG_IsOK(res1)) {
4125
+ SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "feature_node **","set_bias_index", 1, argv[0] ));
4126
+ }
4127
+ arg1 = reinterpret_cast< feature_node ** >(argp1);
4128
+ ecode2 = SWIG_AsVal_int(argv[1], &val2);
4129
+ if (!SWIG_IsOK(ecode2)) {
4130
+ SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","set_bias_index", 2, argv[1] ));
4131
+ }
4132
+ arg2 = static_cast< int >(val2);
4133
+ ecode3 = SWIG_AsVal_int(argv[2], &val3);
4134
+ if (!SWIG_IsOK(ecode3)) {
4135
+ SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "int","set_bias_index", 3, argv[2] ));
4136
+ }
4137
+ arg3 = static_cast< int >(val3);
4138
+ res4 = SWIG_ConvertPtr(argv[3], &argp4,SWIGTYPE_p_int, 0 | 0 );
4139
+ if (!SWIG_IsOK(res4)) {
4140
+ SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "int *","set_bias_index", 4, argv[3] ));
4141
+ }
4142
+ arg4 = reinterpret_cast< int * >(argp4);
4143
+ set_bias_index(arg1,arg2,arg3,arg4);
4144
+ return Qnil;
4145
+ fail:
4146
+ return Qnil;
4147
+ }
4148
+
4149
+
4098
4150
  SWIGINTERN VALUE
4099
4151
  _wrap_feature_node_matrix_destroy(int argc, VALUE *argv, VALUE self) {
4100
4152
  feature_node **arg1 = (feature_node **) 0 ;
@@ -4520,6 +4572,7 @@ SWIGEXPORT void Init_liblinear(void) {
4520
4572
  rb_define_module_function(mLiblinear, "feature_node_array_destroy", VALUEFUNC(_wrap_feature_node_array_destroy), -1);
4521
4573
  rb_define_module_function(mLiblinear, "feature_node_matrix", VALUEFUNC(_wrap_feature_node_matrix), -1);
4522
4574
  rb_define_module_function(mLiblinear, "feature_node_matrix_set", VALUEFUNC(_wrap_feature_node_matrix_set), -1);
4575
+ rb_define_module_function(mLiblinear, "set_bias_index", VALUEFUNC(_wrap_set_bias_index), -1);
4523
4576
  rb_define_module_function(mLiblinear, "feature_node_matrix_destroy", VALUEFUNC(_wrap_feature_node_matrix_destroy), -1);
4524
4577
  }
4525
4578
 
@@ -99,7 +99,7 @@ class LParameter
99
99
  end
100
100
  end
101
101
 
102
- def _convert_to_feature_node_array(x, bias=-1)
102
+ def _convert_to_feature_node_array(x, maxlen, bias=-1)
103
103
  # convert a sequence or mapping to an feature_node array
104
104
 
105
105
  # Find non zero elements
@@ -121,7 +121,7 @@ def _convert_to_feature_node_array(x, bias=-1)
121
121
  if bias >=0
122
122
  data = feature_node_array(iter_range.size+2)
123
123
  #puts "bias element (#{iter_range.size},#{bias})"
124
- feature_node_array_set(data,iter_range.size,iter_range.size,bias)
124
+ feature_node_array_set(data,iter_range.size,maxlen+1,bias)
125
125
  feature_node_array_set(data,iter_range.size+1,-1,0)
126
126
  else
127
127
  data = feature_node_array(iter_range.size+1)
@@ -154,17 +154,25 @@ class LProblem
154
154
  @x_matrix = x_matrix = feature_node_matrix(size)
155
155
  @data = []
156
156
  @maxlen = 0 #max number of features
157
+ len_array=[]
158
+
157
159
  for i in (0..size-1)
158
- data = _convert_to_feature_node_array(x[i], bias)
160
+ data = _convert_to_feature_node_array(x[i], @maxlen, bias)
159
161
  @data << data
160
162
  feature_node_matrix_set(x_matrix,i,data)
163
+
161
164
  if x[i].class == Hash
162
165
  if x[i].size > 0
163
- @maxlen = [@maxlen,x[i].keys.max].max
166
+ @maxlen = [@maxlen,x[i].keys.max].max
164
167
  end
165
168
  else
166
169
  @maxlen = [@maxlen,x[i].size].max
167
170
  end
171
+ len_array << x[i].size
172
+ end
173
+
174
+ if bias >= 0
175
+ set_bias_index(x_matrix, size, @maxlen, _int_array(len_array))
168
176
  end
169
177
 
170
178
  prob.y = y_array
@@ -217,7 +225,7 @@ class LModel
217
225
  end
218
226
 
219
227
  def predict(x)
220
- data = _convert_to_feature_node_array(x, @model.bias)
228
+ data = _convert_to_feature_node_array(x, @model.nr_feature, @model.bias)
221
229
  ret = Liblinear::predict(@model,data)
222
230
  feature_node_array_destroy(data)
223
231
  return ret
@@ -235,7 +243,7 @@ class LModel
235
243
  def predict_values_raw(x)
236
244
  #convert x into feature_node, allocate a double array for return
237
245
  n = (@nr_class*(@nr_class-1)/2).floor
238
- data = _convert_to_feature_node_array(x, @model.bias)
246
+ data = _convert_to_feature_node_array(x, @model.nr_feature, @model.bias)
239
247
  dblarr = new_double(n)
240
248
  Liblinear::predict_values(@model, data, dblarr)
241
249
  ret = _double_array_to_list(dblarr, n)
@@ -276,7 +284,7 @@ class LModel
276
284
  # end
277
285
 
278
286
  #convert x into feature_node, alloc a double array to receive probabilities
279
- data = _convert_to_feature_node_array(x,@model.bias)
287
+ data = _convert_to_feature_node_array(x, @model.nr_feature, @model.bias)
280
288
  dblarr = new_double(@nr_class)
281
289
  pred = Liblinear::predict_probability(@model, data, dblarr)
282
290
  pv = _double_array_to_list(dblarr, @nr_class)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tomz-liblinear-ruby-swig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Zeng
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-09 00:00:00 -07:00
12
+ date: 2009-07-10 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency