borel 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.
- data/README.md +20 -14
- data/borel.gemspec +1 -1
- data/lib/borel/interval.rb +8 -24
- data/lib/borel/interval_multiple.rb +20 -0
- data/lib/borel/version.rb +1 -1
- metadata +2 -2
data/README.md
CHANGED
@@ -8,7 +8,9 @@ Borelian sets are formed by enumerable union, intersection or
|
|
8
8
|
of any comparable class.
|
9
9
|
|
10
10
|
**Borel** borrows many of the ideas _(and code)_
|
11
|
-
from the **Intervals** [gem][1].
|
11
|
+
from the **Intervals** [gem][1]. However it differs from Intervals in which
|
12
|
+
it's aim is not on numerical precision and calculation, but on ease of use and
|
13
|
+
solving some general interval related problems.
|
12
14
|
|
13
15
|
[1]: http://intervals.rubyforge.org
|
14
16
|
|
@@ -31,8 +33,8 @@ Usage
|
|
31
33
|
### Initializing
|
32
34
|
|
33
35
|
An Interval can be initialized with an empty, one or two sized array
|
34
|
-
(respectively for an _empty_, _degenerate_ or
|
35
|
-
an array of one or two sized arrays (for a
|
36
|
+
(respectively for an _empty_, _degenerate_ or `Simple` interval), or
|
37
|
+
an array of one or two sized arrays (for a `Multiple` interval).
|
36
38
|
|
37
39
|
```ruby
|
38
40
|
Interval[]
|
@@ -42,15 +44,17 @@ An Interval can be initialized with an empty, one or two sized array
|
|
42
44
|
```
|
43
45
|
|
44
46
|
Another way to initialize an Interval is by using the
|
45
|
-
|
47
|
+
`#to_interval` method extension.
|
46
48
|
|
47
49
|
```ruby
|
48
|
-
|
49
|
-
|
50
|
-
(
|
50
|
+
nil.to_interval # -> Interval[]
|
51
|
+
1.to_interval # -> Interval[1]
|
52
|
+
(1..2).to_interval # -> Interval[1,2]
|
53
|
+
(1...3).to_interval # -> Interval[1,2]
|
54
|
+
[1,2].to_interval # -> Interval[1,2]
|
51
55
|
```
|
52
56
|
|
53
|
-
The
|
57
|
+
The `Infinity` constant is available for specifying intervals
|
54
58
|
with no upper or lower boundary.
|
55
59
|
|
56
60
|
```ruby
|
@@ -64,6 +68,8 @@ The **Infinity** constant is available for specifying intervals
|
|
64
68
|
Some natural properties of intervals:
|
65
69
|
|
66
70
|
```ruby
|
71
|
+
Interval[1,2].inf # -> 1
|
72
|
+
Interval[1,2].sup # -> 2
|
67
73
|
Interval[1].degenerate? # -> true
|
68
74
|
Interval[[0,1],[2,3]].simple? # -> false
|
69
75
|
Interval[].empty? # -> true
|
@@ -74,7 +80,7 @@ Some natural properties of intervals:
|
|
74
80
|
|
75
81
|
* Complement
|
76
82
|
|
77
|
-
|
83
|
+
`#complement`, alias: `#~`
|
78
84
|
|
79
85
|
```ruby
|
80
86
|
~Interval[0,5] # -> Interval[[-Infinity, 0], [5, Infinity]]
|
@@ -82,7 +88,7 @@ __complement__ and __~__
|
|
82
88
|
|
83
89
|
* Union
|
84
90
|
|
85
|
-
|
91
|
+
`#union`, aliases: `#|`,`#+`
|
86
92
|
|
87
93
|
```ruby
|
88
94
|
Interval[0,5] | Interval[-1,3] # -> Interval[-1,5]
|
@@ -90,7 +96,7 @@ Interval[0,5] | Interval[-1,3] # -> Interval[-1,5]
|
|
90
96
|
|
91
97
|
* Intersection
|
92
98
|
|
93
|
-
|
99
|
+
`#intersect`, aliases: `#&`,`#^`
|
94
100
|
|
95
101
|
```ruby
|
96
102
|
Interval[0,5] ^ Interval[-1,3] # -> Interval[0,3]
|
@@ -98,7 +104,7 @@ Interval[0,5] ^ Interval[-1,3] # -> Interval[0,3]
|
|
98
104
|
|
99
105
|
* Subtraction
|
100
106
|
|
101
|
-
|
107
|
+
`#minus`, alias: `#-`
|
102
108
|
|
103
109
|
```ruby
|
104
110
|
Interval[0,5] - Interval[-1,3] # -> Interval[3,5]
|
@@ -140,13 +146,13 @@ Interval[1,5].rand # -> Random.new.rand 1..5
|
|
140
146
|
Interval[1,5].width # -> 5-1, only for simple intervals
|
141
147
|
```
|
142
148
|
|
143
|
-
It's supported only for Numeric Comparable and arithmetic supported classes
|
149
|
+
It's supported only for `Numeric`, `Comparable` and arithmetic supported classes
|
144
150
|
|
145
151
|
Remarks
|
146
152
|
-------
|
147
153
|
|
148
154
|
* There is no distinction between _open_ and _closed_ intervals
|
149
|
-
*
|
155
|
+
* `complement` and `minus` operations, and also _Math Extensions_ have limited
|
150
156
|
support for non numeric-comparable classes
|
151
157
|
|
152
158
|
License
|
data/borel.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.platform = Gem::Platform::RUBY
|
7
7
|
s.authors = ["Amadeus Folego"]
|
8
8
|
s.email = ["amadeusfolego@gmail.com"]
|
9
|
-
s.homepage = "http://github.com/
|
9
|
+
s.homepage = "http://github.com/badosu/borel"
|
10
10
|
s.summary = "Generic ordered set's operations"
|
11
11
|
s.description = "Borel sets are made of enumerable union and intersection of
|
12
12
|
intervals. Borel performs regular operations on any interval of any
|
data/lib/borel/interval.rb
CHANGED
@@ -5,7 +5,7 @@ Infinity = 1/0.0
|
|
5
5
|
class Interval
|
6
6
|
include Enumerable
|
7
7
|
|
8
|
-
def
|
8
|
+
def self.[](*array)
|
9
9
|
union(*
|
10
10
|
if array.empty?
|
11
11
|
[]
|
@@ -16,14 +16,13 @@ class Interval
|
|
16
16
|
end
|
17
17
|
)
|
18
18
|
rescue
|
19
|
-
unless
|
20
|
-
array.size <= 2 || array.all?{|x| Array === x && x.size <= 2}
|
19
|
+
unless array.size <= 2 || array.all?{|x| Array === x && x.size <= 2}
|
21
20
|
raise Exception::Construction, array
|
22
21
|
end
|
23
22
|
raise
|
24
23
|
end
|
25
24
|
|
26
|
-
def
|
25
|
+
def self.union(*array)
|
27
26
|
l = []
|
28
27
|
array.map(&:components).flatten.sort_by(&:inf).each do |x|
|
29
28
|
if x.sup < x.inf
|
@@ -51,6 +50,11 @@ class Interval
|
|
51
50
|
flatten.reduce(:union)
|
52
51
|
end
|
53
52
|
|
53
|
+
def intersect(other)
|
54
|
+
other.to_interval.map{|y| map{|x| x.intersect(y)}}.
|
55
|
+
flatten.reduce(:union) || Interval[]
|
56
|
+
end
|
57
|
+
|
54
58
|
def minus(other)
|
55
59
|
if other.empty?
|
56
60
|
self
|
@@ -64,22 +68,10 @@ class Interval
|
|
64
68
|
construction == other.construction
|
65
69
|
end
|
66
70
|
|
67
|
-
def include?(x)
|
68
|
-
any?{|i| i.include? x}
|
69
|
-
end
|
70
|
-
|
71
71
|
def empty?
|
72
72
|
components.empty?
|
73
73
|
end
|
74
74
|
|
75
|
-
def construction
|
76
|
-
map &:construction
|
77
|
-
end
|
78
|
-
|
79
|
-
def degenerate?
|
80
|
-
all? &:degenerate?
|
81
|
-
end
|
82
|
-
|
83
75
|
def to_interval
|
84
76
|
self
|
85
77
|
end
|
@@ -92,14 +84,6 @@ class Interval
|
|
92
84
|
inspect
|
93
85
|
end
|
94
86
|
|
95
|
-
def inf
|
96
|
-
first.inf
|
97
|
-
end
|
98
|
-
|
99
|
-
def sup
|
100
|
-
last.sup
|
101
|
-
end
|
102
|
-
|
103
87
|
def hull
|
104
88
|
if empty?
|
105
89
|
Interval[]
|
@@ -11,6 +11,26 @@ class Interval::Multiple < Interval
|
|
11
11
|
self
|
12
12
|
end
|
13
13
|
|
14
|
+
def inf
|
15
|
+
first.inf
|
16
|
+
end
|
17
|
+
|
18
|
+
def sup
|
19
|
+
last.sup
|
20
|
+
end
|
21
|
+
|
22
|
+
def construction
|
23
|
+
map &:construction
|
24
|
+
end
|
25
|
+
|
26
|
+
def include?(x)
|
27
|
+
any?{|i| i.include? x}
|
28
|
+
end
|
29
|
+
|
30
|
+
def degenerate?
|
31
|
+
all? &:degenerate?
|
32
|
+
end
|
33
|
+
|
14
34
|
def simple?
|
15
35
|
false
|
16
36
|
end
|
data/lib/borel/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: borel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -53,7 +53,7 @@ files:
|
|
53
53
|
- spec/range_spec.rb
|
54
54
|
- tasks/gem.rb
|
55
55
|
- tasks/rspec.rb
|
56
|
-
homepage: http://github.com/
|
56
|
+
homepage: http://github.com/badosu/borel
|
57
57
|
licenses: []
|
58
58
|
post_install_message:
|
59
59
|
rdoc_options: []
|