From 157f71184e410e9770cb7060a93931c4aca07c26 Mon Sep 17 00:00:00 2001
From: selalimi <saraelalami2001@gmail.com>
Date: Fri, 10 Nov 2023 22:38:23 -0500
Subject: [PATCH] Final Update

---
 README.md        |   2 +-
 Results/mlp.png  | Bin 36849 -> 30518 bytes
 knn.py           |  14 +-
 main.ipynb       | 623 -----------------------------------------------
 mlp.py           | 354 ++++++++++++---------------
 requirements.txt | Bin 4086 -> 142 bytes
 test/test_mlp.py |  12 +-
 7 files changed, 175 insertions(+), 830 deletions(-)
 delete mode 100644 main.ipynb

diff --git a/README.md b/README.md
index cc072b6..c10f173 100644
--- a/README.md
+++ b/README.md
@@ -90,7 +90,7 @@ Unfortunately, the performance of the KNN algorithm was disappointing, with accu
 4. *Lack of Feature Abstraction*: KNN directly uses pixels as features. More advanced feature extraction techniques could improve performance
 
  ## Analysis of ANN Results
-The deep learning algorithm (ANN) used for our dataset has relatively low performance, with test set accuracy plateauing around 15% over 100 epochs.
+The deep learning algorithm (ANN) used for our dataset has relatively low performance, with test set accuracy plateauing around 14% over 100 epochs.
 
 These results suggest that adjustments to certain aspects of the model, such as complexity, hyperparameters, or weight initialization, may be necessary to improve its ability to generalize to new data. Further exploration of these aspects could be beneficial in optimizing model performance.
 
