Skip to content

Commit 9150869

Browse files
committed
fix tests
1 parent 2ab8f57 commit 9150869

22 files changed

+634
-369
lines changed

issue17a.lp

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
\Problem name:
2+
3+
Minimize
4+
OBJROW: 7740 item0_in_bin1 + 489 item1_in_bin1 + 152 item2_in_bin1 + 3410 item3_in_bin1 + 9948 item4_in_bin1 + 7862 item5_in_bin1 + 8519 item6_in_bin1 + 3212 item7_in_bin1 + 8798 item8_in_bin1 + 4979 item9_in_bin1
5+
+ 2178 item10_in_bin1 + 5984 item11_in_bin1 + 2518 item12_in_bin1 + 3270 item13_in_bin1 + 7183 item14_in_bin1
6+
Subject To
7+
constr(0): item0_in_bin0 >= 0
8+
constr(1): item1_in_bin0 >= 0
9+
constr(2): item2_in_bin0 >= 0
10+
constr(3): item3_in_bin0 >= 0
11+
constr(4): item4_in_bin0 >= 0
12+
constr(5): item5_in_bin0 >= 0
13+
constr(6): item6_in_bin0 >= 0
14+
constr(7): item7_in_bin0 >= 0
15+
constr(8): item8_in_bin0 >= 0
16+
constr(9): item9_in_bin0 >= 0
17+
constr(10): item10_in_bin0 >= 0
18+
constr(11): item11_in_bin0 >= 0
19+
constr(12): item12_in_bin0 >= 0
20+
constr(13): item13_in_bin0 >= 0
21+
constr(14): item14_in_bin0 >= 0
22+
constr(15): item0_in_bin1 >= 0
23+
constr(16): item1_in_bin1 >= 0
24+
constr(17): item2_in_bin1 >= 0
25+
constr(18): item3_in_bin1 >= 0
26+
constr(19): item4_in_bin1 >= 0
27+
constr(20): item5_in_bin1 >= 0
28+
constr(21): item6_in_bin1 >= 0
29+
constr(22): item7_in_bin1 >= 0
30+
constr(23): item8_in_bin1 >= 0
31+
constr(24): item9_in_bin1 >= 0
32+
constr(25): item10_in_bin1 >= 0
33+
constr(26): item11_in_bin1 >= 0
34+
constr(27): item12_in_bin1 >= 0
35+
constr(28): item13_in_bin1 >= 0
36+
constr(29): item14_in_bin1 >= 0
37+
constr(30): item0_in_bin0 + item0_in_bin1 = 1
38+
constr(31): item1_in_bin0 + item1_in_bin1 = 1
39+
constr(32): item2_in_bin0 + item2_in_bin1 = 1
40+
constr(33): item3_in_bin0 + item3_in_bin1 = 1
41+
constr(34): item4_in_bin0 + item4_in_bin1 = 1
42+
constr(35): item5_in_bin0 + item5_in_bin1 = 1
43+
constr(36): item6_in_bin0 + item6_in_bin1 = 1
44+
constr(37): item7_in_bin0 + item7_in_bin1 = 1
45+
constr(38): item8_in_bin0 + item8_in_bin1 = 1
46+
constr(39): item9_in_bin0 + item9_in_bin1 = 1
47+
constr(40): item10_in_bin0 + item10_in_bin1 = 1
48+
constr(41): item11_in_bin0 + item11_in_bin1 = 1
49+
constr(42): item12_in_bin0 + item12_in_bin1 = 1
50+
constr(43): item13_in_bin0 + item13_in_bin1 = 1
51+
constr(44): item14_in_bin0 + item14_in_bin1 = 1
52+
constr(45): -7740 item0_in_bin0 + 7740 item0_in_bin1 -489 item1_in_bin0 + 489 item1_in_bin1 -152 item2_in_bin0 + 152 item2_in_bin1 -3410 item3_in_bin0 + 3410 item3_in_bin1 -9948 item4_in_bin0 + 9948 item4_in_bin1
53+
-7862 item5_in_bin0 + 7862 item5_in_bin1 -8519 item6_in_bin0 + 8519 item6_in_bin1 -3212 item7_in_bin0 + 3212 item7_in_bin1 -8798 item8_in_bin0 + 8798 item8_in_bin1 -4979 item9_in_bin0 + 4979 item9_in_bin1
54+
-2178 item10_in_bin0 + 2178 item10_in_bin1 -5984 item11_in_bin0 + 5984 item11_in_bin1 -2518 item12_in_bin0 + 2518 item12_in_bin1 -3270 item13_in_bin0 + 3270 item13_in_bin1 -7183 item14_in_bin0 + 7183 item14_in_bin1
55+
>= -0
56+
Bounds
57+
Integers
58+
item0_in_bin0 item0_in_bin1 item1_in_bin0 item1_in_bin1 item2_in_bin0 item2_in_bin1 item3_in_bin0 item3_in_bin1 item4_in_bin0 item4_in_bin1
59+
item5_in_bin0 item5_in_bin1 item6_in_bin0 item6_in_bin1 item7_in_bin0 item7_in_bin1 item8_in_bin0 item8_in_bin1 item9_in_bin0 item9_in_bin1
60+
item10_in_bin0 item10_in_bin1 item11_in_bin0 item11_in_bin1 item12_in_bin0 item12_in_bin1 item13_in_bin0 item13_in_bin1 item14_in_bin0 item14_in_bin1
61+
End

