vector_number 0.3.0 → 0.3.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 +4 -4
- data/CHANGELOG.md +47 -1
- data/LICENSE.txt +21 -0
- data/README.md +16 -7
- data/lib/vector_number/comparing.rb +55 -2
- data/lib/vector_number/converting.rb +86 -6
- data/lib/vector_number/enumerating.rb +70 -13
- data/lib/vector_number/math_converting.rb +66 -6
- data/lib/vector_number/mathing.rb +207 -33
- data/lib/vector_number/numeric_refinements.rb +33 -9
- data/lib/vector_number/querying.rb +84 -15
- data/lib/vector_number/stringifying.rb +31 -2
- data/lib/vector_number/version.rb +2 -2
- data/lib/vector_number.rb +97 -18
- data/sig/vector_number.rbs +3 -3
- metadata +12 -6
data/lib/vector_number.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "vector_number/
|
4
|
-
require_relative "vector_number/mathing"
|
5
|
-
require_relative "vector_number/math_converting"
|
3
|
+
require_relative "vector_number/comparing"
|
6
4
|
require_relative "vector_number/converting"
|
7
5
|
require_relative "vector_number/enumerating"
|
8
|
-
require_relative "vector_number/
|
6
|
+
require_relative "vector_number/math_converting"
|
7
|
+
require_relative "vector_number/mathing"
|
9
8
|
require_relative "vector_number/querying"
|
10
9
|
require_relative "vector_number/stringifying"
|
10
|
+
require_relative "vector_number/version"
|
11
11
|
|
12
12
|
# A class to add together anything.
|
13
13
|
class VectorNumber
|
@@ -19,38 +19,84 @@ class VectorNumber
|
|
19
19
|
include Querying
|
20
20
|
include Stringifying
|
21
21
|
|
22
|
+
# Keys for possible options.
|
23
|
+
# Unknown options will be rejected when creating a vector.
|
24
|
+
#
|
22
25
|
# @return [Array<Symbol>]
|
26
|
+
#
|
27
|
+
# @since 0.2.0
|
23
28
|
KNOWN_OPTIONS = %i[mult].freeze
|
24
29
|
|
30
|
+
# Default values for options.
|
31
|
+
#
|
25
32
|
# @return [Hash{Symbol => Object}]
|
33
|
+
#
|
34
|
+
# @since 0.2.0
|
26
35
|
DEFAULT_OPTIONS = { mult: :dot }.freeze
|
27
36
|
|
28
37
|
# Get a unit for +n+th numeric dimension, where 1 is real, 2 is imaginary.
|
38
|
+
#
|
39
|
+
# @since 0.2.0
|
29
40
|
UNIT = ->(n) { (n - 1).i }.freeze
|
30
41
|
# Constant for real unit.
|
42
|
+
#
|
43
|
+
# @since 0.2.0
|
31
44
|
R = UNIT[1]
|
32
45
|
# Constant for imaginary unit.
|
46
|
+
#
|
47
|
+
# @since 0.1.0
|
33
48
|
I = UNIT[2]
|
34
49
|
|
35
|
-
#
|
36
|
-
# @return [Integer]
|
37
|
-
attr_reader :size
|
38
|
-
# @return [Hash{Symbol => Object}]
|
39
|
-
attr_reader :options
|
40
|
-
|
41
|
-
# Create new VectorNumber from +values+.
|
50
|
+
# Create new VectorNumber from a list of values, possibly specifying options.
|
42
51
|
#
|
43
52
|
# @example
|
44
|
-
# VectorNumber[1, 2, 3]
|
45
|
-
# VectorNumber[[1, 2, 3]]
|
46
|
-
# VectorNumber[
|
53
|
+
# VectorNumber[1, 2, 3] # => (6)
|
54
|
+
# VectorNumber[[1, 2, 3]] # => (1⋅[1, 2, 3])
|
55
|
+
# VectorNumber["b", VectorNumber::I, mult: :asterisk] # => (1*'b' + 1i)
|
56
|
+
# VectorNumber[] # => (0)
|
57
|
+
# VectorNumber["b", VectorNumber["b"]] # => (2⋅'b')
|
58
|
+
# VectorNumber["a", "b", "a"] # => (2⋅'a' + 1⋅'b')
|
59
|
+
#
|
47
60
|
# @param values [Array<Object>] values to put in the number
|
48
61
|
# @param options [Hash{Symbol => Object}] options for the number
|
62
|
+
# @option options [Symbol, String] :mult Multiplication symbol,
|
63
|
+
# either a key from {MULT_STRINGS} or a literal string to use
|
49
64
|
# @return [VectorNumber]
|
65
|
+
#
|
66
|
+
# @since 0.1.0
|
50
67
|
def self.[](*values, **options)
|
51
68
|
new(values, options)
|
52
69
|
end
|
53
70
|
|
71
|
+
# Number of non-zero dimensions.
|
72
|
+
#
|
73
|
+
# @return [Integer]
|
74
|
+
#
|
75
|
+
# @since 0.1.0
|
76
|
+
attr_reader :size
|
77
|
+
|
78
|
+
# Options used for this vector.
|
79
|
+
#
|
80
|
+
# @see KNOWN_OPTIONS
|
81
|
+
#
|
82
|
+
# @return [Hash{Symbol => Object}]
|
83
|
+
#
|
84
|
+
# @since 0.1.0
|
85
|
+
attr_reader :options
|
86
|
+
|
87
|
+
# Create new VectorNumber from +values+, possibly specifying +options+,
|
88
|
+
# possibly modifying coefficients with a block.
|
89
|
+
#
|
90
|
+
# @example
|
91
|
+
# VectorNumber.new(1, 2, 3) # ArgumentError
|
92
|
+
# VectorNumber.new([1, 2, 3]) # => (6)
|
93
|
+
# VectorNumber.new(["b", VectorNumber::I], mult: :asterisk) # => (1*'b' + 1i)
|
94
|
+
# VectorNumber.new # => (0)
|
95
|
+
# @example with a block
|
96
|
+
# VectorNumber.new(["a", "b", "c", 3]) { _1 * 2 } # => (2⋅'a' + 2⋅'b' + 2⋅'c' + 6)
|
97
|
+
# VectorNumber.new(["a", "b", "c", 3], &:-@) # => (-1⋅'a' - 1⋅'b' - 1⋅'c' - 3)
|
98
|
+
# VectorNumber.new(["a", "b", "c", 3], &:digits) # RangeError
|
99
|
+
#
|
54
100
|
# @param values [Array, Hash{Object => Integer, Float, Rational, BigDecimal}, VectorNumber]
|
55
101
|
# values for this number, hashes are treated like plain vector numbers
|
56
102
|
# @param options [Hash{Symbol => Object}]
|
@@ -62,7 +108,7 @@ class VectorNumber
|
|
62
108
|
# @yieldreturn [Integer, Float, Rational, BigDecimal] new coefficient
|
63
109
|
# @raise [RangeError] if any pesky non-reals get where they shouldn't
|
64
110
|
def initialize(values = nil, options = nil, &)
|
65
|
-
# @type var options: Hash[Symbol,
|
111
|
+
# @type var options: Hash[Symbol, Object]
|
66
112
|
initialize_from(values)
|
67
113
|
apply_transform(&)
|
68
114
|
finalize_contents
|
@@ -75,13 +121,18 @@ class VectorNumber
|
|
75
121
|
# Return self.
|
76
122
|
#
|
77
123
|
# @return [VectorNumber]
|
78
|
-
|
124
|
+
#
|
125
|
+
# @since 0.2.0
|
126
|
+
def +@ = self
|
127
|
+
# @since 0.2.4
|
128
|
+
alias dup +@
|
79
129
|
|
80
130
|
# Return self.
|
81
131
|
#
|
82
|
-
# Raises ArgumentError if +freeze+ is not +true+ or +nil+.
|
83
|
-
#
|
84
132
|
# @return [VectorNumber]
|
133
|
+
# @raise [ArgumentError] if +freeze+ is not +true+ or +nil+.
|
134
|
+
#
|
135
|
+
# @since 0.2.4
|
85
136
|
def clone(freeze: true)
|
86
137
|
case freeze
|
87
138
|
when true, nil
|
@@ -96,6 +147,7 @@ class VectorNumber
|
|
96
147
|
private
|
97
148
|
|
98
149
|
# Create new VectorNumber from a value or self, optionally applying a transform.
|
150
|
+
#
|
99
151
|
# @param from [Object] self if not specified
|
100
152
|
# @yieldparam coefficient [Integer, Float, Rational, BigDecimal]
|
101
153
|
# @yieldreturn [Integer, Float, Rational, BigDecimal] new coefficient
|
@@ -104,14 +156,22 @@ class VectorNumber
|
|
104
156
|
self.class.new(from, options, &)
|
105
157
|
end
|
106
158
|
|
159
|
+
# Check if +other+ is a real number.
|
160
|
+
#
|
161
|
+
# Currently this is either a +real?+ Numeric or +numeric?(1)+ VectorNumber.
|
162
|
+
#
|
107
163
|
# @param value [Object]
|
108
164
|
# @return [Boolean]
|
165
|
+
#
|
166
|
+
# @since 0.1.0
|
109
167
|
def real_number?(value)
|
110
168
|
(value.is_a?(Numeric) && value.real?) || (value.is_a?(self.class) && value.numeric?(1))
|
111
169
|
end
|
112
170
|
|
113
171
|
# @param values [Array, Hash{Object => Integer, Float, Rational, BigDecimal}, VectorNumber, nil]
|
114
172
|
# @return [void]
|
173
|
+
#
|
174
|
+
# @since 0.1.0
|
115
175
|
def initialize_from(values)
|
116
176
|
@data = Hash.new(0)
|
117
177
|
|
@@ -127,6 +187,8 @@ class VectorNumber
|
|
127
187
|
|
128
188
|
# @param value [VectorNumber, Numeric, Object]
|
129
189
|
# @return [void]
|
190
|
+
#
|
191
|
+
# @since 0.1.0
|
130
192
|
def add_value_to_data(value)
|
131
193
|
case value
|
132
194
|
when Numeric
|
@@ -140,6 +202,8 @@ class VectorNumber
|
|
140
202
|
|
141
203
|
# @param value [Numeric]
|
142
204
|
# @return [void]
|
205
|
+
#
|
206
|
+
# @since 0.1.0
|
143
207
|
def add_numeric_value_to_data(value)
|
144
208
|
@data[R] += value.real
|
145
209
|
@data[I] += value.imaginary
|
@@ -147,6 +211,8 @@ class VectorNumber
|
|
147
211
|
|
148
212
|
# @param vector [VectorNumber, Hash{Object => Integer, Float, Rational, BigDecimal}]
|
149
213
|
# @return [void]
|
214
|
+
#
|
215
|
+
# @since 0.1.0
|
150
216
|
def add_vector_to_data(vector)
|
151
217
|
vector.each_pair do |unit, coefficient|
|
152
218
|
raise RangeError, "#{coefficient} is not a real number" unless real_number?(coefficient)
|
@@ -159,6 +225,8 @@ class VectorNumber
|
|
159
225
|
# @yieldreturn [Integer, Float, Rational, BigDecimal]
|
160
226
|
# @return [void]
|
161
227
|
# @raise [RangeError]
|
228
|
+
#
|
229
|
+
# @since 0.1.0
|
162
230
|
def apply_transform
|
163
231
|
return unless block_given?
|
164
232
|
|
@@ -173,6 +241,8 @@ class VectorNumber
|
|
173
241
|
# @param options [Hash{Symbol => Object}, nil]
|
174
242
|
# @param values [Object] initializing object
|
175
243
|
# @return [void]
|
244
|
+
#
|
245
|
+
# @since 0.1.0
|
176
246
|
def save_options(options, values:)
|
177
247
|
@options =
|
178
248
|
case [options, values]
|
@@ -191,6 +261,11 @@ class VectorNumber
|
|
191
261
|
end
|
192
262
|
end
|
193
263
|
|
264
|
+
# @param base_options [Hash{Symbol => Object}]
|
265
|
+
# @param added_options [Hash{Symbol => Object}]
|
266
|
+
# @return [Hash{Symbol => Object}]
|
267
|
+
#
|
268
|
+
# @since 0.3.0
|
194
269
|
def merge_options(base_options, added_options)
|
195
270
|
# Optimization for the common case of passing options through #new.
|
196
271
|
return base_options if added_options.equal?(base_options)
|
@@ -200,16 +275,20 @@ class VectorNumber
|
|
200
275
|
|
201
276
|
# Compact coefficients, calculate size and freeze data.
|
202
277
|
# @return [void]
|
278
|
+
#
|
279
|
+
# @since 0.1.0
|
203
280
|
def finalize_contents
|
204
281
|
@data.delete_if { |_u, c| c.zero? }
|
205
282
|
@data.freeze
|
206
283
|
@size = @data.size
|
207
284
|
end
|
208
285
|
|
286
|
+
# @since 0.2.0
|
209
287
|
def default_options
|
210
288
|
DEFAULT_OPTIONS
|
211
289
|
end
|
212
290
|
|
291
|
+
# @since 0.2.0
|
213
292
|
def known_options
|
214
293
|
KNOWN_OPTIONS
|
215
294
|
end
|
data/sig/vector_number.rbs
CHANGED
@@ -55,7 +55,8 @@ class VectorNumber
|
|
55
55
|
?{ (coefficient_type coefficient) -> coefficient_type }
|
56
56
|
-> void
|
57
57
|
|
58
|
-
def
|
58
|
+
def +@: () -> self
|
59
|
+
alias dup +@
|
59
60
|
|
60
61
|
def clone: (?freeze: bool?) -> self
|
61
62
|
|
@@ -76,6 +77,7 @@ class VectorNumber
|
|
76
77
|
def apply_transform: () ?{ (coefficient_type value) -> coefficient_type } -> void
|
77
78
|
|
78
79
|
def save_options: (options_type? options, values: in_value_type) -> void
|
80
|
+
def merge_options: (options_type base_options, options_type added_options) -> options_type
|
79
81
|
def default_options: () -> options_type
|
80
82
|
def known_options: () -> list[Symbol]
|
81
83
|
|
@@ -87,8 +89,6 @@ class VectorNumber
|
|
87
89
|
|
88
90
|
def coerce: (in_value_type) -> [vector_type, self]
|
89
91
|
|
90
|
-
def +@: () -> self
|
91
|
-
|
92
92
|
def -@: () -> vector_type
|
93
93
|
alias neg -@
|
94
94
|
|
metadata
CHANGED
@@ -1,21 +1,23 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vector_number
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexandr Bulancov
|
8
8
|
bindir: exe
|
9
9
|
cert_chain: []
|
10
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
11
11
|
dependencies: []
|
12
12
|
executables: []
|
13
13
|
extensions: []
|
14
14
|
extra_rdoc_files:
|
15
|
-
- README.md
|
16
15
|
- CHANGELOG.md
|
16
|
+
- LICENSE.txt
|
17
|
+
- README.md
|
17
18
|
files:
|
18
19
|
- CHANGELOG.md
|
20
|
+
- LICENSE.txt
|
19
21
|
- README.md
|
20
22
|
- lib/vector_number.rb
|
21
23
|
- lib/vector_number/comparing.rb
|
@@ -33,12 +35,16 @@ licenses:
|
|
33
35
|
- MIT
|
34
36
|
metadata:
|
35
37
|
homepage_uri: https://github.com/trinistr/vector_number
|
36
|
-
|
37
|
-
|
38
|
+
bug_tracker_uri: https://github.com/trinistr/vector_number/issues
|
39
|
+
documentation_uri: https://rubydoc.info/gems/vector_number/0.3.1
|
40
|
+
source_code_uri: https://github.com/trinistr/vector_number/tree/v0.3.1
|
41
|
+
changelog_uri: https://github.com/trinistr/vector_number/blob/v0.3.1/CHANGELOG.md
|
38
42
|
rubygems_mfa_required: 'true'
|
39
43
|
rdoc_options:
|
40
44
|
- "--main"
|
41
45
|
- README.md
|
46
|
+
- "--files"
|
47
|
+
- CHANGELOG.md,LICENSE.txt
|
42
48
|
require_paths:
|
43
49
|
- lib
|
44
50
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -52,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
58
|
- !ruby/object:Gem::Version
|
53
59
|
version: '0'
|
54
60
|
requirements: []
|
55
|
-
rubygems_version: 3.6.
|
61
|
+
rubygems_version: 3.6.8
|
56
62
|
specification_version: 4
|
57
63
|
summary: A library to add together anything.
|
58
64
|
test_files: []
|