ndav-numo-narray 0.0.4 → 0.0.5

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: 2135df02ca3fdb6ae9d00cf77a06bace0030e763301ba4091b87c55fd1ef322c
4
- data.tar.gz: f5492ab0c71b22d7c6c71b22263ff50b1a0dbd108154fbc209cf233ad945794f
3
+ metadata.gz: beb01a99fd5dc21a663a24670645f31481edd507106bed7737f31223c1e666a8
4
+ data.tar.gz: 7c3f16c422223a95c7fe0ed71e377dce9ee497cb72460ea15406b8150dc555ff
5
5
  SHA512:
6
- metadata.gz: 6cdbd33861621ec5da3f79ef825303152cf339b3149cbae1eaf0437af155ed70175fd3c84e3b34d42bb6bd7f458c7384a1c68f61794a2ba2abf21e8eef3f9e15
7
- data.tar.gz: e96eb5572368af47f2fba8b40f3573fe4a9ef4b2951c4b42d82fbcb6699cc58a7d6205cffa8f1cd5572f04c5f26082a10516eac1d97ed3d6b4f77e432940c078
6
+ metadata.gz: 72f42d4ac0170bc12d69d68b2c4d7ce8674419f39a24321b90696b38af8faf1f901cdaaf6ef3880a4003137b0bc61e1571f03e9d56b0fdc91516834c2df82a80
7
+ data.tar.gz: 03ba05a8b1fd7757f2e5fbbad4f201c92cf95a42bff75f2b13cdc998e85b5b07b766d3893402256122439d2d87dcf43e3c279ed7a689ff165acac65b238658f6
data/ext/narray.c CHANGED
@@ -5,27 +5,6 @@
5
5
  #include <ruby/memory_view.h>
6
6
  #include <numo/narray.h>
7
7
 
8
- static VALUE
9
- ndav_numo_narray_s_address_for_read(VALUE self, VALUE obj)
10
- {
11
- void* ptr = na_get_pointer_for_read(obj);
12
-
13
- return PTR2NUM(ptr);
14
- }
15
-
16
- static VALUE
17
- ndav_numo_narray_s_readonly_p(VALUE self, VALUE obj)
18
- {
19
- if (OBJ_FROZEN(obj)) {
20
- return Qtrue;
21
- }
22
-
23
- narray_t *na;
24
- GetNArray(obj, na);
25
-
26
- return NA_TYPE(na) == NARRAY_VIEW_T && OBJ_FROZEN(NA_VIEW_DATA(na)) ? Qtrue : Qfalse;
27
- }
28
-
29
8
  static VALUE
30
9
  ndav_numo_narray_s_strides(VALUE self, VALUE obj)
31
10
  {
@@ -52,7 +31,7 @@ ndav_numo_narray_s_strides(VALUE self, VALUE obj)
52
31
  break;
53
32
  case NARRAY_VIEW_T:
54
33
  if (NA_IS_INDEX_AT(na, i - 1)) {
55
- return Qnil;
34
+ rb_raise(rb_eArgError, "strides not defined for index-backed array");
56
35
  }
57
36
  rb_ary_store(strides, axis, SSIZET2NUM(NA_STRIDE_AT(na, i - 1)));
58
37
  break;
@@ -71,8 +50,6 @@ Init_narray(void)
71
50
 
72
51
  VALUE mNArray = rb_path2class("NDAV::Numo::NArray");
73
52
 
74
- rb_define_singleton_method(mNArray, "address_for_read",ndav_numo_narray_s_address_for_read, 1);
75
- rb_define_singleton_method(mNArray, "readonly?", ndav_numo_narray_s_readonly_p, 1);
76
53
  rb_define_singleton_method(mNArray, "strides", ndav_numo_narray_s_strides, 1);
77
54
  }
78
55
 
@@ -1,5 +1,7 @@
1
1
  require "ndav"
2
- require "numo/narray/alt"
2
+ numo_name = "numo/narray/alt"
3
+ require numo_name
4
+ require "fiddle/import"
3
5
 
4
6
  class NDAV
5
7
  module Numo
@@ -18,37 +20,95 @@ class NDAV
18
20
  }
19
21
 
20
22
  FORMAT_TO_CLASS = CLASS_TO_FORMAT.invert
