-
Notifications
You must be signed in to change notification settings - Fork 1
/
padding.py
92 lines (73 loc) · 2.85 KB
/
padding.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
### Import
import numpy as np
from typing import Callable, Dict
import random
import numpy.typing as npt
### Type
Padded_matrix = npt.NDArray[npt.NDArray[int]]
Not_padded_matrix = npt.NDArray[npt.NDArray[int]]
Function = Callable
### Functions
def define_paddings() -> Dict[str, Function]:
"""
Returns the dictionnary of the functions for different paddings
That way, the padding selection will just need to call the function related to the given key
"""
return {
"random": random_padding,
"max": max_value_padding,
"min": min_value_padding,
}
def random_padding(matrix_to_pad: Not_padded_matrix) -> Padded_matrix:
n, m = matrix_to_pad.shape
padded_matrix = np.ndarray.copy(matrix_to_pad)
for i in range(n):
max_on_line = int(np.max(padded_matrix[i]))
ranks_to_add = [var for var in range(max_on_line + 1, m + 1)]
random.shuffle(ranks_to_add)
padded_matrix[i][padded_matrix[i] == 0] = ranks_to_add
return padded_matrix
def max_value_padding(matrix_to_pad: Not_padded_matrix) -> Padded_matrix:
"""
This function will pad the matrix by replacing all the zeros by the maximum value that is possible for the problem to still be correct (hence m, the number of activities)
"""
m = matrix_to_pad.shape[1]
padded_matrix = np.ndarray.copy(matrix_to_pad)
padded_matrix[padded_matrix == 0] = m
return padded_matrix
def min_value_padding(matrix_to_pad: Not_padded_matrix) -> Padded_matrix:
"""
This function will pad the matrix by replacing the zeros of each line by the minimum value that is not lower than the max value of said line (e.g. the max value of the line + 1)
"""
n = matrix_to_pad.shape[0]
padded_matrix = np.ndarray.copy(matrix_to_pad)
for i in range(n):
padded_matrix[i][padded_matrix[i] == 0] = np.amax(padded_matrix[i], axis=0) + 1
return padded_matrix
def pad_matrix(
matrix_to_pad: Not_padded_matrix,
padding_name: str = "random",
) -> Padded_matrix:
"""
Return : matrix_to_pad padded with the chosen padding type
the matrix should be numpy
"""
return define_paddings().get(padding_name)(matrix_to_pad)
if __name__ == "__main__":
dict_of_padding = define_paddings()
print(dict_of_padding)
matrix_to_pad = np.array([[1, 2, 3], [2, 1, 0], [1, 0, 2], [0, 0, 1], [0, 0, 0]])
print("Matrix to pad")
print(matrix_to_pad)
print("Padded with max value")
print(max_value_padding(matrix_to_pad))
print("Padded with min value")
print(min_value_padding(matrix_to_pad))
print("Padded with random value")
print(random_padding(matrix_to_pad))
print("\nWith the pad_matrix function :\n\nmax value")
print(pad_matrix(matrix_to_pad, "max"))
print("\nmin value")
print(pad_matrix(matrix_to_pad, "min"))
print("\nrandom")
print(pad_matrix(matrix_to_pad))