diff --git a/Results/mlp.png b/Results/mlp.png
index 508165161125d93c3053d5a2c0fece13c34cbf9b..ae0874322238e9f205dbdcf5c262f719cc6cfedd 100644
GIT binary patch
literal 30518
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
E0FuV(UH||9

literal 36849
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
z%0A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

diff --git a/knn.py b/knn.py
index f0efd4c..1998519 100644
--- a/knn.py
+++ b/knn.py
@@ -2,7 +2,7 @@ import numpy as np
 import os
 import pickle
 import matplotlib.pyplot as plt
-import plotly.graph_objects as go
+import read_cifar as rc
 
 
 
@@ -77,3 +77,15 @@ def plot_KNN(X_train, y_train, X_test, y_test, max_k=20):
     plt.ylabel('Accuracy')
     plt.title('Variation of Accuracy with K')
     plt.savefig("Results/knn.png")
+
+# The following code block is executed only if the script is run as the main program
+if _name_ == "_main_":
+    # Read the CIFAR-10 dataset from the specified path
+    X, y = rc.read_cifar('data\cifar-10-batches-py')
+    
+    # Split the dataset into training and testing sets
+    X_train, y_train, X_test, y_test = rc.split_dataset(X, y, split=0.9)
+    
+    # Plot the evolution of learning accuracy across the number of neighbors (K) using the 'plot_KNN' function
+    plot_KNN(X_train, y_train, X_test, y_test, max_k=20)
+
diff --git a/main.ipynb b/main.ipynb
deleted file mode 100644
index 04aa675..0000000
--- a/main.ipynb
+++ /dev/null
@@ -1,623 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "## Prepare the Dataset"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "import read_cifar as rc\n",
-    "X,y=rc.read_cifar('data') \n",
-    "# Split the Dataset\n",
-    "X_train,y_train,X_test,y_test=rc.split_dataset(X,y,split=0.9) "
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "## k-nearest neighbors"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "image/png": "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QLcivFYLXL2qbF2IiIhcEQOQAnx85A1gNxgREZESGIAUwnFAREREymEAUggDEBERkXIYgBTCAERERKQcBiCFcD0wIiIi5TAAKYQtQERERMphAFII1wMjIiJSDgOQQtgCREREpBwGIIUwABERESmHAUghDEBERETKYQBSCAMQERGRchiAFMIAREREpBwGIIWUDUBCKFsXIiIiV8MApBBdACopAQoLla0LERGRq2EAUkitWoCnp3zMbjAiIiL7YgBSiErFcUBERERKYQBSEAMQERGRMhiAFMQFUYmIiJTBAKQgtgAREREpgwFIQVwQlYiISBkMQApiCxAREZEyGIAUxABERESkDAYgBTEAERERKYMBSEEMQERERMpgAFIQAxAREZEyGIAUxABERESkDAYgBTEAERERKYMBSEG6AHTzJnDjhrJ1ISIiciUMQAry8wPc3eVjtgIRERHZDwOQgrgiPBERkTIYgBTGAERERGR/DEAK43pgRERE9scApDC2ABEREdkfA5DCGICIiIjsjwFIYQxARERE9scApDAGICIiIvtjAFIYAxAREZH9MQApjAGIiIjI/hiAFMYAREREZH8MQApjACIiIrI/BiCFMQARERHZHwOQwurWlfeFhUBRkbJ1ISIichUMQArz9wfc/ncWrlxRti5ERESuggFIYW5uQJ068jHXAyMiIrIPBiAHwHFARERE9sUA5AAYgIiIiOyLAcgBMAARERHZFwOQA2AAIiIisi8GIAfAAERERGRfDEAOgAGIiIjIvhiAHAADEBERkX0xADkABiAiIiL7YgByAAxARERE9sUA5AAYgIiIiOyLAcgB6BZEZQAiIiKyDwYgB6BrASooAEpKlK0LERGRK2AAcgCBgaWPuSI8ERGR7TlEAJo/fz4iIyPh7e2NuLg47N6922TZlJQUxMbGIjAwEL6+voiJicGyZcsMyowZMwYqlcrg1rt3b1sfRpWp1aUhiN1gREREtueudAXWrFmDpKQkLFy4EHFxcZgzZw569eqFzMxM1K9fv1z5oKAgTJs2DdHR0fD09MSPP/6IxMRE1K9fH7169dKX6927N7766iv9z15eXnY5nqoKCgLy8hiAiIiI7EHxFqCPPvoITz/9NBITE3HnnXdi4cKFqFWrFhYvXmy0fLdu3TBw4EC0bNkSTZs2xcSJE9GmTRts27bNoJyXlxcaNGigv9WpU8ceh1NlvBKMiIjIfhQNQMXFxdi7dy969Oih3+bm5oYePXpgx44dlb5eCIHU1FRkZmaia9euBs+lpaWhfv36aNGiBZ5//nlcunTJ6vW3JgYgIiIi+1G0Cyw3NxcajQYhISEG20NCQnD06FGTr8vPz0d4eDiKioqgVqvx2WefoWfPnvrne/fujYSEBERFReHEiRN47bXX0KdPH+zYsQNqtbrc/oqKilBUVKT/uaCgwApHZxkGICIiIvtRfAxQVfj5+WHfvn24du0aUlNTkZSUhCZNmqBbt24AgOHDh+vLtm7dGm3atEHTpk2RlpaGBx54oNz+kpOT8eabb9qr+kYxABEREdmPol1gwcHBUKvVyMnJMdiek5ODBg0amHydm5sbmjVrhpiYGEyZMgWDBw9GcnKyyfJNmjRBcHAwjh8/bvT5V199Ffn5+frbmTNnqnZA1cAAREREZD+KBiBPT0906NABqamp+m1arRapqano3Lmz2fvRarUGXVi3y8rKwqVLlxAaGmr0eS8vL/j7+xvc7I0BiIiIyH4U7wJLSkrC6NGjERsbi06dOmHOnDkoLCxEYmIiAGDUqFEIDw/Xt/AkJycjNjYWTZs2RVFREdavX49ly5ZhwYIFAIBr167hzTffxKBBg9CgQQOcOHECL7/8Mpo1a2ZwmbyjYQAiIiKyH8UD0LBhw3Dx4kXMmDED58+fR0xMDH7++Wf9wOjTp0/Dza20oaqwsBBjx45FVlYWfHx8EB0djeXLl2PYsGEAALVajf3792Pp0qXIy8tDWFgYHnzwQcyaNcuh5wLiemBERET2oxJCCKUr4WgKCgoQEBCA/Px8u3WHbd8O3Hsv0KQJcOKEXd6SiIioRrHk+1vxiRBJYhcYERGR/SjeBUaSLgDl5QEajVwfjAiQ/x7S04Fz54DQUCA+nv8+iIiqiy1ADqLsSh15eYpVgxxMSgoQGQl07w48+qi8j4yU24mIqOoYgByEhwfg5ycfsxuMABlyBg8GsrIMt2dny+0MQUREVccA5EA4Doh0NBpg4kTA2CUKum2TJslyRERkOQYgB8IARDrp6eVbfsoSAjhzRpYjIiLLMQA5EAYg0jl3zrrliIjIEAOQA2EAIh0Tq7ZUuRwRERliAHIgDECkEx8PNGxYcZmICFmOiIgsxwDkQBiASEetBj78sOIyb7zB+YCIiKqKAciBcD0wKquwUN673fYpdf/f9KVr1gBarX3rRERUUzAAORBdC9ClS8rWg5Sn1QKzZ8vH77wDbN4MrFwp7/fuBXx8gF9+AT74QNl6EhE5Ky6F4UDYBUY6P/wAHD0KBAQAzz8P3L6m39y5wNNPA9OmAV27AnffrUw9iYicFVuAHAgDEAFyjp/33pOPjYUfAHjySWDYMODWLWD4cC6fQkRkKQYgB8IARACwbRuwYwfg6SlngzZGpQIWLQKaNAFOnQKeesr4rNFERGQcA5AD0QWgK1c4uNWV6Vp/Ro8GGjQwXS4gAFi9Wg6K/vZbGYiIiMg8DEAORLcivFYLFBQoWxdSxsGDwH//K1t4Xnyx8vIdOwLvvisfT5oE7N9v0+oREdUYDEAOxNsbqFVLPmY3mGt6/315n5AA3HGHea+ZPBl46CGgqEiOB9JdPu8INBogLQ1YtUrec/FWInIUDEAOhuOAXNfp0/JSdwCYOtX817m5AUuWyGUxjhwBJkywSfUslpICREYC3bsDjz4q7yMj5XYiIqUxADkYBiDX9fHH8qqu7t1l15Yl6tUDVqyQXWeLF5cGKaWkpACDB5df0T47W25nCCIipTEAORgGINd0+TLw+efysSWtP2V17w5Mny4fP/cccPy4depmKY1GXr1m7Ko03bZJk9gdRkTKYgByMAxArmn+fDl2JyYGePDBqu9n+nS5QOrVq3I8UFGR1apotvT08i0/ZQkBnDkjyxERKYUByMEwALme69flzM4A8PLLshurqtzdZfdXUJBcMuPVV61TR0ucO2fdckREtsAA5GB0C6JyPTDX8dVXQG4uEBUFDBlS/f01bCgHRQNyXNGPP1Z/n5bw9javXGiobetBRFQRBiAHwxYg13LrVumCplOmlK70Xl2PPFI6i/SYMRV3SVlTSopco6wyERGyq46ISCkMQA6GAcg2HHU+mrVrgX/+AYKDgcRE6+77vfeA9u1la+LIkbY95itXgMceAwYNku/XqJHsyjPVnffUU4Babbv6EBFVhgHIwTAAWZ+jzkdTdtHTCRNKJ8G0Fi8vuVRG7drA1q3Av/5l3f3r/PQTcNdd8jJ8NzfgtdeAv/4CvvkGCA83LOvrK++/+EKGJiIipTAAORgGIOty5PlofvkF+PNPGQrGjbPNezRvDixcKB+/9RawZYv19n31KvDMM3IW6rNn5czV27cDb78tw1dCgmzd2rxZDszevFn+3ps2lVeBjR3LBVyJSDkMQA6GAch6HH0+Gl3rz9NPl553Wxg5UnavabWyBSw3t/r7TEsD2rQpnbto0iTgjz+AuDjDcmo10K0bMGKEvA8IkC1FarVsnVJ6wkYicl0MQA6mbADiX8fV48jz0ezZI1tE3N2BpCTbv9+8eUCLFrKlZsyYqv/bun5dhp3u3WXrTmSkPI6PPza/Cy8uDpgxQz4eO1buh4jI3hiAHIwuAN26BVy7pmxdnJ0jz0eja/159FF5RZSt+foCX38tu6b++19gzhzL97FzJ9CuHfDJJ/LnZ56Rq89362b5vl57DbjnHqCgABg1ynEGpROR62AAcjA+PvJLCmA3WHWZO8+Mveej+euv0rFHL79sv/dt00a21AByuY3ffzfvdUVFMrDce6+se1iYHPi8aBHg51e1uri7A8uWydenp5cGQiIie2EAcjAqFccBWUt8vJwU0BSVSpn5aD74QHZBPfww0KqVfd/7uefk4OSSErlURkFBxeX37ZMLsyYnyzFEjz0GHDwI9O5d/bo0aSK75gBg5kzzAxkRkTUwADkgBiDrUKtLJwM0Rgi5dpY956M5fx5YulQ+ruqip9WhUslL0Bs3Bk6ckIHo1q3ycyTduiUvm+/YEThwQK42/+23stWmTh3r1WfUKHk13q1bcrB2YaH19k1EVBEGIAfEAGQ9f/4p728foKubcXnuXCA/3371+eQToLgY6NxZdikpoU4dGXbUanlfv77hHEnh4UB0tAyHt27JFqODB+W9talUsistPFx2r02ZYv33ICIyhgHIAXE9MOs4e1Zeag0Av/5qOB9NZqYc+3PwIDBwoAwltlZQACxYIB9PnVq9RU+rq3Nn2QUGlJ+QMCdHtg7VqgUsXy4nNKxf33Z1CQoqbRVbtAj4v/+z3XsREelYHIAiIyPx1ltv4fTp07aoD4EtQNYyf75swejSRV56XXY+miZNgPXr5SzJmzcDTzwhx7jY0qJFsrWpZUu5VpeSNJrKJ0UMDJQhyR5B7YEHSlt/nnxSdhUSEdmSxQFo0qRJSElJQZMmTdCzZ0+sXr0aRUVFtqiby2IAqr7r10tnQJ482XiZmBg5rsXdXU7ON22a7epTVFR6BdZLL8klI5RU2RxJgGxBs+ccSW+/DbRtKydqTEzkPFhEZFtVCkD79u3D7t270bJlS4wfPx6hoaF44YUXkJGRYYs6uhwGoOpbtkz+/qKigP79TZd78EE5KBgA3n0X+Owz29Rn+XI531B4uBzsqzRHnCPJy0sGUW9v4OefbXcuiIiAaowBat++PebOnYuzZ89i5syZ+OKLL9CxY0fExMRg8eLFEPzzrcoYgKpHqy2d6G/ChMqv8ho9Gpg1Sz4ePx5Yt8769Xn/ffl48mTA09O6+68KR50jqVUrYPZs+fjFF4HDh+37/kTkOqocgEpKSvD111+jX79+mDJlCmJjY/HFF19g0KBBeO211zDSEf7MdVIMQNWzYQNw9KicZO+JJ8x7zbRpck0urVaOE9q503r1WbdODroODJSzJzsC3RxJpsb3KDVHEgC88ALQqxdw86ZsLWMPOxHZgsUBKCMjw6Dbq1WrVjh48CC2bduGxMRETJ8+HZs2bcJ3331ni/q6BAag6tGNtXnqKcDf37zXqFSyy+Whh4AbN+Qg5WPHql8XIUpnOR47tuozJ1ubWl26pMXtIUj385w59p0jqez7f/UVEBwsJ2KcPt3+dSCims/iANSxY0ccO3YMCxYsQHZ2Nj744ANER0cblImKisJw3TW2ZDEGoKo7eBDYuFEOMp4wwbLXursDa9YAsbFyIG6fPsCFC9Wrz9atwK5dcnyLpfWxtYQEeYl7eLjh9oYN5XZbzPtjrtDQ0rFZH3wgr9QjIrImlbBwsM6pU6fQuHFjW9XHIRQUFCAgIAD5+fnwN7cJwYpOnZKrbHt5ydYIJeeLcTZPPQV8+SUwaJD8Eq+KnBw5T87Jk3Im5M2b5WKiVfHQQ3LdrOeeK50DyNFoNPJqr3PnZPCIj1em5ceYZ54BPv9chrL9+607CzUR1TyWfH9bHID27NkDrVaLuLg4g+27du2CWq1GbGys5TV2MEoHoKtXS7tuCgvLz2JMxl24ADRqJMeMbNtWvZmW//pLrlZ+6ZJcs+u770pnjzbX/v3ysm43N7m/pk2rXh9XVVgoV6A/dgwYNkzOXM0/CIjIFEu+vy3uAhs3bhzOnDlTbnt2djbGjRtn6e7IiNq1S79s2Q1mvoULZfjp2FGGl+q44w7ghx/kJdk//giMG2f5vDS6q5kGD2b4qSpfX3lpvFotuyeXL1e6RkRUU1gcgA4fPoz27duX296uXTsc5jWrVsEV4S1XVFQ6b8zkydZpJejcubTF4d//liuim+uff0qX4VBi0dOapGNH4I035ONx42TXJBFRdVkcgLy8vJCTk1Nu+7lz5+BuaR8BmaRbD4wByDyrVsmxOw0byhYXaxkwAJg3Tz6eNg34z3/Me91HH8mxNT16AEb+XiALvfqq7NK8ehV4/HG5xAkRUXVYHIAefPBBvPrqq8gvs4R2Xl4eXnvtNfTs2dOqlXNluhYgLohaOSFKL31/4QXAw8O6+x83Dnj5Zfn4ySflVWYVyc0tvYKJrT/WoVbL2b39/IDffiudWoCIqKosDkAffPABzpw5g8aNG6N79+7o3r07oqKicP78eXz44Ye2qKNLYheY+TZvlgOOa9Wy3USDyclygsRbt+QVZn/+abrsp5/Kq/fat5eLfJJ1REXJBW4B2SW2Z4+i1SEiJ2dxAAoPD8f+/fsxe/Zs3HnnnejQoQM++eQTHDhwABEREbaoo0tiADKfrvVnzBjbXSbt5iYn5+vWTXbDPPQQcPp0+XKFhaVdZlOn8oola3vsMXk12K1bcpboa9eUrhEROasqDdrx9fXFM44yp38NxQBknr/+kldpAcDEibZ9Ly8veTl8ly7AoUNyosRt2wxD1+LF8pw1aSJbisi6VCo5n9L27fLS+EmTZChyxDmMiMixVXnU8uHDh3H69GkUFxcbbO/Xr1+1K0UMQObSLefw8MPy0nVbCwyUExvefbdcqHPgQGD9emD3buDMGeDtt2W5F1/kF7Gt1KkDLF0K3H+/nPTyyy9Ln2vYUP6bUHIWayJyDhYHoL///hsDBw7EgQMHoFKp9Ku+q/7X1q/RaKxbQxfFAFS5y5eBJUvk48mT7fe+EREyBHXpAmzZItesunGj9Hk3NxmUyHauXDG+PTtbXgVoraU8HHmWbCKqHovHAE2cOBFRUVG4cOECatWqhUOHDmHr1q2IjY1FWlqaDaromhiAKvf558D160CbNkD37vZ97zZtgKQk+bhs+AHkivIjRwIpKfatk6vQaEx3d+omq5wwQZarjpQUuSRN9+7Ao4/K+8hInleimsLiFqAdO3bg119/RXBwMNzc3ODm5oYuXbogOTkZEyZMwB9//GGLerocBqCKlZSUDja21sSHltBoDLtejJk0Cejfny0G1paeDmRlmX5eCNkSFBAgx2JFRBi/NWwoZ/o2JiVFtiTdPvu3tVuYiEg5FgcgjUYDPz8/AEBwcDDOnj2LFi1aoHHjxsjMzLR6BV0VA1DFvvlGfhmFhMjL0+3NnC/hM2dkuW7d7FYtl3DunHnlCguBAwfkzZR69coHo/BwGaqNLX0ihAzbDLdEzs/iAHTXXXfhzz//RFRUFOLi4jB79mx4enri3//+N5o0aWKLOrokBiDTyk58OHasvDrL3sz9Eja3HJkvNNS8cosXy7Jnzhi/3bgBXLwobxkZ5r8/wy1RzWBxAHr99ddRWFgIAHjrrbfw8MMPIz4+HnXr1sWaNWusXkFXpQtA168DN2+abqp3Rdu3y0nwvLyA555Tpg7mfgmbW47MFx8vu6+ys4230qhU8vlRo0y30Agh/7gwFoz27gWOHq28Hgy3RM7N4gDUq1cv/eNmzZrh6NGjuHz5MurUqaO/Eoyqz99fXk2k1corXvhFWkrX+vPYY0D9+srUwdwv4fh4+9etplOr5aXugwfL33PZ37/uv6A5cyrunlKp5Hp7desCMTGGz6WlmTeonp9JIudm0VVgJSUlcHd3x8GDBw22BwUFMfxYmZsb1wMz5uRJORkhIMdhKEX3JQyUH4Bt7pcwVV1CghwHFh5uuL1hw+oPUNaFW1P/palUcqwQwy2Rc7MoAHl4eKBRo0ac68dOOA6ovHnzZKtYz57AXXcpWxdbfglT5RISgH/+kWvBrVwp70+erP7vvaJwC8gWp48+YrglcnYWzwM0bdo0vPbaa7jMb2WbYwAyVFBQusq6PSc+rIitvoTJPGq1HIg8YoS8t1YoMRVudYGooivLiMg5WDwG6NNPP8Xx48cRFhaGxo0bw9fX1+D5DEsup6AKMQAZWrxYLkQaHQ2UGYqmON2XMNUsCQnyUveyM0GfOSMHV8+aBXTuDPTurXQtiaiqLA5AAwYMsEE1yBgGoFIaDTB3rnw8aZIcI0Vka8bC7fbtwMKFcrbvP/4AGjVSpGpEVE0WB6CZM2faoh5kBANQqXXrZNdSUBDw+ONK14Zc2Zw5wO+/y9uQIcDWrcrMRUVE1cO/ox0YA1Ap3aXvzz0H1KqlbF3ItXl5AWvXylXpd+8GpkxRukZEVBUWByA3Nzeo1WqTN7IeBiDp99+BbdsADw9g3Dila0MkF0Vdtkw+nj8fWLVK0eoQURVY3AX2nW4Slv8pKSnBH3/8gaVLl+LNN9+0WsWIAUhH1/ozbBgQFqZsXYh0+vYFpk0D3n4bePppoG1b4M47la4VEZlLJYSxeWwtt3LlSqxZswbr1q2zxu4UVVBQgICAAOTn58Pf31+xevz0E/DQQ0C7dpatVVSTZGfLv7Zv3ZJLFLRvr3SNiEppNMCDDwK//gq0bCm7xGrXVrpWRK7Lku9vq40Buvvuu5Gamlql186fPx+RkZHw9vZGXFwcdu/ebbJsSkoKYmNjERgYCF9fX8TExGCZri3aiOeeew4qlQpz5sypUt2UxBYg4NNPZfjp2pXhhxyPWi27v8LCgCNHgGeeMb40ChE5HqsEoBs3bmDu3LkIv33WMDOsWbMGSUlJmDlzJjIyMtC2bVv06tULFy5cMFo+KCgI06ZNw44dO7B//34kJiYiMTERGzZsKFf2u+++w86dOxHmpP0mrh6ACguBRYvkY0eZ+JDodvXrA2vWlIahBQuUrhERmUVYKDAwUNSpU0d/CwwMFGq1Wvj5+Yl169ZZujvRqVMnMW7cOP3PGo1GhIWFieTkZLP30a5dO/H6668bbMvKyhLh4eHi4MGDonHjxuLjjz82e3/5+fkCgMjPzzf7NbZw6ZIQ8u9JIYqKFK2KIj77TB57kyZC3LqldG2IKvbhh/Lfq4eHELt2KV0bItdkyfe3xYOgP/74Y4OFT93c3FCvXj3ExcWhTp06Fu2ruLgYe/fuxauvvmqwvx49emDHjh2Vvl4IgV9//RWZmZl477339Nu1Wi0ef/xxvPTSS2jVqlWl+ykqKkJRUZH+54KCAouOw1YCAkpXu75yBQgJUbpG9qPVyvlWAGDiRK67RI5v8mTgt9+AlBQ5P1BGhlxtnogck8UBaMyYMVZ789zcXGg0GoTc9s0eEhKCo0ePmnxdfn4+wsPDUVRUBLVajc8++ww9e/bUP//ee+/B3d0dEyZMMKseycnJDnkFm1oNBAbK8HP5smsFoJ9+Av76C/D3BxITla4NUeVUKrlcy/79wPHjcsLOH3/krOVEjsrij+ZXX32FtWvXltu+du1aLF261CqVqoyfnx/27duHPXv24O2330ZSUhLS0tIAAHv37sUnn3yCJUuWGLRUVeTVV19Ffn6+/nbmzBkb1t4yrjoOSHfp+9NPA35+ytaFyFwBAXIRVW9vGeLfeUfpGhGRKRYHoOTkZAQHB5fbXr9+fbxj4ac9ODgYarUaOTk5BttzcnLQoEEDk69zc3NDs2bNEBMTgylTpmDw4MFITk4GAKSnp+PChQto1KgR3N3d4e7ujlOnTmHKlCmIjIw0uj8vLy/4+/sb3ByFKwag/fuB1FT5l/P48UrXhsgybduWDoSeMQPYtEnZ+hCRcRYHoNOnTyMqKqrc9saNG+P06dMW7cvT0xMdOnQwuHxeq9UiNTUVnTt3Nns/Wq1WP4bn8ccfx/79+7Fv3z79LSwsDC+99JLRK8UcnSsGIN3Yn0GDgMaNFa0KUZWMGQM89ZQcvzdiBJCVpXSNiOh2Fo8Bql+/Pvbv31+uNeXPP/9E3SqM+EtKSsLo0aMRGxuLTp06Yc6cOSgsLETi/wZ+jBo1CuHh4foWnuTkZMTGxqJp06YoKirC+vXrsWzZMiz4359cdevWLVcPDw8PNGjQAC1atLC4fkpztQCUkwOsWCEf89J3cmZz58plXPbtA4YOBbZskcu5EJFjsDgAjRgxAhMmTICfnx+6du0KANiyZQsmTpyI4cOHW1yBYcOG4eLFi5gxYwbOnz+PmJgY/Pzzz/qB0adPn4ZbmVGEhYWFGDt2LLKysuDj44Po6GgsX74cw4YNs/i9nYGrBCCNBkhPB+bNA4qLgU6dAAsaAYkcjo+PHA/UoQOwYwfw8sulY9uISHkWL4VRXFyMxx9/HGvXroW7u8xPWq0Wo0aNwsKFC+Hp6WmTitqToyyFAcgxBLNmAWPHykUXa6KUFHmpe9lugqAg4PPPgYQE5epFZA3r1gEDBsjHa9cCgwcrWh2iGs2mS2F4enpizZo1yMzMxIoVK5CSkoITJ05g8eLFNSL8OJqa3gKUkiK/EG4fI3HlityekqJMvYispX9/2foDAE88Iad3ICLlWdwFptO8eXM0b97cmnUhI2pyANJoZMuPsTZIIeS8KpMmyS8QToRIzuztt4GdO4GtW+Xg/l27gFq1lK4VkWuzuAVo0KBBBrMu68yePRtDhgyxSqWoVE0OQOnpFV8dIwRw5owsR+TM3N2B1avlZKYHDwLPP89FU4mUZnEA2rp1Kx566KFy2/v06YOtW7dapVJUSndB26VLytbDFg4fNq/cuXO2rQeRPYSGyhDk5gb85z/AF1/IVtC0NLmIalqa/JmI7MPiAHTt2jWjY308PDwcZg2tmqQmtgDduCG7BKZMMa98aKht60NkL926lc4OPXYsEBYGdO8OPPqovI+M5Lg3InuxOAC1bt0aa9asKbd99erVuPPOO61SKSqlC0D5+cCtW8rWpbqEkH/pRkcDr78O3LwJVDRuXqUCIiKA+Hj71ZHI1l56CYiNlZ/nCxcMn8vO5uB/InuxeBD09OnTkZCQgBMnTuD+++8HAKSmpmLlypX45ptvrF5BV1enTunjvDzAyCokTmHnTjmx4c6d8ueICODdd2UAGjpUbis7JkK3jNucORwATTWLEMDZs6af4+B/IvuwuAXokUcewffff4/jx49j7NixmDJlCrKzs/Hrr7+iWbNmtqijS3N3lyuiA87ZDXb6tGze79xZhh9fXzmv0dGjcvvgwXKyuPBww9c1bCi3cx4gqmnS000HIICD/4nspUqXwfft2xd9+/YFICcdWrVqFV588UXs3bsXGo7is7qgIKCgwLkC0LVrsoXnww9lV5dKJddH+te/5LiHshIS5F+76elywHNoqOz24l+/VBOZO6ifg/+JbKvK8wBt3boVX375Jb799luEhYUhISEB82vqVMUKCwoC/vnHOQKQRgMsXQpMmwacPy+33Xcf8NFHQPv2pl+nVssBokQ1nbmD+jmvLJFtWRSAzp8/jyVLluDLL79EQUEBhg4diqKiInz//fccAG1DznIlWFqaHOezb5/8uWlT4P335TIAujE9RK4uPl528WZnVzwX0MiRwG+/Aa+8AtSvb7/6EbkKs8cAPfLII2jRogX279+POXPm4OzZs5g3b54t60b/4wgBqKL5So4fBwYOlJfx7tsHBAQAH3wAHDoktzP8EJVSq4FPPpGPb/9s6H5u0QIoKpKLp0ZFyRCUm2vfehLVdGYHoJ9++glPPvkk3nzzTfTt2xdqDtCwG6UDUEqKnJ/k9vlKli2Tc/nceSfw/ffyP/axY4Fjx+R2Ly9l6kvk6BISTA/+//Zb4MgR4OefgU6dgOvXgffek0Fo+nS5Th4RVZ/ZAWjbtm24evUqOnTogLi4OHz66afI5Z8kdqFkADK1WGlWFjBqlBzbU1IC9OoF/PmnXLG+Xj3715PI2SQkyLF9mzcDK1fK+5Mn5XaVSn6mdu4EfvgBaNdOXljwr3/JPz7efFPODUZEVWd2ALr77rvx+eef49y5c3j22WexevVqhIWFQavVYuPGjbh69aot6+nSlApAFS1WquPuDvz4o/xrtVUr+9WNqCbQDf4fMULe396wrlIBDz8M7N0r/xhp3VpeEfrGG7JF6J13ZDBSApfxIGdn8TxAvr6+eOKJJ7Bt2zYcOHAAU6ZMwbvvvov69eujX79+tqijy9MFIHuvB1bZYqWAnM3W19c+9SFyVSqVHE+3bx+wZg3QsqXsCps2TQah99+XXWVl2TKgmOoW5wzW5EwsDkBltWjRArNnz0ZWVhZWrVplrTrRbXQLotq7BYjzlRA5Fjc3OXP6gQPA8uVA8+ZycPTLLwNNmsiZ02/csG1AMdUtzmU8yNmohKiog8M1FRQUICAgAPn5+fDXTcOsoG3b5KWzzZrJAcb2kpYm/+OszObNnMOHSAm3bgErVgBvvQX8/bfcVqeO8YHSuivMqjPDukYjg5SplmGVSg7kPnmSE5mSMiz5/mYAMsLRAtDhw3J8TVCQfbvBdP/ZmZqvhP/ZETmGkhI5Aelbb8llNExRqeRM7Fu2yLFDBQVyMLW597m58nFl+EcRKcWS7+8qzwRN9qMbA3TlCqDVymZwe9DNVzJ4cPnnuFgpkePw8ACeegpo1EhePWaKEPIPGlsv27h/PwMQOT4GICegWxFeCPlXWNkV4m1NN1/JiBFAcXHp9oYNZfjhYqVEjsPcFmIPDzm20N9fTlxq7v3Ro8ATT1S+/4kTgZ9+Ap5+GnjkEfl+RI6GXWBGOFoXGADUrg0UFspZl5s2te97a7XyP8DCQmD2bKBjRy5WSuSIbD1ur7JucUBOgFpUVPpzSAiQmChbqOz9fxe5Hku+v+3UmULVpeRkiKdOyfDj4QFMmmR8vhIiUp5unTFTy8+oVEBEhCxXFZUt46FSyUkdjx+Xy3eEhAA5OcC778putx49gK+/NgxIREphAHISSgagAwfkfcuWbMomcmTmrDNW3XF7FS3jobvCrGlTIDlZDsj+9lugd2/5/qmpwLBhsuxLLwGZmabfhxMtkq0xADkJJQPQwYPyvnVr+783EVnGnIBijfcwtYxHWR4ecttPP8nL9F9/XV6FlpsrF0yOjgbuu09eyn/zZunrONEi2QMHQTsJR2gBYgAicg4JCUD//nI293PngNBQ64/b0y3jYa7ISGDWLGDmTBmI/v1vYP16YOtWeRs/Xq4vGBkJJCWVH2Okm2jRWiGOiAHISThCALrrLvu/NxFVjaUBxV7c3eWVYY88IidUXLwY+PJL4PTp0u47Y4SQ3WiTJslwV90wp9HYNiDakjPX3ZGwC8xJKLUeWHFxaT89W4CIyJoaNgRmzJDdY+vXA126VFxeCDmuaPXq6g2ktnUXG9dhM82RxnaxBchJKLUeWGamnG4/IEBePUJEZG1qNdCnD5CXJ5f+qcxjj8lbSIj8f8nULTRUtjiVpVvLzFZdbCkpch6kssuFNGwoW7eq23Vn67rbmi1/N1XBAOQklOoCK9v9ZerSWiIiawgNNa+ch4dc/iMnR95+/914OTc3OehaF4jCw4GvvjI+h5E1uthsGVA0GhkebFV3W3PE8MYA5CQcIQAREdmSbh6jytYf/Ptv2Vp05ozpW3a2DElZWfK2Y0fl76/rYuvQAWjc2LJZsmvVMi+gPPhg1dZhO3fO9CK0Zeuenu54Y78cNbwxADkJpQMQx/8Qka2VXX9QpTL8wiw7j5G7OxAcLG/t2hnfl1YrW4fKhqKNG+VYo8r8+ae8WZMuoPj5WXe/t3v3XeDGDTm9QK1atn0vc6WnO2Z4YwByEkoFIM4BRET2pJvHyNhYEUvWH3Rzk11qoaFAp05yW0yMeQFo+nT5fre3wphqoSk7h5E5VCoZhCxpYfr7b+DFFyvf94YN8ubtLUNQ795yfNUdd9h3GINGI78/tm+X8zyZ49w529bpdlwLzAhHXAssO1t+INVq2axrj3/IBQXygwfIq890IYyIyNZscal3ZWuZ6brYTp607L2Ki+XcRgMGVF72xx9lIHGz8Bpsc+pet66sw4YNskWlrMhI+b69ewP33y/Xl6zovSz93efnAzt3ysCzfTuwaxdw9aplx1jVNerKsuT7mwHICEcMQDdulDZn5ufLvwpsbft24N575SDC7Gzbvx8Rka3pBuMCxrvYqjoY11bhqixz6y4EcOQI8PPPMpht3SpDmo6Hhww1ukDUqlXpPsy5UksIud6bLuxs3w4cOlT+uP38gLvvlrcFC+Qf0rb63egwAFWTIwYgAPDxkU2tJ0/KD5qtLVoEPPcc0KuX/CAREdUExr7kIyIs62IztV9bhKvb38PSuhcWytYVXSD6+2/D5xs2lEGoTh25RMntqUA3Huuxx2TPwPbtcjmT2zVtCtxzT+mtVavSQGOP3w3AAFRtjhqAwsOBs2eBvXuB9u1t/37jxwOffir7nd9/3/bvR0RkL7aaTdlW4aqs6tRd13rz008yEG3ebPkYJgDw8gJiY0vDTufOcl6mitjjd8MAVE2OGoBat5aDyjZuBHr0sP37desGbNkCLF0q1+ghIqLKOdNSFTduyC6yzz8Hvv228vLPPy+/D9q1kyHIUrb+3Vjy/c2rwJyIPa8EE4JzABERVYWjrsNmjI+PHOZw+bJ5ASg+Xo7pqSpH+t1wLTAnYs/1wM6dkx8INzegZUvbvx8RESnH3Fm4zS3nDBiAnIg9W4B08/80by7/QiAioppLNwu3qSlWVCo5Xic+3r71siUGICdizwVROQM0EZHr0M3CDZQPQWVn4XbUsUxVwQDkROzZAsTxP0RErkU3C3d4uOH2hg0df6X5quAgaCeiRABiCxARketISJCLkjrLVWzVwQDkROwVgDQa4PBh+ZgBiIjItTjSlVq2xC4wJ2KvAHTihJwYy8cHaNLEtu9FRESkBAYgJ2KvAKTr/io7jTkREVFNwgDkRMoGIFvO380B0EREVNMxADkRXQAqLgauX7fd++jmAOL4HyIiqqkYgJyIry/g4SEf27IbjFeAERFRTccA5ERUKtuPA7pxQ64UDDAAERFRzcUA5GRsHYAOHwa0WjnrdEiIbd6DiIhIaQxATsbWC6KWHf9jak0YIiIiZ8cA5GRsvR4Yx/8QEZErYAByMrbuAmMAIiIiV8AA5GTsFYA4BxAREdVkDEBOxpYB6NIlufgdwABEREQ1GwOQk7FlANINgI6MBPz8rL9/IiIiR8EA5GRsGYA4/oeIiFwFA5CTsUcAYvcXERHVdAxATsYeXWBsASIiopqOAcjJ2CoACcEAREREroMByMnoAtCNG/JmLadPAwUFcrHVO+6w3n6JiIgcEQOQk/H3B9Rq+fjKFevtVzf+p0ULwNPTevslIiJyRAxATkalAurUkY+tuR4YrwAjIiJXwgDkhGyxHhjH/xARkSthAHJCthgIzRYgIiJyJQxATsjaAaikBDh6VD7mHEBEROQKGICckLUDUGamDEF+fkDjxtbZJxERkSNjAHJC1g5AuvE/d90lB1kTERHVdA4RgObPn4/IyEh4e3sjLi4Ou3fvNlk2JSUFsbGxCAwMhK+vL2JiYrBs2TKDMm+88Qaio6Ph6+uLOnXqoEePHti1a5etD8NurB2AOP6HiIhcjeIBaM2aNUhKSsLMmTORkZGBtm3bolevXrhw4YLR8kFBQZg2bRp27NiB/fv3IzExEYmJidiwYYO+zB133IFPP/0UBw4cwLZt2xAZGYkHH3wQFy9etNdh2ZStAhDH/xARkatQCSGEkhWIi4tDx44d8emnnwIAtFotIiIiMH78eLzyyitm7aN9+/bo27cvZs2aZfT5goICBAQEYNOmTXjggQcq3Z+ufH5+Pvz9/c0/GDtZuRIYORK4/34gNbX6+4uKAv75B9i8GejWrfr7IyIiUoIl39+KtgAVFxdj79696NGjh36bm5sbevTogR07dlT6eiEEUlNTkZmZia5du5p8j3//+98ICAhA27ZtjZYpKipCQUGBwc2RWbMF6OpVGX4AdoEREZHrUDQA5ebmQqPRICQkxGB7SEgIzp8/b/J1+fn5qF27Njw9PdG3b1/MmzcPPXv2NCjz448/onbt2vD29sbHH3+MjRs3Ijg42Oj+kpOTERAQoL9FRERU/+BsyJoB6NAheR8aWjrBIhERUU2n+BigqvDz88O+ffuwZ88evP3220hKSkJaWppBme7du2Pfvn3Yvn07evfujaFDh5ocV/Tqq68iPz9ffztz5owdjqLqrBmAOACaiIhckbuSbx4cHAy1Wo2cnByD7Tk5OWjQoIHJ17m5uaFZs2YAgJiYGBw5cgTJycnoVmYAi6+vL5o1a4ZmzZrh7rvvRvPmzfHll1/i1VdfLbc/Ly8veHl5Weeg7EAXgK5dA4qLq7d4KQdAExGRK1K0BcjT0xMdOnRAapmRvFqtFqmpqejcubPZ+9FqtSgqKqp2GWcREFA6X091W4G4BhgREbkiRVuAACApKQmjR49GbGwsOnXqhDlz5qCwsBCJiYkAgFGjRiE8PBzJyckA5Hid2NhYNG3aFEVFRVi/fj2WLVuGBQsWAAAKCwvx9ttvo1+/fggNDUVubi7mz5+P7OxsDBkyRLHjtCa1Wq4If/myvFXQWFYhIdgFRkRErknxADRs2DBcvHgRM2bMwPnz5xETE4Off/5ZPzD69OnTcHMrbagqLCzE2LFjkZWVBR8fH0RHR2P58uUYNmwYAECtVuPo0aNYunQpcnNzUbduXXTs2BHp6elo1aqVIsdoC0FBpQGoqnJygNxc2Zp0553WqxsREZGjU3weIEfk6PMAAUBcHLB7N7BuHdCvX9X2sXEj8OCDQPPmwF9/Wbd+RERE9uY08wBR1VnjSjCO/yEiIlfFAOSkrBGAOP6HiIhcFQOQk2IAIiIiqjoGICdV3QCk0ZTOAs05gIiIyNUwADmp6gagkyeBGzcAb2/gf3NKEhERuQwGICdV3QCk6/668045rxAREZErYQByUtYKQBz/Q0RErogByEnpAtClS1V7PdcAIyIiV8YA5KSq2wLEOYCIiMiVMQA5qbp15X1BAVBSYtlrb94Ejh2TjxmAiIjIFTEAOanAwNLHeXmWvfbIEXkZfFAQEBpqzVoRERE5BwYgJ+XuDgQEyMeWdoOVHf+jUlm3XkRERM6AAciJVXUcEMf/EBGRq2MAcmJVDUC8BJ6IiFwdA5ATYwAiIiKqGgYgJ1aVAHTlCpCdLR+3amX9OhERETkDBiAnVpUApBv/06hR6SBqIiIiV8MA5MSqEoDY/UVERMQA5NQYgIiIiKqGAciJVWU9MK4BRkRExADk1CxtARKCcwAREREBDEBOTbcemLkBKCsLyM+Xs0hHR9uuXkRERI6OAciJWdoCpOv+atEC8PS0TZ2IiIicAQOQE9MFoLw8ubhpZTgAmoiISGIAcmJ16sh7IWTXVmV04384AJqIiFwdA5AT8/QEateWj83pBmMLEBERkcQA5OTMHQdUUgIcOSIfMwAREZGrYwBycuYGoGPHgOJi2WLUuLHt60VEROTIGICcnLkBSDf+p1UrwI1nnYiIXBy/Cp2cuQGI43+IiIhKMQA5OQYgIiIiyzEAOTlz1wNjACIiIirFAOTkzGkBunYN+Ptv+ZhzABERETEAOT1zAtDhw/I+JASoV8/2dSIiInJ0DEBOzpwFUdn9RUREZIgByMmZ0wLEAERERGSIAcjJWRKAOP6HiIhIYgBycmUDkFZrvIxuEkS2ABEREUkMQE5OtyK8VgtcvVr++QsX5E2lkrNAExEREQOQ0/PxkTfAeDeYrvuraVOgVi371YuIiMiRMQDVABWNA+L4HyIiovIYgGqAigIQx/8QERGVxwBUA5jTAsQAREREVIoBqAYwtR6YVgscOiQfMwARERGVYgCqAUy1AJ08CRQWAl5eQLNm9q8XERGRo2IAqgFMBSDd+J+WLQF3d/vWiYiIyJExANUAptYD4/gfIiIi4xiAagBTLUAMQERERMYxANUAlQUgzgFERERkiAGoBjAWgIqKgL/+ko/ZAkRERGSIAagGMBaAjh4FNBogMBAID1ekWkRERA6LAagGKBuAhJCPy47/UamUqRcREZGjYgCqAXQBqKREzvsDcAA0ERFRRRiAaoBatQBPT/lY1w2mmwOIA6CJiIjKYwCqAVSq8uOA2AJERERkGgNQDVF2PbC8PODMGfkzW4CIiIjKYwCqIcq2AOm6vyIi5FVgREREZIgrRNUQZQOQblV4tv4QEREZxwBUQ5RdDywrSz7m+B8iIiLj2AVWQ5RtAeIAaCIioooxANUQZQdBMwARERFVjAGohtAFoIMH5VVgajUQHa1olYiIiBwWA1ANoQtAGRny/o47AC8v5epDRETkyBiAaghdANJo5D27v4iIiExjAKohdAFIhwGIiIjINAagGuL2AMQ5gIiIiExjAKohAgIMf77zTmXqQURE5AwYgGqAlBSgTRvDbQ88ILcTERFReQxATi4lBRg8uHT2Z53sbLmdIYiIiKg8hwhA8+fPR2RkJLy9vREXF4fdu3ebLJuSkoLY2FgEBgbC19cXMTExWLZsmf75kpISTJ06Fa1bt4avry/CwsIwatQonD171h6HYlcaDTBxIiBE+ed02yZNKr0yjIiIiCTFA9CaNWuQlJSEmTNnIiMjA23btkWvXr1w4cIFo+WDgoIwbdo07NixA/v370diYiISExOxYcMGAMD169eRkZGB6dOnIyMjAykpKcjMzES/fv3seVh2kZ5evuWnLCGAM2dkOSIiIiqlEsJY+4H9xMXFoWPHjvj0008BAFqtFhERERg/fjxeeeUVs/bRvn179O3bF7NmzTL6/J49e9CpUyecOnUKjRo1qnR/BQUFCAgIQH5+Pvz9/c0/GDtbtQp49NHKy61cCYwYYfv6EBERKcmS729FW4CKi4uxd+9e9OjRQ7/Nzc0NPXr0wI4dOyp9vRACqampyMzMRNeuXU2Wy8/Ph0qlQmBgoDWq7TBCQ61bjoiIyFW4K/nmubm50Gg0CAkJMdgeEhKCo0ePmnxdfn4+wsPDUVRUBLVajc8++ww9e/Y0WvbmzZuYOnUqRowYYTINFhUVoaioSP9zQUFBFY7G/uLjgYYN5YBnY+14KpV8Pj7e/nUjIiJyZIqPAaoKPz8/7Nu3D3v27MHbb7+NpKQkpKWllStXUlKCoUOHQgiBBQsWmNxfcnIyAgIC9LeIiAgb1t561Grgk0/kY5XK8Dndz3PmyHJERERUStEAFBwcDLVajZycHIPtOTk5aNCggcnXubm5oVmzZoiJicGUKVMwePBgJCcnG5TRhZ9Tp05h48aNFfYFvvrqq8jPz9ffzpw5U70Ds6OEBOCbb4DwcMPtDRvK7QkJytSLiIjIkSkagDw9PdGhQwekpqbqt2m1WqSmpqJz585m70er1Rp0YenCz7Fjx7Bp0ybUrVu3wtd7eXnB39/f4OZMEhKAf/4BNm+WA543bwZOnmT4ISIiMkXRMUAAkJSUhNGjRyM2NhadOnXCnDlzUFhYiMTERADAqFGjEB4erm/hSU5ORmxsLJo2bYqioiKsX78ey5Yt03dxlZSUYPDgwcjIyMCPP/4IjUaD8+fPA5CX0Ht6eipzoDamVgPduildCyIiIuegeAAaNmwYLl68iBkzZuD8+fOIiYnBzz//rB8Yffr0abi5lTZUFRYWYuzYscjKyoKPjw+io6OxfPlyDBs2DACQnZ2N//u//wMAxMTEGLzX5s2b0Y0pgYiIyOUpPg+QI3KWeYCIiIiolNPMA0RERESkBAYgIiIicjkMQERERORyGICIiIjI5TAAERERkcthACIiIiKXwwBERERELkfxiRAdkW5qJGdZFZ6IiIhKv7fNmeKQAciIq1evAoDTrApPREREpa5evYqAgIAKy3AmaCO0Wi3Onj0LPz8/qFQqpatjMwUFBYiIiMCZM2dcYsZrVzpeHmvN5ErHCrjW8fJYrUMIgatXryIsLMxgGS1j2AJkhJubGxo2bKh0NezG39+/xn/gynKl4+Wx1kyudKyAax0vj7X6Kmv50eEgaCIiInI5DEBERETkchiAXJiXlxdmzpwJLy8vpatiF650vDzWmsmVjhVwrePlsdofB0ETERGRy2ELEBEREbkcBiAiIiJyOQxARERE5HIYgIiIiMjlMADVUMnJyejYsSP8/PxQv359DBgwAJmZmRW+ZsmSJVCpVAY3b29vO9W4et54441ydY+Ojq7wNWvXrkV0dDS8vb3RunVrrF+/3k61rZ7IyMhyx6pSqTBu3Dij5Z3pvG7duhWPPPIIwsLCoFKp8P333xs8L4TAjBkzEBoaCh8fH/To0QPHjh2rdL/z589HZGQkvL29ERcXh927d9voCCxT0fGWlJRg6tSpaN26NXx9fREWFoZRo0bh7NmzFe6zKp8Fe6js3I4ZM6ZcvXv37l3pfh3x3FZ2rMY+vyqVCu+//77JfTrqeTXnu+bmzZsYN24c6tati9q1a2PQoEHIycmpcL9V/axbggGohtqyZQvGjRuHnTt3YuPGjSgpKcGDDz6IwsLCCl/n7++Pc+fO6W+nTp2yU42rr1WrVgZ137Ztm8my27dvx4gRI/Dkk0/ijz/+wIABAzBgwAAcPHjQjjWumj179hgc58aNGwEAQ4YMMfkaZzmvhYWFaNu2LebPn2/0+dmzZ2Pu3LlYuHAhdu3aBV9fX/Tq1Qs3b940uc81a9YgKSkJM2fOREZGBtq2bYtevXrhwoULtjoMs1V0vNevX0dGRgamT5+OjIwMpKSkIDMzE/369at0v5Z8FuylsnMLAL179zao96pVqyrcp6Oe28qOtewxnjt3DosXL4ZKpcKgQYMq3K8jnldzvmsmT56MH374AWvXrsWWLVtw9uxZJCQkVLjfqnzWLSbIJVy4cEEAEFu2bDFZ5quvvhIBAQH2q5QVzZw5U7Rt29bs8kOHDhV9+/Y12BYXFyeeffZZK9fM9iZOnCiaNm0qtFqt0eed9bwCEN99953+Z61WKxo0aCDef/99/ba8vDzh5eUlVq1aZXI/nTp1EuPGjdP/rNFoRFhYmEhOTrZJvavq9uM1Zvfu3QKAOHXqlMkyln4WlGDsWEePHi369+9v0X6c4dyac1779+8v7r///grLOMN5FaL8d01eXp7w8PAQa9eu1Zc5cuSIACB27NhhdB9V/axbii1ALiI/Px8AEBQUVGG5a9euoXHjxoiIiED//v1x6NAhe1TPKo4dO4awsDA0adIEI0eOxOnTp02W3bFjB3r06GGwrVevXtixY4etq2lVxcXFWL58OZ544okKF+515vOqc/LkSZw/f97gvAUEBCAuLs7keSsuLsbevXsNXuPm5oYePXo43bkG5OdYpVIhMDCwwnKWfBYcSVpaGurXr48WLVrg+eefx6VLl0yWrSnnNicnB//973/x5JNPVlrWGc7r7d81e/fuRUlJicF5io6ORqNGjUyep6p81quCAcgFaLVaTJo0Cffeey/uuusuk+VatGiBxYsXY926dVi+fDm0Wi3uueceZGVl2bG2VRMXF4clS5bg559/xoIFC3Dy5EnEx8fj6tWrRsufP38eISEhBttCQkJw/vx5e1TXar7//nvk5eVhzJgxJss483ktS3duLDlvubm50Gg0NeJc37x5E1OnTsWIESMqXEDS0s+Co+jduzf+85//IDU1Fe+99x62bNmCPn36QKPRGC1fU87t0qVL4efnV2mXkDOcV2PfNefPn4enp2e50F7RearKZ70quBq8Cxg3bhwOHjxYaX9x586d0blzZ/3P99xzD1q2bIlFixZh1qxZtq5mtfTp00f/uE2bNoiLi0Pjxo3x9ddfm/WXlbP68ssv0adPH4SFhZks48znlaSSkhIMHToUQggsWLCgwrLO+lkYPny4/nHr1q3Rpk0bNG3aFGlpaXjggQcUrJltLV68GCNHjqz0wgRnOK/mftc4CrYA1XAvvPACfvzxR2zevBkNGza06LUeHh5o164djh8/bqPa2U5gYCDuuOMOk3Vv0KBBuasQcnJy0KBBA3tUzypOnTqFTZs24amnnrLodc56XnXnxpLzFhwcDLVa7dTnWhd+Tp06hY0bN1bY+mNMZZ8FR9WkSRMEBwebrHdNOLfp6enIzMy0+DMMON55NfVd06BBAxQXFyMvL8+gfEXnqSqf9apgAKqhhBB44YUX8N133+HXX39FVFSUxfvQaDQ4cOAAQkNDbVBD27p27RpOnDhhsu6dO3dGamqqwbaNGzcatJQ4uq+++gr169dH3759LXqds57XqKgoNGjQwOC8FRQUYNeuXSbPm6enJzp06GDwGq1Wi9TUVKc417rwc+zYMWzatAl169a1eB+VfRYcVVZWFi5dumSy3s5+bgHZgtuhQwe0bdvW4tc6ynmt7LumQ4cO8PDwMDhPmZmZOH36tMnzVJXPelUrTzXQ888/LwICAkRaWpo4d+6c/nb9+nV9mccff1y88sor+p/ffPNNsWHDBnHixAmxd+9eMXz4cOHt7S0OHTqkxCFYZMqUKSItLU2cPHlS/Pbbb6JHjx4iODhYXLhwQQhR/lh/++034e7uLj744ANx5MgRMXPmTOHh4SEOHDig1CFYRKPRiEaNGompU6eWe86Zz+vVq1fFH3/8If744w8BQHz00Ufijz/+0F/19O6774rAwECxbt06sX//ftG/f38RFRUlbty4od/H/fffL+bNm6f/efXq1cLLy0ssWbJEHD58WDzzzDMiMDBQnD9/3u7Hd7uKjre4uFj069dPNGzYUOzbt8/gc1xUVKTfx+3HW9lnQSkVHevVq1fFiy++KHbs2CFOnjwpNm3aJNq3by+aN28ubt68qd+Hs5zbyv4dCyFEfn6+qFWrlliwYIHRfTjLeTXnu+a5554TjRo1Er/++qv4/fffRefOnUXnzp0N9tOiRQuRkpKi/9mcz3p1MQDVUACM3r766it9mfvuu0+MHj1a//OkSZNEo0aNhKenpwgJCREPPfSQyMjIsH/lq2DYsGEiNDRUeHp6ivDwcDFs2DBx/Phx/fO3H6sQQnz99dfijjvuEJ6enqJVq1biv//9r51rXXUbNmwQAERmZma555z5vG7evNnov1vd8Wi1WjF9+nQREhIivLy8xAMPPFDud9C4cWMxc+ZMg23z5s3T/w46deokdu7caacjqlhFx3vy5EmTn+PNmzfr93H78Vb2WVBKRcd6/fp18eCDD4p69eoJDw8P0bhxY/H000+XCzLOcm4r+3cshBCLFi0SPj4+Ii8vz+g+nOW8mvNdc+PGDTF27FhRp04dUatWLTFw4EBx7ty5cvsp+xpzPuvVpfrfGxMRERG5DI4BIiIiIpfDAEREREQuhwGIiIiIXA4DEBEREbkcBiAiIiJyOQxARERE5HIYgIiIiMjlMAARERGRy2EAIiKXMGbMGAwYMMBg2zfffANvb298+OGHylSKiBTjrnQFiIiU8MUXX2DcuHFYuHAhEhMTla4OEdkZW4CIyOXMnj0b48ePx+rVqxl+iFwUW4CIyKVMnToVn332GX788Uc88MADSleHiBTCAERELuOnn37CunXrkJqaivvvv1/p6hCRgtgFRkQuo02bNoiMjMTMmTNx7do1patDRApiACIilxEeHo60tDRkZ2ejd+/euHr1qtJVIiKFMAARkUtp3LgxtmzZgvPnzzMEEbkwBiAicjkRERFIS0vDhQsX0KtXLxQUFChdJSKyMwYgInJJDRs2RFpaGnJzcxmCiFyQSgghlK4EERERkT2xBYiIiIhcDgMQERERuRwGICIiInI5DEBERETkchiAiIiIyOUwABEREZHLYQAiIiIil8MARERERC6HAYiIiIhcDgMQERERuRwGICIiInI5DEBERETkcv4fnWkth3i6zJEAAAAASUVORK5CYII=",
-      "text/plain": [
-       "<Figure size 640x480 with 1 Axes>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    }
-   ],
-   "source": [
-    "\n",
-    "import read_cifar as rc\n",
-    "import knn\n",
-    "X,y=rc.read_cifar('data') \n",
-    "# Split the Dataset\n",
-    "X_train,y_train,X_test,y_test=rc.split_dataset(X,y,split=0.9) \n",
-    "# Plot the accuracy of the model KNN\n",
-    "knn.plot_KNN(X_train,y_train,X_test,y_test) "
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "## Artificial Neural Network"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "c:\\Users\\HP\\Desktop\\Deep_learning_BE\\image-classification\\mlp.py:29: RuntimeWarning: overflow encountered in exp\n",
-      "  return 1 / (1 + np.exp(-x))\n"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Epoch 1/100\n",
-      "Train Accuracy: 0.093370    Test Accuracy: 0.069000\n",
-      "Epoch 2/100\n",
-      "Train Accuracy: 0.073167    Test Accuracy: 0.073833\n",
-      "Epoch 3/100\n",
-      "Train Accuracy: 0.074981    Test Accuracy: 0.078000\n",
-      "Epoch 4/100\n",
-      "Train Accuracy: 0.076926    Test Accuracy: 0.076667\n",
-      "Epoch 5/100\n",
-      "Train Accuracy: 0.078741    Test Accuracy: 0.076000\n",
-      "Epoch 6/100\n",
-      "Train Accuracy: 0.079537    Test Accuracy: 0.076000\n",
-      "Epoch 7/100\n",
-      "Train Accuracy: 0.078704    Test Accuracy: 0.076500\n",
-      "Epoch 8/100\n",
-      "Train Accuracy: 0.079852    Test Accuracy: 0.077000\n",
-      "Epoch 9/100\n",
-      "Train Accuracy: 0.079944    Test Accuracy: 0.078000\n",
-      "Epoch 10/100\n",
-      "Train Accuracy: 0.079722    Test Accuracy: 0.078667\n",
-      "Epoch 11/100\n",
-      "Train Accuracy: 0.080241    Test Accuracy: 0.077667\n",
-      "Epoch 12/100\n",
-      "Train Accuracy: 0.080463    Test Accuracy: 0.077500\n",
-      "Epoch 13/100\n",
-      "Train Accuracy: 0.080500    Test Accuracy: 0.076167\n",
-      "Epoch 14/100\n",
-      "Train Accuracy: 0.080870    Test Accuracy: 0.076333\n",
-      "Epoch 15/100\n",
-      "Train Accuracy: 0.081204    Test Accuracy: 0.075333\n",
-      "Epoch 16/100\n",
-      "Train Accuracy: 0.081352    Test Accuracy: 0.076167\n",
-      "Epoch 17/100\n",
-      "Train Accuracy: 0.081389    Test Accuracy: 0.075667\n",
-      "Epoch 18/100\n",
-      "Train Accuracy: 0.082185    Test Accuracy: 0.075333\n",
-      "Epoch 19/100\n",
-      "Train Accuracy: 0.081981    Test Accuracy: 0.076167\n",
-      "Epoch 20/100\n",
-      "Train Accuracy: 0.081741    Test Accuracy: 0.075667\n",
-      "Epoch 21/100\n",
-      "Train Accuracy: 0.081741    Test Accuracy: 0.076833\n",
-      "Epoch 22/100\n",
-      "Train Accuracy: 0.082111    Test Accuracy: 0.075667\n",
-      "Epoch 23/100\n",
-      "Train Accuracy: 0.082259    Test Accuracy: 0.075333\n",
-      "Epoch 24/100\n",
-      "Train Accuracy: 0.082315    Test Accuracy: 0.074667\n",
-      "Epoch 25/100\n",
-      "Train Accuracy: 0.082370    Test Accuracy: 0.076833\n",
-      "Epoch 26/100\n",
-      "Train Accuracy: 0.082852    Test Accuracy: 0.074833\n",
-      "Epoch 27/100\n",
-      "Train Accuracy: 0.082926    Test Accuracy: 0.075833\n",
-      "Epoch 28/100\n",
-      "Train Accuracy: 0.083185    Test Accuracy: 0.075833\n",
-      "Epoch 29/100\n",
-      "Train Accuracy: 0.083370    Test Accuracy: 0.075833\n",
-      "Epoch 30/100\n",
-      "Train Accuracy: 0.083667    Test Accuracy: 0.076500\n",
-      "Epoch 31/100\n",
-      "Train Accuracy: 0.083741    Test Accuracy: 0.076833\n",
-      "Epoch 32/100\n",
-      "Train Accuracy: 0.083778    Test Accuracy: 0.078500\n",
-      "Epoch 33/100\n",
-      "Train Accuracy: 0.084185    Test Accuracy: 0.079167\n",
-      "Epoch 34/100\n",
-      "Train Accuracy: 0.084148    Test Accuracy: 0.079000\n",
-      "Epoch 35/100\n",
-      "Train Accuracy: 0.084407    Test Accuracy: 0.079500\n",
-      "Epoch 36/100\n",
-      "Train Accuracy: 0.085037    Test Accuracy: 0.079500\n",
-      "Epoch 37/100\n",
-      "Train Accuracy: 0.085037    Test Accuracy: 0.080000\n",
-      "Epoch 38/100\n",
-      "Train Accuracy: 0.084778    Test Accuracy: 0.079667\n",
-      "Epoch 39/100\n",
-      "Train Accuracy: 0.084593    Test Accuracy: 0.079833\n",
-      "Epoch 40/100\n",
-      "Train Accuracy: 0.084519    Test Accuracy: 0.080167\n",
-      "Epoch 41/100\n",
-      "Train Accuracy: 0.084852    Test Accuracy: 0.079500\n",
-      "Epoch 42/100\n",
-      "Train Accuracy: 0.084815    Test Accuracy: 0.079167\n",
-      "Epoch 43/100\n",
-      "Train Accuracy: 0.084574    Test Accuracy: 0.079000\n",
-      "Epoch 44/100\n",
-      "Train Accuracy: 0.084685    Test Accuracy: 0.078500\n",
-      "Epoch 45/100\n",
-      "Train Accuracy: 0.084481    Test Accuracy: 0.079000\n",
-      "Epoch 46/100\n",
-      "Train Accuracy: 0.084833    Test Accuracy: 0.079333\n",
-      "Epoch 47/100\n",
-      "Train Accuracy: 0.085130    Test Accuracy: 0.079500\n",
-      "Epoch 48/100\n",
-      "Train Accuracy: 0.085185    Test Accuracy: 0.080667\n",
-      "Epoch 49/100\n",
-      "Train Accuracy: 0.085389    Test Accuracy: 0.080833\n",
-      "Epoch 50/100\n",
-      "Train Accuracy: 0.085944    Test Accuracy: 0.081667\n",
-      "Epoch 51/100\n",
-      "Train Accuracy: 0.086111    Test Accuracy: 0.079000\n",
-      "Epoch 52/100\n",
-      "Train Accuracy: 0.086648    Test Accuracy: 0.079667\n",
-      "Epoch 53/100\n",
-      "Train Accuracy: 0.086963    Test Accuracy: 0.080833\n",
-      "Epoch 54/100\n",
-      "Train Accuracy: 0.087278    Test Accuracy: 0.081833\n",
-      "Epoch 55/100\n",
-      "Train Accuracy: 0.087648    Test Accuracy: 0.082500\n",
-      "Epoch 56/100\n",
-      "Train Accuracy: 0.088352    Test Accuracy: 0.084167\n",
-      "Epoch 57/100\n",
-      "Train Accuracy: 0.088519    Test Accuracy: 0.083500\n",
-      "Epoch 58/100\n",
-      "Train Accuracy: 0.089019    Test Accuracy: 0.085167\n",
-      "Epoch 59/100\n",
-      "Train Accuracy: 0.089000    Test Accuracy: 0.086333\n",
-      "Epoch 60/100\n",
-      "Train Accuracy: 0.089500    Test Accuracy: 0.086000\n",
-      "Epoch 61/100\n",
-      "Train Accuracy: 0.089833    Test Accuracy: 0.086333\n",
-      "Epoch 62/100\n",
-      "Train Accuracy: 0.090056    Test Accuracy: 0.088000\n",
-      "Epoch 63/100\n",
-      "Train Accuracy: 0.090370    Test Accuracy: 0.087833\n",
-      "Epoch 64/100\n",
-      "Train Accuracy: 0.090185    Test Accuracy: 0.087667\n",
-      "Epoch 65/100\n",
-      "Train Accuracy: 0.090741    Test Accuracy: 0.087167\n",
-      "Epoch 66/100\n",
-      "Train Accuracy: 0.091444    Test Accuracy: 0.087833\n",
-      "Epoch 67/100\n",
-      "Train Accuracy: 0.091667    Test Accuracy: 0.088500\n",
-      "Epoch 68/100\n",
-      "Train Accuracy: 0.092315    Test Accuracy: 0.090167\n",
-      "Epoch 69/100\n",
-      "Train Accuracy: 0.091963    Test Accuracy: 0.090667\n",
-      "Epoch 70/100\n",
-      "Train Accuracy: 0.092093    Test Accuracy: 0.091167\n",
-      "Epoch 71/100\n",
-      "Train Accuracy: 0.091833    Test Accuracy: 0.091833\n",
-      "Epoch 72/100\n",
-      "Train Accuracy: 0.091870    Test Accuracy: 0.090333\n",
-      "Epoch 73/100\n",
-      "Train Accuracy: 0.092148    Test Accuracy: 0.091833\n",
-      "Epoch 74/100\n",
-      "Train Accuracy: 0.092481    Test Accuracy: 0.091667\n",
-      "Epoch 75/100\n",
-      "Train Accuracy: 0.092315    Test Accuracy: 0.093000\n",
-      "Epoch 76/100\n",
-      "Train Accuracy: 0.092852    Test Accuracy: 0.093333\n",
-      "Epoch 77/100\n",
-      "Train Accuracy: 0.093389    Test Accuracy: 0.093500\n",
-      "Epoch 78/100\n",
-      "Train Accuracy: 0.093852    Test Accuracy: 0.095500\n",
-      "Epoch 79/100\n",
-      "Train Accuracy: 0.094167    Test Accuracy: 0.095500\n",
-      "Epoch 80/100\n",
-      "Train Accuracy: 0.094685    Test Accuracy: 0.096333\n",
-      "Epoch 81/100\n",
-      "Train Accuracy: 0.095111    Test Accuracy: 0.097000\n",
-      "Epoch 82/100\n",
-      "Train Accuracy: 0.095537    Test Accuracy: 0.097667\n",
-      "Epoch 83/100\n",
-      "Train Accuracy: 0.095685    Test Accuracy: 0.096833\n",
-      "Epoch 84/100\n",
-      "Train Accuracy: 0.096167    Test Accuracy: 0.098000\n",
-      "Epoch 85/100\n",
-      "Train Accuracy: 0.095685    Test Accuracy: 0.097833\n",
-      "Epoch 86/100\n",
-      "Train Accuracy: 0.096000    Test Accuracy: 0.097333\n",
-      "Epoch 87/100\n",
-      "Train Accuracy: 0.096481    Test Accuracy: 0.097667\n",
-      "Epoch 88/100\n",
-      "Train Accuracy: 0.096611    Test Accuracy: 0.098167\n",
-      "Epoch 89/100\n",
-      "Train Accuracy: 0.096519    Test Accuracy: 0.098667\n",
-      "Epoch 90/100\n",
-      "Train Accuracy: 0.096519    Test Accuracy: 0.098500\n",
-      "Epoch 91/100\n",
-      "Train Accuracy: 0.096519    Test Accuracy: 0.096500\n",
-      "Epoch 92/100\n",
-      "Train Accuracy: 0.096704    Test Accuracy: 0.097667\n",
-      "Epoch 93/100\n",
-      "Train Accuracy: 0.096815    Test Accuracy: 0.098167\n",
-      "Epoch 94/100\n",
-      "Train Accuracy: 0.096685    Test Accuracy: 0.099000\n",
-      "Epoch 95/100\n",
-      "Train Accuracy: 0.096796    Test Accuracy: 0.098833\n",
-      "Epoch 96/100\n",
-      "Train Accuracy: 0.096815    Test Accuracy: 0.099167\n",
-      "Epoch 97/100\n",
-      "Train Accuracy: 0.097241    Test Accuracy: 0.098833\n",
-      "Epoch 98/100\n",
-      "Train Accuracy: 0.097333    Test Accuracy: 0.099500\n",
-      "Epoch 99/100\n",
-      "Train Accuracy: 0.097389    Test Accuracy: 0.098833\n",
-      "Epoch 100/100\n",
-      "Train Accuracy: 0.097556    Test Accuracy: 0.098167\n",
-      "Test Set Accuracy: 0.09816666666666667\n"
-     ]
-    },
-    {
-     "data": {
-      "image/png": "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",
-      "text/plain": [
-       "<Figure size 640x480 with 1 Axes>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    }
-   ],
-   "source": [
-    "import mlp\n",
-    "mlp.plot_ANN(X_train,y_train,X_test,y_test)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "## Test "
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "### Test de la fonction read_cifar "
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "import numpy as np\n",
-    "import read_cifar as rc\n",
-    "from read_cifar import read_cifar_batch\n",
-    "from read_cifar import read_cifar\n",
-    "\n",
-    "def test_read_cifar_batch():\n",
-    "   # Test read_cifar_batch function\n",
-    "   batch_path = \"data\\data_batch_1\"\n",
-    "   data, labels = read_cifar_batch(batch_path)\n",
-    "\n",
-    "   # Check that data has the right shape and type\n",
-    "   assert data.shape == (10000, 3072)\n",
-    "   assert data.dtype == np.float32\n",
-    "\n",
-    "   # Check that labels has the right shape and type\n",
-    "   assert labels.shape == (10000,)\n",
-    "   assert labels.dtype == np.int64\n",
-    "   print(\"All tests passed successfully.\")\n",
-    "   \n",
-    "def  test_read_cifar():\n",
-    "    # Test read_cifar function\n",
-    "    data, labels = read_cifar('data')\n",
-    "\n",
-    "    # Check that data has the right shape and type\n",
-    "    assert data.shape == (60000, 3072)\n",
-    "    assert data.dtype == np.float32\n",
-    "\n",
-    "    # Check that labels has the right shape and type\n",
-    "    assert labels.shape == (60000,)\n",
-    "    assert labels.dtype == np.int64\n",
-    "    print(\"All tests passed successfully.\")\n",
-    "\n",
-    "def test_split_dataset():\n",
-    "    data = np.random.randn(150, 4)\n",
-    "    labels = np.random.randn(150)\n",
-    "    split = 0.8\n",
-    "    data_train, labels_train, data_test, labels_test = rc.split_dataset(data, labels, split)\n",
-    "\n",
-    "    total_size = data_train.shape[0] + data_test.shape[0]\n",
-    "\n",
-    "    assert total_size == len(data)\n",
-    "    assert len(labels_train) == len(data_train)\n",
-    "    assert len(labels_test) == len(data_test)\n",
-    "    \n",
-    "    print(\"All tests passed successfully.\")"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "All tests passed successfully.\n"
-     ]
-    }
-   ],
-   "source": [
-    "test_read_cifar_batch()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "All tests passed successfully.\n"
-     ]
-    }
-   ],
-   "source": [
-    "test_read_cifar()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "All tests passed successfully.\n"
-     ]
-    }
-   ],
-   "source": [
-    "test_split_dataset()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "### Test de la fonction knn"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 10,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "import numpy as np\n",
-    "import knn \n",
-    "\n",
-    "# Test de la fonction distance_matrix :\n",
-    "def test_distance_matrix():\n",
-    "    X = np.array([[1, 2], [3, 4]])\n",
-    "    Y = np.array([[2, 2], [1, 1]])\n",
-    "    dists = knn.distance_matrix(X, Y)\n",
-    "    assert dists.shape == (2, 2)\n",
-    "    print(\"Test for distance_matrix passed.\")\n",
-    "    \n",
-    "\n",
-    "# Test de la fonction knn_predict :\n",
-    "def test_knn_predict():\n",
-    "    dists = np.array([[2, 5], [10, 1]])\n",
-    "    labels_train = np.array([0, 1])\n",
-    "    k = 1\n",
-    "    y_pred = knn.knn_predict(dists, labels_train, k)\n",
-    "    assert y_pred.shape == (2,)\n",
-    "    assert np.array_equal(y_pred, np.array([0, 1]))\n",
-    "    print(\"Test for knn_predict passed.\")\n",
-    "\n",
-    "# Test de la fonction evaluate_knn :\n",
-    "def test_evaluate_knn_accuracy():\n",
-    "    data_train = np.array([[1, 2], [3, 4], [5, 6], [1, 1], [2, 2]])\n",
-    "    labels_train = np.array([0, 1, 2, 0, 1])\n",
-    "    data_test = np.array([[2, 2], [1, 1], [3, 3]])\n",
-    "    labels_test = np.array([1, 0, 1])\n",
-    "    k = 2\n",
-    "    accuracy = knn.evaluate_knn(data_train, labels_train, data_test, labels_test, k)\n",
-    "    assert 0 <= accuracy <= 1\n",
-    "    print(\"Test for evaluate_knn accuracy passed.\")\n"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 11,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Test for distance_matrix passed.\n"
-     ]
-    }
-   ],
-   "source": [
-    "test_distance_matrix()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 12,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Test for knn_predict passed.\n"
-     ]
-    }
-   ],
-   "source": [
-    "test_knn_predict()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 13,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Test for evaluate_knn accuracy passed.\n"
-     ]
-    }
-   ],
-   "source": [
-    "test_evaluate_knn_accuracy()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "### Test de la fonction mlp"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 27,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from mlp import initialization, train_mlp, calculate_accuracy, run_mlp_training\n",
-    "\n",
-    "def test_mlp_training():\n",
-    "    #Paramètres du test\n",
-    "    num_samples = 200\n",
-    "    num_features = 3\n",
-    "    num_classes = 2\n",
-    "    num_hidden_units = 3\n",
-    "    learning_rate = 0.1\n",
-    "    num_epochs = 10\n",
-    "\n",
-    "    # Générez des données factices pour le test\n",
-    "    X_train = np.random.randn(num_samples, num_features)\n",
-    "    y_train = np.random.randint(0, num_classes, num_samples)\n",
-    "    X_test = np.random.randn(num_samples, num_features)\n",
-    "    y_test = np.random.randint(0, num_classes, num_samples)\n",
-    "\n",
-    "    # Initialisez les poids et les biais\n",
-    "    W1, b1, W2, b2 = initialization(num_features, num_hidden_units, num_classes)\n",
-    "\n",
-    "    # Entraînez le modèle\n",
-    "    train_accuracies, test_accuracy = run_mlp_training(X_train, y_train, X_test, y_test, num_hidden_units, learning_rate, num_epochs)\n",
-    "\n",
-    "    # Vérifiez si l'accuracy sur l'ensemble de test est un nombre entre 0 et 1\n",
-    "    assert 0 <= test_accuracy <= 1\n",
-    "\n",
-    "    # Vérifiez si la longueur de la liste des accuracies d'entraînement correspond au nombre d'époques\n",
-    "    assert len(train_accuracies) == num_epochs\n",
-    "\n",
-    "    # Vérifiez si les accuracies d'entraînement sont des nombres entre 0 et 1\n",
-    "    for accuracy in train_accuracies:\n",
-    "        assert 0 <= accuracy <= 1\n",
-    "\n",
-    "    print(\"Tous les tests ont réussi avec succès.\")\n"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 28,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Epoch 1/10\n",
-      "Train Accuracy: 0.490000    Test Accuracy: 0.555000\n",
-      "Epoch 2/10\n",
-      "Train Accuracy: 0.490000    Test Accuracy: 0.535000\n",
-      "Epoch 3/10\n",
-      "Train Accuracy: 0.505000    Test Accuracy: 0.540000\n",
-      "Epoch 4/10\n",
-      "Train Accuracy: 0.505000    Test Accuracy: 0.540000\n",
-      "Epoch 5/10\n",
-      "Train Accuracy: 0.500000    Test Accuracy: 0.545000\n",
-      "Epoch 6/10\n",
-      "Train Accuracy: 0.500000    Test Accuracy: 0.545000\n",
-      "Epoch 7/10\n",
-      "Train Accuracy: 0.500000    Test Accuracy: 0.545000\n",
-      "Epoch 8/10\n",
-      "Train Accuracy: 0.500000    Test Accuracy: 0.545000\n",
-      "Epoch 9/10\n",
-      "Train Accuracy: 0.500000    Test Accuracy: 0.545000\n",
-      "Epoch 10/10\n",
-      "Train Accuracy: 0.500000    Test Accuracy: 0.545000\n",
-      "Tous les tests ont réussi avec succès.\n"
-     ]
-    }
-   ],
-   "source": [
-    "test_mlp_training()"
-   ]
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.12.0"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/mlp.py b/mlp.py
index 5839834..2a03b6b 100644
--- a/mlp.py
+++ b/mlp.py
@@ -1,61 +1,11 @@
 import numpy as np
