ngt 0.4.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 056e77fc31169b9c0402c1460eebe72aa3a40ec105d3b7974dcef2b5846c6ed5
4
- data.tar.gz: cf99943c13969f7529a6b4371d38f139479bb24015a68382a091bb7446d25a1f
3
+ metadata.gz: 94ae9612ba58d3e5aa3fecdea4ccb93e6ecaa8086c7b5e5e64a626962a3c7dbf
4
+ data.tar.gz: 6bf8e3fc92f83994e47caf230027199a2da2c0464b5cce0cdaf0f861ce2b05e2
5
5
  SHA512:
6
- metadata.gz: d5a0a3760d14a415e1c16adec206063fd60f3bc0957ccf470e3b588bae4f331d9f9ab7ab80da117e44e25ae6a384d8873228856582f8da6804cce8b72c696188
7
- data.tar.gz: 0e78ecd9a477c76a2f77c3ae2242a6886e02daf6ce8c6af99b9e1a50745a38b4f51a91472a936611b383db3f1e176798d4472393250c4d2cd334d8692ddd58ff
6
+ metadata.gz: 8580f88ad7c6fa1527445aeeba274e67bcf76612cf3aa2c100afe53ca62628df59237119d1878b3244517bd8c01a75cfc5015176c2baf9e2d6eb9617876d4fd1
7
+ data.tar.gz: 92e66568528c8cc76fe38efdb2795106bea0e50ca1263bf659ef52e26b4f4c36e192e5180a304acd186c746f3b02a3cf2488c2e95c786d024174b8411e5f8fba
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.4.1 (2022-12-08)
2
+
3
+ - Added support for `:float16` object type
4
+ - Fixed error with `object` method
5
+
1
6
  ## 0.4.0 (2022-06-14)
2
7
 
3
8
  - Updated NGT to 1.14.6
data/lib/ngt/ffi.rb CHANGED
@@ -36,8 +36,10 @@ module Ngt
36
36
  attach_function :ngt_set_property_edge_size_for_creation, %i[pointer int16_t pointer], :bool
37
37
  attach_function :ngt_set_property_edge_size_for_search, %i[pointer int16_t pointer], :bool
38
38
  attach_function :ngt_is_property_object_type_float, %i[int32_t], :bool
39
+ attach_function :ngt_is_property_object_type_float16, %i[int32_t], :bool
39
40
  attach_function :ngt_get_property_object_type, %i[pointer pointer], :int32_t
40
41
  attach_function :ngt_set_property_object_type_float, %i[pointer pointer], :bool
42
+ attach_function :ngt_set_property_object_type_float16, %i[pointer pointer], :bool
41
43
  attach_function :ngt_set_property_object_type_integer, %i[pointer pointer], :bool
42
44
  attach_function :ngt_set_property_distance_type_l1, %i[pointer pointer], :bool
43
45
  attach_function :ngt_set_property_distance_type_l2, %i[pointer pointer], :bool
@@ -67,6 +69,7 @@ module Ngt
67
69
  attach_function :ngt_get_property_distance_type, %i[pointer pointer], :distance_type
68
70
  attach_function :ngt_create_error_object, %i[], :pointer
69
71
  attach_function :ngt_get_error_string, %i[pointer], :string
72
+ attach_function :ngt_clear_error_string, %i[pointer], :void
70
73
  attach_function :ngt_destroy_error_object, %i[pointer], :void
71
74
  attach_function :ngt_create_optimizer, %i[bool pointer], :pointer
72
75
  attach_function :ngt_optimizer_adjust_search_coefficients, %i[pointer string pointer], :bool
data/lib/ngt/index.rb CHANGED
@@ -34,22 +34,34 @@ module Ngt
34
34
  def object_type
35
35
  @object_type ||= begin
36
36
  object_type = ffi(:ngt_get_property_object_type, @property)
37
- FFI.ngt_is_property_object_type_float(object_type) ? :float : :integer
37
+ if FFI.ngt_is_property_object_type_float(object_type)
38
+ :float
39
+ elsif FFI.ngt_is_property_object_type_float16(object_type)
40
+ :float16
41
+ else
42
+ :integer
43
+ end
38
44
  end
