ndav-numo-narray 0.0.1 → 0.0.3

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: bdab89f32a1dc5913ae3c0df46237d9dac3e1c5eb49da215409a34e0ca504e7b
4
- data.tar.gz: 1a23f2a704bbd19a6c27648ae663b8b32c9b3977f893f48888baf92f7fadb50e
3
+ metadata.gz: 190876a415d35546ac7c0d2d9f40f1a38b8e7caa183fac3b8785b69c3ed52fb6
4
+ data.tar.gz: 2821b6cff34294cf2720a2323ac6ee4b6df69f579beb61ab6d45421051117c72
5
5
  SHA512:
6
- metadata.gz: 49afc07a7c360770f17109277b99a77daa68ba3bfa944e981525214668a777171ae2a9661fcdf1d2412008c4bb5cfb6aaa4694e23482b2f7f22686e41bb82f0f
7
- data.tar.gz: eb25644d06ec6f69f639f847897ccfefad78563faf3f1e1106c3db6e094bcea286fa6214004a240de4566f18e83acbb3b379d959bec0cff5f9e1158f9d51c875
6
+ metadata.gz: c80b97550700626dcaf02917f9c8bfe381aa179fbd1582fd86a8f671648111ea471a99752dff6344fde16243014915fdccfb708aead4649aa82def93e9329077
7
+ data.tar.gz: b1684caf9670469949ce16dbf2171660416bf67e866a12f0280058d74445604f51b4413f7b9e2fdd1f70db5934f63a90f097dd8d6a4217661f008d0e1e0da070
data/README.md CHANGED
@@ -1,12 +1,32 @@
1
1
  NDAV::Numo::NArray
2
2
  ==================
3
3
 
4
- MemoryView and pointer support for [Numo::NArray][] ([numo-narray-alt][]).
4
+ [NDAV][] bridge for [Numo::NArray][] ([numo-narray-alt][]).
5
+
6
+ SYNOPSIS
7
+ --------
8
+
9
+ ```ruby
10
+ require "ndav/numo/narray"
11
+
12
+ numo = Numo::DFloat.new(2, 3).seq # => Numo::DFloat
13
+ ndav = numo.to_ndav # => NDAV
14
+ numo = ndav.to_numo_narray # => Numo::DFloat
15
+
16
+ ndav = NDAV.from_numo_narray(numo) # => NDAV
17
+ numo = Numo::DFloat.from_ndav(ndav) # => Numo::DFloat
18
+ numo = Numo::NDarray.from_ndav(ndav) # => Numo::DFloat
19
+
20
+ include NDAV::Converter
21
+ ndav = NDAV(numo) # => NDAV
22
+ numo = NumoNArray(ndav) # => Numo::NArray
23
+ ```
5
24
 
6
25
  LICENSE
7
26
  -------
8
27
 
9
28
  3-Clause BSD License. See LICENSE.txt file.
10
29
 
30
+ [NDAV]: https://kitaitimakoto.gitlab.io/ndav/
11
31
  [Numo::NArray]: https://ruby-numo.github.io/narray/
12
32
  [numo-narray-alt]: https://github.com/yoshoku/numo-narray-alt
data/ext/extconf.rb CHANGED
@@ -2,8 +2,8 @@ require "mkmf"
2
2
 
3
3
  dependency = "numo-narray-alt"
4
4
  header = "numo/narray.h"
5
- header_path = File.join(Gem::Specification.find_by_name(dependency).full_gem_path, "lib/numo", header)
6
- $INCFLAGS = "-I#{File.dirname(File.dirname(header_path))} #{$INCFLAGS}"
7
- have_header(header) || abort "#{header} not found in #{dependency}"
5
+ lib_dir = File.join(Gem::Specification.find_by_name(dependency).full_gem_path, "lib/numo")
6
+ $INCFLAGS = "-I#{lib_dir} #{$INCFLAGS}"
7
+ have_header(header) || abort("#{header} not found in #{dependency}")
8
8
 
9
9
  create_makefile "ndav/numo/narray"
data/ext/narray.c CHANGED
@@ -6,23 +6,60 @@
6
6
  #include <numo/narray.h>
