|
import numpy as np |
|
|
|
|
|
def generate_symetrie_reduction(): |
|
|
|
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)) |
|
|