23
+ case IO::Buffer::HOST_ENDIAN
24
+ when IO::Buffer::LITTLE_ENDIAN
25
+ FORMAT_TO_CLASS.update({
26
+ "v" => ::Numo::UInt16,
27
+ "V" => ::Numo::UInt32,
28
+ "e" => ::Numo::SFloat,
29
+ "E" => ::Numo::DFloat
30
+ })
31
+ when IO::Buffer::BIG_ENDIAN
32
+ FORMAT_TO_CLASS.update({
33
+ "n" => ::Numo::UInt16,
34
+ "N" => ::Numo::UInt32,
35
+ "g" => ::Numo::SFloat,
36
+ "G" => ::Numo::DFloat
37
+ })
38
+ end
39
+
40
+ class << self
41
+ def na_get_pointer_for_read(numo)
42
+ FFI.nary_get_pointer_for_read(Fiddle.dlwrap(numo))
43
+ end
44
+
45
+ def na_get_pointer_for_read_write(numo)
46
+ FFI.nary_get_pointer_for_read_write(Fiddle.dlwrap(numo))
47
+ end
48
+
49
+ def na_get_offset(numo)
50
+ FFI.nary_get_offset(Fiddle.dlwrap(numo))
51
+ end
52
+
53
+ def pointer_for_read(numo)
54
+ ptr = na_get_pointer_for_read(numo) + na_get_offset(numo)
55
+ ptr.size = numo.byte_size
56
+ ptr
57
+ end
58
+
59
+ def pointer_for_write(numo)
60
+ ptr = na_get_pointer_for_read_write(numo) + na_get_offset(numo)
61
+ ptr.size = numo.byte_size
62
+ ptr
63
+ end
64
+ end
65
+
66
+ module FFI
67
+ extend Fiddle::Importer
68
+
69
+ numo_dl = $LOADED_FEATURES.find {|feature| feature.end_with?("numo/narray/narray.#{RbConfig::CONFIG['DLEXT']}")}
70
+ dlload numo_dl
71
+ typealias "VALUE", "uintptr_t"
72
+ extern "char* nary_get_pointer_for_read(VALUE)"
73
+ extern "char* nary_get_pointer_for_read_write(VALUE)"
74
+ extern "size_t nary_get_offset(VALUE self)"
75
+ end
21
76
 
22
77
  module FromNDAV
23
78
  def from_ndav(ndav)
24
- cls = FORMAT_TO_CLASS[ndav.format]
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
79
+ format = ndav.format
80
+ cls = FORMAT_TO_CLASS[format]
81
+ raise ArgumentError, "unsupported format: #{format}, currently supported: #{FORMAT_TO_CLASS.keys}" unless cls
27
82
 
28
- cls.from_binary(ndav.to_s, ndav.shape)
83
+ shape = ndav.shape
84
+ if ndav.row_major_contiguous?
85
+ cls.from_binary(ndav.to_s, shape)
86
+ elsif ndav.column_major_contiguous?
87
+ cls.from_binary(ndav.to_s, shape.reverse).transpose
88
+ else
89
+ # TODO: Allocate enough memory, know that size, pass binary to from_binary, and reshape and restrides
90
+ raise "Currently, non-contiguous NDAV not supported"
91
+ end
29
92
  end
30
93
  end
31
94
 
32
95
  module MemoryViewable
33
- def ndav_descriptor(**)
34
- unless contiguous?
35
- warn "only contiguous NArray is supported"
36
- return false
37
- end
38
-
96
+ def ndav_descriptor(writable: false, column_major: false, **)
39
97
  format = CLASS_TO_FORMAT[self.class]
40
98
  unless format
41
99
  warn "unsupported class: #{self.class}, currently supported: #{CLASS_TO_FORMAT.keys}"
42
100
  return false
43
101
  end
44
102
 
103
+ ptr = writable ? ::NDAV::Numo::NArray.pointer_for_write(self) :
104
+ ::NDAV::Numo::NArray.pointer_for_read(self)
45
105
  {
46
- data: ::Fiddle::Pointer.new(::NDAV::Numo::NArray.address_for_read(self), byte_size),
106
+ data: ptr,
47
107
  shape:,
48
- strides: ::NDAV::Numo::NArray.strides(self),
108
+ strides: ::NDAV::Numo::NArray.strides(self) || ::NDAV.default_strides(shape:, item_size: ITEM_SIZES[format], row_major: !column_major),
49
109
  format:,
50
110
  byte_size:,
51
- readonly?: ::NDAV::Numo::NArray.readonly?(self),
111
+ readonly?: !writable,
52
112
  sub_offsets: nil
53
113
  }
54
114
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "ndav-numo-narray"
3
- s.version = "0.0.4"
3
+ s.version = "0.0.5"
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.5"
12
+ s.add_runtime_dependency "ndav", ">= 0.0.6"
13
13
  s.add_runtime_dependency "numo-narray-alt"
14
14
 
15
15
  s.add_development_dependency "rake"
@@ -22,6 +22,14 @@ class TestConverter < Test::Unit::TestCase
22
22
  assert_kind_of ::NDAV, @numo_narray.to_ndav
