ndav-numo-narray 0.0.4 → 0.0.6

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: 027ca1006dbe7107f356ed21e6e5f0e2ea2c1c4388a96707b00ae0fe02c3b113
4
+ data.tar.gz: b13b224ddde18cc20dc0b28086575b4208004fecc6e81d7658e66a66c5473de4
5
5
  SHA512:
6
- metadata.gz: 6cdbd33861621ec5da3f79ef825303152cf339b3149cbae1eaf0437af155ed70175fd3c84e3b34d42bb6bd7f458c7384a1c68f61794a2ba2abf21e8eef3f9e15
7
- data.tar.gz: e96eb5572368af47f2fba8b40f3573fe4a9ef4b2951c4b42d82fbcb6699cc58a7d6205cffa8f1cd5572f04c5f26082a10516eac1d97ed3d6b4f77e432940c078
6
+ metadata.gz: 3b13d07e24b6f66d7f65a88f7f019147527fc11bb6b1bdf7d04cc8a8b0f6347ecdaa25cf21534d909e3b9a7c78e3ba4f018ea99872206a95500d2ad12c564527
7
+ data.tar.gz: f9d15da6cc2a660508d266015211735a7498c1926b75936132b8bb2e19ae0c5fa44f48822a79dcb0d142986ac577ec4f1993c2745fea3c5e8843e87ec42e38c1
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
@@ -17,38 +19,121 @@ class NDAV
17
19
  ::Numo::DFloat => "d"
18
20
  }
19
21
 
20
- FORMAT_TO_CLASS = CLASS_TO_FORMAT.invert
22
+ FORMAT_TO_CLASS = Hash.new {|classes, format| classes[format] = class_from_format(format)}
23
+
24
+ class << self
25
+ def na_get_pointer_for_read(numo)
26
+ FFI.nary_get_pointer_for_read(Fiddle.dlwrap(numo))
27
+ end
28
+
29
+ def na_get_pointer_for_read_write(numo)
30
+ FFI.nary_get_pointer_for_read_write(Fiddle.dlwrap(numo))
31
+ end
32
+
33
+ def na_get_offset(numo)
34
+ FFI.nary_get_offset(Fiddle.dlwrap(numo))
35
+ end
36
+
37
+ def pointer_for_read(numo)
38
+ ptr = na_get_pointer_for_read(numo) + na_get_offset(numo)
39
+ ptr.size = numo.byte_size
40
+ ptr
41
+ end
42
+
43
+ def pointer_for_write(numo)
44
+ ptr = na_get_pointer_for_read_write(numo) + na_get_offset(numo)
45
+ ptr.size = numo.byte_size
46
+ ptr
47
+ end
48
+
49
+ FORMAT_TO_CLASS = CLASS_TO_FORMAT.invert
50
+ def class_from_format(format)
51
+ item_desc = ITEM_DESCS[format]
52
+ return unless item_desc.length == 1
53
+
54
+ component = item_desc[0]
55
+ return unless component.repeat == 1
56
+
57
+ klass = FORMAT_TO_CLASS[component.format]
58
+ return klass if klass
59
+
60
+ prefix = case component.format
61
+ when "i", "j" then "Int"
62
+ when "I", "J" then "UInt"
63
+ end
64
+ return ::Numo.const_get("#{prefix}#{component.size * 8}") if prefix
65
+
66
+ case IO::Buffer::HOST_ENDIAN
67
+ in IO::Buffer::LITTLE_ENDIAN
68
+ return unless component.little_endian?
69
+
70
+ klass = case component.format
71
+ when "v" then ::Numo::UInt16
72
+ when "V" then ::Numo::UInt32
73
+ when "e" then ::Numo::SFloat
74
+ when "E" then ::Numo::DFloat
75
+ end
76
+ return klass if klass
77
+ in IO::Buffer::BIG_ENDIAN
78
+ return if component.little_endian?
79
+
80
+ klass = case component.format
81
+ when "n" then ::Numo::UInt16
82
+ when "N" then ::Numo::UInt32
83
+ when "g" then ::Numo::SFloat
84
+ when "G" then ::Numo::DFloat
85
+ end
86
+ return klass if klass
87
+ end
88
+ end
89
+ end
90
+
91
+ module FFI
92
+ extend Fiddle::Importer
93
+
94
+ numo_dl = $LOADED_FEATURES.find {|feature| feature.end_with?("numo/narray/narray.#{RbConfig::CONFIG['DLEXT']}")}
95
+ dlload numo_dl
96
+ typealias "VALUE", "uintptr_t"
97
+ extern "char* nary_get_pointer_for_read(VALUE)"
98
+ extern "char* nary_get_pointer_for_read_write(VALUE)"
99
+ extern "size_t nary_get_offset(VALUE self)"
100
+ end
21
101
 
22
102
  module FromNDAV
23
103
  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
104
+ format = ndav.format
105
+ cls = FORMAT_TO_CLASS[format]
106
+ raise ArgumentError, "unsupported format: #{format}" unless cls
27
107
 
28
- cls.from_binary(ndav.to_s, ndav.shape)
108
+ shape = ndav.shape
109
+ if ndav.row_major_contiguous?
110
+ cls.from_binary(ndav.to_s, shape)
111
+ elsif ndav.column_major_contiguous?
112
+ cls.from_binary(ndav.to_s, shape.reverse).transpose
113
+ else
114
+ # TODO: Allocate enough memory, know that size, pass binary to from_binary, and reshape and restrides
115
+ raise "Currently, non-contiguous NDAV not supported"
116
+ end
29
117
  end
30
118
  end
31
119
 
32
120
  module MemoryViewable
33
- def ndav_descriptor(**)
34
- unless contiguous?
35
- warn "only contiguous NArray is supported"
36
- return false
37
- end
38
-
121
+ def ndav_descriptor(writable:, column_major:, **)
39
122
  format = CLASS_TO_FORMAT[self.class]
40
123
  unless format
41
124
  warn "unsupported class: #{self.class}, currently supported: #{CLASS_TO_FORMAT.keys}"
42
125
  return false
43
126
  end
44
127
 
128
+ ptr = writable ? ::NDAV::Numo::NArray.pointer_for_write(self) :
129
+ ::NDAV::Numo::NArray.pointer_for_read(self)
45
130
  {
46
- data: ::Fiddle::Pointer.new(::NDAV::Numo::NArray.address_for_read(self), byte_size),
131
+ data: ptr,
47
132
  shape:,
48
- strides: ::NDAV::Numo::NArray.strides(self),
133
+ strides: ::NDAV::Numo::NArray.strides(self) || ::NDAV.default_strides(shape:, item_size: ITEM_SIZES[format], row_major: !column_major),
49
134
  format:,
50
135
  byte_size:,
51
- readonly?: ::NDAV::Numo::NArray.readonly?(self),
136
+ readonly?: !writable,
52
137
  sub_offsets: nil
53
138
  }
54
139
  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.6"
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.7"
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.6
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.7
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.7
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