+import pandas as pd
 import matplotlib.pyplot as plt
-
-
-N = 30  # number of input data
-d_in = 3  # input dimension
-d_h = 3  # number of neurons in the hidden layer
-d_out = 2  # output dimension (number of neurons of the output layer)
-learning_rate = 0.1  
-num_epochs=100
-
-# Random initialization of the network weights and biaises
-def initialization(d_in,d_h,d_out):
-    np.random.seed(10)  # To get the same random values
-    W1 = 2 * np.random.rand(d_in, d_h) - 1  # first layer weights
-    b1 = np.zeros((1, d_h))  # first layer biaises
-    W2 = 2 * np.random.rand(d_h, d_out) - 1  # second layer weights
-    b2 = np.zeros((1, d_out))  # second layer biaises 
-    return W1,b1,W2,b2
-
-data = np.random.rand(N, d_in)  # create a random data
-targets = np.random.rand(N, d_out)  # create a random targets
-
-# Define the sigmoid activation function
-def sigmoid(x,derivate):
- if derivate==False:
-    return 1 / (1 + np.exp(-x))
- else:
-     return x*(1-x)
- 
-
-# Define the softmax activation function
-def softmax(x,derivate):
-    if derivate == False :
-      return np.exp(x) / np.exp(np.array(x)).sum(axis=1, keepdims=True)
-    else :
-        return x*(1-x)
-    
-#Definir les métriques :
-def loss_metrics(predictions, targets, metric, status):
-    if metric == "MSE":
-        if status == "forward":
-            return np.mean((predictions - targets) ** 2)
-        elif status == "backward":
-            return 2 * (predictions - targets) / len(predictions)  # Gradient of MSE loss
-    elif metric == "BCE":
-        # Binary Cross-Entropy Loss
-        epsilon = 1e-15  # Small constant to prevent log(0)
-        predictions = np.clip(predictions, epsilon, 1 - epsilon)
-        if status == "forward":
-            return - (targets * np.log(predictions) + (1 - targets) * np.log(1 - predictions)).mean()
-        elif status == "backward":
-            return (predictions - targets) / ((1 - predictions) * predictions)  # Gradient of BCE loss
-    else:
-        raise ValueError("Metric not supported: " + metric)
+import read_cifar as rc
 
 # learn_once_mse