23
23
  end
24
24
 
25
+ def test_non_contiguous_numo_narray_to_ndav
26
+ pend
27
+
28
+ numo_narray = ::Numo::Int16[1, 2, 3, 4, 5, 6][(0...6).step(2)]
29
+
30
+ assert_equal [1, 2, 3], numo_narray.to_ndav.to_numo_narray.to_a
31
+ end
32
+
25
33
  def test_NDAV
26
34
  assert_kind_of ::NDAV, ::NDAV::Converter::NDAV(@numo_narray)
27
35
  end
@@ -0,0 +1,49 @@
1
+ require_relative "helper"
2
+
3
+ class TestPointer < Test::Unit::TestCase
4
+ def test_pointer_for_read
5
+ numo = ::Numo::Int16[1, 2, 3]
6
+
7
+ assert_raise TypeError do
8
+ ::NDAV::Numo::NArray.pointer_for_read(Object.new)
9
+ end
10
+
11
+ ptr = ::NDAV::Numo::NArray.pointer_for_read(numo)
12
+ assert_instance_of ::Fiddle::Pointer, ptr
13
+ assert_equal [1, 2, 3].pack("s*"), ptr.to_s(numo.byte_size)
14
+ end
15
+
16
+ def test_pointer_for_write
17
+ numo = ::Numo::Int16[1, 2, 3]
18
+
19
+ assert_raise TypeError do
20
+ ::NDAV::Numo::NArray.pointer_for_write(Object.new)
21
+ end
22
+
23
+ ptr = ::NDAV::Numo::NArray.pointer_for_write(numo)
24
+ assert_instance_of ::Fiddle::Pointer, ptr
25
+
26
+ numo[0] = 4
27
+ assert_equal [4, 2, 3].pack("s*"), ptr.to_s(numo.byte_size)
28
+
29
+ ::Fiddle::Pointer.write(ptr, [7, 8, 9].pack("s*"))
30
+ assert_equal ::Numo::Int16[7, 8, 9], numo
31
+ end
32
+
33
+ def test_pointer_for_read_view
34
+ numo = ::Numo::Int16[0, 1, 2, 3]
35
+ view = numo[1..]
36
+ ptr = ::NDAV::Numo::NArray.pointer_for_read(view)
37
+
38
+ assert_equal [1, 2, 3].pack("s*"), ptr.to_s(view.byte_size)
39
+ end
40
+
41
+ def test_pointer_for_write_view
42
+ numo = ::Numo::Int16[0, 1, 2, 3]
43
+ view = numo[1..]
44
+ ptr = ::NDAV::Numo::NArray.pointer_for_write(view)
45
+
46
+ view[0] = 4
47
+ assert_equal [4, 2, 3].pack("s*"), ptr.to_s(view.byte_size)
48
+ end
49
+ end
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.4
4
+ version: 0.0.5
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.5
18
+ version: 0.0.6
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.5
25
+ version: 0.0.6
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: numo-narray-alt
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -164,9 +164,9 @@ files:
164
164
  - lib/ndav/numo/narray.rb
165
165
  - ndav-numo-narray.gemspec
166
166
  - test/helper.rb
167
- - test/test_address.rb
168
167
  - test/test_converter.rb
169
168
  - test/test_package.rb
169
+ - test/test_pointer.rb
170
170
  homepage: https://gitlab.com/KitaitiMakoto/ndav-numo-narray
171
171
  licenses:
172
172
  - BSD-3-Clause
data/test/test_address.rb DELETED
@@ -1,27 +0,0 @@
1
- require_relative "helper"
2
-
3
- class TestAddress < Test::Unit::TestCase
4
- def test_address_for_read
5
- numo = ::Numo::Int16[1, 2, 3]
6
-
7
- assert_raise TypeError do
8
- ::NDAV::Numo::NArray.address_for_read(Object.new)
9
- end
10
-
11
- assert_instance_of Integer, ::NDAV::Numo::NArray.address_for_read(numo)
12
- end
13
-
14
- def test_pointer_for_read
15
- numo = ::Numo::Int16[1, 2, 3]
16
- address = ::NDAV::Numo::NArray.address_for_read(numo)
17
-
18
- ptr = ::Fiddle::Pointer.new(address, numo.byte_size)
19
- assert_equal [1, 2, 3].pack("s*"), ptr.to_s(numo.byte_size)
20
-
21
- numo[0] = 4
22
- assert_equal [4, 2, 3].pack("s*"), ptr.to_s(numo.byte_size)
23
-
24
- ::Fiddle::Pointer.write(address, [7, 8, 9].pack("s*"))
25
- assert_equal ::Numo::Int16[7, 8, 9], numo
26
- end
27
- end