xgb 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/xgboost.rb CHANGED
@@ -4,9 +4,17 @@ require "ffi"
4
4
  # modules
5
5
  require_relative "xgboost/utils"
6
6
  require_relative "xgboost/booster"
7
+ require_relative "xgboost/callback_container"
8
+ require_relative "xgboost/cv_pack"
7
9
  require_relative "xgboost/dmatrix"
10
+ require_relative "xgboost/packed_booster"
8
11
  require_relative "xgboost/version"
9
12
 
13
+ # callbacks
14
+ require_relative "xgboost/training_callback"
15
+ require_relative "xgboost/early_stopping"
16
+ require_relative "xgboost/evaluation_monitor"
17
+
10
18
  # scikit-learn API
11
19
  require_relative "xgboost/model"
12
20
  require_relative "xgboost/classifier"
@@ -44,134 +52,113 @@ module XGBoost
44
52
  autoload :FFI, "xgboost/ffi"
45
53
 
46
54
  class << self
47
- def train(params, dtrain, num_boost_round: 10, evals: nil, early_stopping_rounds: nil, verbose_eval: true)
48
- booster = Booster.new(params: params)
49
- num_feature = dtrain.num_col
50
- booster.set_param("num_feature", num_feature)
51
- booster.feature_names = dtrain.feature_names
52
- booster.feature_types = dtrain.feature_types
55
+ def train(
56
+ params,
57
+ dtrain,
58
+ num_boost_round: 10,
59
+ evals: nil,
60
+ maximize: nil,
61
+ early_stopping_rounds: nil,
62
+ evals_result: nil,
63
+ verbose_eval: true,
64
+ callbacks: nil
65
+ )
66
+ callbacks = callbacks.nil? ? [] : callbacks.dup
53
67
  evals ||= []
54
68
 
69
+ bst = Booster.new(params: params, cache: [dtrain] + evals.map { |d| d[0] })
70
+
71
+ if verbose_eval
72
+ verbose_eval = verbose_eval == true ? 1 : verbose_eval
73
+ callbacks << EvaluationMonitor.new(period: verbose_eval)
74
+ end
55
75
  if early_stopping_rounds
56
- best_score = nil
57
- best_iter = nil
58
- best_message = nil
76
+ callbacks << EarlyStopping.new(rounds: early_stopping_rounds, maximize: maximize)
59
77
  end
78
+ cb_container = CallbackContainer.new(callbacks)
60
79
 
61
- num_boost_round.times do |iteration|
62
- booster.update(dtrain, iteration)
80
+ bst = cb_container.before_training(bst)
63
81
 
64
- if evals.any?
65
- message = booster.eval_set(evals, iteration)
66
- res = message.split.map { |x| x.split(":") }[1..-1].map { |k, v| [k, v.to_f] }
82
+ num_boost_round.times do |i|
83
+ break if cb_container.before_iteration(bst, i, dtrain, evals)
84
+ bst.update(dtrain, i)
85
+ break if cb_container.after_iteration(bst, i, dtrain, evals)
86
+ end
67
87
 
68
- if early_stopping_rounds && iteration == 0
69
- metric = res[-1][0]
70
- puts "Will train until #{metric} hasn't improved in #{early_stopping_rounds.to_i} rounds." if verbose_eval
71
- end
88
+ bst = cb_container.after_training(bst)
72
89
 
73
- puts message if verbose_eval
74
- score = res[-1][1]
75
-
76
- # TODO handle larger better
77
- if best_score.nil? || score < best_score
78
- best_score = score
79
- best_iter = iteration
80
- best_message = message
81
- elsif early_stopping_rounds && iteration - best_iter >= early_stopping_rounds
82
- booster.best_iteration = best_iter
83
- puts "Stopping. Best iteration:\n#{best_message}" if verbose_eval
84
- break
85
- end
86
- end
90
+ if !evals_result.nil?
91
+ evals_result.merge!(cb_container.history)
87
92
  end
88
93
 
89
- booster
94
+ bst
90
95
  end
91
96
 