-"""
+def learn_once_mse(w1, b1, w2, b2, data, targets, learning_rate):
+    """
     Update the weights and biases of the network for one gradient descent step using Mean Squared Error (MSE) loss.
 
     Parameters:
@@ -74,42 +24,38 @@ def loss_metrics(predictions, targets, metric, status):
     - b2: Updated bias vector of the second layer.
     - loss: Mean Squared Error (MSE) loss for monitoring.
     """
-
-def learn_once_mse(W1, b1, W2, b2, data, targets, learning_rate):
+    a0 = data
     # Forward pass
-    # Calculate the input and output of the hidden layer
-    hidden_layer_input = np.matmul(data, W1) + b1
-    hidden_layer_output = sigmoid(hidden_layer_input, derivate=False)  # Apply the sigmoid activation
-
-    # Calculate the input and output of the output layer
-    output_layer_input = np.matmul(hidden_layer_output, W2) + b2
-    output_layer_output = softmax(output_layer_input, derivate=False)  # Apply the softmax activation
-
-    # Backpropagation phase
-    # Calculate the error at the output layer
-    output_error = output_layer_output - targets
-
-    # Calculate gradients for the output layer
-    output_layer_gradients = output_error * softmax(output_layer_output, derivate=True)
+    z1 = np.matmul(a0, w1) + b1  # Calculate the weighted sum for the hidden layer
+    a1 = 1 / (1 + np.exp(-z1))  # Apply the sigmoid activation function to hidden layer
+    z2 = np.matmul(a1, w2) + b2  # Calculate the weighted sum for the output layer
+    a2 = np.exp(z2) / np.sum(np.exp(z2), axis=1, keepdims=True)  # Apply the softmax activation to the output layer
+    predictions = a2  # The network's predictions
 
-    # Update weights and biases of the output layer
-    W2 = W2 - learning_rate * np.dot(hidden_layer_output.T, output_layer_gradients) / data.shape[0]
-    b2 = b2 - learning_rate * (1 / hidden_layer_output.shape[1]) * output_layer_gradients.sum(axis=0, keepdims=True)
+    n = data.shape[0]  # Number of samples (batch size)
 
-    # Calculate the error at the hidden layer
-    hidden_layer_error = np.dot(output_layer_gradients, W2.T)
+    # Backpropagation
+    e2 = predictions - targets  # Compute the error in the output layer
 
-    # Calculate gradients for the hidden layer
-    hidden_layer_gradients = hidden_layer_error * sigmoid(hidden_layer_output, derivate=True)
+    dw2 = e2 * a2 * (1 - a2) / n  # Gradient for w2
+    update_w2 = np.dot(a1.T, dw2) / n # Update for w2
+    update_b2 = (1/a1.shape[1])*dw2.sum(axis=0, keepdims=True) # Update for b2
 
-    # Update weights and biases of the hidden layer
-    W1 = W1 - learning_rate * np.dot(data.T, hidden_layer_gradients) / data.shape[0]
-    b1 = b1 - learning_rate * (1 / data.shape[1]) * hidden_layer_gradients.sum(axis=0)
+    e1 = np.dot(e2, w2.T) # Compute the error in the hidden layer
+    dw1 = e1 * a1 * (1 - a1)  # Gradient for w1
+    update_b1 = (1/data.shape[1])*dw1.sum(axis=0, keepdims=True)  # Update for b1
+    update_w1 = np.dot(data.T, dw1) / n # Update for w2
 
-    # Calculate the loss using the specified metric
-    loss = loss_metrics(output_layer_output, targets,metric="MSE",status="forward")
+    # Gradient descent    
+    w2 = w2 - learning_rate * update_w2
+    b2 = b2 - learning_rate * update_b2
+    w1 = w1 - learning_rate * update_w1
+    b1 = b1 - learning_rate * update_b1
 
-    return W1, b1, W2, b2, loss
+    # Calculate the Mean Squared Error (MSE) loss
+    loss = compute_error(predictions, targets, loss_type = 'MSE')  
+    
+    return w1, b1, w2, b2, loss  
 
 #One Hot Function :
 def one_hot(targets):
@@ -133,9 +79,9 @@ def one_hot(targets):
 
     return one_hot_matrix
 
-#learn_once_cross_entropy 
 
-def learn_once_cross_entropy(W1, b1, W2, b2, data, targets, learning_rate):
+# The function learn_once_mse:
+def learn_once_cross_entropy(w1, b1, w2, b2, data, targets, learning_rate):
     """
     Perform one gradient descent step using binary cross-entropy loss.
 
