ngt 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
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