File size: 5,471 Bytes
4484b8a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
import numpy as np


def generate_symetrie_reduction():
    # chiffre, ligne, colonne, chiffre ligne colonne
    a1_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    a2_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    a3_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    a4_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    a5_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    a6_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    a7_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    a8_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)

    b1_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    b2_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    b3_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    b4_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    b5_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    b6_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    b7_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)
    b8_array = np.zeros((9, 9, 9, 9, 9, 9), dtype=float)

    for i in range(9):
        for j in range(9):
            for n in range(9):
                a1_array[i, j, n, i, j, n] = 1.0

                a2_array[autre_chiffre(i), j, n, i, j, n] = 1.0 / 8.0

                a3_array[i, autre_chiffre(j), n, i, j, n] = 1.0 / 8.0

                a4_array[np.ix_([i], meme_bloc(j), [n], [i], [j], [n])] = 1.0 / 8.0
                a4_array[np.ix_(meme_bloc(i), [j], [n], [i], [j], [n])] = 1.0 / 8.0
                a4_array[np.ix_(meme_bloc(i), meme_bloc(j), [n], [i], [j], [n])] = (
                    1.0 / 8.0
                )

                a5_array[np.ix_(meme_bloc(i), autre_bloc_b(j), [n], [i], [j], [n])] = (
                    1.0 / 6.0
                )

                a6_array[np.ix_(meme_bloc(i), autre_bloc_h(j), [n], [i], [j], [n])] = (
                    1.0 / 6.0
                )

                a7_array[np.ix_(autre_bloc_b(i), meme_bloc(j), [n], [i], [j], [n])] = (
                    1.0 / 6.0
                )

                a8_array[np.ix_(autre_bloc_h(i), meme_bloc(j), [n], [i], [j], [n])] = (
                    1.0 / 6.0
                )

                b1_array[i, j, n, i, j, autre_chiffre(n)] = 1.0 / 8.0

                b2_array[
                    np.ix_(autre_chiffre(i), [j], autre_chiffre(n), [i], [j], [n])
                ] = (1.0 / 64.0)

                b3_array[
                    np.ix_([i], autre_chiffre(j), autre_chiffre(n), [i], [j], [n])
                ] = (1.0 / 64.0)

                b4_array[np.ix_([i], meme_bloc(j), autre_chiffre(n), [i], [j], [n])] = (
                    1.0 / 64.0
                )
                b4_array[np.ix_(meme_bloc(i), [j], autre_chiffre(n), [i], [j], [n])] = (
                    1.0 / 64.0
                )
                b4_array[
                    np.ix_(meme_bloc(i), meme_bloc(j), autre_chiffre(n), [i], [j], [n])
                ] = (1.0 / 64.0)

                b5_array[
                    np.ix_(
                        meme_bloc(i), autre_bloc_b(j), autre_chiffre(n), [i], [j], [n]
                    )
                ] = (1.0 / 48.0)

                b6_array[
                    np.ix_(
                        meme_bloc(i), autre_bloc_h(j), autre_chiffre(n), [i], [j], [n]
                    )
                ] = (1.0 / 48.0)

                b7_array[
                    np.ix_(
                        autre_bloc_b(i), meme_bloc(j), autre_chiffre(n), [i], [j], [n]
                    )
                ] = (1.0 / 48.0)

                b8_array[
                    np.ix_(
                        autre_bloc_h(i), meme_bloc(j), autre_chiffre(n), [i], [j], [n]
                    )
                ] = (1.0 / 48.0)

    list_arr = [
        a1_array,
        a2_array,
        a3_array,
        a4_array,
        a5_array,
        a6_array,
        a7_array,
        a8_array,
        b1_array,
        b2_array,
        b3_array,
        b4_array,
        b5_array,
        b6_array,
        b7_array,
        b8_array,
    ]
    full_sym = np.zeros((9, 9, 9, 9, 9, 9, len(list_arr)))
    for i, arr in enumerate(list_arr):
        full_sym[:, :, :, :, :, :, i] = arr

    full_sym = full_sym.reshape(9 * 9 * 9, 9 * 9 * 9, len(list_arr))
    return full_sym


def meme_bloc(i):
    bloc_start = 3 * (i // 3)
    bloc_end = bloc_start + 2
    if i == bloc_start:
        return [bloc_start + 1, bloc_end]
    elif i == bloc_end:
        return [bloc_start, bloc_start + 1]
    else:
        return [bloc_start, bloc_end]


def autre_bloc(i):
    bloc_start = 3 * (i // 3)
    all_in_bloc = [bloc_start, bloc_start + 1, bloc_start + 2]
    list_to_return = []
    for n in range(9):
        if not (n in all_in_bloc):
            list_to_return.append(n)
    return list_to_return


def autre_bloc_b(i):
    bloc_start = 3 * (i // 3)
    all_in_bloc = [bloc_start, bloc_start + 1, bloc_start + 2]
    list_to_return = []
    for n in range(9):
        if not (n in all_in_bloc):
            list_to_return.append(n)
    return list_to_return[:3]


def autre_bloc_h(i):
    bloc_start = 3 * (i // 3)
    all_in_bloc = [bloc_start, bloc_start + 1, bloc_start + 2]
    list_to_return = []
    for n in range(9):
        if not (n in all_in_bloc):
            list_to_return.append(n)
    return list_to_return[3:]


def autre_chiffre(i):
    return [n for n in range(9) if n != i]


mat_sym = generate_symetrie_reduction()
mat_sym = np.moveaxis(mat_sym, (0, 1, 2), (2, 0, 1))