tomstuart-vector_space 0.1.0 → 0.1.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.
- data/README.markdown +106 -0
- data/lib/vector_space/arithmetic.rb +3 -14
- metadata +2 -2
data/README.markdown
CHANGED
@@ -2,3 +2,109 @@ VectorSpace
|
|
2
2
|
===========
|
3
3
|
|
4
4
|
A Ruby library for treating multidimensional values as elements of a vector space.
|
5
|
+
|
6
|
+
Examples
|
7
|
+
--------
|
8
|
+
|
9
|
+
A simple vector space:
|
10
|
+
|
11
|
+
class Round < VectorSpace::SimpleVector
|
12
|
+
has_dimension :hoegaarden
|
13
|
+
has_dimension :franziskaner
|
14
|
+
has_dimension :fruli
|
15
|
+
has_dimension :water
|
16
|
+
end
|
17
|
+
|
18
|
+
>> Round.new
|
19
|
+
=> 0 and 0 and 0 and 0
|
20
|
+
|
21
|
+
>> Round.new :hoegaarden => 5, :fruli => 3
|
22
|
+
=> 5 and 0 and 3 and 0
|
23
|
+
|
24
|
+
With custom descriptions:
|
25
|
+
|
26
|
+
class Round < VectorSpace::SimpleVector
|
27
|
+
has_dimension :hoegaarden, :describe => lambda { |n| "#{n} Hoegaardens" unless n.zero? }
|
28
|
+
has_dimension :franziskaner, :describe => lambda { |n| "#{n} Franziskaners" unless n.zero? }
|
29
|
+
has_dimension :fruli, :describe => lambda { |n| "#{n} Frülis" unless n.zero? }
|
30
|
+
has_dimension :water, :describe => lambda { |n| "#{n} waters" unless n.zero? }
|
31
|
+
has_zero_description 'no drinks'
|
32
|
+
end
|
33
|
+
|
34
|
+
>> Round.new
|
35
|
+
=> no drinks
|
36
|
+
|
37
|
+
>> Round.new :hoegaarden => 5, :fruli => 3
|
38
|
+
=> 5 Hoegaardens and 3 Frülis
|
39
|
+
|
40
|
+
>> Round.new(:hoegaarden => 2, :franziskaner => 3) + Round.new(:water => 2, :fruli => 2, :hoegaarden => 1)
|
41
|
+
=> 3 Hoegaardens and 3 Franziskaners and 2 Frülis and 2 waters
|
42
|
+
|
43
|
+
>> (Round.new(:hoegaarden => 2, :franziskaner => 3) * 2) - Round.new(:hoegaarden => 1)
|
44
|
+
=> 3 Hoegaardens and 6 Franziskaners
|
45
|
+
|
46
|
+
An indexed family of vector spaces with custom descriptions:
|
47
|
+
|
48
|
+
class Cocktail < VectorSpace::SimpleIndexedVector
|
49
|
+
indexed_by :units
|
50
|
+
has_dimension :gin, :describe => lambda { |units, n| "#{n}#{units} gin" unless n.zero? }
|
51
|
+
has_dimension :vermouth, :describe => lambda { |units, n| "#{n}#{units} vermouth" unless n.zero? }
|
52
|
+
has_dimension :whisky, :describe => lambda { |units, n| "#{n}#{units} whisky" unless n.zero? }
|
53
|
+
has_dimension :vodka, :describe => lambda { |units, n| "#{n}#{units} vodka" unless n.zero? }
|
54
|
+
has_dimension :kahlua, :describe => lambda { |units, n| "#{n}#{units} Kahlúa" unless n.zero? }
|
55
|
+
has_dimension :cream, :describe => lambda { |units, n| "#{n}#{units} cream" unless n.zero? }
|
56
|
+
end
|
57
|
+
|
58
|
+
>> martini = Cocktail.new :units => :cl, :gin => 5.5, :vermouth => 1.5
|
59
|
+
=> 5.5cl gin and 1.5cl vermouth
|
60
|
+
|
61
|
+
>> manhattan = Cocktail.new :units => :cl, :whisky => 5, :vermouth => 2
|
62
|
+
=> 2cl vermouth and 5cl whisky
|
63
|
+
|
64
|
+
>> white_russian = Cocktail.new :units => :oz, :vodka => 2, :kahlua => 1, :cream => 1.5
|
65
|
+
=> 2oz vodka and 1oz Kahlúa and 1.5oz cream
|
66
|
+
|
67
|
+
>> martini * 2
|
68
|
+
=> 11cl gin and 3cl vermouth
|
69
|
+
|
70
|
+
>> martini + manhattan
|
71
|
+
=> 5.5cl gin and 3.5cl vermouth and 5cl whisky
|
72
|
+
|
73
|
+
>> martini + white_russian
|
74
|
+
ArgumentError: can't add 5.5cl gin and 1.5cl vermouth to 2oz vodka and 1oz Kahlúa and 1.5oz cream
|
75
|
+
|
76
|
+
A real (one-dimensional) example:
|
77
|
+
|
78
|
+
class Money < VectorSpace::SimpleIndexedVector
|
79
|
+
indexed_by :currency, :default => Currency::GBP
|
80
|
+
has_dimension :cents,
|
81
|
+
:coerce => lambda { |n| n.round }, # or just :coerce => :round if you have Symbol#to_proc
|
82
|
+
:describe => lambda { |currency, cents| "#{currency.symbol}#{cents / 100}.#{sprintf('%02d', cents % 100)}" }
|
83
|
+
end
|
84
|
+
|
85
|
+
>> a = Money.new(:currency => Currency::GBP, :cents => 9900)
|
86
|
+
=> £99.00
|
87
|
+
|
88
|
+
>> b = Money.new(:currency => Currency::GBP, :cents => 1500)
|
89
|
+
=> £15.00
|
90
|
+
|
91
|
+
>> a < b
|
92
|
+
=> false
|
93
|
+
|
94
|
+
>> a > b
|
95
|
+
=> true
|
96
|
+
|
97
|
+
>> a + b
|
98
|
+
=> £114.00
|
99
|
+
|
100
|
+
>> c = Money.new(:currency => Currency::USD, :cents => 99)
|
101
|
+
=> $0.99
|
102
|
+
|
103
|
+
>> a < c
|
104
|
+
=> false
|
105
|
+
|
106
|
+
>> c < a
|
107
|
+
=> false
|
108
|
+
|
109
|
+
>> a + c
|
110
|
+
ArgumentError: can't add $0.99 to £99.00
|
@@ -25,20 +25,9 @@ module VectorSpace
|
|
25
25
|
self + (-vector)
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
else
|
32
|
-
if divisor.is_a?(Numeric)
|
33
|
-
# Scalar division (by multiplication)
|
34
|
-
self * (1.0 / divisor)
|
35
|
-
elsif compatible_with?(divisor)
|
36
|
-
# Vector division
|
37
|
-
map_values(dimensions.reject { |dimension| divisor.project(dimension).zero? }, divisor) { |a, b| a / b }.min
|
38
|
-
else
|
39
|
-
raise ArgumentError, "can't divide #{self.inspect} by #{divisor.inspect}"
|
40
|
-
end
|
41
|
-
end
|
28
|
+
# Scalar division (by multiplication)
|
29
|
+
def /(n)
|
30
|
+
self * (1.0 / n)
|
42
31
|
end
|
43
32
|
end
|
44
33
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tomstuart-vector_space
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Stuart
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-07-
|
12
|
+
date: 2009-07-09 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|