ndav-torch-tensor 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: 36132b58b87a1b47538fb26518f86d24142210e817050ab50a26a2de8d7e1ef9
4
- data.tar.gz: f628b3933bbda77e839df1631565c6158243a9cb6e7cbbc0bc343de0e19fd758
3
+ metadata.gz: 51c99b994468de49aacf7b24673dd7cd4e755b1bc1f5ea858d2aa85093aa299c
4
+ data.tar.gz: 9c0737070ab1b78c0f9ef3908b989060e6693d555380a6c793a3e4f26015dc57
5
5
  SHA512:
6
- metadata.gz: d703a4c0eae1e1f1452571f62efe455e79bbf429ab430f51c13346bf9a5dafcec65c47d7421890d78a36b012e3771f620b61d20bb82d08060ca380f022f2c391
7
- data.tar.gz: 1ad44e898483c80964c2458b8680ab58b7a031f049d2b8b9fed5c61d2bda81b27649b44c6c07bb9525ddbb4245c577b37bf4c4c6865a8328143d0f599c7e8146
6
+ metadata.gz: 4d03dcd52b4cc3db70cd26222a6c2c0f2ae8ab6f361aa593227860fd93f4a1ff8c1423040e63e37bc929e7a517f7f2210874af71fe030e84b7bf3b74b212a747
7
+ data.tar.gz: b6cdbdfdac3d49920e23bdbad413d92d97e2343536b9f295d25a5319d1fdf139321e67995f20ac6dec61525e48888c129d351269a36b1d3cea6fcf7cdc6c9a5e
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  Gemfile.lock
2
2
  .bundle/
3
+ pkg/
data/README.md CHANGED
@@ -1,11 +1,30 @@
1
1
  NDAV::Torch::Tensor
2
2
  ===================
3
3
 
4
- MemoryView and pointer support for [Torch]::Tensor.
4
+ [NDAV][] bridge for [Torch][]::Tensor.
5
+
6
+ SYNOPSIS
7
+ --------
8
+
9
+ ```ruby
10
+ require "ndav/torch/tensor"
11
+
12
+ torch = Torch.rand(2, 3) # => Torch::Tensor
13
+ ndav = torch.to_ndav # => NDAV
14
+ torch = ndav.to_torch_tensor # => Torch::Tensor
15
+
16
+ ndav = NDAV.from_torch_tensor(torch) # => NDAV
17
+ torch = Torch::Tensor.from_ndav(ndav) # => Torch::Tensor
18
+
19
+ include NDAV::Converter
20
+ ndav = NDAV(torch) # => NDAV
21
+ torch = TorchTensor(ndav) # => Torch::NArray
22
+ ```
5
23
 
6
24
  LICENSE
7
25
  -------
8
26
 
9
27
  MIT license. See LICENSE.txt file.
10
28
 
29
+ [NDAV]: https://kitaitimakoto.gitlab.io/ndav/
11
30
  [Torch]: https://github.com/ankane/torch.rb
@@ -4,6 +4,19 @@ require "torch"
4
4
 
5
5
  class NDAV
6
6
  module Torch
7
+ module FromNDAV
8
+ def from_ndav(ndav)
9
+ dtype = Tensor::FORMAT_TO_TYPE[ndav.format]
10
+ raise ArgumentError, "unsupported format: #{input.format}, currently supported: #{Tensor::TYPE_TO_FORMAT.values}" unless dtype
11
+
12
+ opts = tensor_options(dtype:)
13
+ tensor = _from_blob_ref(ndav.to_s, [ndav.byte_size / ndav.item_size], opts)
14
+ .reshape(ndav.shape)
15
+ tensor.instance_variable_set(:@ndav, ndav) # keep reference to NDAV to prevent GC
16
+ tensor
17
+ end
18
+ end
19
+
7
20
  module Tensor