@@ -149,59 +95,47 @@ def learn_once_cross_entropy(W1, b1, W2, b2, data, targets, learning_rate):
     - Updated weights and biases (W1, b1, W2, b2) of the network.
     - Loss value for monitoring.
     """
-
     # Forward pass
-    # Implement feedforward propagation on the hidden layer
-    hidden_layer_input = np.matmul(data, W1) + b1
-    hidden_layer_output = sigmoid(hidden_layer_input, derivate=False)  # Apply the Sigmoid activation function
-
-    # Implement feedforward propagation on the output layer
-    output_layer_input = np.matmul(hidden_layer_output, W2) + b2
-    output_layer_output = softmax(output_layer_input, derivate=False)  # Apply the Softmax activation function
-
-    # Backpropagation phase
-    # Updating W2 and b2
-    output_error = output_layer_output - targets
-    dW2 = output_error * softmax(output_layer_output, derivate=True)
-    W2_update = np.dot(hidden_layer_output.T, dW2) / data.shape[0]
-    update_b2 = (1 / hidden_layer_output.shape[1]) * dW2.sum(axis=0, keepdims=True)
-
-    # Updating W1 and b1
-    hidden_layer_error = np.dot(dW2, W2.T)
-    dW1 = hidden_layer_error * sigmoid(hidden_layer_output, derivate=True)
-    W1_update = np.dot(data.T, dW1) / data.shape[0]
-    update_b1 = (1 / data.shape[1]) * dW1.sum(axis=0, keepdims=True)
+    z1 = np.matmul(data, w1) + b1
+    a1 = 1 / (1 + np.exp(-z1)) 
+    z2 = np.matmul(a1, w2) + b2
+    a2 = np.exp(z2) / np.sum(np.exp(z2), axis=1, keepdims=True)  
 
-    # Gradient descent
-    W2 = W2 - learning_rate * W2_update
-    W1 = W1 - learning_rate * W1_update
-    b2 = b2 - learning_rate * update_b2
-    b1 = b1 - learning_rate * update_b1
+    predictions = a2
 
-    # Compute loss (Binary Cross Entropy)
-    loss = loss_metrics(output_layer_output, targets, metric="BCE", status="forward")
+    one_hot_matrix = one_hot(targets)
 
-    return W1, b1, W2, b2, loss
+    n = data.shape[0] 
 
+    # Backpropagation
+    e2 = predictions - one_hot_matrix
+    dw2 = e2 * a2 * (1 - a2) / n  
+    update_w2 = np.dot(a1.T, dw2) / n
+    update_b2 = (1/a1.shape[1])*dw2.sum(axis=0, keepdims=True) 
 
-def calculate_accuracy(predictions, actual_values):
-    """
-    calculate_accuracy: Compute the accuracy of the model.
+    e1 = np.dot(e2, w2.T)
+    dw1 = e1 * a1 * (1 - a1)  
+    update_b1 = (1/data.shape[1])*dw1.sum(axis=0, keepdims=True)
+    update_w1 = np.dot(data.T, dw1) / n
 