7
7
 
8
8
  static VALUE
9
- ndav_numo_narray_s_address(VALUE self, VALUE obj)
9
+ ndav_numo_narray_s_address_for_read(VALUE self, VALUE obj)
10
10
  {
11
11
  void* ptr = na_get_pointer_for_read(obj);
12
12
 
13
13
  return PTR2NUM(ptr);
14
14
  }
15
15
 
16
+ static VALUE
17
+ ndav_numo_narray_s_strides(VALUE self, VALUE obj)
18
+ {
19
+ narray_t *na;
20
+ GetNArray(obj, na);
21
+ int ndim = NA_NDIM(na);
22
+ size_t *shape = NA_SHAPE(na);
23
+ VALUE strides = rb_ary_new_capa(ndim);
24
+ unsigned char type = NA_TYPE(na);
25
+ bool is_row_major = TEST_ROW_MAJOR(obj);
26
+ ssize_t stride;
27
+
28
+ if (type == NARRAY_DATA_T) {
29
+ stride = na_get_elmsz(obj);
30
+ }
31
+
32
+ for (int i = ndim; i > 0; --i) {
33
+ int axis = is_row_major ? i - 1 : ndim - i;
34
+
35
+ switch (type) {
36
+ case NARRAY_DATA_T:
37
+ rb_ary_store(strides, axis, SSIZET2NUM(stride));
38
+ stride *= shape[i - 1];
39
+ break;
40
+ case NARRAY_VIEW_T:
41
+ if (NA_IS_INDEX_AT(na, i - 1)) {
42
+ return Qnil;
43
+ }
44
+ rb_ary_store(strides, axis, SSIZET2NUM(NA_STRIDE_AT(na, i - 1)));
45
+ break;
46
+ default:
47
+ return Qnil;
48
+ }
49
+ }
50
+
51
+ return strides;
52
+ }
53
+
16
54
  void
17
55
  Init_narray(void)
18
56
  {
19
57
  rb_require("numo/narray/alt");
20
58
 
21
- VALUE cNDAV = rb_define_class("NDAV", rb_cObject);
22
- VALUE mNumo = rb_define_module_under(cNDAV, "Numo");
23
- VALUE mNArray = rb_define_module_under(mNumo, "NArray");
59
+ VALUE mNArray = rb_path2class("NDAV::Numo::NArray");
24
60
 
25
- rb_define_singleton_method(mNArray, "address", ndav_numo_narray_s_address, 1);
61
+ rb_define_singleton_method(mNArray, "address_for_read",ndav_numo_narray_s_address_for_read, 1);
62
+ rb_define_singleton_method(mNArray, "strides", ndav_numo_narray_s_strides, 1);
26
63
  }
27
64
 
28
65
  #endif /* NDAV_NUMO_NARRAY_H */
@@ -1,6 +1,5 @@
1
1
  require "ndav"
2
2
  require "numo/narray/alt"
3
- require "ndav/numo/narray.so"
4
3
 
5
4
  class NDAV
6
5
  module Numo
@@ -24,22 +23,34 @@ class NDAV
24
23
  def from_ndav(ndav)
25
24
  cls = FORMAT_TO_CLASS[ndav.format]
26
25
  raise ArgumentError, "unsupported format: #{ndav.format}, currently supported: #{FORMAT_TO_CLASS.keys}" unless cls
26
+ raise ArgumentError, "class and format mismatch: #{cls} and #{ndav.format}" unless CLASS_TO_FORMAT[cls] == ndav.format
27
27
 
28
- array = cls.zeros(ndav.shape)
29
- address = ::NDAV::Numo::NArray.address(array)
30
- ::Fiddle::Pointer.write address, ndav.to_s
31
- array.instance_variable_set(:@ndav, ndav) # keep reference to NDAV to prevent GC
32
- array
28
+ cls.from_binary(ndav.to_s, ndav.shape)
33
29
  end
34
30
  end
35
31
 