92
- def cv(params, dtrain, num_boost_round: 10, nfold: 3, seed: 0, shuffle: true, verbose_eval: nil, show_stdv: true, early_stopping_rounds: nil)
93
- rand_idx = (0...dtrain.num_row).to_a
94
- rand_idx.shuffle!(random: Random.new(seed)) if shuffle
95
-
96
- kstep = (rand_idx.size / nfold.to_f).ceil
97
- test_id = rand_idx.each_slice(kstep).to_a[0...nfold]
98
- train_id = []
99
- nfold.times do |i|
100
- idx = test_id.dup
101
- idx.delete_at(i)
102
- train_id << idx.flatten
103
- end
104
-
105
- folds = train_id.zip(test_id)
106
- cvfolds = []
107
- folds.each do |(train_idx, test_idx)|
108
- fold_dtrain = dtrain.slice(train_idx)
109
- fold_dvalid = dtrain.slice(test_idx)
110
- booster = Booster.new(params: params)
111
- booster.set_param("num_feature", dtrain.num_col)
112
- cvfolds << [booster, fold_dtrain, fold_dvalid]
97
+ def cv(
98
+ params,
99
+ dtrain,
100
+ num_boost_round: 10,
101
+ nfold: 3,
102
+ maximize: nil,
103
+ early_stopping_rounds: nil,
104
+ verbose_eval: nil,
105
+ show_stdv: true,
106
+ seed: 0,
107
+ callbacks: nil,
108
+ shuffle: true
109
+ )
110
+ results = {}
111
+ cvfolds =
112
+ mknfold(
113
+ dall: dtrain,
114
+ param: params,
115
+ nfold: nfold,
116
+ seed: seed,
117
+ shuffle: shuffle
118
+ )
119
+
120
+ callbacks = callbacks.nil? ? [] : callbacks.dup
121
+
122
+ if verbose_eval
123
+ verbose_eval = verbose_eval == true ? 1 : verbose_eval
124
+ callbacks << EvaluationMonitor.new(period: verbose_eval, show_stdv: show_stdv)
113
125
  end
114
-
115
- eval_hist = {}
116
-
117
126
  if early_stopping_rounds
118
- best_score = nil
119
- best_iter = nil
127
+ callbacks << EarlyStopping.new(rounds: early_stopping_rounds, maximize: maximize)
120
128
  end
129
+ callbacks_container = CallbackContainer.new(callbacks, is_cv: true)
121
130
 
122
- num_boost_round.times do |iteration|
123
- scores = {}
131
+ booster = PackedBooster.new(cvfolds)
132
+ callbacks_container.before_training(booster)
124
133
 
125
- cvfolds.each do |(booster, fold_dtrain, fold_dvalid)|
126
- booster.update(fold_dtrain, iteration)
127
- message = booster.eval_set([[fold_dtrain, "train"], [fold_dvalid, "test"]], iteration)
134
+ num_boost_round.times do |i|
135
+ break if callbacks_container.before_iteration(booster, i, dtrain, nil)
136
+ booster.update(i)
128
137
 
129
- res = message.split.map { |x| x.split(":") }[1..-1].map { |k, v| [k, v.to_f] }
130
- res.each do |k, v|
131
- (scores[k] ||= []) << v
138
+ should_break = callbacks_container.after_iteration(booster, i, dtrain, nil)
139
+ res = callbacks_container.aggregated_cv
140
+ res.each do |key, mean, std|
141
+ if !results.include?(key + "-mean")
142
+ results[key + "-mean"] = []
132
143
  end
133
- end
134
-
135
- message_parts = ["[#{iteration}]"]
136
-
137
- last_mean = nil
138
- means = {}
139
- scores.each do |eval_name, vals|
140
- mean = mean(vals)
141
- stdev = stdev(vals)
142
-
143
- (eval_hist["#{eval_name}-mean"] ||= []) << mean
144
- (eval_hist["#{eval_name}-std"] ||= []) << stdev
145
-
146
- means[eval_name] = mean
147
- last_mean = mean
148
-
149
- if show_stdv
150
- message_parts << "%s:%g+%g" % [eval_name, mean, stdev]
151
- else
152
- message_parts << "%s:%g" % [eval_name, mean]
144
+ if !results.include?(key + "-std")
145
+ results[key + "-std"] = []
153
146
  end
147
+ results[key + "-mean"] << mean
148
+ results[key + "-std"] << std
154
149
  end
155
150
 
156
- if early_stopping_rounds
157
- score = last_mean
158
- # TODO handle larger better
159
- if best_score.nil? || score < best_score
160
- best_score = score
161
- best_iter = iteration
162
- elsif iteration - best_iter >= early_stopping_rounds
163
- eval_hist.each_key do |k|
164
- eval_hist[k] = eval_hist[k][0..best_iter]
165
- end
166
- break
151
+ if should_break
152
+ results.keys.each do |k|
153
+ results[k] = results[k][..booster.best_iteration]
167
154
  end
155
+ break
168
156
  end
169
-
170
- # put at end to keep output consistent with Python
171
- puts message_parts.join("\t") if verbose_eval
172
157
  end
173
158
 