-    Parameters:
-    - predictions: Predicted values.
-    - actual_values: Ground truth observations.
+    # Gradient descent
+    w2 = w2 - learning_rate * update_w2
+    b2 = b2 - learning_rate * update_b2
+    w1 = w1 - learning_rate * update_w1
+    b1 = b1 - learning_rate * update_b1
+    
+    # Calculate binary cross-entropy loss
+    loss = compute_error(predictions, one_hot_matrix, loss_type = 'binary cross-entropy') 
+    
+    # Calculate the accuray for a single batch
+    batch_accuracy = accuracy(predictions, one_hot_matrix) 
 
-    Returns:
-    - Accuracy as a float.
-    """
-    correct_predictions = predictions.argmax(axis=1) == actual_values.argmax(axis=1)
-    accuracy = correct_predictions.mean()
-    return accuracy
+    return w1, b1, w2, b2, loss, batch_accuracy
 
-def train_mlp(W1, b1, W2, b2, data, targets, learning_rate):
-    """
-     Perform training steps for a specified number of epochs.
+#  The function train_mlp:
+def train_mlp(w1, b1, w2, b2, data_train, labels_train, learning_rate, num_epoch):
+    """ 
+    Perform training steps for a specified number of epochs.
 
     Parameters:
     - W1, b1, W2, b2: Weights and biases of the network.
@@ -215,43 +149,25 @@ def train_mlp(W1, b1, W2, b2, data, targets, learning_rate):
     - Updated weights and biases (W1, b1, W2, b2) of the network.
     - List of training accuracies across epochs as a list of floats.
     """
