Sam Lam
Thomas Verduyn

Project D: Computer exercise for WI4201
Solving the convection-diffusion equation using upwind finite
differences

```python
# setup problem parameters/functions
import numpy as np
import matplotlib.pyplot as plt
import scipy.sparse
import sympy
import copy

def system_solver(N,e): # sets up system Au=f and solves it
    # Initial values
    h=1/N # nr of lines

    # Constant values - Boundary conditions
    u0=1
    unp1=0

    # Discretisation
    A=scipy.sparse.diags([-e/h-1, 2*e/h+1, -e/h], [-1, 0, 1], shape=(N-1, N-1)).toarray()
    f=np.zeros(N-1)
    f[0]=e/h+1  # bring bc to rhs
    un=np.linalg.inv(A)@f
    return np.concatenate(([u0],un,[unp1])), A, f

def system_solver2(N,e):
    # Initial values
    h=1/N

    # Constant values - Boundary conditions
    u0=1
    unp1=0

    # Discretisation
    A=scipy.sparse.diags([-e/h-1, 2*e/h+1, -e/h], [-1, 0, 1], shape=(N-1, N-1)).toarray()
    A=np.vstack((np.zeros((1,N-1)),A,np.zeros((1,N-1))))
    A=np.hstack((np.zeros((N+1,1)),A,np.zeros((N+1,1))))
    A[0,0]=u0
    A[-1,-1]=unp1
    print(A)
    f=np.zeros(N+1)
    f[0]=e/h+1
    un=np.linalg.inv(A)@f
    return np.concatenate(([u0],un,[unp1])), A, f

def testfunc(N,e):
    x=np.linspace(0,1,N+1)
    return (np.exp(x/e)-np.exp(1/e))/(1-np.exp(1/e))

#system_solver2(3,0.5)
```

Problem 2

```python
N=25
#%matplotlib notebook
eps = np.linspace(1e-2,1,11)
for e in eps:
    plt.plot(np.linspace(0,1,N+1),system_solver(N,e)[0],label=str(e),ls='dotted')
    plt.plot(np.linspace(0,1,N+1),testfunc(N,e),label='testfunc'+str(e))
#    plt.plot(np.linspace(0,1,N+2),(testfunc(N+2,e)-system_solver(N,e)[0])/testfunc(N+2,e),label=str(e))
plt.legend()
plt.show()ef
```

Problem 2

```python
n=5
eps=0.01
error=[]
N_lst=[]
for i in range(4,n+4):
    N=2**i
    N_lst.append(N)
    un=system_solver(N,eps)
    error.append(max(np.abs(un[0]-testfunc(N,eps))))
plt.plot(1/np.array(N_lst),error) # is not linear
plt.plot([1/N_lst[0],1/N_lst[-1]],[error[0],error[-1]],marker='x')
#plt.plot(range(5),error)
#plt.yscale('log')
print (1/np.array(N_lst))

```

Problem 3

To prove whether matrix A is symmetric or not we can use the transpose

```python
N=100
eps=0.01
A=system_solver(N,eps)[1]
np.allclose(A,A.T)
print(A)
print(sympy.Matrix(A).rref(),'check')
print(np.linalg.eig(A)[0])
print(np.linalg.inv(A))
np.any(np.linalg.inv(A)>=0)  # Check if A_ij>=0
```

    [[ 3. -1.  0. ...  0.  0.  0.]
     [-2.  3. -1. ...  0.  0.  0.]
     [ 0. -2.  3. ...  0.  0.  0.]
     ...
     [ 0.  0.  0. ...  3. -1.  0.]
     [ 0.  0.  0. ... -2.  3. -1.]
     [ 0.  0.  0. ...  0. -2.  3.]]
    (Matrix([
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]), (0, 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)) check
    [5.82699206 5.82299277 5.81554556 5.80666585 5.79276033 5.77947187
     5.75875429 5.74145847 5.69246868 5.65868148 5.63224174 5.59374723
     5.56084676 5.51921292 5.4788066  5.43506597 5.34134557 5.38680333
     5.28551122 5.23813275 5.17566468 5.12549577 5.05799953 5.00363571
     4.93303768 4.73466751 4.80104934 4.66224731 0.17297184 0.17714306
     4.58923439 0.18414295 0.19386208 0.20638659 4.51691068 4.87308909
     0.22172988 0.23955691 4.43764748 0.26066834 0.33824279 0.37079828
     0.40357537 0.31046298 0.44136552 4.36534912 0.47929687 0.52191633
     4.28078062 3.87803663 3.95405703 4.04522669 0.56504084 3.78518824
     0.71203673 3.70723112 4.11940015 0.76479923 0.66036485 0.82102632
     3.61329551 0.87790501 0.93874943 3.53358012 0.99927517 3.43906688
     4.20793065 3.35766908 2.29602128 2.21100236 1.064702   2.82237424
     2.73436836 2.38393563 2.04093151 2.12639253 3.26336314 1.96023634
     2.91057521 2.64457233 1.71360754 1.63975083 1.40821563 1.48662499
     1.2649225  3.08701023 2.55866158 1.19838681 3.17999861 1.55791386
     1.87482845 1.33925169 3.00123816 1.79785412 2.46888053 1.12845134
     0.61222432 0.28353405 5.71385595]
    [[5.00000000e-01 2.50000000e-01 1.25000000e-01 ... 5.52202634e-30
      2.36658272e-30 7.88860905e-31]
     [5.00000000e-01 7.50000000e-01 3.75000000e-01 ... 1.65660790e-29
      7.09974815e-30 2.36658272e-30]
     [5.00000000e-01 7.50000000e-01 8.75000000e-01 ... 3.86541844e-29
      1.65660790e-29 5.52202634e-30]
     ...
     [4.37500000e-01 6.56250000e-01 7.65625000e-01 ... 8.75000000e-01
      3.75000000e-01 1.25000000e-01]
     [3.75000000e-01 5.62500000e-01 6.56250000e-01 ... 7.50000000e-01
      7.50000000e-01 2.50000000e-01]
     [2.50000000e-01 3.75000000e-01 4.37500000e-01 ... 5.00000000e-01
      5.00000000e-01 5.00000000e-01]]

    True

Problem 4

```python
N=100
#%matplotlib notebook
eps=1
A=system_solver(N,eps)[1]
#print(A)
ev, ef=np.linalg.eig(A)
plt.plot(np.linspace(0,1,N-1),ef[:,::25])
#print(np.linspace(1/(N-1),1-1/(N-1),N-1))
plt.show()

#plt.plot(range(1,N),ev)
#plt.hist(ev,bins=len(ev))
#plt.show()
```

Problem 5

```python
N=8
eps=1
A=system_solver(N,eps)[1]
D = np.diag(np.ones(N-1)*A[0,0])
B_jac=np.identity(N-1)-np.matmul(np.linalg.inv(D),A)
ev, ef=np.linalg.eig(B_jac)
#print(np.linalg.eig(A)[0])
print(max(np.abs(ev)))
#print(A)
print(B_jac)
print(ev)
y=np.zeros(len(ev))
plt.scatter(ev,y)
a=(np.max(ev)-np.min(ev))/2
b=0.
ev=np.sort(ev)
y=np.sqrt(b*(1-ev**2/a))
plt.plot(ev,y)
```

Problem 6

```python
def jacobi(N,eps,rtol=1e-6):
    # Initial values
    h = 1 / N  # nr of lines

    # Constant values - Boundary conditions
    u0 = 1
    unp1 = 0

    # Discretization scheme and right-hand vector; CDS
    A = scipy.sparse.diags([-eps / h - 1, 2 * eps / h + 1, -eps / h], [-1, 0, 1], shape=(N - 1, N - 1)).toarray()
    f = np.zeros(N - 1)
    f[0] = eps / h + 1  # bring bc to rhs
    u_current=np.zeros(N-1)
    res_scaled=1
    u_new=np.zeros(N-1)
    res_lst = []
    while res_scaled>rtol:
        for i, row in enumerate(A):
            u_new[i]=(f[i]-(row@u_current-A[i,i]*u_current[i]))/A[i,i]
            #print(row,u_current)
        u_current=u_new
        res=f-A@u_new # res_k+1 = f - A*u_k
        res_scaled=np.sum(np.sqrt(res**2))/ np.sum(np.sqrt(f**2))
        res_lst.append(np.sum(np.sqrt(res**2)))

    return u_current, res_lst

N=5
eps=0.1
u,A,f=system_solver(N,eps)
u_jac, res_lst_jac =jacobi(N,eps)
# u0,A,f=system_solver(N,eps)

res_km1 = np.roll(res_lst_jac, shift=1)
red_jac = res_lst_jac / res_km1

fig, ax =plt.subplots(1,2)
ax[0].plot(res_lst_jac / np.max(f))
ax[1].plot(red_jac[2:], label="JAC")
```

Problem 7

```python
def forwardGS(N, eps, rtol=1e-6):
    # Initial values
    h = 1 / N  # nr of lines

    # Constant values - Boundary conditions
    u0 = 1
    unp1 = 0

    # Discretization scheme and right-hand vector; CDS
    A = scipy.sparse.diags([-eps / h - 1, 2 * eps / h + 1, -eps / h], [-1, 0, 1], shape=(N - 1, N - 1)).toarray()
    f = np.zeros(N - 1)
    f[0] = eps / h + 1  # bring bc to rhs
    u_current = np.zeros(N-1)
    tol = 1
    u_new = np.zeros(N-1)
    res_scaled = 1  # initial residual
    res_lst = []
    while res_scaled>rtol:
        for i, row in enumerate(A):
            u_current[i] = (f[i]-row[:i]@u_current[:i]-row[i+1:]@u_current[i+1:])/A[i,i]
        res = np.sum(np.sqrt((f - A@u_current)**2))
        res_scaled = res / np.sum(np.sqrt(f**2))
        res_lst.append(res)
    return u_current, res_lst

u_gs, res_lst_gs = forwardGS(N,eps, rtol=1e-6)
#u_exact,A,f=system_solver(N,eps)
#print("Sol is close to exact sol: {}".format(np.allclose(u, u_exact[1:-1], rtol=1e-5)))
res_km1 = np.roll(res_lst_gs, shift=1)
red_gs = res_lst_gs / res_km1

# add curve to plot

ax[0].plot(res_lst_gs / np.max(f))
ax[1].plot(red_gs[1:], label="forward GS")
```

    [<matplotlib.lines.Line2D at 0x1d732f58fa0>]

