rumale-svm 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 94a681354e720d47b0efe86bb2833b4ecdb1c3ff
4
- data.tar.gz: 050ae3bb322c3a89ebbceb1b5e114988738a9404
2
+ SHA256:
3
+ metadata.gz: e2fa12724b67f4cc5be042e64a8d29284e2292f23a5b13031e4b2ee33397285a
4
+ data.tar.gz: 453907d44a6113bf65531ec39e9d6da219bd1c2d0822cc6c72a1188e1b1e0b5e
5
5
  SHA512:
6
- metadata.gz: 3fe3c396ce596b589b508ecbce62258f14ef3733eb26d9d5829bad81c4bba2380fbf143178e1daabf0d9f523118099a0d56ed285bc5407da1c6af10e56283e23
7
- data.tar.gz: fa78aa2cb873c8246b9ddc3c75063ae00ba9acf8c644d87b33900e16a813b870f2cffde7159625e695a1c0a3874d48a9302dca93e3670e25d05ba0caa180656c
6
+ metadata.gz: 490675646f497293d10112605ab1d5dcbc1a69a21e67f2712b304b89d7e542e9894358e536dec4811e04ead3bb94fbd77c5273a7e3464cc883e9e50e8212af0b
7
+ data.tar.gz: 9ccac4d7d7cf56deac34f9c9c731e3b6c455df65ca7349ed0634c37106ea0e6fe42dec243459f966e87c3aadf72525211fa4c365925c59f6089024689968c9be
@@ -0,0 +1,107 @@
1
+ require:
2
+ - rubocop-performance
3
+ - rubocop-rspec
4
+
5
+ AllCops:
6
+ TargetRubyVersion: 2.4
7
+ DisplayCopNames: true
8
+ DisplayStyleGuide: true
9
+ Exclude:
10
+ - 'bin/*'
11
+ - 'rumale-svm.gemspec'
12
+ - 'Rakefile'
13
+ - 'Gemfile'
14
+
15
+ Layout/EmptyLineAfterGuardClause:
16
+ Enabled: false
17
+
18
+ Layout/EmptyLinesAroundAttributeAccessor:
19
+ Enabled: true
20
+
21
+ Layout/LineLength:
22
+ Max: 145
23
+ IgnoredPatterns: ['(\A|\s)#']
24
+
25
+ Layout/SpaceAroundMethodCallOperator:
26
+ Enabled: true
27
+
28
+ Lint/DeprecatedOpenSSLConstant:
29
+ Enabled: true
30
+
31
+ Lint/RaiseException:
32
+ Enabled: true
33
+
34
+ Lint/StructNewOverride:
35
+ Enabled: true
36
+
37
+ Metrics/ModuleLength:
38
+ Max: 200
39
+
40
+ Metrics/ClassLength:
41
+ Max: 200
42
+
43
+ Metrics/MethodLength:
44
+ Max: 40
45
+
46
+ Metrics/AbcSize:
47
+ Max: 60
48
+
49
+ Metrics/CyclomaticComplexity:
50
+ Max: 16
51
+
52
+ Metrics/PerceivedComplexity:
53
+ Max: 16
54
+
55
+ Metrics/BlockLength:
56
+ Max: 40
57
+ Exclude:
58
+ - 'spec/**/*'
59
+
60
+ Metrics/ParameterLists:
61
+ Max: 12
62
+
63
+ Naming/MethodParameterName:
64
+ Enabled: false
65
+
66
+ Naming/ConstantName:
67
+ Enabled: false
68
+
69
+ Security/MarshalLoad:
70
+ Enabled: false
71
+
72
+ Style/Documentation:
73
+ Enabled: false
74
+
75
+ Style/ExponentialNotation:
76
+ Enabled: true
77
+
78
+ Style/HashEachMethods:
79
+ Enabled: true
80
+
81
+ Style/HashTransformKeys:
82
+ Enabled: true
83
+
84
+ Style/HashTransformValues:
85
+ Enabled: true
86
+
87
+ Style/SlicingWithRange:
88
+ Enabled: true
89
+
90
+ Style/FormatStringToken:
91
+ Enabled: false
92
+
93
+ Style/NumericLiterals:
94
+ Enabled: false
95
+
96
+ RSpec/MultipleExpectations:
97
+ Enabled: false
98
+
99
+ RSpec/ExampleLength:
100
+ Max: 40
101
+
102
+ RSpec/InstanceVariable:
103
+ Enabled: false
104
+
105
+ RSpec/LeakyConstantDeclaration:
106
+ Enabled: false
107
+
@@ -8,6 +8,7 @@ rvm:
8
8
  - '2.4'