-    
-    # Forward pass
-    hidden_layer_input = np.matmul(data, W1) + b1
-    hidden_layer_output = sigmoid(hidden_layer_input, derivate=False)
+    train_accuracies = []  # To store training accuracies across epochs
 
-    output_layer_input = np.matmul(hidden_layer_output, W2) + b2
-    output_layer_output = softmax(output_layer_input, derivate=False)
+    # Iterate through the specified number of epochs
+    for epoch in range(num_epoch):
 
-    N = data.shape[0]
+        # Call the 'learn_once_cross_entropy' function to update weights, calculate loss, and obtain batch accuracy
+        w1, b1, w2, b2, loss, batch_accuracy = learn_once_cross_entropy(w1, b1, w2, b2, data_train, labels_train, learning_rate)
 
-    # Backpropagation phase
-    output_error = output_layer_output - targets
-    output_layer_gradients = output_error * softmax(output_layer_output, derivate=True)
+        # Append the batch accuracy to the 'train_accuracies' list for tracking progress
+        train_accuracies.append(batch_accuracy)
 
-    W2_update = np.dot(hidden_layer_output.T, output_layer_gradients) / N
-    update_b2 = (1 / hidden_layer_output.shape[1]) * output_layer_gradients.sum(axis=0, keepdims=True)
+        # Print the current epoch's progress
+        print("Epoch {}/{}".format(epoch+1, num_epoch))
+        print("[=======] Train_Accuracies : {}".format(round(batch_accuracy, 5)))
 
