khiva 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d46c3d7ed62e5adf119b172084d7a7bf6f6a77d49eae2cb3039cca6ce4a9b9a3
4
- data.tar.gz: '09b7f85b1c1ddd51f2a78c732b24350d4e43c2471ebccbe5e37f501213a4cf65'
3
+ metadata.gz: b7e270535ccb0436961b438ccf0d6effd1976933e1c5a2f98920d207816d6c21
4
+ data.tar.gz: 8fa258b1c954a3cdd5ad02c0b1da57f6d175fc844e0fdabe2ae82f902a18d431
5
5
  SHA512:
6
- metadata.gz: 7e5ef4486b11cd7333fd819381150f854a62b2c744c31014950f1e5e7ca8b17ede6e87e1277751c58211e029edb990a605e7d2f428c8374ec7c1cc63ec8c3c7d
7
- data.tar.gz: a96c1716abec95ddef7caa6e389e8fa796c4ef03a584c0204508ab37a0096fce5b356040c2d1770e422803285a7a3aa2d7a27e4573e35d0faf89857b588f7100
6
+ metadata.gz: a54ff69b81b37c7e206a46babc733ed1987e16ae84dd40a19eae0fb688b08e245a8df1b212debc5342f1e7da1a934aa972b8a936faf58b1300aa3cdecb519a70
7
+ data.tar.gz: aac9b7764789f171d5f7b33834148117a7423b2182303b4d45bd1307d9a57c187fa492499810692846f25b6f13e20f3243b8cba4b28c82a0faa4b3ce949fb478
@@ -1,3 +1,7 @@
1
+ ## 0.1.1 (2020-12-18)
2
+
3
+ - Added many more methods
4
+
1
5
  ## 0.1.0 (2020-12-17)
2
6
 
3
7
  - First release
data/README.md CHANGED
@@ -2,11 +2,13 @@
2
2
 
