ollama-ruby 0.12.1 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,184 +0,0 @@
1
- require 'numo/narray'
2
- require 'digest'
3
- require 'kramdown/ansi'
4
-
5
- class Ollama::Documents
6
- end
7
- module Ollama::Documents::Cache
8
- end
9
- require 'ollama/documents/cache/records'
10
- require 'ollama/documents/cache/memory_cache'
11
- require 'ollama/documents/cache/redis_cache'
12
- require 'ollama/documents/cache/redis_backed_memory_cache'
13
- require 'ollama/documents/cache/sqlite_cache'
14
- module Ollama::Documents::Splitters
15
- end
16
- require 'ollama/documents/splitters/character'
17
- require 'ollama/documents/splitters/semantic'
18
-
19
- class Ollama::Documents
20
- include Kramdown::ANSI::Width
21
- include Ollama::Documents::Cache
22
-
23
- Record = Class.new Ollama::Documents::Cache::Records::Record
24
-
25
- def initialize(ollama:, model:, model_options: nil, collection: nil, embedding_length: 1_024, cache: MemoryCache, database_filename: nil, redis_url: nil, debug: false)
26
- collection ||= default_collection
27
- @ollama, @model, @model_options, @collection, @debug =
28
- ollama, model, model_options, collection.to_sym, debug
29
- database_filename ||= ':memory:'
30
- @cache = connect_cache(cache, redis_url, embedding_length, database_filename)
31
- end
32
-
33
- def default_collection
34
- :default
35
- end
36
-
37
- attr_reader :ollama, :model, :collection, :cache
38
-
39
- def collection=(new_collection)
40
- @collection = new_collection.to_sym
41
- @cache.prefix = prefix
42
- end
43
-
44
- def add(inputs, batch_size: nil, source: nil, tags: [])
45
- inputs = Array(inputs)
46
- batch_size ||= 10
47
- tags = Ollama::Utils::Tags.new(tags, source:)
48
- if source
49
- tags.add(File.basename(source).gsub(/\?.*/, ''), source:)
50
- end
51
- inputs.map! { |i|
52
- text = i.respond_to?(:read) ? i.read : i.to_s
53
- text
54
- }
55
- inputs.reject! { |i| exist?(i) }
56
- inputs.empty? and return self
57
- if @debug
58
- puts Ollama::Utils::ColorizeTexts.new(inputs)
59
- end
60
- batches = inputs.each_slice(batch_size).
61
- with_infobar(
62
- label: "Add #{truncate(tags.to_s(link: false), percentage: 25)}",
63
- total: inputs.size
64
- )
65
- batches.each do |batch|
66
- embeddings = fetch_embeddings(model:, options: @model_options, input: batch)
67
- batch.zip(embeddings) do |text, embedding|
68
- norm = @cache.norm(embedding)
69
- self[text] = Record[text:, embedding:, norm:, source:, tags: tags.to_a]
70
- end
71
- infobar.progress by: batch.size
72
- end
73
- infobar.newline
74
- self
75
- end
76
- alias << add
77
-
78
- def [](text)
79
- @cache[key(text)]
80
- end
81
-
82
- def []=(text, record)
83
- @cache[key(text)] = record
84
- end
85
-
86
- def exist?(text)
87
- @cache.key?(key(text))
88
- end
89
-
90
- def delete(text)
91
- @cache.delete(key(text))
92
- end
93
-
94
- def size
95
- @cache.size
96
- end
97
-
98
- def clear(tags: nil)
99
- @cache.clear(tags:)
100
- self
101
- end
102
-
103
- def find(string, tags: nil, prompt: nil, max_records: nil)
104
- needle = convert_to_vector(string, prompt:)
105
- @cache.find_records(needle, tags:, max_records: nil)
106
- end
107
-
108
- def find_where(string, text_size: nil, text_count: nil, **opts)
109
- if text_count
110
- opts[:max_records] = text_count
111
- end
112
- records = find(string, **opts)
113
- size, count = 0, 0
114
- records.take_while do |record|
115
- if text_size and (size += record.text.size) > text_size
116
- next false
117
- end
118
- if text_count and (count += 1) > text_count
119
- next false
120
- end
121
- true
122
- end
123
- end
124
-
125
- def collections
126
- ([ default_collection ] + @cache.collections('%s-' % self.class)).uniq
127
- end
128
-
129
- def tags
130
- @cache.tags
131
- end
132
-
133
- private
134
-
135
- def connect_cache(cache_class, redis_url, embedding_length, database_filename)
136
- cache = nil
137
- if (cache_class.instance_method(:redis) rescue nil)
138
- begin
139
- cache = cache_class.new(prefix:, url: redis_url, object_class: Record)
140
- cache.size
141
- rescue Redis::CannotConnectError
142
- STDERR.puts(
143
- "Cannot connect to redis URL #{redis_url.inspect}, "\
144
- "falling back to MemoryCache."
145
- )
146
- end
147
- elsif cache_class == SQLiteCache
148
- cache = cache_class.new(
149
- prefix:,
150
- embedding_length:,
151
- filename: database_filename,
152
- debug: @debug
153
- )
154
- end
155
- ensure
156
- cache ||= MemoryCache.new(prefix:,)
157
- cache.respond_to?(:find_records) or cache.extend(Records::FindRecords)
158
- cache.extend(Records::Tags)
159
- if cache.respond_to?(:redis)
160
- cache.extend(Records::RedisFullEach)
161
- end
162
- return cache
163
- end
164
-
165
- def convert_to_vector(input, prompt: nil)
166
- if prompt
167
- input = prompt % input
168
- end
169
- input.is_a?(String) and input = fetch_embeddings(model:, input:).first
170
- @cache.convert_to_vector(input)
171
- end
172
-
173
- def fetch_embeddings(model:, input:, options: nil)
174
- @ollama.embed(model:, input:, options:).embeddings
175
- end
176
-
177
- def prefix
178
- '%s-%s-' % [ self.class, @collection ]
179
- end
180
-
181
- def key(input)
182
- Digest::SHA256.hexdigest(input)
183
- end
184
- end
@@ -1,65 +0,0 @@
1
- require 'term/ansicolor'
2
- require 'kramdown/ansi'
3
-
4
- class Ollama::Utils::ColorizeTexts
5
- include Math
6
- include Term::ANSIColor
7
- include Kramdown::ANSI::Width
8
-
9
- # Initializes a new instance of Ollama::Utils::ColorizeTexts
10
- #
11
- # @param [Array<String>] texts the array of strings to be displayed with colors
12
- #
13
- # @return [Ollama::Utils::ColorizeTexts] an instance of Ollama::Utils::ColorizeTexts
14
- def initialize(*texts)
15
- texts = texts.map(&:to_a)
16
- @texts = Array(texts.flatten)
17
- end
18
-
19
- # Returns a string representation of the object, including all texts content,
20
- # colored differently and their sizes.
21
- #
22
- # @return [String] The formatted string.
23
- def to_s
24
- result = +''
25
- @texts.each_with_index do |t, i|
26
- color = colors[(t.hash ^ i.hash) % colors.size]
27
- wrap(t, percentage: 90).each_line { |l|
28
- result << on_color(color) { color(text_color(color)) { l } }
29
- }
30
- result << "\n##{bold{t.size.to_s}} \n\n"
31
- end
32
- result
33
- end
34
-
35
- private
36
-
37
- # Returns the nearest RGB color to the given ANSI color
38
- #
39
- # @param [color] color The ANSI color attribute
40
- #
41
- # @return [Array<RGBTriple>] An array containing two RGB colors, one for black and
42
- # one for white text, where the first is the closest match to the input color
43
- # when printed on a black background, and the second is the closest match
44
- # when printed on a white background.
45
- def text_color(color)
46
- color = Term::ANSIColor::Attribute[color]
47
- [
48
- Attribute.nearest_rgb_color('#000'),
49
- Attribute.nearest_rgb_color('#fff'),
50
- ].max_by { |t| t.distance_to(color) }
51
- end
52
-
53
- # Returns an array of colors for each step in the gradient
54
- #
55
- # @return [Array<Array<Integer>>] An array of RGB color arrays
56
- def colors
57
- @colors ||= (0..255).map { |i|
58
- [
59
- 128 + 128 * sin(PI * i / 32.0),
60
- 128 + 128 * sin(PI * i / 64.0),
61
- 128 + 128 * sin(PI * i / 128.0),
62
- ].map { _1.clamp(0, 255).round }
63
- }
64
- end
65
- end
@@ -1,48 +0,0 @@
1
- module Ollama::Utils::Math
2
- # Returns the cosine similarity between two vectors +a+ and +b+, 1.0 is
3
- # exactly the same, 0.0 means decorrelated.
4
- #
5
- # @param [Vector] a The first vector
6
- # @param [Vector] b The second vector
7
- # @option a_norm [Float] a The Euclidean norm of vector a (default: calculated from a)
8
- # @option b_norm [Float] b The Euclidean norm of vector b (default: calculated from b)
9
- #
10
- # @return [Float] The cosine similarity between the two vectors
11
- #
12
- # @example Calculate the cosine similarity between two vectors
13
- # cosine_similarity(a: [1, 2], b: [3, 4])
14
- #
15
- # @see #convert_to_vector
16
- # @see #norm
17
- def cosine_similarity(a:, b:, a_norm: norm(a), b_norm: norm(b))
18
- a, b = convert_to_vector(a), convert_to_vector(b)
19
- a.dot(b) / (a_norm * b_norm)
20
- end
21
-
22
- # Returns the Euclidean norm (magnitude) of a vector.
23
- #
24
- # @param vector [Array] The input vector.
25
- #
26
- # @return [Float] The magnitude of the vector.
27
- #
28
- # @example
29
- # norm([3, 4]) # => 5.0
30
- def norm(vector)
31
- s = 0.0
32
- vector.each { s += _1.abs2 }
33
- Math.sqrt(s)
34
- end
35
-
36
- # Converts an array to a Numo NArray.
37
- #
38
- # @param [Array] vector The input array to be converted.
39
- #
40
- # @return [Numo::NArray] The converted NArray, or the original if it's already a Numo NArray.
41
- #
42
- # @example Convert an array to a Numo NArray
43
- # convert_to_vector([1, 2, 3]) # => Numo::NArray[1, 2, 3]
44
- def convert_to_vector(vector)
45
- vector.is_a?(Numo::NArray) and return vector
46
- Numo::NArray[*vector]
47
- end
48
- end
@@ -1,67 +0,0 @@
1
- class Ollama::Utils::Tags
2
- class Tag < String
3
- include Term::ANSIColor
4
-
5
- def initialize(tag, source: nil)
6
- super(tag.to_s.gsub(/\A#+/, ''))
7
- self.source = source
8
- end
9
-
10
- attr_accessor :source
11
-
12
- alias_method :internal, :to_s
13
-
14
- def to_s(link: true)
15
- tag_string = start_with?(?#) ? super() : ?# + super()
16
- my_source = source
17
- if link && my_source
18
- unless my_source =~ %r(\A(https?|file)://)
19
- my_source = 'file://%s' % File.expand_path(my_source)
20
- end
21
- hyperlink(my_source) { tag_string }
22
- else
23
- tag_string
24
- end
25
- end
26
- end
27
-
28
- def initialize(tags = [], source: nil)
29
- tags = Array(tags)
30
- @set = []
31
- tags.each { |tag| add(tag, source:) }
32
- end
33
-
34
- def add(tag, source: nil)
35
- unless tag.is_a?(Tag)
36
- tag = Tag.new(tag, source:)
37
- end
38
- index = @set.bsearch_index { _1 >= tag }
39
- if index == nil
40
- @set.push(tag)
41
- elsif @set.at(index) != tag
42
- @set.insert(index, tag)
43
- end
44
- self
45
- end
46
-
47
- def empty?
48
- @set.empty?
49
- end
50
-
51
- def size
52
- @set.size
53
- end
54
-
55
- def clear
56
- @set.clear
57
- end
58
-
59
- def each(&block)
60
- @set.each(&block)
61
- end
62
- include Enumerable
63
-
64
- def to_s(link: true)
65
- @set.map { |tag| tag.to_s(link:) } * ' '
66
- end
67
- end
@@ -1 +0,0 @@
1
- [[-0.009,-0.0,-0.035,-0.002,-0.044,-0.063,0.1,0.03,0.052,-0.06,-0.027,0.012,0.03,-0.04,-0.013,0.023,-0.028,0.015,-0.066,-0.032,0.052,0.028,0.063,0.037,-0.005,-0.024,0.006,0.008,0.014,-0.007,-0.042,-0.018,0.012,-0.061,-0.03,0.004,-0.019,0.003,0.065,0.058,0.004,-0.032,0.023,-0.016,0.03,-0.009,-0.022,-0.026,0.057,-0.013,0.002,0.004,-0.059,-0.047,0.084,0.085,0.048,-0.008,0.11,0.041,-0.018,0.071,-0.022,-0.067,0.015,-0.031,0.037,-0.034,0.032,0.121,0.063,0.003,-0.016,-0.007,0.011,0.093,0.056,-0.054,0.028,0.014,-0.008,-0.102,-0.072,-0.042,0.025,0.005,-0.005,-0.083,-0.008,0.018,-0.076,0.07,0.03,0.003,-0.029,0.021,0.016,0.036,-0.101,0.194,-0.01,-0.014,0.07,-0.004,0.001,-0.087,0.001,-0.0,0.02,0.0,-0.061,-0.108,-0.039,0.068,-0.015,0.033,0.008,0.044,0.016,-0.017,-0.034,-0.018,0.023,-0.018,-0.031,-0.068,0.021,0.0,-0.006,0.032,-0.019,0.019,-0.004,0.063,-0.018,-0.057,0.021,-0.054,-0.047,0.035,-0.113,-0.005,0.065,0.033,-0.018,0.055,-0.033,0.01,-0.095,0.008,0.008,0.053,-0.03,-0.036,0.068,-0.128,-0.011,0.034,-0.022,0.01,-0.012,0.033,-0.016,0.127,0.081,-0.028,-0.07,0.004,-0.067,0.063,-0.056,0.025,-0.014,0.094,-0.012,-0.016,0.065,0.045,0.082,0.001,-0.023,0.014,-0.04,-0.002,0.024,0.001,0.03,0.051,-0.017,-0.071,0.108,-0.028,0.004,-0.048,-0.026,0.041,-0.038,0.05,0.002,-0.027,-0.005,0.019,-0.045,-0.077,-0.16,0.021,0.05,-0.068,0.069,-0.045,0.041,-0.091,-0.024,0.025,-0.052,-0.046,0.066,-0.114,-0.002,0.004,0.063,-0.056,-0.004,0.0,0.071,0.08,0.022,-0.087,-0.02,-0.078,0.002,0.081,-0.038,-0.001,-0.072,0.003,0.014,0.005,0.022,-0.008,0.094,0.011,0.068,-0.013,-0.015,-0.046,0.055,0.013,-0.004,-0.001,-0.015,0.01,-0.014,0.013,-0.036,-0.007,-0.07,-0.061,-0.08,0.018,0.005,-0.001,-0.017,0.027,0.031,-0.023,0.001,0.167,-0.007,-0.031,0.035,0.032,-0.009,0.122,-0.037,-0.032,-0.011,0.018,-0.042,0.051,-0.002,-0.081,0.06,-0.009,0.061,0.065,-0.037,0.076,0.05,0.083,-0.026,0.034,-0.097,-0.016,0.116,0.026,-0.173,0.011,0.051,-0.055,0.013,0.045,-0.017,-0.121,-0.071,-0.025,0.075,-0.031,0.047,0.062,0.05,0.101,-0.036,-0.018,0.051,-0.072,0.004,-0.023,0.019,0.0,-0.024,0.073,0.018,-0.063,0.079,0.012,-0.076,-0.006,-0.009,0.002,-0.025,0.063,-0.011,0.104,0.004,0.025,0.009,-0.071,-0.032,-0.051,-0.096,-0.072,-0.116,-0.06,-0.035,-0.021,0.016,0.045,0.014,0.036,-0.03,0.009,-0.091,-0.045,0.02,-0.105,-0.006,0.046,-0.028,-0.116,-0.078,-0.013,0.019,0.004,-0.05,0.023,0.046,-0.03,-0.021,0.001,0.022,0.02,-0.015,0.059,0.132,0.022,-0.01,-0.003,-0.002,0.021,0.052,-0.023,0.017,0.009],[-0.009,-0.0,-0.035,-0.002,-0.044,-0.063,0.1,0.03,0.052,-0.06,-0.027,0.012,0.03,-0.04,-0.013,0.023,-0.028,0.015,-0.066,-0.032,0.052,0.028,0.063,0.037,-0.005,-0.024,0.006,0.008,0.014,-0.007,-0.042,-0.018,0.012,-0.061,-0.03,0.004,-0.019,0.003,0.065,0.058,0.004,-0.032,0.023,-0.016,0.03,-0.009,-0.022,-0.026,0.057,-0.013,0.002,0.004,-0.059,-0.047,0.084,0.085,0.048,-0.008,0.11,0.041,-0.018,0.071,-0.022,-0.067,0.015,-0.031,0.037,-0.034,0.032,0.121,0.063,0.003,-0.016,-0.007,0.011,0.093,0.056,-0.054,0.028,0.014,-0.008,-0.102,-0.072,-0.042,0.025,0.005,-0.005,-0.083,-0.008,0.018,-0.076,0.07,0.03,0.003,-0.029,0.021,0.016,0.036,-0.101,0.194,-0.01,-0.014,0.07,-0.004,0.001,-0.087,0.001,-0.0,0.02,0.0,-0.061,-0.108,-0.039,0.068,-0.015,0.033,0.008,0.044,0.016,-0.017,-0.034,-0.018,0.023,-0.018,-0.031,-0.068,0.021,0.0,-0.006,0.032,-0.019,0.019,-0.004,0.063,-0.018,-0.057,0.021,-0.054,-0.047,0.035,-0.113,-0.005,0.065,0.033,-0.018,0.055,-0.033,0.01,-0.095,0.008,0.008,0.053,-0.03,-0.036,0.068,-0.128,-0.011,0.034,-0.022,0.01,-0.012,0.033,-0.016,0.127,0.081,-0.028,-0.07,0.004,-0.067,0.063,-0.056,0.025,-0.014,0.094,-0.012,-0.016,0.065,0.045,0.082,0.001,-0.023,0.014,-0.04,-0.002,0.024,0.001,0.03,0.051,-0.017,-0.071,0.108,-0.028,0.004,-0.048,-0.026,0.041,-0.038,0.05,0.002,-0.027,-0.005,0.019,-0.045,-0.077,-0.16,0.021,0.05,-0.068,0.069,-0.045,0.041,-0.091,-0.024,0.025,-0.052,-0.046,0.066,-0.114,-0.002,0.004,0.063,-0.056,-0.004,0.0,0.071,0.08,0.022,-0.087,-0.02,-0.078,0.002,0.081,-0.038,-0.001,-0.072,0.003,0.014,0.005,0.022,-0.008,0.094,0.011,0.068,-0.013,-0.015,-0.046,0.055,0.013,-0.004,-0.001,-0.015,0.01,-0.014,0.013,-0.036,-0.007,-0.07,-0.061,-0.08,0.018,0.005,-0.001,-0.017,0.027,0.031,-0.023,0.001,0.167,-0.007,-0.031,0.035,0.032,-0.009,0.122,-0.037,-0.032,-0.011,0.018,-0.042,0.051,-0.002,-0.081,0.06,-0.009,0.061,0.065,-0.037,0.076,0.05,0.083,-0.026,0.034,-0.097,-0.016,0.116,0.026,-0.173,0.011,0.051,-0.055,0.013,0.045,-0.017,-0.121,-0.071,-0.025,0.075,-0.031,0.047,0.062,0.05,0.101,-0.036,-0.018,0.051,-0.072,0.004,-0.023,0.019,0.0,-0.024,0.073,0.018,-0.063,0.079,0.012,-0.076,-0.006,-0.009,0.002,-0.025,0.063,-0.011,0.104,0.004,0.025,0.009,-0.071,-0.032,-0.051,-0.096,-0.072,-0.116,-0.06,-0.035,-0.021,0.016,0.045,0.014,0.036,-0.03,0.009,-0.091,-0.045,0.02,-0.105,-0.006,0.046,-0.028,-0.116,-0.078,-0.013,0.019,0.004,-0.05,0.023,0.046,-0.03,-0.021,0.001,0.022,0.02,-0.015,0.059,0.132,0.022,-0.01,-0.003,-0.002,0.021,0.052,-0.023,0.017,0.009],[-0.009,-0.0,-0.035,-0.002,-0.044,-0.063,0.1,0.03,0.052,-0.06,-0.027,0.012,0.03,-0.04,-0.013,0.023,-0.028,0.015,-0.066,-0.032,0.052,0.028,0.063,0.037,-0.005,-0.024,0.006,0.008,0.014,-0.007,-0.042,-0.018,0.012,-0.061,-0.03,0.004,-0.019,0.003,0.065,0.058,0.004,-0.032,0.023,-0.016,0.03,-0.009,-0.022,-0.026,0.057,-0.013,0.002,0.004,-0.059,-0.047,0.084,0.085,0.048,-0.008,0.11,0.041,-0.018,0.071,-0.022,-0.067,0.015,-0.031,0.037,-0.034,0.032,0.121,0.063,0.003,-0.016,-0.007,0.011,0.093,0.056,-0.054,0.028,0.014,-0.008,-0.102,-0.072,-0.042,0.025,0.005,-0.005,-0.083,-0.008,0.018,-0.076,0.07,0.03,0.003,-0.029,0.021,0.016,0.036,-0.101,0.194,-0.01,-0.014,0.07,-0.004,0.001,-0.087,0.001,-0.0,0.02,0.0,-0.061,-0.108,-0.039,0.068,-0.015,0.033,0.008,0.044,0.016,-0.017,-0.034,-0.018,0.023,-0.018,-0.031,-0.068,0.021,0.0,-0.006,0.032,-0.019,0.019,-0.004,0.063,-0.018,-0.057,0.021,-0.054,-0.047,0.035,-0.113,-0.005,0.065,0.033,-0.018,0.055,-0.033,0.01,-0.095,0.008,0.008,0.053,-0.03,-0.036,0.068,-0.128,-0.011,0.034,-0.022,0.01,-0.012,0.033,-0.016,0.127,0.081,-0.028,-0.07,0.004,-0.067,0.063,-0.056,0.025,-0.014,0.094,-0.012,-0.016,0.065,0.045,0.082,0.001,-0.023,0.014,-0.04,-0.002,0.024,0.001,0.03,0.051,-0.017,-0.071,0.108,-0.028,0.004,-0.048,-0.026,0.041,-0.038,0.05,0.002,-0.027,-0.005,0.019,-0.045,-0.077,-0.16,0.021,0.05,-0.068,0.069,-0.045,0.041,-0.091,-0.024,0.025,-0.052,-0.046,0.066,-0.114,-0.002,0.004,0.063,-0.056,-0.004,0.0,0.071,0.08,0.022,-0.087,-0.02,-0.078,0.002,0.081,-0.038,-0.001,-0.072,0.003,0.014,0.005,0.022,-0.008,0.094,0.011,0.068,-0.013,-0.015,-0.046,0.055,0.013,-0.004,-0.001,-0.015,0.01,-0.014,0.013,-0.036,-0.007,-0.07,-0.061,-0.08,0.018,0.005,-0.001,-0.017,0.027,0.031,-0.023,0.001,0.167,-0.007,-0.031,0.035,0.032,-0.009,0.122,-0.037,-0.032,-0.011,0.018,-0.042,0.051,-0.002,-0.081,0.06,-0.009,0.061,0.065,-0.037,0.076,0.05,0.083,-0.026,0.034,-0.097,-0.016,0.116,0.026,-0.173,0.011,0.051,-0.055,0.013,0.045,-0.017,-0.121,-0.071,-0.025,0.075,-0.031,0.047,0.062,0.05,0.101,-0.036,-0.018,0.051,-0.072,0.004,-0.023,0.019,0.0,-0.024,0.073,0.018,-0.063,0.079,0.012,-0.076,-0.006,-0.009,0.002,-0.025,0.063,-0.011,0.104,0.004,0.025,0.009,-0.071,-0.032,-0.051,-0.096,-0.072,-0.116,-0.06,-0.035,-0.021,0.016,0.045,0.014,0.036,-0.03,0.009,-0.091,-0.045,0.02,-0.105,-0.006,0.046,-0.028,-0.116,-0.078,-0.013,0.019,0.004,-0.05,0.023,0.046,-0.03,-0.021,0.001,0.022,0.02,-0.015,0.059,0.132,0.022,-0.01,-0.003,-0.002,0.021,0.052,-0.023,0.017,0.009],[-0.003,-0.038,-0.045,0.046,-0.102,-0.023,0.163,0.003,0.041,-0.042,-0.026,-0.083,0.078,-0.014,-0.057,-0.018,0.034,0.022,-0.025,-0.026,-0.071,0.043,-0.062,0.067,-0.012,0.032,0.025,-0.009,-0.046,-0.135,0.026,0.067,0.036,-0.041,0.038,-0.023,0.021,0.026,0.025,-0.019,-0.01,-0.081,0.029,0.08,-0.012,-0.001,0.067,-0.012,0.044,-0.042,-0.009,-0.039,-0.065,0.078,0.041,0.087,-0.023,0.046,0.056,-0.025,-0.047,0.068,0.01,0.019,0.0,0.036,-0.061,-0.014,-0.012,-0.019,0.033,0.033,0.023,0.072,0.037,0.016,0.064,0.038,0.129,-0.029,-0.119,-0.086,-0.025,-0.006,-0.011,0.028,-0.016,-0.061,-0.08,0.019,0.026,0.045,0.058,0.002,-0.123,-0.047,-0.0,-0.029,-0.029,0.163,0.016,0.011,-0.031,-0.029,0.05,-0.093,0.036,-0.011,-0.008,0.014,0.003,-0.074,-0.017,0.004,0.039,-0.053,-0.025,0.031,0.047,-0.023,-0.009,0.08,-0.031,-0.049,-0.15,0.012,-0.007,0.0,0.02,-0.068,0.069,0.07,-0.043,0.048,-0.092,-0.012,-0.027,0.017,-0.026,0.008,-0.006,0.02,0.132,0.001,-0.086,-0.017,-0.021,0.039,-0.083,0.04,-0.021,0.122,-0.01,-0.053,0.057,-0.07,-0.041,0.062,0.004,-0.033,-0.041,-0.018,0.008,-0.074,0.024,-0.012,-0.052,-0.039,0.011,-0.062,-0.087,-0.064,0.048,0.061,0.074,0.073,-0.044,0.04,-0.002,-0.034,0.037,0.051,-0.001,-0.005,0.016,0.009,-0.001,0.12,0.061,0.094,0.037,-0.052,-0.037,-0.028,0.016,-0.075,-0.006,-0.128,-0.031,-0.026,0.061,0.017,-0.038,0.021,-0.045,-0.055,-0.066,-0.007,-0.03,-0.019,0.044,-0.018,-0.036,0.04,-0.007,-0.102,0.008,0.049,-0.135,-0.006,0.079,-0.002,-0.039,0.0,0.029,-0.087,-0.023,0.024,-0.036,-0.038,0.027,-0.04,0.064,0.028,-0.056,-0.043,0.044,-0.041,0.033,0.004,0.015,0.007,-0.019,0.056,-0.04,0.012,-0.089,0.063,-0.071,0.088,0.027,0.014,0.09,0.006,0.013,0.017,-0.016,-0.001,-0.082,0.079,0.053,0.0,-0.03,-0.044,-0.061,0.033,-0.03,0.081,0.05,0.013,0.036,0.029,-0.01,0.048,-0.106,-0.021,-0.049,0.043,-0.047,-0.043,-0.037,0.027,0.098,-0.017,0.04,0.024,0.049,0.036,-0.005,-0.005,-0.01,-0.002,-0.05,-0.049,0.105,0.077,-0.073,0.042,0.028,0.074,-0.001,0.002,-0.05,0.087,-0.02,0.029,-0.018,0.066,-0.027,-0.015,0.039,0.031,0.001,-0.055,-0.018,0.021,-0.031,-0.061,0.029,0.0,0.014,0.031,0.003,0.033,0.071,-0.007,0.077,0.067,0.014,0.004,0.055,0.038,-0.009,0.091,0.073,0.028,-0.006,-0.04,-0.008,0.027,0.006,0.0,0.016,-0.056,-0.052,-0.055,-0.032,0.024,0.071,0.023,0.055,0.107,-0.057,-0.124,0.001,0.004,-0.013,0.077,0.02,-0.007,-0.029,-0.037,0.006,-0.052,-0.046,-0.113,0.037,0.002,-0.02,-0.036,-0.059,0.1,0.042,0.007,0.068,0.047,-0.036,-0.011,-0.078,0.084,0.033,-0.053,0.011,-0.054],[-0.003,-0.038,-0.045,0.046,-0.102,-0.023,0.163,0.003,0.041,-0.042,-0.026,-0.083,0.078,-0.014,-0.057,-0.018,0.034,0.022,-0.025,-0.026,-0.071,0.043,-0.062,0.067,-0.012,0.032,0.025,-0.009,-0.046,-0.135,0.026,0.067,0.036,-0.041,0.038,-0.023,0.021,0.026,0.025,-0.019,-0.01,-0.081,0.029,0.08,-0.012,-0.001,0.067,-0.012,0.044,-0.042,-0.009,-0.039,-0.065,0.078,0.041,0.087,-0.023,0.046,0.056,-0.025,-0.047,0.068,0.01,0.019,0.0,0.036,-0.061,-0.014,-0.012,-0.019,0.033,0.033,0.023,0.072,0.037,0.016,0.064,0.038,0.129,-0.029,-0.119,-0.086,-0.025,-0.006,-0.011,0.028,-0.016,-0.061,-0.08,0.019,0.026,0.045,0.058,0.002,-0.123,-0.047,-0.0,-0.029,-0.029,0.163,0.016,0.011,-0.031,-0.029,0.05,-0.093,0.036,-0.011,-0.008,0.014,0.003,-0.074,-0.017,0.004,0.039,-0.053,-0.025,0.031,0.047,-0.023,-0.009,0.08,-0.031,-0.049,-0.15,0.012,-0.007,0.0,0.02,-0.068,0.069,0.07,-0.043,0.048,-0.092,-0.012,-0.027,0.017,-0.026,0.008,-0.006,0.02,0.132,0.001,-0.086,-0.017,-0.021,0.039,-0.083,0.04,-0.021,0.122,-0.01,-0.053,0.057,-0.07,-0.041,0.062,0.004,-0.033,-0.041,-0.018,0.008,-0.074,0.024,-0.012,-0.052,-0.039,0.011,-0.062,-0.087,-0.064,0.048,0.061,0.074,0.073,-0.044,0.04,-0.002,-0.034,0.037,0.051,-0.001,-0.005,0.016,0.009,-0.001,0.12,0.061,0.094,0.037,-0.052,-0.037,-0.028,0.016,-0.075,-0.006,-0.128,-0.031,-0.026,0.061,0.017,-0.038,0.021,-0.045,-0.055,-0.066,-0.007,-0.03,-0.019,0.044,-0.018,-0.036,0.04,-0.007,-0.102,0.008,0.049,-0.135,-0.006,0.079,-0.002,-0.039,0.0,0.029,-0.087,-0.023,0.024,-0.036,-0.038,0.027,-0.04,0.064,0.028,-0.056,-0.043,0.044,-0.041,0.033,0.004,0.015,0.007,-0.019,0.056,-0.04,0.012,-0.089,0.063,-0.071,0.088,0.027,0.014,0.09,0.006,0.013,0.017,-0.016,-0.001,-0.082,0.079,0.053,0.0,-0.03,-0.044,-0.061,0.033,-0.03,0.081,0.05,0.013,0.036,0.029,-0.01,0.048,-0.106,-0.021,-0.049,0.043,-0.047,-0.043,-0.037,0.027,0.098,-0.017,0.04,0.024,0.049,0.036,-0.005,-0.005,-0.01,-0.002,-0.05,-0.049,0.105,0.077,-0.073,0.042,0.028,0.074,-0.001,0.002,-0.05,0.087,-0.02,0.029,-0.018,0.066,-0.027,-0.015,0.039,0.031,0.001,-0.055,-0.018,0.021,-0.031,-0.061,0.029,0.0,0.014,0.031,0.003,0.033,0.071,-0.007,0.077,0.067,0.014,0.004,0.055,0.038,-0.009,0.091,0.073,0.028,-0.006,-0.04,-0.008,0.027,0.006,0.0,0.016,-0.056,-0.052,-0.055,-0.032,0.024,0.071,0.023,0.055,0.107,-0.057,-0.124,0.001,0.004,-0.013,0.077,0.02,-0.007,-0.029,-0.037,0.006,-0.052,-0.046,-0.113,0.037,0.002,-0.02,-0.036,-0.059,0.1,0.042,0.007,0.068,0.047,-0.036,-0.011,-0.078,0.084,0.033,-0.053,0.011,-0.054],[-0.003,-0.038,-0.045,0.046,-0.102,-0.023,0.163,0.003,0.041,-0.042,-0.026,-0.083,0.078,-0.014,-0.057,-0.018,0.034,0.022,-0.025,-0.026,-0.071,0.043,-0.062,0.067,-0.012,0.032,0.025,-0.009,-0.046,-0.135,0.026,0.067,0.036,-0.041,0.038,-0.023,0.021,0.026,0.025,-0.019,-0.01,-0.081,0.029,0.08,-0.012,-0.001,0.067,-0.012,0.044,-0.042,-0.009,-0.039,-0.065,0.078,0.041,0.087,-0.023,0.046,0.056,-0.025,-0.047,0.068,0.01,0.019,0.0,0.036,-0.061,-0.014,-0.012,-0.019,0.033,0.033,0.023,0.072,0.037,0.016,0.064,0.038,0.129,-0.029,-0.119,-0.086,-0.025,-0.006,-0.011,0.028,-0.016,-0.061,-0.08,0.019,0.026,0.045,0.058,0.002,-0.123,-0.047,-0.0,-0.029,-0.029,0.163,0.016,0.011,-0.031,-0.029,0.05,-0.093,0.036,-0.011,-0.008,0.014,0.003,-0.074,-0.017,0.004,0.039,-0.053,-0.025,0.031,0.047,-0.023,-0.009,0.08,-0.031,-0.049,-0.15,0.012,-0.007,0.0,0.02,-0.068,0.069,0.07,-0.043,0.048,-0.092,-0.012,-0.027,0.017,-0.026,0.008,-0.006,0.02,0.132,0.001,-0.086,-0.017,-0.021,0.039,-0.083,0.04,-0.021,0.122,-0.01,-0.053,0.057,-0.07,-0.041,0.062,0.004,-0.033,-0.041,-0.018,0.008,-0.074,0.024,-0.012,-0.052,-0.039,0.011,-0.062,-0.087,-0.064,0.048,0.061,0.074,0.073,-0.044,0.04,-0.002,-0.034,0.037,0.051,-0.001,-0.005,0.016,0.009,-0.001,0.12,0.061,0.094,0.037,-0.052,-0.037,-0.028,0.016,-0.075,-0.006,-0.128,-0.031,-0.026,0.061,0.017,-0.038,0.021,-0.045,-0.055,-0.066,-0.007,-0.03,-0.019,0.044,-0.018,-0.036,0.04,-0.007,-0.102,0.008,0.049,-0.135,-0.006,0.079,-0.002,-0.039,0.0,0.029,-0.087,-0.023,0.024,-0.036,-0.038,0.027,-0.04,0.064,0.028,-0.056,-0.043,0.044,-0.041,0.033,0.004,0.015,0.007,-0.019,0.056,-0.04,0.012,-0.089,0.063,-0.071,0.088,0.027,0.014,0.09,0.006,0.013,0.017,-0.016,-0.001,-0.082,0.079,0.053,0.0,-0.03,-0.044,-0.061,0.033,-0.03,0.081,0.05,0.013,0.036,0.029,-0.01,0.048,-0.106,-0.021,-0.049,0.043,-0.047,-0.043,-0.037,0.027,0.098,-0.017,0.04,0.024,0.049,0.036,-0.005,-0.005,-0.01,-0.002,-0.05,-0.049,0.105,0.077,-0.073,0.042,0.028,0.074,-0.001,0.002,-0.05,0.087,-0.02,0.029,-0.018,0.066,-0.027,-0.015,0.039,0.031,0.001,-0.055,-0.018,0.021,-0.031,-0.061,0.029,0.0,0.014,0.031,0.003,0.033,0.071,-0.007,0.077,0.067,0.014,0.004,0.055,0.038,-0.009,0.091,0.073,0.028,-0.006,-0.04,-0.008,0.027,0.006,0.0,0.016,-0.056,-0.052,-0.055,-0.032,0.024,0.071,0.023,0.055,0.107,-0.057,-0.124,0.001,0.004,-0.013,0.077,0.02,-0.007,-0.029,-0.037,0.006,-0.052,-0.046,-0.113,0.037,0.002,-0.02,-0.036,-0.059,0.1,0.042,0.007,0.068,0.047,-0.036,-0.011,-0.078,0.084,0.033,-0.053,0.011,-0.054],[-0.009,-0.0,-0.035,-0.002,-0.044,-0.063,0.1,0.03,0.052,-0.06,-0.027,0.012,0.03,-0.04,-0.013,0.023,-0.028,0.015,-0.066,-0.032,0.052,0.028,0.063,0.037,-0.005,-0.024,0.006,0.008,0.014,-0.007,-0.042,-0.018,0.012,-0.061,-0.03,0.004,-0.019,0.003,0.065,0.058,0.004,-0.032,0.023,-0.016,0.03,-0.009,-0.022,-0.026,0.057,-0.013,0.002,0.004,-0.059,-0.047,0.084,0.085,0.048,-0.008,0.11,0.041,-0.018,0.071,-0.022,-0.067,0.015,-0.031,0.037,-0.034,0.032,0.121,0.063,0.003,-0.016,-0.007,0.011,0.093,0.056,-0.054,0.028,0.014,-0.008,-0.102,-0.072,-0.042,0.025,0.005,-0.005,-0.083,-0.008,0.018,-0.076,0.07,0.03,0.003,-0.029,0.021,0.016,0.036,-0.101,0.194,-0.01,-0.014,0.07,-0.004,0.001,-0.087,0.001,-0.0,0.02,0.0,-0.061,-0.108,-0.039,0.068,-0.015,0.033,0.008,0.044,0.016,-0.017,-0.034,-0.018,0.023,-0.018,-0.031,-0.068,0.021,0.0,-0.006,0.032,-0.019,0.019,-0.004,0.063,-0.018,-0.057,0.021,-0.054,-0.047,0.035,-0.113,-0.005,0.065,0.033,-0.018,0.055,-0.033,0.01,-0.095,0.008,0.008,0.053,-0.03,-0.036,0.068,-0.128,-0.011,0.034,-0.022,0.01,-0.012,0.033,-0.016,0.127,0.081,-0.028,-0.07,0.004,-0.067,0.063,-0.056,0.025,-0.014,0.094,-0.012,-0.016,0.065,0.045,0.082,0.001,-0.023,0.014,-0.04,-0.002,0.024,0.001,0.03,0.051,-0.017,-0.071,0.108,-0.028,0.004,-0.048,-0.026,0.041,-0.038,0.05,0.002,-0.027,-0.005,0.019,-0.045,-0.077,-0.16,0.021,0.05,-0.068,0.069,-0.045,0.041,-0.091,-0.024,0.025,-0.052,-0.046,0.066,-0.114,-0.002,0.004,0.063,-0.056,-0.004,0.0,0.071,0.08,0.022,-0.087,-0.02,-0.078,0.002,0.081,-0.038,-0.001,-0.072,0.003,0.014,0.005,0.022,-0.008,0.094,0.011,0.068,-0.013,-0.015,-0.046,0.055,0.013,-0.004,-0.001,-0.015,0.01,-0.014,0.013,-0.036,-0.007,-0.07,-0.061,-0.08,0.018,0.005,-0.001,-0.017,0.027,0.031,-0.023,0.001,0.167,-0.007,-0.031,0.035,0.032,-0.009,0.122,-0.037,-0.032,-0.011,0.018,-0.042,0.051,-0.002,-0.081,0.06,-0.009,0.061,0.065,-0.037,0.076,0.05,0.083,-0.026,0.034,-0.097,-0.016,0.116,0.026,-0.173,0.011,0.051,-0.055,0.013,0.045,-0.017,-0.121,-0.071,-0.025,0.075,-0.031,0.047,0.062,0.05,0.101,-0.036,-0.018,0.051,-0.072,0.004,-0.023,0.019,0.0,-0.024,0.073,0.018,-0.063,0.079,0.012,-0.076,-0.006,-0.009,0.002,-0.025,0.063,-0.011,0.104,0.004,0.025,0.009,-0.071,-0.032,-0.051,-0.096,-0.072,-0.116,-0.06,-0.035,-0.021,0.016,0.045,0.014,0.036,-0.03,0.009,-0.091,-0.045,0.02,-0.105,-0.006,0.046,-0.028,-0.116,-0.078,-0.013,0.019,0.004,-0.05,0.023,0.046,-0.03,-0.021,0.001,0.022,0.02,-0.015,0.059,0.132,0.022,-0.01,-0.003,-0.002,0.021,0.052,-0.023,0.017,0.009],[-0.009,-0.0,-0.035,-0.002,-0.044,-0.063,0.1,0.03,0.052,-0.06,-0.027,0.012,0.03,-0.04,-0.013,0.023,-0.028,0.015,-0.066,-0.032,0.052,0.028,0.063,0.037,-0.005,-0.024,0.006,0.008,0.014,-0.007,-0.042,-0.018,0.012,-0.061,-0.03,0.004,-0.019,0.003,0.065,0.058,0.004,-0.032,0.023,-0.016,0.03,-0.009,-0.022,-0.026,0.057,-0.013,0.002,0.004,-0.059,-0.047,0.084,0.085,0.048,-0.008,0.11,0.041,-0.018,0.071,-0.022,-0.067,0.015,-0.031,0.037,-0.034,0.032,0.121,0.063,0.003,-0.016,-0.007,0.011,0.093,0.056,-0.054,0.028,0.014,-0.008,-0.102,-0.072,-0.042,0.025,0.005,-0.005,-0.083,-0.008,0.018,-0.076,0.07,0.03,0.003,-0.029,0.021,0.016,0.036,-0.101,0.194,-0.01,-0.014,0.07,-0.004,0.001,-0.087,0.001,-0.0,0.02,0.0,-0.061,-0.108,-0.039,0.068,-0.015,0.033,0.008,0.044,0.016,-0.017,-0.034,-0.018,0.023,-0.018,-0.031,-0.068,0.021,0.0,-0.006,0.032,-0.019,0.019,-0.004,0.063,-0.018,-0.057,0.021,-0.054,-0.047,0.035,-0.113,-0.005,0.065,0.033,-0.018,0.055,-0.033,0.01,-0.095,0.008,0.008,0.053,-0.03,-0.036,0.068,-0.128,-0.011,0.034,-0.022,0.01,-0.012,0.033,-0.016,0.127,0.081,-0.028,-0.07,0.004,-0.067,0.063,-0.056,0.025,-0.014,0.094,-0.012,-0.016,0.065,0.045,0.082,0.001,-0.023,0.014,-0.04,-0.002,0.024,0.001,0.03,0.051,-0.017,-0.071,0.108,-0.028,0.004,-0.048,-0.026,0.041,-0.038,0.05,0.002,-0.027,-0.005,0.019,-0.045,-0.077,-0.16,0.021,0.05,-0.068,0.069,-0.045,0.041,-0.091,-0.024,0.025,-0.052,-0.046,0.066,-0.114,-0.002,0.004,0.063,-0.056,-0.004,0.0,0.071,0.08,0.022,-0.087,-0.02,-0.078,0.002,0.081,-0.038,-0.001,-0.072,0.003,0.014,0.005,0.022,-0.008,0.094,0.011,0.068,-0.013,-0.015,-0.046,0.055,0.013,-0.004,-0.001,-0.015,0.01,-0.014,0.013,-0.036,-0.007,-0.07,-0.061,-0.08,0.018,0.005,-0.001,-0.017,0.027,0.031,-0.023,0.001,0.167,-0.007,-0.031,0.035,0.032,-0.009,0.122,-0.037,-0.032,-0.011,0.018,-0.042,0.051,-0.002,-0.081,0.06,-0.009,0.061,0.065,-0.037,0.076,0.05,0.083,-0.026,0.034,-0.097,-0.016,0.116,0.026,-0.173,0.011,0.051,-0.055,0.013,0.045,-0.017,-0.121,-0.071,-0.025,0.075,-0.031,0.047,0.062,0.05,0.101,-0.036,-0.018,0.051,-0.072,0.004,-0.023,0.019,0.0,-0.024,0.073,0.018,-0.063,0.079,0.012,-0.076,-0.006,-0.009,0.002,-0.025,0.063,-0.011,0.104,0.004,0.025,0.009,-0.071,-0.032,-0.051,-0.096,-0.072,-0.116,-0.06,-0.035,-0.021,0.016,0.045,0.014,0.036,-0.03,0.009,-0.091,-0.045,0.02,-0.105,-0.006,0.046,-0.028,-0.116,-0.078,-0.013,0.019,0.004,-0.05,0.023,0.046,-0.03,-0.021,0.001,0.022,0.02,-0.015,0.059,0.132,0.022,-0.01,-0.003,-0.002,0.021,0.052,-0.023,0.017,0.009],[-0.009,-0.0,-0.035,-0.002,-0.044,-0.063,0.1,0.03,0.052,-0.06,-0.027,0.012,0.03,-0.04,-0.013,0.023,-0.028,0.015,-0.066,-0.032,0.052,0.028,0.063,0.037,-0.005,-0.024,0.006,0.008,0.014,-0.007,-0.042,-0.018,0.012,-0.061,-0.03,0.004,-0.019,0.003,0.065,0.058,0.004,-0.032,0.023,-0.016,0.03,-0.009,-0.022,-0.026,0.057,-0.013,0.002,0.004,-0.059,-0.047,0.084,0.085,0.048,-0.008,0.11,0.041,-0.018,0.071,-0.022,-0.067,0.015,-0.031,0.037,-0.034,0.032,0.121,0.063,0.003,-0.016,-0.007,0.011,0.093,0.056,-0.054,0.028,0.014,-0.008,-0.102,-0.072,-0.042,0.025,0.005,-0.005,-0.083,-0.008,0.018,-0.076,0.07,0.03,0.003,-0.029,0.021,0.016,0.036,-0.101,0.194,-0.01,-0.014,0.07,-0.004,0.001,-0.087,0.001,-0.0,0.02,0.0,-0.061,-0.108,-0.039,0.068,-0.015,0.033,0.008,0.044,0.016,-0.017,-0.034,-0.018,0.023,-0.018,-0.031,-0.068,0.021,0.0,-0.006,0.032,-0.019,0.019,-0.004,0.063,-0.018,-0.057,0.021,-0.054,-0.047,0.035,-0.113,-0.005,0.065,0.033,-0.018,0.055,-0.033,0.01,-0.095,0.008,0.008,0.053,-0.03,-0.036,0.068,-0.128,-0.011,0.034,-0.022,0.01,-0.012,0.033,-0.016,0.127,0.081,-0.028,-0.07,0.004,-0.067,0.063,-0.056,0.025,-0.014,0.094,-0.012,-0.016,0.065,0.045,0.082,0.001,-0.023,0.014,-0.04,-0.002,0.024,0.001,0.03,0.051,-0.017,-0.071,0.108,-0.028,0.004,-0.048,-0.026,0.041,-0.038,0.05,0.002,-0.027,-0.005,0.019,-0.045,-0.077,-0.16,0.021,0.05,-0.068,0.069,-0.045,0.041,-0.091,-0.024,0.025,-0.052,-0.046,0.066,-0.114,-0.002,0.004,0.063,-0.056,-0.004,0.0,0.071,0.08,0.022,-0.087,-0.02,-0.078,0.002,0.081,-0.038,-0.001,-0.072,0.003,0.014,0.005,0.022,-0.008,0.094,0.011,0.068,-0.013,-0.015,-0.046,0.055,0.013,-0.004,-0.001,-0.015,0.01,-0.014,0.013,-0.036,-0.007,-0.07,-0.061,-0.08,0.018,0.005,-0.001,-0.017,0.027,0.031,-0.023,0.001,0.167,-0.007,-0.031,0.035,0.032,-0.009,0.122,-0.037,-0.032,-0.011,0.018,-0.042,0.051,-0.002,-0.081,0.06,-0.009,0.061,0.065,-0.037,0.076,0.05,0.083,-0.026,0.034,-0.097,-0.016,0.116,0.026,-0.173,0.011,0.051,-0.055,0.013,0.045,-0.017,-0.121,-0.071,-0.025,0.075,-0.031,0.047,0.062,0.05,0.101,-0.036,-0.018,0.051,-0.072,0.004,-0.023,0.019,0.0,-0.024,0.073,0.018,-0.063,0.079,0.012,-0.076,-0.006,-0.009,0.002,-0.025,0.063,-0.011,0.104,0.004,0.025,0.009,-0.071,-0.032,-0.051,-0.096,-0.072,-0.116,-0.06,-0.035,-0.021,0.016,0.045,0.014,0.036,-0.03,0.009,-0.091,-0.045,0.02,-0.105,-0.006,0.046,-0.028,-0.116,-0.078,-0.013,0.019,0.004,-0.05,0.023,0.046,-0.03,-0.021,0.001,0.022,0.02,-0.015,0.059,0.132,0.022,-0.01,-0.003,-0.002,0.021,0.052,-0.023,0.017,0.009]]
@@ -1,97 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe Ollama::Documents::MemoryCache do
4
- let :prefix do
5
- 'test-'
6
- end
7
-
8
- let :cache do
9
- described_class.new prefix:
10
- end
11
-
12
- it 'can be instantiated' do
13
- expect(cache).to be_a described_class
14
- end
15
-
16
- it 'can get/set a key' do
17
- key, value = 'foo', { test: true }
18
- expect {
19
- cache[key] = value
20
- }.to change {
21
- cache[key]
22
- }.from(nil).to(value)
23
- end
24
-
25
- it 'can determine if key exists' do
26
- key, value = 'foo', { test: true }
27
- expect {
28
- cache[key] = value
29
- }.to change {
30
- cache.key?(key)
31
- }.from(false).to(true)
32
- end
33
-
34
- it 'can set key with different prefixes' do
35
- key, value = 'foo', { test: true }
36
- expect {
37
- cache[key] = value
38
- }.to change {
39
- cache.size
40
- }.from(0).to(1)
41
- cache2 = cache.dup
42
- cache2.prefix = 'test2-'
43
- expect {
44
- cache2[key] = value
45
- }.to change {
46
- cache2.size
47
- }.from(0).to(1)
48
- expect(cache.size).to eq 1
49
- s = 0
50
- cache.full_each { s += 1 }
51
- expect(s).to eq 2
52
- end
53
-
54
- it 'can delete' do
55
- key, value = 'foo', { test: true }
56
- expect(cache.delete(key)).to be_falsy
57
- cache[key] = value
58
- expect {
59
- expect(cache.delete(key)).to be_truthy
60
- }.to change {
61
- cache.key?(key)
62
- }.from(true).to(false)
63
- end
64
-
65
- it 'can iterate over keys, values' do
66
- key, value = 'foo', { test: true }
67
- cache[key] = value
68
- cache.each do |k, v|
69
- expect(k).to eq prefix + key
70
- expect(v).to eq value
71
- end
72
- end
73
-
74
- it 'returns size' do
75
- key, value = 'foo', { test: true }
76
- expect {
77
- cache[key] = value
78
- }.to change {
79
- cache.size
80
- }.from(0).to(1)
81
- end
82
-
83
- it 'can clear' do
84
- key, value = 'foo', { test: true }
85
- cache[key] = value
86
- expect {
87
- expect(cache.clear).to eq cache
88
- }.to change {
89
- cache.size
90
- }.from(1).to(0)
91
- end
92
-
93
- it 'can iterate over keys under a prefix' do
94
- cache['foo'] = 'bar'
95
- expect(cache.to_a).to eq [ %W[ #{prefix}foo bar ] ]
96
- end
97
- end
@@ -1,118 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe Ollama::Documents::RedisBackedMemoryCache do
4
- let :prefix do
5
- 'test-'
6
- end
7
-
8
- let :cache do
9
- described_class.new prefix: 'test-', url: 'something'
10
- end
11
-
12
- it 'raises ArgumentError if url is missing' do
13
- expect {
14
- described_class.new prefix:, url: nil
15
- }.to raise_error ArgumentError
16
- end
17
-
18
- context 'test redis interactions' do
19
- let :data do
20
- cache.instance_eval { @data }
21
- end
22
-
23
- let :redis_cache do
24
- cache.instance_eval { @redis_cache }
25
- end
26
-
27
- let :redis do
28
- double('Redis')
29
- end
30
-
31
- before do
32
- allow_any_instance_of(Ollama::Documents::RedisCache).to\
33
- receive(:redis).and_return(redis)
34
- allow(redis).to receive(:scan_each)
35
- end
36
-
37
- it 'can be instantiated and initialized' do
38
- expect(cache).to be_a described_class
39
- end
40
-
41
- it 'defaults to nil object_class' do
42
- expect(cache.object_class).to be_nil
43
- end
44
-
45
- it 'can be configured with object_class' do
46
- object_class = Class.new(JSON::GenericObject)
47
- cache = described_class.new(prefix: 'test-', url: 'something', object_class:)
48
- expect(cache.object_class).to eq object_class
49
- end
50
-
51
- it 'has Redis client' do
52
- expect(cache.redis).to eq redis
53
- end
54
-
55
- it 'can get a key' do
56
- key = 'foo'
57
- expect(data).to receive(:[]).with('test-' + key).and_return 666
58
- expect(cache[key]).to eq 666
59
- end
60
-
61
- it 'can set a value for a key' do
62
- key, value = 'foo', { test: true }
63
- expect(data).to receive(:[]=).with('test-' + key, { test: true }).and_call_original
64
- expect(redis).to receive(:set).with('test-' + key, JSON(value))
65
- cache[key] = value
66
- end
67
-
68
- it 'can determine if key exists' do
69
- key = 'foo'
70
- expect(data).to receive(:key?).with('test-' + key).and_return(false, true)
71
- expect(cache.key?('foo')).to eq false
72
- expect(cache.key?('foo')).to eq true
73
- end
74
-
75
- it 'can delete' do
76
- key = 'foo'
77
- expect(data).to receive(:delete).with('test-' + key)
78
- expect(redis).to receive(:del).with('test-' + key)
79
- cache.delete(key)
80
- end
81
-
82
- it 'can iterate over keys, values' do
83
- key, value = 'foo', { 'test' => true }
84
- expect(redis).to receive(:set).with('test-' + key, JSON(value))
85
- cache[key] = value
86
- cache.each do |k, v|
87
- expect(k).to eq prefix + key
88
- expect(v).to eq value
89
- end
90
- end
91
-
92
- it 'returns size' do
93
- expect(cache).to receive(:count).and_return 3
94
- expect(cache.size).to eq 3
95
- end
96
-
97
- it 'can clear' do
98
- expect(redis).to receive(:scan_each).with(match: 'test-*').and_yield(
99
- 'test-foo'
100
- )
101
- expect(redis).to receive(:del).with('test-foo')
102
- expect(cache.clear).to eq cache
103
- end
104
-
105
- it 'can iterate over keys under a prefix' do
106
- data['test-foo'] = 'bar'
107
- expect(cache.to_a).to eq [ %w[ test-foo bar ] ]
108
- end
109
-
110
- it 'can compute prefix with pre' do
111
- expect(cache.pre('foo')).to eq 'test-foo'
112
- end
113
-
114
- it 'can remove prefix with unpre' do
115
- expect(cache.unpre('test-foo')).to eq 'foo'
116
- end
117
- end
118
- end