Ising模型の相転移をディープラーニングで予測する方法
解決したいこと
Python3を使って2次元Ising模型の相転移をディープラーニングで予測するという数値計算を行っています。
メトロポリス法(モンテカルロ法)を用いてスピン配位を計算するということまでは完成しています。
そのスピン配位をどのようにニューラルネットワークに入力すればいいのかというところで困っています。
30X30で作成したものを900次元のベクトルにするというところは教科書に書いてあったのですが、結果が望ましいものになりません。
どのように書き換える必要があるでしょうか?
1.メトロポリス法を用いて0<T<2、2.5<T<10までのスピン配位を10000データ生成する
2.そのスピン配位のうち、2000個にラベルを付与する
3.2<T<2.5のスピン配位も10000個用意する
4.ラベルの付与されていないスピン配位を訓練データ、ラベルの付与されているスピン配位を検証データとしてDeeplearningを行う
という計算を考えています。
発生している問題・エラー
y_train のクラス分布: [ 455 25545]
y_val のクラス分布: [2000 2000]
/usr/local/lib/python3.11/dist-packages/keras/src/layers/activations/leaky_relu.py:41: UserWarning: Argument `alpha` is deprecated. Use `negative_slope` instead.
warnings.warn(
Epoch 1/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 5s 4ms/step - loss: 5.0802 - val_loss: 1.3504
Epoch 2/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1618 - val_loss: 1.5112
Epoch 3/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1612 - val_loss: 1.2815
Epoch 4/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 6s 5ms/step - loss: 0.1582 - val_loss: 1.4177
Epoch 5/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1586 - val_loss: 1.4829
Epoch 6/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1580 - val_loss: 1.4252
Epoch 7/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 7s 6ms/step - loss: 0.1602 - val_loss: 1.2539
Epoch 8/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1599 - val_loss: 1.2973
Epoch 9/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1572 - val_loss: 1.4094
Epoch 10/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 8s 7ms/step - loss: 0.1594 - val_loss: 1.4347
Epoch 11/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1609 - val_loss: 1.3770
Epoch 12/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1592 - val_loss: 1.4082
Epoch 13/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 7s 7ms/step - loss: 0.1592 - val_loss: 1.4177
Epoch 14/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 8s 4ms/step - loss: 0.1569 - val_loss: 1.2844
Epoch 15/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 7s 6ms/step - loss: 0.1610 - val_loss: 1.2984
Epoch 16/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1602 - val_loss: 1.3509
Epoch 17/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 5s 4ms/step - loss: 0.1591 - val_loss: 1.3466
Epoch 18/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 6s 5ms/step - loss: 0.1587 - val_loss: 1.3564
Epoch 19/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 4s 4ms/step - loss: 0.1586 - val_loss: 1.2768
Epoch 20/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 7s 6ms/step - loss: 0.1591 - val_loss: 1.1798
Epoch 21/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1590 - val_loss: 1.4716
Epoch 22/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1567 - val_loss: 1.3670
Epoch 23/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 6s 5ms/step - loss: 0.1599 - val_loss: 1.4093
Epoch 24/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 4s 4ms/step - loss: 0.1590 - val_loss: 1.4798
Epoch 25/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1619 - val_loss: 1.3705
Epoch 26/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1563 - val_loss: 1.3631
Epoch 27/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 5s 4ms/step - loss: 0.1598 - val_loss: 1.3210
Epoch 28/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 5s 4ms/step - loss: 0.1596 - val_loss: 1.3421
Epoch 29/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 7s 6ms/step - loss: 0.1602 - val_loss: 1.3562
Epoch 30/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1546 - val_loss: 1.3331
Epoch 31/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1605 - val_loss: 1.3795
Epoch 32/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1580 - val_loss: 1.3759
Epoch 33/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - loss: 0.1600 - val_loss: 1.2928
Epoch 34/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1592 - val_loss: 1.4183
Epoch 35/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 5s 4ms/step - loss: 0.1578 - val_loss: 1.2002
Epoch 36/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 6s 7ms/step - loss: 0.1585 - val_loss: 1.2295
Epoch 37/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1575 - val_loss: 1.3794
Epoch 38/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1585 - val_loss: 1.3212
Epoch 39/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 7s 6ms/step - loss: 0.1612 - val_loss: 1.2193
Epoch 40/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1611 - val_loss: 1.3949
Epoch 41/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1619 - val_loss: 1.4550
Epoch 42/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 6s 5ms/step - loss: 0.1558 - val_loss: 1.2434
Epoch 43/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 4s 5ms/step - loss: 0.1589 - val_loss: 1.3652
Epoch 44/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 4s 4ms/step - loss: 0.1599 - val_loss: 1.3468
Epoch 45/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 3s 4ms/step - loss: 0.1586 - val_loss: 1.4620
Epoch 46/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 5s 4ms/step - loss: 0.1591 - val_loss: 1.2842
Epoch 47/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 5s 4ms/step - loss: 0.1599 - val_loss: 1.4654
Epoch 48/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 4s 4ms/step - loss: 0.1599 - val_loss: 1.2072
Epoch 49/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 4s 5ms/step - loss: 0.1603 - val_loss: 1.3465
Epoch 50/50
813/813 ━━━━━━━━━━━━━━━━━━━━ 4s 4ms/step - loss: 0.1624 - val_loss: 1.4487
該当するソースコード
"""
2次元イジングモデルのメトロポリス法によるモンテカルロシミュレーションテスト用
"""
import numpy as np
from sklearn.semi_supervised import LabelPropagation
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LeakyReLU
from sklearn.model_selection import train_test_split
import numpy as np
import random as rnd
from random import random, randrange
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, LeakyReLU
from tensorflow.keras import optimizers
from tensorflow.keras import backend as K
import collections
# 与えられたスピン配置alisに対してエネルギーを計算する関数を定義
def Ecalc2(alis2, Nx,Ny):
dum=0
for i in range(-1,Nx):
for j in range(0,Ny):
l=i
m=j
if l==-1:
l=Nx
if l == Nx:
l=0
if m ==-1:
m=Ny
if m== Ny:
m=0
ll=i+1
if ll == Nx:
ll=0
dum+=alis2[l, m]*alis2[ll, m]
for i in range(0,Nx):
for j in range(-1,Ny):
l=i
m=j
if l==-1:
l=Nx
if l == Nx:
l=0
if m ==-1:
m=Ny
if m== Ny:
m=0
mm=j+1
if mm == Ny:
mm=0
dum+=alis2[l, m]*alis2[l, mm]
return dum
# ランダムな初期状態生成: アップスピン数とダウンスピン数は同じ。M=0
def Initial_rand(s, Nx,Ny):
NN=int(Nx*Ny/2)
for k in range(NN):
i=randrange(Nx-1) # 1からNまででランダムな数が選ばれる
j=randrange(Ny-1) # 1からNまででランダムな数が選ばれる
s[i,j]=-1*s[i,j]
return s
Nx= 30 # x方向に100分割
Ny =30 # y方向に100分割
Ntot=Nx*Ny
KBT_lis=np.linspace(0.001,2, 201) # 温度を0.001から2まで(kBT単位で)201刻みで変動させる。
for KBT in KBT_lis:
J = 1 # スピン結合定数
B = 0.0 # 外部磁場
steps =20000 # MC ステップ
# 初期状態生成: ランダムスピン配置
s= np.ones([Nx,Ny], int) # Nスピン分の, 量子数(Sz = +1 or -1)を全部1としてセット
s=Initial_rand(s, Nx,Ny)
E = -J* Ecalc2(s, Nx,Ny) -B*np.sum(s) #(初期)エネルギーを計算。
E2 = E**2 # E^2を格納
# セットアップ
st_mag = [] #
# メイン
for k in range(steps):
i=randrange(Nx-1) # 0からN-1まででランダムな数が選ばれる
j=randrange(Ny-1) # 0からN-1まででランダムな数が選ばれる
s_trial=s.copy()
s_trial[i,j]= -1*s[i,j]
delta_E=2*s_trial[i,j]*-1*J*(s[i+1,j]+s[i-1,j]+s[i,j+1]+s[i,j-1])-B*(s_trial[i,j]-s[i,j])
E_trial =E+ delta_E
#メトロポリス法による状態更新
if E_trial < E :
s = s_trial
E = E_trial
else :
if random() < np.exp(-(delta_E)/KBT):
s = s_trial
E = E_trial
st_mag.append(s)
st_mag = st_mag[10000:]
# st_mag のインデックスを取得
all_indices = set(range(len(st_mag)))
val_indices = set(rnd.sample(list(all_indices), 2000))
# 選ばれた 2000 個のデータと残りの 8000 個のデータに分割
st_mag_val = [st_mag[i] for i in val_indices]
remaining_rnd_st_mag = [st_mag[i] for i in all_indices - val_indices]
# st_mag_val の各スピン配位にラベル (1, 0) を付与
labeled_st_mag = [(spin_config, (1, 0)) for spin_config in st_mag_val]
KBT_lis=np.linspace(2.5,10, 201) # 温度を0.001から2まで(kBT単位で)201刻みで変動させる。
for KBT in KBT_lis:
J = 1 # スピン結合定数
B = 0.0 # 外部磁場
steps =20000 # MC ステップ
# 初期状態生成: ランダムスピン配置
s= np.ones([Nx,Ny], int) # Nスピン分の, 量子数(Sz = +1 or -1)を全部1としてセット
s=Initial_rand(s, Nx,Ny)
E = -J* Ecalc2(s, Nx,Ny) -B*np.sum(s) #(初期)エネルギーを計算。
E2 = E**2 # E^2を格納
# セットアップ
pa_mag = [] #
# メイン
for k in range(steps):
i=randrange(Nx-1) # 0からN-1まででランダムな数が選ばれる
j=randrange(Ny-1) # 0からN-1まででランダムな数が選ばれる
s_trial=s.copy()
s_trial[i,j]= -1*s[i,j]
delta_E=2*s_trial[i,j]*-1*J*(s[i+1,j]+s[i-1,j]+s[i,j+1]+s[i,j-1])-B*(s_trial[i,j]-s[i,j])
E_trial =E+ delta_E
#メトロポリス法による状態更新
if E_trial < E :
s = s_trial
E = E_trial
else :
if random() < np.exp(-(delta_E)/KBT):
s = s_trial
E = E_trial
pa_mag.append(s)
pa_mag = pa_mag[10000:]
# pa_mag のインデックスを取得
all_indices = set(range(len(pa_mag)))
val_indices = set(rnd.sample(list(all_indices), 2000))
# 選ばれた 2000 個のデータと残りの 8000 個のデータに分割
pa_mag_val = [pa_mag[i] for i in val_indices]
remaining_rnd_pa_mag = [pa_mag[i] for i in all_indices - val_indices]
# pa_mag_val の各スピン配位にラベル (0, 1) を付与
labeled_pa_mag = [(spin_config, (0, 1)) for spin_config in pa_mag_val]
KBT_lis=np.linspace(2,2.5, 201) # 温度を0.001から2まで(kBT単位で)201刻みで変動させる。
for KBT in KBT_lis:
J = 1 # スピン結合定数
B = 0.0 # 外部磁場
steps =20000 # MC ステップ
# 初期状態生成: ランダムスピン配置
s= np.ones([Nx,Ny], int) # Nスピン分の, 量子数(Sz = +1 or -1)を全部1としてセット
s=Initial_rand(s, Nx,Ny)
E = -J* Ecalc2(s, Nx,Ny) -B*np.sum(s) #(初期)エネルギーを計算。
E2 = E**2 # E^2を格納
# セットアップ
un_mag = [] #
# メイン
for k in range(steps):
i=randrange(Nx-1) # 0からN-1まででランダムな数が選ばれる
j=randrange(Ny-1) # 0からN-1まででランダムな数が選ばれる
s_trial=s.copy()
s_trial[i,j]= -1*s[i,j]
delta_E=2*s_trial[i,j]*-1*J*(s[i+1,j]+s[i-1,j]+s[i,j+1]+s[i,j-1])-B*(s_trial[i,j]-s[i,j])
E_trial =E+ delta_E
#メトロポリス法による状態更新
if E_trial < E :
s = s_trial
E = E_trial
else :
if random() < np.exp(-(delta_E)/KBT):
s = s_trial
E = E_trial
un_mag.append(s)
un_mag = un_mag[10000:]
val_mag = labeled_st_mag + labeled_pa_mag
tra_mag = remaining_rnd_st_mag + remaining_rnd_pa_mag + un_mag
#print(val_mag[:2])
#print(tra_mag[:2])
# 損失関数の定義
def custom_loss_with_l2(y_true, y_pred):
# スパース・クロスエントロピー損失
cross_entropy_loss = K.sparse_categorical_crossentropy(y_true, y_pred)
# モデルの重みを取得して L2 正則化項を計算
l2_lambda = 0.1 # L2正則化の係数
l2_loss = sum([K.sum(K.square(w)) for w in model.trainable_weights])
# クロスエントロピー損失 + L2正則化項
return cross_entropy_loss + l2_lambda * l2_loss
# 1. データ整形
# 訓練データ (tra_mag)
x_train = np.array([config.flatten() for config in tra_mag]) # スピン配列をフラット化
y_train = np.array([1 if config.mean() > 0 else 0 for config in tra_mag])
# 検証データ (val_mag)
x_val = np.array([config[0].flatten() for config in val_mag]) # スピン配列をフラット化
y_val = np.array([config[1][0] for config in val_mag]) # ラベル (1, 0) の第1要素を使用
print("y_train のクラス分布:", np.bincount(y_train))
print("y_val のクラス分布:", np.bincount(y_val))
"""
# データの形状確認
print("訓練データ形状:", x_train.shape, "訓練ラベル形状:", y_train.shape)
print("検証データ形状:", x_val.shape, "検証ラベル形状:", y_val.shape)
print(x_val[2:])
print(x_train[2:])
print(y_val[2:])
print(y_train[2:])
"""
# 2. ニューラルネットワークの構築
model = Sequential()
model.add(Dense(128, input_shape=(900,))) # 入力次元は 900
model.add(LeakyReLU(alpha=0.2)) # 活性化関数
model.add(Dense(64))
model.add(LeakyReLU(alpha=0.2))
model.add(Dense(2, activation="softmax")) # 出力層
# モデルのコンパイル
model.compile(loss=custom_loss_with_l2, optimizer="adam")
# 3. 学習
history = model.fit(
x_train, y_train,
epochs=50,
batch_size=32,
validation_data=(x_val, y_val)
)
# 4. 学習の可視化
plt.figure(figsize=(12, 5))
# 損失関数のプロット
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Loss Function Over Epochs')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.tight_layout()
plt.show()
自分で試したこと
私は物理学科の学生で、そこまでプログラミングの技術があるわけでなく、何が間違っているのかわかっていません。
ChatGPTにかなり頼っています。
ChatGPTに聞いたところ、私がやろうとしていることは半教師あり学習であると言われて、実際に半教師あり学習のアルゴリズムでプログラムを作ってもらいましたが、それでも特にいい結果生えられませんでした。
半教師あり学習を試してみたいと思いますが、サイト数が少なくどのように実装したらいいかわからない状態です。
val_mag[:2]
tra_mag[:2]
val_mag[-2:]
tra_mag[-2:]
を出力すると以下のようになっていたので、この部分は理想通りの結果が求められています。
[(array([[ 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[ 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1, 1, 1],
[ 1, 1, -1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, -1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1],
[ 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, -1,
-1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, 1, 1, 1],
[ 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1,
1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1,
1, -1, -1, 1, -1, -1, -1, 1, 1, 1, -1, -1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1,
1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, 1, 1],
[-1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1,
1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1,
1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1,
1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1,
1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1,
-1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]), (1, 0)), (array([[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, -1, 1, 1, 1,
1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1],
[-1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1],
[-1, 1, 1, 1, 1, 1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1,
-1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1,
1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1],
[ 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1,
1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]), (1, 0))]
[array([[ 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[ 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1, 1, 1],
[ 1, 1, -1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, -1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1],
[ 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, -1,
-1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, 1, 1, 1],
[ 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1,
1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1,
1, -1, -1, 1, -1, -1, -1, 1, 1, 1, -1, -1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1,
1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, 1, 1],
[-1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1,
1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1,
1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1,
1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1,
1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1,
-1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]), array([[ 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[ 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, -1, 1, 1],
[ 1, 1, -1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, -1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1],
[ 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, -1,
-1, -1, -1, 1, 1, -1, 1, -1, -1, -1, -1, 1, 1, 1],
[ 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1,
1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1,
1, -1, -1, 1, -1, -1, -1, 1, 1, 1, -1, -1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1,
1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, 1, 1],
[-1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1,
1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1,
1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1,
1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1,
1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1,
-1, -1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])]
[(array([[ 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, 1, -1, -1, 1,
1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, 1, -1, 1],
[-1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, -1, 1, 1, 1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, -1, 1],
[ 1, 1, -1, -1, 1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1,
-1, 1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1, -1, 1],
[ 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1, 1,
-1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, -1, -1, 1],
[-1, -1, 1, 1, 1, 1, 1, -1, -1, 1, -1, 1, -1, 1, 1, 1,
1, -1, -1, 1, 1, -1, 1, 1, -1, -1, -1, -1, 1, 1],
[-1, -1, -1, -1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1],
[ 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, -1,
-1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1,
1, 1, -1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, -1, -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1,
1, 1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1],
[-1, -1, -1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1],
[ 1, -1, 1, -1, -1, 1, 1, -1, 1, 1, -1, -1, -1, -1, -1, 1,
1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1],
[-1, -1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1,
1, -1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, 1],
[ 1, 1, -1, -1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, -1, -1,
-1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1],
[ 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1,
1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, 1],
[ 1, 1, -1, -1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1,
-1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, 1],
[-1, -1, 1, 1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, -1, -1,
1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1],
[ 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1,
-1, 1, -1, -1, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1],
[ 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1,
-1, 1, -1, -1, -1, -1, 1, 1, -1, 1, 1, 1, -1, 1],
[ 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1],
[ 1, 1, -1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, -1, -1, -1,
1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, -1, -1, -1,
1, -1, 1, 1, -1, 1, -1, -1, -1, 1, 1, 1, 1, 1],
[ 1, 1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, -1, 1, -1, 1,
1, 1, -1, 1, 1, 1, -1, -1, -1, 1, 1, -1, -1, 1],
[ 1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, -1, 1, -1, 1,
1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1],
[ 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1,
1, -1, 1, 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, 1],
[ 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, 1,
-1, 1, 1, -1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1],
[ 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1, -1, -1, -1, 1,
-1, 1, 1, 1, -1, -1, -1, 1, 1, -1, -1, -1, -1, 1],
[ 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1,
1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, 1, 1, 1],
[-1, -1, 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, 1,
-1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]), (0, 1)), (array([[ 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, 1, -1, -1, 1,
1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, 1, -1, 1],
[-1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, -1, 1, 1, 1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, -1, 1],
[ 1, 1, -1, -1, 1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1,
-1, 1, 1, -1, -1, 1, 1, -1, -1, -1, 1, 1, -1, 1],
[ 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1, 1,
-1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, -1, -1, 1],
[-1, -1, 1, 1, 1, 1, 1, -1, -1, 1, -1, 1, -1, 1, 1, 1,
1, -1, -1, 1, 1, -1, 1, 1, -1, -1, -1, -1, 1, 1],
[-1, -1, -1, -1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1,
1, 1, 1, -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, 1],
[ 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, -1,
-1, 1, -1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1,
1, 1, -1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, -1, -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1,
1, 1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1],
[-1, -1, -1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1],
[ 1, -1, 1, -1, -1, 1, 1, -1, 1, 1, -1, -1, -1, -1, -1, 1,
1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1],
[-1, -1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1,
1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1],
[ 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1,
-1, 1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1],
[ 1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1,
1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, 1],
[ 1, 1, -1, -1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1,
-1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, 1],
[-1, -1, 1, 1, -1, 1, -1, -1, -1, 1, 1, 1, 1, 1, -1, -1,
1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1],
[ 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1,
-1, 1, -1, -1, 1, -1, 1, -1, 1, 1, -1, 1, 1, 1],
[ 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1,
-1, 1, -1, -1, -1, -1, 1, 1, -1, 1, 1, 1, -1, 1],
[ 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1,
-1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1],
[ 1, 1, -1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, -1, -1, -1,
1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, 1, 1],
[-1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1, 1, -1, -1, -1,
1, -1, 1, 1, -1, 1, -1, -1, -1, 1, 1, 1, 1, 1],
[ 1, 1, -1, -1, -1, -1, 1, 1, 1, -1, 1, -1, -1, 1, -1, 1,
1, 1, -1, 1, 1, 1, -1, -1, -1, 1, 1, -1, -1, 1],
[ 1, 1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, -1, 1, -1, 1,
1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1],
[ 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1,
1, -1, 1, 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, 1],
[ 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, 1,
-1, 1, 1, -1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1],
[ 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1, -1, -1, -1, -1, 1,
-1, 1, 1, 1, -1, -1, -1, 1, 1, -1, -1, -1, -1, 1],
[ 1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1, -1,
1, 1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1],
[-1, -1, 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, 1,
-1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]), (0, 1))]
[array([[ 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1,
1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, -1, -1, -1,
1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1],
[ 1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1],
[ 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1,
1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1],
[ 1, 1, -1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, -1, -1, -1,
1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1],
[ 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1,
1, 1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1],
[ 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1],
[ 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, -1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1],
[-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1,
1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]), array([[ 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1,
1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, -1, 1, 1, 1, -1, -1, 1, 1, -1, -1, -1, -1, -1,
1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, 1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1],
[ 1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1],
[ 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1,
1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, -1, 1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[-1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1],
[ 1, 1, -1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, -1, -1, -1,
1, -1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1],
[ 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, -1,
1, 1, 1, 1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1],
[ 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1],
[ 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, -1, 1, 1, -1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1],
[-1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, -1, -1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1],
[-1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1,
1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])]