9
9
  - '2.5'
10
10
  - '2.6'
11
+ - '2.7'
11
12
 
12
13
  before_install:
13
14
  - gem install bundler -v 2.0.2
@@ -1,3 +1,7 @@
1
+ # 0.3.0
2
+ - Fix to raise error when calling prediction method before training model.
3
+ - Fix some config files.
4
+
1
5
  # 0.2.0
2
6
  - Supported the new Rumale's validation:
3
7
  - Fix to use new numeric validation for hyperparameter values.
data/Gemfile CHANGED
@@ -1,4 +1,8 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in rumale-svm.gemspec
4
4
  gemspec
5
+
6
+ gem 'coveralls', '~> 0.8'
7
+ gem 'rake', '~> 12.0'
8
+ gem 'rspec', '~> 3.0'
@@ -1,4 +1,4 @@
1
- Copyright (c) 2019 Atsushi Tatsuma
1
+ Copyright (c) 2019-2020 Atsushi Tatsuma
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![Coverage Status](https://coveralls.io/repos/github/yoshoku/rumale-svm/badge.svg?branch=master)](https://coveralls.io/github/yoshoku/rumale-svm?branch=master)
5
5
  [![Gem Version](https://badge.fury.io/rb/rumale-svm.svg)](https://badge.fury.io/rb/rumale-svm)
6
6
  [![BSD 3-Clause License](https://img.shields.io/badge/License-BSD%203--Clause-orange.svg)](https://github.com/yoshoku/rumale-svm/blob/master/LICENSE.txt)
7
- [![Documentation](http://img.shields.io/badge/docs-rdoc.info-blue.svg)](https://yoshoku.github.io/rumale-svm/doc/)
7
+ [![Documentation](http://img.shields.io/badge/api-reference-blue.svg)](https://yoshoku.github.io/rumale-svm/doc/)
8
8
 
9
9
  Rumale::SVM provides support vector machine algorithms in
10
10
  [LIBSVM](https://www.csie.ntu.edu.tw/~cjlin/libsvm/) and [LIBLINEAR](https://www.csie.ntu.edu.tw/~cjlin/liblinear/)
@@ -30,6 +30,10 @@ Or install it yourself as:
30
30
 
31
31
  $ gem install rumale-svm
32
32
 
33
+ ## Documentation
34
+
35
+ - [Rumale::SVM API Documentation](https://yoshoku.github.io/rumale-svm/doc/)
36
+
33
37
  ## Usage
34
38
  Download pendigits dataset from [LIBSVM DATA](https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/) web page.
35
39
 
@@ -85,6 +85,7 @@ module Rumale
85
85
  # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to compute the scores.
86
86
  # @return [Numo::DFloat] (shape: [n_samples, n_classes]) Confidence score per sample.
87
87
  def decision_function(x)
88
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
88
89
  x = check_convert_sample_array(x)
89
90
  xx = fit_bias? ? expand_feature(x) : x
90
91
  Numo::Liblinear.decision_function(xx, liblinear_params, @model)
@@ -95,6 +96,7 @@ module Rumale
95
96
  # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the labels.
96
97
  # @return [Numo::Int32] (shape: [n_samples]) Predicted class label per sample.
97
98
  def predict(x)
99
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
98
100
  x = check_convert_sample_array(x)
99
101
  xx = fit_bias? ? expand_feature(x) : x
100
102
  Numo::Int32.cast(Numo::Liblinear.predict(xx, liblinear_params, @model))
@@ -106,6 +108,7 @@ module Rumale
106
108
  # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the probailities.
107
109
  # @return [Numo::DFloat] (shape: [n_samples, n_classes]) Predicted probability of each class per sample.
108
110
  def predict_proba(x)
111
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
109
112
  x = check_convert_sample_array(x)
110
113
  if binary_class?
111
114
  probs = Numo::DFloat.zeros(x.shape[0], 2)
@@ -232,6 +235,10 @@ module Rumale
232
235
  def labels
233
236
  @model[:label]
234
237
  end
238
+
239
+ def trained?
240
+ !@model.nil?
241
+ end
235
242
  end
236
243
  end
237
244
  end
@@ -79,6 +79,7 @@ module Rumale
79
79
  # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the labels.
80
80
  # @return [Numo::DFloat] (shape: [n_samples]) Predicted value per sample.
81
81
  def predict(x)
82
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
82
83
  x = check_convert_sample_array(x)
83
84
  xx = fit_bias? ? expand_feature(x) : x
84
85
  Numo::Liblinear.predict(xx, liblinear_params, @model)
@@ -145,6 +146,10 @@ module Rumale
145
146
  def bias_scale
146
147
  @params[:bias_scale]
147
148
  end
149
+
150
+ def trained?
151
+ !@model.nil?
152
+ end
148
153
  end
149
154
  end
150
155
  end
@@ -77,6 +77,7 @@ module Rumale
77
77
  # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to compute the scores.
78
78
  # @return [Numo::DFloat] (shape: [n_samples, n_classes]) Confidence score per sample.
79
79
  def decision_function(x)
80
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
80
81
  x = check_convert_sample_array(x)
81
82
  xx = fit_bias? ? expand_feature(x) : x
82
83
  Numo::Liblinear.decision_function(xx, liblinear_params, @model)
@@ -87,6 +88,7 @@ module Rumale
87
88
  # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the labels.
88
89
  # @return [Numo::Int32] (shape: [n_samples]) Predicted class label per sample.
89
90
  def predict(x)
91
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
90
92
  x = check_convert_sample_array(x)
91
93
  xx = fit_bias? ? expand_feature(x) : x
92
94
  Numo::Int32.cast(Numo::Liblinear.predict(xx, liblinear_params, @model))
@@ -98,6 +100,7 @@ module Rumale
98
100
  # @param x [Numo::DFloat] (shape: [n_samples, n_features]) The samples to predict the probailities.
99
101
  # @return [Numo::DFloat] (shape: [n_samples, n_classes]) Predicted probability of each class per sample.
100
102
  def predict_proba(x)
103
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
101
104
  x = check_convert_sample_array(x)
102
105
  xx = fit_bias? ? expand_feature(x) : x
103
106
  Numo::Liblinear.predict_proba(xx, liblinear_params, @model)
@@ -184,6 +187,10 @@ module Rumale
184
187
  def n_features
185
188
  @model[:nr_feature]
186
189
  end
190
+
191
+ def trained?
192
+ !@model.nil?
193
+ end
187
194
  end
188
195
  end
189
196
  end
@@ -71,6 +71,7 @@ module Rumale
71
71
  # If the kernel is 'precomputed', the shape of x must be [n_samples, n_training_samples].
72
72
  # @return [Numo::DFloat] (shape: [n_samples, n_classes]) Confidence score per sample.
73
73
  def decision_function(x)
74
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
74
75
  x = check_convert_sample_array(x)
75
76
  xx = precomputed_kernel? ? add_index_col(x) : x
76
77
  Numo::Libsvm.decision_function(xx, libsvm_params, @model)
@@ -82,6 +83,7 @@ module Rumale
82
83
  # If the kernel is 'precomputed', the shape of x must be [n_samples, n_training_samples].
83
84
  # @return [Numo::Int32] (shape: [n_samples]) Predicted class label per sample.
84
85
  def predict(x)
86
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
85
87
  x = check_convert_sample_array(x)
86
88
  xx = precomputed_kernel? ? add_index_col(x) : x
87
89
  Numo::Int32.cast(Numo::Libsvm.predict(xx, libsvm_params, @model))
@@ -94,6 +96,7 @@ module Rumale
94
96
  # If the kernel is 'precomputed', the shape of x must be [n_samples, n_training_samples].
95
97
  # @return [Numo::DFloat] (shape: [n_samples, n_classes]) Predicted probability of each class per sample.
96
98
  def predict_proba(x)
99
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
97
100
  x = check_convert_sample_array(x)
98
101
  xx = precomputed_kernel? ? add_index_col(x) : x
99
102
  Numo::Libsvm.predict_proba(xx, libsvm_params, @model)
@@ -188,6 +191,10 @@ module Rumale
188
191
  res[:eps] = res.delete(:tol)
189
192
  res
190
193
  end
194
+
195
+ def trained?
196
+ !@model.nil?
197
+ end
191
198
  end
192
199
  end
193
200
  end
@@ -69,6 +69,7 @@ module Rumale
69
69
  # If the kernel is 'precomputed', the shape of x must be [n_samples, n_training_samples].
70
70
  # @return [Numo::DFloat] (shape: [n_samples]) Predicted value per sample.
71
71
  def predict(x)
72
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
72
73
  x = check_convert_sample_array(x)
73
74
  xx = precomputed_kernel? ? add_index_col(x) : x
74
75
  Numo::Libsvm.predict(xx, libsvm_params, @model)
@@ -151,6 +152,10 @@ module Rumale
151
152
  res[:eps] = res.delete(:tol)
152
153
  res
153
154
  end
155
+
156
+ def trained?
157
+ !@model.nil?
158
+ end
154
159
  end
155
160
  end
156
161
  end
@@ -67,6 +67,7 @@ module Rumale
67
67
  # If the kernel is 'precomputed', the shape of x must be [n_samples, n_training_samples].
68
68
  # @return [Numo::DFloat] (shape: [n_samples, n_classes]) Confidence score per sample.
69
69
  def decision_function(x)
70
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
70
71
  x = check_convert_sample_array(x)
71
72
  Numo::Libsvm.decision_function(x, libsvm_params, @model)
72
73
  end
@@ -77,6 +78,7 @@ module Rumale
77
78
  # If the kernel is 'precomputed', the shape of x must be [n_samples, n_training_samples].
78
79
  # @return [Numo::Int32] (shape: [n_samples]) Predicted label per sample.
79
80
  def predict(x)
81
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
80
82
  x = check_convert_sample_array(x)
81
83
  Numo::Int32.cast(Numo::Libsvm.predict(x, libsvm_params, @model))
82
84
  end
@@ -145,6 +147,10 @@ module Rumale
145
147
  res[:eps] = res.delete(:tol)
146
148
  res
147
149
  end
150
+
151
+ def trained?
152
+ !@model.nil?
153
+ end
148
154
  end
149
155
  end
150
156
  end
@@ -71,6 +71,7 @@ module Rumale
71
71
  # If the kernel is 'precomputed', the shape of x must be [n_samples, n_training_samples].
72
72
  # @return [Numo::DFloat] (shape: [n_samples, n_classes]) Confidence score per sample.
73
73
  def decision_function(x)
74
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
74
75
  x = check_convert_sample_array(x)
75
76
  xx = precomputed_kernel? ? add_index_col(x) : x
76
77
  Numo::Libsvm.decision_function(xx, libsvm_params, @model)
@@ -82,6 +83,7 @@ module Rumale
82
83
  # If the kernel is 'precomputed', the shape of x must be [n_samples, n_training_samples].
83
84
  # @return [Numo::Int32] (shape: [n_samples]) Predicted class label per sample.
84
85
  def predict(x)
86
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
85
87
  x = check_convert_sample_array(x)
86
88
  xx = precomputed_kernel? ? add_index_col(x) : x
87
89
  Numo::Int32.cast(Numo::Libsvm.predict(xx, libsvm_params, @model))
@@ -94,6 +96,7 @@ module Rumale
94
96
  # If the kernel is 'precomputed', the shape of x must be [n_samples, n_training_samples].
95
97
  # @return [Numo::DFloat] (shape: [n_samples, n_classes]) Predicted probability of each class per sample.
96
98
  def predict_proba(x)
99
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
97
100
  x = check_convert_sample_array(x)
98
101
  xx = precomputed_kernel? ? add_index_col(x) : x
99
102
  Numo::Libsvm.predict_proba(xx, libsvm_params, @model)
@@ -189,6 +192,10 @@ module Rumale
189
192
  res[:eps] = res.delete(:tol)
190
193
  res
191
194
  end
195
+
196
+ def trained?
197
+ !@model.nil?
198
+ end
192
199
  end
193
200
  end
194
201
  end
@@ -72,6 +72,7 @@ module Rumale
72
72
  # If the kernel is 'precomputed', the shape of x must be [n_samples, n_training_samples].
73
73
  # @return [Numo::DFloat] (shape: [n_samples]) Predicted value per sample.
74
74
  def predict(x)
75
+ raise "#{self.class.name}\##{__method__} expects to be called after training the model with the fit method." unless trained?
75
76
  x = check_convert_sample_array(x)
76
77
  xx = precomputed_kernel? ? add_index_col(x) : x
77
78
  Numo::Libsvm.predict(xx, libsvm_params, @model)
@@ -156,6 +157,10 @@ module Rumale
156
157
  res[:eps] = res.delete(:tol)
157
158
  res
158
159
  end
160
+
161
+ def trained?
162
+ !@model.nil?
163
+ end
159
164
  end
160
165
  end
161
166
  end
@@ -5,6 +5,6 @@ module Rumale
5
5
  # This module consists of Rumale interfaces for suppor vector machine algorithms with LIBSVM and LIBLINEAR.
6
6
  module SVM
7
7
  # The version of Rumale-SVM you are using.
8
- VERSION = '0.2.0'
8
+ VERSION = '0.3.0'
9
9
  end
10
10
  end
@@ -34,8 +34,4 @@ Gem::Specification.new do |spec|
34
34
  spec.add_runtime_dependency 'numo-liblinear', '~> 1.0'
35
35
  spec.add_runtime_dependency 'numo-libsvm', '~> 1.0'
36
36
  spec.add_runtime_dependency 'rumale', '~> 0.14'
37
- spec.add_development_dependency 'bundler', '~> 2.0'
38
- spec.add_development_dependency 'coveralls', '~> 0.8'
39
- spec.add_development_dependency 'rake', '~> 10.0'
40
- spec.add_development_dependency 'rspec', '~> 3.0'
41
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rumale-svm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - yoshoku
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-11-18 00:00:00.000000000 Z
11
+ date: 2020-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: numo-liblinear
@@ -52,62 +52,6 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.14'
55
- - !ruby/object:Gem::Dependency
56
- name: bundler
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '2.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '2.0'
69
- - !ruby/object:Gem::Dependency
70
- name: coveralls
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '0.8'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '0.8'
83
- - !ruby/object:Gem::Dependency
84
- name: rake
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '10.0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '10.0'
97
- - !ruby/object:Gem::Dependency
98
- name: rspec
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '3.0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '3.0'
111
55
  description: 'Rumale-SVM provides support vector machine algorithms of LIBSVM and
112
56
  LIBLINEAR with Rumale interface.
113
57
 
@@ -122,6 +66,7 @@ files:
122
66
  - ".github/workflows/build.yml"
123
67
  - ".gitignore"
124
68
  - ".rspec"
69
+ - ".rubocop.yml"
125
70
  - ".travis.yml"
126
71
  - CHANGELOG.md
127
72
  - CODE_OF_CONDUCT.md
@@ -150,7 +95,7 @@ metadata:
150
95
  source_code_uri: https://github.com/yoshoku/rumale-svm
151
96
  changelog_uri: https://github.com/yoshoku/rumale-svm/blob/master/CHANGELOG.md
152
97
  documentation_uri: https://yoshoku.github.io/rumale-svm/doc/
153
- post_install_message:
98
+ post_install_message:
154
99
  rdoc_options: []
155
100
  require_paths:
156
101
  - lib
@@ -165,9 +110,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
110
  - !ruby/object:Gem::Version
166
111
  version: '0'
167
112
  requirements: []
168
- rubyforge_project:
169
- rubygems_version: 2.6.14.4
170
- signing_key:
113
+ rubygems_version: 3.1.2
114
+ signing_key:
171
115
  specification_version: 4
172
116
  summary: Rumale-SVM provides support vector machine algorithms of LIBSVM and LIBLINEAR
173
117
  with Rumale interface.