midas-edge 0.2.0 → 0.3.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: 9e4c7b4cac2e7a9dac3a6085b40d79a48b9f14dad32834e0d267f7bb667d86b9
4
- data.tar.gz: abd0836d284e7a9c34c7733f2f195e38faca2fb1ac6ab01687c3790bc96d3cfa
3
+ metadata.gz: 464c47984f7e61fc4e726a0e4499a56a91d0294ff1b1c2d28f65795d11a7b78b
4
+ data.tar.gz: 38cc5f7c6a671fc5508c36ae546c92219eb2eba51499b4ff4bf1036acf33d444
5
5
  SHA512:
6
- metadata.gz: 48c92dbdbff039a514ca99207a88276fada4a1391497a1fd4595176f90bec0ac46f0fc89126d36c7ccfc3a1afe212aa11f2142fb7d3d836734f64ab912a88ffb
7
- data.tar.gz: 9a2a140ed5d5a120969ee5fc0a599cccc6d590755c9eddf949c2e0a5897aaf39b6f8fe8137c9dde3fd418c78f04cdd8801d1353ca61009d4fbae5a610ad2edc5
6
+ metadata.gz: 44251431f027cf89f46b3c1f51fcc73e72bfe5ae28121e2cf0f6292e622cfc9994fc343452947827c19505ecf5335dd9a22a46280c77dc4914a8e4ec61b21557
7
+ data.tar.gz: c925fffbd5e8dca94c90f7eb1a5607cc569373e37797d6971eabf022181fb72eaf7c11d23aeee01707c899a0a76663e8897906a93df5f947276b5cda034b85e1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## 0.3.1 (2021-05-23)
2
+
3
+ - Improved performance
4
+
5
+ ## 0.3.0 (2021-05-17)
6
+
7
+ - Updated to Rice 4
8
+ - Dropped support for Ruby < 2.6
9
+
10
+ ## 0.2.3 (2020-11-17)
11
+
12
+ - Updated MIDAS to 1.1.2
13
+
14
+ ## 0.2.2 (2020-09-23)
15
+
16
+ - Updated MIDAS to 1.1.0
17
+
18
+ ## 0.2.1 (2020-06-17)
19
+
20
+ - Fixed installation (missing header files)
21
+
1
22
  ## 0.2.0 (2020-06-17)
2
23
 
3
24
  - Updated MIDAS to 1.0.0
data/NOTICE.txt CHANGED
@@ -1,4 +1,5 @@
1
- Copyright 2020 Andrew Kane
1
+ Copyright 2020 Rui Liu (liurui39660) and Siddharth Bhatia (bhatiasiddharth)
2
+ Copyright 2020-2021 Andrew Kane
2
3
 
3
4
  Licensed under the Apache License, Version 2.0 (the "License");
4
5
  you may not use this file except in compliance with the License.
data/README.md CHANGED
@@ -2,15 +2,14 @@
2
2
 
