carray-numo-narray 0.9.0

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.
@@ -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: []