red_amber 0.4.1 → 0.5.0
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 +4 -4
- data/.rubocop.yml +11 -5
- data/CHANGELOG.md +93 -1
- data/Gemfile +5 -6
- data/README.ja.md +252 -0
- data/README.md +30 -23
- data/benchmark/basic.yml +1 -1
- data/benchmark/group.yml +12 -5
- data/doc/CODE_OF_CONDUCT.md +1 -1
- data/docker/.env +4 -0
- data/docker/Dockerfile +66 -0
- data/docker/Gemfile +26 -0
- data/docker/Gemfile.lock +118 -0
- data/docker/docker-compose.yml +21 -0
- data/docker/example +86 -0
- data/docker/notebook/examples_of_red_amber.ipynb +8562 -0
- data/docker/notebook/red-amber.ipynb +188 -0
- data/docker/readme.md +118 -0
- data/lib/red_amber/data_frame.rb +78 -4
- data/lib/red_amber/data_frame_combinable.rb +147 -119
- data/lib/red_amber/data_frame_displayable.rb +6 -5
- data/lib/red_amber/data_frame_selectable.rb +49 -0
- data/lib/red_amber/group.rb +190 -89
- data/lib/red_amber/helper.rb +26 -0
- data/lib/red_amber/subframes.rb +166 -66
- data/lib/red_amber/vector.rb +43 -24
- data/lib/red_amber/vector_aggregation.rb +26 -0
- data/lib/red_amber/vector_binary_element_wise.rb +54 -25
- data/lib/red_amber/vector_selectable.rb +74 -23
- data/lib/red_amber/vector_string_function.rb +211 -0
- data/lib/red_amber/vector_unary_element_wise.rb +4 -0
- data/lib/red_amber/vector_updatable.rb +28 -0
- data/lib/red_amber/version.rb +1 -1
- data/lib/red_amber.rb +2 -1
- data/red_amber.gemspec +4 -4
- metadata +20 -9
data/lib/red_amber/subframes.rb
CHANGED
@@ -10,6 +10,45 @@ module RedAmber
|
|
10
10
|
using RefineArray
|
11
11
|
using RefineArrayLike
|
12
12
|
|
13
|
+
# Entity to select sub-dataframes
|
14
|
+
class Selectors
|
15
|
+
attr_reader :selectors, :size, :sizes
|
16
|
+
|
17
|
+
def initialize(selectors)
|
18
|
+
@selectors = selectors
|
19
|
+
@size = selectors.size
|
20
|
+
@sizes = []
|
21
|
+
end
|
22
|
+
|
23
|
+
# Generic iterator method
|
24
|
+
def each
|
25
|
+
@selectors.each
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Boolean selectors of sub-dataframes
|
30
|
+
class Filters < Selectors
|
31
|
+
# Return sizes of filter
|
32
|
+
# @return [Array<Integer>]
|
33
|
+
# sizes of each sub dataframes.
|
34
|
+
# Counts true for each filter.
|
35
|
+
def sizes
|
36
|
+
@sizes = @selectors.map { |s| s.to_a.count { _1 } } # rubocop:disable Performance/Size
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Index selectors of sub-dataframes
|
41
|
+
class Indices < Selectors
|
42
|
+
# Return sizes of selector indices.
|
43
|
+
# @return [Array<Integer>]
|
44
|
+
# sizes of each sub dataframes.
|
45
|
+
def sizes
|
46
|
+
@sizes = @selectors.map(&:size)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private_constant :Selectors, :Filters, :Indices
|
51
|
+
|
13
52
|
class << self
|
14
53
|
# Create SubFrames from a Group.
|
15
54
|
#
|
@@ -61,7 +100,7 @@ module RedAmber
|
|
61
100
|
# @since 0.4.0
|
62
101
|
#
|
63
102
|
def by_group(group)
|
64
|
-
SubFrames.
|
103
|
+
SubFrames.by_filters(group.dataframe, group.filters)
|
65
104
|
end
|
66
105
|
|
67
106
|
# Create a new SubFrames object from a DataFrame and an array of indices.
|
@@ -79,13 +118,8 @@ module RedAmber
|
|
79
118
|
def by_indices(dataframe, subset_indices)
|
80
119
|
instance = allocate
|
81
120
|
instance.instance_variable_set(:@baseframe, dataframe)
|
82
|
-
|
83
|
-
|
84
|
-
subset_indices.each do |i|
|
85
|
-
y.yield DataFrame.new_dataframe_with_schema(dataframe, dataframe.take(i))
|
86
|
-
end
|
87
|
-
end
|
88
|
-
instance.instance_variable_set(:@enum, enum)
|
121
|
+
instance.instance_variable_set(:@selectors, Indices.new(subset_indices))
|
122
|
+
instance.instance_variable_set(:@frames, [])
|
89
123
|
instance
|
90
124
|
end
|
91
125
|
|
@@ -105,13 +139,8 @@ module RedAmber
|
|
105
139
|
def by_filters(dataframe, subset_filters)
|
106
140
|
instance = allocate
|
107
141
|
instance.instance_variable_set(:@baseframe, dataframe)
|
108
|
-
|
109
|
-
|
110
|
-
subset_filters.each do |i|
|
111
|
-
y.yield DataFrame.new_dataframe_with_schema(dataframe, dataframe.filter(i))
|
112
|
-
end
|
113
|
-
end
|
114
|
-
instance.instance_variable_set(:@enum, enum)
|
142
|
+
instance.instance_variable_set(:@selectors, Filters.new(subset_filters))
|
143
|
+
instance.instance_variable_set(:@frames, [])
|
115
144
|
instance
|
116
145
|
end
|
117
146
|
|
@@ -130,18 +159,13 @@ module RedAmber
|
|
130
159
|
case Array(dataframes)
|
131
160
|
when [] || [nil]
|
132
161
|
instance.instance_variable_set(:@baseframe, DataFrame.new)
|
162
|
+
instance.instance_variable_set(:@selectors, [])
|
133
163
|
instance.instance_variable_set(:@frames, [])
|
134
|
-
enum = [].each
|
135
164
|
else
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
y.yield i
|
140
|
-
end
|
141
|
-
end
|
142
|
-
instance.instance_variable_set(:@baseframe, enum.lazy)
|
165
|
+
instance.instance_variable_set(:@baseframe, nil)
|
166
|
+
instance.instance_variable_set(:@selectors, nil)
|
167
|
+
instance.instance_variable_set(:@frames, dataframes)
|
143
168
|
end
|
144
|
-
instance.instance_variable_set(:@enum, enum)
|
145
169
|
instance
|
146
170
|
end
|
147
171
|
|
@@ -261,40 +285,34 @@ module RedAmber
|
|
261
285
|
#
|
262
286
|
# @since 0.4.0
|
263
287
|
#
|
264
|
-
def initialize(dataframe,
|
288
|
+
def initialize(dataframe, selectors = nil, &block)
|
265
289
|
unless dataframe.is_a?(DataFrame)
|
266
290
|
raise SubFramesArgumentError, "not a DataFrame: #{dataframe}"
|
267
291
|
end
|
268
292
|
|
269
293
|
if block
|
270
|
-
unless
|
294
|
+
unless selectors.nil?
|
271
295
|
raise SubFramesArgumentError, 'Must not specify both arguments and block.'
|
272
296
|
end
|
273
297
|
|
274
|
-
|
298
|
+
selectors = yield(dataframe)
|
275
299
|
end
|
276
300
|
|
277
|
-
if dataframe.empty? ||
|
301
|
+
if dataframe.empty? || selectors.nil? || selectors.size.zero? # rubocop:disable Style/ZeroLengthPredicate
|
278
302
|
@baseframe = DataFrame.new
|
279
|
-
@
|
280
|
-
@enum = @frames.each
|
303
|
+
@selectors = Selectors.new([])
|
281
304
|
else
|
282
|
-
@baseframe =
|
283
|
-
@
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
dataframe.filter(i)
|
291
|
-
else
|
292
|
-
raise SubFramesArgumentError, "illegal type: #{i}"
|
293
|
-
end
|
294
|
-
yielder.yield DataFrame.new_dataframe_with_schema(dataframe, df)
|
295
|
-
end
|
305
|
+
@baseframe = dataframe
|
306
|
+
@selectors =
|
307
|
+
if selectors.first.boolean?
|
308
|
+
Filters.new(selectors)
|
309
|
+
elsif selectors.first.numeric?
|
310
|
+
Indices.new(selectors)
|
311
|
+
else
|
312
|
+
raise SubFramesArgumentError, "illegal type: #{selectors}"
|
296
313
|
end
|
297
314
|
end
|
315
|
+
@frames = []
|
298
316
|
end
|
299
317
|
|
300
318
|
# Return concatenated SubFrames as a DataFrame.
|
@@ -305,11 +323,7 @@ module RedAmber
|
|
305
323
|
# @since 0.4.0
|
306
324
|
#
|
307
325
|
def baseframe
|
308
|
-
|
309
|
-
@baseframe = reduce(&:concatenate)
|
310
|
-
else
|
311
|
-
@baseframe
|
312
|
-
end
|
326
|
+
@baseframe ||= reduce(&:concatenate)
|
313
327
|
end
|
314
328
|
alias_method :concatenate, :baseframe
|
315
329
|
alias_method :concat, :baseframe
|
@@ -384,7 +398,19 @@ module RedAmber
|
|
384
398
|
def each(&block)
|
385
399
|
return enum_for(__method__) { size } unless block
|
386
400
|
|
387
|
-
|
401
|
+
if @selectors
|
402
|
+
@selectors.each.with_index do |selector, i|
|
403
|
+
if i < @frames.size
|
404
|
+
yield @frames[i]
|
405
|
+
else
|
406
|
+
frame = get_subframe(selector)
|
407
|
+
@frames << frame
|
408
|
+
yield frame
|
409
|
+
end
|
410
|
+
end
|
411
|
+
else
|
412
|
+
@frames.each(&block)
|
413
|
+
end
|
388
414
|
nil
|
389
415
|
end
|
390
416
|
|
@@ -916,6 +942,26 @@ module RedAmber
|
|
916
942
|
#
|
917
943
|
define_subframable_method :filter_map
|
918
944
|
|
945
|
+
# Return 0...num sub-dataframes in self.
|
946
|
+
#
|
947
|
+
# @param num [Integer, Float]
|
948
|
+
# num of sub-dataframes to pick up. `num`` must be positive or zero.
|
949
|
+
# @return [SubFrames]
|
950
|
+
# A new SubFrames.
|
951
|
+
# If n == 0, it returns empty SubFrames.
|
952
|
+
# If n >= size, it returns self.
|
953
|
+
# @since 0.4.2
|
954
|
+
#
|
955
|
+
def take(num)
|
956
|
+
if num.zero?
|
957
|
+
SubFrames.new(DataFrame.new, [])
|
958
|
+
elsif num >= size
|
959
|
+
self
|
960
|
+
else
|
961
|
+
SubFrames.by_dataframes(frames(num))
|
962
|
+
end
|
963
|
+
end
|
964
|
+
|
919
965
|
# Number of subsets.
|
920
966
|
#
|
921
967
|
# @return [Integer]
|
@@ -923,7 +969,12 @@ module RedAmber
|
|
923
969
|
# @since 0.4.0
|
924
970
|
#
|
925
971
|
def size
|
926
|
-
@size ||=
|
972
|
+
@size ||=
|
973
|
+
if @selectors
|
974
|
+
@selectors.size
|
975
|
+
else
|
976
|
+
@frames.size
|
977
|
+
end
|
927
978
|
end
|
928
979
|
|
929
980
|
# Size list of subsets.
|
@@ -933,7 +984,12 @@ module RedAmber
|
|
933
984
|
# @since 0.4.0
|
934
985
|
#
|
935
986
|
def sizes
|
936
|
-
@sizes ||=
|
987
|
+
@sizes ||=
|
988
|
+
if @selectors
|
989
|
+
@selectors.sizes
|
990
|
+
else
|
991
|
+
@frames.map(&:size)
|
992
|
+
end
|
937
993
|
end
|
938
994
|
|
939
995
|
# Indices at the top of each sub DataFrames.
|
@@ -945,10 +1001,17 @@ module RedAmber
|
|
945
1001
|
# @since 0.4.0
|
946
1002
|
#
|
947
1003
|
def offset_indices
|
948
|
-
|
949
|
-
|
950
|
-
|
951
|
-
|
1004
|
+
case @selectors
|
1005
|
+
when Filters
|
1006
|
+
@selectors.selectors.map do |selector|
|
1007
|
+
selector.each.with_index.find { |x, _| x }[1]
|
1008
|
+
end
|
1009
|
+
else # Indices, nil
|
1010
|
+
sum = 0
|
1011
|
+
sizes.map do |size|
|
1012
|
+
sum += size
|
1013
|
+
sum - size
|
1014
|
+
end
|
952
1015
|
end
|
953
1016
|
end
|
954
1017
|
|
@@ -965,11 +1028,11 @@ module RedAmber
|
|
965
1028
|
# Test if self has only one subset and it is comprehensive.
|
966
1029
|
#
|
967
1030
|
# @return [true, false]
|
968
|
-
# true if only member of self is equal to universal DataFrame.
|
1031
|
+
# true if the only member of self is equal to universal DataFrame.
|
969
1032
|
# @since 0.4.0
|
970
1033
|
#
|
971
1034
|
def universal?
|
972
|
-
size == 1 &&
|
1035
|
+
size == 1 && first == @baseframe
|
973
1036
|
end
|
974
1037
|
|
975
1038
|
# Return string representation of self.
|
@@ -1012,7 +1075,7 @@ module RedAmber
|
|
1012
1075
|
#
|
1013
1076
|
# @since 0.4.0
|
1014
1077
|
#
|
1015
|
-
def to_s(limit:
|
1078
|
+
def to_s(limit: 5)
|
1016
1079
|
_to_s(limit: limit)
|
1017
1080
|
end
|
1018
1081
|
|
@@ -1064,10 +1127,10 @@ module RedAmber
|
|
1064
1127
|
#
|
1065
1128
|
# @since 0.4.0
|
1066
1129
|
#
|
1067
|
-
def inspect(limit:
|
1130
|
+
def inspect(limit: 5)
|
1068
1131
|
shape =
|
1069
|
-
if @baseframe.
|
1070
|
-
|
1132
|
+
if @baseframe.nil?
|
1133
|
+
'(Not prepared)'
|
1071
1134
|
else
|
1072
1135
|
baseframe.shape_str(with_id: true)
|
1073
1136
|
end
|
@@ -1079,14 +1142,51 @@ module RedAmber
|
|
1079
1142
|
"---\n#{_to_s(limit: limit, with_id: true)}"
|
1080
1143
|
end
|
1081
1144
|
|
1145
|
+
# Return an Array of sub DataFrames
|
1146
|
+
#
|
1147
|
+
# @overload frames
|
1148
|
+
# Returns all sub dataframes.
|
1149
|
+
#
|
1150
|
+
# @return [Array<DataFrame>]
|
1151
|
+
# sub DataFrames.
|
1152
|
+
#
|
1153
|
+
# @overload frames(n_frames)
|
1154
|
+
# Returns partial sub dataframes.
|
1155
|
+
#
|
1156
|
+
# @param n_frames [Integer]
|
1157
|
+
# num of dataframes to retrieve.
|
1158
|
+
# @return [Array<DataFrame>]
|
1159
|
+
# sub DataFrames.
|
1160
|
+
#
|
1161
|
+
# @since 0.4.2
|
1162
|
+
#
|
1163
|
+
def frames(n_frames = nil)
|
1164
|
+
n_frames = size if n_frames.nil?
|
1165
|
+
|
1166
|
+
if @frames.size < n_frames
|
1167
|
+
@frames = each.take(n_frames)
|
1168
|
+
else
|
1169
|
+
@frames.take(n_frames)
|
1170
|
+
end
|
1171
|
+
end
|
1172
|
+
|
1082
1173
|
private
|
1083
1174
|
|
1084
|
-
|
1085
|
-
|
1175
|
+
# Get sub dataframe specified by 'selector'
|
1176
|
+
def get_subframe(selector)
|
1177
|
+
df =
|
1178
|
+
case @selectors
|
1179
|
+
when Filters
|
1180
|
+
@baseframe.filter(selector)
|
1181
|
+
when Indices
|
1182
|
+
@baseframe.take(selector)
|
1183
|
+
end
|
1184
|
+
DataFrame.new_dataframe_with_schema(@baseframe, df)
|
1086
1185
|
end
|
1087
1186
|
|
1088
|
-
|
1089
|
-
|
1187
|
+
# Subcontractor of to_s
|
1188
|
+
def _to_s(limit: 5, with_id: false)
|
1189
|
+
a = each.take(limit).map do |df|
|
1090
1190
|
if with_id
|
1091
1191
|
"#<#{df.shape_str(with_id: with_id)}>\n" \
|
1092
1192
|
"#{df.to_s(head: 2, tail: 2)}"
|
data/lib/red_amber/vector.rb
CHANGED
@@ -10,21 +10,54 @@ module RedAmber
|
|
10
10
|
include ArrowFunction
|
11
11
|
include VectorUpdatable
|
12
12
|
include VectorSelectable
|
13
|
+
include VectorStringFunction
|
13
14
|
|
14
15
|
using RefineArrayLike
|
15
16
|
|
16
|
-
#
|
17
|
+
# Entity of Vector.
|
17
18
|
#
|
18
|
-
# @
|
19
|
-
#
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
# @return [Arrow::Array]
|
20
|
+
#
|
21
|
+
attr_reader :data
|
22
|
+
alias_method :to_arrow_array, :data
|
23
|
+
|
24
|
+
# Associated key name when self is in a DataFrame.
|
25
|
+
#
|
26
|
+
# Default Vector is 'head-less' (key-less).
|
27
|
+
# @return [Symbol]
|
23
28
|
#
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
29
|
+
attr_accessor :key
|
30
|
+
|
31
|
+
class << self
|
32
|
+
# Create a Vector (calling `.new`).
|
33
|
+
#
|
34
|
+
# @param (see #initialize)
|
35
|
+
# @return (see #initialize)
|
36
|
+
# @example Create an empty Vector.
|
37
|
+
# Vector[]
|
38
|
+
# # =>
|
39
|
+
# #<RedAmber::Vector(:string, size=0):0x000000000000e2cc>
|
40
|
+
# []
|
41
|
+
#
|
42
|
+
# @since 0.5.0
|
43
|
+
#
|
44
|
+
def [](...)
|
45
|
+
new(...)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Quicker constructor of Vector.
|
49
|
+
#
|
50
|
+
# @param arrow_array [Arrow::Array]
|
51
|
+
# Arrow::Array object to have in the Vector.
|
52
|
+
# @return [Vector]
|
53
|
+
# created Vector.
|
54
|
+
# @note This method doesn't check argment type.
|
55
|
+
#
|
56
|
+
def create(arrow_array)
|
57
|
+
instance = allocate
|
58
|
+
instance.instance_variable_set(:@data, arrow_array)
|
59
|
+
instance
|
60
|
+
end
|
28
61
|
end
|
29
62
|
|
30
63
|
# Create a Vector.
|
@@ -51,20 +84,6 @@ module RedAmber
|
|
51
84
|
end
|
52
85
|
end
|
53
86
|
|
54
|
-
# Entity of Vector.
|
55
|
-
#
|
56
|
-
# @return [Arrow::Array]
|
57
|
-
#
|
58
|
-
attr_reader :data
|
59
|
-
alias_method :to_arrow_array, :data
|
60
|
-
|
61
|
-
# Associated key name when self is in a DataFrame.
|
62
|
-
#
|
63
|
-
# Default Vector is 'head-less' (key-less).
|
64
|
-
# @return [Symbol]
|
65
|
-
#
|
66
|
-
attr_accessor :key
|
67
|
-
|
68
87
|
# Return other as a Vector which is same data type as self.
|
69
88
|
#
|
70
89
|
# @param other [Vector, Array, Arrow::Array, Arrow::ChunkedArray]
|
@@ -161,6 +161,22 @@ module RedAmber
|
|
161
161
|
#
|
162
162
|
define_unary_aggregation :min_max
|
163
163
|
|
164
|
+
# Compute the 1 most common values and their respective
|
165
|
+
# occurence counts.
|
166
|
+
#
|
167
|
+
# @note Self must be a numeric or a boolean Vector.
|
168
|
+
# @note ModeOptions are not supported in 0.5.0 .
|
169
|
+
# Only one mode value is returned.
|
170
|
+
# @api private
|
171
|
+
# @return [Hash{'mode'=>mode, 'count'=>count}]
|
172
|
+
# mode and count of self in an array.
|
173
|
+
# @since 0.5.0
|
174
|
+
#
|
175
|
+
def mode
|
176
|
+
datum = find(:mode).execute([data])
|
177
|
+
datum.value.to_a.first
|
178
|
+
end
|
179
|
+
|
164
180
|
# Compute product value of self.
|
165
181
|
#
|
166
182
|
# @note Self must be a numeric Vector.
|
@@ -241,6 +257,16 @@ module RedAmber
|
|
241
257
|
# - nearest: returns i or j, whichever is closer.
|
242
258
|
# - midpoint: returns (i + j) / 2.
|
243
259
|
|
260
|
+
# Get a non-nil element in self.
|
261
|
+
#
|
262
|
+
# @return [Object, nil]
|
263
|
+
# first non-nil value detected. If all elements are nil, return nil.
|
264
|
+
# @since 0.5.0
|
265
|
+
#
|
266
|
+
def one
|
267
|
+
each.find { !_1.nil? }
|
268
|
+
end
|
269
|
+
|
244
270
|
# Returns a quantile value.
|
245
271
|
# - 0.5 quantile (median) is returned by default.
|
246
272
|
# - Or return quantile for specified probability (prob).
|
@@ -236,7 +236,6 @@ module RedAmber
|
|
236
236
|
# division of self by other.
|
237
237
|
#
|
238
238
|
define_binary_element_wise :divide
|
239
|
-
alias_method :div, :divide
|
240
239
|
alias_method :'/', :divide
|
241
240
|
|
242
241
|
# Divide the arguments element-wise.
|
@@ -248,21 +247,21 @@ module RedAmber
|
|
248
247
|
|
249
248
|
# Returns element-wise modulo.
|
250
249
|
#
|
251
|
-
# This is equivalent to `self-
|
252
|
-
# @
|
253
|
-
#
|
250
|
+
# This is equivalent to `self-divisor*(self/divisor).floor`.
|
251
|
+
# @note Same behavior as Ruby.
|
252
|
+
# @param divisor [Vector, numeric]
|
253
|
+
# divisor numeric Vector or numeric scalar.
|
254
254
|
# @return [Vector]
|
255
|
-
# modulo of dividing self by
|
255
|
+
# modulo of dividing self by divisor.
|
256
256
|
#
|
257
|
-
def modulo(
|
258
|
-
|
259
|
-
d = find(:divide).execute([data,
|
257
|
+
def modulo(divisor)
|
258
|
+
divisor = divisor.data if divisor.is_a?(Vector)
|
259
|
+
d = find(:divide).execute([data, divisor])
|
260
260
|
d = find(:floor).execute([d]) if d.value.is_a?(Arrow::DoubleArray)
|
261
|
-
m = find(:multiply).execute([d,
|
261
|
+
m = find(:multiply).execute([d, divisor])
|
262
262
|
datum = find(:subtract).execute([data, m])
|
263
263
|
Vector.create(datum.value)
|
264
264
|
end
|
265
|
-
alias_method :mod, :modulo
|
266
265
|
alias_method :'%', :modulo
|
267
266
|
|
268
267
|
# Returns element-wise modulo.
|
@@ -270,11 +269,11 @@ module RedAmber
|
|
270
269
|
# This function is a overflow-checking variant of #modulo.
|
271
270
|
# @return (see #modulo)
|
272
271
|
#
|
273
|
-
def modulo_checked(
|
274
|
-
|
275
|
-
d = find(:divide_checked).execute([data,
|
272
|
+
def modulo_checked(divisor)
|
273
|
+
divisor = divisor.data if divisor.is_a?(Vector)
|
274
|
+
d = find(:divide_checked).execute([data, divisor])
|
276
275
|
d = find(:floor).execute([d]) if d.value.is_a?(Arrow::DoubleArray)
|
277
|
-
m = find(:multiply_checked).execute([d,
|
276
|
+
m = find(:multiply_checked).execute([d, divisor])
|
278
277
|
datum = find(:subtract_checked).execute([data, m])
|
279
278
|
Vector.create(datum.value)
|
280
279
|
end
|
@@ -323,27 +322,57 @@ module RedAmber
|
|
323
322
|
|
324
323
|
# Returns element-wise quotient by double Vector.
|
325
324
|
#
|
326
|
-
# @param
|
327
|
-
#
|
325
|
+
# @param divisor [Vector, numeric]
|
326
|
+
# divisor numeric Vector or numeric scalar.
|
328
327
|
# @return [Vector]
|
329
|
-
# quotient of dividing self by
|
328
|
+
# quotient of dividing self by divisor.
|
330
329
|
#
|
331
|
-
def
|
332
|
-
|
333
|
-
datum = find(:divide).execute([Arrow::DoubleArray.new(data),
|
330
|
+
def fdiv(divisor)
|
331
|
+
divisor = divisor.data if divisor.is_a?(Vector)
|
332
|
+
datum = find(:divide).execute([Arrow::DoubleArray.new(data), divisor])
|
334
333
|
Vector.create(datum.value)
|
335
334
|
end
|
336
|
-
alias_method :quo, :quotient
|
337
|
-
alias_method :fdiv, :quotient
|
338
335
|
|
339
336
|
# Returns element-wise quotient by double Vector.
|
340
337
|
#
|
341
338
|
# This function is a overflow-checking variant of #quotient.
|
342
339
|
# @return (see #quotient)
|
343
340
|
#
|
344
|
-
def
|
345
|
-
|
346
|
-
datum = find(:divide_checked).execute([Arrow::DoubleArray.new(data),
|
341
|
+
def fdiv_checked(divisor)
|
342
|
+
divisor = divisor.data if divisor.is_a?(Vector)
|
343
|
+
datum = find(:divide_checked).execute([Arrow::DoubleArray.new(data), divisor])
|
344
|
+
Vector.create(datum.value)
|
345
|
+
end
|
346
|
+
|
347
|
+
# Returns element-wise remainder.
|
348
|
+
#
|
349
|
+
# This is equivalent to `self-divisor*(self/divisor).trunc`.
|
350
|
+
# @note Same behavior as Ruby's remainder.
|
351
|
+
# @param divisor [Vector, numeric]
|
352
|
+
# divisor numeric Vector or numeric scalar.
|
353
|
+
# @return [Vector]
|
354
|
+
# modulo of dividing self by divisor.
|
355
|
+
#
|
356
|
+
def remainder(divisor)
|
357
|
+
divisor = divisor.data if divisor.is_a?(Vector)
|
358
|
+
d = find(:divide).execute([data, divisor])
|
359
|
+
d = find(:trunc).execute([d]) if d.value.is_a?(Arrow::DoubleArray)
|
360
|
+
m = find(:multiply).execute([d, divisor])
|
361
|
+
datum = find(:subtract).execute([data, m])
|
362
|
+
Vector.create(datum.value)
|
363
|
+
end
|
364
|
+
|
365
|
+
# Returns element-wise modulo.
|
366
|
+
#
|
367
|
+
# This function is a overflow-checking variant of #modulo.
|
368
|
+
# @return (see #modulo)
|
369
|
+
#
|
370
|
+
def remainder_checked(divisor)
|
371
|
+
divisor = divisor.data if divisor.is_a?(Vector)
|
372
|
+
d = find(:divide_checked).execute([data, divisor])
|
373
|
+
d = find(:trunc).execute([d]) if d.value.is_a?(Arrow::DoubleArray)
|
374
|
+
m = find(:multiply_checked).execute([d, divisor])
|
375
|
+
datum = find(:subtract_checked).execute([data, m])
|
347
376
|
Vector.create(datum.value)
|
348
377
|
end
|
349
378
|
|