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))