-    hidden_layer_error = np.dot(output_layer_gradients, W2.T)
-    hidden_layer_gradients = hidden_layer_error * sigmoid(hidden_layer_output, derivate=True)
+    return w1, b1, w2, b2, train_accuracies
 
-    W1_update = np.dot(data.T, hidden_layer_gradients) / N
-    update_b1 = (1 / data.shape[1]) * hidden_layer_gradients.sum(axis=0, keepdims=True)
-
-    # Gradient descent
-    W2 = W2 - learning_rate * W2_update
-    W1 = W1 - learning_rate * W1_update
-    b2 = b2 - learning_rate * update_b2
-    b1 = b1 - learning_rate * update_b1
-
-    # Calculate loss and accuracy
-    loss = loss_metrics(output_layer_output, targets,metric="BCE",status="forward")
-  
-    train_accuracies=calculate_accuracy(output_layer_output, targets)
-
-    return W1, b1, W2, b2, loss, train_accuracies
-
-def test_mlp(W1, b1, W2, b2, data_test, labels_test):
+# The function test_mlp:
+def test_mlp(w1,b1,w2,b2,data_test,labels_test):
     """
      Evaluate the network's performance on the test set.
 
@@ -263,18 +179,19 @@ def test_mlp(W1, b1, W2, b2, data_test, labels_test):
     Returns:
     - test_accuracy: The testing accuracy as a float.
     """
-    # Forward pass
-    hidden_layer_input = np.matmul(data_test, W1) + b1
-    hidden_layer_output = sigmoid(hidden_layer_input, derivate=False)
+    z1 = np.matmul(data_test, w1) + b1
+    a1 = 1 / (1 + np.exp(-z1))  
+    z2 = np.matmul(a1, w2) + b2
+    a2 = np.exp(z2) / np.sum(np.exp(z2), axis=1, keepdims=True)  
+
+    # Compute the testing accuracy using the 'accuracy' function
+    test_accuracy = accuracy(a2, labels_test)
 
-    output_layer_input = np.matmul(hidden_layer_output, W2) + b2
-    output_layer_output = softmax(output_layer_input, derivate=False)
+    return test_accuracy 
 
-    # Compute testing accuracy
-    test_accuracy = calculate_accuracy(output_layer_output, labels_test)
-    return test_accuracy
 
-def run_mlp_training(X_train, labels_train, data_test, labels_test, num_hidden_units, learning_rate, num_epochs):
+# The function run_mlp_training:
+def run_mlp_training(X_train, labels_train, data_test, labels_test, d_h, learning_rate, num_epoch):
     """
     Train an MLP classifier and evaluate its performance.
 
@@ -291,30 +208,31 @@ def run_mlp_training(X_train, labels_train, data_test, labels_test, num_hidden_u
     - train_accuracies: List of training accuracies across epochs.
     - test_accuracy: The final testing accuracy.
     """
-    #input_dimension = X_train.shape[1]
-    #output_dimension = np.unique(labels_train).shape[0]  # Number of classes
-
-    # Initialize weights and biases
-    W1, b1, W2, b2 = initialization(d_in, d_h, d_out)
-    
-    train_accuracies = []  # List to store training accuracies
-
-    # Training loop
-    for epoch in range(num_epochs):
-        W1, b1, W2, b2, loss, train_accuracy = train_mlp(W1, b1, W2, b2, X_train, one_hot(labels_train), learning_rate)
-        test_accuracy = test_mlp(W1, b1, W2, b2, data_test, one_hot(labels_test))
-        train_accuracies.append(train_accuracy)
-        
-        print("Epoch {}/{}".format(epoch + 1, num_epochs))
-        print("Train Accuracy: {:.6f}    Test Accuracy: {:.6f}".format(round(train_accuracy, 6), round(test_accuracy, 6)))
     
-    return train_accuracies, test_accuracy
+    d_in = X_train.shape[1]   # Input dimension
+    d_out = 10  # Output dimension: 10 classes
 
-# plot_ANN
+    np.random.seed(10)  # Set a random seed for reproducibility
 
-import matplotlib.pyplot as plt
+    # Initialize weights and biases for the neural network
+    w1 = 2 * np.random.rand(d_in, d_h) - 1  # First layer weights
+    b1 = np.zeros((1, d_h))  # First layer biases
+    w2 = 2 * np.random.rand(d_h, d_out) - 1  # Second layer weights
+    b2 = np.zeros((1, d_out))  # Second layer biases
+
+    # Train the MLP using the provided training data and parameters
+    w1, b1, w2, b2, train_accuracies = train_mlp(w1, b1, w2, b2, X_train, labels_train, learning_rate, num_epoch)
+
+    # Test the trained MLP on the testing data and compute the test accuracy
+    test_accuracy = test_mlp(w1, b1, w2, b2, data_test, one_hot(labels_test))
 
-def plot_ANN(X_train, y_train, X_test, y_test):
+    # Print the test set accuracy
+    print("test accuracy:", test_accuracy)
+
+    return train_accuracies, test_accuracy
+
+# Plot of the evolution of learning accuracy across learning epochs:
+def plot_ANN(data_train, labels_train, data_test, labels_test):
     """
     Plot the variation of accuracy in terms of the number of epochs.
 
@@ -324,29 +242,61 @@ def plot_ANN(X_train, y_train, X_test, y_test):
     - X_test: Test data matrix.
     - y_test: True labels for the test data.
     """
-    # Train an MLP and obtain training accuracies and final test accuracy
-    train_accuracies, test_accuracy = run_mlp_training(X_train, y_train, X_test, y_test, num_hidden_units=64, learning_rate=0.1, num_epochs=100)
+    # Train the MLP and obtain training accuracies and test accuracy
+    train_accuracies, test_accuracy = run_mlp_training(data_train, labels_train, data_test, labels_test, 64, 0.1, 100)
+
+    # Create a DataFrame from the accuracy values
+    df = pd.DataFrame({'Epoch': range(1, len(train_accuracies) + 1), 'Accuracy': train_accuracies})
 
-    # Display the test accuracy
-    print("Test Set Accuracy: {}".format(test_accuracy))
+    # Create a line plot using Matplotlib
+    plt.figure(figsize=(10, 6))
+    plt.plot(df['Epoch'], df['Accuracy'], 'b')
 
-    # Create a Matplotlib plot
-    plt.plot(list(range(1, len(train_accuracies) + 1)), train_accuracies)
-    plt.title('Accuracy Variation Over Epochs')
+    # Add labels and title to the plot
     plt.xlabel('Epoch')
     plt.ylabel('Accuracy')
+    plt.title('The Variation of Accuracy')
 
-    # Save the figure (optional)
+    # Save the plot as an image file
     plt.savefig("Results/mlp.png")
 
-    # Show the plot (optional)
-    plt.show()
-
-
-
+# Define accuracy function
+def accuracy(y_pred, y_true):
+    """
+    calculate_accuracy: Compute the accuracy of the model.
 
+    Parameters:
+    - predictions: Predicted values.
+    - actual_values: Ground truth observations.
 
+    Returns:
+    - Accuracy as a float.
+    """
+    accuracy = (y_pred.argmax(axis=1) == y_true.argmax(axis=1)).mean()
+    return accuracy
 
+def compute_error(predictions, targets, loss_type):
+    # Calculate the loss based on the specified loss type
+    
+    if loss_type == 'MSE':  # Mean Squared Error loss
+        loss = np.mean(np.square(predictions - targets))
+    elif loss_type == 'binary cross-entropy':  # Binary Cross-Entropy loss
+        n = targets.shape[0]
+        loss = -(1/n)*np.mean((np.dot(targets.T,np.log(predictions+ 1e-7)) + np.dot((1 - targets).T,np.log((1 - predictions+ 1e-7)))))
+    else:
+        raise ValueError("Unsupported loss type. Use 'MSE' or 'binary cross-entropy'.")
+    
+    return loss
 
+# The following code block is executed only if the script is run as the main program
 
+if _name_ == "_main_":
 
+    # Read the CIFAR-10 dataset from the specified path
+    X, y = rc.read_cifar('data\cifar-10-batches-py')
+    
+    # Split the dataset into training and testing sets
+    X_train, y_train, X_test, y_test = rc.split_dataset(X, y, split=0.9)
+    
+    # Plot the evolution of learning accuracy across learning epochs using the 'plot_ANN' function
+    plot_ANN(X_train, y_train, X_test, y_test)
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index 30289c4d43b2e8fbc58f0a987c9dbb13d8079c71..f79e2ac214f7f35432bcb057b6ac1eb849b2db46 100644
GIT binary patch
delta 107
zcmew+-^XbB|6d+MDMKzp0YfE&ErTtCA%h-+5tuY!;AP-qC}2or$YV%hNMtC6%NtMT
mWtZgysWxWNV=$R)&mk(O%aF^E$xy+N$&d$EX8<+}WC{R>=n?+_

literal 4086
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
RDh5y+xB%>Wkg3S^9smm+OA-J8

diff --git a/test/test_mlp.py b/test/test_mlp.py
index 546d9f3..027576c 100644
--- a/test/test_mlp.py
+++ b/test/test_mlp.py
@@ -1,7 +1,7 @@
 import numpy as np
 
 # Importez les  fonctions 
-from mlp import initialization, train_mlp, calculate_accuracy
+from mlp import  train_mlp, accuracy
 
 def test_mlp_training():
     # Paramètres du test
@@ -11,6 +11,9 @@ def test_mlp_training():
     num_hidden_units = 5
     learning_rate = 0.1
     num_epochs = 10
+    d_in= 3
+    d_out=2
+    d_h=3
 
     # Générez des données factices pour le test
     X_train = np.random.randn(num_samples, num_features)
@@ -19,10 +22,13 @@ def test_mlp_training():
     y_test = np.random.randint(0, num_classes, num_samples)
 
     # Initialisez les poids et les biais
-    W1, b1, W2, b2 = initialization(num_features, num_hidden_units, num_classes)
+    w1 = 2 * np.random.rand(d_in, d_h) - 1  # First layer weights
+    b1 = np.zeros((1, d_h))  # First layer biases
+    w2 = 2 * np.random.rand(d_h, d_out) - 1  # Second layer weights
+    b2 = np.zeros((1, d_out))  # Second layer biases
 
     # Entraînez le modèle
-    train_accuracies, test_accuracy = train_mlp(W1, b1, W2, b2, X_train, y_train, learning_rate, num_epochs)
+    train_accuracies, test_accuracy = train_mlp(w1, b1, w2, b2, X_train, y_train, learning_rate, num_epochs)
 
     # Vérifiez si l'accuracy est un nombre entre 0 et 1
     assert 0 <= test_accuracy <= 1
-- 
GitLab