Problem 8

```python
def backwardGS1(N, eps, rtol=1e-6):
    # Initial values
    h = 1 / N  # nr of lines

    # Constant values - Boundary conditions
    u0 = 1
    unp1 = 0

    # Discretization scheme and right-hand vector; CDS
    A = scipy.sparse.diags([-eps / h - 1, 2 * eps / h + 1, -eps / h], [-1, 0, 1], shape=(N - 1, N - 1)).toarray()
    f = np.zeros(N - 1)
    f[0] = eps / h + 1  # bring bc to rhs
    res = 1  # initial residual
    un = np.zeros(N - 1)  # solution vector; iterated
    res_scaled = 1  # initial residual
    res_lst = []
#     Solver
    while res > rtol:
        for i in range(N - 2, -1, -1):  # iterate backwards;
            s1=0
            for j in range(i+1,N-1): # sum of first part
                s1+=A[i,j]*un[j]
            s2=0
            for j in range(i,0,-1): # sum second part
                s2+=A[i,j-1]*un[j-1]
            un[i]=(f[i]-s1-s2)/A[i,i]
            res = np.sum(np.sqrt((f - A@un)**2))  # update residual;  using the infinity norm
            res_scaled = res / np.sum(np.sqrt(f**2))
            res_lst.append(res)
    return un, res_lst

u, res_lst_bgs = backwardGS1(N,eps)
#u_exact,A,f=system_solver(N,eps)
res_km1 = np.roll(res_lst_bgs, shift=1)
red_bgs = res_lst_bgs / res_km1

# add curve to plot

ax[0].plot(res_lst_bgs / np.max(f))
ax[1].plot(red_bgs[1:], label="backward GS")
#print("Sol is close to exact sol: {}".format(np.allclose(u, u_exact[1:-1])))
```

    [<matplotlib.lines.Line2D at 0x1d732f7f100>]

Problem 9

```python
def symmGS(N, eps, rtol=1e-6):
    # initial values
    h = 1 / N

    # Constant values - Boundary conditions
    u0 = 1
    unp1 = 0

    # Discretization scheme and right-hand vector; CDS
    A = scipy.sparse.diags([-eps / h - 1, 2 * eps / h + 1, -eps / h], [-1, 0, 1], shape=(N - 1, N - 1)).toarray()
    f = np.zeros(N - 1)
    f[0] = eps / h + 1  # bring bc to rhs
    res = 1  # initial residual
    un = np.zeros(N - 1)  # solution vector; iterated
    res_scaled = 1  # initial residual
    res_lst = []

    while res > rtol:
#        for i, row in enumerate(A):
#             u_current[i] = (f[i]-row[:i]@u_current[:i]-row[i+1:]@u_current[i+1:])/A[i,i]
#             res = f - A@u_current
#             tol=np.max(res)/np.max(f)
#        return u_current

        for i, row in enumerate(A):
            un[i] = (f[i]-row[:i]@un[:i]-row[i+1:]@un[i+1:])/A[i,i]
        while res > rtol:
            for i in range(N - 2, -1, -1):  # iterate backwards;
                s1=0
                for j in range(i+1,N-1): # sum of first part
                    s1+=A[i,j]*un[j]
                s2=0
                for j in range(i,0,-1): # sum second part
                    s2+=A[i,j-1]*un[j-1]
                un[i]=(f[i]-s1-s2)/A[i,i]
            res = np.sum(np.sqrt((f - A@un)**2))  # update residual;  using the infinity norm
            res_scaled = res / np.sum(np.sqrt(f**2))
            res_lst.append(res)
    return un, res_lst

u, res_lst_symmgs = symmGS(N, eps)
#u_exact,A,f=system_solver(N,eps)

#print("Sol is close to exact sol: {}".format(np.allclose(u, u_exact[1:-1])))
res_km1 = np.roll(res_lst_symmgs, shift=1)
red_symmgs = res_lst_symmgs / res_km1

# add curve to plot

ax[0].plot(res_lst_symmgs / np.max(f))
ax[1].plot(red_symmgs[1:], label="backward GS")
```

    [<matplotlib.lines.Line2D at 0x1d732f9b730>]

```python
# solve settings
ax[0].set_yscale("log")
#ax[1].set_yscale("log")
ax[0].grid()
ax[1].grid()
#ax[1].set_xlim(0, 5)
#ax[0].set_xlim(0, 5)
ax[1].legend()
#ax[1].set_yscale("log")
fig.show()
```

    <ipython-input-12-68e2f5cc3c68>:10: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.
      fig.show()

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```

```python

```


```python
import numpy as np
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
from matplotlib import pyplot as plt
from data import calculate_synthetic_scores, calculate_CIFAR_scores
np.random.seed(0)
```

    WARNING: Logging before flag parsing goes to stderr.
    W1116 14:36:33.567762 140214221702976 deprecation.py:323] From /usr/local/lib/python3.6/dist-packages/tensorflow/python/compat/v2_compat.py:61: disable_resource_variables (from tensorflow.python.ops.variable_scope) is deprecated and will be removed in a future version.
    Instructions for updating:
    non-resource variables are not supported in the long term

### Score matrix and labels

To run the experiments, the following input is required:
- A matrix of classification scores `S`, where rows correspond to data points and columns to classes.

There are `k2` classes and `r` data points in each class.

This code assumes that the classifier predicts the class with the lowest score (e.g. according to distances).
- A vector `Y` of the true labels corresponding to the rows of `S`.

Experiments will be performed by extrapolating accuracy from `k1` to `k2` classes.

Here we provide two examples for `S` and `Y`, based on either synthetic data or the CIFAR-100 dataset (already included in TensorFlow) - see `data.py` for details. Run the relevant notebook cell below:

#### Synthetic data

```python
k1 = 500
k2 = 2000

y_dist = 'normal'  # distribution of class centroids, possible values are 'normal' or 'uniform'
x_dist = 'normal'  # distribution of data points around class centroids, possible values are 'normal' or 'uniform'
sigma2 = 0.1       # variance of data points

d = 5              # data dimension
r = 10             # number of data points from each class

S, Y = calculate_synthetic_scores(k2, d, r, sigma2, x_dist, y_dist)
```

#### CIFAR-100

```python
k1 = 10
k2 = 100

S, Y = calculate_CIFAR_scores()
```

    W1116 14:36:42.434901 140214221702976 deprecation.py:506] From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
    Instructions for updating:
    Call initializer instance with the dtype argument instead of passing it to the constructor

### NN architecture

```python
avg_acc_ = tf.placeholder(tf.float32, shape=[k1-1], name='avg_acc')
S_correct_ = tf.placeholder(tf.float32, shape=[None, 1], name='S_correct')
S_incorrect_ = tf.placeholder(tf.float32, shape=[None, k1-1], name='S_incorrect')
```

```python
W1 = tf.get_variable('W1', shape=[k1, 512], dtype=tf.float32)
b1 = tf.get_variable('b1', shape=[512], dtype=tf.float32)
W2 = tf.get_variable('W2', shape=[512, 128], dtype=tf.float32)
b2 = tf.get_variable('b2', shape=[128], dtype=tf.float32)
W3 = tf.get_variable('W3', shape=[128, 1], dtype=tf.float32)
b3 = tf.get_variable('b3', shape=[1], dtype=tf.float32)

h1 = tf.nn.relu(tf.matmul(tf.concat([S_correct_, S_incorrect_], axis=1), W1) + b1)
h2 = tf.nn.relu(tf.matmul(h1, W2) + b2)
C = tf.nn.sigmoid(tf.matmul(h2, W3) + b3)
```

```python
ks_tf = tf.constant(np.arange(1, k1), dtype=tf.float32)
est_acc = tf.reduce_mean(tf.math.pow(1 - C, ks_tf), axis=0)
```

```python
loss = tf.reduce_mean(tf.square(est_acc - avg_acc_))
training_step = tf.train.AdamOptimizer(learning_rate=1e-4).minimize(loss)
```

    W1116 14:40:05.708201 140214221702976 deprecation.py:323] From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_grad.py:1205: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
    Instructions for updating:
    Use tf.where in 2.0, which has the same broadcast rule as np.where

### Run CleaneX

```python
def split_S(Y, S, smpl=None):
    """Splits the score matrix `S` to a vector of correct scores and a matrix
    of (sorted) incorrect scores, according to the true labels `Y`.
    Use only classes from the subsample `smpl` (if None, use all classes in `Y`).
    """
    if smpl is None:
        K = Y.max() + 1
        smpl = np.arange(K)

    sub_Y = Y[np.isin(Y, smpl)]
    S_correct = S[np.isin(Y, smpl), sub_Y][:, None]
    S_incorrect = S[np.isin(Y, smpl), :][(np.arange(S.shape[1])[None, :] != sub_Y[:, None]) & \
                                         np.isin(np.arange(S.shape[1]), smpl)].reshape(sub_Y.shape[0], -1)
    S_incorrect.sort(axis=1)

    return S_correct, S_incorrect
