ndav-numo-narray 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: bdab89f32a1dc5913ae3c0df46237d9dac3e1c5eb49da215409a34e0ca504e7b
4
+ data.tar.gz: 1a23f2a704bbd19a6c27648ae663b8b32c9b3977f893f48888baf92f7fadb50e
5
+ SHA512:
6
+ metadata.gz: 49afc07a7c360770f17109277b99a77daa68ba3bfa944e981525214668a777171ae2a9661fcdf1d2412008c4bb5cfb6aaa4694e23482b2f7f22686e41bb82f0f
7
+ data.tar.gz: eb25644d06ec6f69f639f847897ccfefad78563faf3f1e1106c3db6e094bcea286fa6214004a240de4566f18e83acbb3b379d959bec0cff5f9e1158f9d51c875
data/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ Gemfile.lock
2
+ pkg/
3
+ *.so
4
+ *.bundle
5
+ *.dll
6
+ *.o
7
+ ext/Makefile
8
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,32 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026 Kitaiti Makoto
4
+
5
+ All rights reserved.
6
+
7
+ Redistribution and use in source and binary forms, with or without
8
+ modification, are permitted provided that the following conditions are met:
9
+
10
+ 1. Redistributions of source code must retain the above copyright
11
+ notice, this list of conditions and the following disclaimer.
12
+
13
+ 2. Redistributions in binary form must reproduce the above copyright
14
+ notice, this list of conditions and the following disclaimer in the
15
+ documentation and/or other materials provided with the distribution.
16
+
17
+ 3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC Laboratories America
18
+ and IDIAP Research Institute nor the names of its contributors may be
19
+ used to endorse or promote products derived from this software without
20
+ specific prior written permission.
21
+
22
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,12 @@
1
+ NDAV::Numo::NArray
2
+ ==================
3
+
4
+ MemoryView and pointer support for [Numo::NArray][] ([numo-narray-alt][]).
5
+
6
+ LICENSE
7
+ -------
8
+
9
+ 3-Clause BSD License. See LICENSE.txt file.
10
+
11
+ [Numo::NArray]: https://ruby-numo.github.io/narray/
12
+ [numo-narray-alt]: https://github.com/yoshoku/numo-narray-alt
data/Rakefile ADDED
@@ -0,0 +1,47 @@
1
+ require "rake/clean"
2
+ require "rake/testtask"
3
+ require "rubygems/tasks"
4
+
5
+ task default: :test
6
+
7
+ Gem::Tasks.new
8
+
9
+ SRC = FileList["ext/*.{h,c}"]
10
+
11
+ LIB_NAME = "narray.#{RbConfig::CONFIG["DLEXT"]}"
12
+ LIB_BUILD = File.join("ext", LIB_NAME)
13
+ LIB_PATH = File.join("lib", "ndav", "numo", LIB_NAME)
14
+ MAKEFILE = "ext/Makefile"
15
+
16
+ file LIB_PATH => MAKEFILE do |t|
17
+ chdir "ext" do
18
+ sh "make"
19
+ end
20
+ copy LIB_BUILD, LIB_PATH
21
+ end
22
+
23
+ file MAKEFILE => SRC + ["ext/extconf.rb"] do |t|
24
+ chdir "ext" do
25
+ ruby "extconf.rb"
26
+ end
27
+ end
28
+
29
+ if File.exist? MAKEFILE
30
+ task :make_clean do
31
+ chdir "ext" do
32
+ sh "make", "clean"
33
+ end
34
+ end
35
+ task clean: :make_clean
36
+
37
+ task :make_distclean do
38
+ chdir "ext" do
39
+ sh "make", "distclean"
40
+ end
41
+ end
42
+ task clobber: :make_distclean
43
+ end
44
+
45
+ CLEAN.include LIB_PATH
46
+
47
+ Rake::TestTask.new test: "lib/ndav/numo/narray.#{RbConfig::CONFIG["DLEXT"]}"
data/ext/extconf.rb ADDED
@@ -0,0 +1,9 @@
1
+ require "mkmf"
2
+
3
+ dependency = "numo-narray-alt"
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}"
8
+
9
+ create_makefile "ndav/numo/narray"
data/ext/narray.c ADDED
@@ -0,0 +1,28 @@
1
+ #ifndef NDAV_NUMO_NARRAY_H
2
+ #define NDAV_NUMO_NARRAY_H 1
3
+
4
+ #include <ruby.h>
5
+ #include <ruby/memory_view.h>
6
+ #include <numo/narray.h>
7
+
8
+ static VALUE
9
+ ndav_numo_narray_s_address(VALUE self, VALUE obj)
10
+ {
11
+ void* ptr = na_get_pointer_for_read(obj);
12
+
13
+ return PTR2NUM(ptr);
14
+ }
15
+
16
+ void
17
+ Init_narray(void)
18
+ {
19
+ rb_require("numo/narray/alt");
20
+
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");
24
+
25
+ rb_define_singleton_method(mNArray, "address", ndav_numo_narray_s_address, 1);
26
+ }
27
+
28
+ #endif /* NDAV_NUMO_NARRAY_H */
@@ -0,0 +1,67 @@
1
+ require "ndav"
2
+ require "numo/narray/alt"
3
+ require "ndav/numo/narray.so"
4
+
5
+ class NDAV
6
+ module Numo
7
+ module NArray
8
+ CLASS_TO_FORMAT = {
9
+ ::Numo::Int8 => "c",
10
+ ::Numo::UInt8 => "C",
11
+ ::Numo::Int16 => "s",
12
+ ::Numo::UInt16 => "S",
13
+ ::Numo::Int32 => "l",
14
+ ::Numo::UInt32 => "L",
15
+ ::Numo::Int64 => "q",
16
+ ::Numo::UInt64 => "Q",
17
+ ::Numo::SFloat => "f",
18
+ ::Numo::DFloat => "d"
19
+ }
20
+
21
+ FORMAT_TO_CLASS = CLASS_TO_FORMAT.invert
22
+
23
+ module FromNDAV
24
+ def from_ndav(ndav)
25
+ cls = FORMAT_TO_CLASS[ndav.format]
26
+ raise ArgumentError, "unsupported format: #{ndav.format}, currently supported: #{FORMAT_TO_CLASS.keys}" unless cls
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
33
+ end
34
+ end
35
+
36
+ module ToNDAV
37
+ def to_ndav
38
+ format = CLASS_TO_FORMAT[self.class]
39
+ raise ArgumentError, "unsupported class: #{self.class}, currently supported: #{CLASS_TO_FORMAT.keys}" unless format
40
+
41
+ ptr = ::Fiddle::Pointer.new(::NDAV::Numo::NArray.address(self), byte_size)
42
+ NDAV.new(ptr, shape:, format:, lifetime: self)
43
+ end
44
+ end
45
+
46
+ module Converter
47
+ def NumoNArray(array, *, **)
48
+ if array.kind_of? ::Numo::NArray
49
+ array
50
+ elsif array.respond_to? :to_numo_narray
51
+ array.to_numo_narray
52
+ elsif array.respond_to? :to_ndav
53
+ array.to_ndav(*, **).to_numo_narray
54
+ elsif array.respond_to? :to_narray # Red Arrow
55
+ array.to_narray
56
+ elsif array.respond_to? :numo # OnnxRuntime::OrtValue, Torch::Tensor
57
+ array.numo
58
+ else
59
+ ::NDAV.new(array, *, **).to_numo_narray
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ register ::Numo::NArray, Numo::NArray, name: :numo_narray
67
+ end
@@ -0,0 +1,23 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "ndav-numo-narray"
3
+ s.version = "0.0.1"
4
+ s.authors = ["Kitaiti Makoto"]
5
+ s.summary = "N-Dimensional Array View for Numo::NArray"
6
+ s.licenses = ["BSD-3-Clause"]
7
+ s.homepage = "https://gitlab.com/KitaitiMakoto/ndav-numo-narray"
8
+
9
+ s.files = Dir.chdir(__dir__) {`git ls-files -z`.split("\x0")}
10
+ s.extensions << "ext/extconf.rb"
11
+
12
+ s.add_runtime_dependency "ndav", ">= 0.0.3"
13
+ s.add_runtime_dependency "numo-narray-alt"
14
+
15
+ s.add_development_dependency "rake"
16
+ s.add_development_dependency "test-unit"
17
+ s.add_development_dependency "test-unit-notify"
18
+ s.add_development_dependency "test-unit-rr"
19
+ s.add_development_dependency "terminal-notifier" if RUBY_PLATFORM.match?(/darwin/)
20
+ s.add_development_dependency "rubygems-tasks"
21
+ s.add_development_dependency "fiddle"
22
+ s.add_development_dependency "red-arrow"
23
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "ndav/numo/narray"
2
+ require "test/unit"
3
+ require "test/unit/notify"
4
+ require "arrow"
5
+ require "fiddle"
@@ -0,0 +1,28 @@
1
+ require_relative "helper"
2
+
3
+ class TestAddress < Test::Unit::TestCase
4
+ def test_address
5
+ numo = ::Numo::Int16[1, 2, 3]
6
+
7
+ assert_raise TypeError do
8
+ ::NDAV::Numo::NArray.address(Object.new)
9
+ end
10
+
11
+ assert_instance_of Integer, ::NDAV::Numo::NArray.address(numo)
12
+ end
13
+
14
+ def test_pointer
15
+ numo = ::Numo::Int16[1, 2, 3]
16
+ address = ::NDAV::Numo::NArray.address(numo)
17
+
18
+ ptr = ::Fiddle::Pointer[address]
19
+ ptr.size = numo.byte_size
20
+ assert_equal [1, 2, 3].pack("s*"), ptr.to_s(numo.byte_size)
21
+
22
+ numo[0] = 4
23
+ assert_equal [4, 2, 3].pack("s*"), ptr.to_s(numo.byte_size)
24
+
25
+ ::Fiddle::Pointer.write(address, [7, 8, 9].pack("s*"))
26
+ assert_equal ::Numo::Int16[7, 8, 9], numo
27
+ end
28
+ end
@@ -0,0 +1,49 @@
1
+ require_relative "helper"
2
+
3
+ class TestConverter < Test::Unit::TestCase
4
+ def setup
5
+ @numo_narray = Numo::Int16[1, 2, 3]
6
+ @ndav = NDAV.new(Arrow::Int16Array.new([1, 2, 3]))
7
+ end
8
+
9
+ def test_ndav_from_numo_narray
10
+ assert_kind_of ::NDAV, ::NDAV.from_numo_narray(@numo_narray)
11
+ end
12
+
13
+ def test_numo_narray_from_ndav
14
+ assert_kind_of ::Numo::Int16, ::Numo::Int16.from_ndav(@ndav)
15
+ end
16
+
17
+ def test_ndav_to_numo_narray
18
+ assert_kind_of ::Numo::Int16, @ndav.to_numo_narray
19
+ end
20
+
21
+ def test_numo_narray_to_ndav
22
+ assert_kind_of ::NDAV, @numo_narray.to_ndav
23
+ end
24
+
25
+ def test_NDAV
26
+ assert_kind_of ::NDAV, ::NDAV::Converter::NDAV(@numo_narray)
27
+ end
28
+
29
+ def test_NumoNArray
30
+ assert_kind_of ::Numo::Int16, ::NDAV::Converter::NumoNArray(@ndav)
31
+ end
32
+
33
+ def test_include_converter
34
+ c = Class.new {
35
+ include ::NDAV::Converter
36
+
37
+ def to_ndav(array)
38
+ NDAV(array)
39
+ end
40
+
41
+ def to_numo_narray(ndav)
42
+ NumoNArray(ndav)
43
+ end
44
+ }
45
+
46
+ assert_kind_of ::NDAV, c.new.to_ndav(@numo_narray)
47
+ assert_kind_of ::Numo::Int16, c.new.to_numo_narray(@ndav)
48
+ end
49
+ end
@@ -0,0 +1,26 @@
1
+ require_relative "helper"
2
+ require "tempfile"
3
+ require "tmpdir"
4
+
5
+ class TestPackage < Test::Unit::TestCase
6
+ def test_build
7
+ Tempfile.create do |file|
8
+ assert system("gem", "build", "ndav-numo-narray.gemspec", "--output", file.to_path, exception: true)
9
+ assert file.size > 0
10
+ assert_path_exist file
11
+ end
12
+ end
13
+
14
+ def test_install
15
+ gemspec = Gem::Specification.load("ndav-numo-narray.gemspec")
16
+ Dir.mktmpdir do |dir|
17
+ dir = File.realpath(dir)
18
+ gemfile = File.join(dir, gemspec.file_name)
19
+ system "gem", "build", "ndav-numo-narray.gemspec", "--output", gemfile, exception: true
20
+ install_dir = File.join(dir, "install")
21
+ FileUtils.mkdir install_dir
22
+ system "gem", "install", "--install-dir", install_dir, "--no-document", gemfile, exception: true
23
+ assert_path_exist File.join(install_dir, "extensions", Gem::Platform.local.to_s, RbConfig::CONFIG['ruby_version'], gemspec.full_name, "ndav/numo/narray.#{RbConfig::CONFIG["DLEXT"]}")
24
+ end
25
+ end
26
+ end
metadata ADDED
@@ -0,0 +1,191 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ndav-numo-narray
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Kitaiti Makoto
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: ndav
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 0.0.3
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 0.0.3
26
+ - !ruby/object:Gem::Dependency
27
+ name: numo-narray-alt
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rake
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: test-unit
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: test-unit-notify
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: test-unit-rr
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: terminal-notifier
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rubygems-tasks
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ - !ruby/object:Gem::Dependency
125
+ name: fiddle
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ - !ruby/object:Gem::Dependency
139
+ name: red-arrow
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ executables: []
153
+ extensions:
154
+ - ext/extconf.rb
155
+ extra_rdoc_files: []
156
+ files:
157
+ - ".gitignore"
158
+ - Gemfile
159
+ - LICENSE.txt
160
+ - README.md
161
+ - Rakefile
162
+ - ext/extconf.rb
163
+ - ext/narray.c
164
+ - lib/ndav/numo/narray.rb
165
+ - ndav-numo-narray.gemspec
166
+ - test/helper.rb
167
+ - test/test_address.rb
168
+ - test/test_converter.rb
169
+ - test/test_package.rb
170
+ homepage: https://gitlab.com/KitaitiMakoto/ndav-numo-narray
171
+ licenses:
172
+ - BSD-3-Clause
173
+ metadata: {}
174
+ rdoc_options: []
175
+ require_paths:
176
+ - lib
177
+ required_ruby_version: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ required_rubygems_version: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ requirements: []
188
+ rubygems_version: 4.0.6
189
+ specification_version: 4
190
+ summary: N-Dimensional Array View for Numo::NArray
191
+ test_files: []