1
1
import abc
2
2
import logging
3
+ from collections import defaultdict
3
4
from time import time
4
5
5
6
from pulp import GUROBI_CMD , PULP_CBC_CMD , LpMinimize , LpProblem , LpVariable
@@ -48,20 +49,20 @@ def _create_binary_strings_from_rules(self):
48
49
logger .info ("Creating binary strings and rules..." )
49
50
time_start = time ()
50
51
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 ))
53
54
54
55
self .rules = []
55
56
self .bitstrings = []
56
- self .bitstring_to_rules_dict = {}
57
+ self .bitstring_to_rules_dict = defaultdict ( list )
57
58
self .rules_to_bitstring_dict = {}
58
59
59
60
for rule in self .root_object .get_subrules ():
60
61
if rule == self .root_object or rule in self .rules :
61
62
rule_is_good = False
62
63
else :
63
64
rule_is_good = True
64
- binary_string = 0
65
+ binary_number = 0
65
66
66
67
for elmnt_size in range (self .max_elmnt_size + 1 ):
67
68
if not rule_is_good :
@@ -74,19 +75,18 @@ def _create_binary_strings_from_rules(self):
74
75
break
75
76
else :
76
77
seen_elmnts .add (elmnt )
77
- binary_string += 2 ** (self .elmnts_dict [elmnt ])
78
+ binary_number += 2 ** (self .elmnts_dict [elmnt ])
78
79
79
80
if rule_is_good :
81
+ binary_string = "{:0>{}}" .format (
82
+ bin (binary_number )[2 :], len (self .elmnts_dict ))
83
+
80
84
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 )
81
88
self .rules_to_bitstring_dict [rule ] = binary_string
82
89
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
-
90
90
time_end = time ()
91
91
elapsed_time = time_end - time_start
92
92
@@ -116,7 +116,7 @@ def _solve(self):
116
116
117
117
for i in range (len (self .elmnts_dict )): # nr. of equations
118
118
constraint = sum (
119
- int (( self .bitstrings [j ] & ( 1 << i )) != 0 ) * X [j ]
119
+ int (self .bitstrings [j ][ - i ] ) * X [j ]
120
120
for j in range (len (self .bitstrings ))
121
121
) # nr. of variables x_j
122
122
problem += constraint == 1
0 commit comments