carray-numo-narray 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 02abe0434b7e13bc5f1fe24ea8c4842dbcd14fca6f09df4d8b928fe580df94d0
4
+ data.tar.gz: 6a33460577eeb87854725041a5406c1eda8e72b38cf7d9d24a7a435f772fca5b
5
+ SHA512:
6
+ metadata.gz: 4ceaa09d46044291c2bb6bc4b9163fff86726d6d0057158691f255b6c39cc1749454b2138d736f2209816cfa53fe5b39be92d4b5746dabe3790ee4e23e2114d5
7
+ data.tar.gz: 192ddac1ba18da317e19073dd1965556f27b230e77c284d3f1e94f0e7d23b702a9fedf784a3d5fefd99cc8cb2a926441a678a02b1968c681c68731c42d88df01
@@ -0,0 +1,34 @@
1
+ Numo::NArrayとのインターフェース
2
+
3
+ Numo::NArrayは、数値の型でクラスが分かれている。
4
+
5
+ CArrayを参照するNArrayオブジェクトを作成する方法
6
+
7
+ Int32を例にとると、CArrayと同じ形のNArrayをnary_newを作成する。
8
+ 生成されたNarrayのクラスはNumo::Int32となっている。
9
+ nary_newを使うと必要になるまでデータ領域はアロケートされない。
10
+ そこで、CArrayのポインタをNarrayのポインタと共有してしまえばよいのだが、
11
+ 問題はオブジェクトをGCするときのメモリの解放である。
12
+
13
+ CArrayとNArrayの両方が自分のデータ領域を解放しようとするためこれは問題。
14
+ そのためNArrayのfree関数をデータ領域を解放しないものに変更してやる必要がある。
15
+
16
+ そこで、かなりの荒技だが、NArrayの実体であるRTypedStructの中の
17
+ typeメンバー(free関数を含む)を独自のものに置き換えてしまうというもの。
18
+
19
+ typeメンバーは numo-narrayの実装ではstaticとして隠蔽されているため、
20
+ コンパイル時には取得できないので、動的に取得することにした。
21
+
22
+ それぞれの型(UINT8, UINT16, ...)に対して、
23
+
24
+ static rb_data_type_t na_wrap_int32 = { 0, {0, 0, 0,}, 0, 0, 0, };
25
+
26
+ というデータタイプを用意しておく。
27
+ CArray#numoが呼ばれると、CArrayの型に応じて、たとえば、Numo::Int32のオブジェクト
28
+ が生成される。na_wrap_int32が初期値のままの状態の場合には、
29
+ 生成したオブジェクトのtypeメンバをna_wrap_int32にコピーして、
30
+ function.dfreeだけ独自のfree関数に変更する。
31
+ na_wrap_int32は適切に設定されたはずなので、以降はそのまま使う。
32
+
33
+ これで、CArrayと同じポインタを参照するNArrayができる。
34
+
File without changes
@@ -0,0 +1,11 @@
1
+ GEMSPEC = "carray-numo-narray.gemspec"
2
+
3
+ task :install do
4
+ spec = eval File.read(GEMSPEC)
5
+ system %{
6
+ gem build #{GEMSPEC}; gem install #{spec.full_name}.gem
7
+ }
8
+ end
9
+
10
+ require 'rspec/core/rake_task'
11
+ RSpec::Core::RakeTask.new
@@ -0,0 +1,25 @@
1
+ Gem::Specification::new do |s|
2
+ version = "0.9.0"
3
+ files = Dir.glob("**/*") - [
4
+ Dir.glob("carray-numo-narray-*.gem"),
5
+ Dir.glob("test/**/*"),
6
+ Dir.glob("work/**/*"),
7
+ ].flatten
8
+
9
+ s.platform = Gem::Platform::RUBY
10
+ s.name = "carray-numo-narray"
11
+ s.summary = "CArray interface to Numo::NArray"
12
+ s.description = <<-HERE
13
+ CArray interface to Numo::NArray
14
+ HERE
15
+ s.version = version
16
+ s.licenses = ['MIT']
17
+ s.author = "Hiroki Motoyoshi"
18
+ s.email = ""
19
+ s.homepage = 'https://github.com/himotoyoshi/carray-numo-narray'
20
+ s.files = files
21
+ s.extensions = [ "ext/extconf.rb" ]
22
+ s.required_ruby_version = ">= 1.8.1"
23
+ s.add_runtime_dependency 'carray', '~> 1.3'
24
+ end
25
+
@@ -0,0 +1,361 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ carray/ca_wrap_narray.c
4
+
5
+ This file is part of Ruby/CArray extension library.
6
+ You can redistribute it and/or modify it under the terms of
7
+ the Ruby Licence.
8
+
9
+ Copyright (C) 2005 Hiroki Motoyoshi
10
+
11
+ ---------------------------------------------------------------------------- */
12
+
13
+ #include "ruby.h"
14
+ #include "carray.h"
15
+ #include "numo/narray.h"
16
+
17
+ #include <math.h>
18
+
19
+ static char EMPTY_ARRAY_PTR;
20
+
21
+ /* -------------------------------------------------------------------- */
22
+
23
+
24
+ /* -------------------------------------------------------------------- */
25
+
26
+ static int8_t
27
+ na_class_to_ca_data_type (VALUE typecode)
28
+ {
29
+ int8_t data_type;
30
+
31
+ if ( typecode == numo_cUInt8 ) {
32
+ data_type = CA_UINT8;
33
+ }
34
+ else if ( typecode == numo_cUInt16 ) {
35
+ data_type = CA_UINT16;
36
+ }
37
+ else if ( typecode == numo_cUInt32 ) {
38
+ data_type = CA_UINT32;
39
+ }
40
+ else if ( typecode == numo_cUInt64 ) {
41
+ data_type = CA_UINT64;
42
+ }
43
+ else if ( typecode == numo_cInt8 ) {
44
+ data_type = CA_INT8;
45
+ }
46
+ else if ( typecode == numo_cInt16 ) {
47
+ data_type = CA_INT16;
48
+ }
49
+ else if ( typecode == numo_cInt32 ) {
50
+ data_type = CA_INT32;
51
+ }
52
+ else if ( typecode == numo_cInt64 ) {
53
+ data_type = CA_INT64;
54
+ }
55
+ else if ( typecode == numo_cSFloat ) {
56
+ data_type = CA_FLOAT32;
57
+ }
58
+ else if ( typecode == numo_cDFloat ) {
59
+ data_type = CA_FLOAT64;
60
+ }
61
+ #ifdef HAVE_COMPLEX_H
62
+ else if ( typecode == numo_cSComplex ) {
63
+ data_type = CA_CMPLX64;
64
+ }
65
+ else if ( typecode == numo_cDComplex ) {
66
+ data_type = CA_CMPLX128;
67
+ }
68
+ #endif
69
+ else if ( typecode == numo_cRObject ) {
70
+ data_type = CA_OBJECT;
71
+ }
72
+ else {
73
+ rb_raise(rb_eRuntimeError, "invalid NArray class to convert to CArray");
74
+ }
75
+
76
+ return data_type;
77
+ }
78
+
79
+ static VALUE
80
+ ca_data_type_to_na_class(int8_t data_type)
81
+ {
82
+ volatile VALUE typecode;
83
+
84
+ switch ( data_type ) {
85
+ case CA_BOOLEAN:
86
+ case CA_UINT8:
87
+ typecode = numo_cUInt8; break;
88
+ case CA_UINT16:
89
+ typecode = numo_cUInt16; break;
90
+ case CA_UINT32:
91
+ typecode = numo_cUInt32; break;
92
+ case CA_UINT64:
93
+ typecode = numo_cUInt64; break;
94
+ case CA_INT8:
95
+ typecode = numo_cInt8; break;
96
+ case CA_INT16:
97
+ typecode = numo_cInt16; break;
98
+ case CA_INT32:
99
+ typecode = numo_cInt32; break;
100
+ case CA_INT64:
101
+ typecode = numo_cInt64; break;
102
+ case CA_FLOAT32:
103
+ typecode = numo_cSFloat; break;
104
+ case CA_FLOAT64:
105
+ typecode = numo_cDFloat; break;
106
+ #ifdef HAVE_COMPLEX_H
107
+ case CA_CMPLX64:
108
+ typecode = numo_cSComplex; break;
109
+ case CA_CMPLX128:
110
+ typecode = numo_cDComplex; break;
111
+ #endif
112
+ case CA_OBJECT:
113
+ typecode = numo_cRObject; break;
114
+ default:
115
+ rb_raise(rb_eRuntimeError,
116
+ "no corresponding NArray typecode for CArray data type <%s>",
117
+ ca_type_name[data_type]);
118
+ }
119
+
120
+ return typecode;
121
+ }
122
+
123
+ /* -------------------------------------------------------------------- */
124
+
125
+ static void
126
+ na_wrap_free (void* ptr)
127
+ {
128
+ narray_data_t *na = (narray_data_t*)ptr;
129
+
130
+ if (na->ptr != NULL) {
131
+ if (na->owned) {
132
+ /* xfree(na->ptr); */
133
+ }
134
+ na->ptr = NULL;
135
+ }
136
+ if (na->base.size > 0) {
137
+ if (na->base.shape != NULL && na->base.shape != &(na->base.size)) {
138
+ xfree(na->base.shape);
139
+ na->base.shape = NULL;
140
+ }
141
+ }
142
+ xfree(na);
143
+ }
144
+
145
+ static rb_data_type_t na_wrap_int8 = { 0, {0, 0, 0,}, 0, 0, 0, };
146
+ static rb_data_type_t na_wrap_int16 = { 0, {0, 0, 0,}, 0, 0, 0, };
147
+ static rb_data_type_t na_wrap_int32 = { 0, {0, 0, 0,}, 0, 0, 0, };
148
+ static rb_data_type_t na_wrap_int64 = { 0, {0, 0, 0,}, 0, 0, 0, };
149
+ static rb_data_type_t na_wrap_uint8 = { 0, {0, 0, 0,}, 0, 0, 0, };
150
+ static rb_data_type_t na_wrap_uint16 = { 0, {0, 0, 0,}, 0, 0, 0, };
151
+ static rb_data_type_t na_wrap_uint32 = { 0, {0, 0, 0,}, 0, 0, 0, };
152
+ static rb_data_type_t na_wrap_uint64 = { 0, {0, 0, 0,}, 0, 0, 0, };
153
+ static rb_data_type_t na_wrap_sfloat = { 0, {0, 0, 0,}, 0, 0, 0, };
154
+ static rb_data_type_t na_wrap_dfloat = { 0, {0, 0, 0,}, 0, 0, 0, };
155
+ #ifdef HAVE_COMPLEX_H
156
+ static rb_data_type_t na_wrap_scomplex = { 0, {0, 0, 0,}, 0, 0, 0, };
157
+ static rb_data_type_t na_wrap_dcomplex = { 0, {0, 0, 0,}, 0, 0, 0, };
158
+ #endif
159
+ static rb_data_type_t na_wrap_robject = { 0, {0, 0, 0,}, 0, 0, 0, };
160
+
161
+ static void
162
+ na_set_wrap_type (VALUE obj)
163
+ {
164
+ volatile VALUE typecode;
165
+ rb_data_type_t *data_type, *data_type_wrap;
166
+
167
+ data_type = RTYPEDDATA_TYPE(obj);
168
+ typecode = rb_obj_class(obj);
169
+
170
+ if ( typecode == numo_cUInt8 ) {
171
+ data_type_wrap = &na_wrap_uint8;
172
+ }
173
+ else if ( typecode == numo_cUInt16 ) {
174
+ data_type_wrap = &na_wrap_uint16;
175
+ }
176
+ else if ( typecode == numo_cUInt32 ) {
177
+ data_type_wrap = &na_wrap_uint32;
178
+ }
179
+ else if ( typecode == numo_cUInt64 ) {
180
+ data_type_wrap = &na_wrap_uint64;
181
+ }
182
+ else if ( typecode == numo_cInt8 ) {
183
+ data_type_wrap = &na_wrap_int8;
184
+ }
185
+ else if ( typecode == numo_cInt16 ) {
186
+ data_type_wrap = &na_wrap_int16;
187
+ }
188
+ else if ( typecode == numo_cInt32 ) {
189
+ data_type_wrap = &na_wrap_int32;
190
+ }
191
+ else if ( typecode == numo_cInt64 ) {
192
+ data_type_wrap = &na_wrap_int64;
193
+ }
194
+ else if ( typecode == numo_cSFloat ) {
195
+ data_type_wrap = &na_wrap_sfloat;
196
+ }
197
+ else if ( typecode == numo_cDFloat ) {
198
+ data_type_wrap = &na_wrap_dfloat;
199
+ }
200
+ #ifdef HAVE_COMPLEX_H
201
+ else if ( typecode == numo_cSComplex ) {
202
+ data_type_wrap = &na_wrap_scomplex;
203
+ }
204
+ else if ( typecode == numo_cDComplex ) {
205
+ data_type_wrap = &na_wrap_dcomplex;
206
+ }
207
+ #endif
208
+ else if ( typecode == numo_cRObject ) {
209
+ data_type_wrap = &na_wrap_robject;
210
+ }
211
+ else {
212
+ rb_raise(rb_eRuntimeError, "invalid NArray class to convert to CArray");
213
+ }
214
+
215
+ if ( ! ( data_type_wrap->wrap_struct_name ) ) {
216
+ *data_type_wrap = *data_type;
217
+ data_type_wrap->function.dfree = na_wrap_free;
218
+ }
219
+
220
+ RTYPEDDATA_TYPE(obj) = data_type_wrap;
221
+ }
222
+
223
+ static VALUE
224
+ rb_cary_na_ref_new (VALUE self)
225
+ {
226
+ volatile VALUE obj, klass;
227
+ CArray *ca;
228
+ narray_t *na;
229
+
230
+ Data_Get_Struct(self, CArray, ca);
231
+
232
+ if ( ! ca_is_attached(ca) ) {
233
+ rb_raise(rb_eRuntimeError,
234
+ "cannot create NArray reference for not attached CArray");
235
+ }
236
+
237
+ klass = ca_data_type_to_na_class(ca->data_type);
238
+ obj = nary_new(klass, ca->rank, (size_t *)ca->dim);
239
+ na_set_wrap_type(obj);
240
+
241
+ GetNArray(obj, na);
242
+ NA_DATA_PTR(na) = ca->ptr;
243
+ NA_DATA_OWNED(na) = TRUE;
244
+
245
+ rb_ivar_set(obj, rb_intern("@ref"), self);
246
+
247
+ return obj;
248
+ }
249
+
250
+ /* -------------------------------------------------------------------- */
251
+
252
+ static VALUE
253
+ rb_cary_to_na (VALUE self)
254
+ {
255
+ volatile VALUE obj, type;
256
+ CArray *ca;
257
+ char *ptr;
258
+
259
+ Data_Get_Struct(self, CArray, ca);
260
+
261
+ type = ca_data_type_to_na_class(ca->data_type);
262
+ obj = nary_view_new(type, ca->rank, (size_t *)ca->dim);
263
+
264
+ ptr = na_get_pointer_for_write(obj);
265
+ ca_copy_data(ca, ptr);
266
+
267
+ return obj;
268
+ }
269
+
270
+ /* -------------------------------------------------------------------- */
271
+
272
+ /* rdoc:
273
+ class NArray
274
+ def ca
275
+ end
276
+ end
277
+ */
278
+
279
+ static VALUE
280
+ rb_na_ca_ref_new (VALUE self)
281
+ {
282
+ volatile VALUE obj = 0;
283
+ narray_t *na;
284
+ int8_t data_type;
285
+ char *ptr;
286
+
287
+ data_type = na_class_to_ca_data_type(rb_obj_class(self));
288
+
289
+ GetNArray(self, na);
290
+
291
+ if ( na->size == 0 ) {
292
+ ca_size_t zero = 0;
293
+ obj = rb_carray_wrap_ptr(data_type, 1, &zero, 0, NULL,
294
+ &EMPTY_ARRAY_PTR, self); /* avoid ca->ptr == NULL */
295
+ }
296
+ else {
297
+ CA_CHECK_RANK(na->ndim);
298
+ ptr = na_get_pointer_for_read_write(self);
299
+ obj = rb_carray_wrap_ptr(data_type, na->ndim, (ca_size_t *)na->shape, 0, NULL, ptr, self);
300
+ }
301
+
302
+ return obj;
303
+ }
304
+
305
+ /* -------------------------------------------------------------------- */
306
+
307
+ /* rdoc:
308
+ class NArray
309
+ def to_ca
310
+ end
311
+ end
312
+ */
313
+
314
+
315
+ static VALUE
316
+ rb_na_to_ca (VALUE self)
317
+ {
318
+ volatile VALUE obj;
319
+ CArray *ca;
320
+ narray_t *na;
321
+ int8_t data_type;
322
+ char *ptr;
323
+
324
+ GetNArray(self, na);
325
+
326
+ data_type = na_class_to_ca_data_type(rb_obj_class(self));
327
+
328
+ if ( na->size == 0 ) {
329
+ ca_size_t zero = 0;
330
+ obj = rb_carray_new(data_type, 1, &zero, 0, NULL);
331
+ }
332
+ else {
333
+ CA_CHECK_RANK(na->ndim);
334
+
335
+ obj = rb_carray_new(data_type, na->ndim, (ca_size_t *) na->shape, 0, NULL);
336
+ Data_Get_Struct(obj, CArray, ca);
337
+ ptr = na_get_pointer_for_read(self);
338
+ ca_sync_data(ca, ptr);
339
+ }
340
+
341
+ return obj;
342
+ }
343
+
344
+ /* -------------------------------------------------------------------- */
345
+
346
+ void
347
+ Init_ca_wrap_numo_narray ()
348
+ {
349
+ /* rb_require("narray"); */ /* "narray" should be loaded in config.rb */
350
+
351
+ rb_define_const(rb_cCArray, "HAVE_NUMO_NARRAY", Qtrue);
352
+
353
+ /* CArray -> NArray */
354
+ rb_define_method(rb_cCArray, "numo", rb_cary_na_ref_new, 0);
355
+ rb_define_method(rb_cCArray, "to_numo", rb_cary_to_na, 0);
356
+
357
+ /* NArray -> CArray */
358
+ rb_define_method(cNArray, "ca", rb_na_ca_ref_new, 0);
359
+ rb_define_method(cNArray, "to_ca", rb_na_to_ca, 0);
360
+ }
361
+
@@ -0,0 +1,21 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ carray/carray_narray.c
4
+
5
+ This file is part of Ruby/CArray extension library.
6
+ You can redistribute it and/or modify it under the terms of
7
+ the Ruby Licence.
8
+
9
+ Copyright (C) 2005 Hiroki Motoyoshi
10
+
11
+ ---------------------------------------------------------------------------- */
12
+
13
+ #include "ruby.h"
14
+
15
+ void Init_ca_wrap_numo_narray();
16
+
17
+ void
18
+ Init_carray_numo_narray ()
19
+ {
20
+ Init_ca_wrap_numo_narray();
21
+ }
@@ -0,0 +1,15 @@
1
+ require 'numo/narray'
2
+ require 'mkmf'
3
+ require 'carray/mkmf'
4
+
5
+ $LOAD_PATH.each do |path|
6
+ if File.exist? File.join(path, 'numo/numo/narray.h')
7
+ dir_config("narray", File.join(path,"numo"), File.join(path,"numo"))
8
+ break
9
+ end
10
+ end
11
+
12
+ if have_carray() && have_header("numo/narray.h")
13
+ create_makefile("carray_numo_narray")
14
+ end
15
+
@@ -0,0 +1,3 @@
1
+ require "numo/narray"
2
+ require "carray"
3
+ require "carray_numo_narray"
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: carray-numo-narray
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - Hiroki Motoyoshi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-06-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: carray
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ description: " CArray interface to Numo::NArray\n"
28
+ email: ''
29
+ executables: []
30
+ extensions:
31
+ - ext/extconf.rb
32
+ extra_rdoc_files: []
33
+ files:
34
+ - NOTE.ja.txt
35
+ - README.md
36
+ - Rakefile
37
+ - carray-numo-narray.gemspec
38
+ - ext/ca_wrap_numo_narray.c
39
+ - ext/carray_numo_narray.c
40
+ - ext/extconf.rb
41
+ - lib/carray-numo-narray.rb
42
+ homepage: https://github.com/himotoyoshi/carray-numo-narray
43
+ licenses:
44
+ - MIT
45
+ metadata: {}
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.8.1
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubyforge_project:
62
+ rubygems_version: 2.7.7
63
+ signing_key:
64
+ specification_version: 4
65
+ summary: CArray interface to Numo::NArray
66
+ test_files: []