issue17a.sol

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
item0_in_bin0 = 1
2+
item1_in_bin0 = 1
3+
item2_in_bin0 = 1
4+
item3_in_bin0 = 1
5+
item4_in_bin0 = 1
6+
item5_in_bin0 = 1
7+
item6_in_bin0 = 1
8+
item7_in_bin0 = 0
9+
item8_in_bin0 = 0
10+
item9_in_bin0 = 0
11+
item10_in_bin0 = 0
12+
item11_in_bin0 = 0
13+
item12_in_bin0 = 0
14+
item13_in_bin0 = 0
15+
item14_in_bin0 = 0
16+
item0_in_bin1 = 0
17+
item1_in_bin1 = 0
18+
item2_in_bin1 = 0
19+
item3_in_bin1 = 0
20+
item4_in_bin1 = 0
21+
item5_in_bin1 = 0
22+
item6_in_bin1 = 0
23+
item7_in_bin1 = 1
24+
item8_in_bin1 = 1
25+
item9_in_bin1 = 1
26+
item10_in_bin1 = 1
27+
item11_in_bin1 = 1
28+
item12_in_bin1 = 1
29+
item13_in_bin1 = 1
30+
item14_in_bin1 = 1

issue17b.lp

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
\Problem name:
2+
3+
Minimize
4+
OBJROW: 152 item0_in_bin1 + 489 item1_in_bin1 + 2178 item2_in_bin1 + 2518 item3_in_bin1 + 3212 item4_in_bin1 + 3270 item5_in_bin1 + 3410 item6_in_bin1 + 4979 item7_in_bin1 + 5984 item8_in_bin1 + 7183 item9_in_bin1
5+
+ 7740 item10_in_bin1 + 7862 item11_in_bin1 + 8519 item12_in_bin1 + 8798 item13_in_bin1 + 9948 item14_in_bin1
6+
Subject To
7+
constr(0): item0_in_bin0 >= 0
8+
constr(1): item1_in_bin0 >= 0
9+
constr(2): item2_in_bin0 >= 0
10+
constr(3): item3_in_bin0 >= 0
11+
constr(4): item4_in_bin0 >= 0
12+
constr(5): item5_in_bin0 >= 0
13+
constr(6): item6_in_bin0 >= 0
14+
constr(7): item7_in_bin0 >= 0
15+
constr(8): item8_in_bin0 >= 0
16+
constr(9): item9_in_bin0 >= 0
17+
constr(10): item10_in_bin0 >= 0
18+
constr(11): item11_in_bin0 >= 0
19+
constr(12): item12_in_bin0 >= 0
20+
constr(13): item13_in_bin0 >= 0
21+
constr(14): item14_in_bin0 >= 0
22+
constr(15): item0_in_bin1 >= 0
23+
constr(16): item1_in_bin1 >= 0
24+
constr(17): item2_in_bin1 >= 0
25+
constr(18): item3_in_bin1 >= 0
26+
constr(19): item4_in_bin1 >= 0
27+
constr(20): item5_in_bin1 >= 0
28+
constr(21): item6_in_bin1 >= 0
29+
constr(22): item7_in_bin1 >= 0
30+
constr(23): item8_in_bin1 >= 0
31+
constr(24): item9_in_bin1 >= 0
32+
constr(25): item10_in_bin1 >= 0
33+
constr(26): item11_in_bin1 >= 0
34+
constr(27): item12_in_bin1 >= 0
35+
constr(28): item13_in_bin1 >= 0
36+
constr(29): item14_in_bin1 >= 0
37+
constr(30): item0_in_bin0 + item0_in_bin1 = 1
38+
constr(31): item1_in_bin0 + item1_in_bin1 = 1
39+
constr(32): item2_in_bin0 + item2_in_bin1 = 1
40+
constr(33): item3_in_bin0 + item3_in_bin1 = 1
41+
constr(34): item4_in_bin0 + item4_in_bin1 = 1
42+
constr(35): item5_in_bin0 + item5_in_bin1 = 1
43+
constr(36): item6_in_bin0 + item6_in_bin1 = 1
44+
constr(37): item7_in_bin0 + item7_in_bin1 = 1
45+
constr(38): item8_in_bin0 + item8_in_bin1 = 1
46+
constr(39): item9_in_bin0 + item9_in_bin1 = 1
47+
constr(40): item10_in_bin0 + item10_in_bin1 = 1
48+
constr(41): item11_in_bin0 + item11_in_bin1 = 1
49+
constr(42): item12_in_bin0 + item12_in_bin1 = 1
50+
constr(43): item13_in_bin0 + item13_in_bin1 = 1
51+
constr(44): item14_in_bin0 + item14_in_bin1 = 1
52+
constr(45): -152 item0_in_bin0 + 152 item0_in_bin1 -489 item1_in_bin0 + 489 item1_in_bin1 -2178 item2_in_bin0 + 2178 item2_in_bin1 -2518 item3_in_bin0 + 2518 item3_in_bin1 -3212 item4_in_bin0 + 3212 item4_in_bin1
53+
-3270 item5_in_bin0 + 3270 item5_in_bin1 -3410 item6_in_bin0 + 3410 item6_in_bin1 -4979 item7_in_bin0 + 4979 item7_in_bin1 -5984 item8_in_bin0 + 5984 item8_in_bin1 -7183 item9_in_bin0 + 7183 item9_in_bin1
54+
-7740 item10_in_bin0 + 7740 item10_in_bin1 -7862 item11_in_bin0 + 7862 item11_in_bin1 -8519 item12_in_bin0 + 8519 item12_in_bin1 -8798 item13_in_bin0 + 8798 item13_in_bin1 -9948 item14_in_bin0 + 9948 item14_in_bin1
55+
>= -0
56+
Bounds
57+
Integers
58+
item0_in_bin0 item0_in_bin1 item1_in_bin0 item1_in_bin1 item2_in_bin0 item2_in_bin1 item3_in_bin0 item3_in_bin1 item4_in_bin0 item4_in_bin1
59+
item5_in_bin0 item5_in_bin1 item6_in_bin0 item6_in_bin1 item7_in_bin0 item7_in_bin1 item8_in_bin0 item8_in_bin1 item9_in_bin0 item9_in_bin1
60+
item10_in_bin0 item10_in_bin1 item11_in_bin0 item11_in_bin1 item12_in_bin0 item12_in_bin1 item13_in_bin0 item13_in_bin1 item14_in_bin0 item14_in_bin1
61+
End

issue17b.sol

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
item0_in_bin0 = 0
2+
item1_in_bin0 = 0
3+
item2_in_bin0 = 0
4+
item3_in_bin0 = 1
5+
item4_in_bin0 = 0
6+
item5_in_bin0 = 0
7+
item6_in_bin0 = 1
8+
item7_in_bin0 = 0
9+
item8_in_bin0 = 1
10+
item9_in_bin0 = 0
11+
item10_in_bin0 = 1
12+
item11_in_bin0 = 0
13+
item12_in_bin0 = 1
14+
item13_in_bin0 = 0
15+
item14_in_bin0 = 1
16+
item0_in_bin1 = 1
17+
item1_in_bin1 = 1
18+
item2_in_bin1 = 1
19+
item3_in_bin1 = 0
20+
item4_in_bin1 = 1
21+
item5_in_bin1 = 1
22+
item6_in_bin1 = 0
23+
item7_in_bin1 = 1
24+
item8_in_bin1 = 0
25+
item9_in_bin1 = 1
26+
item10_in_bin1 = 0
27+
item11_in_bin1 = 1
28+
item12_in_bin1 = 0
29+
item13_in_bin1 = 1
30+
item14_in_bin1 = 0

prtpy/binners.py

+8-9
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ class Binner(ABC):
2525
All arrays created by the same binner share the following two variables:
2626
* numbins - the total number of bins.
2727
* valueof - a function that maps an item to its value.
28+
* copiesof - a function that maps an item to the number of copies.
2829
"""
29-
def __init__(self, valueof: Callable = lambda x:x):
30+
def __init__(self, valueof: Callable = lambda x:x, copiesof: Callable=lambda x:1):
3031
self.valueof = valueof
32+
self.copiesof = copiesof
3133

3234
@abstractmethod
3335
def new_bins(self, numbins:int)->BinsArray:
@@ -186,8 +188,8 @@ class BinnerKeepingSums(Binner):
186188
Bin #1: sum=3.0
187189
"""
188190

189-
def __init__(self, valueof: Callable = lambda x:x):
190-
super().__init__(valueof)
191+
def __init__(self, valueof: Callable = lambda x:x, copiesof: Callable=lambda x:1):
192+
super().__init__(valueof,copiesof)
191193

192194
BinsArray = np.ndarray # Here, the bins-array is simply an array of the sums.
193195

@@ -330,8 +332,8 @@ class BinnerKeepingContents(BinnerKeepingSums):
330332
Bin #1: ['a'], sum=3.0
331333
"""
332334

333-
def __init__(self, valueof: Callable = lambda x:x):
334-
super().__init__(valueof)
335+
def __init__(self, valueof: Callable = lambda x:x, copiesof: Callable=lambda x:1):
336+
super().__init__(valueof, copiesof)
335337

336338
BinsArray = Tuple[np.ndarray, List[List]] # Here, each bins-array is a tuple: sums,lists. sums is an array of sums; lists is a list of lists of items.
337339

@@ -451,7 +453,4 @@ def printbins(bins:BinsArray):
451453

452454
if __name__ == "__main__":
453455
import doctest, sys
454-
(failures, tests) = doctest.testmod(report=True, optionflags=doctest.FAIL_FAST)
455-
print("{} failures, {} tests".format(failures, tests))
456-
if failures>0:
457-
sys.exit(1)
456+
print(doctest.testmod(report=True, optionflags=doctest.FAIL_FAST))

prtpy/outputtypes.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
class OutputType(ABC):
1010
@classmethod
11-
def create_binner(cls, valueof: Callable) -> Binner:
11+
def create_binner(cls, valueof: Callable, copiesof: Callable=None) -> Binner:
1212
"""
1313
Construct and return a Bins structure. Used at the initialization phase of an algorithm.
1414
"""
@@ -30,8 +30,8 @@ def extract_output_from_binsarray(cls, bins: BinsArray) -> List:
3030
class Sums(OutputType):
3131
""" Output the list of sums of all bins (but not the bins' contents). """
3232
@classmethod
33-
def create_binner(cls, valueof: Callable) -> List:
34-
return BinnerKeepingSums(valueof)
33+
def create_binner(cls, valueof: Callable, copiesof: Callable=None) -> List:
34+
return BinnerKeepingSums(valueof,copiesof)
3535

3636
@classmethod
3737
def extract_output_from_sums(cls, sums: List[float]) -> List:
@@ -94,8 +94,8 @@ class Partition(OutputType):
9494
""" Output the set of all bins. """
9595

9696
@classmethod
97-
def create_binner(cls, valueof: Callable) -> List:
98-
return BinnerKeepingContents(valueof)
97+
def create_binner(cls, valueof: Callable, copiesof: Callable=None) -> List:
98+
return BinnerKeepingContents(valueof,copiesof)
9999

100100
@classmethod
101101
def extract_output_from_sums_and_lists(cls, sums: List[float], lists: List[List[Any]]) -> List:

prtpy/partitioning/adaptors.py

+26-2
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
from prtpy import outputtypes as out, objectives as obj
1717
from prtpy.binners import Binner
1818
from typing import Callable, List, Any
19+
from numbers import Number
1920

2021
def partition(
2122
algorithm: Callable,
2223
numbins: int,
2324
items: Any,
2425
valueof: Callable[[Any], float] = None,
26+
copies: Any = 1,
2527
outputtype: out.OutputType = out.Partition,
2628
**kwargs
2729
):
@@ -32,6 +34,7 @@ def partition(
3234
numbins (int),
3335
items (list),
3436
valueof (callable),
37+
copiesof (callable),
3538
outputtype (OutputType).
3639
3740
:param numbins: int - how many parts should be in the partition?
@@ -42,6 +45,7 @@ def partition(
4245
* A list of strings (in this case, valueof should also be defined, and map each item name to its value);
4346
4447
:param valueof: optional; required only if `items` is a list of item-names.
48+
:param copiesof: optional; required only if `items` is a list of item-names.
4549
4650
:param outputtype: what output to return. See `outputtypes.py'.
4751
@@ -73,11 +77,31 @@ def partition(
7377
item_names = items.keys()
7478
if valueof is None:
7579
valueof = items.__getitem__
76-
else: # items is a list
80+
81+
# copiesof:
82+
if isinstance(copies,dict):
83+
copiesof = copies.__getitem__
84+
elif isinstance(copies,Number):
85+
copiesof = lambda item: copies
86+
else:
87+
raise TypeError(f"copies parameter {copies} is of wrong type {type(copies)}")
88+
else: # items is a list of values
7789
item_names = items
7890
if valueof is None:
7991
valueof = lambda item: item
80-
binner = outputtype.create_binner(valueof)
92+
93+
# copiesof:
94+
if isinstance(copies,list):
95+
if len(set(items))==len(items):
96+
copies_dict = dict(zip(items,copies)) # Works only when each item appears once
97+
copiesof = copies_dict.__getitem__
98+
else:
99+
raise ValueError(f"copies argument can only be used when item names are unique, but they are not: {item_names}")
100+
elif isinstance(copies,Number):
101+
copiesof = lambda item: copies
102+
else:
103+
raise TypeError(f"copies parameter {copies} is of wrong type {type(copies)}")
104+
binner = outputtype.create_binner(valueof,copiesof)
81105
bins = algorithm(binner, numbins, item_names, **kwargs)
82106
return outputtype.extract_output_from_binsarray(bins)
83107

0 commit comments

Comments
 (0)