3
3
  [MIDAS](https://github.com/bhatiasiddharth/MIDAS) - edge stream anomaly detection - for Ruby
4
4
 
5
- [![Build Status](https://travis-ci.org/ankane/midas.svg?branch=master)](https://travis-ci.org/ankane/midas)
5
+ [![Build Status](https://github.com/ankane/midas/workflows/build/badge.svg?branch=master)](https://github.com/ankane/midas/actions)
6
6
 
7
7
  ## Installation
8
8
 
9
- Add these lines to your application’s Gemfile:
9
+ Add this line to your application’s Gemfile:
10
10
 
11
11
  ```ruby
12
12
  gem 'midas-edge'
13
- gem 'rice', github: 'jasonroelofs/rice' # for now for c++17
14
13
  ```
15
14
 
16
15
  ## Getting Started
data/ext/midas/ext.cpp CHANGED
@@ -8,29 +8,42 @@
8
8
  #include <RelationalCore.hpp>
9
9
 
10
10
  // rice
11
- #include <rice/Module.hpp>
12
- #include <rice/String.hpp>
11
+ #include <rice/rice.hpp>
12
+ #include <rice/stl.hpp>
13
13
 
14
- using Rice::Module;
15
- using Rice::String;
16
- using Rice::define_module;
17
- using Rice::define_class_under;
14
+ // numo
15
+ #include "numo.hpp"
18
16
 
19
- void load_str(std::vector<int>& src, std::vector<int>& dst, std::vector<int>& times, std::string input, bool directed) {
20
- int* input_ptr = (int*) input.data();
21
- size_t n = input.size() / sizeof(int);
17
+ void load_array(std::vector<int>& src, std::vector<int>& dst, std::vector<int>& times, numo::Int32 input, bool directed) {
18
+ auto shape = input.shape();
19
+ if (input.ndim() != 2 || shape[1] != 3) {
20
+ throw Rice::Exception(rb_eArgError, "Bad shape");
21
+ }
22
+
23
+ auto input_ptr = input.read_ptr();
24
+ auto n = shape[0];
25
+ auto sz = input.size();
22
26
 
23
27
  if (directed) {
24
- for (size_t i = 0; i < n; i += 3) {
28
+ src.reserve(n);
29
+ dst.reserve(n);
30
+ times.reserve(n);
31
+
32
+ for (size_t i = 0; i < sz; i += 3) {
25
33
  src.push_back(input_ptr[i]);
26
34
  dst.push_back(input_ptr[i + 1]);
27
35
  times.push_back(input_ptr[i + 2]);
28
36
  }
29
37
  } else {
30
- for (size_t i = 0; i < n; i += 3) {
38
+ src.reserve(n * 2);
39
+ dst.reserve(n * 2);
40
+ times.reserve(n * 2);
41
+
42
+ for (size_t i = 0; i < sz; i += 3) {
31
43
  src.push_back(input_ptr[i]);
32
44
  dst.push_back(input_ptr[i + 1]);
33
45
  times.push_back(input_ptr[i + 2]);
46
+
34
47
  src.push_back(input_ptr[i + 1]);
35
48
  dst.push_back(input_ptr[i]);
36
49
  times.push_back(input_ptr[i + 2]);
@@ -41,38 +54,41 @@ void load_str(std::vector<int>& src, std::vector<int>& dst, std::vector<int>& ti
41
54
  // load_data from main.cpp
42
55
  // modified to throw std::runtime_error when cannot find file
43
56
  // instead of exiting
44
- void load_file(std::vector<int>& src, std::vector<int>& dst, std::vector<int>& times, std::string input_file, bool undirected)
45
- {
57
+ void load_file(std::vector<int>& src, std::vector<int>& dst, std::vector<int>& times, Rice::String input_file, bool directed) {
46
58
  FILE* infile = fopen(input_file.c_str(), "r");
47
59
  if (infile == NULL) {
48
- throw std::runtime_error("Could not read file: " + input_file);
60
+ throw std::runtime_error("Could not read file: " + input_file.str());
49
61
  }
50
62
 
51
63
  int s, d, t;
52
64
 
53
- if (undirected == false) {
65
+ if (directed) {
54
66
  while (fscanf(infile, "%d,%d,%d", &s, &d, &t) == 3) {
55
67
  src.push_back(s);
56
68
  dst.push_back(d);
57
69
  times.push_back(t);
58
70
  }
59
- }
60
- else {
71
+ } else {
61
72
  while (fscanf(infile, "%d,%d,%d", &s, &d, &t) == 3) {
62
73
  src.push_back(s);
63
74
  dst.push_back(d);
64
75
  times.push_back(t);
76
+
65
77
  src.push_back(d);
66
78
  dst.push_back(s);
67
79
  times.push_back(t);
68
80
  }
69
81
  }
82
+
83
+ fclose(infile);
70
84
  }
71
85
 
72
- std::string fit_predict(std::vector<int>& src, std::vector<int>& dst, std::vector<int>& times, int num_rows, int num_buckets, float factor, float threshold, bool relations, int seed) {
86
+ Rice::Object fit_predict(std::vector<int>& src, std::vector<int>& dst, std::vector<int>& times, int num_rows, int num_buckets, float factor, float threshold, bool relations, int seed) {
73
87
  srand(seed);
74
88
  size_t n = src.size();
75
- const auto result = new float[n];
89
+
90
+ auto ary = numo::SFloat({n});
91
+ auto result = ary.write_ptr();
76
92
 
77
93
  if (!std::isnan(threshold)) {
78
94
  MIDAS::FilteringCore midas(num_rows, num_buckets, threshold, factor);
@@ -90,27 +106,24 @@ std::string fit_predict(std::vector<int>& src, std::vector<int>& dst, std::vecto
90
106
  result[i] = midas(src[i], dst[i], times[i]);
91
107
  }
92
108
  }
93
- return std::string((char*) result, sizeof(float) / sizeof(char) * n);
109
+
110
+ return ary;
94
111
  }
95
112
 
96
113
  extern "C"
97
- void Init_ext()
98
- {
99
- Module rb_mMidas = define_module("Midas");
100
-
101
- define_class_under(rb_mMidas, "Detector")
102
- .define_method(
103
- "_fit_predict_str",
104
- *[](std::string input, int num_rows, int num_buckets, float factor, float threshold, bool relations, bool directed, int seed) {
105
- std::vector<int> src, dst, times;
106
- load_str(src, dst, times, input, directed);
107
- return fit_predict(src, dst, times, num_rows, num_buckets, factor, threshold, relations, seed);
108
- })
109
- .define_method(
110
- "_fit_predict_file",
111
- *[](std::string input, int num_rows, int num_buckets, float factor, float threshold, bool relations, bool directed, int seed) {
114
+ void Init_ext() {
115
+ auto rb_mMidas = Rice::define_module("Midas");
116
+
117
+ Rice::define_class_under(rb_mMidas, "Detector")
118
+ .define_function(
119
+ "_fit_predict",
120
+ [](Rice::Object input, int num_rows, int num_buckets, float factor, float threshold, bool relations, bool directed, int seed) {
112
121
  std::vector<int> src, dst, times;
113
- load_file(src, dst, times, input, !directed);
122
+ if (input.is_a(rb_cString)) {
123
+ load_file(src, dst, times, input, directed);
124
+ } else {
125
+ load_array(src, dst, times, input, directed);
126
+ }
114
127
  return fit_predict(src, dst, times, num_rows, num_buckets, factor, threshold, relations, seed);
115
128
  });
116
129
  }
data/ext/midas/extconf.rb CHANGED
@@ -1,8 +1,12 @@
1
1
  require "mkmf-rice"
2
2
 
3
- $CXXFLAGS << " -std=c++17"
3
+ $CXXFLAGS << " -std=c++17 $(optflags)"
4
+
5
+ numo = $LOAD_PATH.find { |v| File.exist?("#{v}/numo/numo/narray.h") }
6
+ abort "Numo header not found" unless numo && find_header("numo/narray.h", "#{numo}/numo")
7
+ abort "Numo library not found" if Gem.win_platform? && !find_library("narray", nil, "#{numo}/numo")
4
8
 
5
9
  midas = File.expand_path("../../vendor/MIDAS/src", __dir__)
6
- $INCFLAGS << " -I#{midas}"
10
+ abort "Midas not found" unless find_header("NormalCore.hpp", midas)
7
11
 
8
12
  create_makefile("midas/ext")
@@ -0,0 +1,867 @@
1
+ /*!
2
+ * Numo.hpp v0.1.0
3
+ * https://github.com/ankane/numo.hpp
4
+ * BSD-2-Clause License
5
+ */
6
+
7
+ #pragma once
8
+
9
+ #include <rice/rice.hpp>
10
+ #include <numo/narray.h>
11
+
12
+ namespace numo {
13
+ class NArray {
14
+ public:
15
+ NArray(VALUE v) {
16
+ construct_value(this->dtype(), v);
17
+ }
18
+
19
+ NArray(Rice::Object o) {
20
+ construct_value(this->dtype(), o.value());
21
+ }
22
+
23
+ VALUE value() const {
24
+ return this->_value;
25
+ }
26
+
27
+ size_t ndim() {
28
+ return RNARRAY_NDIM(this->_value);
29
+ }
30
+
31
+ size_t* shape() {
32
+ return RNARRAY_SHAPE(this->_value);
33
+ }
34
+
35
+ size_t size() {
36
+ return RNARRAY_SIZE(this->_value);
37
+ }
38
+
39
+ bool is_contiguous() {
40
+ return nary_check_contiguous(this->_value) == Qtrue;
41
+ }
42
+
43
+ operator Rice::Object() const {
44
+ return Rice::Object(this->_value);
45
+ }
46
+
47
+ const void* read_ptr() {
48
+ if (!is_contiguous()) {
49
+ this->_value = nary_dup(this->_value);
50
+ }
51
+ return nary_get_pointer_for_read(this->_value) + nary_get_offset(this->_value);
52
+ }
53
+
54
+ void* write_ptr() {
55
+ return nary_get_pointer_for_write(this->_value);
56
+ }
57
+
58
+ protected:
59
+ NArray() { }
60
+
61
+ void construct_value(VALUE dtype, VALUE v) {
62
+ this->_value = rb_funcall(dtype, rb_intern("cast"), 1, v);
63
+ }
64
+
65
+ void construct_shape(VALUE dtype, std::initializer_list<size_t> shape) {
66
+ // rb_narray_new doesn't modify shape, but not marked as const
67
+ this->_value = rb_narray_new(dtype, shape.size(), const_cast<size_t*>(shape.begin()));
68
+ }
69
+
70
+ VALUE _value;
71
+
72
+ private:
73
+ VALUE dtype() {
74
+ return numo_cNArray;
75
+ }
76
+ };
77
+
78
+ class SFloat: public NArray {
79
+ public:
80
+ SFloat(VALUE v) {
81
+ construct_value(this->dtype(), v);
82
+ }
83
+
84
+ SFloat(Rice::Object o) {
85
+ construct_value(this->dtype(), o.value());
86
+ }
87
+
88
+ SFloat(std::initializer_list<size_t> shape) {
89
+ construct_shape(this->dtype(), shape);
90
+ }
91
+
92
+ const float* read_ptr() {
93
+ return reinterpret_cast<const float*>(NArray::read_ptr());
94
+ }
95
+
96
+ float* write_ptr() {
97
+ return reinterpret_cast<float*>(NArray::write_ptr());
98
+ }
99
+
100
+ private:
101
+ VALUE dtype() {
102
+ return numo_cSFloat;
103
+ }
104
+ };
105
+
106
+ class DFloat: public NArray {
107
+ public:
108
+ DFloat(VALUE v) {
109
+ construct_value(this->dtype(), v);
110
+ }
111
+
112
+ DFloat(Rice::Object o) {
113
+ construct_value(this->dtype(), o.value());
114
+ }
115
+
116
+ DFloat(std::initializer_list<size_t> shape) {
117
+ construct_shape(this->dtype(), shape);
118
+ }
119
+
120
+ const double* read_ptr() {
121
+ return reinterpret_cast<const double*>(NArray::read_ptr());
122
+ }
123
+
124
+ double* write_ptr() {
125
+ return reinterpret_cast<double*>(NArray::write_ptr());
126
+ }
127
+
128
+ private:
129
+ VALUE dtype() {
130
+ return numo_cDFloat;
131
+ }
132
+ };
133
+
134
+ class Int8: public NArray {
135
+ public:
136
+ Int8(VALUE v) {
137
+ construct_value(this->dtype(), v);
138
+ }
139
+
140
+ Int8(Rice::Object o) {
141
+ construct_value(this->dtype(), o.value());
142
+ }
143
+
144
+ Int8(std::initializer_list<size_t> shape) {
145
+ construct_shape(this->dtype(), shape);
146
+ }
147
+
148
+ const int8_t* read_ptr() {
149
+ return reinterpret_cast<const int8_t*>(NArray::read_ptr());
150
+ }
151
+
152
+ int8_t* write_ptr() {
153
+ return reinterpret_cast<int8_t*>(NArray::write_ptr());
154
+ }
155
+
156
+ private:
157
+ VALUE dtype() {
158
+ return numo_cInt8;
159
+ }
160
+ };
161
+
162
+ class Int16: public NArray {
163
+ public:
164
+ Int16(VALUE v) {
165
+ construct_value(this->dtype(), v);
166
+ }
167
+
168
+ Int16(Rice::Object o) {
169
+ construct_value(this->dtype(), o.value());
170
+ }
171
+
172
+ Int16(std::initializer_list<size_t> shape) {
173
+ construct_shape(this->dtype(), shape);
174
+ }
175
+
176
+ const int16_t* read_ptr() {
177
+ return reinterpret_cast<const int16_t*>(NArray::read_ptr());
178
+ }
179
+
180
+ int16_t* write_ptr() {
181
+ return reinterpret_cast<int16_t*>(NArray::write_ptr());
182
+ }
183
+
184
+ private:
185
+ VALUE dtype() {
186
+ return numo_cInt16;
187
+ }
188
+ };
189
+
190
+ class Int32: public NArray {
191
+ public:
192
+ Int32(VALUE v) {
193
+ construct_value(this->dtype(), v);
194
+ }
195
+
196
+ Int32(Rice::Object o) {
197
+ construct_value(this->dtype(), o.value());
198
+ }
199
+
200
+ Int32(std::initializer_list<size_t> shape) {
201
+ construct_shape(this->dtype(), shape);
202
+ }
203
+
204
+ const int32_t* read_ptr() {
205
+ return reinterpret_cast<const int32_t*>(NArray::read_ptr());
206
+ }
207
+
208
+ int32_t* write_ptr() {
209
+ return reinterpret_cast<int32_t*>(NArray::write_ptr());
210
+ }
211
+
212
+ private:
213
+ VALUE dtype() {
214
+ return numo_cInt32;
215
+ }
216
+ };
217
+
218
+ class Int64: public NArray {
219
+ public:
220
+ Int64(VALUE v) {
221
+ construct_value(this->dtype(), v);
222
+ }
223
+
224
+ Int64(Rice::Object o) {
225
+ construct_value(this->dtype(), o.value());
226
+ }
227
+
228
+ Int64(std::initializer_list<size_t> shape) {
229
+ construct_shape(this->dtype(), shape);
230
+ }
231
+
232
+ const int64_t* read_ptr() {
233
+ return reinterpret_cast<const int64_t*>(NArray::read_ptr());
234
+ }
235
+
236
+ int64_t* write_ptr() {
237
+ return reinterpret_cast<int64_t*>(NArray::write_ptr());
238
+ }
239
+
240
+ private:
241
+ VALUE dtype() {
242
+ return numo_cInt64;
243
+ }
244
+ };
245
+
246
+ class UInt8: public NArray {
247
+ public:
248
+ UInt8(VALUE v) {
249
+ construct_value(this->dtype(), v);
250
+ }
251
+
252
+ UInt8(Rice::Object o) {
253
+ construct_value(this->dtype(), o.value());
254
+ }
255
+
256
+ UInt8(std::initializer_list<size_t> shape) {
257
+ construct_shape(this->dtype(), shape);
258
+ }
259
+
260
+ const uint8_t* read_ptr() {
261
+ return reinterpret_cast<const uint8_t*>(NArray::read_ptr());
262
+ }
263
+
264
+ uint8_t* write_ptr() {
265
+ return reinterpret_cast<uint8_t*>(NArray::write_ptr());
266
+ }
267
+
268
+ private:
269
+ VALUE dtype() {
270
+ return numo_cUInt8;
271
+ }
272
+ };
273
+
274
+ class UInt16: public NArray {
275
+ public:
276
+ UInt16(VALUE v) {
277
+ construct_value(this->dtype(), v);
278
+ }
279
+
280
+ UInt16(Rice::Object o) {
281
+ construct_value(this->dtype(), o.value());
282
+ }
283
+
284
+ UInt16(std::initializer_list<size_t> shape) {
285
+ construct_shape(this->dtype(), shape);
286
+ }
287
+
288
+ const uint16_t* read_ptr() {
289
+ return reinterpret_cast<const uint16_t*>(NArray::read_ptr());
290
+ }
291
+
292
+ uint16_t* write_ptr() {
293
+ return reinterpret_cast<uint16_t*>(NArray::write_ptr());
294
+ }
295
+
296
+ private:
297
+ VALUE dtype() {
298
+ return numo_cUInt16;
299
+ }
300
+ };
301
+
302
+ class UInt32: public NArray {
303
+ public:
304
+ UInt32(VALUE v) {
305
+ construct_value(this->dtype(), v);
306
+ }
307
+
308
+ UInt32(Rice::Object o) {
309
+ construct_value(this->dtype(), o.value());
310
+ }
311
+
312
+ UInt32(std::initializer_list<size_t> shape) {
313
+ construct_shape(this->dtype(), shape);
314
+ }
315
+
316
+ const uint32_t* read_ptr() {
317
+ return reinterpret_cast<const uint32_t*>(NArray::read_ptr());
318
+ }
319
+
320
+ uint32_t* write_ptr() {
321
+ return reinterpret_cast<uint32_t*>(NArray::write_ptr());
322
+ }
323
+
324
+ private:
325
+ VALUE dtype() {
326
+ return numo_cUInt32;
327
+ }
328
+ };
329
+
330
+ class UInt64: public NArray {
331
+ public:
332
+ UInt64(VALUE v) {
333
+ construct_value(this->dtype(), v);
334
+ }
335
+
336
+ UInt64(Rice::Object o) {
337
+ construct_value(this->dtype(), o.value());
338
+ }
339
+
340
+ UInt64(std::initializer_list<size_t> shape) {
341
+ construct_shape(this->dtype(), shape);
342
+ }
343
+
344
+ const uint64_t* read_ptr() {
345
+ return reinterpret_cast<const uint64_t*>(NArray::read_ptr());
346
+ }
347
+
348
+ uint64_t* write_ptr() {
349
+ return reinterpret_cast<uint64_t*>(NArray::write_ptr());
350
+ }
351
+
352
+ private:
353
+ VALUE dtype() {
354
+ return numo_cUInt64;
355
+ }
356
+ };
357
+
358
+ class SComplex: public NArray {
359
+ public:
360
+ SComplex(VALUE v) {
361
+ construct_value(this->dtype(), v);
362
+ }
363
+
364
+ SComplex(Rice::Object o) {
365
+ construct_value(this->dtype(), o.value());
366
+ }
367
+
368
+ SComplex(std::initializer_list<size_t> shape) {
369
+ construct_shape(this->dtype(), shape);
370
+ }
371
+
372
+ private:
373
+ VALUE dtype() {
374
+ return numo_cSComplex;
375
+ }
376
+ };
377
+
378
+ class DComplex: public NArray {
379
+ public:
380
+ DComplex(VALUE v) {
381
+ construct_value(this->dtype(), v);
382
+ }
383
+
384
+ DComplex(Rice::Object o) {
385
+ construct_value(this->dtype(), o.value());
386
+ }
387
+
388
+ DComplex(std::initializer_list<size_t> shape) {
389
+ construct_shape(this->dtype(), shape);
390
+ }
391
+
392
+ private:
393
+ VALUE dtype() {
394
+ return numo_cDComplex;
395
+ }
396
+ };
397
+
398
+ class Bit: public NArray {
399
+ public:
400
+ Bit(VALUE v) {
401
+ construct_value(this->dtype(), v);
402
+ }
403
+
404
+ Bit(Rice::Object o) {
405
+ construct_value(this->dtype(), o.value());
406
+ }
407
+
408
+ Bit(std::initializer_list<size_t> shape) {
409
+ construct_shape(this->dtype(), shape);
410
+ }
411
+
412
+ private:
413
+ VALUE dtype() {
414
+ return numo_cBit;
415
+ }
416
+ };
417
+
418
+ class RObject: public NArray {
419
+ public:
420
+ RObject(VALUE v) {
421
+ construct_value(this->dtype(), v);
422
+ }
423
+
424
+ RObject(Rice::Object o) {
425
+ construct_value(this->dtype(), o.value());
426
+ }
427
+
428
+ RObject(std::initializer_list<size_t> shape) {
429
+ construct_shape(this->dtype(), shape);
430
+ }
431
+
432
+ const VALUE* read_ptr() {
433
+ return reinterpret_cast<const VALUE*>(NArray::read_ptr());
434
+ }
435
+
436
+ VALUE* write_ptr() {
437
+ return reinterpret_cast<VALUE*>(NArray::write_ptr());
438
+ }
439
+
440
+ private:
441
+ VALUE dtype() {
442
+ return numo_cRObject;
443
+ }
444
+ };
445
+ }
446
+
447
+ namespace Rice::detail {
448
+ template<>
449
+ struct Type<numo::NArray>
450
+ {
451
+ static bool verify()
452
+ {
453
+ return true;
454
+ }
455
+ };
456
+
457
+ template<>
458
+ class From_Ruby<numo::NArray>
459
+ {
460
+ public:
461
+ numo::NArray convert(VALUE x)
462
+ {
463
+ return numo::NArray(x);
464
+ }
465
+ };
466
+
467
+ template<>
468
+ class To_Ruby<numo::NArray>
469
+ {
470
+ public:
471
+ VALUE convert(const numo::NArray& x) {
472
+ return x.value();
473
+ }
474
+ };
475
+
476
+ template<>
477
+ struct Type<numo::SFloat>
478
+ {
479
+ static bool verify()
480
+ {
481
+ return true;
482
+ }
483
+ };
484
+
485
+ template<>
486
+ class From_Ruby<numo::SFloat>
487
+ {
488
+ public:
489
+ numo::SFloat convert(VALUE x)
490
+ {
491
+ return numo::SFloat(x);
492
+ }
493
+ };
494
+
495
+ template<>
496
+ class To_Ruby<numo::SFloat>
497
+ {
498
+ public:
499
+ VALUE convert(const numo::SFloat& x) {
500
+ return x.value();
501
+ }
502
+ };
503
+
504
+ template<>
505
+ struct Type<numo::DFloat>
506
+ {
507
+ static bool verify()
508
+ {
509
+ return true;
510
+ }
511
+ };
512
+
513
+ template<>
514
+ class From_Ruby<numo::DFloat>
515
+ {
516
+ public:
517
+ numo::DFloat convert(VALUE x)
518
+ {
519
+ return numo::DFloat(x);
520
+ }
521
+ };
522
+
523
+ template<>
524
+ class To_Ruby<numo::DFloat>
525
+ {
526
+ public:
527
+ VALUE convert(const numo::DFloat& x) {
528
+ return x.value();
529
+ }
530
+ };
531
+
532
+ template<>
533
+ struct Type<numo::Int8>
534
+ {
535
+ static bool verify()
536
+ {
537
+ return true;
538
+ }
539
+ };
540
+
541
+ template<>
542
+ class From_Ruby<numo::Int8>
543
+ {
544
+ public:
545
+ numo::Int8 convert(VALUE x)
546
+ {
547
+ return numo::Int8(x);
548
+ }
549
+ };
550
+
551
+ template<>
552
+ class To_Ruby<numo::Int8>
553
+ {
554
+ public:
555
+ VALUE convert(const numo::Int8& x) {
556
+ return x.value();
557
+ }
558
+ };
559
+
560
+ template<>
561
+ struct Type<numo::Int16>
562
+ {
563
+ static bool verify()
564
+ {
565
+ return true;
566
+ }
567
+ };
568
+
569
+ template<>
570
+ class From_Ruby<numo::Int16>
571
+ {
572
+ public:
573
+ numo::Int16 convert(VALUE x)
574
+ {
575
+ return numo::Int16(x);
576
+ }
577
+ };
578
+
579
+ template<>
580
+ class To_Ruby<numo::Int16>
581
+ {
582
+ public:
583
+ VALUE convert(const numo::Int16& x) {
584
+ return x.value();
585
+ }
586
+ };
587
+
588
+ template<>
589
+ struct Type<numo::Int32>
590
+ {
591
+ static bool verify()
592
+ {
593
+ return true;
594
+ }
595
+ };
596
+
597
+ template<>
598
+ class From_Ruby<numo::Int32>
599
+ {
600
+ public:
601
+ numo::Int32 convert(VALUE x)
602
+ {
603
+ return numo::Int32(x);
604
+ }
605
+ };
606
+
607
+ template<>
608
+ class To_Ruby<numo::Int32>
609
+ {
610
+ public:
611
+ VALUE convert(const numo::Int32& x) {
612
+ return x.value();
613
+ }
614
+ };
615
+
616
+ template<>
617
+ struct Type<numo::Int64>
618
+ {
619
+ static bool verify()
620
+ {
621
+ return true;
622
+ }
623
+ };
624
+
625
+ template<>
626
+ class From_Ruby<numo::Int64>
627
+ {
628
+ public:
629
+ numo::Int64 convert(VALUE x)
630
+ {
631
+ return numo::Int64(x);
632
+ }
633
+ };
634
+
635
+ template<>
636
+ class To_Ruby<numo::Int64>
637
+ {
638
+ public:
639
+ VALUE convert(const numo::Int64& x) {
640
+ return x.value();
641
+ }
642
+ };
643
+
644
+ template<>
645
+ struct Type<numo::UInt8>
646
+ {
647
+ static bool verify()
648
+ {
649
+ return true;
650
+ }
651
+ };
652
+
653
+ template<>
654
+ class From_Ruby<numo::UInt8>
655
+ {
656
+ public:
657
+ numo::UInt8 convert(VALUE x)
658
+ {
659
+ return numo::UInt8(x);
660
+ }
661
+ };
662
+
663
+ template<>
664
+ class To_Ruby<numo::UInt8>
665
+ {
666
+ public:
667
+ VALUE convert(const numo::UInt8& x) {
668
+ return x.value();
669
+ }
670
+ };
671
+
672
+ template<>
673
+ struct Type<numo::UInt16>
674
+ {
675
+ static bool verify()
676
+ {
677
+ return true;
678
+ }
679
+ };
680
+
681
+ template<>
682
+ class From_Ruby<numo::UInt16>
683
+ {
684
+ public:
685
+ numo::UInt16 convert(VALUE x)
686
+ {
687
+ return numo::UInt16(x);
688
+ }
689
+ };
690
+
691
+ template<>
692
+ class To_Ruby<numo::UInt16>
693
+ {
694
+ public:
695
+ VALUE convert(const numo::UInt16& x) {
696
+ return x.value();
697
+ }
698
+ };
699
+
700
+ template<>
701
+ struct Type<numo::UInt32>
702
+ {
703
+ static bool verify()
704
+ {
705
+ return true;
706
+ }
707
+ };
708
+
709
+ template<>
710
+ class From_Ruby<numo::UInt32>
711
+ {
712
+ public:
713
+ numo::UInt32 convert(VALUE x)
714
+ {
715
+ return numo::UInt32(x);
716
+ }
717
+ };
718
+
719
+ template<>
720
+ class To_Ruby<numo::UInt32>
721
+ {
722
+ public:
723
+ VALUE convert(const numo::UInt32& x) {
724
+ return x.value();
725
+ }
726
+ };
727
+
728
+ template<>
729
+ struct Type<numo::UInt64>
730
+ {
731
+ static bool verify()
732
+ {
733
+ return true;
734
+ }
735
+ };
736
+
737
+ template<>
738
+ class From_Ruby<numo::UInt64>
739
+ {
740
+ public:
741
+ numo::UInt64 convert(VALUE x)
742
+ {
743
+ return numo::UInt64(x);
744
+ }
745
+ };
746
+
747
+ template<>
748
+ class To_Ruby<numo::UInt64>
749
+ {
750
+ public:
751
+ VALUE convert(const numo::UInt64& x) {
752
+ return x.value();
753
+ }
754
+ };
755
+
756
+ template<>
757
+ struct Type<numo::SComplex>
758
+ {
759
+ static bool verify()
760
+ {
761
+ return true;
762
+ }
763
+ };
764
+
765
+ template<>
766
+ class From_Ruby<numo::SComplex>
767
+ {
768
+ public:
769
+ numo::SComplex convert(VALUE x)
770
+ {
771
+ return numo::SComplex(x);
772
+ }
773
+ };
774
+
775
+ template<>
776
+ class To_Ruby<numo::SComplex>
777
+ {
778
+ public:
779
+ VALUE convert(const numo::SComplex& x) {
780
+ return x.value();
781
+ }
782
+ };
783
+
784
+ template<>
785
+ struct Type<numo::DComplex>
786
+ {
787
+ static bool verify()
788
+ {
789
+ return true;
790
+ }
791
+ };
792
+
793
+ template<>
794
+ class From_Ruby<numo::DComplex>
795
+ {
796
+ public:
797
+ numo::DComplex convert(VALUE x)
798
+ {
799
+ return numo::DComplex(x);
800
+ }
801
+ };
802
+
803
+ template<>
804
+ class To_Ruby<numo::DComplex>
805
+ {
806
+ public:
807
+ VALUE convert(const numo::DComplex& x) {
808
+ return x.value();
809
+ }
810
+ };
811
+
812
+ template<>
813
+ struct Type<numo::Bit>
814
+ {
815
+ static bool verify()
816
+ {
817
+ return true;
818
+ }
819
+ };
820
+
821
+ template<>
822
+ class From_Ruby<numo::Bit>
823
+ {
824
+ public:
825
+ numo::Bit convert(VALUE x)
826
+ {
827
+ return numo::Bit(x);
828
+ }
829
+ };
830
+
831
+ template<>
832
+ class To_Ruby<numo::Bit>
833
+ {
834
+ public:
835
+ VALUE convert(const numo::Bit& x) {
836
+ return x.value();
837
+ }
838
+ };
839
+
840
+ template<>
841
+ struct Type<numo::RObject>
842
+ {
843
+ static bool verify()
844
+ {
845
+ return true;
846
+ }
847
+ };
848
+
849
+ template<>
850
+ class From_Ruby<numo::RObject>
851
+ {
852
+ public:
853
+ numo::RObject convert(VALUE x)
854
+ {
855
+ return numo::RObject(x);
856
+ }
857
+ };
858
+
859
+ template<>
860
+ class To_Ruby<numo::RObject>
861
+ {
862
+ public:
863
+ VALUE convert(const numo::RObject& x) {
864
+ return x.value();
865
+ }
866
+ };
867
+ }