borel 0.0.1 → 0.1.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.
- data/README.md +87 -2
- data/lib/borel/interval.rb +22 -15
- data/lib/borel/nil_class.rb +5 -0
- data/lib/borel/version.rb +2 -2
- data/spec/interval_spec.rb +32 -6
- data/spec/nil_class_spec.rb +10 -0
- metadata +4 -2
data/README.md
CHANGED
@@ -1,6 +1,91 @@
|
|
1
1
|
Borel
|
2
2
|
=====
|
3
3
|
|
4
|
-
Borelian sets are sets formed by
|
4
|
+
Borelian sets are sets formed by enumerable union, intersection or complement, of intervals.
|
5
5
|
|
6
|
-
**Borel**
|
6
|
+
**Borel** enables performing regular operations on any ordered set.
|
7
|
+
|
8
|
+
**Borel** was mainly inspired on the **Intervals** [gem][1].
|
9
|
+
|
10
|
+
[1]: http://intervals.rubyforge.org
|
11
|
+
|
12
|
+
Usage
|
13
|
+
-----
|
14
|
+
|
15
|
+
### Initializing
|
16
|
+
|
17
|
+
An Interval can be initialized with an empty, one or two sized array (respectively for an _empty_, _degenerate_ or _simple_ interval), or an array of one or two sized arrays (for a _multiple_ interval).
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
Interval[]
|
21
|
+
Interval[1]
|
22
|
+
Interval[0,1]
|
23
|
+
Interval[[0,1],[2,3],[5]]
|
24
|
+
```
|
25
|
+
|
26
|
+
Another way to initialize an Interval is by using the **to_interval** method on Ranges or Numbers.
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
1.to_interval
|
30
|
+
(0..1).to_interval
|
31
|
+
(0...2).to_interval
|
32
|
+
```
|
33
|
+
|
34
|
+
The **Infinity** constant is available for specifying intervals with no upper or lower boundary.
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
Interval[-Infinity, 0]
|
38
|
+
Interval[1, Infinity]
|
39
|
+
Interval[-Infinity, Infinity]
|
40
|
+
```
|
41
|
+
|
42
|
+
### Properties
|
43
|
+
|
44
|
+
Some natural properties of intervals:
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
Interval[1].degenerate? # true
|
48
|
+
Interval[[0,1],[2,3]].simple? # false
|
49
|
+
Interval[].empty? # true
|
50
|
+
Interval[1,5].include?(3.4) # true
|
51
|
+
```
|
52
|
+
|
53
|
+
### Operations
|
54
|
+
|
55
|
+
* Complement
|
56
|
+
|
57
|
+
__complement__ and __~__
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
~Interval[0,5] == Interval[[-Infinity, 0], [5, Infinity]]
|
61
|
+
```
|
62
|
+
|
63
|
+
* Union
|
64
|
+
|
65
|
+
__union__, __|__ and __+__
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
Interval[0,5] | Interval[-1,3] == Interval[-1,5]
|
69
|
+
```
|
70
|
+
|
71
|
+
* Intersection
|
72
|
+
|
73
|
+
__intersect__, __&__, __^__
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
Interval[0,5] ^ Interval[-1,3] == Interval[0,3]
|
77
|
+
```
|
78
|
+
|
79
|
+
* Subtraction
|
80
|
+
|
81
|
+
__minus__ and __-__
|
82
|
+
|
83
|
+
```ruby
|
84
|
+
Interval[0,5] - Interval[-1,3] == Interval[3,5]
|
85
|
+
```
|
86
|
+
|
87
|
+
### Remarks
|
88
|
+
|
89
|
+
* At the moment there is no distinction between **open** and **closed** intervals.
|
90
|
+
|
91
|
+
* There is limited support for non-numeric classes intervals
|
data/lib/borel/interval.rb
CHANGED
@@ -71,18 +71,6 @@ class Interval
|
|
71
71
|
[other.to_interval, self]
|
72
72
|
end
|
73
73
|
|
74
|
-
def +(other)
|
75
|
-
self | other
|
76
|
-
end
|
77
|
-
|
78
|
-
def ^(other)
|
79
|
-
self & other
|
80
|
-
end
|
81
|
-
|
82
|
-
def |(other)
|
83
|
-
Interval.union(other.to_interval, self)
|
84
|
-
end
|
85
|
-
|
86
74
|
def empty?
|
87
75
|
components.empty?
|
88
76
|
end
|
@@ -99,9 +87,25 @@ class Interval
|
|
99
87
|
end
|
100
88
|
end
|
101
89
|
|
90
|
+
def union(other)
|
91
|
+
Interval.union(other.to_interval, self)
|
92
|
+
end
|
93
|
+
|
94
|
+
def +(other)
|
95
|
+
self | other
|
96
|
+
end
|
97
|
+
|
98
|
+
def ^(other)
|
99
|
+
self & other
|
100
|
+
end
|
101
|
+
|
102
|
+
def |(other)
|
103
|
+
self.union other.to_interval
|
104
|
+
end
|
105
|
+
|
102
106
|
[[:&, :intersect]].each do |op, meth|
|
103
107
|
define_method(op) {|other|
|
104
|
-
(other.to_interval.map{|y| map{|x| x.send(meth,y)}}.flatten).reduce(:|)
|
108
|
+
(other.to_interval.map{|y| map{|x| x.send(meth,y)}}.flatten).reduce(:|) || Interval[]
|
105
109
|
}
|
106
110
|
end
|
107
111
|
|
@@ -113,7 +117,11 @@ class Interval
|
|
113
117
|
|
114
118
|
[[:-, :minus]].each do |op, meth|
|
115
119
|
define_method(op) {|other|
|
116
|
-
|
120
|
+
if other.empty?
|
121
|
+
self
|
122
|
+
else
|
123
|
+
map{|x| other.to_interval.map{|y| x.send(meth,y)}.reduce(:&)}.flatten.reduce(:|) || Interval[]
|
124
|
+
end
|
117
125
|
}
|
118
126
|
end
|
119
127
|
end
|
@@ -180,7 +188,6 @@ class Interval::Simple < Interval
|
|
180
188
|
end
|
181
189
|
|
182
190
|
class Interval::Multiple < Interval
|
183
|
-
|
184
191
|
attr :components
|
185
192
|
|
186
193
|
def initialize(array)
|
data/lib/borel/version.rb
CHANGED
data/spec/interval_spec.rb
CHANGED
@@ -3,13 +3,15 @@ require 'borel/interval'
|
|
3
3
|
describe Interval do
|
4
4
|
context '#intersection' do
|
5
5
|
|
6
|
+
it "[]^[] = []" do
|
7
|
+
(Interval[] ^ Interval[]).should eq Interval[]
|
8
|
+
end
|
9
|
+
|
6
10
|
it "[]^[0,3] = []" do
|
7
|
-
pending
|
8
11
|
(Interval[] ^ Interval[0,3]).should eq Interval[]
|
9
12
|
end
|
10
13
|
|
11
14
|
it "[0,3]^[] = []" do
|
12
|
-
pending
|
13
15
|
(Interval[0,3] ^ Interval[]).should eq Interval[]
|
14
16
|
end
|
15
17
|
|
@@ -31,6 +33,18 @@ describe Interval do
|
|
31
33
|
end
|
32
34
|
|
33
35
|
context '#union' do
|
36
|
+
it "[]U[] = []" do
|
37
|
+
(Interval[] | Interval[]).should eq Interval[]
|
38
|
+
end
|
39
|
+
|
40
|
+
it "[]U[1,2] = [1,2]" do
|
41
|
+
(Interval[] | Interval[1,2]).should eq Interval[1,2]
|
42
|
+
end
|
43
|
+
|
44
|
+
it "[1,2]U[] = [1,2]" do
|
45
|
+
(Interval[1,2] | Interval[]).should eq Interval[1,2]
|
46
|
+
end
|
47
|
+
|
34
48
|
it "[0,3]U[1,2] = [0,3]" do
|
35
49
|
(Interval[0,3] | Interval[1,2]).should eq Interval[0,3]
|
36
50
|
end
|
@@ -53,6 +67,18 @@ describe Interval do
|
|
53
67
|
end
|
54
68
|
|
55
69
|
context '#minus' do
|
70
|
+
it "[]-[] = []" do
|
71
|
+
(Interval[] - Interval[]).should eq Interval[]
|
72
|
+
end
|
73
|
+
|
74
|
+
it "[1,2]-[] = [1,2]" do
|
75
|
+
(Interval[1,2] - Interval[]).should eq Interval[1,2]
|
76
|
+
end
|
77
|
+
|
78
|
+
it "[]-[1,2] = []" do
|
79
|
+
(Interval[] - Interval[1,2]).should eq Interval[]
|
80
|
+
end
|
81
|
+
|
56
82
|
it "[2,3]-(0,1) = [2,3]" do
|
57
83
|
(Interval[2,3] - Interval[0,1]).should eq Interval[2,3]
|
58
84
|
end
|
@@ -70,7 +96,7 @@ describe Interval do
|
|
70
96
|
end
|
71
97
|
|
72
98
|
it '[0,1]-(0,1) = [0]U[1]' do
|
73
|
-
(Interval[0,1] - Interval[0,1]).should eq Interval[0]
|
99
|
+
(Interval[0,1] - Interval[0,1]).should eq Interval[[0],[1]]
|
74
100
|
end
|
75
101
|
|
76
102
|
it '[1,2]-(2,3) = [1,2]' do
|
@@ -90,7 +116,7 @@ describe Interval do
|
|
90
116
|
end
|
91
117
|
|
92
118
|
it '[1,4]-(1,3) = [1]U[3,4]' do
|
93
|
-
(Interval[1,4] - Interval[1,3]).should eq Interval[3,4]
|
119
|
+
(Interval[1,4] - Interval[1,3]).should eq Interval[[1],[3,4]]
|
94
120
|
end
|
95
121
|
|
96
122
|
it '[1,4]-(1,5) = [1]' do
|
@@ -98,7 +124,7 @@ describe Interval do
|
|
98
124
|
end
|
99
125
|
|
100
126
|
it '[1,3]-(2,3) = [1,2]U[3]' do
|
101
|
-
(Interval[1,3] - Interval[2,3]).should eq Interval[1,2]
|
127
|
+
(Interval[1,3] - Interval[2,3]).should eq Interval[[1,2],[3]]
|
102
128
|
end
|
103
129
|
|
104
130
|
it '[1,3]-(0,3) = [3]' do
|
@@ -106,7 +132,7 @@ describe Interval do
|
|
106
132
|
end
|
107
133
|
|
108
134
|
it '[-infty,infty]-[0,1] = [-infty,0]U[1,infty]' do
|
109
|
-
(Interval[-Infinity,Infinity] - Interval[0,1]).should eq Interval[-Infinity,0]
|
135
|
+
(Interval[-Infinity,Infinity] - Interval[0,1]).should eq Interval[[-Infinity,0],[1,Infinity]]
|
110
136
|
end
|
111
137
|
|
112
138
|
it '[0,1]-[-infty,infty] = []' do
|
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.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-13 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Borel sets are made of enumerable union and intersection of intervals.
|
15
15
|
Borel performs regular set operations on any interval of a Comparable class.
|
@@ -27,10 +27,12 @@ files:
|
|
27
27
|
- borel.gemspec
|
28
28
|
- lib/borel.rb
|
29
29
|
- lib/borel/interval.rb
|
30
|
+
- lib/borel/nil_class.rb
|
30
31
|
- lib/borel/numeric.rb
|
31
32
|
- lib/borel/range.rb
|
32
33
|
- lib/borel/version.rb
|
33
34
|
- spec/interval_spec.rb
|
35
|
+
- spec/nil_class_spec.rb
|
34
36
|
- spec/range_spec.rb
|
35
37
|
- tasks/gem.rb
|
36
38
|
- tasks/rspec.rb
|