174
- eval_hist
159
+ callbacks_container.after_training(booster)
160
+
161
+ results
175
162
  end
176
163
 
177
164
  def lib_version
@@ -184,18 +171,26 @@ module XGBoost
184
171
 
185
172
  private
186
173
 
187
- def mean(arr)
188
- arr.sum / arr.size.to_f
189
- end
174
+ def mknfold(dall:, param:, nfold:, seed:, shuffle:)
175
+ rand_idx = (0...dall.num_row).to_a
176
+ rand_idx.shuffle!(random: Random.new(seed)) if shuffle
177
+
178
+ kstep = (rand_idx.size / nfold.to_f).ceil
179
+ out_idset = rand_idx.each_slice(kstep).to_a[0...nfold]
180
+ in_idset = []
181
+ nfold.times do |i|
182
+ idx = out_idset.dup
183
+ idx.delete_at(i)
184
+ in_idset << idx.flatten
185
+ end
190
186
 
191
- # don't subtract one from arr.size
192
- def stdev(arr)
193
- m = mean(arr)
194
- sum = 0
195
- arr.each do |v|
196
- sum += (v - m) ** 2
187
+ ret = []
188
+ nfold.times do |k|
189
+ fold_dtrain = dall.slice(in_idset[k])
190
+ fold_dvalid = dall.slice(out_idset[k])
191
+ ret << CVPack.new(fold_dtrain, fold_dvalid, param)
197
192
  end
198
- Math.sqrt(sum / arr.size)
193
+ ret
199
194
  end
200
195
  end
201
196
  end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xgb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-13 00:00:00.000000000 Z
11
+ date: 2024-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -37,36 +37,36 @@ files:
37
37
  - lib/xgb.rb
38
38
  - lib/xgboost.rb
39
39
  - lib/xgboost/booster.rb
40
+ - lib/xgboost/callback_container.rb
40
41
  - lib/xgboost/classifier.rb
42
+ - lib/xgboost/cv_pack.rb
41
43
  - lib/xgboost/dmatrix.rb
44
+ - lib/xgboost/early_stopping.rb
45
+ - lib/xgboost/evaluation_monitor.rb
42
46
  - lib/xgboost/ffi.rb
43
47
  - lib/xgboost/model.rb
48
+ - lib/xgboost/packed_booster.rb
44
49
  - lib/xgboost/ranker.rb
45
50
  - lib/xgboost/regressor.rb
51
+ - lib/xgboost/training_callback.rb
46
52
  - lib/xgboost/utils.rb
47
53
  - lib/xgboost/version.rb
48
54
  - vendor/aarch64-linux/LICENSE-dmlc-core.txt
49
- - vendor/aarch64-linux/LICENSE-rabit.txt
50
55
  - vendor/aarch64-linux/LICENSE-xgboost.txt
51
56
  - vendor/aarch64-linux/libxgboost.so
52
57
  - vendor/arm64-darwin/LICENSE-dmlc-core.txt
53
- - vendor/arm64-darwin/LICENSE-rabit.txt
54
58
  - vendor/arm64-darwin/LICENSE-xgboost.txt
55
59
  - vendor/arm64-darwin/libxgboost.dylib
56
60
  - vendor/x64-mingw/LICENSE-dmlc-core.txt
57
- - vendor/x64-mingw/LICENSE-rabit.txt
58
61
  - vendor/x64-mingw/LICENSE-xgboost.txt
59
62
  - vendor/x64-mingw/xgboost.dll
60
63
  - vendor/x86_64-darwin/LICENSE-dmlc-core.txt
61
- - vendor/x86_64-darwin/LICENSE-rabit.txt
62
64
  - vendor/x86_64-darwin/LICENSE-xgboost.txt
63
65
  - vendor/x86_64-darwin/libxgboost.dylib
64
66
  - vendor/x86_64-linux-musl/LICENSE-dmlc-core.txt
65
- - vendor/x86_64-linux-musl/LICENSE-rabit.txt
66
67
  - vendor/x86_64-linux-musl/LICENSE-xgboost.txt
67
68
  - vendor/x86_64-linux-musl/libxgboost.so
68
69
  - vendor/x86_64-linux/LICENSE-dmlc-core.txt
69
- - vendor/x86_64-linux/LICENSE-rabit.txt
70
70
  - vendor/x86_64-linux/LICENSE-xgboost.txt
71
71
  - vendor/x86_64-linux/libxgboost.so
72
72
  homepage: https://github.com/ankane/xgboost-ruby
@@ -81,14 +81,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
81
81
  requirements:
82
82
  - - ">="
83
83
  - !ruby/object:Gem::Version