```

The average accuracy over all choices of $k \leq K$ classes is given by
\begin{equation}
    \bar{\mathcal{A}}^K_k = \frac{1}{r k} \sum_x \frac{\binom{R_x}{k - 1}}{\binom{K}{k}} \;,
\end{equation}
where $R_x = |\{y \mid S_{y^*}(x) < S_y(x)\}|$ (see Zheng et al. 2018). Note that we are dealing with distances, where a lower score is better, so the inequality in the definition of $R_x$ is inverted with respect to the paper.

Therefore, we have
\begin{multline}
\bar{\mathcal{A}}^K_k
= \frac{1}{r K} \sum_x \frac{\binom{R_x}{k - 1}}{\frac{k}{K} \binom{K}{k}}
= \frac{1}{r K} \sum_x \frac{\binom{R_x}{k - 1}}{\binom{K - 1}{k - 1}}
= \frac{1}{r K} \sum_x \frac{\prod_{i=1}^{k-1} \frac{R_x + 1 - i}{i}}{\prod_{i=1}^{k-1} \frac{K - i}{i}} \\
= \frac{1}{r K} \sum_x \prod_{i=1}^{k-1} \frac{R_x + 1 - i}{K - i}
= \frac{1}{r K} \sum_x \exp \left( \sum_{i=1}^{k-1} \Big( \log(R_x + 1 - i) - \log(K - i) \Big) \right) \;.
\end{multline}

```python
def calculate_avg_accuracy(Y, S, smpl=None):
    """Given the true labels `Y` and score matrix `S`, calculates the average
    accuracy over all choices of k >= 2 classes.
    Use only classes from the subsample `smpl` (if None, use all classes in `Y`).
    """
    if smpl is None:
        K = Y.max() + 1
        smpl = np.arange(K)
    else:
        K = len(smpl)

    sub_Y = Y[np.isin(Y, smpl)]
    R = np.sum(S[np.isin(Y, smpl), sub_Y][:, None] < S[np.isin(Y, smpl), :][:, smpl], axis=1, keepdims=True)
    a = np.log(np.maximum(R + 1 - np.arange(1, K), 1e-16))  # avoid log(0)
    b = np.log(K - np.arange(1, K))
    cum_sum = np.cumsum(a - b, axis=1)
    avg_A = np.mean(np.exp(cum_sum), axis=0)

    return avg_A
```

#### Run experiments

```python
repetitions = 10     # number of experiment repetitions (subsamples of k1 classes)
iterations = 10000   # number of training iterations
```

```python
sess = tf.Session()

all_est_accs = []
all_avg_accs = []

for rep in range(repetitions):
    print('Repetition no. {}'.format(rep + 1))

    # Subsample k1 classes:
    smpl = np.random.choice(k2, k1, replace=False)

    # Calculate average accuracies on chosen k1 classes:
    avg_accuracy = calculate_avg_accuracy(Y, S, smpl)

    # Get scores of correct and incorrect classes:
    S_correct, S_incorrect = split_S(Y, S, smpl)

    # Normalize scores:
    full_S = np.hstack([S_correct, S_incorrect])
    S_correct = (S_correct - full_S.mean())/full_S.std()
    S_incorrect = (S_incorrect - full_S.mean())/full_S.std()

    # Train:
    sess.run(tf.global_variables_initializer())
    for i in range(iterations):
        l, _ = sess.run([loss, training_step], feed_dict={S_correct_: S_correct,
                                                          S_incorrect_: S_incorrect,
                                                          avg_acc_: avg_accuracy})
        if ((i + 1) % 100) == 0:
            print('Iteration {}\tMSE loss: {:.8f}'.format(i + 1, l))

    # Predict accuracy for all 2 <= k <= k2:
    C_pred = sess.run(C, feed_dict={S_correct_: S_correct, S_incorrect_: S_incorrect})
    est_acc = np.power(1 - C_pred, np.arange(1, k2)).mean(axis=0)

    # Save current experiment results:
    all_avg_accs.append(avg_accuracy)
    all_est_accs.append(est_acc)