8
21
  TYPE_TO_FORMAT = {
9
22
  int8: "c",
@@ -33,76 +46,45 @@ class NDAV
33
46
 
34
47
  TYPE_SIZES = TYPE_TO_FORMAT.transform_values {|format| ITEM_SIZES[format]}
35
48
 
36
- module FromNDAV
37
- def from_ndav(ndav)
38
- dtype = FORMAT_TO_TYPE[ndav.format]
39
- raise ArgumentError, "unsupported format: #{input.format}, currently supported: #{TYPE_TO_FORMAT.values}" unless dtype
40
-
41
- opts = tensor_options(dtype:)
42
- tensor = _from_blob_ref(ndav.to_s, [ndav.byte_size / ndav.item_size], opts)
43
- .reshape(ndav.shape)
44
- tensor.instance_variable_set(:@ndav, ndav) # keep reference to NDAV to prevent GC
45
- tensor
46
- end
47
- end
48
-
49
- module ToNDAV
50
- def to_ndav
49
+ module MemoryViewable
50
+ def ndav_descriptor(**)
51
51
  format = TYPE_TO_FORMAT[dtype]
52
- raise ArgumentError, "unsupported dtype: #{dtype}, currently supported: #{TYPE_TO_FORMAT.keys}" unless format
53
-
54
- ptr = Fiddle::Pointer.new(_data_ptr, numel * element_size)
55
- NDAV.new(ptr, shape:, format:, lifetime: self)
56
- end
57
- end
52
+ unless format
53
+ warn "unsupported dtype: #{dtype}, currently supported: #{TYPE_TO_FORMAT.keys}"
54
+ return false
55
+ end
58
56
 
59
- module FromTorchTensor
60
- def from_torch_tensor(tensor)
61
- tensor.to_ndav
62
- end
63
- end
57
+ byte_size = numel * element_size
64
58
 
65
- module ToTorchTensor
66
- def to_torch_tensor
67
- ::Torch.from_ndav(self)
59
+ {
60
+ data: ::Fiddle::Pointer.new(_data_ptr, byte_size),
61
+ shape:,
62
+ strides: stride.collect {|s| s * element_size},
63
+ format:,
64
+ byte_size:,
65
+ readonly?: false,
66
+ sub_offsets: nil
67
+ }
68
68
  end
69
69
  end
70
70
 
71
71
  module Converter
72
- if defined? ::NDAV::Converter::TorchTensor
73
- def TorchTensor(array, *, **)
74
- if array.kind_of? ::NDAV
75
- array.to_torch_tensor
76
- elsif array.respond_to? :to_torch_tensor
77
- array.to_torch_tensor
78
- elsif array.respond_to? :to_ndav
79
- array.to_ndav(*, **).to_torch_tensor
80
- else
81
- super
82
- end
83
- end
84
- else
85
- def TorchTensor(array, *, **)
86
- if array.kind_of? ::NDAV
87
- array.to_torch_tensor
88
- elsif array.respond_to? :to_torch_tensor
89
- array.to_torch_tensor
90
- elsif array.respond_to? :to_ndav
91
- array.to_ndav(*, **).to_torch_tensor
92
- else
93
- ::NDAV.new(array, *, **).to_torch_tensor
94
- end
72
+ def TorchTensor(array, *, **)
73
+ if array.kind_of? ::NDAV
74
+ array.to_torch_tensor
75
+ elsif array.respond_to? :to_torch_tensor
76
+ array.to_torch_tensor
77
+ elsif array.respond_to? :to_ndav
78
+ array.to_ndav(*, **).to_torch_tensor
79
+ else
80
+ ::NDAV.new(array, *, **).to_torch_tensor
95
81
  end
96
82
  end
97
83
  end
98
-
99
- ::Torch.extend FromNDAV
100
- ::Torch::Tensor.include ToNDAV
101
- ::NDAV.extend FromTorchTensor
102
- ::NDAV.include ToTorchTensor
103
- ::NDAV::Converter.singleton_class.prepend Converter
104
- ::NDAV::Converter.prepend Converter
105
84
  end
106
85
  end
86
+
87
+ register ::Torch, Torch, name: :torch_tensor
88
+ register ::Torch::Tensor, Torch::Tensor, name: :torch_tensor
107
89
  end
108
90
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "ndav-torch-tensor"
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 Torch::Tensors"
6
6
  s.licenses = ["MIT"]
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
8
8
 
9
9
  s.files = Dir.chdir(__dir__) {`git ls-files -z`.split("\x0")}
10
10
 
11
- s.add_runtime_dependency "ndav"
11
+ s.add_runtime_dependency "ndav", ">= 0.0.5"
12
12
  s.add_runtime_dependency "torch-rb"
13
13
 
14
14
  s.add_development_dependency "rake"
@@ -14,6 +14,15 @@ class TestTorchTensor < Test::Unit::TestCase
14
14
  assert_kind_of ::Torch::Tensor, ::Torch.from_ndav(@ndav)
15
15
  end
16
16
 
17
+ def test_memory_view
18
+ Fiddle::MemoryView.export @torch_tensor do |view|
19
+ assert_equal "s", view.format
20
+ assert_equal [3], view.shape
21
+ assert_equal [2], view.strides
22
+ assert_equal [1, 2, 3].pack("s*"), view.to_s
23
+ end
24
+ end
25
+
17
26
  def test_ndav_to_torch_tensor
18
27
  assert_kind_of ::Torch::Tensor, @ndav.to_torch_tensor
19
28
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ndav-torch-tensor
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'
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'
25
+ version: 0.0.5
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: torch-rb
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -166,7 +166,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
166
  - !ruby/object:Gem::Version
167
167
  version: '0'
168
168
  requirements: []
169
- rubygems_version: 4.0.6
169
+ rubygems_version: 4.0.16
170
170
  specification_version: 4
171
171
  summary: N-Dimensional Array View for Torch::Tensors
172
172
  test_files: []