setfu 3.0.1 → 3.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.
- checksums.yaml +5 -5
- data/README.md +80 -4
- data/lib/setfu.rb +182 -0
- data/lib/setfu/version.rb +1 -1
- data/setfu.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6835cd9233c1ac203c4fafe4e768e9f8bb9516cc0117c3bf09af283e00701501
|
4
|
+
data.tar.gz: 1e7ada3f3e973a852920d6c7f63370be29850cc1ebd734e02de078071a764520
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21568cf5048c7c855958a91f2c092936e1e4033a902b5bf18d3d6f5ff69914559205ce6539d5e2d1cebe355bd4fda58e21e60d7338315869c8572d53f8d5035a
|
7
|
+
data.tar.gz: 90ca1f585914e530cf9d05241c9d6cc3aeb6b49fcce4777b803512d7c6df767d7e5c24cf387d76d5e1fa18dccd8fcd0d30bfb96444846b4120a6d324f01d9197
|
data/README.md
CHANGED
@@ -131,6 +131,7 @@ aaa < aaa # false
|
|
131
131
|
BitSet defines array access operators `:[]` and `:[]=` as it it were an array of bits.
|
132
132
|
If you pass an Integer type, you will get `true` (if member of set) or `false`.
|
133
133
|
Anything else will return a BitSet instance. You can also set or clear members of the set as well.
|
134
|
+
Note that more than one value can be set or cleared.
|
134
135
|
See the example below:
|
135
136
|
|
136
137
|
```ruby
|
@@ -176,6 +177,29 @@ Recursion is used to unravel the Array.
|
|
176
177
|
|
177
178
|
These methods remove elements from the BitSet instance if they exist.
|
178
179
|
|
180
|
+
#### bitset.neighbor(no_vars,direction)
|
181
|
+
|
182
|
+
This is used in a Karnaugh map to find adjacent neighboring cell coordinates.
|
183
|
+
The current bitset instance contains the initial vector in the table.
|
184
|
+
It is best to use the BitSet.int(initial_coordinate) as the constructor.
|
185
|
+
Note that for each variable used in the map, the self-same number determines the total possible number of neighbors.
|
186
|
+
The direction has values `0` to `(no_vars-1)`.
|
187
|
+
For a 5-variable system, we can have left, right, up, down, or over for possible connecting cells.
|
188
|
+
This method is extensively used in the upcoming `gatefu` gem which deals with logic systems.
|
189
|
+
|
190
|
+
|
191
|
+
#### bitset.double, bitset.double!
|
192
|
+
|
193
|
+
This method doubles the entropy and copies the original bottom to the top half.
|
194
|
+
This doubles the number of elements.
|
195
|
+
The bang version self-modifies while the non-bang version creates a new instance.
|
196
|
+
|
197
|
+
#### bitset.swap(position1, position2), bitset.swap!(position1, position2)
|
198
|
+
|
199
|
+
This method looks up the values of position1, and position2 and stores them in swapping fashion.
|
200
|
+
The bang version self modifies, while the non-bang version returns a new instance (without modification of original).
|
201
|
+
|
202
|
+
|
179
203
|
#### bitset.include?(item)
|
180
204
|
|
181
205
|
Returns true if p is a subset. Parameter `p` can be:
|
@@ -189,6 +213,10 @@ Returns true if there are no elements in the BitSet instance.
|
|
189
213
|
|
190
214
|
This removes all elements from the BitSet instance making it empty. Self-modifies.
|
191
215
|
|
216
|
+
#### bitset.set_all!
|
217
|
+
|
218
|
+
This sets all possible elements of the set (up to the entropy).
|
219
|
+
|
192
220
|
#### bitset.dup
|
193
221
|
|
194
222
|
This create and returns a duplicate copy of the BitSet instance.
|
@@ -215,7 +243,7 @@ This routine is computationally slow as each bit must be examined.
|
|
215
243
|
#### bitset.to_ra(int=true, th=3)
|
216
244
|
|
217
245
|
This returns as array filled with either integers or ranges of integers. The threshold parameter decides the minimum range size
|
218
|
-
that will be used. The minimum value is 2. The `int` parameter when set to false will return string characters and string ranges.
|
246
|
+
that will be used. The minimum allowed value for `th` is 2. The `int` parameter when set to false will return string characters and string ranges.
|
219
247
|
This routine is computationally slow as each bit must be examined.
|
220
248
|
|
221
249
|
#### bitset.set_bits!(n)
|
@@ -230,7 +258,7 @@ This returns the current entropy number of the set. You can also set this proper
|
|
230
258
|
like the universe entropy can only increase.
|
231
259
|
|
232
260
|
#### bitset.entropy_2n!
|
233
|
-
This sets the entropy number to the nearest 2**n that will contain the highest set element.
|
261
|
+
This sets the entropy number to the nearest `2**n` that will contain the highest set element.
|
234
262
|
|
235
263
|
#### bitset.first(int=true), bitset.first!(int=true)
|
236
264
|
This returns the first element of the set, or nil if the set is empty.
|
@@ -354,7 +382,47 @@ This bisects the set into two roughly equally sized sets and returns an array of
|
|
354
382
|
The first set contains the lower elements, while the second set contains the higher elements.
|
355
383
|
The bang version retaines the lower elements are returns the higher elements.
|
356
384
|
|
357
|
-
###
|
385
|
+
### Utility Methods on standard objects
|
386
|
+
|
387
|
+
#### array.pop2
|
388
|
+
This is similar to `array.pop(2)` except that the returning array is reversed.
|
389
|
+
|
390
|
+
#### array.stack_swap
|
391
|
+
This reverses the data values of the last two elements of the array.
|
392
|
+
|
393
|
+
#### array.stack_rot
|
394
|
+
This rotates the last three values of the array as seen the the example below:
|
395
|
+
```ruby
|
396
|
+
array = [1,2,3,4,5]
|
397
|
+
array.stack_rot # [1, 2, 5, 3, 4]
|
398
|
+
```
|
399
|
+
|
400
|
+
#### array.peek(pos=0)
|
401
|
+
This indexes the array from right to left.
|
402
|
+
|
403
|
+
#### array.ascending?
|
404
|
+
Returns true if elements of the array are sorted in ascending order, have two or more elements, and first element not equal to last element.
|
405
|
+
|
406
|
+
#### array.descending?
|
407
|
+
Returns true if elements of the array are sorted in descending order, have two or more elements, and first element not equal to last element.
|
408
|
+
|
409
|
+
#### array.sorted?
|
410
|
+
Returns true if elements of the array are sorted in either ascending or descending order, and have one or more elements.
|
411
|
+
|
412
|
+
### BitSet Class Methods
|
413
|
+
|
414
|
+
#### BitSet.generate_pattern(num_bits, zero_first_flag, num_zeros, num_ones)
|
415
|
+
This generates BitSet instance with a pattern of contiguous ones(elements of the set) and zeros(voids of the set)
|
416
|
+
starting from position zero and stopping on the num_bits parameter. See the example below:
|
417
|
+
|
418
|
+
```ruby
|
419
|
+
bs = BitSet.generate_pattern(19, false, 3, 5)
|
420
|
+
bs.to_ra # [0..4, 8..12, 16..18]
|
421
|
+
```
|
422
|
+
|
423
|
+
#### BitSet.int(int, ent=nil)
|
424
|
+
This constructor sets the internal Integer instance to `int` and if provided, sets the internal entropy to `ent`.
|
425
|
+
If not provided, the entropy will be automatically calculated.
|
358
426
|
|
359
427
|
### BitSet.fill(num_elements, start=0)
|
360
428
|
This constructs a BitSet instance with contiguous values set to the parameter `num_elements`.
|
@@ -556,7 +624,7 @@ This utility method converts elements of the array to BitSets instances.
|
|
556
624
|
During the reduction process some items in the array get tagged. This routine clears such tagging.
|
557
625
|
This is a utility method called by the `#reduce_tuples` method.
|
558
626
|
|
559
|
-
###case subsumption operator ===
|
627
|
+
### case subsumption operator ===
|
560
628
|
The `===` operator has special meaning in ruby. It is known as the case subsumption operator.
|
561
629
|
It is used during the `case when` statements as its comparison means.
|
562
630
|
The left side of the operator's type is the owner and defines what it means to have the right side passed to it.
|
@@ -646,6 +714,14 @@ the right opperand takes precedence however.
|
|
646
714
|
|
647
715
|
## Revision History
|
648
716
|
|
717
|
+
### Version 3.1.0
|
718
|
+
|
719
|
+
* added BitSet.int constructor
|
720
|
+
* added BitSet.generate_pattern constructor
|
721
|
+
* added BitSet methods: neighbor, double, double!, swap, swap! set_all!
|
722
|
+
* added Array stack methods: pop2, stack_swap, stack_rot, peek
|
723
|
+
* added Array utility methods: ascending?, descending?, sorted?
|
724
|
+
|
649
725
|
### Version 3.0.1
|
650
726
|
|
651
727
|
* updated @@TRANS_HASH to include missing translation: (422,640)
|
data/lib/setfu.rb
CHANGED
@@ -15,6 +15,188 @@ class Object
|
|
15
15
|
better_install_as!(:delete_many_at, :setfu_delete_many_at)
|
16
16
|
end
|
17
17
|
|
18
|
+
###
|
19
|
+
### Version 3.2.0 additions
|
20
|
+
###
|
21
|
+
|
22
|
+
# ::TODO:: add document
|
23
|
+
class Array
|
24
|
+
def stack_swap
|
25
|
+
a = pop
|
26
|
+
b = pop
|
27
|
+
push a
|
28
|
+
push b
|
29
|
+
end
|
30
|
+
def stack_rot
|
31
|
+
a = pop
|
32
|
+
b = pop
|
33
|
+
c = pop
|
34
|
+
push a
|
35
|
+
push c
|
36
|
+
push b
|
37
|
+
end
|
38
|
+
def pop2
|
39
|
+
a = pop
|
40
|
+
b = pop
|
41
|
+
return [a,b]
|
42
|
+
end
|
43
|
+
def peek(n=0)
|
44
|
+
return self[count-n-1]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# ::TODO:: add document
|
49
|
+
class Array # additions to be used by other future gems:
|
50
|
+
def ascending?
|
51
|
+
return false unless count >=2
|
52
|
+
cnt = self.length - 1
|
53
|
+
cnt.times do |ii|
|
54
|
+
return false unless self[ii+1] >= self[ii]
|
55
|
+
end
|
56
|
+
return false if first==last # ascending means something has to get bigger
|
57
|
+
true
|
58
|
+
end
|
59
|
+
def descending?
|
60
|
+
return false unless count >=2
|
61
|
+
cnt = self.length - 1
|
62
|
+
cnt.times do |ii|
|
63
|
+
return false unless self[ii+1] <= self[ii]
|
64
|
+
end
|
65
|
+
return false if first==last # descending means something has to get smaller
|
66
|
+
true
|
67
|
+
end
|
68
|
+
def sorted?
|
69
|
+
return false unless count >=1
|
70
|
+
return true if (self & self).count == 1 # [4,4,4,4] is sorted, but not ascending or desending
|
71
|
+
return true if ascending?
|
72
|
+
return true if descending?
|
73
|
+
false
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# ::TODO:: add document
|
78
|
+
class BitSet
|
79
|
+
def swap!(pos1,pos2)
|
80
|
+
self[pos1],self[pos2] = self[pos2], self[pos1]
|
81
|
+
self
|
82
|
+
end
|
83
|
+
def swap(pos1,pos2)
|
84
|
+
bs = dup
|
85
|
+
bs[pos1],bs[pos2] = self[pos2], self[pos1]
|
86
|
+
bs
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# ::TODO:: add document
|
91
|
+
# this routine takes a linear binary table and finds a coordinate neighbor.
|
92
|
+
# not to be confused with finding a neighbor in a Logic Map.
|
93
|
+
# of a given map
|
94
|
+
class BitSet
|
95
|
+
def neighbor(nvars, dir)
|
96
|
+
raise "too many neighbors for #{nvars} variables" if dir >= nvars
|
97
|
+
raise "dir must be positive" if dir.negative?
|
98
|
+
rtn = dup
|
99
|
+
|
100
|
+
if 1==nvars # two squares
|
101
|
+
rtn[dir]=!self[dir]
|
102
|
+
elsif 2==nvars # a 2x2 box
|
103
|
+
if 0==dir
|
104
|
+
rtn[0]=!self[0]
|
105
|
+
else
|
106
|
+
rtn[1]=!self[1]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
# now programmatically do the remaining pattern
|
110
|
+
if nvars.even?
|
111
|
+
if dir.even? # up if dir==0 and nvars==4 ... left if dir==2 and nvars==4
|
112
|
+
rtn[dir]=self[dir+1]
|
113
|
+
rtn[dir+1]=!self[dir]
|
114
|
+
else # down if dir ==1 and nvars==4 ... right if dir==3 and nvars==4
|
115
|
+
rtn[dir-1]=!self[dir] # modified on dec 21, 2019 9:34AM
|
116
|
+
rtn[dir]=self[dir-1]
|
117
|
+
end
|
118
|
+
else # odd .......... compare with neighbor5 dir [0,1,2,3,4]
|
119
|
+
if dir==(nvars-1) # dir==4
|
120
|
+
rtn[dir]=!self[dir]
|
121
|
+
elsif dir.even? # 0,2 validated
|
122
|
+
rtn[dir]=self[dir+1]
|
123
|
+
rtn[dir+1]=!self[dir]
|
124
|
+
else # 1,3 validated
|
125
|
+
rtn[dir-1]=!self[dir]
|
126
|
+
rtn[dir]=self[dir-1]
|
127
|
+
end
|
128
|
+
end
|
129
|
+
return rtn
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# this one will get added to setfu soon.
|
134
|
+
class BitSet
|
135
|
+
def self.generate_pattern(nbits, flag_zero_first, zeros, ones )
|
136
|
+
bs = BitSet.new
|
137
|
+
bs.entropy = nbits
|
138
|
+
return bs if ones<=0
|
139
|
+
return bs | [0..(nbits-1)] if zeros<=0
|
140
|
+
k=0
|
141
|
+
hash = {:zero => zeros, :one => ones}
|
142
|
+
if flag_zero_first
|
143
|
+
ptr = :zero
|
144
|
+
val = false
|
145
|
+
else
|
146
|
+
ptr = :one
|
147
|
+
val = true
|
148
|
+
end
|
149
|
+
nbits.times do |ii|
|
150
|
+
if (k >= hash[ptr])
|
151
|
+
k = 1
|
152
|
+
val = !val
|
153
|
+
ptr = (ptr == :zero) ? :one : :zero
|
154
|
+
else
|
155
|
+
k += 1
|
156
|
+
end
|
157
|
+
bs[ii] = val
|
158
|
+
end
|
159
|
+
return bs
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
# add this one to setfu ... also create non bang version
|
164
|
+
class BitSet
|
165
|
+
def double!
|
166
|
+
@bits |= @bits << @entropy
|
167
|
+
@entropy <<= 1
|
168
|
+
self
|
169
|
+
end
|
170
|
+
def double
|
171
|
+
dup.double!
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
# this should be added to gem ...
|
176
|
+
class BitSet
|
177
|
+
def self.int(int,ent=nil)
|
178
|
+
bs = BitSet.new
|
179
|
+
bs.set_bits!(int)
|
180
|
+
if ent.nil?
|
181
|
+
bs.recalculate_entropy!
|
182
|
+
else
|
183
|
+
bs.entropy=ent
|
184
|
+
end
|
185
|
+
bs
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
class BitSet
|
190
|
+
def set_all! # set all possible bits ... make sure this does not already exist ... if it does, then use the proper name
|
191
|
+
bits = (2 ** entropy) - 1
|
192
|
+
set_bits! bits
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
###
|
197
|
+
### Version 3.1.0 and older
|
198
|
+
###
|
199
|
+
|
18
200
|
module Setfu
|
19
201
|
def self.bset_elements(ary)
|
20
202
|
ary.count.times do |ii|
|
data/lib/setfu/version.rb
CHANGED
data/setfu.gemspec
CHANGED
@@ -26,7 +26,7 @@ When characters are used, the ordinate value sets the element bit of the interna
|
|
26
26
|
spec.add_runtime_dependency 'pred', '~> 0.1', '>= 0.1.2'
|
27
27
|
spec.add_runtime_dependency 'betterobject', '~> 1.2', '>= 1.2.0'
|
28
28
|
spec.add_runtime_dependency 'yieldhelper', '~> 0.1', '>= 0.1.0'
|
29
|
-
spec.add_runtime_dependency 'primitive_wrapper', '~> 2', '>= 2.
|
29
|
+
spec.add_runtime_dependency 'primitive_wrapper', '~> 2', '>= 2.3.0'
|
30
30
|
|
31
31
|
spec.add_development_dependency "bundler", "~> 1.3"
|
32
32
|
spec.add_development_dependency 'rake', '~> 10.1', '>= 10.1.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: setfu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Colvin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pred
|
@@ -79,7 +79,7 @@ dependencies:
|
|
79
79
|
version: '2'
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 2.
|
82
|
+
version: 2.3.0
|
83
83
|
type: :runtime
|
84
84
|
prerelease: false
|
85
85
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -89,7 +89,7 @@ dependencies:
|
|
89
89
|
version: '2'
|
90
90
|
- - ">="
|
91
91
|
- !ruby/object:Gem::Version
|
92
|
-
version: 2.
|
92
|
+
version: 2.3.0
|
93
93
|
- !ruby/object:Gem::Dependency
|
94
94
|
name: bundler
|
95
95
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
206
206
|
version: '0'
|
207
207
|
requirements: []
|
208
208
|
rubyforge_project:
|
209
|
-
rubygems_version: 2.
|
209
|
+
rubygems_version: 2.7.6
|
210
210
|
signing_key:
|
211
211
|
specification_version: 4
|
212
212
|
summary: Set class
|