sess.close()
```

    Repetition no. 1
    Iteration 100	MSE loss: 0.00082878
    Iteration 200	MSE loss: 0.00066701
    Iteration 300	MSE loss: 0.00063601
    Iteration 400	MSE loss: 0.00059905
    Iteration 500	MSE loss: 0.00055586
    Iteration 600	MSE loss: 0.00050615
    Iteration 700	MSE loss: 0.00044933
    Iteration 800	MSE loss: 0.00038716
    Iteration 900	MSE loss: 0.00032234
    Iteration 1000	MSE loss: 0.00025781
    Iteration 1100	MSE loss: 0.00018597
    Iteration 1200	MSE loss: 0.00011508
    Iteration 1300	MSE loss: 0.00005916
    Iteration 1400	MSE loss: 0.00001844
    Iteration 1500	MSE loss: 0.00000771
    Iteration 1600	MSE loss: 0.00000582
    Iteration 1700	MSE loss: 0.00000551
    Iteration 1800	MSE loss: 0.00000536
    Iteration 1900	MSE loss: 0.00000522
    Iteration 2000	MSE loss: 0.00000508
    Iteration 2100	MSE loss: 0.00000494
    Iteration 2200	MSE loss: 0.00000480
    Iteration 2300	MSE loss: 0.00000467
    Iteration 2400	MSE loss: 0.00000454
    Iteration 2500	MSE loss: 0.00000440
    Iteration 2600	MSE loss: 0.00000427
    Iteration 2700	MSE loss: 0.00000413
    Iteration 2800	MSE loss: 0.00000400
    Iteration 2900	MSE loss: 0.00000387
    Iteration 3000	MSE loss: 0.00000373
    Iteration 3100	MSE loss: 0.00000360
    Iteration 3200	MSE loss: 0.00000347
    Iteration 3300	MSE loss: 0.00000333
    Iteration 3400	MSE loss: 0.00000320
    Iteration 3500	MSE loss: 0.00000306
    Iteration 3600	MSE loss: 0.00000293
    Iteration 3700	MSE loss: 0.00000279
    Iteration 3800	MSE loss: 0.00000265
    Iteration 3900	MSE loss: 0.00000251
    Iteration 4000	MSE loss: 0.00000237
    Iteration 4100	MSE loss: 0.00000223
    Iteration 4200	MSE loss: 0.00000210
    Iteration 4300	MSE loss: 0.00000196
    Iteration 4400	MSE loss: 0.00000183
    Iteration 4500	MSE loss: 0.00000170
    Iteration 4600	MSE loss: 0.00000158
    Iteration 4700	MSE loss: 0.00000146
    Iteration 4800	MSE loss: 0.00000135
    Iteration 4900	MSE loss: 0.00000124
    Iteration 5000	MSE loss: 0.00000113
    Iteration 5100	MSE loss: 0.00000103
    Iteration 5200	MSE loss: 0.00000094
    Iteration 5300	MSE loss: 0.00000086
    Iteration 5400	MSE loss: 0.00000078
    Iteration 5500	MSE loss: 0.00000071
    Iteration 5600	MSE loss: 0.00000065
    Iteration 5700	MSE loss: 0.00000059
    Iteration 5800	MSE loss: 0.00000053
    Iteration 5900	MSE loss: 0.00000048
    Iteration 6000	MSE loss: 0.00000044
    Iteration 6100	MSE loss: 0.00000040
    Iteration 6200	MSE loss: 0.00000037
    Iteration 6300	MSE loss: 0.00000034
    Iteration 6400	MSE loss: 0.00000032
    Iteration 6500	MSE loss: 0.00000030
    Iteration 6600	MSE loss: 0.00000028
    Iteration 6700	MSE loss: 0.00000027
    Iteration 6800	MSE loss: 0.00000026
    Iteration 6900	MSE loss: 0.00000025
    Iteration 7000	MSE loss: 0.00000024
    Iteration 7100	MSE loss: 0.00000024
    Iteration 7200	MSE loss: 0.00000023
    Iteration 7300	MSE loss: 0.00000023
    Iteration 7400	MSE loss: 0.00000023
    Iteration 7500	MSE loss: 0.00000022
    Iteration 7600	MSE loss: 0.00000022
    Iteration 7700	MSE loss: 0.00000022
    Iteration 7800	MSE loss: 0.00000021
    Iteration 7900	MSE loss: 0.00000021
    Iteration 8000	MSE loss: 0.00000021
    Iteration 8100	MSE loss: 0.00000021
    Iteration 8200	MSE loss: 0.00000020
    Iteration 8300	MSE loss: 0.00000020
    Iteration 8400	MSE loss: 0.00000020
    Iteration 8500	MSE loss: 0.00000020
    Iteration 8600	MSE loss: 0.00000019
    Iteration 8700	MSE loss: 0.00000019
    Iteration 8800	MSE loss: 0.00000019
    Iteration 8900	MSE loss: 0.00000018
    Iteration 9000	MSE loss: 0.00000018
    Iteration 9100	MSE loss: 0.00000018
    Iteration 9200	MSE loss: 0.00000018
    Iteration 9300	MSE loss: 0.00000017
    Iteration 9400	MSE loss: 0.00000017
    Iteration 9500	MSE loss: 0.00000017
    Iteration 9600	MSE loss: 0.00000017
    Iteration 9700	MSE loss: 0.00000016
    Iteration 9800	MSE loss: 0.00000016
    Iteration 9900	MSE loss: 0.00000016
    Iteration 10000	MSE loss: 0.00000016
    Repetition no. 2
    Iteration 100	MSE loss: 0.00127393
    Iteration 200	MSE loss: 0.00110854
    Iteration 300	MSE loss: 0.00108090
    Iteration 400	MSE loss: 0.00104686
    Iteration 500	MSE loss: 0.00100633
    Iteration 600	MSE loss: 0.00095731
    Iteration 700	MSE loss: 0.00089543
    Iteration 800	MSE loss: 0.00082296
    Iteration 900	MSE loss: 0.00073071
    Iteration 1000	MSE loss: 0.00060865
    Iteration 1100	MSE loss: 0.00047875
    Iteration 1200	MSE loss: 0.00035235
    Iteration 1300	MSE loss: 0.00023905
    Iteration 1400	MSE loss: 0.00014833
    Iteration 1500	MSE loss: 0.00008537
    Iteration 1600	MSE loss: 0.00004817
    Iteration 1700	MSE loss: 0.00003006
    Iteration 1800	MSE loss: 0.00002283
    Iteration 1900	MSE loss: 0.00002035
    Iteration 2000	MSE loss: 0.00001951
    Iteration 2100	MSE loss: 0.00001916
    Iteration 2200	MSE loss: 0.00001893
    Iteration 2300	MSE loss: 0.00001871
    Iteration 2400	MSE loss: 0.00001850
    Iteration 2500	MSE loss: 0.00001829
    Iteration 2600	MSE loss: 0.00001807
    Iteration 2700	MSE loss: 0.00001781
    Iteration 2800	MSE loss: 0.00001751
    Iteration 2900	MSE loss: 0.00001715
    Iteration 3000	MSE loss: 0.00001675
    Iteration 3100	MSE loss: 0.00001631
    Iteration 3200	MSE loss: 0.00001583
    Iteration 3300	MSE loss: 0.00001533
    Iteration 3400	MSE loss: 0.00001479
    Iteration 3500	MSE loss: 0.00001421
    Iteration 3600	MSE loss: 0.00001359
    Iteration 3700	MSE loss: 0.00001294
    Iteration 3800	MSE loss: 0.00001224
    Iteration 3900	MSE loss: 0.00001147
    Iteration 4000	MSE loss: 0.00001064
    Iteration 4100	MSE loss: 0.00000976
    Iteration 4200	MSE loss: 0.00000884
    Iteration 4300	MSE loss: 0.00000793
    Iteration 4400	MSE loss: 0.00000699
    Iteration 4500	MSE loss: 0.00000608
    Iteration 4600	MSE loss: 0.00000519
    Iteration 4700	MSE loss: 0.00000434
    Iteration 4800	MSE loss: 0.00000348
    Iteration 4900	MSE loss: 0.00000279
    Iteration 5000	MSE loss: 0.00000223
    Iteration 5100	MSE loss: 0.00000179
    Iteration 5200	MSE loss: 0.00000144
    Iteration 5300	MSE loss: 0.00000117
    Iteration 5400	MSE loss: 0.00000096
    Iteration 5500	MSE loss: 0.00000079
    Iteration 5600	MSE loss: 0.00000067
    Iteration 5700	MSE loss: 0.00000057
    Iteration 5800	MSE loss: 0.00000050
    Iteration 5900	MSE loss: 0.00000045
    Iteration 6000	MSE loss: 0.00000041
    Iteration 6100	MSE loss: 0.00000038
    Iteration 6200	MSE loss: 0.00000035
    Iteration 6300	MSE loss: 0.00000033
    Iteration 6400	MSE loss: 0.00000033
    Iteration 6500	MSE loss: 0.00000031
    Iteration 6600	MSE loss: 0.00000030
    Iteration 6700	MSE loss: 0.00000030
    Iteration 6800	MSE loss: 0.00000029
    Iteration 6900	MSE loss: 0.00000029
    Iteration 7000	MSE loss: 0.00000028
    Iteration 7100	MSE loss: 0.00000028
    Iteration 7200	MSE loss: 0.00000028
    Iteration 7300	MSE loss: 0.00000027
    Iteration 7400	MSE loss: 0.00000027
    Iteration 7500	MSE loss: 0.00000027
    Iteration 7600	MSE loss: 0.00000027
    Iteration 7700	MSE loss: 0.00000026
    Iteration 7800	MSE loss: 0.00000028
    Iteration 7900	MSE loss: 0.00000025
    Iteration 8000	MSE loss: 0.00000025
    Iteration 8100	MSE loss: 0.00000025
    Iteration 8200	MSE loss: 0.00000025
    Iteration 8300	MSE loss: 0.00000024
    Iteration 8400	MSE loss: 0.00000024
    Iteration 8500	MSE loss: 0.00000024
    Iteration 8600	MSE loss: 0.00000024
    Iteration 8700	MSE loss: 0.00000023
    Iteration 8800	MSE loss: 0.00000023
    Iteration 8900	MSE loss: 0.00000022
    Iteration 9000	MSE loss: 0.00000029
    Iteration 9100	MSE loss: 0.00000021
    Iteration 9200	MSE loss: 0.00000021
    Iteration 9300	MSE loss: 0.00000021
    Iteration 9400	MSE loss: 0.00000020
    Iteration 9500	MSE loss: 0.00000020
    Iteration 9600	MSE loss: 0.00000020
    Iteration 9700	MSE loss: 0.00000020
    Iteration 9800	MSE loss: 0.00000019
    Iteration 9900	MSE loss: 0.00000019
    Iteration 10000	MSE loss: 0.00000026
    Repetition no. 3
    Iteration 100	MSE loss: 0.00211551
    Iteration 200	MSE loss: 0.00201552
    Iteration 300	MSE loss: 0.00175077
    Iteration 400	MSE loss: 0.00111650
    Iteration 500	MSE loss: 0.00015902
    Iteration 600	MSE loss: 0.00000234
    Iteration 700	MSE loss: 0.00000176
    Iteration 800	MSE loss: 0.00000136
    Iteration 900	MSE loss: 0.00000104
    Iteration 1000	MSE loss: 0.00000079
    Iteration 1100	MSE loss: 0.00000060
    Iteration 1200	MSE loss: 0.00000044
    Iteration 1300	MSE loss: 0.00000032
    Iteration 1400	MSE loss: 0.00000023
    Iteration 1500	MSE loss: 0.00000016
    Iteration 1600	MSE loss: 0.00000012
    Iteration 1700	MSE loss: 0.00000009
    Iteration 1800	MSE loss: 0.00000008
    Iteration 1900	MSE loss: 0.00000007
    Iteration 2000	MSE loss: 0.00000006
    Iteration 2100	MSE loss: 0.00000006
    Iteration 2200	MSE loss: 0.00000005
    Iteration 2300	MSE loss: 0.00000005
    Iteration 2400	MSE loss: 0.00000005
    Iteration 2500	MSE loss: 0.00000005
    Iteration 2600	MSE loss: 0.00000005
    Iteration 2700	MSE loss: 0.00000005
    Iteration 2800	MSE loss: 0.00000005
    Iteration 2900	MSE loss: 0.00000004
    Iteration 3000	MSE loss: 0.00000004
    Iteration 3100	MSE loss: 0.00000004
    Iteration 3200	MSE loss: 0.00000004
    Iteration 3300	MSE loss: 0.00000004
    Iteration 3400	MSE loss: 0.00000004
    Iteration 3500	MSE loss: 0.00000004
    Iteration 3600	MSE loss: 0.00000004
    Iteration 3700	MSE loss: 0.00000004
    Iteration 3800	MSE loss: 0.00000004
    Iteration 3900	MSE loss: 0.00000003
    Iteration 4000	MSE loss: 0.00000003
    Iteration 4100	MSE loss: 0.00000003
    Iteration 4200	MSE loss: 0.00000003
    Iteration 4300	MSE loss: 0.00000003
    Iteration 4400	MSE loss: 0.00000003
    Iteration 4500	MSE loss: 0.00000003
    Iteration 4600	MSE loss: 0.00000003
    Iteration 4700	MSE loss: 0.00000003
    Iteration 4800	MSE loss: 0.00000003
    Iteration 4900	MSE loss: 0.00000003
    Iteration 5000	MSE loss: 0.00000003
    Iteration 5100	MSE loss: 0.00000003
    Iteration 5200	MSE loss: 0.00000003
    Iteration 5300	MSE loss: 0.00000003
    Iteration 5400	MSE loss: 0.00000003
    Iteration 5500	MSE loss: 0.00000003
    Iteration 5600	MSE loss: 0.00000003
    Iteration 5700	MSE loss: 0.00000002
    Iteration 5800	MSE loss: 0.00000002
    Iteration 5900	MSE loss: 0.00000002
    Iteration 6000	MSE loss: 0.00000002
    Iteration 6100	MSE loss: 0.00000002
    Iteration 6200	MSE loss: 0.00000002
    Iteration 6300	MSE loss: 0.00000002
    Iteration 6400	MSE loss: 0.00000002
    Iteration 6500	MSE loss: 0.00000002
    Iteration 6600	MSE loss: 0.00000002
    Iteration 6700	MSE loss: 0.00000002
    Iteration 6800	MSE loss: 0.00000002
    Iteration 6900	MSE loss: 0.00000002
    Iteration 7000	MSE loss: 0.00000002
    Iteration 7100	MSE loss: 0.00000002
    Iteration 7200	MSE loss: 0.00000002
    Iteration 7300	MSE loss: 0.00000002
    Iteration 7400	MSE loss: 0.00000002
    Iteration 7500	MSE loss: 0.00000002
    Iteration 7600	MSE loss: 0.00000002
    Iteration 7700	MSE loss: 0.00000002
    Iteration 7800	MSE loss: 0.00000002
    Iteration 7900	MSE loss: 0.00000003
    Iteration 8000	MSE loss: 0.00000001
    Iteration 8100	MSE loss: 0.00000002
    Iteration 8200	MSE loss: 0.00000002
    Iteration 8300	MSE loss: 0.00000001
    Iteration 8400	MSE loss: 0.00000001
    Iteration 8500	MSE loss: 0.00000006
    Iteration 8600	MSE loss: 0.00000001
    Iteration 8700	MSE loss: 0.00000001
    Iteration 8800	MSE loss: 0.00000001
    Iteration 8900	MSE loss: 0.00000002
    Iteration 9000	MSE loss: 0.00000006
    Iteration 9100	MSE loss: 0.00000005
    Iteration 9200	MSE loss: 0.00000001
    Iteration 9300	MSE loss: 0.00000001
    Iteration 9400	MSE loss: 0.00000001
    Iteration 9500	MSE loss: 0.00000001
    Iteration 9600	MSE loss: 0.00000003
    Iteration 9700	MSE loss: 0.00000001
    Iteration 9800	MSE loss: 0.00000004
    Iteration 9900	MSE loss: 0.00000001
    Iteration 10000	MSE loss: 0.00000002
    Repetition no. 4
    Iteration 100	MSE loss: 0.02927053
    Iteration 200	MSE loss: 0.00009299
    Iteration 300	MSE loss: 0.00009023
    Iteration 400	MSE loss: 0.00008809
    Iteration 500	MSE loss: 0.00008548
    Iteration 600	MSE loss: 0.00008233
    Iteration 700	MSE loss: 0.00007857
    Iteration 800	MSE loss: 0.00007418
    Iteration 900	MSE loss: 0.00006915
    Iteration 1000	MSE loss: 0.00006353
    Iteration 1100	MSE loss: 0.00005751
    Iteration 1200	MSE loss: 0.00005123
    Iteration 1300	MSE loss: 0.00004489
    Iteration 1400	MSE loss: 0.00003869
    Iteration 1500	MSE loss: 0.00003278
    Iteration 1600	MSE loss: 0.00002728
    Iteration 1700	MSE loss: 0.00002228
    Iteration 1800	MSE loss: 0.00001788
    Iteration 1900	MSE loss: 0.00001409
    Iteration 2000	MSE loss: 0.00001090
    Iteration 2100	MSE loss: 0.00000827
    Iteration 2200	MSE loss: 0.00000615
    Iteration 2300	MSE loss: 0.00000448
    Iteration 2400	MSE loss: 0.00000321
    Iteration 2500	MSE loss: 0.00000225
    Iteration 2600	MSE loss: 0.00000156
    Iteration 2700	MSE loss: 0.00000107
    Iteration 2800	MSE loss: 0.00000073
    Iteration 2900	MSE loss: 0.00000051
    Iteration 3000	MSE loss: 0.00000036
    Iteration 3100	MSE loss: 0.00000027
    Iteration 3200	MSE loss: 0.00000021
    Iteration 3300	MSE loss: 0.00000018
    Iteration 3400	MSE loss: 0.00000016
    Iteration 3500	MSE loss: 0.00000015
    Iteration 3600	MSE loss: 0.00000015
    Iteration 3700	MSE loss: 0.00000015
    Iteration 3800	MSE loss: 0.00000014
    Iteration 3900	MSE loss: 0.00000014
    Iteration 4000	MSE loss: 0.00000014
    Iteration 4100	MSE loss: 0.00000014
    Iteration 4200	MSE loss: 0.00000014
    Iteration 4300	MSE loss: 0.00000014
    Iteration 4400	MSE loss: 0.00000014
    Iteration 4500	MSE loss: 0.00000014
    Iteration 4600	MSE loss: 0.00000013
    Iteration 4700	MSE loss: 0.00000013
    Iteration 4800	MSE loss: 0.00000013
    Iteration 4900	MSE loss: 0.00000013
    Iteration 5000	MSE loss: 0.00000013
    Iteration 5100	MSE loss: 0.00000013
    Iteration 5200	MSE loss: 0.00000013
    Iteration 5300	MSE loss: 0.00000013
    Iteration 5400	MSE loss: 0.00000012
    Iteration 5500	MSE loss: 0.00000012
    Iteration 5600	MSE loss: 0.00000012
    Iteration 5700	MSE loss: 0.00000012
    Iteration 5800	MSE loss: 0.00000012
    Iteration 5900	MSE loss: 0.00000011
    Iteration 6000	MSE loss: 0.00000011
    Iteration 6100	MSE loss: 0.00000011
    Iteration 6200	MSE loss: 0.00000011
    Iteration 6300	MSE loss: 0.00000010
    Iteration 6400	MSE loss: 0.00000010
    Iteration 6500	MSE loss: 0.00000010
    Iteration 6600	MSE loss: 0.00000010
    Iteration 6700	MSE loss: 0.00000009
    Iteration 6800	MSE loss: 0.00000009
    Iteration 6900	MSE loss: 0.00000009
    Iteration 7000	MSE loss: 0.00000008
    Iteration 7100	MSE loss: 0.00000008
    Iteration 7200	MSE loss: 0.00000008
    Iteration 7300	MSE loss: 0.00000007
    Iteration 7400	MSE loss: 0.00000007
    Iteration 7500	MSE loss: 0.00000007
    Iteration 7600	MSE loss: 0.00000006
    Iteration 7700	MSE loss: 0.00000006
    Iteration 7800	MSE loss: 0.00000006
    Iteration 7900	MSE loss: 0.00000005
    Iteration 8000	MSE loss: 0.00000005
    Iteration 8100	MSE loss: 0.00000005
    Iteration 8200	MSE loss: 0.00000004
    Iteration 8300	MSE loss: 0.00000004
    Iteration 8400	MSE loss: 0.00000004
    Iteration 8500	MSE loss: 0.00000003
    Iteration 8600	MSE loss: 0.00000003
    Iteration 8700	MSE loss: 0.00000003
    Iteration 8800	MSE loss: 0.00000002
    Iteration 8900	MSE loss: 0.00000002
    Iteration 9000	MSE loss: 0.00000002
    Iteration 9100	MSE loss: 0.00000002
    Iteration 9200	MSE loss: 0.00000002
    Iteration 9300	MSE loss: 0.00000001
    Iteration 9400	MSE loss: 0.00000001
    Iteration 9500	MSE loss: 0.00000001
    Iteration 9600	MSE loss: 0.00000001
    Iteration 9700	MSE loss: 0.00000001
    Iteration 9800	MSE loss: 0.00000001
    Iteration 9900	MSE loss: 0.00000001
    Iteration 10000	MSE loss: 0.00000001
    Repetition no. 5
    Iteration 100	MSE loss: 0.00268048
    Iteration 200	MSE loss: 0.00246304
    Iteration 300	MSE loss: 0.00217417
    Iteration 400	MSE loss: 0.00182023
    Iteration 500	MSE loss: 0.00137771
    Iteration 600	MSE loss: 0.00092057
    Iteration 700	MSE loss: 0.00051065
    Iteration 800	MSE loss: 0.00021847
    Iteration 900	MSE loss: 0.00005794
    Iteration 1000	MSE loss: 0.00002235
    Iteration 1100	MSE loss: 0.00001776
    Iteration 1200	MSE loss: 0.00001690
    Iteration 1300	MSE loss: 0.00001581
    Iteration 1400	MSE loss: 0.00001481
    Iteration 1500	MSE loss: 0.00001371
    Iteration 1600	MSE loss: 0.00001267
    Iteration 1700	MSE loss: 0.00001131
    Iteration 1800	MSE loss: 0.00000991
    Iteration 1900	MSE loss: 0.00000857
    Iteration 2000	MSE loss: 0.00000731
    Iteration 2100	MSE loss: 0.00000614
    Iteration 2200	MSE loss: 0.00000509
    Iteration 2300	MSE loss: 0.00000418
    Iteration 2400	MSE loss: 0.00000340
    Iteration 2500	MSE loss: 0.00000276
    Iteration 2600	MSE loss: 0.00000226
    Iteration 2700	MSE loss: 0.00000187
    Iteration 2800	MSE loss: 0.00000157
    Iteration 2900	MSE loss: 0.00000136
    Iteration 3000	MSE loss: 0.00000121
    Iteration 3100	MSE loss: 0.00000110
    Iteration 3200	MSE loss: 0.00000102
    Iteration 3300	MSE loss: 0.00000097
    Iteration 3400	MSE loss: 0.00000093
    Iteration 3500	MSE loss: 0.00000091
    Iteration 3600	MSE loss: 0.00000089
    Iteration 3700	MSE loss: 0.00000087
    Iteration 3800	MSE loss: 0.00000086
    Iteration 3900	MSE loss: 0.00000085
    Iteration 4000	MSE loss: 0.00000084
    Iteration 4100	MSE loss: 0.00000083
    Iteration 4200	MSE loss: 0.00000082
    Iteration 4300	MSE loss: 0.00000081
    Iteration 4400	MSE loss: 0.00000079
    Iteration 4500	MSE loss: 0.00000078
    Iteration 4600	MSE loss: 0.00000077
    Iteration 4700	MSE loss: 0.00000076
    Iteration 4800	MSE loss: 0.00000075
    Iteration 4900	MSE loss: 0.00000073
    Iteration 5000	MSE loss: 0.00000072
    Iteration 5100	MSE loss: 0.00000071
    Iteration 5200	MSE loss: 0.00000070
    Iteration 5300	MSE loss: 0.00000068
    Iteration 5400	MSE loss: 0.00000067
    Iteration 5500	MSE loss: 0.00000066
    Iteration 5600	MSE loss: 0.00000064
    Iteration 5700	MSE loss: 0.00000063
    Iteration 5800	MSE loss: 0.00000062
    Iteration 5900	MSE loss: 0.00000061
    Iteration 6000	MSE loss: 0.00000059
    Iteration 6100	MSE loss: 0.00000058
    Iteration 6200	MSE loss: 0.00000057
    Iteration 6300	MSE loss: 0.00000056
    Iteration 6400	MSE loss: 0.00000054
    Iteration 6500	MSE loss: 0.00000053
    Iteration 6600	MSE loss: 0.00000052
    Iteration 6700	MSE loss: 0.00000050
    Iteration 6800	MSE loss: 0.00000049
    Iteration 6900	MSE loss: 0.00000048
    Iteration 7000	MSE loss: 0.00000047
    Iteration 7100	MSE loss: 0.00000045
    Iteration 7200	MSE loss: 0.00000044
    Iteration 7300	MSE loss: 0.00000044
    Iteration 7400	MSE loss: 0.00000042
    Iteration 7500	MSE loss: 0.00000041
    Iteration 7600	MSE loss: 0.00000040
    Iteration 7700	MSE loss: 0.00000038
    Iteration 7800	MSE loss: 0.00000037
    Iteration 7900	MSE loss: 0.00000036
    Iteration 8000	MSE loss: 0.00000035
    Iteration 8100	MSE loss: 0.00000034
    Iteration 8200	MSE loss: 0.00000033
    Iteration 8300	MSE loss: 0.00000032
    Iteration 8400	MSE loss: 0.00000031
    Iteration 8500	MSE loss: 0.00000030
    Iteration 8600	MSE loss: 0.00000039
    Iteration 8700	MSE loss: 0.00000028
    Iteration 8800	MSE loss: 0.00000027
    Iteration 8900	MSE loss: 0.00000026
    Iteration 9000	MSE loss: 0.00000025
    Iteration 9100	MSE loss: 0.00000025
    Iteration 9200	MSE loss: 0.00000024
    Iteration 9300	MSE loss: 0.00000023
    Iteration 9400	MSE loss: 0.00000022
    Iteration 9500	MSE loss: 0.00000027
    Iteration 9600	MSE loss: 0.00000020
    Iteration 9700	MSE loss: 0.00000020
    Iteration 9800	MSE loss: 0.00000037
    Iteration 9900	MSE loss: 0.00000018
    Iteration 10000	MSE loss: 0.00000018
    Repetition no. 6
    Iteration 100	MSE loss: 0.00359988
    Iteration 200	MSE loss: 0.00016639
    Iteration 300	MSE loss: 0.00016384
    Iteration 400	MSE loss: 0.00016082
    Iteration 500	MSE loss: 0.00015731
    Iteration 600	MSE loss: 0.00015332
    Iteration 700	MSE loss: 0.00014884
    Iteration 800	MSE loss: 0.00014388
    Iteration 900	MSE loss: 0.00013843
    Iteration 1000	MSE loss: 0.00013250
    Iteration 1100	MSE loss: 0.00012603
    Iteration 1200	MSE loss: 0.00011904
    Iteration 1300	MSE loss: 0.00011156
    Iteration 1400	MSE loss: 0.00010354
    Iteration 1500	MSE loss: 0.00009509
    Iteration 1600	MSE loss: 0.00008628
    Iteration 1700	MSE loss: 0.00007730
    Iteration 1800	MSE loss: 0.00006836
    Iteration 1900	MSE loss: 0.00005964
    Iteration 2000	MSE loss: 0.00005108
    Iteration 2100	MSE loss: 0.00004280
    Iteration 2200	MSE loss: 0.00003522
    Iteration 2300	MSE loss: 0.00002883
    Iteration 2400	MSE loss: 0.00002361
    Iteration 2500	MSE loss: 0.00001951
    Iteration 2600	MSE loss: 0.00001645
    Iteration 2700	MSE loss: 0.00001426
    Iteration 2800	MSE loss: 0.00001285
    Iteration 2900	MSE loss: 0.00001199
    Iteration 3000	MSE loss: 0.00001149
    Iteration 3100	MSE loss: 0.00001121
    Iteration 3200	MSE loss: 0.00001105
    Iteration 3300	MSE loss: 0.00001096
    Iteration 3400	MSE loss: 0.00001090
    Iteration 3500	MSE loss: 0.00001085
    Iteration 3600	MSE loss: 0.00001081
    Iteration 3700	MSE loss: 0.00001076
    Iteration 3800	MSE loss: 0.00001072
    Iteration 3900	MSE loss: 0.00001067
    Iteration 4000	MSE loss: 0.00001063
    Iteration 4100	MSE loss: 0.00001058
    Iteration 4200	MSE loss: 0.00001052
    Iteration 4300	MSE loss: 0.00001046
    Iteration 4400	MSE loss: 0.00001040
    Iteration 4500	MSE loss: 0.00001033
    Iteration 4600	MSE loss: 0.00001026
    Iteration 4700	MSE loss: 0.00001019
    Iteration 4800	MSE loss: 0.00001011
    Iteration 4900	MSE loss: 0.00001003
    Iteration 5000	MSE loss: 0.00000995
    Iteration 5100	MSE loss: 0.00000986
    Iteration 5200	MSE loss: 0.00000977
    Iteration 5300	MSE loss: 0.00000968
    Iteration 5400	MSE loss: 0.00000957
    Iteration 5500	MSE loss: 0.00000947
    Iteration 5600	MSE loss: 0.00000936
    Iteration 5700	MSE loss: 0.00000925
    Iteration 5800	MSE loss: 0.00000913
    Iteration 5900	MSE loss: 0.00000900
    Iteration 6000	MSE loss: 0.00000887
    Iteration 6100	MSE loss: 0.00000873
    Iteration 6200	MSE loss: 0.00000858
    Iteration 6300	MSE loss: 0.00000842
    Iteration 6400	MSE loss: 0.00000824
    Iteration 6500	MSE loss: 0.00000805
    Iteration 6600	MSE loss: 0.00000785
    Iteration 6700	MSE loss: 0.00000763
    Iteration 6800	MSE loss: 0.00000740
    Iteration 6900	MSE loss: 0.00000716
    Iteration 7000	MSE loss: 0.00000689
    Iteration 7100	MSE loss: 0.00000661
    Iteration 7200	MSE loss: 0.00000631
    Iteration 7300	MSE loss: 0.00000600
    Iteration 7400	MSE loss: 0.00000566
    Iteration 7500	MSE loss: 0.00000532
    Iteration 7600	MSE loss: 0.00000496
    Iteration 7700	MSE loss: 0.00000459
    Iteration 7800	MSE loss: 0.00000422
    Iteration 7900	MSE loss: 0.00000385
    Iteration 8000	MSE loss: 0.00000348
    Iteration 8100	MSE loss: 0.00000312
    Iteration 8200	MSE loss: 0.00000276
    Iteration 8300	MSE loss: 0.00000241
    Iteration 8400	MSE loss: 0.00000208
    Iteration 8500	MSE loss: 0.00000178
    Iteration 8600	MSE loss: 0.00000151
    Iteration 8700	MSE loss: 0.00000127
    Iteration 8800	MSE loss: 0.00000105
    Iteration 8900	MSE loss: 0.00000087
    Iteration 9000	MSE loss: 0.00000071
    Iteration 9100	MSE loss: 0.00000057
    Iteration 9200	MSE loss: 0.00000046
    Iteration 9300	MSE loss: 0.00000037
    Iteration 9400	MSE loss: 0.00000029
    Iteration 9500	MSE loss: 0.00000022
    Iteration 9600	MSE loss: 0.00000017
    Iteration 9700	MSE loss: 0.00000013
    Iteration 9800	MSE loss: 0.00000010
    Iteration 9900	MSE loss: 0.00000008
    Iteration 10000	MSE loss: 0.00000006
    Repetition no. 7
    Iteration 100	MSE loss: 0.00131612
    Iteration 200	MSE loss: 0.00129283
    Iteration 300	MSE loss: 0.00126498
    Iteration 400	MSE loss: 0.00123198
    Iteration 500	MSE loss: 0.00119201
    Iteration 600	MSE loss: 0.00114343
    Iteration 700	MSE loss: 0.00108188
    Iteration 800	MSE loss: 0.00099851
    Iteration 900	MSE loss: 0.00088997
    Iteration 1000	MSE loss: 0.00072855
    Iteration 1100	MSE loss: 0.00051898
    Iteration 1200	MSE loss: 0.00025331
    Iteration 1300	MSE loss: 0.00006830
    Iteration 1400	MSE loss: 0.00001668
    Iteration 1500	MSE loss: 0.00000951
    Iteration 1600	MSE loss: 0.00000872
    Iteration 1700	MSE loss: 0.00000844
    Iteration 1800	MSE loss: 0.00000818
    Iteration 1900	MSE loss: 0.00000791
    Iteration 2000	MSE loss: 0.00000762
    Iteration 2100	MSE loss: 0.00000731
    Iteration 2200	MSE loss: 0.00000699
    Iteration 2300	MSE loss: 0.00000665
    Iteration 2400	MSE loss: 0.00000630
    Iteration 2500	MSE loss: 0.00000594
    Iteration 2600	MSE loss: 0.00000557
    Iteration 2700	MSE loss: 0.00000517
    Iteration 2800	MSE loss: 0.00000475
    Iteration 2900	MSE loss: 0.00000434
    Iteration 3000	MSE loss: 0.00000388
    Iteration 3100	MSE loss: 0.00000322
    Iteration 3200	MSE loss: 0.00000255
    Iteration 3300	MSE loss: 0.00000194
    Iteration 3400	MSE loss: 0.00000141
    Iteration 3500	MSE loss: 0.00000098
    Iteration 3600	MSE loss: 0.00000067
    Iteration 3700	MSE loss: 0.00000044
    Iteration 3800	MSE loss: 0.00000029
    Iteration 3900	MSE loss: 0.00000018
    Iteration 4000	MSE loss: 0.00000012
    Iteration 4100	MSE loss: 0.00000007
    Iteration 4200	MSE loss: 0.00000005
    Iteration 4300	MSE loss: 0.00000003
    Iteration 4400	MSE loss: 0.00000002
    Iteration 4500	MSE loss: 0.00000002
    Iteration 4600	MSE loss: 0.00000002
    Iteration 4700	MSE loss: 0.00000002
    Iteration 4800	MSE loss: 0.00000002
    Iteration 4900	MSE loss: 0.00000002
    Iteration 5000	MSE loss: 0.00000002
    Iteration 5100	MSE loss: 0.00000002
    Iteration 5200	MSE loss: 0.00000002
    Iteration 5300	MSE loss: 0.00000002
    Iteration 5400	MSE loss: 0.00000002
    Iteration 5500	MSE loss: 0.00000002
    Iteration 5600	MSE loss: 0.00000002
    Iteration 5700	MSE loss: 0.00000002
    Iteration 5800	MSE loss: 0.00000002
    Iteration 5900	MSE loss: 0.00000002
    Iteration 6000	MSE loss: 0.00000002
    Iteration 6100	MSE loss: 0.00000002
    Iteration 6200	MSE loss: 0.00000002
    Iteration 6300	MSE loss: 0.00000002
    Iteration 6400	MSE loss: 0.00000002
    Iteration 6500	MSE loss: 0.00000002
    Iteration 6600	MSE loss: 0.00000002
    Iteration 6700	MSE loss: 0.00000002
    Iteration 6800	MSE loss: 0.00000001
    Iteration 6900	MSE loss: 0.00000001
    Iteration 7000	MSE loss: 0.00000001
    Iteration 7100	MSE loss: 0.00000001
    Iteration 7200	MSE loss: 0.00000001
    Iteration 7300	MSE loss: 0.00000002
    Iteration 7400	MSE loss: 0.00000001
    Iteration 7500	MSE loss: 0.00000001
    Iteration 7600	MSE loss: 0.00000001
    Iteration 7700	MSE loss: 0.00000001
    Iteration 7800	MSE loss: 0.00000001
    Iteration 7900	MSE loss: 0.00000001
    Iteration 8000	MSE loss: 0.00000001
    Iteration 8100	MSE loss: 0.00000002
    Iteration 8200	MSE loss: 0.00000003
    Iteration 8300	MSE loss: 0.00000001
    Iteration 8400	MSE loss: 0.00000002
    Iteration 8500	MSE loss: 0.00000001
    Iteration 8600	MSE loss: 0.00000001
    Iteration 8700	MSE loss: 0.00000001
    Iteration 8800	MSE loss: 0.00000001
    Iteration 8900	MSE loss: 0.00000002
    Iteration 9000	MSE loss: 0.00000001
    Iteration 9100	MSE loss: 0.00000001
    Iteration 9200	MSE loss: 0.00000001
    Iteration 9300	MSE loss: 0.00000002
    Iteration 9400	MSE loss: 0.00000001
    Iteration 9500	MSE loss: 0.00000001
    Iteration 9600	MSE loss: 0.00000001
    Iteration 9700	MSE loss: 0.00000003
    Iteration 9800	MSE loss: 0.00000001
    Iteration 9900	MSE loss: 0.00000001
    Iteration 10000	MSE loss: 0.00000001
    Repetition no. 8
    Iteration 100	MSE loss: 0.00102367
    Iteration 200	MSE loss: 0.00099691
    Iteration 300	MSE loss: 0.00095964
    Iteration 400	MSE loss: 0.00089397
    Iteration 500	MSE loss: 0.00079366
    Iteration 600	MSE loss: 0.00066794
    Iteration 700	MSE loss: 0.00051949
    Iteration 800	MSE loss: 0.00037400
    Iteration 900	MSE loss: 0.00024607
    Iteration 1000	MSE loss: 0.00014230
    Iteration 1100	MSE loss: 0.00007581
    Iteration 1200	MSE loss: 0.00004267
    Iteration 1300	MSE loss: 0.00003168
    Iteration 1400	MSE loss: 0.00003011
    Iteration 1500	MSE loss: 0.00002970
    Iteration 1600	MSE loss: 0.00002933
    Iteration 1700	MSE loss: 0.00002894
    Iteration 1800	MSE loss: 0.00002853
    Iteration 1900	MSE loss: 0.00002810
    Iteration 2000	MSE loss: 0.00002762
    Iteration 2100	MSE loss: 0.00002712
    Iteration 2200	MSE loss: 0.00002657
    Iteration 2300	MSE loss: 0.00002599
    Iteration 2400	MSE loss: 0.00002533
    Iteration 2500	MSE loss: 0.00002461
    Iteration 2600	MSE loss: 0.00002386
    Iteration 2700	MSE loss: 0.00002306
    Iteration 2800	MSE loss: 0.00002216
    Iteration 2900	MSE loss: 0.00002119
    Iteration 3000	MSE loss: 0.00002017
    Iteration 3100	MSE loss: 0.00001906
    Iteration 3200	MSE loss: 0.00001790
    Iteration 3300	MSE loss: 0.00001670
    Iteration 3400	MSE loss: 0.00001547
    Iteration 3500	MSE loss: 0.00001416
    Iteration 3600	MSE loss: 0.00001281
    Iteration 3700	MSE loss: 0.00001137
    Iteration 3800	MSE loss: 0.00000982
    Iteration 3900	MSE loss: 0.00000814
    Iteration 4000	MSE loss: 0.00000642
    Iteration 4100	MSE loss: 0.00000493
    Iteration 4200	MSE loss: 0.00000374
    Iteration 4300	MSE loss: 0.00000277
    Iteration 4400	MSE loss: 0.00000201
    Iteration 4500	MSE loss: 0.00000142
    Iteration 4600	MSE loss: 0.00000099
    Iteration 4700	MSE loss: 0.00000067
    Iteration 4800	MSE loss: 0.00000046
    Iteration 4900	MSE loss: 0.00000038
    Iteration 5000	MSE loss: 0.00000021
    Iteration 5100	MSE loss: 0.00000015
    Iteration 5200	MSE loss: 0.00000010
    Iteration 5300	MSE loss: 0.00000007
    Iteration 5400	MSE loss: 0.00000005
    Iteration 5500	MSE loss: 0.00000012
    Iteration 5600	MSE loss: 0.00000003
    Iteration 5700	MSE loss: 0.00000002
    Iteration 5800	MSE loss: 0.00000002
    Iteration 5900	MSE loss: 0.00000002
    Iteration 6000	MSE loss: 0.00000001
    Iteration 6100	MSE loss: 0.00000001
    Iteration 6200	MSE loss: 0.00000002
    Iteration 6300	MSE loss: 0.00000001
    Iteration 6400	MSE loss: 0.00000001
    Iteration 6500	MSE loss: 0.00000002
    Iteration 6600	MSE loss: 0.00000001
    Iteration 6700	MSE loss: 0.00000018
    Iteration 6800	MSE loss: 0.00000001
    Iteration 6900	MSE loss: 0.00000001
    Iteration 7000	MSE loss: 0.00000001
    Iteration 7100	MSE loss: 0.00000001
    Iteration 7200	MSE loss: 0.00000001
    Iteration 7300	MSE loss: 0.00000001
    Iteration 7400	MSE loss: 0.00000001
    Iteration 7500	MSE loss: 0.00000004
    Iteration 7600	MSE loss: 0.00000001
    Iteration 7700	MSE loss: 0.00000007
    Iteration 7800	MSE loss: 0.00000001
    Iteration 7900	MSE loss: 0.00000001
    Iteration 8000	MSE loss: 0.00000001
    Iteration 8100	MSE loss: 0.00000002
    Iteration 8200	MSE loss: 0.00000001
    Iteration 8300	MSE loss: 0.00000001
    Iteration 8400	MSE loss: 0.00000001
    Iteration 8500	MSE loss: 0.00000001
    Iteration 8600	MSE loss: 0.00000001
    Iteration 8700	MSE loss: 0.00000001
    Iteration 8800	MSE loss: 0.00000049
    Iteration 8900	MSE loss: 0.00000001
    Iteration 9000	MSE loss: 0.00000001
    Iteration 9100	MSE loss: 0.00000001
    Iteration 9200	MSE loss: 0.00000001
    Iteration 9300	MSE loss: 0.00000005
    Iteration 9400	MSE loss: 0.00000001
    Iteration 9500	MSE loss: 0.00000001
    Iteration 9600	MSE loss: 0.00000007
    Iteration 9700	MSE loss: 0.00000001
    Iteration 9800	MSE loss: 0.00000004
    Iteration 9900	MSE loss: 0.00000001
    Iteration 10000	MSE loss: 0.00000001
    Repetition no. 9
    Iteration 100	MSE loss: 0.00312155
    Iteration 200	MSE loss: 0.00280136
    Iteration 300	MSE loss: 0.00224560
    Iteration 400	MSE loss: 0.00135597
    Iteration 500	MSE loss: 0.00039418
    Iteration 600	MSE loss: 0.00005539
    Iteration 700	MSE loss: 0.00002262
    Iteration 800	MSE loss: 0.00002055
    Iteration 900	MSE loss: 0.00001964
    Iteration 1000	MSE loss: 0.00001869
    Iteration 1100	MSE loss: 0.00001767
    Iteration 1200	MSE loss: 0.00001627
    Iteration 1300	MSE loss: 0.00001470
    Iteration 1400	MSE loss: 0.00001312
    Iteration 1500	MSE loss: 0.00001156
    Iteration 1600	MSE loss: 0.00001004
    Iteration 1700	MSE loss: 0.00000860
    Iteration 1800	MSE loss: 0.00000725
    Iteration 1900	MSE loss: 0.00000592
    Iteration 2000	MSE loss: 0.00000473
    Iteration 2100	MSE loss: 0.00000370
    Iteration 2200	MSE loss: 0.00000283
    Iteration 2300	MSE loss: 0.00000213
    Iteration 2400	MSE loss: 0.00000157
    Iteration 2500	MSE loss: 0.00000115
    Iteration 2600	MSE loss: 0.00000083
    Iteration 2700	MSE loss: 0.00000060
    Iteration 2800	MSE loss: 0.00000044
    Iteration 2900	MSE loss: 0.00000033
    Iteration 3000	MSE loss: 0.00000025
    Iteration 3100	MSE loss: 0.00000020
    Iteration 3200	MSE loss: 0.00000017
    Iteration 3300	MSE loss: 0.00000015
    Iteration 3400	MSE loss: 0.00000013
    Iteration 3500	MSE loss: 0.00000012
    Iteration 3600	MSE loss: 0.00000012
    Iteration 3700	MSE loss: 0.00000011
    Iteration 3800	MSE loss: 0.00000011
    Iteration 3900	MSE loss: 0.00000011
    Iteration 4000	MSE loss: 0.00000010
    Iteration 4100	MSE loss: 0.00000010
    Iteration 4200	MSE loss: 0.00000010
    Iteration 4300	MSE loss: 0.00000010
    Iteration 4400	MSE loss: 0.00000009
    Iteration 4500	MSE loss: 0.00000009
    Iteration 4600	MSE loss: 0.00000009
    Iteration 4700	MSE loss: 0.00000009
    Iteration 4800	MSE loss: 0.00000008
    Iteration 4900	MSE loss: 0.00000008
    Iteration 5000	MSE loss: 0.00000008
    Iteration 5100	MSE loss: 0.00000008
    Iteration 5200	MSE loss: 0.00000007
    Iteration 5300	MSE loss: 0.00000007
    Iteration 5400	MSE loss: 0.00000007
    Iteration 5500	MSE loss: 0.00000007
    Iteration 5600	MSE loss: 0.00000007
    Iteration 5700	MSE loss: 0.00000006
    Iteration 5800	MSE loss: 0.00000006
    Iteration 5900	MSE loss: 0.00000007
    Iteration 6000	MSE loss: 0.00000006
    Iteration 6100	MSE loss: 0.00000005
    Iteration 6200	MSE loss: 0.00000005
    Iteration 6300	MSE loss: 0.00000007
    Iteration 6400	MSE loss: 0.00000005
    Iteration 6500	MSE loss: 0.00000005
    Iteration 6600	MSE loss: 0.00000005
    Iteration 6700	MSE loss: 0.00000006
    Iteration 6800	MSE loss: 0.00000004
    Iteration 6900	MSE loss: 0.00000004
    Iteration 7000	MSE loss: 0.00000004
    Iteration 7100	MSE loss: 0.00000005
    Iteration 7200	MSE loss: 0.00000010
    Iteration 7300	MSE loss: 0.00000003
    Iteration 7400	MSE loss: 0.00000004
    Iteration 7500	MSE loss: 0.00000003
    Iteration 7600	MSE loss: 0.00000003
    Iteration 7700	MSE loss: 0.00000003
    Iteration 7800	MSE loss: 0.00000007
    Iteration 7900	MSE loss: 0.00000003
    Iteration 8000	MSE loss: 0.00000003
    Iteration 8100	MSE loss: 0.00000003
    Iteration 8200	MSE loss: 0.00000003
    Iteration 8300	MSE loss: 0.00000003
    Iteration 8400	MSE loss: 0.00000002
    Iteration 8500	MSE loss: 0.00000005
    Iteration 8600	MSE loss: 0.00000002
    Iteration 8700	MSE loss: 0.00000005
    Iteration 8800	MSE loss: 0.00000002
    Iteration 8900	MSE loss: 0.00000002
    Iteration 9000	MSE loss: 0.00000010
    Iteration 9100	MSE loss: 0.00000002
    Iteration 9200	MSE loss: 0.00000003
    Iteration 9300	MSE loss: 0.00000002
    Iteration 9400	MSE loss: 0.00000006
    Iteration 9500	MSE loss: 0.00000002
    Iteration 9600	MSE loss: 0.00000005
    Iteration 9700	MSE loss: 0.00000002
    Iteration 9800	MSE loss: 0.00000002
    Iteration 9900	MSE loss: 0.00000002
    Iteration 10000	MSE loss: 0.00000002
    Repetition no. 10
    Iteration 100	MSE loss: 0.00087174
    Iteration 200	MSE loss: 0.00082858
    Iteration 300	MSE loss: 0.00080937
    Iteration 400	MSE loss: 0.00078600
    Iteration 500	MSE loss: 0.00075810
    Iteration 600	MSE loss: 0.00072487
    Iteration 700	MSE loss: 0.00065273
    Iteration 800	MSE loss: 0.00052479
    Iteration 900	MSE loss: 0.00038761
    Iteration 1000	MSE loss: 0.00025254
    Iteration 1100	MSE loss: 0.00014038
    Iteration 1200	MSE loss: 0.00006436
    Iteration 1300	MSE loss: 0.00002390
    Iteration 1400	MSE loss: 0.00000877
    Iteration 1500	MSE loss: 0.00000380
    Iteration 1600	MSE loss: 0.00000321
    Iteration 1700	MSE loss: 0.00000315
    Iteration 1800	MSE loss: 0.00000310
    Iteration 1900	MSE loss: 0.00000304
    Iteration 2000	MSE loss: 0.00000298
    Iteration 2100	MSE loss: 0.00000292
    Iteration 2200	MSE loss: 0.00000285
    Iteration 2300	MSE loss: 0.00000277
    Iteration 2400	MSE loss: 0.00000268
    Iteration 2500	MSE loss: 0.00000257
    Iteration 2600	MSE loss: 0.00000246
    Iteration 2700	MSE loss: 0.00000235
    Iteration 2800	MSE loss: 0.00000223
    Iteration 2900	MSE loss: 0.00000211
    Iteration 3000	MSE loss: 0.00000198
    Iteration 3100	MSE loss: 0.00000186
    Iteration 3200	MSE loss: 0.00000174
    Iteration 3300	MSE loss: 0.00000162
    Iteration 3400	MSE loss: 0.00000150
    Iteration 3500	MSE loss: 0.00000139
    Iteration 3600	MSE loss: 0.00000129
    Iteration 3700	MSE loss: 0.00000119
    Iteration 3800	MSE loss: 0.00000109
    Iteration 3900	MSE loss: 0.00000099
    Iteration 4000	MSE loss: 0.00000091
    Iteration 4100	MSE loss: 0.00000081
    Iteration 4200	MSE loss: 0.00000071
    Iteration 4300	MSE loss: 0.00000061
    Iteration 4400	MSE loss: 0.00000053
    Iteration 4500	MSE loss: 0.00000045
    Iteration 4600	MSE loss: 0.00000038
    Iteration 4700	MSE loss: 0.00000032
    Iteration 4800	MSE loss: 0.00000027
    Iteration 4900	MSE loss: 0.00000022
    Iteration 5000	MSE loss: 0.00000018
    Iteration 5100	MSE loss: 0.00000015
    Iteration 5200	MSE loss: 0.00000012
    Iteration 5300	MSE loss: 0.00000010
    Iteration 5400	MSE loss: 0.00000008
    Iteration 5500	MSE loss: 0.00000007
    Iteration 5600	MSE loss: 0.00000005
    Iteration 5700	MSE loss: 0.00000004
    Iteration 5800	MSE loss: 0.00000004
    Iteration 5900	MSE loss: 0.00000003
    Iteration 6000	MSE loss: 0.00000003
    Iteration 6100	MSE loss: 0.00000003
    Iteration 6200	MSE loss: 0.00000002
    Iteration 6300	MSE loss: 0.00000002
    Iteration 6400	MSE loss: 0.00000002
    Iteration 6500	MSE loss: 0.00000002
    Iteration 6600	MSE loss: 0.00000002
    Iteration 6700	MSE loss: 0.00000002
    Iteration 6800	MSE loss: 0.00000002
    Iteration 6900	MSE loss: 0.00000002
    Iteration 7000	MSE loss: 0.00000002
    Iteration 7100	MSE loss: 0.00000002
    Iteration 7200	MSE loss: 0.00000002
    Iteration 7300	MSE loss: 0.00000002
    Iteration 7400	MSE loss: 0.00000002
    Iteration 7500	MSE loss: 0.00000002
    Iteration 7600	MSE loss: 0.00000002
    Iteration 7700	MSE loss: 0.00000002
    Iteration 7800	MSE loss: 0.00000002
    Iteration 7900	MSE loss: 0.00000002
    Iteration 8000	MSE loss: 0.00000002
    Iteration 8100	MSE loss: 0.00000003
    Iteration 8200	MSE loss: 0.00000002
    Iteration 8300	MSE loss: 0.00000002
    Iteration 8400	MSE loss: 0.00000001
    Iteration 8500	MSE loss: 0.00000001
    Iteration 8600	MSE loss: 0.00000001
    Iteration 8700	MSE loss: 0.00000001
    Iteration 8800	MSE loss: 0.00000001
    Iteration 8900	MSE loss: 0.00000002
    Iteration 9000	MSE loss: 0.00000001
    Iteration 9100	MSE loss: 0.00000001
    Iteration 9200	MSE loss: 0.00000001
    Iteration 9300	MSE loss: 0.00000001
    Iteration 9400	MSE loss: 0.00000001
    Iteration 9500	MSE loss: 0.00000001
    Iteration 9600	MSE loss: 0.00000001
    Iteration 9700	MSE loss: 0.00000002
    Iteration 9800	MSE loss: 0.00000001
    Iteration 9900	MSE loss: 0.00000001
    Iteration 10000	MSE loss: 0.00000002

### Plot results

```python
avg_acc = calculate_avg_accuracy(Y, S)  # calculate average accuracy for 2 <= k <= k2
```

```python
ks_k2 = np.arange(2, k2 + 1)
ks_k1 = np.arange(2, k1 + 1)

