Skip to content

Commit 4a0b0d0

Browse files
authored
Showing bitstrings as actual bitstrings in logs instead of integers (#19)
* Displaying bitstrings as actual bitstrings instead of integers * Cleaner syntax using defaultdict * Patch version bump
1 parent 17f8939 commit 4a0b0d0

File tree

3 files changed

+21
-21
lines changed

3 files changed

+21
-21
lines changed

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,19 @@ $ python -m demo.string_set
2727
[INFO] (CombCov) ...DONE enumerating elements! (Running time: 0.00 sec)
2828
[INFO] (CombCov) Total of 87 elements.
2929
[INFO] (CombCov) Enumeration: [1, 2, 3, 5, 8, 13, 21, 34]
30-
[INFO] (CombCov) Creating binary strings from rules...
31-
[INFO] (CombCov) Bitstring to cover: 154742504910672534362390527
30+
[INFO] (CombCov) Creating binary strings and rules...
31+
[INFO] (CombCov) Bitstring to cover: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
3232
[INFO] (StringSet) Generated 16 subrules
33-
[INFO] (CombCov) ...DONE creating binary strings! (Running time: 0.00 sec)
33+
[INFO] (CombCov) ...DONE creating binary strings and rules! (Running time: 0.00 sec)
3434
[INFO] (CombCov) Total of 14 valid rules with 14 distinct binary strings.
3535
[INFO] (CombCov) Searching for a cover for ''*Av(aa) over ∑={a,b}...
3636
[INFO] (CombCov) Gurobi installed on system and set as solver
3737
[INFO] (CombCov) ...DONE searching for a cover! (Running time: 0.02 sec)
3838
Solution found!
39-
- Rule #1: ''*Av(a,b) over ∑={a,b} with bitstring 1
40-
- Rule #2: 'a'*Av(a,b) over ∑={a,b} with bitstring 2
41-
- Rule #3: 'b'*Av(aa) over ∑={a,b} with bitstring 154742431132702343545997108
42-
- Rule #4: 'ab'*Av(aa) over ∑={a,b} with bitstring 73777970190816393416
39+
- Rule #1: ''*Av(b,a) over ∑={a,b} with bitstring 000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
40+
- Rule #2: 'a'*Av(b,a) over ∑={a,b} with bitstring 000000000000000000000000000000000000000000000000000000000000000000000000000000000000010
41+
- Rule #3: 'b'*Av(aa) over ∑={a,b} with bitstring 111111111111111111111000000000000011111111111110000000011111111000001111100011100110100
42+
- Rule #4: 'ab'*Av(aa) over ∑={a,b} with bitstring 000000000000000000000111111111111100000000000001111111100000000111110000011100011001000
4343
```
4444

4545

combcov/combcov.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import abc
22
import logging
3+
from collections import defaultdict
34
from time import time
45

56
from pulp import GUROBI_CMD, PULP_CBC_CMD, LpMinimize, LpProblem, LpVariable
@@ -48,20 +49,20 @@ def _create_binary_strings_from_rules(self):
4849
logger.info("Creating binary strings and rules...")
4950
time_start = time()
5051

51-
string_to_cover = 2 ** len(self.elmnts_dict) - 1
52-
logger.info("Bitstring to cover: {} ".format(string_to_cover))
52+
bitstring_to_cover = bin(2 ** len(self.elmnts_dict) - 1)[2:]
53+
logger.info("Bitstring to cover: {} ".format(bitstring_to_cover))
5354

5455
self.rules = []
5556
self.bitstrings = []
56-
self.bitstring_to_rules_dict = {}
57+
self.bitstring_to_rules_dict = defaultdict(list)
5758
self.rules_to_bitstring_dict = {}
5859

5960
for rule in self.root_object.get_subrules():
6061
if rule == self.root_object or rule in self.rules:
6162
rule_is_good = False
6263
else:
6364
rule_is_good = True
64-
binary_string = 0
65+
binary_number = 0
6566

6667
for elmnt_size in range(self.max_elmnt_size + 1):
6768
if not rule_is_good:
@@ -74,19 +75,18 @@ def _create_binary_strings_from_rules(self):
7475
break
7576
else:
7677
seen_elmnts.add(elmnt)
77-
binary_string += 2 ** (self.elmnts_dict[elmnt])
78+
binary_number += 2 ** (self.elmnts_dict[elmnt])
7879

7980
if rule_is_good:
81+
binary_string = "{:0>{}}".format(
82+
bin(binary_number)[2:], len(self.elmnts_dict))
83+
8084
self.rules.append(rule)
85+
self.bitstrings.append(binary_string) if \
86+
binary_string not in self.bitstrings else self.bitstrings
87+
self.bitstring_to_rules_dict[binary_string].append(rule)
8188
self.rules_to_bitstring_dict[rule] = binary_string
8289

83-
# ToDo: Use defaultdict for more readable syntax
84-
if binary_string not in self.bitstring_to_rules_dict:
85-
self.bitstrings.append(binary_string)
86-
self.bitstring_to_rules_dict[binary_string] = [rule]
87-
else:
88-
self.bitstring_to_rules_dict[binary_string].append(rule)
89-
9090
time_end = time()
9191
elapsed_time = time_end - time_start
9292

@@ -116,7 +116,7 @@ def _solve(self):
116116

117117
for i in range(len(self.elmnts_dict)): # nr. of equations
118118
constraint = sum(
119-
int((self.bitstrings[j] & (1 << i)) != 0) * X[j]
119+
int(self.bitstrings[j][-i]) * X[j]
120120
for j in range(len(self.bitstrings))
121121
) # nr. of variables x_j
122122
problem += constraint == 1

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def read(fname):
1111

1212
setup(
1313
name="CombCov",
14-
version="0.4.0",
14+
version="0.4.1",
1515
author="Permuta Triangle",
1616
author_email="permutatriangle@gmail.com",
1717
description="Searching for combinatorial covers.",

0 commit comments

Comments
 (0)