36
- module ToNDAV
37
- def to_ndav
32
+ module MemoryViewable
33
+ def ndav_descriptor(flags = ::NDAV::Flags::FLAGS[:simple])
34
+ unless contiguous?
35
+ warn "only contiguous NArray is supported"
36
+ return false
37
+ end
38
+
38
39
  format = CLASS_TO_FORMAT[self.class]
39
- raise ArgumentError, "unsupported class: #{self.class}, currently supported: #{CLASS_TO_FORMAT.keys}" unless format
40
+ unless format
41
+ warn "unsupported class: #{self.class}, currently supported: #{CLASS_TO_FORMAT.keys}"
42
+ return false
43
+ end
40
44
 
41
- ptr = ::Fiddle::Pointer.new(::NDAV::Numo::NArray.address(self), byte_size)
42
- NDAV.new(ptr, shape:, format:, lifetime: self)
45
+ {
46
+ data: ::Fiddle::Pointer.new(::NDAV::Numo::NArray.address_for_read(self), byte_size),
47
+ shape:,
48
+ strides: ::NDAV::Numo::NArray.strides(self),
49
+ format:,
50
+ byte_size:,
51
+ readonly?: true, # TODO: Consier to define #readonly? at C layer
52
+ sub_offsets: nil
53
+ }
43
54
  end
44
55
  end
45
56
 
@@ -65,3 +76,5 @@ class NDAV
65
76
 
66
77
  register ::Numo::NArray, Numo::NArray, name: :numo_narray
67
78
  end
79
+
80
+ require "ndav/numo/narray.so"
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "ndav-numo-narray"
3
- s.version = "0.0.1"
3
+ s.version = "0.0.3"
4
4
  s.authors = ["Kitaiti Makoto"]
5
5
  s.summary = "N-Dimensional Array View for Numo::NArray"
6
6
  s.licenses = ["BSD-3-Clause"]
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.files = Dir.chdir(__dir__) {`git ls-files -z`.split("\x0")}
10
10
  s.extensions << "ext/extconf.rb"
11
11
 
12
- s.add_runtime_dependency "ndav", ">= 0.0.3"
12
+ s.add_runtime_dependency "ndav", ">= 0.0.5"
13
13
  s.add_runtime_dependency "numo-narray-alt"
14
14
 
15
15
  s.add_development_dependency "rake"
data/test/test_address.rb CHANGED
@@ -1,22 +1,21 @@
1
1
  require_relative "helper"
2
2
 
3
3
  class TestAddress < Test::Unit::TestCase
4
- def test_address
4
+ def test_address_for_read
5
5
  numo = ::Numo::Int16[1, 2, 3]
6
6
 
7
7
  assert_raise TypeError do
8
- ::NDAV::Numo::NArray.address(Object.new)
8
+ ::NDAV::Numo::NArray.address_for_read(Object.new)
9
9
  end
10
10
 
11
- assert_instance_of Integer, ::NDAV::Numo::NArray.address(numo)
11
+ assert_instance_of Integer, ::NDAV::Numo::NArray.address_for_read(numo)
12
12
  end
13
13
 
14
- def test_pointer
14
+ def test_pointer_for_read
15
15
  numo = ::Numo::Int16[1, 2, 3]
16
- address = ::NDAV::Numo::NArray.address(numo)
16
+ address = ::NDAV::Numo::NArray.address_for_read(numo)
17
17
 
18
- ptr = ::Fiddle::Pointer[address]
19
- ptr.size = numo.byte_size
18
+ ptr = ::Fiddle::Pointer.new(address, numo.byte_size)
20
19
  assert_equal [1, 2, 3].pack("s*"), ptr.to_s(numo.byte_size)
21
20
 
22
21
  numo[0] = 4
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ndav-numo-narray
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kitaiti Makoto
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: 0.0.3
18
+ version: 0.0.5
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: 0.0.3
25
+ version: 0.0.5
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: numo-narray-alt
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -185,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
185
  - !ruby/object:Gem::Version
186
186
  version: '0'
187
187
  requirements: []
188
- rubygems_version: 4.0.6
188
+ rubygems_version: 4.0.16
189
189
  specification_version: 4
190
190
  summary: N-Dimensional Array View for Numo::NArray
191
191
  test_files: []