3
3
  [Khiva](https://github.com/shapelets/khiva) - high-performance time series algorithms - for Ruby
4
4
 
5
+ :fire: Runs on GPUs and CPUs
6
+
5
7
  [![Build Status](https://github.com/ankane/khiva-ruby/workflows/build/badge.svg?branch=master)](https://github.com/ankane/khiva-ruby/actions)
6
8
 
7
9
  ## Installation
8
10
 
9
- First, [install Khiva](#khiva-installation). For Homebrew use:
11
+ First, [install Khiva](#khiva-installation). For Homebrew, use:
10
12
 
11
13
  ```sh
12
14
  brew install khiva
@@ -31,10 +33,32 @@ profile, index = Khiva::Matrix.stomp(a, b, 3)
31
33
  Find discords
32
34
 
33
35
  ```ruby
34
- discords, discords_indices, subsequence_indices = Khiva::Matrix.find_best_n_discords(profile, index, 2, 2)
36
+ distances, indices, subsequences = Khiva::Matrix.find_best_n_discords(profile, index, 2, 2)
37
+ ```
38
+
39
+ Find motifs
40
+
41
+ ```ruby
42
+ distances, indices, subsequences = Khiva::Matrix.find_best_n_motifs(profile, index, 2, 2)
35
43
  ```
36
44
 
37
- ## Arrays
45
+ ## Modules
46
+
47
+ - [Array](#array)
48
+ - [Clustering](#clustering)
49
+ - [Dimensionality](#dimensionality)
50
+ - [Distances](#distances)
51
+ - [Features](#features)
52
+ - [Library](#library)
53
+ - [Linalg](#linalg)
54
+ - [Matrix](#matrix)
55
+ - [Normalization](#normalization)
56
+ - [Polynomial](#polynomial)
57
+ - [Regression](#regression)
58
+ - [Regularization](#regularization)
59
+ - [Statistics](#statistics)
60
+
61
+ ## Array
38
62
 
39
63
  Create an array from a Ruby array
40
64
 
@@ -42,7 +66,7 @@ Create an array from a Ruby array
42
66
  Khiva::Array.new([1, 2, 3])
43
67
  ```
44
68
 
45
- Specify the type
69
+ Specify the type - `:b8`, `:f32`, `:f64`, `:s16`, `:s32`, `:s64`, `:u8`, `:u16`, `:u32`, `:u64`
46
70
 
47
71
  ```ruby
48
72
  Khiva::Array.new([1, 2, 3], type: :s64)
@@ -77,6 +101,28 @@ a.le(b)
77
101
  a.ge(b)
78
102
  ```
79
103
 
104
+ ## Clustering
105
+
106
+ k-means algorithm
107
+
108
+ ```ruby
109
+ centroids, labels = Khiva::Clustering.k_means(tss, k)
110
+ ```
111
+
112
+ k-Shape algorithm
113
+
114
+ ```ruby
115
+ centroids, labels = Khiva::Clustering.k_shape(tss, k)
116
+ ```
117
+
118
+ ## Dimensionality
119
+
120
+ Piecewise aggregate approximate (PAA)
121
+
122
+ ```ruby
123
+ Khiva::Dimensionality.paa(a, bins)
124
+ ```
125
+
80
126
  ## Distances
81
127
 
82
128
  Dynamic time warping (DTW) distance
@@ -115,34 +161,314 @@ Squared Euclidean distance
115
161
  Khiva::Distances.squared_euclidean(tss)
116
162
  ```
117
163
 
164
+ ## Features
165
+
166
+ Sum of square values
167
+
168
+ ```ruby
169
+ Khiva::Features.abs_energy(tss)
170
+ ```
171
+
172
+ Absolute sum of changes
173
+
174
+ ```ruby
175
+ Khiva::Features.absolute_sum_of_changes(tss)
176
+ ```
177
+
178
+ Number of values above the mean
179
+
180
+ ```ruby
181
+ Khiva::Features.count_above_mean(tss)
182
+ ```
183
+
184
+ Number of values below the mean
185
+
186
+ ```ruby
187
+ Khiva::Features.count_below_mean(tss)
188
+ ```
189
+
190
+ The spectral centroid (mean), variance, skew, and kurtosis of the absolute fourier transform spectrum
191
+
192
+ ```ruby
193
+ Khiva::Features.fft_aggregated(tss)
194
+ ```
195
+
196
+ First location of the maximum value
197
+
198
+ ```ruby
199
+ Khiva::Features.first_location_of_maximum(tss)
200
+ ```
201
+
202
+ First location of the minimum value
203
+
204
+ ```ruby
205
+ Khiva::Features.first_location_of_minimum(tss)
206
+ ```
207
+
208
+ Last location of the maximum value
209
+
210
+ ```ruby
211
+ Khiva::Features.last_location_of_maximum(tss)
212
+ ```
213
+
214
+ Last location of the minimum value
215
+
216
+ ```ruby
217
+ Khiva::Features.last_location_of_minimum(tss)
218
+ ```
219
+
220
+ Length of the series
221
+
222
+ ```ruby
223
+ Khiva::Features.length(tss)
224
+ ```
225
+
226
+ Local maximals
227
+
228
+ ```ruby
229
+ Khiva::Features.local_maximals(tss)
230
+ ```
231
+
232
+ Length of the longest consecutive subsequence above the mean
233
+
234
+ ```ruby
235
+ Khiva::Features.longest_strike_above_mean(tss)
236
+ ```
237
+
238
+ Length of the longest consecutive subsequence below the mean
239
+
240
+ ```ruby
241
+ Khiva::Features.longest_strike_below_mean(tss)
242
+ ```
243
+
244
+ Maximum
245
+
246
+ ```ruby
247
+ Khiva::Features.maximum(tss)
248
+ ```
249
+
250
+ Mean
251
+
252
+ ```ruby
253
+ Khiva::Features.mean(tss)
254
+ ```
255
+
256
+ Mean absolute change
257
+
258
+ ```ruby
259
+ Khiva::Features.mean_absolute_change(tss)
260
+ ```
261
+
262
+ Mean change
263
+
264
+ ```ruby
265
+ Khiva::Features.mean_change(tss)
266
+ ```
267
+
268
+ Mean of a central approximation of the second derivative
269
+
270
+ ```ruby
271
+ Khiva::Features.mean_second_derivative_central(tss)
272
+ ```
273
+
274
+ Median
275
+
276
+ ```ruby
277
+ Khiva::Features.median(tss)
278
+ ```
279
+
280
+ Minimum
281
+
282
+ ```ruby
283
+ Khiva::Features.minimum(tss)
284
+ ```
285
+
286
+ Ratio of unique values
287
+
288
+ ```ruby
289
+ Khiva::Features.ratio_value_number_to_time_series_length(tss)
290
+ ```
291
+
292
+ Sample entropy
293
+
294
+ ```ruby
295
+ Khiva::Features.sample_entropy(tss)
296
+ ```
297
+
298
+ Skewness
299
+
300
+ ```ruby
301
+ Khiva::Features.skewness(tss)
302
+ ```
303
+
304
+ Standard deviation
305
+
306
+ ```ruby
307
+ Khiva::Features.standard_deviation(tss)
308
+ ```
309
+
310
+ Sum of values
311
+
312
+ ```ruby
313
+ Khiva::Features.sum_values(tss)
314
+ ```
315
+
316
+ Number of occurrences of a value
317
+
318
+ ```ruby
319
+ Khiva::Features.value_count(tss, v)
320
+ ```
321
+
322
+ Variance
323
+
324
+ ```ruby
325
+ Khiva::Features.variance(tss)
326
+ ```
327
+
328
+ If variance is larger than one
329
+
330
+ ```ruby
331
+ Khiva::Features.variance_larger_than_standard_deviation(tss)
332
+ ```
333
+
334
+ ## Library
335
+
336
+ Get backend info
337
+
338
+ ```ruby
339
+ Khiva::Library.backend_info
340
+ ```
341
+
342
+ Get current backend
343
+
344
+ ```ruby
345
+ Khiva::Library.backend
346
+ ```
347
+
348
+ Get available backends
349
+
350
+ ```ruby
351
+ Khiva::Library.backends
352
+ ```
353
+
354
+ Set backend - `:default`, `:cpu`, `:cuda`, `:opencl`
355
+
356
+ ```ruby
357
+ Khiva::Library.set_backend(:cpu)
358
+ ```
359
+
360
+ Set device
361
+
362
+ ```ruby
363
+ Khiva::Library.set_device(device_id)
364
+ ```
365
+
366
+ Get device id
367
+
368
+ ```ruby
369
+ Khiva::Library.device_id
370
+ ```
371
+
372
+ Get device count
373
+
374
+ ```ruby
375
+ Khiva::Library.device_count
376
+ ```
377
+
378
+ Set device memory in GB
379
+
380
+ ```ruby
381
+ Khiva::Library.set_device_memory_in_gb(1.5)
382
+ ```
383
+
384
+ Get version
385
+
386
+ ```ruby
387
+ Khiva::Library.version
388
+ ```
389
+
390
+ ## Linalg
391
+
392
+ ```ruby
393
+ Khiva::Linalg.lls(a, b)
394
+ ```
395
+
396
+ ## Matrix
397
+
398
+ Calculate the matrix profile between `ta` and `tb` using a subsequence length of `m` with the STOMP algorithm
399
+
400
+ ```ruby
401
+ profile, index = Khiva::Matrix.stomp(ta, tb, m)
402
+ ```
403
+
404
+ Calculate the matrix profile between `t` and itself using a subsequence length of `m` with the STOMP algorithm
405
+
406
+ ```ruby
407
+ profile, index = Khiva::Matrix.stomp_self_join(t, m)
408
+ ```
409
+
410
+ Calculate the matrix profile between `ta` and `tb` using a subsequence length of `m`
411
+
412
+ ```ruby
413
+ profile, index = Khiva::Matrix.matrix_profile(ta, tb, m)
414
+ ```
415
+
416
+ Calculate the matrix profile between `t` and itself using a subsequence length of `m`
417
+
418
+ ```ruby
419
+ profile, index = Khiva::Matrix.matrix_profile_self_join(t, m)
420
+ ```
421
+
118
422
  ## Normalization
119
423
 
120
424
  Decimal scaling
121
425
 
122
426
  ```ruby
123
- Khiva::Distances.decimal_scaling_norm(tss)
124
- Khiva::Distances.decimal_scaling_norm!(tss)
427
+ Khiva::Normalization.decimal_scaling_norm(tss)
428
+ Khiva::Normalization.decimal_scaling_norm!(tss)
125
429
  ```
126
430
 
127
431
  Max min
128
432
 
129
433
  ```ruby
130
- Khiva::Distances.max_min_norm(tss)
131
- Khiva::Distances.max_min_norm!(tss)
434
+ Khiva::Normalization.max_min_norm(tss)
435
+ Khiva::Normalization.max_min_norm!(tss)
132
436
  ```
133
437
 
134
438
  Mean
135
439
 
136
440
  ```ruby
137
- Khiva::Distances.mean_norm(tss)
138
- Khiva::Distances.mean_norm!(tss)
441
+ Khiva::Normalization.mean_norm(tss)
442
+ Khiva::Normalization.mean_norm!(tss)
139
443
  ```
140
444
 
141
445
  Znorm
142
446
 
143
447
  ```ruby
144
- Khiva::Distances.znorm(tss)
145
- Khiva::Distances.znorm!(tss)
448
+ Khiva::Normalization.znorm(tss)
449
+ Khiva::Normalization.znorm!(tss)
450
+ ```
451
+
452
+ ## Polynomial
453
+
454
+ Least squares polynomial fit
455
+
456
+ ```ruby
457
+ Khiva::Polynomial.polyfit(x, y, deg)
458
+ ```
459
+
460
+ ## Regression
461
+
462
+ Linear least squares regression
463
+
464
+ ```ruby
465
+ slope, intercept, rvalue, pvalue, stderrest = Khiva::Regression.linear(xss, yss)
466
+ ```
467
+
468
+ ## Regularization
469
+
470
+ ```ruby
471
+ Khiva::Regularization.group_by(tss, aggregation_function, columns_key: 1, n_columns_value: 1)
146
472
  ```
147
473
 
148
474
  ## Statistics
@@ -153,14 +479,78 @@ Covariance
153
479
  Khiva::Statistics.covariance(tss, unbiased: false)
154
480
  ```
155
481
 
482
+ Kurtosis
483
+
484
+ ```ruby
485
+ Khiva::Statistics.kurtosis(tss)
486
+ ```
487
+
488
+ Ljung-Box
489
+
490
+ ```ruby
491
+ Khiva::Statistics.ljung_box(tss, lags)
492
+ ```
493
+
494
+ Moment
495
+
496
+ ```ruby
497
+ Khiva::Statistics.moment(tss, k)
498
+ ```
499
+
500
+ Quantile
501
+
502
+ ```ruby
503
+ Khiva::Statistics.quantile(tss, q, precision: 1e-8)
504
+ ```
505
+
506
+ Quantiles cut
507
+
508
+ ```ruby
509
+ Khiva::Statistics.quantiles_cut(tss, quantiles, precision: 1e-8)
510
+ ```
511
+
512
+ Standard deviation
513
+
514
+ ```ruby
515
+ Khiva::Statistics.sample_stdev(tss)
516
+ ```
517
+
518
+ Skewness
519
+
520
+ ```ruby
521
+ Khiva::Statistics.skewness(tss)
522
+ ```
523
+
156
524
  ## Khiva Installation
157
525
 
158
526
  ### Linux
159
527
 
160
- Run:
528
+ Install Boost and Eigen. On Ubuntu, use:
529
+
530
+ ```sh
531
+ sudo apt-get install libboost-all-dev libeigen3-dev
532
+ ```
533
+
534
+ Install ArrayFire:
535
+
536
+ ```sh
537
+ wget -q https://arrayfire.s3.amazonaws.com/3.7.3/ArrayFire-v3.7.3_Linux_x86_64.sh
538
+ chmod +x ./ArrayFire-v3.7.3_Linux_x86_64.sh
539
+ ./ArrayFire-v3.7.3_Linux_x86_64.sh --include-subdir --prefix=/opt
540
+ echo /opt/arrayfire/lib64 | sudo tee /etc/ld.so.conf.d/arrayfire.conf
541
+ sudo ldconfig
542
+ ```
543
+
544
+ And install Khiva:
161
545
 
162
546
  ```sh
163
- # todo
547
+ git clone --recursive --branch v0.5.0 https://github.com/shapelets/khiva
548
+ cd khiva
549
+ mkdir build
550
+ cd build
551
+ cmake .. -DKHIVA_USE_CONAN=OFF -DKHIVA_BUILD_TESTS=OFF -DKHIVA_BUILD_BENCHMARKS=OFF -DKHIVA_BUILD_JNI_BINDINGS=OFF
552
+ make -j4
553
+ sudo make install
164
554
  ```
165
555
 
166
556
  ### Mac
@@ -3,10 +3,17 @@ require "fiddle/import"
3
3
 
4
4
  # modules
5
5
  require "khiva/array"
6
+ require "khiva/clustering"
7
+ require "khiva/dimensionality"
6
8
  require "khiva/distances"
9
+ require "khiva/features"
7
10
  require "khiva/library"
11
+ require "khiva/linalg"
8
12
  require "khiva/matrix"
9
13
  require "khiva/normalization"
14
+ require "khiva/polynomial"
15
+ require "khiva/regression"
16
+ require "khiva/regularization"
10
17
  require "khiva/statistics"
11
18
  require "khiva/utils"
12
19
  require "khiva/version"
@@ -30,8 +37,6 @@ module Khiva
30
37
  autoload :FFI, "khiva/ffi"
31
38
 
32
39
  def self.lib_version
33
- v = Fiddle::Pointer.malloc(20)
34
- FFI.call(:version, v.ref)
35
- v.to_s
40
+ Library.version
36
41
  end
37
42
  end
@@ -82,6 +82,7 @@ module Khiva
82
82
  def to_a
83
83
  d = dims
84
84
  d.pop while d.last == 1 && d.size > 1
85
+ d.reverse!
85
86
 
86
87
  elements = dims.inject(1, &:*)
87
88
  data = Fiddle::Pointer.malloc(elements * element_size)
@@ -0,0 +1,19 @@
1
+ module Khiva
2
+ module Clustering
3
+ class << self
4
+ def k_means(tss, k, tolerance: 1e-10, max_iterations: 100)
5
+ centroids = Utils.create_ptr
6
+ labels = Utils.create_ptr
7
+ FFI.call(:k_means, tss, Utils.int_ptr(k), centroids, labels, Utils.float_ptr(tolerance), Utils.int_ptr(max_iterations))
8
+ [Array.new(centroids), Array.new(labels)]
9
+ end
10
+
11
+ def k_shape(tss, k, tolerance: 1e-10, max_iterations: 100)
12
+ centroids = Utils.create_ptr
13
+ labels = Utils.create_ptr
14
+ FFI.call(:k_shape, tss, Utils.int_ptr(k), centroids, labels, Utils.float_ptr(tolerance), Utils.int_ptr(max_iterations))
15
+ [Array.new(centroids), Array.new(labels)]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ module Khiva
2
+ module Dimensionality
3
+ class << self
4
+ def paa(a, bins)
5
+ result = Utils.create_ptr
6
+ FFI.call(:paa, a, Utils.int_ptr(bins), result)
7
+ Array.new(result)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,173 @@
1
+ module Khiva
2
+ module Features
3
+ class << self
4
+ def abs_energy(arr)
5
+ result = Utils.create_ptr
6
+ FFI.call(:abs_energy, arr, result)
7
+ Array.new(result)
8
+ end
9
+
10
+ def absolute_sum_of_changes(arr)
11
+ result = Utils.create_ptr
12
+ FFI.call(:absolute_sum_of_changes, arr, result)
13
+ Array.new(result)
14
+ end
15
+
16
+ def count_above_mean(arr)
17
+ result = Utils.create_ptr
18
+ FFI.call(:count_above_mean, arr, result)
19
+ Array.new(result)
20
+ end
21
+
22
+ def count_below_mean(arr)
23
+ result = Utils.create_ptr
24
+ FFI.call(:count_below_mean, arr, result)
25
+ Array.new(result)
26
+ end
27
+
28
+ def fft_aggregated(arr)
29
+ result = Utils.create_ptr
30
+ FFI.call(:fft_aggregated, arr, result)
31
+ Array.new(result)
32
+ end
33
+
34
+ def first_location_of_maximum(arr)
35
+ result = Utils.create_ptr
36
+ FFI.call(:first_location_of_maximum, arr, result)
37
+ Array.new(result)
38
+ end
39
+
40
+ def first_location_of_minimum(arr)
41
+ result = Utils.create_ptr
42
+ FFI.call(:first_location_of_minimum, arr, result)
43
+ Array.new(result)
44
+ end
45
+
46
+ def last_location_of_maximum(arr)
47
+ result = Utils.create_ptr
48
+ FFI.call(:last_location_of_maximum, arr, result)
49
+ Array.new(result)
50
+ end
51
+
52
+ def last_location_of_minimum(arr)
53
+ result = Utils.create_ptr
54
+ FFI.call(:last_location_of_minimum, arr, result)
55
+ Array.new(result)
56
+ end
57
+
58
+ def length(arr)
59
+ result = Utils.create_ptr
60
+ FFI.call(:length, arr, result)
61
+ Array.new(result)
62
+ end
63
+
64
+ def local_maximals(arr)
65
+ result = Utils.create_ptr
66
+ FFI.call(:local_maximals, arr, result)
67
+ Array.new(result)
68
+ end
69
+
70
+ def longest_strike_above_mean(arr)
71
+ result = Utils.create_ptr
72
+ FFI.call(:longest_strike_above_mean, arr, result)
73
+ Array.new(result)
74
+ end
75
+
76
+ def longest_strike_below_mean(arr)
77
+ result = Utils.create_ptr
78
+ FFI.call(:longest_strike_below_mean, arr, result)
79
+ Array.new(result)
80
+ end
81
+
82
+ def maximum(arr)
83
+ result = Utils.create_ptr
84
+ FFI.call(:maximum, arr, result)
85
+ Array.new(result)
86
+ end
87
+
88
+ def mean(arr)
89
+ result = Utils.create_ptr
90
+ FFI.call(:mean, arr, result)
91
+ Array.new(result)
92
+ end
93
+
94
+ def mean_absolute_change(arr)
95
+ result = Utils.create_ptr
96
+ FFI.call(:mean_absolute_change, arr, result)
97
+ Array.new(result)
98
+ end
99
+
100
+ def mean_change(arr)
101
+ result = Utils.create_ptr
102
+ FFI.call(:mean_change, arr, result)
103
+ Array.new(result)
104
+ end
105
+
106
+ def mean_second_derivative_central(arr)
107
+ result = Utils.create_ptr
108
+ FFI.call(:mean_second_derivative_central, arr, result)
109
+ Array.new(result)
110
+ end
111
+
112
+ def median(arr)
113
+ result = Utils.create_ptr
114
+ FFI.call(:median, arr, result)
115
+ Array.new(result)
116
+ end
117
+
118
+ def minimum(arr)
119
+ result = Utils.create_ptr
120
+ FFI.call(:minimum, arr, result)
121
+ Array.new(result)
122
+ end
123
+
124
+ def ratio_value_number_to_time_series_length(arr)
125
+ result = Utils.create_ptr
126
+ FFI.call(:ratio_value_number_to_time_series_length, arr, result)
127
+ Array.new(result)
128
+ end
129
+
130
+ def sample_entropy(arr)
131
+ result = Utils.create_ptr
132
+ FFI.call(:sample_entropy, arr, result)
133
+ Array.new(result)
134
+ end
135
+
136
+ def skewness(arr)
137
+ result = Utils.create_ptr
138
+ FFI.call(:skewness, arr, result)
139
+ Array.new(result)
140
+ end
141
+
142
+ def standard_deviation(arr)
143
+ result = Utils.create_ptr
144
+ FFI.call(:standard_deviation, arr, result)
145
+ Array.new(result)
146
+ end
147
+
148
+ def sum_values(arr)
149
+ result = Utils.create_ptr
150
+ FFI.call(:sum_values, arr, result)
151
+ Array.new(result)
152
+ end
153
+
154
+ def value_count(arr, v)
155
+ result = Utils.create_ptr
156
+ FFI.call(:value_count, arr, Utils.float_ptr(v), result)
157
+ Array.new(result)
158
+ end
159
+
160
+ def variance(arr)
161
+ result = Utils.create_ptr
162
+ FFI.call(:variance, arr, result)
163
+ Array.new(result)
164
+ end
165
+
166
+ def variance_larger_than_standard_deviation(arr)
167
+ result = Utils.create_ptr
168
+ FFI.call(:variance_larger_than_standard_deviation, arr, result)
169
+ Array.new(result)
170
+ end
171
+ end
172
+ end
173
+ end
@@ -41,12 +41,99 @@ module Khiva
41
41
  extern "void khiva_not(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
42
42
  extern "void copy(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
43
43
 
44
+ # clustering.h
45
+ extern "void k_means(const khiva_array *tss, const int *k, khiva_array *centroids, khiva_array *labels, const float *tolerance, const int *max_iterations, int *error_code, char *error_message)"
46
+ extern "void k_shape(const khiva_array *tss, const int *k, khiva_array *centroids, khiva_array *labels, const float *tolerance, const int *max_iterations, int *error_code, char *error_message)"
47
+
48
+ # dimensionality.h
49
+ extern "void paa(const khiva_array *a, const int *bins, khiva_array *result, int *error_code, char *error_message)"
50
+ extern "void pip(const khiva_array *a, const int *number_ips, khiva_array *result, int *error_code, char *error_message)"
51
+ extern "void pla_bottom_up(const khiva_array *ts, const float *max_error, khiva_array *result, int *error_code, char *error_message)"
52
+ extern "void pla_sliding_window(const khiva_array *ts, const float *max_error, khiva_array *result, int *error_code, char *error_message)"
53
+ extern "void ramer_douglas_peucker(const khiva_array *points, const double *epsilon, khiva_array *res_points, int *error_code, char *error_message)"
54
+ extern "void sax(const khiva_array *a, const int *alphabet_size, khiva_array *result, int *error_code, char *error_message)"
55
+ extern "void visvalingam(const khiva_array *points, const int *num_points, khiva_array *res_points, int *error_code, char *error_message)"
56
+
57
+ # features.h
58
+ extern "void abs_energy(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
59
+ extern "void absolute_sum_of_changes(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
60
+ extern "void aggregated_autocorrelation(const khiva_array *array, const int *aggregation_function, khiva_array *result, int *error_code, char *error_message)"
61
+ extern "void aggregated_linear_trend(const khiva_array *array, const long *chunkSize, const int *aggregation_function, khiva_array *slope, khiva_array *intercept, khiva_array *rvalue, khiva_array *pvalue, khiva_array *stderrest, int *error_code, char *error_message)"
62
+ extern "void approximate_entropy(const khiva_array *array, const int *m, const float *r, khiva_array *result, int *error_code, char *error_message)"
63
+ extern "void cross_covariance(const khiva_array *xss, const khiva_array *yss, const bool *unbiased, khiva_array *result, int *error_code, char *error_message)"
64
+ extern "void auto_covariance(const khiva_array *array, const bool *unbiased, khiva_array *result, int *error_code, char *error_message)"
65
+ extern "void cross_correlation(const khiva_array *xss, const khiva_array *yss, const bool *unbiased, khiva_array *result, int *error_code, char *error_message)"
66
+ extern "void auto_correlation(const khiva_array *array, const long *max_lag, const bool *unbiased, khiva_array *result, int *error_code, char *error_message)"
67
+ extern "void binned_entropy(const khiva_array *array, const int *max_bins, khiva_array *result, int *error_code, char *error_message)"
68
+ extern "void c3(const khiva_array *array, const long *lag, khiva_array *result, int *error_code, char *error_message)"
69
+ extern "void cid_ce(const khiva_array *array, const bool *zNormalize, khiva_array *result, int *error_code, char *error_message)"
70
+ extern "void count_above_mean(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
71
+ extern "void count_below_mean(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
72
+ extern "void cwt_coefficients(const khiva_array *array, const khiva_array *width, const int *coeff, const int *w, khiva_array *result, int *error_code, char *error_message)"
73
+ extern "void energy_ratio_by_chunks(const khiva_array *array, const long *num_segments, const long *segment_focus, khiva_array *result, int *error_code, char *error_message)"
74
+ extern "void fft_aggregated(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
75
+ extern "void fft_coefficient(const khiva_array *array, const long *coefficient, khiva_array *real, khiva_array *imag, khiva_array *absolute, khiva_array *angle, int *error_code, char *error_message)"
76
+ extern "void first_location_of_maximum(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
77
+ extern "void first_location_of_minimum(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
78
+ extern "void friedrich_coefficients(const khiva_array *array, const int *m, const float *r, khiva_array *result, int *error_code, char *error_message)"
79
+ extern "void has_duplicates(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
80
+ extern "void has_duplicate_max(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
81
+ extern "void has_duplicate_min(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
82
+ extern "void index_mass_quantile(const khiva_array *array, const float *q, khiva_array *result, int *error_code, char *error_message)"
83
+ extern "void kurtosis(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
84
+ extern "void large_standard_deviation(const khiva_array *array, const float *r, khiva_array *result, int *error_code, char *error_message)"
85
+ extern "void last_location_of_maximum(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
86
+ extern "void last_location_of_minimum(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
87
+ extern "void length(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
88
+ extern "void linear_trend(const khiva_array *array, khiva_array *pvalue, khiva_array *rvalue, khiva_array *intercept, khiva_array *slope, khiva_array *stdrr, int *error_code, char *error_message)"
89
+ extern "void local_maximals(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
90
+ extern "void longest_strike_above_mean(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
91
+ extern "void longest_strike_below_mean(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
92
+ extern "void max_langevin_fixed_point(const khiva_array *array, const int *m, const float *r, khiva_array *result, int *error_code, char *error_message)"
93
+ extern "void maximum(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
94
+ extern "void mean(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
95
+ extern "void mean_absolute_change(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
96
+ extern "void mean_change(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
97
+ extern "void mean_second_derivative_central(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
98
+ extern "void median(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
99
+ extern "void minimum(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
100
+ extern "void number_crossing_m(const khiva_array *array, const int *m, khiva_array *result, int *error_code, char *error_message)"
101
+ extern "void number_cwt_peaks(const khiva_array *array, const int *max_w, khiva_array *result, int *error_code, char *error_message)"
102
+ extern "void number_peaks(const khiva_array *array, const int *n, khiva_array *result, int *error_code, char *error_message)"
103
+ extern "void partial_autocorrelation(const khiva_array *array, const khiva_array *lags, khiva_array *result, int *error_code, char *error_message)"
104
+ extern "void percentage_of_reoccurring_datapoints_to_all_datapoints(const khiva_array *array, const bool *is_sorted, khiva_array *result, int *error_code, char *error_message)"
105
+ extern "void percentage_of_reoccurring_values_to_all_values(const khiva_array *array, const bool *is_sorted, khiva_array *result, int *error_code, char *error_message)"
106
+ extern "void quantile(const khiva_array *array, const khiva_array *q, const float *precision, khiva_array *result, int *error_code, char *error_message)"
107
+ extern "void range_count(const khiva_array *array, const float *min, const float *max, khiva_array *result, int *error_code, char *error_message)"
108
+ extern "void ratio_beyond_r_sigma(const khiva_array *array, const float *r, khiva_array *result, int *error_code,vchar *error_message)"
109
+ extern "void ratio_value_number_to_time_series_length(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
110
+ extern "void sample_entropy(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
111
+ extern "void skewness(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
112
+ extern "void spkt_welch_density(const khiva_array *array, const int *coeff, khiva_array *result, int *error_code, char *error_message)"
113
+ extern "void standard_deviation(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
114
+ extern "void sum_of_reoccurring_datapoints(const khiva_array *array, const bool *is_sorted, khiva_array *result, int *error_code, char *error_message)"
115
+ extern "void sum_of_reoccurring_values(const khiva_array *array, const bool *is_sorted, khiva_array *result, int *error_code, char *error_message)"
116
+ extern "void sum_values(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
117
+ extern "void symmetry_looking(const khiva_array *array, const float *r, khiva_array *result, int *error_code, char *error_message)"
118
+ extern "void time_reversal_asymmetry_statistic(const khiva_array *array, const int *lag, khiva_array *result, int *error_code, char *error_message)"
119
+ extern "void value_count(const khiva_array *array, const float *v, khiva_array *result, int *error_code, char *error_message)"
120
+ extern "void variance(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
121
+ extern "void variance_larger_than_standard_deviation(const khiva_array *array, khiva_array *result, int *error_code, char *error_message)"
122
+
44
123
  # library.h
45
124
  extern "void backend_info(char **info, int *error_code, char *error_message)"
46
125
  extern "void set_backend(const int *backend, int *error_code, char *error_message)"
126
+ extern "void get_backend(int *backend, int *error_code, char *error_message)"
127
+ extern "void get_backends(int *backends, int *error_code, char *error_message)"
47
128
  extern "void set_device(const int *device, int *error_code, char *error_message)"
129
+ extern "void get_device_id(int *device_id, int *error_code, char *error_message)"
130
+ extern "void get_device_count(int *device_count, int *error_code, char *error_message)"
131
+ extern "void set_device_memory_in_gb(const double *memory, int *error_code, char *error_message)"
48
132
  extern "void version(char **v, int *error_code, char *error_message)"
49
133
 
134
+ # linalg.h
135
+ extern "void lls(const khiva_array *a, const khiva_array *b, khiva_array *result, int *error_code, char *error_message)"
136
+
50
137
  # distances.h
51
138
  extern "void dtw(const khiva_array *tss, khiva_array *result, int *error_code, char *error_message)"
52
139
  extern "void euclidean(const khiva_array *tss, khiva_array *result, int *error_code, char *error_message)"
@@ -57,7 +144,15 @@ module Khiva
57
144
 
58
145
  # matrix.h
59
146
  extern "void find_best_n_discords(const khiva_array *profile, const khiva_array *index, long m, long n, khiva_array *discord_distances, khiva_array *discord_indices, khiva_array *subsequence_indices, bool self_join, int *error_code, char *error_message)"
147
+ extern "void find_best_n_motifs(const khiva_array *profile, const khiva_array *index, long m, long n, khiva_array *motif_distances, khiva_array *motif_indices, khiva_array *subsequence_indices, bool self_join, int *error_code, char *error_message)"
148
+ extern "void find_best_n_occurrences(const khiva_array *q, const khiva_array *t, long n, khiva_array *distances, khiva_array *indexes, int *error_code, char *error_message)"
149
+ extern "void mass(const khiva_array *q, const khiva_array *t, khiva_array *distances, int *error_code, char *error_message)"
60
150
  extern "void stomp(const khiva_array *tssa, const khiva_array *tssb, long m, khiva_array *p, khiva_array *i, int *error_code, char *error_message)"
151
+ extern "void stomp_self_join(const khiva_array *tss, long m, khiva_array *p, khiva_array *i, int *error_code, char *error_message)"
152
+ extern "void matrix_profile(const khiva_array *tssa, const khiva_array *tssb, long m, khiva_array *p, khiva_array *i, int *error_code, char *error_message)"
153
+ extern "void matrix_profile_self_join(const khiva_array *tss, long m, khiva_array *p, khiva_array *i, int *error_code, char *error_message)"
154
+ extern "void matrix_profile_lr(const khiva_array *tss, long m, khiva_array *pleft, khiva_array *ileft, khiva_array *pright, khiva_array *iright, int *error_code, char *error_message)"
155
+ extern "void get_chains(const khiva_array *tss, long m, khiva_array *chains, int *error_code, char *error_message)"
61
156
 
62
157
  # normalization.h
63
158
  extern "void decimal_scaling_norm(const khiva_array *tss, khiva_array *result, int *error_code, char *error_message)"
@@ -69,6 +164,16 @@ module Khiva
69
164
  extern "void znorm(const khiva_array *tss, const double *epsilon, khiva_array *result, int *error_code, char *error_message)"
70
165
  extern "void znorm_in_place(khiva_array *tss, const double *epsilon, int *error_code, char *error_message)"
71
166
 
167
+ # polynomial.h
168
+ extern "void polyfit(const khiva_array *x, const khiva_array *y, const int *deg, khiva_array *result, int *error_code, char *error_message)"
169
+ extern "void roots(const khiva_array *p, khiva_array *result, int *error_code, char *error_message)"
170
+
171
+ # regression.h
172
+ extern "void linear(const khiva_array *xss, const khiva_array *yss, khiva_array *slope, khiva_array *intercept, khiva_array *rvalue, khiva_array *pvalue, khiva_array *stderrest, int *error_code, char *error_message)"
173
+
174
+ # regularization.h
175
+ extern "void group_by(const khiva_array *array, const int *aggregation_function, const int *n_columns_key, const int *n_columns_value, khiva_array *result, int *error_code, char *error_message)"
176
+
72
177
  # statistics.h
73
178
  extern "void covariance_statistics(const khiva_array *tss, const bool *unbiased, khiva_array *result, int *error_code, char *error_message)"
74
179
  extern "void kurtosis_statistics(const khiva_array *tss, khiva_array *result, int *error_code, char *error_message)"
@@ -14,6 +14,19 @@ module Khiva
14
14
  info.to_s
15
15
  end
16
16
 
17
+ def backend
18
+ backend = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT)
19
+ FFI.call(:get_backend, backend)
20
+ BACKENDS.map(&:reverse).to_h[backend.to_s(backend.size).unpack1("i")]
21
+ end
22
+
23
+ def backends
24
+ backends = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT)
25
+ FFI.call(:get_backends, backends)
26
+ mask = backends.to_s(backends.size).unpack1("i")
27
+ BACKENDS.select { |_, v| mask & v != 0 }.map(&:first)
28
+ end
29
+
17
30
  def set_backend(backend)
18
31
  b = BACKENDS[backend]
19
32
  raise Error, "Invalid backend: #{backend}" unless b
@@ -23,6 +36,28 @@ module Khiva
23
36
  def set_device(device)
24
37
  FFI.call(:set_device, Utils.int_ptr(device))
25
38
  end
39
+
40
+ def device_id
41
+ device_id = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT)
42
+ FFI.call(:get_device_id, device_id)
43
+ device_id.to_s(device_id.size).unpack1("i")
44
+ end
45
+
46
+ def device_count
47
+ device_count = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT)
48
+ FFI.call(:get_device_count, device_count)
49
+ device_count.to_s(device_count.size).unpack1("i")
50
+ end
51
+
52
+ def set_device_memory_in_gb(memory)
53
+ FFI.call(:set_device_memory_in_gb, Utils.double_ptr(memory))
54
+ end
55
+
56
+ def version
57
+ v = Fiddle::Pointer.malloc(20)
58
+ FFI.call(:version, v.ref)
59
+ v.to_s
60
+ end
26
61
  end
27
62
  end
28
63
  end
@@ -0,0 +1,11 @@
1
+ module Khiva
2
+ module Linalg
3
+ class << self
4
+ def lls(a, b)
5
+ result = Utils.create_ptr
6
+ FFI.call(:lls, a, b, result)
7
+ Array.new(result)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -9,12 +9,41 @@ module Khiva
9
9
  [Array.new(discord_distances), Array.new(discord_indices), Array.new(subsequence_indices)]
10
10
  end
11
11
 
12
+ def find_best_n_motifs(profile, index, m, n, self_join: false)
13
+ motif_distances = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
14
+ motif_indices = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
15
+ subsequence_indices = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
16
+ FFI.call(:find_best_n_motifs, profile, index, m, n, motif_distances, motif_indices, subsequence_indices, self_join ? 1 : 0)
17
+ [Array.new(motif_distances), Array.new(motif_indices), Array.new(subsequence_indices)]
18
+ end
19
+
12
20
  def stomp(tssa, tssb, m)
13
21
  profile = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
14
22
  index = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
15
23
  FFI.call(:stomp, tssa, tssb, m, profile, index)
16
24
  [Array.new(profile), Array.new(index)]
17
25
  end
26
+
27
+ def stomp_self_join(tss, m)
28
+ profile = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
29
+ index = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
30
+ FFI.call(:stomp_self_join, tss, m, profile, index)
31
+ [Array.new(profile), Array.new(index)]
32
+ end
33
+
34
+ def matrix_profile(tssa, tssb, m)
35
+ profile = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
36
+ index = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
37
+ FFI.call(:matrix_profile, tssa, tssb, m, profile, index)
38
+ [Array.new(profile), Array.new(index)]
39
+ end
40
+
41
+ def matrix_profile_self_join(tss, m)
42
+ profile = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
43
+ index = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
44
+ FFI.call(:matrix_profile_self_join, tss, m, profile, index)
45
+ [Array.new(profile), Array.new(index)]
46
+ end
18
47
  end
19
48
  end
20
49
  end
@@ -0,0 +1,11 @@
1
+ module Khiva
2
+ module Polynomial
3
+ class << self
4
+ def polyfit(x, y, deg)
5
+ result = Utils.create_ptr
6
+ FFI.call(:polyfit, x, y, Utils.int_ptr(deg), result)
7
+ Array.new(result)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ module Khiva
2
+ module Regression
3
+ class << self
4
+ def linear(xss, yss)
5
+ slope = Utils.create_ptr
6
+ intercept = Utils.create_ptr
7
+ rvalue = Utils.create_ptr
8
+ pvalue = Utils.create_ptr
9
+ stderrest = Utils.create_ptr
10
+ FFI.call(:linear, xss, yss, slope, intercept, rvalue, pvalue, stderrest)
11
+ [Array.new(slope), Array.new(intercept), Array.new(rvalue), Array.new(pvalue), Array.new(stderrest)]
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module Khiva
2
+ module Regularization
3
+ class << self
4
+ def group_by(tss, aggregation_function, n_columns_key: 1, n_columns_value: 1)
5
+ result = Utils.create_ptr
6
+ FFI.call(:group_by, tss, Utils.int_ptr(aggregation_function), Utils.int_ptr(n_columns_key), Utils.int_ptr(n_columns_value), result)
7
+ Array.new(result)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -6,6 +6,48 @@ module Khiva
6
6
  FFI.call(:covariance_statistics, tss, Utils.bool_ptr(unbiased), result)
7
7
  Array.new(result)
8
8
  end
9
+
10
+ def kurtosis(tss)
11
+ result = Utils.create_ptr
12
+ FFI.call(:kurtosis_statistics, tss, result)
13
+ Array.new(result)
14
+ end
15
+
16
+ def ljung_box(tss, lags)
17
+ result = Utils.create_ptr
18
+ FFI.call(:ljung_box, tss, Utils.long_ptr(lags), result)
19
+ Array.new(result)
20
+ end
21
+
22
+ def moment(tss, k)
23
+ result = Utils.create_ptr
24
+ FFI.call(:moment_statistics, tss, Utils.int_ptr(k), result)
25
+ Array.new(result)
26
+ end
27
+
28
+ def quantile(tss, q, precision: 1e-8)
29
+ result = Utils.create_ptr
30
+ FFI.call(:quantile_statistics, tss, q, Utils.float_ptr(precision), result)
31
+ Array.new(result)
32
+ end
33
+
34
+ def quantiles_cut(tss, quantiles, precision: 1e-8)
35
+ result = Utils.create_ptr
36
+ FFI.call(:quantiles_cut_statistics, tss, Utils.float_ptr(quantiles), Utils.float_ptr(precision), result)
37
+ Array.new(result)
38
+ end
39
+
40
+ def sample_stdev(tss)
41
+ result = Utils.create_ptr
42
+ FFI.call(:sample_stdev_statistics, tss, result)
43
+ Array.new(result)
44
+ end
45
+
46
+ def skewness(tss)
47
+ result = Utils.create_ptr
48
+ FFI.call(:skewness_statistics, tss, result)
49
+ Array.new(result)
50
+ end
9
51
  end
10
52
  end
11
53
  end
@@ -6,7 +6,15 @@ module Khiva
6
6
  end
7
7
 
8
8
  def int_ptr(v)
9
- Fiddle::Pointer[[v].pack("i*")]
9
+ Fiddle::Pointer[[v].pack("i")]
10
+ end
11
+
12
+ def long_ptr(v)
13
+ Fiddle::Pointer[[v].pack("L!")]
14
+ end
15
+
16
+ def float_ptr(v)
17
+ Fiddle::Pointer[[v].pack("f")]
10
18
  end
11
19
 
12
20
  def double_ptr(v)
@@ -1,3 +1,3 @@
1
1
  module Khiva
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: khiva
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
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-17 00:00:00.000000000 Z
11
+ date: 2020-12-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: andrew@chartkick.com
@@ -21,11 +21,18 @@ files:
21
21
  - README.md
22
22
  - lib/khiva.rb
23
23
  - lib/khiva/array.rb
24
+ - lib/khiva/clustering.rb
25
+ - lib/khiva/dimensionality.rb
24
26
  - lib/khiva/distances.rb
27
+ - lib/khiva/features.rb
25
28
  - lib/khiva/ffi.rb
26
29
  - lib/khiva/library.rb
30
+ - lib/khiva/linalg.rb
27
31
  - lib/khiva/matrix.rb
28
32
  - lib/khiva/normalization.rb
33
+ - lib/khiva/polynomial.rb
34
+ - lib/khiva/regression.rb
35
+ - lib/khiva/regularization.rb
29
36
  - lib/khiva/statistics.rb
30
37
  - lib/khiva/utils.rb
31
38
  - lib/khiva/version.rb