39
45
  end
40
46
 
41
47
  def insert(object)
42
- ffi(:ngt_insert_index, @index, c_object(object.to_a), dimensions)
48
+ object = object.to_a
49
+ ffi(:ngt_insert_index, @index, c_object(object), object.size)
43
50
  end
44
51
 
45
52
  def batch_insert(objects, num_threads: 8)
46
53
  if narray?(objects)
54
+ check_dimensions(objects.shape[1])
55
+
47
56
  objects = objects.cast_to(Numo::SFloat) unless objects.is_a?(Numo::SFloat)
48
57
  count = objects.shape[0]
49
58
  obj = ::FFI::MemoryPointer.new(:char, objects.byte_size)
50
59
  obj.write_bytes(objects.to_binary)
51
60
  else
52
61
  objects = objects.to_a
62
+ objects.each do |object|
63
+ check_dimensions(object.size)
64
+ end
53
65
  count = objects.size
54
66
  flat_objects = objects.flatten
55
67
  obj = ::FFI::MemoryPointer.new(:float, flat_objects.size)
@@ -70,11 +82,13 @@ module Ngt
70
82
 
71
83
  def object(id)
72
84
  if object_type == :float
73
- res = ffi(:ngt_get_object_as_float, @object_space, id)
85
+ res = ffi(:ngt_get_object_as_float, object_space, id)
74
86
  res.read_array_of_float(dimensions)
75
- else
76
- res = ffi(:ngt_get_object_as_integer, @object_space, id)
87
+ elsif object_type == :integer
88
+ res = ffi(:ngt_get_object_as_integer, object_space, id)
77
89
  res.read_array_of_uint8(dimensions)
90
+ else
91
+ raise Error, "Method not supported for this object type"
78
92
  end
79
93
  end
80
94
 
@@ -85,7 +99,8 @@ module Ngt
85
99
  def search(query, size: 20, epsilon: 0.1, radius: nil)
86
100
  radius ||= -1.0
87
101
  results = ffi(:ngt_create_empty_results)
88
- ffi(:ngt_search_index, @index, c_object(query.to_a), dimensions, size, epsilon, radius, results)
102
+ query = query.to_a
103
+ ffi(:ngt_search_index, @index, c_object(query), query.size, size, epsilon, radius, results)
89
104
  result_size = ffi(:ngt_get_result_size, results)
90
105
  ret = []
91
106
  result_size.times do |i|
@@ -125,6 +140,8 @@ module Ngt
125
140
  case object_type.to_s.downcase
126
141
  when "float"
127
142
  ffi(:ngt_set_property_object_type_float, property, error)
143
+ when "float16"
144
+ ffi(:ngt_set_property_object_type_float16, property, error)
128
145
  when "integer"
129
146
  ffi(:ngt_set_property_object_type_integer, property, error)
130
147
  else
@@ -196,9 +213,18 @@ module Ngt
196
213
  end
197
214
 
198
215
  def c_object(object)
216
+ check_dimensions(object.size)
199
217
  c_object = ::FFI::MemoryPointer.new(:double, object.size)
200
218
  c_object.write_array_of_double(object)
201
219
  c_object
202
220
  end
221
+
222
+ def check_dimensions(d)
223
+ raise ArgumentError, "Bad dimensions" if d != dimensions
224
+ end
225
+
226
+ def object_space
227
+ @object_space ||= ffi(:ngt_get_object_space, @index)
228
+ end
203
229
  end
204
230
  end
data/lib/ngt/utils.rb CHANGED
@@ -4,7 +4,10 @@ module Ngt
4
4
  def self.ffi(method, *args)
5
5
  res = FFI.send(method, *args)
6
6
  message = FFI.ngt_get_error_string(args.last)
7
- raise Error, message unless message.empty?
7
+ unless message.empty?
8
+ FFI.ngt_clear_error_string(args.last)
9
+ raise Error, message
10
+ end
8
11
  res
9
12
  end
10
13
 
data/lib/ngt/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ngt
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ngt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-15 00:00:00.000000000 Z
11
+ date: 2022-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi