Line | |
---|
1 | from typing import TypeVar, List
|
---|
2 |
|
---|
3 | from tudelft.utilities.immutablelist.AbstractImmutableList import AbstractImmutableList
|
---|
4 | from tudelft.utilities.immutablelist.FixedList import FixedList
|
---|
5 | from tudelft.utilities.immutablelist.ImmutableList import ImmutableList
|
---|
6 |
|
---|
7 |
|
---|
8 | T = TypeVar('T')
|
---|
9 |
|
---|
10 | class Outer (AbstractImmutableList[ImmutableList[T]]) :
|
---|
11 | '''
|
---|
12 | outer product of lists: a list containing all possible combinations of one
|
---|
13 | element from each of the provided lists.
|
---|
14 |
|
---|
15 | @param T the element type of all lists that we receive.
|
---|
16 | '''
|
---|
17 |
|
---|
18 | def __init__(self, lists: List[ImmutableList[T]] ):
|
---|
19 | '''
|
---|
20 | outer product of lists: a list containing all possible combinations of
|
---|
21 | one element from each of the provided lists
|
---|
22 |
|
---|
23 | @param lists
|
---|
24 | '''
|
---|
25 | self._sourceLists = list(lists)
|
---|
26 |
|
---|
27 | if len(lists) == 0:
|
---|
28 | s = 0
|
---|
29 | else:
|
---|
30 | s = 1
|
---|
31 | for l in lists:
|
---|
32 | s = s * l.size()
|
---|
33 | self._size = s;
|
---|
34 |
|
---|
35 | def get(self, index:int) ->ImmutableList[T]:
|
---|
36 | element:List[T] = [];
|
---|
37 | i = index;
|
---|
38 | for item in range(len(self._sourceLists)):
|
---|
39 | l:ImmutableList[T] = self._sourceLists[item]
|
---|
40 | n = l.size()
|
---|
41 | element.append(l.get(i % n))
|
---|
42 | i = i // n
|
---|
43 | return FixedList(element);
|
---|
44 |
|
---|
45 |
|
---|
46 | def size(self) -> int:
|
---|
47 | return self._size
|
---|
48 |
|
---|
49 | def __hash__(self):
|
---|
50 | return hash(tuple(self._sourceLists))
|
---|
51 |
|
---|
52 | def __eq__(self, other):
|
---|
53 | return isinstance(other, self.__class__) \
|
---|
54 | and self._sourceLists==other._sourceLists
|
---|
55 |
|
---|
Note:
See
TracBrowser
for help on using the repository browser.