84
- version: '3'
84
+ version: '3.1'
85
85
  required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  requirements: []
91
- rubygems_version: 3.4.10
91
+ rubygems_version: 3.5.16
92
92
  signing_key:
93
93
  specification_version: 4
94
94
  summary: High performance gradient boosting for Ruby
@@ -1,28 +0,0 @@
1
- Copyright (c) 2014 by Contributors
2
- All rights reserved.
3
-
4
- Redistribution and use in source and binary forms, with or without
5
- modification, are permitted provided that the following conditions are met:
6
-
7
- * Redistributions of source code must retain the above copyright notice, this
8
- list of conditions and the following disclaimer.
9
-
10
- * Redistributions in binary form must reproduce the above copyright notice,
11
- this list of conditions and the following disclaimer in the documentation
12
- and/or other materials provided with the distribution.
13
-
14
- * Neither the name of rabit nor the names of its
15
- contributors may be used to endorse or promote products derived from
16
- this software without specific prior written permission.
17
-
18
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
-
@@ -1,28 +0,0 @@
1
- Copyright (c) 2014 by Contributors
2
- All rights reserved.
3
-
4
- Redistribution and use in source and binary forms, with or without
5
- modification, are permitted provided that the following conditions are met:
6
-
7
- * Redistributions of source code must retain the above copyright notice, this
8
- list of conditions and the following disclaimer.
9
-
10
- * Redistributions in binary form must reproduce the above copyright notice,
11
- this list of conditions and the following disclaimer in the documentation
12
- and/or other materials provided with the distribution.
13
-
14
- * Neither the name of rabit nor the names of its
15
- contributors may be used to endorse or promote products derived from
16
- this software without specific prior written permission.
17
-
18
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
-
@@ -1,28 +0,0 @@
1
- Copyright (c) 2014 by Contributors
2
- All rights reserved.
3
-
4
- Redistribution and use in source and binary forms, with or without
5
- modification, are permitted provided that the following conditions are met:
6
-
7
- * Redistributions of source code must retain the above copyright notice, this
8
- list of conditions and the following disclaimer.
9
-
10
- * Redistributions in binary form must reproduce the above copyright notice,
11
- this list of conditions and the following disclaimer in the documentation
12
- and/or other materials provided with the distribution.
13
-
14
- * Neither the name of rabit nor the names of its
15
- contributors may be used to endorse or promote products derived from
16
- this software without specific prior written permission.
17
-
18
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
-
@@ -1,28 +0,0 @@
1
- Copyright (c) 2014 by Contributors
2
- All rights reserved.
3
-
4
- Redistribution and use in source and binary forms, with or without
5
- modification, are permitted provided that the following conditions are met:
6
-
7
- * Redistributions of source code must retain the above copyright notice, this
8
- list of conditions and the following disclaimer.
9
-
10
- * Redistributions in binary form must reproduce the above copyright notice,
11
- this list of conditions and the following disclaimer in the documentation
12
- and/or other materials provided with the distribution.
13
-
14
- * Neither the name of rabit nor the names of its
15
- contributors may be used to endorse or promote products derived from
16
- this software without specific prior written permission.
17
-
18
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
-
@@ -1,28 +0,0 @@
1
- Copyright (c) 2014 by Contributors
2
- All rights reserved.
3
-
4
- Redistribution and use in source and binary forms, with or without
5
- modification, are permitted provided that the following conditions are met:
6
-
7
- * Redistributions of source code must retain the above copyright notice, this
8
- list of conditions and the following disclaimer.
9
-
10
- * Redistributions in binary form must reproduce the above copyright notice,
11
- this list of conditions and the following disclaimer in the documentation
12
- and/or other materials provided with the distribution.
13
-
14
- * Neither the name of rabit nor the names of its
15
- contributors may be used to endorse or promote products derived from
16
- this software without specific prior written permission.
17
-
18
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
-
@@ -1,28 +0,0 @@
1
- Copyright (c) 2014 by Contributors
2
- All rights reserved.
3
-
4
- Redistribution and use in source and binary forms, with or without
5
- modification, are permitted provided that the following conditions are met:
6
-
7
- * Redistributions of source code must retain the above copyright notice, this
8
- list of conditions and the following disclaimer.
9
-
10
- * Redistributions in binary form must reproduce the above copyright notice,
11
- this list of conditions and the following disclaimer in the documentation
12
- and/or other materials provided with the distribution.
13
-
14
- * Neither the name of rabit nor the names of its
15
- contributors may be used to endorse or promote products derived from
16
- this software without specific prior written permission.
17
-
18
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
-