plt.figure(figsize=(12, 9))

# Plot the average accuracy for 2 <= k <= k2:
exp_k2_plt, = plt.plot(ks_k2, avg_acc, color='k', linewidth=2)

for rep in range(repetitions):
    # Plot the estimated average accuracy for 2 <= k <= k2:
    est_plt, = plt.plot(ks_k2, all_est_accs[rep], color='orange',  linewidth=2)
    # Plot the average accuracies over the experiment's subsample of k1 classes:
    exp_plt, = plt.plot(ks_k1, all_avg_accs[rep], color='dimgrey', linewidth=2)

plt.grid()
plt.xlabel(r'$k$', fontsize = 15)
plt.ylabel('Accuracy', fontsize = 15)
plt.legend([est_plt, exp_plt, exp_k2_plt], [r'$\hat{\mathbb{E}}_{k}[{\mathcal{A}}]$',
                                            r'$\bar{\mathcal{A}}^{k_1}_k$',
                                            r'$\mathbb{E}_k[{\mathcal{A}}]$'], fontsize = 15);
```

```python

```


```python
from IPython.display import Image
from IPython.core.display import HTML
from sympy import *
Image(url= "https://i.imgur.com/KjUCSfj.png")
```

```python
x,a,y,b = symbols("x a y b ")
f = lambda x: 9*x*(ln(x)+ln(3))-6*x+pi
print(Derivative(f(x)).doit())
```

    9*log(x) + 3 + 9*log(3)

```python
Image(url= "https://i.imgur.com/xevzAkU.png")
```

```python
f = lambda x: Piecewise((x, (x< 1)), (1/x, x >= 1))
print(Integral(f(x),(x,0,9)).doit())
```

    1/2 + log(9)

```python
print(diff(g(x)))
```

    5*x**4*log(x) + x**4

```python
Image(url= "https://i.imgur.com/e9M6KpV.png")
```