diff --git a/challenges/QOSF challenge/Problema de GATO.pdf b/challenges/QOSF challenge/Problema de GATO.pdf new file mode 100644 index 0000000..01c652a Binary files /dev/null and b/challenges/QOSF challenge/Problema de GATO.pdf differ diff --git a/challenges/QOSF challenge/README.md b/challenges/QOSF challenge/README.md new file mode 100644 index 0000000..26cf843 --- /dev/null +++ b/challenges/QOSF challenge/README.md @@ -0,0 +1,8 @@ +Equipo: Qutips + +Integrantes: +Areli Yesareth Guerrero Estrada +Janeth De Anda Gil +Miguel Alejandro Medina Armendariz +Edgar Omar Mendoza Lopez + diff --git a/challenges/QOSF challenge/main.ipynb b/challenges/QOSF challenge/main.ipynb new file mode 100644 index 0000000..e38bb96 --- /dev/null +++ b/challenges/QOSF challenge/main.ipynb @@ -0,0 +1,329 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 38, + "id": "132678df", + "metadata": {}, + "outputs": [], + "source": [ + "import qiskit\n", + "from qiskit import QuantumCircuit,execute,Aer,transpile,BasicAer\n", + "from qiskit.circuit.library import SwapGate,QFT,CZGate,SGate,TGate,GroverOperator\n", + "from qiskit.algorithms import Grover\n", + "#from qiskit.algorithms import Grover\n", + "from qiskit.quantum_info import Statevector\n", + "from qiskit.visualization import plot_histogram\n", + "import matplotlib as plt\n", + "import math" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "15440717", + "metadata": {}, + "outputs": [], + "source": [ + "def inicializador(circuit):\n", + " circuit.x(0)\n", + " circuit.x(3)\n", + " circuit.h(4)\n", + " circuit.h(5)\n", + " circuit.h(7)\n", + " circuit.h(8)\n", + " return circuit\n", + "\n", + "def contadorqubits():\n", + " \n", + " completo=QuantumCircuit(12,12)\n", + " qft=QFT(3) \n", + " invqft=QFT(3,0,True,True)\n", + " ctgate = TGate().control(1)\n", + "\n", + " completo.barrier()\n", + "\n", + " #inicializador de qft\n", + " completo_2=completo.compose(qft,qubits=[9,10,11]) \n", + " \n", + " completo_2.append(ctgate, [4, 9])\n", + " completo_2.cs(4,10)\n", + " completo_2.cz(4,11)\n", + " \n", + " completo_2.barrier()\n", + " completo_2.append(ctgate, [5, 9])\n", + " completo_2.cs(5,10)\n", + " completo_2.cz(5,11)\n", + "\n", + " completo_2.barrier()\n", + " completo_2.append(ctgate, [7, 9])\n", + " completo_2.cs(7,10)\n", + " completo_2.cz(7,11)\n", + "\n", + " completo_2.barrier()\n", + " completo_2.append(ctgate, [8, 9])\n", + " completo_2.cs(8,10)\n", + " completo_2.cz(8,11)\n", + " #inversion de qft\n", + " completo_3=completo_2.compose(invqft,qubits=[9,10,11])\n", + " completo_3.barrier()\n", + " return completo_3\n", + "\n", + "#coloca las todos los estados que tengo suma de 2\n", + "def prob2():\n", + " completo_1=QuantumCircuit(14,14)\n", + "\n", + " completo_1.x(11)\n", + " completo_1.x(9)\n", + " completo_1.ccx(9,10,12)\n", + " completo_1.ccx(11,12,13)\n", + " completo_1.z(13) # recordatorio z\n", + " completo_1.ccx(9,10,12)\n", + " completo_1.ccx(11,12,13)\n", + " completo_1.x(9)\n", + " completo_1.x(11)\n", + " \n", + " return completo_1\n", + "\n", + "# crea a grover \n", + "def instalargrover(aux):\n", + " completo_1=QuantumCircuit(14,14)\n", + " #revertir compuerta\n", + " completo_1.barrier() \n", + "\n", + " completo_1.h(range(4,6))\n", + " completo_1.h(range(7,9))\n", + " completo_1.x(range(4,6))\n", + " completo_1.x(range(7,9)) \n", + " # completo_1.h(aux)\n", + " # completo_1.x(aux)\n", + " completo_1.barrier()\n", + " # completo_1.ccx(4,5,15)\n", + " # completo_1.ccx(7,8,14)\n", + " # completo_1.ccx(15,14,aux)\n", + "\n", + " completo_1.ccx(4,5,12)\n", + " completo_1.ccx(7,12,aux)\n", + " \n", + " completo_1.barrier()\n", + " completo_1.x(aux)\n", + " completo_1.z(aux)\n", + " completo_1.x(aux)\n", + " completo_1.barrier()\n", + " \n", + " completo_1.ccx(7,12,8)\n", + " completo_1.ccx(4,5,12)\n", + " # completo_1.ccx(15,14,aux)\n", + " # completo_1.ccx(4,5,15)\n", + " # completo_1.ccx(7,8,14)\n", + " completo_1.barrier()\n", + " completo_1.x(range(4,6))\n", + " completo_1.x(range(7,9))\n", + " completo_1.h(range(4,6))\n", + " completo_1.h(range(7,9))\n", + " # completo_1.x(aux)\n", + " # completo_1.h(aux)\n", + "\n", + " return completo_1\n", + "\n", + "#la condicion que acepta solo a las dos casos 1100 y 1001 ambos casos tiene 1 en a y 0 en c\n", + "def ganador():\n", + " completo_1=QuantumCircuit(14,14)\n", + " completo_1.barrier()\n", + " completo_1.x(7)\n", + " # completo_1.h(13)\n", + " # completo_1.z(13)\n", + " # completo_1.x(13)\n", + " completo_1.ccx(4,7,12)\n", + " \n", + " completo_1.z(12)\n", + " \n", + " return completo_1\n", + "\n", + "#crea las medicione qubtis con cbit\n", + "def medicion(circuit,inicio,fin,total_qubits=-1):\n", + " if total_qubits!=-1:\n", + " for i in range(total_qubits):\n", + " circuit.measure(i,i)\n", + " else:\n", + " for i in range(inicio,fin+1):\n", + " circuit.measure(i,i)\n", + " return circuit\n" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "38de9fc6", + "metadata": {}, + "outputs": [], + "source": [ + "bits=qubits=14\n", + "\n", + "circuit=QuantumCircuit(qubits,bits) #Crear un circuito con 9 qubits para el primer parametro y 9 bits para el segundo parametro\n", + "\n", + "circuit=inicializador(circuit)\n", + "\n", + "# circuit.draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "33c10780", + "metadata": {}, + "outputs": [], + "source": [ + "circuit_1=contadorqubits()\n", + "completo1=circuit.compose(circuit_1)\n", + "# circuit_1.draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "71368768", + "metadata": {}, + "outputs": [], + "source": [ + "# identifica los 2\n", + "circuit_2=prob2()\n", + "completo2=completo1.compose(circuit_2)\n", + "# circuit_2.draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "cb3bfc95", + "metadata": {}, + "outputs": [], + "source": [ + "circuit_3=instalargrover(8) #crea grover de 4\n", + "completo3=completo2.compose(circuit_3)\n", + "\n", + "# circuit_3.draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "7373c303", + "metadata": {}, + "outputs": [], + "source": [ + "circuit_4=ganador() #busca solo las dos ultimas opciones 1100 y 1001\n", + "completo4=completo3.compose(circuit_4)\n", + "\n", + "# circuit_4.draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "circuit_5=instalargrover(8) #aplifica las dos opciones de arriba\n", + "completo5=completo4.compose(circuit_5)\n", + "# circuit_5.draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "f6e926ac", + "metadata": {}, + "outputs": [], + "source": [ + "circuit6=medicion(completo3,4,5)\n", + "circuit6=medicion(completo3,7,8)\n", + "# # circuit6.measure(13,13)\n", + "# circuit6.measure(16,16)\n", + "# circuit6.draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "5bc81104", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'00000110111001': 0.035714285714285594,\n", + " '00001110111001': 0.32142857142857145,\n", + " '00011110111001': 0.32142857142857145,\n", + " '00100110111001': 3.3148190922642085e-33,\n", + " '00101110111001': 6.936225887984991e-33,\n", + " '00110110111001': 2.8010988534636696e-32,\n", + " '00111110111001': 4.278116777314028e-33,\n", + " '10010110111001': 0.32142857142857145}" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "backend = Aer.get_backend('statevector_simulator')\n", + "job = execute(circuit6, backend=backend)\n", + "job_result = job.result()\n", + "vector = job_result.get_statevector(circuit6)\n", + "Statevector(vector).probabilities_dict()\n", + "# for i in vector:\n", + "# print(i)\n", + "# print(job_result.get_statevector(circuit6))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "31dc15e9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcMAAAGdCAYAAABuAhhZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAAsTAAALEwEAmpwYAABOo0lEQVR4nO2de5xVdbn/319ARpCrKCgXuSgXgRwcJxFDsMxbl5Nampf6eTKzY5ZWlnmszFNpHLuomZl6NCgzM63QtEKRqyJyiTEwAbkoqEACKiCBwPP741mDm+0Mzl6z1957zfq8X6/1mpm11v7sZ57v+q5nre/l+QYzQwghhMgyrcptgBBCCFFuFAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJknjblNqBYHHDAAdavX79ymyGEEKJCmDdv3qtmdmBTzm0xwbBfv37MnTu33GYIIYSoEEIILzT1XDWTCiGEyDwKhnksXryYESNG7N46derEjTfeCMDNN9/MkCFDGDZsGFdccUV5DRVCCFE0WkwzabEYPHgwCxYsAGDnzp306tWL008/nSlTpjBx4kTq6uqoqqpi3bp15TVUCCFE0dCb4V6YPHkyhx56KH379uXWW2/lyiuvpKqqCoDu3buX2TohhBDFQsFwL9x7772cc845ACxZsoQZM2YwcuRIxo4dy5w5c8psnRBCiGJRsmAYQmgdQvheCGFFCOHf0c/vhxDa5JwTQgjXhBBeDiFsDSFMDSEMK5WNuWzfvp0HH3yQM888E4AdO3awYcMGnnrqKX74wx9y1llnoRU/hBCiZVDKN8NvAJcAlwJDgMuiv/8755wrgMuBLwHvBdYBj4YQOpbQTgD+8pe/UFNTQ48ePQDo3bs3Z5xxBiEEjj76aFq1asWrr75aarOEEEIkQCmD4bHAQ2b2kJmtNLMHgQeBkeBvhcCXgXFm9oCZLQTOBzoC55bQTgB++9vf7m4iBTjttNOYMmUK4E2m27dv54ADDihIc28jVQF+/OMfE0JQkBVCiBJTymA4E3h/CGEIQAhhKPAB4JHoeH/gIGBS/QfMbCswHQ+kJWPLli08+uijnHHGGbv3XXDBBSxfvpzhw4dz9tlnM2HCBDx+N536kaoLFixg3rx5tG/fntNPPx2AVatWMWnSJA455JCi/i9CCCHenVJOrfhf/C3v2RDCzui7rzWzn0fHD4p+rs373FqgV0OCIYSLgIsAevbsydSpUwEYMGAAHTt2pK6uDoBu3boxbNgwpk+fDkCbNm0YPXo08+fP54033gCgtraWtWvXsmrVKgCeeeYZ3nrrrd2a3bt3Z/z48cycORNg96jSuXPnsnnzZgBGjhzJ6tWreemllwAPfq1bt+bZZ5/1f/Cgg+jfvz+zZs1izpw5dO/enb59+zJ79myuuOIKPv3pT/O9732PpUuXsnDhQgCGDh3Kzp07Wbx4MQC9evWid+/ezJ49G4AOHTpQW1vLrFmz2LZtGwCjR49myZIlu6d/DB8+nG3btrF06VIA+vTpQ48ePXZn7OnUqRM1NTXMnDmTHTt2ADBmzBgWLVrE+vXrAaiurmbTpk0sX74c8Iw/+++/P/Pnzwega9euVFdXM23aNMyMEAJjx46lrq6OjRs3AlBTU8OGDRtYuXJl0cpp4MCBVFVV7fZX9+7dGTRo0B7lNGrUqNjlBNCuXTtGjhzJ7Nmz2bp1KwCjRo1ixYoVrFmzRuWkclI5VWg5FUIo1SCQEMLZwA+BrwOLgBHATcDXzezOEMKxwBNAXzN7MedzdwG9zOzkvenX1tZamtKxXXDBBdTU1PDFL36RiRMn8vjjj3PTTTftTitXaBOsEEKIPQkhzDOz2qacW8o3wx8CPzKze6O//xFC6IsPoLkTWBPt7wG8mPO5HjnHWgT1I1V/8IMf8Oabb3LdddcxadKkd/+gEEKIRChln2F7YGfevp05NqzAg96J9QdDCPsCxwFPlsLAUpE7UnXZsmWsWLGC6upq+vXrx+rVq6mpqdndXCCEECJ5Svlm+BBwZQhhBd5MeiTwVeBXAGZmIYQbgatCCM8BS4BvAZuBe0poZ+LkjlR9z3ves0dqNzWTCiFE6SllMPwS8D3g50B34BXgDuC7OedcD7QDbgG6ArOBk8xsUwntTJT6kaq33XZbuU0RQggRUbIBNEmTtgE0QgghkqWQATTKTSqEECLzKBgKIYTIPAqGQgghMo+CoRBCiMyjYCiEECLzKBgKIYTIPKWcZ5gKPndj08+948tJWSGEEKKU6M1QCCFE5lEwFEIIkXkUDIUQQmQeBUMhhBCZR8FQCCFE5lEwbEG89tprfOITn2DIkCEcfvjhzJo1iwULFnDMMccwYsQIamtrefrpp8ttphBCVByaWlEiCpmyAfGmbVx22WWccsop3H///Wzfvp0333yTs846i+985zuceuqpPPLII1xxxRVMnTq1cHEhhGjBKBi2EF5//XWmT5/O+PHjAWjbti1t27YlhMAbb7yx+5yePXuW0UohhKhMFAxbCCtWrODAAw/kM5/5DHV1dRx11FHcdNNN3HjjjZx88sl87WtfY9euXTz55JPlNlUIISoO9Rm2EHbs2MH8+fO5+OKL+fvf/85+++3HuHHjuPXWW7nhhhtYtWoVN9xwA5/97GfLbaoQQlQcCoYthN69e9O7d29GjhwJwCc+8Qnmz5/PhAkTOOOMMwA488wzNYBGCCEaQMGwhXDQQQfRp08fFi9eDMDkyZMZOnQoPXv2ZNq0aQA8/vjjDBw4sJxmCiFERaJg2IK4+eabOe+88zjiiCNYsGABV111FXfccQeXX3451dXVXHXVVdx+++0F6zY0ZaP++4YMGcKwYcO44oorYtmcpLYQQjQVDaBpQYwYMYK5c+fusW/06NHMmzevWboNTdmYMmUKEydOpK6ujqqqKtatW1dx2kII0VQUDMVeaWzKxq233sqVV15JVVUVAN27d68obSGEKAQ1k4q9kjtl48gjj+TCCy9ky5YtLFmyhBkzZjBy5EjGjh3LnDlzKkobGm6Cveaaa+jVqxcjRoxgxIgRPPLIIxWnLYQoPQqGYq80NmVjx44dbNiwgaeeeoof/vCHnHXWWZhZxWjD202wzz33HHV1dRx++OEAfOUrX2HBggUsWLCAD33oQwXrJq0thCg9CoZirzQ2ZaN3796cccYZhBA4+uijadWqFa+++mrFaNc3wdbPq2zbti1dunQpSKMc2kKI8qBgKPZKY1M2TjvtNKZMmQLAkiVL2L59OwcccEDFaDfWBAvws5/9jCOOOIILLriAjRs3FqSbtLYQojwoGIp3paEpGxdccAHLly9n+PDhnH322UyYMIEQQsVoN9YEe/HFF7Ns2TIWLFjAwQcfzOWXX16wzUlqQ+PTTQB+/OMfE0Io+E1Z2kLsHY0mFe9KQ1M2AO6+++6K1W6oCXbcuHH06NFj9zmf+9zn+MhHPlJR2tDwdBOAVatWMWnSJA455JBYutIWonH0ZihaJI01wb7yyiu7z/njH//I8OHDK0p7b/2RX/nKV7j++utjvYFLW4i9ozdD0WKpb4Ldvn07AwYM4Je//CWXXnopCxYsIIRAv379uO222ypKu7HVRx577DF69epFdXV1LHul3TivvfYaF154IQsXLiSEwF133cUjjzzCxIkTadWqFd27d2f8+PFa/qyFE+IMWa9EamtrraHmtkIpZBHeQhbgLcXiviL9zJ07l2OOOYYnnniCkSNHctlll9G2bVumT5/OpEmT6Ny5M/369WPu3LkFDyqSdsOcf/75HHfccVx44YW7m2BbtWpFp06dAPjpT3/Ks88+yy9+8YuCtUV5CSHMM7PappyrZlIhKojGppusWLGC6upq+vXrx+rVq6mpqWHNmjXSbqZ2Y02w9YEQYMuWLWqGzQBqJm0B6K2z5ZDbHzl48GAmT55MTU0NkydP3n1O3Lcgab+Txppg99tvP775zW/yq1/9is6dO++e6iNaLnozFKLCaGi6ibST0W5smgzAtddey6pVqzjvvPP42c9+VpTvE5WL+gzzSGOfod4MhYjHmjVrOOaYY1i5ciUAM2bMYNy4cTz88MO7z3nxxRf50Ic+xMKFC8tkpYiL+gyFEKIJNDZNZunSpbvPmThxIkOGDCmXiaJEqM9QCJFpGpomc+GFF7J48WJatWpF3759NZI0AygYCiEyTUNZkB544IEyWSPKhZpJhRBCZB69GYq9ooE/QsSnoew2gwcP5pOf/CQrV66kX79+3HfffXTt2rXcpmYevRkKIURCNLQI9Lhx4zjhhBNYunQpJ5xwwu6pHKK8KBgKIUQCNJbdZuLEiZx//vmAp4L705/+VEYrRT1qJhUtkkpp3lXTbnZpLLvN2rVrOfjggwGf2rF27doyWypAb4ZCCJEIe8tuU08IQXlPKwQFQyGESIDGEoz36NFj99qXr7zyCt27dy+nmSJCzaRCVBBJNsFKu7Q0lGB86NChDB06lAkTJnDllVcyYcIEPvaxj5XbVIGCoRBCJEZD2W127drFWWedxZ133knfvn257777ym2mQMFQCCESo6HsNsAey0+JykB9hkIIITKP3gyFEJklrf2R4Asad+zYkdatW9OmTRvmzp3LJz/5yd0rcLz22mt06dKFBQsWlNfQlKBgKIQQKWXKlCkccMABu//+3e9+t/v3yy+/nM6dO5fDrFSiYCiEEC0MM+O+++7j8ccfL7cpqUF9hkIIkUJCCJx00kkcddRR3H777XscmzFjBj169GDgwIFlsi596M1QCCFSyMyZM+nVqxfr1q3jxBNPZMiQIYwZMwaA3/72t5xzzjmxdBvqiwSfJnLLLbfQunVrPvzhD3P99dcX7X+pBEoaDEMIBwPjgA8BHYHlwMVmNi06HoDvABcBXYHZwCVmtqiUdgohRKXTq1cvALp3787pp5/O008/zZgxY9ixYwd/+MMfmDdvXmzt/L7IKVOmMHHiROrq6qiqqmLdunXNtr/SKFkzaQihC/AEEIAPA4cDXwJyvXoFcHm0/73RsUdDCB1LZacQQlQ6W7ZsYdOmTbt/nzRpEsOHDwfgscceY8iQIfTu3bto33frrbdy5ZVXUlVVBdAiU8iVss/wCuAVM/t/Zva0ma0ws8lm9k/Y/Vb4ZWCcmT1gZguB8/E3yHNLaKcQQlQ0a9euZfTo0VRXV3P00Ufz4Q9/mFNOOQWAe++9N3YTKTTcF7lkyRJmzJjByJEjGTt2LHPmzCnK/1FJlLKZ9DTgryGE3wHvB14G/g+4xcwM6A8cBEyq/4CZbQ0hTAeOBW4roa1CCFGxDBgwgLq6ugaPjR8/vlnaDfVF7tixgw0bNvDUU08xZ84czjrrLJYvX96iVtwoZTAcAHwBuAHvNxwB3Bwd+xkeCAHyF/daC/RqSDCEcBHev0jPnj2ZOnWqf9GAAXTs2HH3xdKtWzeGDRvG9OnTAWjTpg2jR49m/vz5vPHGGwDU1tZG64odWtA/NXfuXDZv3gzAyJEjWb16NS+99BIAgwcPpnXr1jz77LPA8QXp1v8vQ4cOZefOnbsn0vbq1YvevXsze/ZsADp06ADUFqS9bNkyevTosbtjvFOnTtTU1DBz5kx27NgBwJgxY1i0aBHwnoK0p02bhpkRQmDs2LHU1dWxceNGAGpqatiwYQMrV66Mzj6+IO2pU6fuLqdVq1YBMHDgQKqqqli4cCHgzTeDBg2i0Et73bp1UTl5guX+/fsza9YsANq1a8fIkSOZPXs2W7duLcju+nLs0KEDtbW1zJo1i23btgEwevRolixZsrv/xZu5DmhEqWHt+nJav349ANXV1WzatInly5cDPhhi//33Z/78+QXZvXLlyt3l1JT6BKMLsru+nGbOnAlAVVUVo0aNarA+QWEjIt8uJxg1ahQrVqxgzZo1wDvrU5yyHD58ONu2bWPp0qUA9OnT5x316dbpNQXZ/M3TVuaUE3Tt2pXq6uqC6lNz7nv59an+fx09ejRPPfUU7du3Z8CAATz11FOMGjWKt956i4kTJ9KlS5d3ue81pT69ezk1dN9rWn1qOsFfypInhLAdmGtmx+bsuw443cwODyEci/cp9jWzF3POuQvoZWYn702/trbWGsoBWChJZaSolMVmpV1a7UpaoUHapdNO8vpLki1btrBr1y46duzIli1bOPHEE7n66qtZuXIlL7/8Mt/97ndZsmQJJ5xwAi+++GLFvxmGEOaZWZPeFkr5ZvgK8Gzevn8Cl0W/r4l+9gBezDmnR84xIYQQCbF27VpOP/10wBcnPvfccznllFPYvn07F1xwAcOHD6dt27ZMmDCh4gNhoZQyGD4BDM7bNwh4Ifp9BR70TgTmAIQQ9gWOA75eIhuFECKzNNYX2bZtW+6+++4yWFQ6Sjma9AbgmBDCN0MIh4UQzgQuBW4BiAbR3Ah8I4RwRghhODAe2AzcU0I7hRBCZIySvRma2ZwQwmnAdcC38abQbwM/zznteqAdHiDrJ92fZGabSmWnEEKI7FHSDDRm9jDw8F6OG3BNtAkhhBAlQYm6hRBCZB4l6hZCCFESGkoC/vWvf52HHnqItm3bcuihh/LLX/6SLl26lNw2vRkKIYQoGVOmTGHBggW7kxSceOKJLFy4kGeeeYZBgwbxgx/8oCx26c1QCCFSRFon9DfGSSedtPv3Y445hvvvv78sdujNUAghREnY24LEAHfddRennnpqGSzTm6EQQogSsbcFia+99lratGnDeeedVxbbFAyFEEIAyTfBNrYg8fjx4/nzn//M5MmTy5bmTc2kQgghEqexBYn/+te/cv311/Pggw/Svn37stmnN0MhhBCJ01gS8MMOO4xt27Zx4oknAj6I5he/+EXJ7VMwFEIIkTiNJQF//vnny2DNO1EzqRBCiMyjYCiEECLzKBgKIYTIPAqGQgghMo+CoRBCiMyjYCiEECLzKBgKIYTIPAqGQgghMo+CoRBCiMyjDDRCCCESp9LXYdSboRBCiMyjYCiEECLzKBgKIYTIPAqGQgghMo+CoRBCiMyjYCiEECLzKBgKIYTIPAqGQgghMo+CoRBCiMyjYCiEECLzKBgKIYTIPAqGQgghMo+CoRBCiMyjYCiEECLzNDkYhhDGhBDeseRTCKFNCGFMcc0SQgghSkchb4ZTgP0b2N85OiaEEEKkkkKCYQCsgf3dgC3FMUcIIYQoPe+60n0I4cHoVwPuDiFsyzncGhgOPJmAbUIIIURJeNdgCKyPfgZgI7A159h2YCZwR5HtEkIIIUrGuwZDM/sMQAhhJfAjM1OTqBBCiBZFU94MATCz/0nSECGEEKJcNDkYhhD2B64FTgC6kzf4xsw6Fdc0IYQQojQ0ORgCdwJHArcDL9PwyFIhhBAidRQSDE8ATjSz2UkZI4QQQpSDQuYZrgM2J2WIEEIIUS4KCYbfBL4bQuiQlDFCCCFEOSikmfRbQD9gXQjhBeCt3INmdkQR7RJCCCFKRiHB8P7ErBBCCCHKiOYZCiGEyDxaz1AIIUTmKWTS/Sb2MrdQk+6FEEKklUL6DL+Y9/c++CT8j+OZaYQQQohUUkif4YSG9ocQ5uMT8m8ullFCCCFEKSlGn+EU4KNF0BFCCCHKQjGC4dnAq4V+KITw3yEECyH8LGdfCCFcE0J4OYSwNYQwNYQwrAg2CiGEEI1SyACaf7DnAJoA9AD2By4u5EtDCMcAFwHP5B26Argc+E9gMXA18GgIYbCZbSrkO4QQQoim0pxJ97uAfwFTzey5poqEEDoDvwEuAL6Tsz8AXwbGmdkD0b7z8Zyo5wK3FWCrEEII0WTKMen+duB+M5sSQvhOzv7+wEHApJzv3BpCmA4ci4KhEEKIhCjkzRCAEMIHgKF4k+kiM5tawGc/BxwGfKqBwwdFP9fm7V8L9GpE7yK8uZWePXsydaqbMmDAADp27EhdXR0A3bp1Y9iwYUyfPh2ANm3aMHr0aObPn88bb7wBQG1tLWvXrgUObeq/A8DcuXPZvNkX8xg5ciSrV6/mpZdeAmDw4MG0bt2aZ599Fji+IN36/2Xo0KHs3LmTxYsXA9CrVy969+7N7Nm+klaHDh2A2oK0ly1bRo8ePZg7dy4AnTp1oqamhpkzZ7Jjxw4AxowZw6JFi4D3FKQ9bdo0zIwQAmPHjqWuro6NGzcCUFNTw4YNG1i5cmV09vEFaU+dOnV3Oa1atQqAgQMHUlVVxcKFCwHo3r07gwYNotBLe926dVE5wUEHHUT//v2ZNWsWAO3atWPkyJHMnj2brVu3FmR3fTl26NCB2tpaZs2axbZt2wAYPXo0S5YsYd26dQAMHz4cOKAg7fpyWr9+PQDV1dVs2rSJ5cuXA9CvXz/2339/5s+fX5DdK1eu3F1OTalPMLogu+vLaebMmQBUVVUxatSoBusTDGyyNpBTTjBq1ChWrFjBmjVrgHfWpzhlOXz4cLZt28bSpUsB6NOnzzvqE9QUZPPKlStzygm6du1KdXV1g/UJqgvSrrd7b/e9+voUp07u/b73dn2CqoK0X3nllb3e95pWn5pOMGvaGr0hhF7AH4Gj8MV9AXoCc4HTzezlxj4bfX4wMBMYbWaLo31TgYVm9sUQwrHAE0BfM3sx53N3Ab3M7OS96dfW1lr9xdgcPndj08+948vJ6Eq75WgXoivtlqNdKddfVrQbI4Qwz8ya9LZQyGjSnwI7gcPMrI+Z9cEf2XZGx96NUfhj76IQwo4Qwg5gLPCF6Pf10Xk98j7XA1hTgJ1CCCFEQRQSDE8ELjGzFfU7zGw5cGl07N34E97mNiJnmwvcG/2+BA96u7VCCPsCxwFPFmCnEEIIURCF9hk21KbapHZWM3sNeC13XwhhC7DBzBZGf98IXBVCeA4Pjt8CNgP3FGinEEII0WQKCYaTgZtDCOeY2SqAEMIhwI3RsWJwPdAOuAXoCswGTtIcQyGEEElSSDC8FHgQWB5CyB1A8w/gnDhfbmbH5/1twDXRJoQQQpSEQuYZrgoh1AAfBIZEu/9pZo8lYpkQQghRIt51AE0I4dQQwsoQQidzHjWzm83sZmBOdKwpA2iEEEKIiqQpo0m/CPzQzN7IP2BmrwP/i6dRE0IIIVJJU4LhEcDemkIfp9CUCEIIIUQF0ZRgeCCelLsxDOhWHHOEEEKI0tOUYLgafztsjCOAl4pjjhBCCFF6mhIMHwa+F0Jol38ghNAe+G50jhBCCJFKmjK14lrgE8CSaFX6+rULD8cH1wTgumTME0IIIZLnXYOhma2LVpS4FQ96of4Q8Dc8X2n+sktCCCFEamjSpHszewH4UAihK74eYQCWmtnGJI0TQgghSkFBibqj4DcnIVuEEEKIslDIEk5CCCFEi0TBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5ShYMQwj/HUKYE0J4I4TwrxDCQyGE4XnnhBDCNSGEl0MIW0MIU0MIw0ploxBCiGxSyjfD44GfA8cCHwB2AI+FEPbPOecK4HLgS8B7gXXAoyGEjiW0UwghRMZoU6ovMrOTc/8OIXwaeB14H/BQCCEAXwbGmdkD0Tnn4wHxXOC2UtkqhBAiW5Szz7Bj9P0bo7/7AwcBk+pPMLOtwHT8bVIIIYRIhJK9GTbATcACYFb090HRz7V5560FejUkEEK4CLgIoGfPnkydOhWAAQMG0LFjR+rq6gDo1q0bw4YNY/r06QC0adOG0aNHM3/+fN544w0AamtrWbt2LXBoQf/E3Llz2bx5MwAjR45k9erVvPTSSwAMHjyY1q1b8+yzz+KtxE2n/n8ZOnQoO3fuZPHixQD06tWL3r17M3v2bAA6dOgA1BakvWzZMnr06MHcuXMB6NSpEzU1NcycOZMdO3YAMGbMGBYtWgS8pyDtadOmYWaEEBg7dix1dXVs3OjPOzU1NWzYsIGVK1dGZx9fkPbUqVN3l9OqVasAGDhwIFVVVSxcuBCA7t27M2jQIAq9tNetWxeVExx00EH079+fWbP80mzXrh0jR45k9uzZbN26tSC768uxQ4cO1NbWMmvWLLZt2wbA6NGjWbJkCevWrQNg+PDhwAEFadeX0/r16wGorq5m06ZNLF++HIB+/fqx//77M3/+/ILsXrly5e5yakp9gtEF2V1fTjNnzgSgqqqKUaNGNVifYGCTtYGccoJRo0axYsUK1qxZA7yzPsUpy+HDh7Nt2zaWLl0KQJ8+fd5Rn6CmIJtXrlyZU07QtWtXqqurG6xPUF2Qdr3de7vv1denOHVy7/e9t+sTVBWk/corr+z1vte0+tR0gpkV9IFiEEL4CXA2MNrMlkf7jgWeAPqa2Ys5594F9MpvZs2ntrbW6i/G5vC5G5t+7h1fTkZX2i1HuxBdabcc7Uq5/rKi3RghhHlm1qS3hZI3k4YQbgDOAT5QHwgj1kQ/e+R9pEfOMSGEEKLolDQYhhBu4u1A+Fze4RV40Dsx5/x9geOAJ0tmpBBCiMxRsj7DEMItwKeB04CNIYT6PsLNZrbZzCyEcCNwVQjhOWAJ8C1gM3BPqewUQgiRPUo5gOYL0c/Jefv/B7gm+v16oB1wC9AVmA2cZGabSmGgEEKIbFLKeYahCecYHhivSdoeIYQQoh7lJhVCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5FAyFEEJknooMhiGEL4QQVoQQ/h1CmBdCOK7cNgkhhGi5VFwwDCF8ErgJuA44EngS+EsI4ZCyGiaEEKLFUnHBEPgqMN7M7jCzf5rZl4BXgIvLbJcQQogWSkUFwxBCW+AoYFLeoUnAsaW3SAghRBYIZlZuG3YTQugJvASMNbPpOfuvBs4zs8F5518EXBT9ORhYnJBpBwCvSlva0q4IXWlLu6n0NbMDm3Jim4QMKAlmdjtwe9LfE0KYa2a10pa2tMuvK21pJ0FFNZPiTwc7gR55+3sAa0pvjhBCiCxQUcHQzLYD84AT8w6diI8qFUIIIYpOJTaT/gT4dQjhaeAJ4L+AnsAvymhTkk2x0pZ2S9VOo83SblnaTaaiBtDUE0L4AnAFcDCwEPhK7oAaIYQQophUZDAUQgghSklF9RkKIYQQ5UDBUAghROZRMBR7JUSU245CSaPNSSJ/lJYk/a2yTAYFwzIQQkiN3y0i6e8ptk9ybU7K32krx/rfk7Q7TT5JkiT93RLKshKvEw2gSZgQwv5AR2AosNTMns85FpoTaEII7YEAHAa8amYvNdfeSLd1pFkT/XwcmBPNA939ZBrX9oR90hvoCwyJbH6mGNppLMdIOxF/RJ9P0idtzGxHCKEH8JaZbYir1YB2Wv2d1rJMR90xM20JbcDHgVnAVuAfwD+BKfjcyf2bqf1B4BHg38AzeMD6ZfSdHaJzQkztrwDPAy/gSRC2A/8CbgEOqWCffAafirMRWAC8BqwErgZ6VKjNSZZjIv4ogU9GAhPwjFRzgHsim48Dqprpk7T6O61lmZq6ozfDhAgh7Ae8CNwBPIAnDuiLV/Rh+IV8hZktiam9FPgb8FvgUGAQ/uTVBZgNfNvMXo+h3QFPffd5POnBDmB/4CTgfDw13hVmNj6m3Un5pAPwMn5zeBTYL7L1g5HtbwJfM7MpFWRz0uVYdH/k2J2kT+pvmvcCA4FqoDd+Q/2Dmf2kUN0c7TT6O81lmZ6605zIrG2vTy0XA3XkPZkABwFnR8fmAgfG0P4i8HegVd7+gcDX8be4SURPRwVqnw88B+zTwLF+eIagVcDQCvPJhcAioHXe/v2A0cAfgSV4FvtKsTnJckzEHyXwyWXAfKBt3v4a4Kd4K8WvG7o+W7C/01qWqao7FdeJ2YLYBWwB9lg+xMzWmNm9wOlAB/wpqVA6AevxylDfx4eZLTWzHwIn409KR8TQXgUYviTWHpjZSuD7wArg1BjaSfpkI36jPCRPe4uZzQQuATYDx1eQzUmWY1L+gGR90htYjfcDEUKoirTnm9mlkfb78LeAQkmrv9NalqmqOwqGyTEZv3i/E0Lom3/QzJYDG/AmoEJ5GC/kz4cQqsxsJ7x9QeBPXBuAUTG05wObgPtCCGeGEPIv5A14c1WT1gjLI0mfPIlXjFtCCMdGHeu52i8Dr+Md7ZVic5LlmJQ/IFmfPAgcA3w00toWze6pio5PBd4AxsTQTqu/01qW6ao7hb6eaivoVf7TwCt4gLkEf9vqjvfBvR9/ahoSQ7cV8B284/hvwIeBdkBrvNIcGVc70j8UmIg3Q4zH+w9PxJtJv4hXvMGV5JNIewze7PIP4H/x/pQj8By3n8CfnuP4O63lmIg/EvZJe+Au/K3i10B1zrF98GawNzPo79SVZdrqTsH/nLYmFVTI+X1YVKlfx9+onogu6JeBHzfze8bi7eLb8ZF3f8afxlYBdzbT7h7Al/Cn0ufx0Vpv4p3Wl1SST/K0+wHj8EFAb0Q3kJcjn3yrUmwuYTkWzR8l9sl5+MPYTrxZ/pfAb6Jr8b6M+js1ZZnGuqPRpAkRQugJ/Nui+VFR08YJ+BvWCny003wz+3cM7fZAGzN7I/p7CPABvM/gVeAh4EkrcFRcCGEf4Fi8sv0rx/aheFPGEnwuzwuF2hzpJOmT4ZHNa3P2HYM/US/Bb6LPmtmuCrI5kXKMtBLxR6STmE8ivXZmtjWEsC9+s3s/3nT6Jh4QHzWzdTF00+rvVJZl2uqOgmGRCSEcCXwZbw7oi49quhf4pZm90kzt/vjb2hDgALxN/G7gtxa1mTdD+3S8GWMoPtprI/4Ed6+Z3dNM7SR98n58BOLQSHsN8FdggpnFXhA6xeWYiD8i7SR9ciDwWfwtYl/8hjYR+Js18yaVYn+ntSzTWXcUDItLCGER/tQzB39VPxpvzz4Ynw9ztZmtCCG0ivGWMg9vZvgnXjGG4U9D24A7gZvMbG1M7dXAn/ABDEvwp/HP4h3QC4AvmdmTMbWT9MkyfFLv49F3vA8ftj0Un5P1VTNbVKh2issxEX9E2kn6ZAbQOdLdiA/QGgysxfsQf2NmmzPm77SWZSrrTuy2Wm0Ntl9/HM/asjtLBt6hezA+V+hp4Fb89b5Q7TOjC2v/6O/WeCf0e4H/wUdPFdxvEGl9FHihkWMD8Sf0+cTIdJGwT06PtN+RZQJvipmGjzrbr4JsTrIcE/FHCXxyFj45u2/0d9voujsTv8E9B1wQ0ydp9XdayzKVdcdMA2iKugGXA9MbK2jgHLzj+8QY2tcADzVyrC2eQm0TUBND+2zgWWBQ9HdroIpoYjP+9LWMeANnkvTJRXi6uPrK0SqyvVX09/uBdcA5FWRzkuWYiD9K4JMf481cDR3bD/gB3hzWP0P+TmtZprLumCkYFnWLgsabwLeB9o2c8zCeJqhQ7ePwpoCLaDg7TMBz/n0lhnYnPNj9Djg4Xzf6eS/w0wrzSa/oJnkz0LWRcx4AxlWQzUmWYyL+KIFPzohuYh9r5Ph++BvF5zLk77SWZSrrjpmCYdE3vHN3MXA73mRwGNFTEp41Yz3wgRi6AbgObwr4NnAU3kRQ/6R4cKT9/kJ1o5/vx98OF+Fpr04B9o2OnYx3gp9QST6JPn8mPpruL/hT6dFEqbyi31+N6e9UlWPS/kjYJ+3wofezgf/Ep/W0zjneOdIemzF/p64s01x3NICmSNR32IYQugD/D8/x2Q3v79iAj3zqAaw1s5NiavfCK8X5+IXxeKTfG+9jCWZ2bIHau5dQCSEcEdl+DJ7stjPwVvRdU8zsgph2d6H4PglmZtF0kFMj/UH45GPwG2wH4Bkz+3iF2Jx4ORbbH3l2dyE5nwzGU/2dgfcLPYLPozsUv+l1N7OamNpp83fayzJJ7aKX5e7vUDBMhuCLV34I+Aj+9PJvvA/g19bMtdlCCG2AT+Ht7/VPzX8HbjezFwvUCvhF1QVfN25TCKEf3indHV+HbD4+t6tZF0uSPon0j8bnGR2I96/MxVc5iDXfLWmbi1mOjegX3R+RbpI+6YMvV3QW0BUfWLMA+JmZLWqmdir9naR2wmWZqrqjYFgEosmlp+IVuC3wFJ4FYZqZvRVCaG9mb8bU3h+fXHsqHrCmAo+Z2dLoeGdgu5ltjaE9HL/x/Cd+Mf0z2v6KT1jdHsfmSDtJnxyKNyF9Gl9iaj4+BP0xM1seooVhK8zmJMsxEX9E2kn6pD3e3FeL57D8K/B4/Q0+hNANbxYseG5aiv2d1rJMZd3Z43sUDJtPCOFhfE7UdHzU1wfwDvD5wA/M7A/N0L4HfyKsw/M1HoMPKHgc+K6ZPdUM7bl408sE/OnqvXj7/j6R/vfN7LWY2kn6ZDr+xvogPup1bKS9EbjLzG6qQJuTLMdE/BFpJ+mTn+M3/hfxgRFHRj/rB4YsbYZ2Wv2d1rJMZd3Zgzgdjdr26NR9H94e3oectbXwfo7fRoV3E/HWXxuNv7EdjmflaIX3F3wMeAxPRPvVmHaPiuzukre/P/ANvHN+NvHWGkvSJ++LfHJA3v6hwI14jsI/UOCadCkux0T8UcJyPAZ/EOuOZxW5FG8WfQE4PaZP0uzvtJZl6urOO76rGCJZ3oD/BmbiT3Gh/mfO8fOBl4AjY2h/H5ic83fuCLv2eNb2VcDAGNqfwZ/aekZ/V+Ud74dnkfhYhfnkS3iQ7hz93S5Peyy+Ht7YCrI5yXJMxB8l8MlPgEca2B+AAXhi7qVArwz5O61lmcq6k79pPcPmMxnPv3eMOdvMzMLb66/9Hh/t9OEY2tOAQ6ORdljOml3m7e8340/QJ8fQnoTPL/xcpL0t0q6KRm6txDu74yzim6RPJuFDqE+L7N4aae8bddjPxJtTPlJBNiddjkn4A5L1ydNA/xDCwbk7o+9ZDlwNvEa8dQvT6u+0lmVa684eKBg2n4X4yK6/hhB+HEIYAW8Hl4j+wPIY2vPwJ6opIYSvRJ3ruy8IvImgF96kWRBm9hLwf/jCm1NCCKfW220+hPkgoAZP1l0oSfpkGd6f8ssQwu9CCKMj7X+b5yLsgDep1FWQzYmVI8n5A5L1yUy8+WxiCOETIYQeecfX4iMn34qhnVZ/p7Us01p39kADaIpANMz3Crwdex98QEBd9POTeM7FwTG1DwK+i7e/v4pPil+CNw2cB4w2s0OaYfv78Kfw4/ELawY+wf79wCozOz6mbmI+ifTPxVfZ6IO/QTyFLyL6EQAzO6qSbC5BORbdH5Fukj6pAa7Fb2bP4E2EL+D+OQtPNZYfJJuqnUp/J6mdcFmmtu7s/h4Fw+IQQgj4aLhT8RWoB+OV/AHgNjP7ezO069cBOx3vTzkQn4z8ZzxL+4yYup0tWu8r+Dym9+PrGbbHO+ofMrPVzbA7EZ+EENqa2fbobeID+GCgI/F5aQ/gKxwsqSSbI+2kyjExf0T6SfqkGz6i9Gx86bCd+IjmGcBPzOyRZminzt8pL8vU1Z09vkPBMB5RG/778Azyr+MjnubiTy1VeF6+DVHb9s7GlRrVH4q/ra3F39QWmdn6EEJ3/KaxDNhpBU66DZ4d4szI7jZ4HsFHgT9atFBmXJL0SfCFXk/B+wbewp+YZwDT85pjKsbmSD+pckzEH5F20j45ONJfBbxsZqui/YfhmVYWAm9YjGk9KfV3KssyrXWn0e9TMIxHCOFm/ALegQ/53RJtdcCvzGxmM7S/jzcTVeFDzt/AJ8NPBu40s5ebof0A/kT1Mt7ksB/wnuj/uA/P4PByCG+naStAO0mfjAdG4gmdt+FvEF3x5qN7gPvN7M1C7U5xOY4nAX9E2kn65GvABfjgrZ74PNcngXvM7FdxdSPttPo7Se0kyzKVdadRrJnDUbO44c04m4H/yNk3Cvgeby9o+alo/zvWI2uC9uv4cOSu0b6TgfF48FoGnBztb1Wg9qH4xVqTs693pH99dLGNK9TmEvlkCzlDyvHs+J/DA/gLxJhrlOJyTMQfJfLJeuCr+Ny5bvgNbzJ+Q50HHJ1Bf6e1LFNXd/b6vcUSytIWVeZpjRxrhweUdUC/GNpX4UmxGzrWCc8W8yyNLOvyLtrn44MU3rHWGJ7v8FP4k2mcjPJJ+uRi4IlGjtWvY/YmMKKCbE6yHBPxRwl8cg2ebq2hYwPx5NxTyJvz2sL9ndayTGXd2dumqRXxWAEcFkI4AXzOS/D5efuY58e7HlgJfCKG9stAr6i9PFe7rXmf3nXReXG06/Cbztei0V+7MbOdZnY3PrT7tBjaSfrkOWBwCOHTkXaI9Fub50+9CZ8CUlAG/4RtTrIck/IHJOuT14FOwXNNEkJolaO9FL+B9gM+GkM7rf5Oa1mmte40ioJhPP6CX8TXhRCOiwLJNjN7C8A8I3sb/C2rUP6Mz7/6YQhhUI729kh7MZ79vc3eRBrCzBbgaxV+CvhGCGFACGGfqCO8nkPxpplCScwnZjYFeAi4IoTwKfzNdqdFnfLmc7C64SmhKsJmki3HpPwByfrkQXwk4I9CCH3NbFee9nR88EjnGNqp9HeKyzKVdWevFPM1Mwsbby8kORDPsr8Tf2W/EhiOj366ER8B1Tmm9nvxDB0b8aajC/G1wA7F5wRuJC+naAHf0RX4Ad5ZvwHPDvElfLHMR/AUWJ0qyCf1g7wOAu7CK8Eq/In5o3h2/1/j85marJ2jeyi+8vaONJRjUv4ogU/qtU/FR4s+A/wcHyrfAR8ocUl0XRbqk3p/1+IrPGxIib9zF6X9FR44iq2dZJ1MVd151+8uplgWN3w01YTogt2Ft5NPBc5tpm5XvD9hIv6mtiuq5HOAi2Pohby/20cX2OP4qLUn8JFrx1SqTyLtocD/4GuX/RsP3n8GPtQMzX3wddfuxJt/KrYcS+GPEvjkSLwZbRo+DH995JNngCubqd0HD6oP4BlPUuHvSHsw3gT4DzwwFlM7qftUautO/qapFQUSfPHR7viIr6VmNivavx++1lZfoM7MtsTQ7oYHqf7AGjNbEjy/36H4si4HAnPNbE0z7G+DB8a3cva1xlcSL3jduOjzifkkz8ZdlnPBBp+f1T/6zrhrvLUyb4oihNAB93OIbF5oZptiaJaiHBPxR6SThE/a481aXYHN5vPFeuOTszsTrYFn3gTWbIKviH4wPjDsAGB+3Os70iuqv0MIAU+tNhCojuz7c87xdpH2c/VlUaB+KepkKutOo9+tYNh0QggXAl/EL7Dn8Ar8b/zJ5Vdm9nx0Xpz5QGfiy9e8D3+ifRVYg/cnPGRm65qhPQL4l3k+0tz9bQCaeeNM0id9gdcsypKTd6xgvZzPdgK2WIyJwE3QTrIcE/FH9PkkfXIy/rZ2Cp5ncjHerPYIMMOaObE853sCeLLvIukl6e+vAp/Hb+7P4dMJ2uFvtD81s/nRebsDTgHaSdbJVNadJn2/gmHTCCF0xJdPuQ64G3/6GYCv1H00PlfoG2Y2N6b2CrwZ4//wLBxHACPwFcCXAFfkB7Mmau+HL9U0D89xOBd41nKye0Q3keOABVZAFpqEfVK/eOeT0c9/AK/k3jgju0cAi62Jq2hHug/ga6H9DVjW0GeDZ0NZVciNugTlWHR/5Ggn6ZPn8CkT/4ff9EfhzY3t8JUavh0nIEZ23wn8EfhL7rUbcrKeBE9t9mohN/CE/d0J75q4BO9z64q/xb0P+A/8Tflqi7EgbgnqZOrqTpMpdrtrS93wp7gFDezviKcjmoq3xx8SQ/sSvJkkf/+BeCf6Mrw/pVsM7QvxeUqPAc/jndK34esZHoFnjuiKV6DaCvLJf+F9BIvxCvw0vnbZ8bzd/NUNXwh2eAG6X4h01+D9Mo/iGVH6A22jc7pH/jqsgsoxEX+UwCeX4s1a+ft744mdN0bf1y5mvdmFj0B9Hb/5f4CcebT4wJd7gd4V5O/P4H2lrfP274Nng7oL70cdFsMnSdbJVNadJtuQlHBL2/Ds6HXA4EaOd8XfwD4VQ/syfDJ8r+jvNnnHD8GzwxTckY6P2Ps/vKlkYFShZ+Gd81PwkaV3AOsrzCd3ADdHv1cDv4gq4UZ8dNwX8HlpbxSoOwGfXtIJOAlPSL4V75i/Gx8McAWwtcLKMRF/lMAn1+BvVvWZRPYlZzAXnoZsGfC+GNq/AW4FhuAZW2bguT1fxAfoDI32v1Vh/j4Jf1tu8OET7zObClwaQzvJOpnKutNkG5ISbmkb/oS5EB9xOYy8p7ronJnAd2Jo98ebCMaRM1yYnFRDeBPnNwrUbYU3u3yVvLRFeLPozXjz6S7g+5XiE3ygxWfwodr5dn8I+BP+5LwLuLYA3Srg68A3827IHaLvewLvW9kFXFdB5ZiIP0rkk/fg/YQX5+2vf5NojTfdF3Tjx5tY/xdvYt2tiQ/tvxrvk6y3e1yl+DvS6BrVixmR3jsyqeAPqnG0k6qTqaw7BdmQlHBL3PCVmlfiTYrj8L6P/nib/MfxOVKDYugGvJngzehCvgRvimmHNzu8H88DGEe7bf3FFd148ptm6pN0D6gwn3Qi5ymRdz4pVkcVr3+Buj3q7Yn8kT/l5PhIt1+FlWNnoqa+YvojxycDE/JJW7z1YRcwHTg959h++NzAN2P6pC+NpCnDb9LnNcPuRK6/vM9Pw6cM3A2cgz+gVuNNna/H8Umk/dGE6mRidSf6/MVJ1J0mf39Swi11w9vev83bc5iew/sVXiLnKTWm9gB8QMB6YDs+l2kOnp7ohiL/H/WTW78DvF6pPtmL3d8GNjRTqw3vfPL/NrCuksuRPZ+Wi+aPvXxfMXwyBh8s8ia+AsEUfBDGi8BdRbBxnwbK8mrgpQq+/vaNAl9ddKNfFF0jK4FLmqndCZ8PuYK3+z6LVicTrDv98SbpfyV9D8zfNJq0iUTzjLCcEWkhhMPxbOrr8QJbavHW7eqKv72tyPl7FDAWb5N/BHjGYqzbFd5lLbHgi/p2NrNH42hDYj7Z65DyEMJp+FpmDxWo2wXoaNEaevXfhb/VGX5zWm9m98WwOZFyjEYtHorffJbk7W+F3+w+Rgx/RDqN+jr6jv8ipk8ije729rD4EfgC0kfjPr8HmGUx19IMIXQzs/U5f9eXJXh/5fNmNiGGbiLXX/TZhupNb/zNcDWwwmIsqh2V1WHAPmb2bM7+YXjmn7U0r052Ibm6s9snkWZPvJl3DN4PHPse2GQbFAz3TgihyvYcTl1f+HtMwI2pfQTeDj8Ef0rchQ8Tv8OaOYQ4hLCf5UyojSpK2FsFL0A7SZ/kazc4dyx4QuC38j+/F92GfD0RX79xdc557fEBAE3+PxIuxzHAN/An5gPxtFr1ds/LOS/OfLQ21oQ5ptGw980F+qQfnubvyMjmzfjAk/tzg1cc8rR34A8ajwH3mdnanPO64q0eTfZLUtdf9Jn8Otkaf8PaESc45WnnXyeGXye3WYxpFHnaSdadJl2DpUDB8F0IIfwIn2M0B3/K3J5zrHX0q8UJMiGE+ubEv+Oj1AbiT3AH4PN5vm9my2NOjr0Pb3aZCjxtnkm+/lgwM3u3t8a9aCfpk71p19sd58bfkK9PwW8cvwf+J/eJtwjaxSrHFXgZPoU3cb0HOAM4Cl8H8HIzeyam3ZfhUwP+ic/De4dP405wDiEswPumFuHNXd3x/rCdwO+AW8xXQY/jk3ztA/FpQrsi7Z82400zkesv+vze6mQbPIARs07mXydH4Hlfj4r2f83M5ldg3Wn0Goweslvhb+DJB6q47atZ2PCbzi58ZNpj+ETWjwF9c86pwm94QwvUPgvvG+iQs28//OnrS/gIu1vwJo9C7T4tsnsWPsrrbny+V3XOOfvgc6cKnVuYpE8K0W7yHKyEfZ2k9ici7fzBG53xQRKPAfcD+8XQ/njk65fw1SQ+j09w7pJzzr54wuWCBlcBZ+N9VQfm7DsI+CDwY3wqxdWF2txE7eeboZ3I9Rd9rpA6eVQFXSdJXt9NvQZvIOZApUI2vRnuhRDCHfhopt/jQ6BH482Bi/EnsNn4iLbbzGzfArW/hk+CPdUafiI/G59D9R9mNqNA7Vvw4dt3AsfgfTTd8cnDz+FDuvcDfmZmbQvUTtIniWgn7OsktT8P/CfwQWsgh2QI4UR8rt1/WYHZSkII4/Gn7r/hk5pH4/28j+PL88zHR3reZWbtC9T+Hv4g1OAafCGES/AV0UdbTt9WBWgneW0nWSeTvE6SvL7Hk9A1GIuko21aN3zo8P+SM4IJH659Lv5kuARvSnkNuDuGfg3exPMdGlmKBH+i+2aBuq0izVtz9rXDB7X8GL/QZuEZJCZUik8S1k7E1yXQHoA3B95GNMy/gXMepPC5hW3wOabjcvZ1xp/05+EjPhfgI/jujWH3B/E5ZxcSzSfMO75PdA1+uVK0E77+EquTSV4nSV7fSV+DcbbEvyCtG+zOvn5E9Pc+ecf74EO3dwFHx/yOy/A5NT+LKnkvoH10bADePj8mhu5+RHN9eGfTSXd8Ps8uYGSl+CRpfyfl6xJofxzvw7oPz6ZyFG9nczkKz/5RkHZ0I6oFjmvE14fimUZ2Ae+NYXNrvGnrWXyS9kC8ebF1dPzAyO7jKkW7BNdfInUyyeskyes76WswzqZm0nch7JnwN+CVcaeZWQjh03jKpi5xNEMInYHP4hnm++DNMAuBfvgFt9rMTi1Qu5WZ7Qp7Lq/SCh+WvyP6+zPAjWbWuRDtfPuj34vik6S0E/Z1KcqxHZ5F6EI8vdiL+NtJb7w/5e9mdlYh2jnf0cbMdtSPmGRPX58N/KIZ1/aBeGquz0eHpuFvPwPwQUDbzGxMpWjnf0f0e7Hqe2J1MsnrJMnrO+c7in4NxkXBcC+EENpazmiyvGOt8GaVNmb2leZqR0OjP40/na7Ck9L+xsxejaHdzsy2NjRaNLL7anw1+6821+4GtIvmk2JpJ+zrxMsx5+9q/IbXC+9bWQT8yQpYMSFH6x2jCnNurK3xJqxtMcsxN6C0BT6JZ1g5DM+JOxcYb9F8zArSTvLaTrJOJnmdJHl9J3YNxkHBsAFCCD3xUVgn4imBpuJLzcwzs8155xY0TyZPuxfecf6wmU3LOafgOUzR5wbiI8vOwDNQzML7I56ynMnacSihT4qmnbCvS1WOXfARhpPwZYrWFaqXp90FT7J8FN4UNRl4xMxeyDkn4CM0X8u9yRaoPQi/9h7M0+5iOcuHVYh2ktd2knUyyeskyeu7Cwldg82ikDbVrGzAn/Eh2r/BUwM9h8+Pmg+cmXNeKKL2M8A5zdSejnc6j8OfNGfhk5KXA5flnNemiHYn6ZNmaSfs63KU4wvAV5upfQ+e5WQanhjgFTzDx2PA8c2sN41pPw6cmHNeqwrTTvLaTrJOJnmdJHl9J3YNNuv6LdcXV+qGp/95lbxRWfioql/i7fAFr/BQQu2uefsPBK7FR5v9Bti3Qu0uqnYabS5BOY6NtA/HRzh2wtNenYGnu3oR+M+Ydu9N+y+R9mcqUDutZZnW+p7YNdjcreRfWOkb/oQ1nehJjZzs7NHvl0aFWVNh2l/Fm0k6RX/vy56LnH4Mz014fIXZnYh2Gm0uQTmOA/7WyLEe+CjNdcRb0SCt2mkty7TW98TKsrlbSb8sDRu+2OgrwNi8/fVDt/fB2+ULXlcrYe0heCaHT+bt3yfn9weJt9ZY6nySRptLUI6n4k/e1Y0c7xTdBC/KkHZayzKt9T2xsmzu1gqRzz/wzuI/hBCuCyEcHXWa148Aaw8MxlNCVZL283j7+69DCPeEEE6JRoK9BRANRz8Cb/OvJLuT0k6jzZBsOc7GR1z+NoTw+RDCodFIxnp24sPlN2RIO61lmdb6nmRZNguNJm2AEEInfJXrD+Adu8vwYcTr8CebQ81scEztLvgcqRPxzA5Li6Ud6V+I5xM8EF83bgXeWf1BPGNHTaXZnZR2wuWYmHakn1Q5DsaXNqqJNJ/Cs3xswpMvv9/MDsmYdirLMknthOt7YmXZHBQM8wjh7cz0+PpiH8WfgrrhTyyP4BNv65rzHfiw4jPwp7cDgEOao51jd8AnHo/FO6kH4BNlJwJ3mtmySrI7Ke0ky7FE2kmWY2s8Fdin8Qna8Pbw+R+Z2RNZ0U5rWbaA+p7YdRLbJgXDPQnRUiq258KbHYADzGxliLHsUaT5XryirceHPteZ2dIQwr7AQZF23KVh6jNl5NtdhT8dbipUM2m7S+CTopdj0tpJlWOkMQi/+fwLf8pfaGbboreiw/Fk1FstZy2/lq4d6aexLFNX3yP9RMuyuSgYRoQQ+tieKzi3pngLb94MfAQfktwDaIs3OTyBJ+9d1AztQ3Of/hqyuxkXb5J2J6KdcDkmqZ1kOX4PfwLfhk8qb49nJbkXf8LfvJePt1TttJZlWut7YmVZNKzEI3YqccOzIOzCJ4FeCvTIO94aH0FV0Lpu0WeH4G35HwLaRfuGAt/H28tfAz4b7S90UvmgyO4V+LI1vfOOt4nsPpZGMs6Xye5EtBMuxyS1kyzHwZE/z8Obz1rhCZLvjMrgJXz5nTjlmFbttJZlWut7YmVZzK0sX1ppG/BtvNP5V/jTyiq8zf2TRMvE4Alvd9HIEil70f46MC3n71Z5x7+PZ6MoSDf67FV4Zoif4qPLduGrUf8XUBWdc3C0v3cF2Z2IdsLlmKR2kuX4bWBKQ77Gl8y5C8/n2TlmvUmrdhrLMq31PbGyLOZWti+upA1/Vb8B7zA/Fp/Q+qeo8Jfh64SNB56PoX06vlL00Tn72hJlhsCflOYBl8fQvgNPZntgpHNGVMH/hadl+nP0v1Wa3YloJ1yOSWonWY6fwVcYODjP1/U3z2r8BltwBpcUa6e1LNNa3xMry2JuZfviStnwtdAuA76bsy9EhX8qPgT4MfxpK86k3k74U08dOTkU8875O/CFAnX3AT4FfC1vfwe8eeOzwMOR3Z+tFLuT0k6yHBPWTroce+LNUJOBUY2cswD4XBa001qWKa/viV0nxdzK9sWVtvF26qH8RSb3wVe73gXsV6Bm/QCl3sDv8Se4OXh7/5H4sOWb8bk7HWPaXZ8V4h0JivH2/11Ah0qxO2mfJFGOJdJOshyr8ZUYnsUXf70EXxT3QDz11mvNKMdUaae1LEt0nSRZ3xMry2JtZfviStkauahasWeevx8BM5ujj8/ROQe4HX/CegvYjGfdPzeGbuBdOpuji3laodpJ2p2UdpLlmLB2ouWYo9Ef7xd6OPL16/hk6qeBi7OindayTHN9L8V1Uowt81MrQgj74xNs9wMMWGJ7LpTZGm+CeM7Mphfh+7oA3fE2/s7ASjPb2FzdBr6nFXAa8IKZzSuCXhcSsrsY2kmWY6mvkbzvjl2OOXa3w29oK/D/YSjQEX+LWGJmL8WwK+3aqSrLUmsXq74nWZbFJtPBMIRwDvB5fMmSf+GTPlfgWRD+0pwCyp3rE02SDRZj7s+7aRebUtldTO2Ey7Ek10ixybP7VXyS8/N4guWHLcYiuC1MO01lmdb6nlhZJkFmE3VHTz4/xTtuB+NzYGbgKYEuA34QQugendu6QO1OwBMhhG+EEPqbU3/Btco5r1+U2SG2dt6xkPN73xBC+0q1u1jaCZdjktpJlmO+3efi/TW98OH5P6u3u1BakHZayjKt9b0LCZVlYpS7nbZcGz7Z9ukG9rfD28yfx9u1O8XQ/iL++r8Sb2aYgQ8v3j/nnF74qLW+0o6vnXA5pvUaSatP0qqdunqT5mswqS2zb4b4EOsQQuiD/7Jv8GVKtprZb/H8fB2A0TG03wv8Ak/8+xF8Uu8NwIshhN+HEE4CPg6MNrMXpN0s7STLMa3XSFp9klbtNNabpLWT9HcylDsal2sD+uKTbP8nb3/uqLKnKHzi9754xoVv5ewL+BPWfwKP4h3Ju4DvSbvZ2omUY1qvkbT6JK3aKa43qb0Gk9rKbkDZ/nHvL70UHzr8PPA1oFt0rBtwErAFX7erUO39gcGNHGsDfDi6yA6RdvO0Ey7HtF4jafVJWrVTV2/SfA0mtZXdgHJvwGH4nJo1eLv5UnzC6YvADUXQb0M0UTZn33eAF6VdPO0kyzGt10hafZJW7STLMq3aSfu7mFtmp1aEENrincJLo7974ZkWRuDzYH4PPGNm22No7wP0MbPlefvrR6l9FZ+383tpN0874XJM6zWSVp+kVTt19aYE2on5OykyFwxDCO8BLgeOxjMg7ACmA/dYM9brakD7NWAn3i7+GzNbkHNeFbDdCnC+tPeqm2Q5pvUaSatP0qr9GimoNyXWLqq/kyaLwXAp8E9gFt400AMvuM7AX4H/NbOXi6hdC3QB/gZca2brpN187TKUY1qvkbT6JK3aFV1vyqRdFH8nTrnbaUu54RM/l5EztwVPCVQLfCs6djvRmmbSrkztNNosbWlLO752KbayG1DSfxauxJPENpjwFvgYsJacNb2kXXnaabRZ2tKWdnztUmxlN6Ck/ywcA2wFvkEDy4Xg82xmAFdJu3K102iztKUt7fjapdjKbkDJ/2H4Jp5+6FZgJL6oZf2Ky33xDuVjpV3Z2mm0WdrSlnZ87aS3zAygCVF29mg48UX4sOFDgIXAE/hK14OAZWb2EWlXpnYabZa2tKUdX7tUZCYYAoQQ9jWzf+f8PQb4JN7B+xy+yOQDZrZG2pWrnUabpS1tacfXLgWZCIYhhIOATwA1wOF4ofzOzJ7MOWePgpR25Wmn0WZpS1va8bVLSVaC4cN4WqB/Ai8D7wOG4Ylkfwj80sx2hBiLaEq7dNpptFna0pZ2fO2SYhXQcZnkBnwAX9W6d/T3vvgE0GOBO/AC+6q0K1s7jTZLW9rSjq9d6q3sBiT+D8I1wOONHOuEj37aDNRIu3K102iztKUt7fjapd7KbkDi/6AvHvkv4JRGjrcBJgFfkXblaqfRZmlLW9rxtUu9ld2AxP9BaAf8Cl9T60o8c/p+Oce7AKuBM6RdudpptFna0pZ2fO1Sb1kZQNMH+G/gg8BGfD2tNXi29lH4ApeDpV3Z2mm0WdrSlnZ87VKSiWBYTwjhCOBTeOduG6Ar8CTwEzP7h7TToZ1Gm6UtbWlXNi02GAZfi+sI4AxgE/AMMNeiCZ8hhMF42qCC1uuSdmm102iztKUt7fjaZaPc7bRJbcBP8bbqOfjSITuBl4Cf4yswSzsF2mm0WdrSlnZ87XJtZTcgkX8KhgJvACcB3aJ9B+IdvCvwzOqfh4aXGpF2ZWin0WZpS1va8bXLuZXdgET+KbgKmJ7zd5u849fhufJ6SrtytdNos7SlLe342uXcWtEy+SdwcAjhMADzVEBtQgj7RsfvAN7E8+lJu3K102iztKUt7fjaZaOlBsPpwA7gzyGEs0IIVWa2w6JEsWa2AmgNbJN2RWun0WZpS1va8bXLRkseTdoTuAF4D97R+zTwePT7JcC5QD8z2yLtytVOo83Slra042uXjXK30ya5Ad2A84G78fku64FdwBTgbGmnQzuNNktb2tKOr12OrcW9GYYQeuPLiQBsAZ7FRzcNADrgbdmvmtkGaVeudhptlra0pR1fu9y0qGAYQrgYuACoxgtlOf7aPgW438xWSbvytdNos7SlLe342hVBuV9Ni7Xhr+wbgW9Fvw8Bvgjcjz+9PAYMjc4tdL6btEuknUabpS1tacfXrpSt7AYU7R+BLwGzGzk2GpiBP8kcIO3K1U6jzdKWtrTja1fK1pKmVmwHOoYQhoPnzgshtAUws5nAecC/8awJ0q5c7TTaLG1pSzu+dkXQkoLh/fhIpi+HEDqa2TYz2x5CaAVgZi8CrwG9pV3R2mm0WdrSlnZ87cqg3K+mxdiAEG2nAS/gWdTvxBeabAUcgi8tsgmf+yLtCtROo83Slra042tX0tbSRpN2wQvmWOB04H3RoTV4Yf7azK6RdmVrp9FmaUtb2vG1K4HUB8MQQnfg08DlwKv4nJfXgJnAU8A++LyYv5rZEmlXpnYabZa2tKUdX7vSaAnBcDwwDHgI2ADsj6cIGgSsA75lZrOlXdnaabRZ2tKWdnztiqPc7bTN2fBX883AmLx9fYGzgEnA80CNtCtXO402S1va0o6vXYlb2keTDsUXk9xev8OcF8zsPuCj+Cv9mdKuaO002ixtaUs7vnbFkfZguBx/Vb8hhDCwfphvPWa2DZgAnCrtitZOo83Slra042tXHKkOhma2Ffgm0A74FfD/Qgh9QggdAEII7YGxwEJpV652Gm2WtrSlHV+7IrEKaKtt7gYMB36Hj3R6Fe/svQt4EZgNvEfala+dRpulLW1px9eupC31o0lziYYBfxifHPpv/Inl92b2nLTTo51Gm6UtbWmnmxYVDHMJIbQys13STrd2Gm2WtrSlnT5abDAUQgghmkqqB9AIIYQQxUDBUAghROZRMBRCCJF5FAyFEEJkHgVDIYQQmUfBUAghROZRMBRCCJF5/j/cEGHMXJFgyAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulacion=Aer.get_backend('qasm_simulator') #crear una instancia de simulacion\n", + "job=execute(circuit6,simulacion,shot=1000)\n", + "result=job.result()\n", + "counts=result.get_counts(circuit6)\n", + "plot_histogram(counts,sort='value_desc')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/challenges/QOSF challenge/programa_muestra2.py b/challenges/QOSF challenge/programa_muestra2.py new file mode 100644 index 0000000..f63993e --- /dev/null +++ b/challenges/QOSF challenge/programa_muestra2.py @@ -0,0 +1,280 @@ +import qiskit +from qiskit import QuantumCircuit,execute,Aer,transpile,BasicAer +from qiskit.circuit.library import SwapGate,QFT,CZGate,SGate,TGate,GroverOperator +from qiskit.algorithms import Grover +#from qiskit.algorithms import Grover +from qiskit.quantum_info import Statevector +from qiskit.visualization import plot_histogram +import matplotlib as plt +import math + +def inicializador(circuit,total_qubits): + circuit.x(0) + circuit.x(3) + circuit.h(4) + circuit.h(5) + circuit.h(7) + circuit.h(8) + return circuit + +def inicializador2(circuit,total_qubits): + circuit.x(4) + circuit.x(5) + circuit.x(7) + return circuit + #circuit.x(8) +def contadorqubits(circuit,total_qubits): + qubits=total_qubits + bits=total_qubits-1 + contador=QuantumCircuit(qubits,bits) + #inicializador de qft + ''' + contador.h(0) + contador.cp(math.pi/2,0,1) + contador.cp(math.pi/2,0,2) + contador.h(1) + contador.cp(math.pi/8,0,3) + contador.cp(math.pi/2,1,2) + contador.cp(math.pi/4,1,4) + contador.h(3) + contador.cp(math.pi/2,2,3) + contador.swap(1,2) + contador.h(3) + contador.swap(0,3) + ''' + completo=QuantumCircuit(12,12) + completoprueba=QuantumCircuit(12,12) + qft=QFT(3) + #print(completo) + #print(qft) + #print(completo) + invqft=QFT(3,0,True,True) + completo_1=completo.compose(circuit) + #print(completo_1) + #print(qft) + completo_2=completo_1.compose(qft,qubits=[9,10,11]) + ctgate = TGate().control(1) + #inversion de qft + completo_2.append(ctgate, [4, 9]) + completo_2.cs(4,10) + completo_2.cz(4,11) + + completo_2.barrier() + completo_2.append(ctgate, [5, 9]) + completo_2.cs(5,10) + completo_2.cz(5,11) + + completo_2.barrier() + completo_2.append(ctgate, [7, 9]) + completo_2.cs(7,10) + completo_2.cz(7,11) + + completo_2.barrier() + completo_2.append(ctgate, [8, 9]) + completo_2.cs(8,10) + completo_2.cz(8,11) + + + + + + + + + + + #completo_2.ct(4,10) + #completo_2.ct(5,10) + #completo_2.ct(7,10) + #completo_2.ct(8,10) + completo_3=completo_2.compose(invqft,qubits=[9,10,11]) + completo_3.barrier() + #medicion(completo_3,0,8) + #print(completo_3) + return completo_3 +#coloca las todos los estados que tengo suma de 2 +def prob2(circuit): + completo=QuantumCircuit(14,14) + #print("soy compleot 2") + completo_1=completo.compose(circuit) + #print(completo_1) + completo_1.x(11) + completo_1.x(9) + completo_1.ccx(9,10,12) + completo_1.ccx(11,12,13) + #completo_1.h(13) + completo_1.z(13) # recordatorio z + completo_1.h(13) + #completo_1.x(9)#dudas + #print(completo_1) + + return completo_1 +''' +def oraculo(circuit): + completo=QuantumCircuit(16,16) + completo_1=completo.compose(circuit) + completo_1.barrier() + + #completo_1.h(13) + #completo_1.x(13) + completo_1.barrier() + completo_1.ccx(4,5,15) + completo_1.ccx(7,8,14) + completo_1.ccx(15,14,13) + completo_1.barrier() + completo_1.x(13) + completo_1.z(13) + completo_1.x(13) + completo_1.barrier() + completo_1.ccx(4,5,15) + completo_1.ccx(7,8,14) + completo_1.ccx(15,14,13) + + return completo_1 + ''' +# crea a grover +def instalargrover(circuit): + completo=QuantumCircuit(17,17) + completo_1=completo.compose(circuit) + #revertir compuerta + completo_1.barrier() + completo_1.ccx(9,10,12) + #completo_1.x(13) + #completo_1.h(13) + completo_1.h(range(4,6)) + completo_1.h(range(7,9)) + completo_1.x(range(4,6)) + completo_1.x(range(7,9)) + completo_1.barrier() + + completo_1.h(13) + completo_1.x(13) + completo_1.barrier() + completo_1.ccx(4,5,15) + completo_1.ccx(7,8,14) + completo_1.ccx(15,14,13) + completo_1.barrier() + completo_1.x(13) + completo_1.z(13) + completo_1.x(13) + completo_1.barrier() + completo_1.ccx(4,5,15) + completo_1.ccx(7,8,14) + completo_1.ccx(15,14,13) + + completo_1.barrier() + completo_1.x(range(4,6)) + completo_1.x(range(7,9)) + completo_1.h(range(4,6)) + completo_1.h(range(7,9)) + completo_1.x(13) + completo_1.h(13) + + return completo_1 +#la condicion que acepta solo a las dos casos 1100 y 1001 ambos casos tiene 1 en a y 0 en c +def ganador(circuit): + completo=QuantumCircuit(17,17) + completo_1=completo.compose(circuit) + completo_1.x(7) + completo_1.h(13) + completo_1.z(13) + completo_1.x(13) + completo_1.ccx(4,7,13) + + completo_1.z(13) + + return completo_1 +#crea las medicione qubtis con cbit +def medicion(circuit,inicio,fin,total_qubits=-1): + if total_qubits!=-1: + for i in range(total_qubits): + circuit.measure(i,i) + else: + for i in range(inicio,fin+1): + circuit.measure(i,i) + return circuit +''' +def arregloestados_not(circuit,total_qubits): + circuit.x(range(total_qubits)) + +def arregloestados_h(circuit,total_qubits): + circuit.h(range(total_qubits)) +''' +#crea una barrera +def separador(circuit): + circuit.barrier() + return circuit +#imprime el circuito +def impresion_circuito(circuit): + # print(circuit) + circuit.draw('mpl').show() + +def main(): + #inicializacion de parametros para qiskit + bits=qubits=9 + simulacion=Aer.get_backend('qasm_simulator') #crear una instancia de simulacion + simulacion2=BasicAer.get_backend('statevector_simulator') + circuit=QuantumCircuit(qubits,bits) #Crear un circuito con 9 qubits para el primer parametro y 9 bits para el segundo parametro + circuit=inicializador(circuit,total_qubits=qubits) + #inicializador2(circuit,total_qubits=qubits) + #arregloestados_h(circuit,total_qubits=qubits) + #arregloestados_not(circuit,total_qubits=qubits) + + circuit=separador(circuit) + + #medicion(circuit,4,5) + #medicion(circuit,7,8) + circuit_1=contadorqubits(circuit,3) + + + circuit2=prob2(circuit_1) # identifica los 2 + # separador(circuit2) + #print(circuit2) + #print(circuit2) + #print(circuit) + #circuit=medicion(circuit,0,0,9) + #print(circuit) + #circuit2=oraculo(circuit2) + circuit3=instalargrover(circuit2) #crea grover de 4 + circuit3.barrier() + + + + circuit3=ganador(circuit3) #busca solo las dos ultimas opciones 1100 y 1001 + circuit3.barrier() + + circuit3=instalargrover(circuit3) #aplifica las dos opciones de arriba + circuit3.barrier() + + circuit3=medicion(circuit3,4,8) + + impresion_circuito(circuit3) + #circuit3=medicion(circuit3,4,8) + #circuit3=medicion(circuit2,9,13) + job=execute(circuit3,simulacion,shot=1000) + #job2=execute(circuit3,simulacion2) + result=job.result() + #result2=job2.result() + #vector=result2.get_statevector(circuit3) + #print(vector) + counts=result.get_counts(circuit3) + # print(counts) + # plot_histogram(counts,sort='value_desc') + + + return 0 + +if __name__=='__main__': + main() +''' +circuit.h(0) +circuit.cx(0,1) +circuit.measure([0,1],[0,1]) +job=execute(circuit,simulacion,shot=1000) +result=job.result() +counts=result.get_counts(circuit) +print("\n Total count for 00 and 11 are: ",counts) +#circuit.draw() +print(circuit) +#circuit.draw(output='mpl') +''' \ No newline at end of file diff --git a/challenges/QuantumQuipu challenge/FeatureMapVariacional.ipynb b/challenges/QuantumQuipu challenge/FeatureMapVariacional.ipynb new file mode 100644 index 0000000..62018f0 --- /dev/null +++ b/challenges/QuantumQuipu challenge/FeatureMapVariacional.ipynb @@ -0,0 +1,383 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "63c81904-9cfe-49d3-ae18-84663fd538af", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 534 + }, + "id": "63c81904-9cfe-49d3-ae18-84663fd538af", + "outputId": "033dee57-fc0f-4dc1-b132-8decf2153253" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-1.00000000e+00 -9.00000000e-01 -8.00000000e-01 -7.00000000e-01\n", + " -6.00000000e-01 -5.00000000e-01 -4.00000000e-01 -3.00000000e-01\n", + " -2.00000000e-01 -1.00000000e-01 -2.22044605e-16 1.00000000e-01\n", + " 2.00000000e-01 3.00000000e-01 4.00000000e-01 5.00000000e-01\n", + " 6.00000000e-01 7.00000000e-01 8.00000000e-01 9.00000000e-01]\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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CuEGAABYhXADAACsQrgBAABWIdwAAACrEG4AAIBVCDcAAMAqhBsAAGAVwg0AALAK4QYAAFiFcAMAAKziWLg5cuSIxo4dK4/Ho4yMDE2cOFHHjx9v9Jxvv/1WU6ZMUZcuXdSxY0eNHDlSwWAwcvyTTz7RmDFjlJubq4suukj9+/fXY4895lQLAAAgATkWbsaOHauqqiqtXbtWq1at0t///ndNnjy50XPuvvtu/eUvf9HKlSv1t7/9TQcOHNAtt9wSOV5ZWamuXbvqueeeU1VVlX7/+9+rrKxMCxcudKoNAACQYFzGGNPSk27fvl1XXHGFNm7cqEGDBkmS1qxZoxtvvFH79u1TTk7OGeeEQiFlZWVpxYoVuvXWWyVJO3bsUP/+/eX3+zV48OCYjzVlyhRt375d69ati7u+cDgsr9erUCgkj8fTjA4BAEBri/f925ErN36/XxkZGZFgI0klJSVKSkrShg0bYp5TWVmpmpoalZSURPb169dPPXr0kN/vP+tjhUIhde7cueWKBwAACS3FiUkDgYC6du0a/UApKercubMCgcBZz0lLS1NGRkbU/uzs7LOe8/777+v555/XG2+80Wg91dXVqq6ujvwcDofj6AIAACSiJl25mTlzplwuV6Pbjh07nKo1ytatWzVixAjNmTNH119/faNj586dK6/XG9lyc3NbpUYAAND6mnTlZvr06Ro/fnyjY3r37i2fz6eDBw9G7a+trdWRI0fk8/linufz+XTq1CkdPXo06upNMBg845xt27apuLhYkydP1qxZs85Zd1lZmaZNmxb5ORwOE3AAALBUk8JNVlaWsrKyzjmuqKhIR48eVWVlpQYOHChJWrdunerr61VYWBjznIEDByo1NVUVFRUaOXKkJGnnzp3as2ePioqKIuOqqqp03XXXady4cfrDH/4QV91ut1tutzuusQAAILE5creUJN1www0KBoNavHixampqNGHCBA0aNEgrVqyQJO3fv1/FxcV69tlnVVBQIEn67W9/q9WrV2vZsmXyeDyaOnWqpNOfrZFO/1XUddddp9LSUs2fPz/yWMnJyXGFrgbcLQUAQOKJ9/3bkQ8US9Ly5ct1xx13qLi4WElJSRo5cqQef/zxyPGamhrt3LlTJ0+ejOx75JFHImOrq6tVWlqqJ554InL8xRdf1Ndff63nnntOzz33XGR/z5499cUX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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pennylane as qml\n", + "from pennylane import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Generamos nuestro dataset\n", + "\n", + "data = np.arange(-1,1,0.1)\n", + "print(data)\n", + "labels = np.ones(len(data))\n", + "labels[len(data)//4:-len(data)//4] *= -1\n", + "\n", + "plt.scatter(data, np.zeros(len(data)), color = \"blue\")\n", + "plt.scatter(data[:len(data)//4], np.zeros(len(data)//4), color = \"orange\")\n", + "plt.scatter(data[-len(data)//4:], np.zeros(len(data)//4), color = \"orange\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "8e71c3fa-3b0d-4a3a-9dfb-a2e3249ff658", + "metadata": { + "id": "8e71c3fa-3b0d-4a3a-9dfb-a2e3249ff658" + }, + "outputs": [], + "source": [ + "\n", + "# Entrenamiento estandar de una red neuronal cuántica\n", + "\n", + "def feature_map(x):\n", + " qml.Hadamard(wires = 0)\n", + " qml.RZ(x , wires = 0)\n", + "\n", + "def variational_block(params):\n", + " qml.U3(params[0], params[1], params[2], wires = 0)\n", + "\n", + "dev = qml.device(\"default.qubit\", wires = 1)\n", + "\n", + "@qml.qnode(dev)\n", + "def circuit(x, params):\n", + "\n", + " feature_map(x)\n", + " variational_block(params)\n", + "\n", + " return qml.expval(qml.PauliZ(0))\n", + "\n", + "\n", + "def error(data, labels, params):\n", + "\n", + " err = 0\n", + " for i in range(len(data)):\n", + " d = circuit(data[i], params)\n", + " err -= labels[i] * d\n", + "\n", + " return err / len(data)\n", + "\n", + "def accuracy(data, labels, params):\n", + "\n", + " n = 0\n", + " for i in range(len(data)):\n", + " if labels[i] == np.sign(circuit(data[i], params)):\n", + " n += 1\n", + "\n", + " return n / len(data)\n", + "\n", + "\n", + "def train(data, labels, error_function, params, stepsize = 0.1, epochs = 100, plot = True):\n", + " opt = qml.AdagradOptimizer(stepsize = stepsize)\n", + "\n", + " costs = []\n", + " for epoch in range(epochs):\n", + " params, cost = opt.step_and_cost(lambda params: error_function(data, labels, params), params)\n", + " costs.append(cost)\n", + "\n", + " if plot:\n", + " plt.plot(costs)\n", + "\n", + " return params\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "632f44b5-10c2-43a0-96e4-68b8349d9e17", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 502 + }, + "id": "632f44b5-10c2-43a0-96e4-68b8349d9e17", + "outputId": "97a51fb8-81aa-402b-8c7a-ec0c698aa65a" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/autograd/numpy/numpy_vjps.py:698: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " onp.add.at(A, idx, x)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.5\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "initial_params = np.random.rand(3, requires_grad = True)\n", + "#print(initial_params)\n", + "params = train(data, labels, error, initial_params)\n", + "print(accuracy(data, labels, params))" + ] + }, + { + "cell_type": "markdown", + "id": "b169fbd6-30bd-4f84-afb4-a5ab167a0a41", + "metadata": { + "id": "b169fbd6-30bd-4f84-afb4-a5ab167a0a41" + }, + "source": [ + "Recordemos que la formula del error para entrenar nuestro feature map F es:\n", + "\n", + "\n", + "$$\\text{Error} = -\\sum_i\\sum_j y_iy_j\\langle F(x_i)^{\\dagger}F(x_j)\\rangle$$\n", + "\n", + "Definiremos por tanto un feature map variacional y minimizaremos dicho error." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "2946efd0-869d-4569-a7db-dfcdffbcba87", + "metadata": { + "id": "2946efd0-869d-4569-a7db-dfcdffbcba87" + }, + "outputs": [], + "source": [ + "def feature_map(x, feature_param):\n", + " qml.Hadamard(wires = 0)\n", + " qml.RZ(x * feature_param, wires = 0)\n", + "\n", + "def feature_error(data, labels, feature_param):\n", + "\n", + " dev = qml.device(\"default.qubit\", wires = 1)\n", + " @qml.qnode(dev)\n", + " def circuit(x1, x2):\n", + " feature_map(x1, feature_param)\n", + " qml.adjoint(feature_map)(x2, feature_param)\n", + " return qml.probs(wires = 0)\n", + "\n", + " err = 0\n", + " for i in range(len(data)):\n", + " for j in range(i, len(data)):\n", + " d = circuit(data[i], data[j])\n", + " err -= labels[i] * labels[j] * d[0][0]\n", + " return err\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3a7d2a68-71b9-4e8a-bbe2-a40f95ac35d5", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 430 + }, + "id": "3a7d2a68-71b9-4e8a-bbe2-a40f95ac35d5", + "outputId": "2fd2d176-3119-464e-8d15-ce40d29e9525" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "initial_param = np.random.rand(1, requires_grad = True)\n", + "param = train(data, labels, feature_error, initial_param)\n", + "#param\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e932af5a-71ea-4ece-9992-dd1466af1951", + "metadata": { + "id": "e932af5a-71ea-4ece-9992-dd1466af1951" + }, + "outputs": [], + "source": [ + "def feature_map(x):\n", + " qml.Hadamard(wires = 0)\n", + " qml.RZ(x*3.1416 , wires = 0)\n", + "\n", + "def variational_block(params):\n", + " qml.U3(params[0], params[1], params[2], wires = 0)\n", + "\n", + "dev = qml.device(\"default.qubit\", wires = 1)\n", + "\n", + "@qml.qnode(dev)\n", + "def circuit(x, params):\n", + "\n", + " feature_map(x)\n", + " variational_block(params)\n", + "\n", + " return qml.expval(qml.PauliZ(0))\n", + "\n", + "\n", + "def error(data, labels, params):\n", + "\n", + " err = 0\n", + " for i in range(len(data)):\n", + " d = circuit(data[i], params)\n", + " err -= labels[i] * d\n", + "\n", + " return err / len(data)\n", + "\n", + "def accuracy(data, labels, params):\n", + "\n", + " n = 0\n", + " for i in range(len(data)):\n", + " if labels[i] == np.sign(circuit(data[i], params)):\n", + " n += 1\n", + "\n", + " return n / len(data)\n", + "\n", + "\n", + "def train(data, labels, error_function, params, stepsize = 0.1, epochs = 100, plot = True):\n", + " opt = qml.AdagradOptimizer(stepsize = stepsize)\n", + "\n", + " costs = []\n", + " for epoch in range(epochs):\n", + " params, cost = opt.step_and_cost(lambda params: error_function(data, labels, params), params)\n", + " costs.append(cost)\n", + "\n", + " if plot:\n", + " plt.plot(costs)\n", + "\n", + " return params" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "Ykhq74BeDmHP", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 447 + }, + "id": "Ykhq74BeDmHP", + "outputId": "eadd5384-1f14-4802-90b3-f189449f6040" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.0\n" + ] + }, + { + "data": { + "image/png": "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s2cPvvnmG2RmZmL27NnOGVRlZWWIjo529sicOHEC2dnZKCgoQElJCXbv3o0777wTfn5+SEtLAwBMnToVsbGxuOeee3DgwAHs2LEDTzzxBBYuXChZL01bBgX5QSYAdU02nK9tkrocIiKiPsGtz8HZsGEDoqOjkZycjLS0NEyZMgVvvPGGc7vFYkFxcTHq6x23b3x9ffH1118jLS0Nw4cPx29/+1sEBgZi9+7dzt4auVyObdu2QS6XIykpCXPmzMG9996L5cuXu/NUukylkCNc6weA43CIiIh6itueg9Ob9eRzcABgzpv52HXsPF64cyx+HTfI7b+PiIjIG/WK5+DQJZxJRURE1LMYcHpAy7NwTvFhf0RERD2CAacHsAeHiIioZzHg9IAhIY4enJPnHVPFiYiIyL0YcHpAy/uoahqtqKq3SFwNERGR92PA6QG+SjkGaHwBAKd4m4qIiMjtGHB6yKVxOBxoTERE5G4MOD3k0kwq9uAQERG5GwNOD4lkDw4REVGPYcDpIezBISIi6jkMOD2EY3CIiIh6DgNODxnc3INjrGtCdQOnihMREbkTA04PCVApEBKgAgCUsBeHiIjIrRhwetCQ5ttUHIdDRETkXgw4PajlNhXfSUVEROReDDg96FIPDm9RERERuRMDTg8aHMIeHCIiop7AgNODhnCqOBERUY9gwOlBg4MdPTiVNWbUN1klroaIiMh7MeD0II2/EkH+SgDsxSEiInInBpwexplURERE7seA08MGcyYVERGR2zHg9DD24BAREbkfA04Pa5lJdfI8Aw4REZG7MOD0sChdAADgx4paiKIocTVERETeiQGnh43UB0ImON4qfq7GLHU5REREXokBp4f5KuUY2vxE4yPlJomrISIi8k4MOBKIHqAGABSW10hcCRERkXdiwJFAbHPAKTKwB4eIiMgdGHAkEDMgEABQyFtUREREbsGAI4GY5h6c4+fq0GixSVwNERGR93FrwDEajUhPT4darYZWq8W8efNQW1vb5j4PPPAAoqKi4OfnB51Oh5kzZ6KoqMiljSAIVyybNm1y56l0K73aFxo/JWx2Eccq274eRERE1HluDTjp6ek4fPgwcnJysG3bNuzcuRPz589vc5+4uDisX78ehYWF2LFjB0RRxNSpU2GzufZ0rF+/HuXl5c7l9ttvd+OZdC9BEHibioiIyI0U7jpw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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "initial_params = np.random.rand(3, requires_grad = True)\n", + "#print(initial_params)\n", + "params = train(data, labels, error, initial_params)\n", + "print(accuracy(data, labels, params))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "rMGgWPfnDmz8", + "metadata": { + "id": "rMGgWPfnDmz8" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "PennyLane", + "language": "python", + "name": "pennylane" + }, + "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.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/challenges/QuantumQuipu challenge/clasificador.ipynb b/challenges/QuantumQuipu challenge/clasificador.ipynb new file mode 100644 index 0000000..082ec4b --- /dev/null +++ b/challenges/QuantumQuipu challenge/clasificador.ipynb @@ -0,0 +1,265 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 465 + }, + "id": "t1Hw2njgOBAM", + "outputId": "161cb288-77d1-44c4-ad11-db32223ed05e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.23, -0.88, -0.34, 0.12, 0.13, 0.56, -0.5, -0.4, 0.12, 0.23, 0.98, -0.12, -0.05, 0.91, 0.99, 0.78, 0.87, -0.03, 0.89, 0.97]\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import pennylane as qml\n", + "from pennylane import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Generamos nuestro dataset\n", + "\n", + "data = np.arange(-1,1,0.1)\n", + "data = [0.23,-0.88,-0.34,.12,.13,.56,-.5,-.4,.12,0.23,0.98,-0.12,-0.05,.91,.99,.78,.87,-.03,.89,0.97]\n", + "print(data)\n", + "labels = np.ones(len(data))\n", + "labels[len(data)//4:-len(data)//4] *= -1\n", + "\n", + "plt.scatter(data, np.zeros(len(data)), color = \"blue\")\n", + "plt.scatter(data[:len(data)//4], np.zeros(len(data)//4), color = \"orange\")\n", + "plt.scatter(data[-len(data)//4:], np.zeros(len(data)//4), color = \"orange\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "BKxHOZ3kZOFP" + }, + "outputs": [], + "source": [ + "# Entrenamiento estandar de una red neuronal cuántica\n", + "\n", + "def feature_map(x):\n", + " qml.Hadamard(wires = 0)\n", + " qml.RZ(x , wires = 0)\n", + " qml.Hadamard(wires = 1)\n", + " qml.RZ(x , wires = 1)\n", + "\n", + "def variational_block(params):\n", + " qml.U3(params[0], params[1], params[2], wires = 0)\n", + " qml.U3(params[0], params[1], params[2], wires = 1)\n", + "\n", + "dev = qml.device(\"default.qubit\", wires = 2)\n", + "\n", + "@qml.qnode(dev)\n", + "def circuit(x, params):\n", + " feature_map(x)\n", + " variational_block(params)\n", + " return qml.expval(qml.PauliZ(0)), qml.expval(qml.PauliZ(1))\n", + "\n", + "\n", + "def error(data, labels, params):\n", + " err = 0\n", + " for i in range(len(data)):\n", + " d0 = circuit(data[i], params)[0]\n", + " d1 = circuit(data[i], params)[1]\n", + " err -= (labels[i] * d0+labels[i] * d1)\n", + " return err / len(data)\n", + "\n", + "def accuracy(data, labels, params):\n", + " n = 0\n", + " for i in range(len(data)):\n", + " if labels[i] == np.sign(circuit(data[i], params)[0]):\n", + " n += 1\n", + " if labels[i] == np.sign(circuit(data[i], params)[1]):\n", + " n += 1\n", + " return n / len(data)\n", + "\n", + "\n", + "def train(data, labels, error_function, params, stepsize = 0.1, epochs = 100, plot = True):\n", + " opt = qml.AdagradOptimizer(stepsize = stepsize)\n", + "\n", + " costs = []\n", + " for epoch in range(epochs):\n", + " params, cost = opt.step_and_cost(lambda params: error_function(data, labels, params), params)\n", + " costs.append(cost)\n", + "\n", + " if plot:\n", + " plt.plot(costs)\n", + "\n", + " return params\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 502 + }, + "id": "yEJLs99lZbyP", + "outputId": "071e52df-953f-4615-dd7e-b4dd7c60d031" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\usuario\\AppData\\Roaming\\Python\\Python310\\site-packages\\autograd\\numpy\\numpy_vjps.py:698: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " onp.add.at(A, idx, x)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.0\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "initial_params = np.random.rand(3, requires_grad = True)\n", + "#print(initial_params)\n", + "params = train(data, labels, error, initial_params)\n", + "print(accuracy(data, labels, params))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "Kr1K-3oOZfbc" + }, + "outputs": [], + "source": [ + "def feature_map(x, feature_param):\n", + " qml.Hadamard(wires = 0)\n", + " qml.RZ(x * feature_param, wires = 0)\n", + "\n", + "def feature_error(data, labels, feature_param):\n", + "\n", + " dev = qml.device(\"default.qubit\", wires = 1)\n", + " @qml.qnode(dev)\n", + " def circuit(x1, x2):\n", + " feature_map(x1, feature_param)\n", + " qml.adjoint(feature_map)(x2, feature_param)\n", + " return qml.probs(wires = 0)\n", + "\n", + " err = 0\n", + " for i in range(len(data)):\n", + " for j in range(i, len(data)):\n", + " d = circuit(data[i], data[j])\n", + " err -= labels[i] * labels[j] * d[0][0]\n", + " return err\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 447 + }, + "id": "XUgMOfURZk3o", + "outputId": "cd82cf74-5b61-4ed5-b09a-e0a91844df4f" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([3.36422896], requires_grad=True)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "initial_param = np.random.rand(1, requires_grad = True)\n", + "param = train(data, labels, feature_error, initial_param)\n", + "param" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.10.4" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/challenges/QuantumQuipu challenge/variacionales_2_parametros.ipynb b/challenges/QuantumQuipu challenge/variacionales_2_parametros.ipynb new file mode 100644 index 0000000..63bffda --- /dev/null +++ b/challenges/QuantumQuipu challenge/variacionales_2_parametros.ipynb @@ -0,0 +1,287 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "g3C_f1o1x435", + "outputId": "73d7f58c-a1d7-41de-bd36-31c3e211fd63" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0.23, -0.88, -0.34, 0.12, 0.13, 0.56, -0.5, -0.4, 0.12, 0.23, 0.98, -0.12, -0.05, 0.91, 0.99, 0.78, 0.87, -0.03, 0.89, 0.97], [-1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1]]\n" + ] + } + ], + "source": [ + "import pennylane as qml\n", + "from pennylane import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Generamos nuestro dataset\n", + "\n", + "# data = [0.23,-0.88,-0.34,.12,.13,.56,-.5,-.4,.12,0.23,0.98,-0.12,-0.05,.91,.99,.78,.87,-.03,.89,0.97]\n", + "# data2 = [-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1]\n", + "data = [[0.23,-0.88,-0.34,0.12,0.13,0.56,-0.5,-0.4,0.12,0.23,0.98,-0.12,-0.05,0.91,0.99,0.78,0.87,-0.03,0.89,0.97],\n", + " [-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1]]\n", + "print(data)\n", + "labels = [-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,1,1,1,-1,1,1]\n", + "\n", + "\n", + "#plt.scatter(data, np.zeros(len(data)), color = \"blue\")\n", + "#plt.scatter(data[:len(data)//4], np.zeros(len(data)//4), color = \"orange\")\n", + "#plt.scatter(data[-len(data)//4:], np.zeros(len(data)//4), color = \"orange\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Cargar los datos" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data = np.genfromtxt(\"challenge_train.csv\", delimiter=\",\", skip_header=1)\n", + "datos = data[:,1:-1]\n", + "# labels = data[:,-1:]\n", + "print(datos.shape)\n", + "# print(labels.shape)\n", + "\n", + "print(len(datos))\n", + "print(len(datos[0]))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "id": "Uf08bQYJx8xo" + }, + "outputs": [], + "source": [ + "# Entrenamiento estandar de una red neuronal cuántica\n", + "\n", + "def feature_map(x, param, i):\n", + " print(i)\n", + " qml.Hadamard(wires = i)\n", + " qml.RZ(x*param , wires = i)\n", + "\n", + "def variational_block(params):\n", + " for i in range(len(params)-1):\n", + " for j in range(i+1,len(params)):\n", + " print(i,\"-\",j)\n", + " qml.CNOT(wires = [i,j])\n", + " \n", + "\n", + "\n", + "dev = qml.device(\"default.qubit\", wires = 2)\n", + "@qml.qnode(dev)\n", + "def circuit(x, params):\n", + " print(len(params)-1,\"x:\",x)\n", + " for dato in x:\n", + " print(dato)\n", + " # feature_map(dato,params[i],i)\n", + " # variational_block(params)\n", + " # return qml.expval(qml.PauliZ(len(params)-1))\n", + " return qml.expval(qml.Hermitian(x, wires = [0,1]))\n", + "\n", + "\n", + "def error(qnode, data, labels, params):\n", + " err = 0\n", + " for i,fila in enumerate(data):\n", + " print(i, \"-\", fila)\n", + " print(params)\n", + " d = qnode(fila, params)\n", + " err -= (labels[i] * d[0])\n", + " return err / len(data[0])\n", + "\n", + "def accuracy(qnode,data, labels, params):\n", + " n = 0\n", + " for i,fila in enumerate(data):\n", + " if labels[i] == np.sign(qnode(fila, params[i])[0]):\n", + " n += 1\n", + " if labels[i] == np.sign(qnode(fila, params[i])[1]):\n", + " n += 1\n", + " return n / (len(data[0])*2)\n", + "\n", + "\n", + "def train(data, labels, error_function, params, stepsize = 0.1, epochs = 100, plot = True):\n", + " print(len(data))\n", + " dev = qml.device(\"default.qubit\", wires = len(data))\n", + " qnode = qml.QNode(circuit, dev)\n", + " \n", + " opt = qml.AdagradOptimizer(stepsize = stepsize)\n", + "\n", + " costs = []\n", + " for epoch in range(epochs):\n", + " params, cost = opt.step_and_cost(lambda params: error_function(qnode,data, labels, params), params)\n", + " costs.append(cost)\n", + "\n", + " if plot:\n", + " plt.plot(costs)\n", + "\n", + " return params" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 447 + }, + "id": "wpKFxT9WyAbg", + "outputId": "44833c73-f69e-4c4c-a396-30199902b536" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.53293653]\n", + "2\n", + "0 - [0.23, -0.88, -0.34, 0.12, 0.13, 0.56, -0.5, -0.4, 0.12, 0.23, 0.98, -0.12, -0.05, 0.91, 0.99, 0.78, 0.87, -0.03, 0.89, 0.97]\n", + "Autograd ArrayBox with value [0.53293653]\n", + "0 x: [0.23, -0.88, -0.34, 0.12, 0.13, 0.56, -0.5, -0.4, 0.12, 0.23, 0.98, -0.12, -0.05, 0.91, 0.99, 0.78, 0.87, -0.03, 0.89, 0.97]\n", + "0.23\n", + "-0.88\n", + "-0.34\n", + "0.12\n", + "0.13\n", + "0.56\n", + "-0.5\n", + "-0.4\n", + "0.12\n", + "0.23\n", + "0.98\n", + "-0.12\n", + "-0.05\n", + "0.91\n", + "0.99\n", + "0.78\n", + "0.87\n", + "-0.03\n", + "0.89\n", + "0.97\n" + ] + }, + { + "ename": "ValueError", + "evalue": "Observable must be a square matrix.", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\Users\\usuario\\Documents\\Yessi\\EscuelaCuanticaEspañol\\escuela-de-computacion-cuantica-2023\\challenges\\QuantumQuipu challenge\\variacionales_2_parametros.ipynb Cell 5\u001b[0m line \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m initial_params \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39mrandom\u001b[39m.\u001b[39mrand(\u001b[39mlen\u001b[39m(data)\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m, requires_grad \u001b[39m=\u001b[39m \u001b[39mTrue\u001b[39;00m)\n\u001b[0;32m 2\u001b[0m \u001b[39mprint\u001b[39m(initial_params)\n\u001b[1;32m----> 3\u001b[0m params \u001b[39m=\u001b[39m train(data, labels, error, initial_params)\n\u001b[0;32m 4\u001b[0m \u001b[39mprint\u001b[39m(accuracy(data, labels, params))\n", + "\u001b[1;32mc:\\Users\\usuario\\Documents\\Yessi\\EscuelaCuanticaEspañol\\escuela-de-computacion-cuantica-2023\\challenges\\QuantumQuipu challenge\\variacionales_2_parametros.ipynb Cell 5\u001b[0m line \u001b[0;36mtrain\u001b[1;34m(data, labels, error_function, params, stepsize, epochs, plot)\u001b[0m\n\u001b[0;32m 54\u001b[0m costs \u001b[39m=\u001b[39m []\n\u001b[0;32m 55\u001b[0m \u001b[39mfor\u001b[39;00m epoch \u001b[39min\u001b[39;00m \u001b[39mrange\u001b[39m(epochs):\n\u001b[1;32m---> 56\u001b[0m params, cost \u001b[39m=\u001b[39m opt\u001b[39m.\u001b[39;49mstep_and_cost(\u001b[39mlambda\u001b[39;49;00m params: error_function(qnode,data, labels, params), params)\n\u001b[0;32m 57\u001b[0m costs\u001b[39m.\u001b[39mappend(cost)\n\u001b[0;32m 59\u001b[0m \u001b[39mif\u001b[39;00m plot:\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\pennylane\\optimize\\gradient_descent.py:59\u001b[0m, in \u001b[0;36mGradientDescentOptimizer.step_and_cost\u001b[1;34m(self, objective_fn, grad_fn, *args, **kwargs)\u001b[0m\n\u001b[0;32m 39\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mstep_and_cost\u001b[39m(\u001b[39mself\u001b[39m, objective_fn, \u001b[39m*\u001b[39margs, grad_fn\u001b[39m=\u001b[39m\u001b[39mNone\u001b[39;00m, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m 40\u001b[0m \u001b[39m\"\"\"Update trainable arguments with one step of the optimizer and return the corresponding\u001b[39;00m\n\u001b[0;32m 41\u001b[0m \u001b[39m objective function value prior to the step.\u001b[39;00m\n\u001b[0;32m 42\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 56\u001b[0m \u001b[39m If single arg is provided, list [array] is replaced by array.\u001b[39;00m\n\u001b[0;32m 57\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m---> 59\u001b[0m g, forward \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mcompute_grad(objective_fn, args, kwargs, grad_fn\u001b[39m=\u001b[39;49mgrad_fn)\n\u001b[0;32m 60\u001b[0m new_args \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mapply_grad(g, args)\n\u001b[0;32m 62\u001b[0m \u001b[39mif\u001b[39;00m forward \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\pennylane\\optimize\\gradient_descent.py:117\u001b[0m, in \u001b[0;36mGradientDescentOptimizer.compute_grad\u001b[1;34m(objective_fn, args, kwargs, grad_fn)\u001b[0m\n\u001b[0;32m 99\u001b[0m \u001b[39mr\u001b[39m\u001b[39m\"\"\"Compute gradient of the objective function at the given point and return it along with\u001b[39;00m\n\u001b[0;32m 100\u001b[0m \u001b[39mthe objective function forward pass (if available).\u001b[39;00m\n\u001b[0;32m 101\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 114\u001b[0m \u001b[39m will not be evaluted and instead ``None`` will be returned.\u001b[39;00m\n\u001b[0;32m 115\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[0;32m 116\u001b[0m g \u001b[39m=\u001b[39m get_gradient(objective_fn) \u001b[39mif\u001b[39;00m grad_fn \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39melse\u001b[39;00m grad_fn\n\u001b[1;32m--> 117\u001b[0m grad \u001b[39m=\u001b[39m g(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n\u001b[0;32m 118\u001b[0m forward \u001b[39m=\u001b[39m \u001b[39mgetattr\u001b[39m(g, \u001b[39m\"\u001b[39m\u001b[39mforward\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39mNone\u001b[39;00m)\n\u001b[0;32m 120\u001b[0m num_trainable_args \u001b[39m=\u001b[39m \u001b[39msum\u001b[39m(\u001b[39mgetattr\u001b[39m(arg, \u001b[39m\"\u001b[39m\u001b[39mrequires_grad\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39mFalse\u001b[39;00m) \u001b[39mfor\u001b[39;00m arg \u001b[39min\u001b[39;00m args)\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\pennylane\\_grad.py:118\u001b[0m, in \u001b[0;36mgrad.__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 115\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_fun(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n\u001b[0;32m 116\u001b[0m \u001b[39mreturn\u001b[39;00m ()\n\u001b[1;32m--> 118\u001b[0m grad_value, ans \u001b[39m=\u001b[39m grad_fn(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs) \u001b[39m# pylint: disable=not-callable\u001b[39;00m\n\u001b[0;32m 119\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward \u001b[39m=\u001b[39m ans\n\u001b[0;32m 121\u001b[0m \u001b[39mreturn\u001b[39;00m grad_value\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\autograd\\wrap_util.py:20\u001b[0m, in \u001b[0;36munary_to_nary..nary_operator..nary_f\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m 19\u001b[0m x \u001b[39m=\u001b[39m \u001b[39mtuple\u001b[39m(args[i] \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m argnum)\n\u001b[1;32m---> 20\u001b[0m \u001b[39mreturn\u001b[39;00m unary_operator(unary_f, x, \u001b[39m*\u001b[39mnary_op_args, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mnary_op_kwargs)\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\pennylane\\_grad.py:136\u001b[0m, in \u001b[0;36mgrad._grad_with_forward\u001b[1;34m(fun, x)\u001b[0m\n\u001b[0;32m 130\u001b[0m \u001b[39m@staticmethod\u001b[39m\n\u001b[0;32m 131\u001b[0m \u001b[39m@unary_to_nary\u001b[39m\n\u001b[0;32m 132\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_grad_with_forward\u001b[39m(fun, x):\n\u001b[0;32m 133\u001b[0m \u001b[39m\"\"\"This function is a replica of ``autograd.grad``, with the only\u001b[39;00m\n\u001b[0;32m 134\u001b[0m \u001b[39m difference being that it returns both the gradient *and* the forward pass\u001b[39;00m\n\u001b[0;32m 135\u001b[0m \u001b[39m value.\"\"\"\u001b[39;00m\n\u001b[1;32m--> 136\u001b[0m vjp, ans \u001b[39m=\u001b[39m _make_vjp(fun, x)\n\u001b[0;32m 138\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m vspace(ans)\u001b[39m.\u001b[39msize \u001b[39m==\u001b[39m \u001b[39m1\u001b[39m:\n\u001b[0;32m 139\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mTypeError\u001b[39;00m(\n\u001b[0;32m 140\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mGrad only applies to real scalar-output functions. \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 141\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mTry jacobian, elementwise_grad or holomorphic_grad.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 142\u001b[0m )\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\autograd\\core.py:10\u001b[0m, in \u001b[0;36mmake_vjp\u001b[1;34m(fun, x)\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mmake_vjp\u001b[39m(fun, x):\n\u001b[0;32m 9\u001b[0m start_node \u001b[39m=\u001b[39m VJPNode\u001b[39m.\u001b[39mnew_root()\n\u001b[1;32m---> 10\u001b[0m end_value, end_node \u001b[39m=\u001b[39m trace(start_node, fun, x)\n\u001b[0;32m 11\u001b[0m \u001b[39mif\u001b[39;00m end_node \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m 12\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mvjp\u001b[39m(g): \u001b[39mreturn\u001b[39;00m vspace(x)\u001b[39m.\u001b[39mzeros()\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\autograd\\tracer.py:10\u001b[0m, in \u001b[0;36mtrace\u001b[1;34m(start_node, fun, x)\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[39mwith\u001b[39;00m trace_stack\u001b[39m.\u001b[39mnew_trace() \u001b[39mas\u001b[39;00m t:\n\u001b[0;32m 9\u001b[0m start_box \u001b[39m=\u001b[39m new_box(x, t, start_node)\n\u001b[1;32m---> 10\u001b[0m end_box \u001b[39m=\u001b[39m fun(start_box)\n\u001b[0;32m 11\u001b[0m \u001b[39mif\u001b[39;00m isbox(end_box) \u001b[39mand\u001b[39;00m end_box\u001b[39m.\u001b[39m_trace \u001b[39m==\u001b[39m start_box\u001b[39m.\u001b[39m_trace:\n\u001b[0;32m 12\u001b[0m \u001b[39mreturn\u001b[39;00m end_box\u001b[39m.\u001b[39m_value, end_box\u001b[39m.\u001b[39m_node\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\autograd\\wrap_util.py:15\u001b[0m, in \u001b[0;36munary_to_nary..nary_operator..nary_f..unary_f\u001b[1;34m(x)\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m 14\u001b[0m subargs \u001b[39m=\u001b[39m subvals(args, \u001b[39mzip\u001b[39m(argnum, x))\n\u001b[1;32m---> 15\u001b[0m \u001b[39mreturn\u001b[39;00m fun(\u001b[39m*\u001b[39msubargs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n", + "\u001b[1;32mc:\\Users\\usuario\\Documents\\Yessi\\EscuelaCuanticaEspañol\\escuela-de-computacion-cuantica-2023\\challenges\\QuantumQuipu challenge\\variacionales_2_parametros.ipynb Cell 5\u001b[0m line \u001b[0;36mtrain..\u001b[1;34m(params)\u001b[0m\n\u001b[0;32m 54\u001b[0m costs \u001b[39m=\u001b[39m []\n\u001b[0;32m 55\u001b[0m \u001b[39mfor\u001b[39;00m epoch \u001b[39min\u001b[39;00m \u001b[39mrange\u001b[39m(epochs):\n\u001b[1;32m---> 56\u001b[0m params, cost \u001b[39m=\u001b[39m opt\u001b[39m.\u001b[39mstep_and_cost(\u001b[39mlambda\u001b[39;00m params: error_function(qnode,data, labels, params), params)\n\u001b[0;32m 57\u001b[0m costs\u001b[39m.\u001b[39mappend(cost)\n\u001b[0;32m 59\u001b[0m \u001b[39mif\u001b[39;00m plot:\n", + "\u001b[1;32mc:\\Users\\usuario\\Documents\\Yessi\\EscuelaCuanticaEspañol\\escuela-de-computacion-cuantica-2023\\challenges\\QuantumQuipu challenge\\variacionales_2_parametros.ipynb Cell 5\u001b[0m line \u001b[0;36merror\u001b[1;34m(qnode, data, labels, params)\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[39mprint\u001b[39m(i, \u001b[39m\"\u001b[39m\u001b[39m-\u001b[39m\u001b[39m\"\u001b[39m, fila)\n\u001b[0;32m 32\u001b[0m \u001b[39mprint\u001b[39m(params)\n\u001b[1;32m---> 33\u001b[0m d \u001b[39m=\u001b[39m circuit(fila, params)\n\u001b[0;32m 34\u001b[0m err \u001b[39m-\u001b[39m\u001b[39m=\u001b[39m (labels[i] \u001b[39m*\u001b[39m d[\u001b[39m0\u001b[39m])\n\u001b[0;32m 35\u001b[0m \u001b[39mreturn\u001b[39;00m err \u001b[39m/\u001b[39m \u001b[39mlen\u001b[39m(data[\u001b[39m0\u001b[39m])\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\pennylane\\qnode.py:970\u001b[0m, in \u001b[0;36mQNode.__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 967\u001b[0m kwargs[\u001b[39m\"\u001b[39m\u001b[39mshots\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m=\u001b[39m _get_device_shots(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_original_device)\n\u001b[0;32m 969\u001b[0m \u001b[39m# construct the tape\u001b[39;00m\n\u001b[1;32m--> 970\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mconstruct(args, kwargs)\n\u001b[0;32m 972\u001b[0m cache \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mexecute_kwargs\u001b[39m.\u001b[39mget(\u001b[39m\"\u001b[39m\u001b[39mcache\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39mFalse\u001b[39;00m)\n\u001b[0;32m 973\u001b[0m using_custom_cache \u001b[39m=\u001b[39m (\n\u001b[0;32m 974\u001b[0m \u001b[39mhasattr\u001b[39m(cache, \u001b[39m\"\u001b[39m\u001b[39m__getitem__\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 975\u001b[0m \u001b[39mand\u001b[39;00m \u001b[39mhasattr\u001b[39m(cache, \u001b[39m\"\u001b[39m\u001b[39m__setitem__\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 976\u001b[0m \u001b[39mand\u001b[39;00m \u001b[39mhasattr\u001b[39m(cache, \u001b[39m\"\u001b[39m\u001b[39m__delitem__\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 977\u001b[0m )\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\pennylane\\qnode.py:856\u001b[0m, in \u001b[0;36mQNode.construct\u001b[1;34m(self, args, kwargs)\u001b[0m\n\u001b[0;32m 853\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39minterface \u001b[39m=\u001b[39m qml\u001b[39m.\u001b[39mmath\u001b[39m.\u001b[39mget_interface(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39mlist\u001b[39m(kwargs\u001b[39m.\u001b[39mvalues()))\n\u001b[0;32m 855\u001b[0m \u001b[39mwith\u001b[39;00m qml\u001b[39m.\u001b[39mqueuing\u001b[39m.\u001b[39mAnnotatedQueue() \u001b[39mas\u001b[39;00m q:\n\u001b[1;32m--> 856\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_qfunc_output \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mfunc(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n\u001b[0;32m 858\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_tape \u001b[39m=\u001b[39m QuantumScript\u001b[39m.\u001b[39mfrom_queue(q, shots)\n\u001b[0;32m 860\u001b[0m params \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtape\u001b[39m.\u001b[39mget_parameters(trainable_only\u001b[39m=\u001b[39m\u001b[39mFalse\u001b[39;00m)\n", + "\u001b[1;32mc:\\Users\\usuario\\Documents\\Yessi\\EscuelaCuanticaEspañol\\escuela-de-computacion-cuantica-2023\\challenges\\QuantumQuipu challenge\\variacionales_2_parametros.ipynb Cell 5\u001b[0m line \u001b[0;36mcircuit\u001b[1;34m(x, params)\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[39mprint\u001b[39m(dato)\n\u001b[0;32m 22\u001b[0m \u001b[39m# feature_map(dato,params[i],i)\u001b[39;00m\n\u001b[0;32m 23\u001b[0m \u001b[39m# variational_block(params)\u001b[39;00m\n\u001b[0;32m 24\u001b[0m \u001b[39m# return qml.expval(qml.PauliZ(len(params)-1))\u001b[39;00m\n\u001b[1;32m---> 25\u001b[0m \u001b[39mreturn\u001b[39;00m qml\u001b[39m.\u001b[39mexpval(qml\u001b[39m.\u001b[39;49mHermitian(x, wires \u001b[39m=\u001b[39;49m [\u001b[39m0\u001b[39;49m,\u001b[39m1\u001b[39;49m]))\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\pennylane\\ops\\qubit\\observables.py:80\u001b[0m, in \u001b[0;36mHermitian.__init__\u001b[1;34m(self, A, wires, id)\u001b[0m\n\u001b[0;32m 76\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m 77\u001b[0m \u001b[39m# Assumably wires is an int; further validation checks are performed by calling super().__init__\u001b[39;00m\n\u001b[0;32m 78\u001b[0m expected_mx_shape \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_num_basis_states\n\u001b[1;32m---> 80\u001b[0m Hermitian\u001b[39m.\u001b[39;49m_validate_input(A, expected_mx_shape)\n\u001b[0;32m 82\u001b[0m \u001b[39msuper\u001b[39m()\u001b[39m.\u001b[39m\u001b[39m__init__\u001b[39m(A, wires\u001b[39m=\u001b[39mwires, \u001b[39mid\u001b[39m\u001b[39m=\u001b[39m\u001b[39mid\u001b[39m)\n", + "File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python310\\site-packages\\pennylane\\ops\\qubit\\observables.py:88\u001b[0m, in \u001b[0;36mHermitian._validate_input\u001b[1;34m(A, expected_mx_shape)\u001b[0m\n\u001b[0;32m 86\u001b[0m \u001b[39m\"\"\"Validate the input matrix.\"\"\"\u001b[39;00m\n\u001b[0;32m 87\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mlen\u001b[39m(A\u001b[39m.\u001b[39mshape) \u001b[39m!=\u001b[39m \u001b[39m2\u001b[39m \u001b[39mor\u001b[39;00m A\u001b[39m.\u001b[39mshape[\u001b[39m0\u001b[39m] \u001b[39m!=\u001b[39m A\u001b[39m.\u001b[39mshape[\u001b[39m1\u001b[39m]:\n\u001b[1;32m---> 88\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\u001b[39m\"\u001b[39m\u001b[39mObservable must be a square matrix.\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 90\u001b[0m \u001b[39mif\u001b[39;00m expected_mx_shape \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39mand\u001b[39;00m A\u001b[39m.\u001b[39mshape[\u001b[39m0\u001b[39m] \u001b[39m!=\u001b[39m expected_mx_shape:\n\u001b[0;32m 91\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\n\u001b[0;32m 92\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mExpected input matrix to have shape \u001b[39m\u001b[39m{\u001b[39;00mexpected_mx_shape\u001b[39m}\u001b[39;00m\u001b[39mx\u001b[39m\u001b[39m{\u001b[39;00mexpected_mx_shape\u001b[39m}\u001b[39;00m\u001b[39m, but \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 93\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39ma matrix with shape \u001b[39m\u001b[39m{\u001b[39;00mA\u001b[39m.\u001b[39mshape[\u001b[39m0\u001b[39m]\u001b[39m}\u001b[39;00m\u001b[39mx\u001b[39m\u001b[39m{\u001b[39;00mA\u001b[39m.\u001b[39mshape[\u001b[39m0\u001b[39m]\u001b[39m}\u001b[39;00m\u001b[39m was passed.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 94\u001b[0m )\n", + "\u001b[1;31mValueError\u001b[0m: Observable must be a square matrix." + ] + } + ], + "source": [ + "initial_params = np.random.rand(len(data)-1, requires_grad = True)\n", + "print(initial_params)\n", + "params = train(data, labels, error, initial_params)\n", + "print(accuracy(data, labels, params))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "p187sShLyCxQ" + }, + "outputs": [], + "source": [ + "def feature_map(x, feature_param):\n", + " qml.Hadamard(wires = 0)\n", + " qml.RZ(x * feature_param, wires = 0)\n", + "\n", + "def feature_error(data, labels, feature_param):\n", + "\n", + " dev = qml.device(\"default.qubit\", wires = 1)\n", + " @qml.qnode(dev)\n", + " def circuit(x1, x2):\n", + " feature_map(x1, feature_param)\n", + " qml.adjoint(feature_map)(x2, feature_param)\n", + " return qml.probs(wires = 0)\n", + "\n", + " err = 0\n", + " for i in range(len(data)):\n", + " for j in range(i, len(data)):\n", + " d = circuit(data[i], data[j])\n", + " err -= labels[i] * labels[j] * d[0][0]\n", + " return err\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "initial_param = np.random.rand(1, requires_grad = True)\n", + "param = train(data, labels, feature_error, initial_param)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(accuracy(data, labels, params))" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.10.4" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/challenges/openqaoa challenge/README.md b/challenges/openqaoa challenge/README.md new file mode 100644 index 0000000..26cf843 --- /dev/null +++ b/challenges/openqaoa challenge/README.md @@ -0,0 +1,8 @@ +Equipo: Qutips + +Integrantes: +Areli Yesareth Guerrero Estrada +Janeth De Anda Gil +Miguel Alejandro Medina Armendariz +Edgar Omar Mendoza Lopez + diff --git a/challenges/openqaoa challenge/challenge-openqaoa.ipynb b/challenges/openqaoa challenge/challenge-openqaoa.ipynb index 5bfead4..ca96083 100644 --- a/challenges/openqaoa challenge/challenge-openqaoa.ipynb +++ b/challenges/openqaoa challenge/challenge-openqaoa.ipynb @@ -53,7 +53,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -87,56 +87,195 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "# inputs\n", + "values = [2,6,8,7,3,4,6]\n", + "weights = [7,3,3,5,4,7,5]\n", + "max_weight = 25\n", "\n", "\n", - "def Problem(values,weights, max_weight):\n", + "def Problem(values, weights, max_weight):\n", " \n", " # initialize a model\n", - "\n", + " mdl = Model(name=\"Knaspack\")\n", " # indicate the binary variables \n", - "\n", + " x = {i: mdl.binary_var(name=f\"x_{i}\") for i in range(len(values))} \n", " # define the objective function\n", - "\n", + " mdl.minimize(mdl.sum(values[i] * x[i] for i in x)) \n", " # add the constraints\n", - " return #return model, check FromDocplex2IsingModel" + " mdl.add_constraint(mdl.sum(weights[i] * x[i] for i in x) <= max_weight)\n", + " return FromDocplex2IsingModel(mdl) #return model, check FromDocplex2IsingModel" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "// This file has been generated by DOcplex\n", + "// model name is: Binpacking\n", + "// var contrainer section\n", + "dvar bool slack_C0[5];\n", + "\n", + "// single vars section\n", + "dvar bool x_0;\n", + "dvar bool x_1;\n", + "dvar bool x_2;\n", + "dvar bool x_3;\n", + "dvar bool x_4;\n", + "dvar bool x_5;\n", + "dvar bool x_6;\n", + "dvar bool slack_C0_0;\n", + "dvar bool slack_C0_1;\n", + "dvar bool slack_C0_2;\n", + "dvar bool slack_C0_3;\n", + "dvar bool slack_C0_4;\n", + "\n", + "minimize\n", + " - 12948 x_0 - 5544 x_1 - 5542 x_2 - 9243 x_3 - 7397 x_4 - 12946 x_5\n", + " - 9244 x_6 - 1850 slack_C0_0 - 3700 slack_C0_1 - 7400 slack_C0_2\n", + " - 14800 slack_C0_3 - 18500 slack_C0_4 [ 1813 x_0^2 + 1554 x_0*x_1\n", + " + 1554 x_0*x_2 + 2590 x_0*x_3 + 2072 x_0*x_4 + 3626 x_0*x_5 + 2590 x_0*x_6\n", + " + 518 x_0*slack_C0_0 + 1036 x_0*slack_C0_1 + 2072 x_0*slack_C0_2\n", + " + 4144 x_0*slack_C0_3 + 5180 x_0*slack_C0_4 + 333 x_1^2 + 666 x_1*x_2\n", + " + 1110 x_1*x_3 + 888 x_1*x_4 + 1554 x_1*x_5 + 1110 x_1*x_6\n", + " + 222 x_1*slack_C0_0 + 444 x_1*slack_C0_1 + 888 x_1*slack_C0_2\n", + " + 1776 x_1*slack_C0_3 + 2220 x_1*slack_C0_4 + 333 x_2^2 + 1110 x_2*x_3\n", + " + 888 x_2*x_4 + 1554 x_2*x_5 + 1110 x_2*x_6 + 222 x_2*slack_C0_0\n", + " + 444 x_2*slack_C0_1 + 888 x_2*slack_C0_2 + 1776 x_2*slack_C0_3\n", + " + 2220 x_2*slack_C0_4 + 925 x_3^2 + 1480 x_3*x_4 + 2590 x_3*x_5\n", + " + 1850 x_3*x_6 + 370 x_3*slack_C0_0 + 740 x_3*slack_C0_1\n", + " + 1480 x_3*slack_C0_2 + 2960 x_3*slack_C0_3 + 3700 x_3*slack_C0_4 + 592 x_4^2\n", + " + 2072 x_4*x_5 + 1480 x_4*x_6 + 296 x_4*slack_C0_0 + 592 x_4*slack_C0_1\n", + " + 1184 x_4*slack_C0_2 + 2368 x_4*slack_C0_3 + 2960 x_4*slack_C0_4\n", + " + 1813 x_5^2 + 2590 x_5*x_6 + 518 x_5*slack_C0_0 + 1036 x_5*slack_C0_1\n", + " + 2072 x_5*slack_C0_2 + 4144 x_5*slack_C0_3 + 5180 x_5*slack_C0_4 + 925 x_6^2\n", + " + 370 x_6*slack_C0_0 + 740 x_6*slack_C0_1 + 1480 x_6*slack_C0_2\n", + " + 2960 x_6*slack_C0_3 + 3700 x_6*slack_C0_4 + 37 slack_C0_0^2\n", + " + 148 slack_C0_0*slack_C0_1 + 296 slack_C0_0*slack_C0_2\n", + " + 592 slack_C0_0*slack_C0_3 + 740 slack_C0_0*slack_C0_4 + 148 slack_C0_1^2\n", + " + 592 slack_C0_1*slack_C0_2 + 1184 slack_C0_1*slack_C0_3\n", + " + 1480 slack_C0_1*slack_C0_4 + 592 slack_C0_2^2 + 2368 slack_C0_2*slack_C0_3\n", + " + 2960 slack_C0_2*slack_C0_4 + 2368 slack_C0_3^2 + 5920 slack_C0_3*slack_C0_4\n", + " + 3700 slack_C0_4^2 ] + 23125;\n", + " \n", + "subject to {\n", + "\n", + "}\n" + ] + } + ], "source": [ "problem = Problem(values, weights, max_weight)\n", "\n", "# Ising encoding of the QUBO problem for binpacking problem\n", - "\n", + "qubo = problem.ising_model\n", "\n", "# Docplex encoding of the QUBO problem for binpacking problem\n", + "mdl_qubo_docplex = problem.qubo_docplex\n", "\n", - "\n", - "mdl_qubo_docplex.prettyprint()" + "mdl_qubo_docplex.prettyprint()\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
solutions_bitstringsbitstrings_energiesprobabilities
000011110.00.012695
101001114.00.005859
200101117.00.007812
310001117.00.000977
4110101111.00.004883
\n", + "
" + ], + "text/plain": [ + " solutions_bitstrings bitstrings_energies probabilities\n", + "0 0001111 0.0 0.012695\n", + "1 0100111 4.0 0.005859\n", + "2 0010111 7.0 0.007812\n", + "3 1000111 7.0 0.000977\n", + "4 1101011 11.0 0.004883" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Initialize the QAOA object\n", "qaoa = QAOA()\n", "\n", + "qiskit_device = create_device(location='local', name='qiskit.qasm_simulator')\n", + "qaoa.set_device(qiskit_device)\n", + "\n", "# Set the parameters to use the QAOA algorithm\n", "# where n_shots=1024 and seed_simulator=1\n", - "\n", - "\n", + "qaoa.set_backend_properties(n_shots=1024, seed_simulator=1)\n", "# p=1, a custom type and range from 0 to pi\n", + "qaoa.set_circuit_properties(p=1, param_type='standard', init_type='ramp', mixer_hamiltonian='xy')\n", "\n", "qaoa.compile(qubo)\n", "\n", @@ -148,13 +287,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(0.0, ['0001111'])\n" + ] + } + ], "source": [ "# To find the correct answer using ground_state_hamiltonian\n", "# and the parameter is a cost_hamiltonian\n", - "correct_solution = " + "correct_solution = ground_state_hamiltonian(qaoa.cost_hamil)\n", + "print(correct_solution)" ] }, { @@ -166,9 +314,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "objective: 0.000\n", + "status: OPTIMAL_SOLUTION(2)\n", + " x_0=0\n", + " x_1=0\n", + " x_2=0\n", + " slack_C0_0=1\n", + " slack_C0_1=1\n", + " slack_C0_2=1\n", + " slack_C0_3=1\n" + ] + } + ], "source": [ "## docplex solution\n", "sol = mdl_qubo_docplex.solve()\n", @@ -186,69 +350,124 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "## Implementation\n", + "def funcionesQAOA(device,tipo,ham):\n", + " qaoa = QAOA()\n", + " qaoa.set_device(device)\n", "\n", - "# Initialize the QAOA object and use a device\n", - "device = create_device(\"local\", 'qiskit.qasm_simulator')\n", - "qaoa.set\n", - "\n", - "qaoa = QAOA()\n", - "\n", - "# Set the parameters to work the QAOA algorithm\n", - "# play with the parameters values\n", + " # Set the parameters to use the QAOA algorithm\n", + " qaoa.set_backend_properties(n_shots=1024, seed_simulator=1)\n", + " qaoa.set_circuit_properties(p=1, param_type='standard', init_type=tipo, mixer_hamiltonian=ham)\n", "\n", + " qaoa.compile(qubo)\n", "\n", - "# Run the QAOA algorithm\n", - "qaoa.optimize()\n", - "\n", - "pd.DataFrame(qaoa.result.lowest_cost_bitstrings(5))" + " # Run the QAOA algorithm\n", + " qaoa.optimize()\n", + " return qaoa.result\n" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 33, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dispositivo: qiskit.statevector_simulator Tipo: rand Mixer: xy\n", + " solutions_bitstrings bitstrings_energies probabilities\n", + "0 000000011111 0.0 0.000552\n", + "1 100000000011 2.0 0.000032\n", + "2 000010011011 3.0 0.000177\n", + "3 000001000011 4.0 0.000184\n", + "4 100010000101 5.0 0.000067\n", + "Dispositivo: qiskit.statevector_simulator Tipo: rand Mixer: x\n", + " solutions_bitstrings bitstrings_energies probabilities\n", + "0 000000011111 0.0 0.000767\n", + "1 100000000011 2.0 0.000077\n", + "2 000010011011 3.0 0.000257\n", + "3 000001000011 4.0 0.000006\n", + "4 100010000101 5.0 0.000024\n", + "Dispositivo: qiskit.statevector_simulator Tipo: ramp Mixer: xy\n", + " solutions_bitstrings bitstrings_energies probabilities\n", + "0 000000011111 0.0 0.000006\n", + "1 100000000011 2.0 0.000118\n", + "2 000010011011 3.0 0.000236\n", + "3 000001000011 4.0 0.000346\n", + "4 100010000101 5.0 0.000110\n", + "Dispositivo: qiskit.statevector_simulator Tipo: ramp Mixer: x\n", + " solutions_bitstrings bitstrings_energies probabilities\n", + "0 000000011111 0.0 0.000091\n", + "1 100000000011 2.0 0.000005\n", + "2 000010011011 3.0 0.000016\n", + "3 000001000011 4.0 0.000169\n", + "4 100010000101 5.0 0.002884\n", + "Dispositivo: qiskit.qasm_simulator Tipo: rand Mixer: xy\n", + " solutions_bitstrings bitstrings_energies probabilities\n", + "0 000000011111 0.0 0.000977\n", + "1 000001000011 4.0 0.001953\n", + "2 100001010001 6.0 0.000977\n", + "3 100100010110 9.0 0.000977\n", + "4 010001011110 10.0 0.000977\n", + "Dispositivo: qiskit.qasm_simulator Tipo: rand Mixer: x\n", + " solutions_bitstrings bitstrings_energies probabilities\n", + "0 000011001110 7.0 0.000977\n", + "1 001001011110 12.0 0.002930\n", + "2 000111010010 14.0 0.000977\n", + "3 001011011010 15.0 0.006836\n", + "4 001011010001 15.0 0.006836\n", + "Dispositivo: qiskit.qasm_simulator Tipo: ramp Mixer: xy\n", + " solutions_bitstrings bitstrings_energies probabilities\n", + "0 100010000101 5.0 0.002930\n", + "1 010000000111 6.0 0.000977\n", + "2 000011000101 7.0 0.001953\n", + "3 000010101101 9.0 0.000977\n", + "4 100011011100 9.0 0.000977\n", + "Dispositivo: qiskit.qasm_simulator Tipo: ramp Mixer: x\n", + " solutions_bitstrings bitstrings_energies probabilities\n", + "0 000000011111 0.0 0.001953\n", + "1 100000000011 2.0 0.000977\n", + "2 000011001110 7.0 0.000977\n", + "3 101000010101 10.0 0.001953\n", + "4 001001011110 12.0 0.004883\n" + ] + } + ], "source": [ - "## Part 3: Noise Model\n", - "\n", - "The optimal combination that you found with the best optimizer, the lowest number of $p$'s and the correct answer, can give the same answer with noise, use the circuit with a noise model and identify if it gives the same answer." + "# Initialize the QAOA object and use a device\n", + "tipos = ['rand','ramp']\n", + "ham = ['xy','x']\n", + "dispositivos = ['qiskit.statevector_simulator','qiskit.qasm_simulator']\n", + "for k in dispositivos:\n", + " for i in tipos:\n", + " for j in ham:\n", + " device = create_device(\"local\", k)\n", + " results_sv = funcionesQAOA(device,i,j)\n", + " print(\"Dispositivo: \",k, \" Tipo: \",i, \" Mixer: \",j)\n", + " print(pd.DataFrame(results_sv.lowest_cost_bitstrings(5)))\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(0.0, ['0001111'])\n" + ] + } + ], "source": [ - "# implementation using a noise model using qiskit \n", - "\n", - "# initialize the QAOA object\n", - "q = QAOA()\n", - "\n", - "## real hardware\n", - "from qiskit.providers.fake_provider import FakeVigo\n", - "from qiskit.providers.aer.noise import NoiseModel\n", - "from qiskit.providers.aer import QasmSimulator\n", - "\n", - "\n", - "device = create_device(\"local\", 'qiskit.qasm_simulator')\n", - "# choose the noise model\n", - "\n", - "# set your device\n", - "q.set_device(device)\n", - "\n", - "# set the parameters to work the QAOA algorithm\n", - "\n", - "\n", - "qaoa.compile(ising_encoding)\n", - "\n", - "# run the QAOA algorithm\n", - "qaoa.optimize()\n", - "\n", - "pd.DataFrame(qaoa.result.lowest_cost_bitstrings(5))" + "correct_solution = ground_state_hamiltonian(qaoa.cost_hamil)\n", + "print(correct_solution)" ] }, { @@ -267,9 +486,9 @@ ], "metadata": { "kernelspec": { - "display_name": "mitiq-qaoa", + "display_name": "Python 3", "language": "python", - "name": "mitiq-qaoa" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -281,7 +500,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.10.4" } }, "nbformat": 4, diff --git a/challenges/openqaoa challenge/main.ipynb b/challenges/openqaoa challenge/main.ipynb new file mode 100644 index 0000000..83a474c --- /dev/null +++ b/challenges/openqaoa challenge/main.ipynb @@ -0,0 +1,280 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib notebook\n", + "\n", + "# Import external libraries to present an manipulate the data\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "\n", + "# Import docplex model to generate the problem to optimize\n", + "from docplex.mp.model import Model\n", + "\n", + "# Import the libraries needed to employ the QAOA quantum algorithm using OpenQAOA\n", + "from openqaoa import QAOA\n", + "\n", + "# method to covnert a docplex model to a qubo problem\n", + "from openqaoa.problems.converters import FromDocplex2IsingModel #check this method and properties\n", + "from openqaoa.backends import create_device\n", + "\n", + "# method to find the correct states for the QAOA object \n", + "from openqaoa.utilities import ground_state_hamiltonian" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## El problema de la mochila \n", + "\n", + "El problema de la mochila es un problema combinatorio que considera un conjunto de objetos que tiene un valor peso/costo, el objetivo consiste en seleccionar un subconjunto de elementos que permita maximizar el peso/costo. Este problema esta restringido a una capacidad máxima específica.\n", + "\n", + "Para ello se debe cumplir que el peso máximo debe ser mayor al menor de los pesos de los elementos, en el caso trivial la suma de todos los elementos es menor al peso máximo.\n", + "\n", + "Para la transformación a un problema QUBO se deben considerar las restricciones de la desigualdad. \n", + "\n", + "La función puede describirse fomo:\n", + "\n", + "$$\n", + "\n", + "max \\left( \\sum_{i=0}^n v_i x_i \\right) \n", + "\n", + "$$\n", + "\n", + "La restricción es:\n", + "\n", + "$$\n", + "\n", + "\\sum_{i=1}^n w_i x_i \\leq W\n", + "$$\n", + "\n", + "$$\n", + "\n", + "x_i = \\{0,1\\}\n", + "\n", + "$$\n", + "\n", + "### Problema de optimización\n", + "\n", + "Existe una gran variedad de problemas que pueden resolverde con ese planteamiento, por ejemplo:\n", + "-Si se desea maximizar la producción agricola en un invernadero dados la cantidad de sustratos y el costo de los productos a coshechar.\n", + "-Se desea maximizar la contratación de profesores dado un presupuesto definido que permita ofrecer la mayor cantidad de áreas de conocimiento.\n", + "-Para maximizar el almacenamiento de productos para su translado, la etensión de este caso se proyecta al uso de múltiples mochilas en donde se pueden almacenar, la misma o diferentes cantidad de peso.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2 5 5 8 4 5 5 2 9 1]\n", + "[3 7 4 9 7 1 7 8 1 5]\n", + "24\n" + ] + } + ], + "source": [ + "# Datos del problema de Prueba\n", + "values = np.random.randint(10, size=10)\n", + "weights = np.random.randint(10, size=10)\n", + "max_weight = np.random.randint(10,50)\n", + "\n", + "print(values)\n", + "print(weights)\n", + "print(max_weight)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Definir el problema, la función objetivo y las restricciones." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def Problem(values, weights, max_weight):\n", + " \n", + " # initialize a model\n", + " mdl = Model(name=\"Knaspack\")\n", + " \n", + " x = {i: mdl.binary_var(name=f\"x_{i}\") for i in range(len(values))} \n", + " # define the objective function\n", + " mdl.minimize(mdl.sum(values[i] * x[i] for i in x)) \n", + " # add the constraints\n", + " mdl.add_constraint(mdl.sum(weights[i] * x[i] for i in x) <= max_weight)\n", + " return FromDocplex2IsingModel(mdl)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "// This file has been generated by DOcplex\n", + "// model name is: Knaspack\n", + "// var contrainer section\n", + "dvar bool slack_C0[5];\n", + "\n", + "// single vars section\n", + "dvar bool x_0;\n", + "dvar bool x_1;\n", + "dvar bool x_2;\n", + "dvar bool x_3;\n", + "dvar bool x_4;\n", + "dvar bool x_5;\n", + "dvar bool x_6;\n", + "dvar bool x_7;\n", + "dvar bool x_8;\n", + "dvar bool x_9;\n", + "dvar bool slack_C0_0;\n", + "dvar bool slack_C0_1;\n", + "dvar bool slack_C0_2;\n", + "dvar bool slack_C0_3;\n", + "dvar bool slack_C0_4;\n", + "\n", + "minimize\n", + " - 6766 x_0 - 15787 x_1 - 9019 x_2 - 20296 x_3 - 15788 x_4 - 2251 x_5\n", + " - 15787 x_6 - 18046 x_7 - 2247 x_8 - 11279 x_9 - 2256 slack_C0_0\n", + " - 4512 slack_C0_1 - 9024 slack_C0_2 - 18048 slack_C0_3 - 20304 slack_C0_4 [\n", + " 423 x_0^2 + 1974 x_0*x_1 + 1128 x_0*x_2 + 2538 x_0*x_3 + 1974 x_0*x_4\n", + " + 282 x_0*x_5 + 1974 x_0*x_6 + 2256 x_0*x_7 + 282 x_0*x_8 + 1410 x_0*x_9\n", + " + 282 x_0*slack_C0_0 + 564 x_0*slack_C0_1 + 1128 x_0*slack_C0_2\n", + " + 2256 x_0*slack_C0_3 + 2538 x_0*slack_C0_4 + 2303 x_1^2 + 2632 x_1*x_2\n", + " + 5922 x_1*x_3 + 4606 x_1*x_4 + 658 x_1*x_5 + 4606 x_1*x_6 + 5264 x_1*x_7\n", + " + 658 x_1*x_8 + 3290 x_1*x_9 + 658 x_1*slack_C0_0 + 1316 x_1*slack_C0_1\n", + " + 2632 x_1*slack_C0_2 + 5264 x_1*slack_C0_3 + 5922 x_1*slack_C0_4 + 752 x_2^2\n", + " + 3384 x_2*x_3 + 2632 x_2*x_4 + 376 x_2*x_5 + 2632 x_2*x_6 + 3008 x_2*x_7\n", + " + 376 x_2*x_8 + 1880 x_2*x_9 + 376 x_2*slack_C0_0 + 752 x_2*slack_C0_1\n", + " + 1504 x_2*slack_C0_2 + 3008 x_2*slack_C0_3 + 3384 x_2*slack_C0_4\n", + " + 3807 x_3^2 + 5922 x_3*x_4 + 846 x_3*x_5 + 5922 x_3*x_6 + 6768 x_3*x_7\n", + " + 846 x_3*x_8 + 4230 x_3*x_9 + 846 x_3*slack_C0_0 + 1692 x_3*slack_C0_1\n", + " + 3384 x_3*slack_C0_2 + 6768 x_3*slack_C0_3 + 7614 x_3*slack_C0_4\n", + " + 2303 x_4^2 + 658 x_4*x_5 + 4606 x_4*x_6 + 5264 x_4*x_7 + 658 x_4*x_8\n", + " + 3290 x_4*x_9 + 658 x_4*slack_C0_0 + 1316 x_4*slack_C0_1\n", + " + 2632 x_4*slack_C0_2 + 5264 x_4*slack_C0_3 + 5922 x_4*slack_C0_4 + 47 x_5^2\n", + " + 658 x_5*x_6 + 752 x_5*x_7 + 94 x_5*x_8 + 470 x_5*x_9 + 94 x_5*slack_C0_0\n", + " + 188 x_5*slack_C0_1 + 376 x_5*slack_C0_2 + 752 x_5*slack_C0_3\n", + " + 846 x_5*slack_C0_4 + 2303 x_6^2 + 5264 x_6*x_7 + 658 x_6*x_8 + 3290 x_6*x_9\n", + " + 658 x_6*slack_C0_0 + 1316 x_6*slack_C0_1 + 2632 x_6*slack_C0_2\n", + " + 5264 x_6*slack_C0_3 + 5922 x_6*slack_C0_4 + 3008 x_7^2 + 752 x_7*x_8\n", + " + 3760 x_7*x_9 + 752 x_7*slack_C0_0 + 1504 x_7*slack_C0_1\n", + " + 3008 x_7*slack_C0_2 + 6016 x_7*slack_C0_3 + 6768 x_7*slack_C0_4 + 47 x_8^2\n", + " + 470 x_8*x_9 + 94 x_8*slack_C0_0 + 188 x_8*slack_C0_1 + 376 x_8*slack_C0_2\n", + " + 752 x_8*slack_C0_3 + 846 x_8*slack_C0_4 + 1175 x_9^2 + 470 x_9*slack_C0_0\n", + " + 940 x_9*slack_C0_1 + 1880 x_9*slack_C0_2 + 3760 x_9*slack_C0_3\n", + " + 4230 x_9*slack_C0_4 + 47 slack_C0_0^2 + 188 slack_C0_0*slack_C0_1\n", + " + 376 slack_C0_0*slack_C0_2 + 752 slack_C0_0*slack_C0_3\n", + " + 846 slack_C0_0*slack_C0_4 + 188 slack_C0_1^2 + 752 slack_C0_1*slack_C0_2\n", + " + 1504 slack_C0_1*slack_C0_3 + 1692 slack_C0_1*slack_C0_4 + 752 slack_C0_2^2\n", + " + 3008 slack_C0_2*slack_C0_3 + 3384 slack_C0_2*slack_C0_4 + 3008 slack_C0_3^2\n", + " + 6768 slack_C0_3*slack_C0_4 + 3807 slack_C0_4^2 ] + 27072;\n", + " \n", + "subject to {\n", + "\n", + "}\n" + ] + } + ], + "source": [ + "problem = Problem(values, weights, max_weight)\n", + "\n", + "# Ising encoding of the QUBO problem for binpacking problem\n", + "qubo = problem.ising_model\n", + "\n", + "# Docplex encoding of the QUBO problem for binpacking problem\n", + "mdl_qubo_docplex = problem.qubo_docplex\n", + "\n", + "mdl_qubo_docplex.prettyprint()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Probar los parámetros para obtener los mejores resultados de la optimización" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def funcionesQAOA(device,tipo,ham):\n", + " qaoa = QAOA()\n", + " qaoa.set_device(device)\n", + "\n", + " # Set the parameters to use the QAOA algorithm\n", + " qaoa.set_backend_properties(n_shots=1024, seed_simulator=1)\n", + " qaoa.set_circuit_properties(p=1, param_type='standard', init_type=tipo, mixer_hamiltonian=ham)\n", + "\n", + " qaoa.compile(qubo)\n", + "\n", + " # Run the QAOA algorithm\n", + " qaoa.optimize()\n", + " \n", + " qaoa.cost_hamil\n", + " return qaoa.result" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the QAOA object and use a device\n", + "tipos = ['rand','ramp']\n", + "ham = ['xy','x']\n", + "dispositivos = ['qiskit.statevector_simulator','qiskit.qasm_simulator']\n", + "for k in dispositivos:\n", + " for i in tipos:\n", + " for j in ham:\n", + " device = create_device(\"local\", k)\n", + " results_sv = funcionesQAOA(device,i,j)\n", + " print(\"Dispositivo: \",k, \" Tipo: \",i, \" Mixer: \",j)\n", + " print(pd.DataFrame(results_sv.lowest_cost_bitstrings(5)))" + ] + } + ], + "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.10.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/challenges/xanadu challenge/README.md b/challenges/xanadu challenge/README.md new file mode 100644 index 0000000..2735993 --- /dev/null +++ b/challenges/xanadu challenge/README.md @@ -0,0 +1,21 @@ +Equipo: Qutips + +Integrantes: +Areli Yesareth Guerrero Estrada +Janeth De Anda Gil +Miguel Alejandro Medina Armendariz +Edgar Omar Mendoza Lopez + + +PennyLane es una plataforma versátil que integra algoritmos clásicos y cuánticos. Permite a los usuarios codificar circuitos cuánticos, y realizar diferentes operaciones. Además cuenta con algoritmos implementados de optimización y calculo de gradientes los cuales se pueden integrar de manera hibrida. También cuenta con la integración de herramientas como NumPy, PyTorch, JAX y TensorFlow, los cuales facilitan las implementaciones de circuitos cuánticos dentro de estas bibliotecas. + +PennyLane admite varios optimizadores adaptados a diferentes escenarios de optimización cuántica, incluidos QNGOptimizer, RiemannianGradientOptimizer, RotosolveOptimizer, RotoselectOptimizer, ShotAdaptiveOptimizer y QNSPSAOptimizer cuando se usa NumPy. + +El AdagradIptimizer es un algortitmo de optimización con una tasa de aprendizaje el cual ajusta la tasa de aprendizaje para cada parámetro considerando los valores previos, por lo tanto considera la actualización de parámetros individualmente. + +En resumen, PennyLane ofrece un conjunto de herramientas integral para desarrollar y optimizar modelos híbridos de aprendizaje automático cuántico-clásico, brindando flexibilidad en la elección de marcos de diferenciación, optimizadores y métodos de cálculo de gradientes. + + +Referencias: +Koch, D., Patel, S., Wessing, L., & Alsing, P. M. (2020). Fundamentals in quantum algorithms: A tutorial series using Qiskit continued. arXiv preprint arXiv:2008.10647. +Documentacion: https://docs.pennylane.ai/en/stable/code/api/pennylane.AdagradOptimizer.html \ No newline at end of file diff --git a/challenges/xanadu challenge/challenge_template.py b/challenges/xanadu challenge/challenge_template.py index 7018c54..a8ad165 100644 --- a/challenges/xanadu challenge/challenge_template.py +++ b/challenges/xanadu challenge/challenge_template.py @@ -2,6 +2,7 @@ import pennylane as qml from pennylane import numpy as np +import random WIRES = 2 LAYERS = 5 @@ -25,6 +26,7 @@ def variational_circuit(params,hamiltonian): (float): The expectation value of the Hamiltonian """ parameters = params.reshape((LAYERS, WIRES, 3)) + # print(parameters) qml.templates.StronglyEntanglingLayers(parameters, wires=range(WIRES)) return qml.expval(qml.Hermitian(hamiltonian, wires = [0,1])) @@ -52,11 +54,58 @@ def optimize_circuit(hamiltonian): ### Solution Template - dev = # Initialize the device. - - circuit = # Instantiate the QNode from variational_circuit. + dev = qml.device("default.qubit",wires=WIRES)# Initialize the device. + + circuit = variational_circuit # Instantiate the QNode from variational_circuit. # Write your code to minimize the circuit + qnode = qml.QNode(circuit, dev) + + + + ######################################################### + # AdagradOptimizer + # Se selecciona por dar el mejor resultado con menos pasos en menos tiempo + # Para mejorar el resultado se puede cambiar el valor de 'stepsize' al reducirlo + # se limita la busqueda, por lo cual requeriria incrementar el número de pasos + ######################################################### + optGDO = qml.AdagradOptimizer(stepsize=0.1, eps=1e-08) + steps = 200 + + #Se genera un arrelgo de parametros iniciales aleatorios + init_paramsGDO = [[random.random() for _ in range(30)]] + #Se declaran los arreglos para almacenar la información del valor optimizado y los parámetros + gdo_cost = [] + gdo_params = [] + for _ in range(steps): + paramsGDO = np.array(init_paramsGDO[0], requires_grad=True) + minimoGDO = qnode(paramsGDO, hamiltonian) + gdo_cost.append(minimoGDO) + gdo_params.append(paramsGDO) + init_paramsGDO = optGDO.step(qnode, paramsGDO, hamiltonian) + + # Seselecciona el minimo y los parámetros correspondientes a este valor + minimo = min(gdo_cost) + indice = gdo_cost.index(minimo) + parametros = gdo_params[indice] + print("Resultado: ",minimo,", parámetros: ",parametros) + + return minimo# Return the value of the minimized QNode + + +# Valores de prueba +H1 = [0.863327072347624,0.0167108057202516,0.07991447085492759,0.0854049026262154,0.0167108057202516,0.8237963773906136,-0.07695947154193797,0.03131548733285282,0.07991447085492759,-0.07695947154193795,0.8355417021014687,-0.11345916130631205,0.08540490262621539,0.03131548733285283,-0.11345916130631205,0.758156886827099] +R1 = 0.61745341 +H2 = [0.32158897156285354,-0.20689268438270836,0.12366748295758379,-0.11737425017261123,-0.20689268438270836,0.7747346055276305,-0.05159966365446514,0.08215539696259792,0.12366748295758379,-0.05159966365446514,0.5769050487087416,0.3853362904758938,-0.11737425017261123,0.08215539696259792,0.3853362904758938,0.3986256655167206] +R2 = 0.00246488 + + +# Resultado empleando el primer valor de prueba +minimo = optimize_circuit(H1) +print("Error: ", abs((minimo-R1))) + - return # Return the value of the minimized QNode +# Resultado empleando el segundo valor de prueba +minimo = optimize_circuit(H2) +print("Error: ", abs((minimo-R2))) diff --git a/hackathon/README.md b/hackathon/README.md new file mode 100644 index 0000000..fd96440 --- /dev/null +++ b/hackathon/README.md @@ -0,0 +1,54 @@ +Equipo: Qutips + +Integrantes: +Areli Yesareth Guerrero Estrada +Janeth De Anda Gil +Miguel Alejandro Medina Armendariz +Edgar Omar Mendoza Lopez + +En el archivo main.ipynb se encuentra la propuesta desarrollada + + +Las redes neuronales hibridas funcionan combinando capas de redes neuronales clásicas con circuitos cuánticos. Las redes neuronales híbridas nos permiten aprovechar las fortalezas de la computación cuántica y clásica. Al integrar elementos cuánticos en redes neuronales, podemos aprovechar la ventaja cuántica para tareas específicas. Esta característica es crucial para abordar desafíos complejos del mundo real. + +Aprendizaje automático: Las redes neuronales híbridas pueden mejorar los modelos clásicos de aprendizaje automático, haciéndolos más capaces de manejar tareas complejas y grandes conjuntos de datos. + +Qiskit cuenta con una biblioteca que permite integrar los circuitos cuánticos dentro de las capas de las redes neuronales. + +Para poder implementar se debe tomar en cuenta: + +1. Importar las bibliotecas necesarias: +- Importar Qiskit para creación y ejecución de circuitos cuánticos. +- Importar bibliotecas de PyTorch para operaciones clásicas de redes neuronales. + +2. Definir el circuito cuántico: +- Crear un circuito cuántico en Qiskit. +- Definir lo elementos a parametrizar que desean optimizar. + +3. Crear la red neuronal clásica: +- Utilizando una librería PyTorch, diseñar la parte clásica de la red neuronal. +- Define la arquitectura de la red neuronal, incluidas capas, funciones de activación y objetivos +de optimización. + +4. Combinar redes clásicas y cuánticas: +- Dependiendo del modelo específico, se requiere definir la capa en la que se introduce el circuito cuántico. + +5. Establecer una función de costo: +- Es necesario definir una función de costo que cuantifique el error entre las predicciones de la +red y los datos reales. +- Esta función de costos se utiliza para guiar el proceso de optimización. + +6. Entrenar la red híbrida: +- Optimizar los parámetros en el circuito cuántico (y potencialmente en la red clásica) utilizando +técnicas de optimización. + +7. Evaluar y utilizar el modelo: +- Después del entrenamiento, puede evaluar el rendimiento del modelo híbrido en datos de +prueba. +- Utilice el modelo para diversas tareas de aprendizaje automático, como clasificación, +regresión u optimización. + +Referencias: +https://qiskit.org/ecosystem/machine-learning/index.html +Rieffel, E. G., & Polak, W. H. (2011). Quantum computing: A gentle introduction. MIT Press. +Koch, D., Patel, S., Wessing, L. y Alsing, P. Fundamentals In Quantum Algorithms: A tutorial seriesl using Qiskit continued \ No newline at end of file diff --git a/hackathon/bancos/prueba/COVID/covid-19-caso-85-5-4.png b/hackathon/bancos/prueba/COVID/covid-19-caso-85-5-4.png new file mode 100644 index 0000000..d834339 Binary files /dev/null and b/hackathon/bancos/prueba/COVID/covid-19-caso-85-5-4.png differ diff --git a/hackathon/bancos/prueba/COVID/covid-19-pneumonia-24-day12.jpg b/hackathon/bancos/prueba/COVID/covid-19-pneumonia-24-day12.jpg new file mode 100644 index 0000000..b8f0d51 Binary files /dev/null and b/hackathon/bancos/prueba/COVID/covid-19-pneumonia-24-day12.jpg differ diff --git a/hackathon/bancos/prueba/COVID/covid-19-pneumonia-rapidly-progressive-12-hours.jpg b/hackathon/bancos/prueba/COVID/covid-19-pneumonia-rapidly-progressive-12-hours.jpg new file mode 100644 index 0000000..5ca236e Binary files /dev/null and b/hackathon/bancos/prueba/COVID/covid-19-pneumonia-rapidly-progressive-12-hours.jpg differ diff --git a/hackathon/bancos/prueba/COVID/extubation-4.jpg b/hackathon/bancos/prueba/COVID/extubation-4.jpg new file mode 100644 index 0000000..748ea03 Binary files /dev/null and b/hackathon/bancos/prueba/COVID/extubation-4.jpg differ diff --git a/hackathon/bancos/prueba/COVID/kjr-21-e24-g003-l-a.jpg b/hackathon/bancos/prueba/COVID/kjr-21-e24-g003-l-a.jpg new file mode 100644 index 0000000..7fac1d2 Binary files /dev/null and b/hackathon/bancos/prueba/COVID/kjr-21-e24-g003-l-a.jpg differ diff --git a/hackathon/bancos/prueba/COVID/thnov10p5641g006-c.png b/hackathon/bancos/prueba/COVID/thnov10p5641g006-c.png new file mode 100644 index 0000000..9e3503b Binary files /dev/null and b/hackathon/bancos/prueba/COVID/thnov10p5641g006-c.png differ diff --git a/hackathon/bancos/prueba/COVID/yxppt-2020-02-19_00-51-27_287214-day12.jpg b/hackathon/bancos/prueba/COVID/yxppt-2020-02-19_00-51-27_287214-day12.jpg new file mode 100644 index 0000000..c25186e Binary files /dev/null and b/hackathon/bancos/prueba/COVID/yxppt-2020-02-19_00-51-27_287214-day12.jpg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-4315572-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-4315572-0001 - copia.jpeg new file mode 100644 index 0000000..6a2ecb6 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-4315572-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-4511610-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-4511610-0001 - copia.jpeg new file mode 100644 index 0000000..4101777 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-4511610-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-4534031-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-4534031-0001 - copia.jpeg new file mode 100644 index 0000000..6d44fa2 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-4534031-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-4766279-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-4766279-0001 - copia.jpeg new file mode 100644 index 0000000..00dbf76 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-4766279-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-4886177-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-4886177-0001 - copia.jpeg new file mode 100644 index 0000000..0f056a7 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-4886177-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-5180957-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-5180957-0001 - copia.jpeg new file mode 100644 index 0000000..1289dc2 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-5180957-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-5425295-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-5425295-0001 - copia.jpeg new file mode 100644 index 0000000..fd54fa9 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-5425295-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-5459424-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-5459424-0001 - copia.jpeg new file mode 100644 index 0000000..6d40478 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-5459424-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-5511958-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-5511958-0001 - copia.jpeg new file mode 100644 index 0000000..d555e91 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-5511958-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-5545906-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-5545906-0001 - copia.jpeg new file mode 100644 index 0000000..3721f17 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-5545906-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-5789014-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-5789014-0001 - copia.jpeg new file mode 100644 index 0000000..e00d7c5 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-5789014-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-6137647-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-6137647-0001 - copia.jpeg new file mode 100644 index 0000000..3d3f140 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-6137647-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-6204576-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-6204576-0001 - copia.jpeg new file mode 100644 index 0000000..4184306 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-6204576-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-6267994-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-6267994-0001 - copia.jpeg new file mode 100644 index 0000000..9bba494 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-6267994-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-6322108-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-6322108-0001 - copia.jpeg new file mode 100644 index 0000000..505249b Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-6322108-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-6332708-0002 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-6332708-0002 - copia.jpeg new file mode 100644 index 0000000..b95ba6c Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-6332708-0002 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-6497443-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-6497443-0001 - copia.jpeg new file mode 100644 index 0000000..2ea0ada Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-6497443-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-7100645-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-7100645-0001 - copia.jpeg new file mode 100644 index 0000000..233c9d9 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-7100645-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-7331861-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-7331861-0001 - copia.jpeg new file mode 100644 index 0000000..ad69410 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-7331861-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-7483489-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-7483489-0001 - copia.jpeg new file mode 100644 index 0000000..415e285 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-7483489-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-7590045-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-7590045-0001 - copia.jpeg new file mode 100644 index 0000000..4b49862 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-7590045-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-7922918-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-7922918-0001 - copia.jpeg new file mode 100644 index 0000000..d1919c1 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-7922918-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-8278998-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-8278998-0001 - copia.jpeg new file mode 100644 index 0000000..8b1fdde Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-8278998-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-8406720-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-8406720-0001 - copia.jpeg new file mode 100644 index 0000000..31e9674 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-8406720-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-8586608-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-8586608-0001 - copia.jpeg new file mode 100644 index 0000000..ccede5b Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-8586608-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-8836138-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-8836138-0001 - copia.jpeg new file mode 100644 index 0000000..e036707 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-8836138-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-8907762-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-8907762-0001 - copia.jpeg new file mode 100644 index 0000000..dd3bdb2 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-8907762-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-9092354-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-9092354-0001 - copia.jpeg new file mode 100644 index 0000000..8355e98 Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-9092354-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-9441169-0001 - copia.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-9441169-0001 - copia.jpeg new file mode 100644 index 0000000..091302a Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-9441169-0001 - copia.jpeg differ diff --git a/hackathon/bancos/prueba/SANOS/NORMAL-9708691-0001.jpeg b/hackathon/bancos/prueba/SANOS/NORMAL-9708691-0001.jpeg new file mode 100644 index 0000000..674a2be Binary files /dev/null and b/hackathon/bancos/prueba/SANOS/NORMAL-9708691-0001.jpeg differ diff --git a/hackathon/bancos/test/COVID/1-s2.0-S1341321X20301124-gr3_lrg-c.png b/hackathon/bancos/test/COVID/1-s2.0-S1341321X20301124-gr3_lrg-c.png new file mode 100644 index 0000000..bf750df Binary files /dev/null and b/hackathon/bancos/test/COVID/1-s2.0-S1341321X20301124-gr3_lrg-c.png differ diff --git a/hackathon/bancos/test/COVID/1-s2.0-S1684118220300372-gr1_lrg-a.png b/hackathon/bancos/test/COVID/1-s2.0-S1684118220300372-gr1_lrg-a.png new file mode 100644 index 0000000..b24cf41 Binary files /dev/null and b/hackathon/bancos/test/COVID/1-s2.0-S1684118220300372-gr1_lrg-a.png differ diff --git a/hackathon/bancos/test/COVID/10.1016-slash-j.crad.2020.04.002-a.png b/hackathon/bancos/test/COVID/10.1016-slash-j.crad.2020.04.002-a.png new file mode 100644 index 0000000..61640b1 Binary files /dev/null and b/hackathon/bancos/test/COVID/10.1016-slash-j.crad.2020.04.002-a.png differ diff --git a/hackathon/bancos/test/COVID/16953_3_1.jpg b/hackathon/bancos/test/COVID/16953_3_1.jpg new file mode 100644 index 0000000..44cc42a Binary files /dev/null and b/hackathon/bancos/test/COVID/16953_3_1.jpg differ diff --git a/hackathon/bancos/test/COVID/2eadbbb367a0366d8c34350d083a83_jumbo.jpeg b/hackathon/bancos/test/COVID/2eadbbb367a0366d8c34350d083a83_jumbo.jpeg new file mode 100644 index 0000000..20e34f7 Binary files /dev/null and b/hackathon/bancos/test/COVID/2eadbbb367a0366d8c34350d083a83_jumbo.jpeg differ diff --git a/hackathon/bancos/test/COVID/78b60346d1b3bce85353b6dc462d75_jumbo.jpeg b/hackathon/bancos/test/COVID/78b60346d1b3bce85353b6dc462d75_jumbo.jpeg new file mode 100644 index 0000000..bd6d2de Binary files /dev/null and b/hackathon/bancos/test/COVID/78b60346d1b3bce85353b6dc462d75_jumbo.jpeg differ diff --git a/hackathon/bancos/test/COVID/82a78c13.jpg b/hackathon/bancos/test/COVID/82a78c13.jpg new file mode 100644 index 0000000..85bac84 Binary files /dev/null and b/hackathon/bancos/test/COVID/82a78c13.jpg differ diff --git a/hackathon/bancos/test/COVID/93FE0BB1-022D-4F24-9727-987A07975FFB.jpeg b/hackathon/bancos/test/COVID/93FE0BB1-022D-4F24-9727-987A07975FFB.jpeg new file mode 100644 index 0000000..e31fdaa Binary files /dev/null and b/hackathon/bancos/test/COVID/93FE0BB1-022D-4F24-9727-987A07975FFB.jpeg differ diff --git a/hackathon/bancos/test/COVID/B59DD164-51D5-40DF-A926-6A42DD52EBE8.jpeg b/hackathon/bancos/test/COVID/B59DD164-51D5-40DF-A926-6A42DD52EBE8.jpeg new file mode 100644 index 0000000..09bc25b Binary files /dev/null and b/hackathon/bancos/test/COVID/B59DD164-51D5-40DF-A926-6A42DD52EBE8.jpeg differ diff --git a/hackathon/bancos/test/COVID/ajr.20.23034.pdf-001.png b/hackathon/bancos/test/COVID/ajr.20.23034.pdf-001.png new file mode 100644 index 0000000..cde4c4e Binary files /dev/null and b/hackathon/bancos/test/COVID/ajr.20.23034.pdf-001.png differ diff --git a/hackathon/bancos/test/COVID/all14238-fig-0002-m-f.jpg b/hackathon/bancos/test/COVID/all14238-fig-0002-m-f.jpg new file mode 100644 index 0000000..4544167 Binary files /dev/null and b/hackathon/bancos/test/COVID/all14238-fig-0002-m-f.jpg differ diff --git a/hackathon/bancos/test/COVID/covid-19-caso-85-1-9.png b/hackathon/bancos/test/COVID/covid-19-caso-85-1-9.png new file mode 100644 index 0000000..fa11b45 Binary files /dev/null and b/hackathon/bancos/test/COVID/covid-19-caso-85-1-9.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.10712.1517875225.224680 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.10712.1517875225.224680 - copia.png new file mode 100644 index 0000000..290e1ac Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.10712.1517875225.224680 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.10862.1517875226.16660 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.10862.1517875226.16660 - copia.png new file mode 100644 index 0000000..3f256ec Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.10862.1517875226.16660 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.11497.1517875233.215084 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.11497.1517875233.215084 - copia.png new file mode 100644 index 0000000..780f4c0 Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.11497.1517875233.215084 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.11978.1517875236.725141 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.11978.1517875236.725141 - copia.png new file mode 100644 index 0000000..839f3ef Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.11978.1517875236.725141 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.12362.1517875238.799884 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.12362.1517875238.799884 - copia.png new file mode 100644 index 0000000..197eb5e Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.12362.1517875238.799884 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.12872.1517875242.289734 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.12872.1517875242.289734 - copia.png new file mode 100644 index 0000000..592c549 Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.12872.1517875242.289734 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.14515.1517875252.471942 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.14515.1517875252.471942 - copia.png new file mode 100644 index 0000000..8a9918a Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.14515.1517875252.471942 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.1505.1517875168.149805 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.1505.1517875168.149805 - copia.png new file mode 100644 index 0000000..12001e0 Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.1505.1517875168.149805 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.2428.1517875172.652980 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.2428.1517875172.652980 - copia.png new file mode 100644 index 0000000..9eb8f49 Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.2428.1517875172.652980 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.2457.1517875172.834411 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.2457.1517875172.834411 - copia.png new file mode 100644 index 0000000..adc8391 Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.2457.1517875172.834411 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.2529.1517875173.221993 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.2529.1517875173.221993 - copia.png new file mode 100644 index 0000000..a3b3f45 Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.2529.1517875173.221993 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.32082.1517875158.341124 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.32082.1517875158.341124 - copia.png new file mode 100644 index 0000000..c8ddfa5 Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.32082.1517875158.341124 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.3637.1517875178.776612 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.3637.1517875178.776612 - copia.png new file mode 100644 index 0000000..44ba1e5 Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.3637.1517875178.776612 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.4362.1517875182.469446 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.4362.1517875182.469446 - copia.png new file mode 100644 index 0000000..787f5b5 Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.4362.1517875182.469446 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.4445.1517875182.890975 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.4445.1517875182.890975 - copia.png new file mode 100644 index 0000000..c46f1ac Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.4445.1517875182.890975 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.5169.1517875186.763360 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.5169.1517875186.763360 - copia.png new file mode 100644 index 0000000..7f203b4 Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.5169.1517875186.763360 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.524.1517875163.298894 - copia.png b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.524.1517875163.298894 - copia.png new file mode 100644 index 0000000..7b9689b Binary files /dev/null and b/hackathon/bancos/test/SANOS/1.2.276.0.7230010.3.1.4.8323329.524.1517875163.298894 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/21e9c794-01b6-4193-86f5-b07f03323ad3 - copia.png b/hackathon/bancos/test/SANOS/21e9c794-01b6-4193-86f5-b07f03323ad3 - copia.png new file mode 100644 index 0000000..eaf7b69 Binary files /dev/null and b/hackathon/bancos/test/SANOS/21e9c794-01b6-4193-86f5-b07f03323ad3 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/4aaa902f-4a6b-447f-88df-0e186e216e25 - copia.png b/hackathon/bancos/test/SANOS/4aaa902f-4a6b-447f-88df-0e186e216e25 - copia.png new file mode 100644 index 0000000..fb00062 Binary files /dev/null and b/hackathon/bancos/test/SANOS/4aaa902f-4a6b-447f-88df-0e186e216e25 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/6099324c-1fef-47a1-9f1b-b2e8f2a110a1 - copia.png b/hackathon/bancos/test/SANOS/6099324c-1fef-47a1-9f1b-b2e8f2a110a1 - copia.png new file mode 100644 index 0000000..63bee40 Binary files /dev/null and b/hackathon/bancos/test/SANOS/6099324c-1fef-47a1-9f1b-b2e8f2a110a1 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/60f096a6-8c30-4796-9592-1ac0d82e9bad - copia.png b/hackathon/bancos/test/SANOS/60f096a6-8c30-4796-9592-1ac0d82e9bad - copia.png new file mode 100644 index 0000000..155f33d Binary files /dev/null and b/hackathon/bancos/test/SANOS/60f096a6-8c30-4796-9592-1ac0d82e9bad - copia.png differ diff --git a/hackathon/bancos/test/SANOS/61e09ab3-94a9-46a7-bd05-6457a35f78d7 - copia.png b/hackathon/bancos/test/SANOS/61e09ab3-94a9-46a7-bd05-6457a35f78d7 - copia.png new file mode 100644 index 0000000..c22a1fc Binary files /dev/null and b/hackathon/bancos/test/SANOS/61e09ab3-94a9-46a7-bd05-6457a35f78d7 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/80f4ae7c-9523-46ec-93ac-592415eb4748 - copia.png b/hackathon/bancos/test/SANOS/80f4ae7c-9523-46ec-93ac-592415eb4748 - copia.png new file mode 100644 index 0000000..7450bc9 Binary files /dev/null and b/hackathon/bancos/test/SANOS/80f4ae7c-9523-46ec-93ac-592415eb4748 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/8ddb703e-4cbf-4570-8395-70d0c4b7fff0 - copia.png b/hackathon/bancos/test/SANOS/8ddb703e-4cbf-4570-8395-70d0c4b7fff0 - copia.png new file mode 100644 index 0000000..24a0b83 Binary files /dev/null and b/hackathon/bancos/test/SANOS/8ddb703e-4cbf-4570-8395-70d0c4b7fff0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/92c10f10-30ce-4da4-8c80-0610a0647d07 - copia.png b/hackathon/bancos/test/SANOS/92c10f10-30ce-4da4-8c80-0610a0647d07 - copia.png new file mode 100644 index 0000000..2282dfd Binary files /dev/null and b/hackathon/bancos/test/SANOS/92c10f10-30ce-4da4-8c80-0610a0647d07 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0014_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0014_0 - copia.png new file mode 100644 index 0000000..61d539a Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0014_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0046_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0046_0 - copia.png new file mode 100644 index 0000000..dd5569d Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0046_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0066_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0066_0 - copia.png new file mode 100644 index 0000000..5ee7f98 Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0066_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0083_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0083_0 - copia.png new file mode 100644 index 0000000..e29cc57 Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0083_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0108_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0108_0 - copia.png new file mode 100644 index 0000000..f23e96c Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0108_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0126_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0126_0 - copia.png new file mode 100644 index 0000000..6c115d4 Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0126_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0151_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0151_0 - copia.png new file mode 100644 index 0000000..9579fa3 Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0151_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0158_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0158_0 - copia.png new file mode 100644 index 0000000..dd0427a Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0158_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0189_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0189_0 - copia.png new file mode 100644 index 0000000..b61c59d Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0189_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0210_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0210_0 - copia.png new file mode 100644 index 0000000..3437db9 Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0210_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0243_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0243_0 - copia.png new file mode 100644 index 0000000..9b4c7b4 Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0243_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0264_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0264_0 - copia.png new file mode 100644 index 0000000..ebc4dfa Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0264_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0273_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0273_0 - copia.png new file mode 100644 index 0000000..ae61698 Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0273_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0301_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0301_0 - copia.png new file mode 100644 index 0000000..f03f9d3 Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0301_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/CHNCXR_0305_0 - copia.png b/hackathon/bancos/test/SANOS/CHNCXR_0305_0 - copia.png new file mode 100644 index 0000000..b27f104 Binary files /dev/null and b/hackathon/bancos/test/SANOS/CHNCXR_0305_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/MCUCXR_0062_0 - copia.png b/hackathon/bancos/test/SANOS/MCUCXR_0062_0 - copia.png new file mode 100644 index 0000000..806b928 Binary files /dev/null and b/hackathon/bancos/test/SANOS/MCUCXR_0062_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/MCUCXR_0081_0 - copia.png b/hackathon/bancos/test/SANOS/MCUCXR_0081_0 - copia.png new file mode 100644 index 0000000..fe1ba79 Binary files /dev/null and b/hackathon/bancos/test/SANOS/MCUCXR_0081_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/MCUCXR_0103_0 - copia.png b/hackathon/bancos/test/SANOS/MCUCXR_0103_0 - copia.png new file mode 100644 index 0000000..4fa4ed8 Binary files /dev/null and b/hackathon/bancos/test/SANOS/MCUCXR_0103_0 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-1110860-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-1110860-0001 - copia.jpeg new file mode 100644 index 0000000..69126f2 Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-1110860-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-1318320-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-1318320-0001 - copia.jpeg new file mode 100644 index 0000000..9951bd6 Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-1318320-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-1430636-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-1430636-0001 - copia.jpeg new file mode 100644 index 0000000..035f8f4 Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-1430636-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-152130-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-152130-0001 - copia.jpeg new file mode 100644 index 0000000..8252410 Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-152130-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-1608079-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-1608079-0001 - copia.jpeg new file mode 100644 index 0000000..0e817e6 Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-1608079-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-2162145-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-2162145-0001 - copia.jpeg new file mode 100644 index 0000000..67dc711 Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-2162145-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-217318-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-217318-0001 - copia.jpeg new file mode 100644 index 0000000..4b13be4 Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-217318-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-2280080-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-2280080-0001 - copia.jpeg new file mode 100644 index 0000000..c74bcde Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-2280080-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-2403676-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-2403676-0001 - copia.jpeg new file mode 100644 index 0000000..3cbf5e4 Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-2403676-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-3189250-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-3189250-0001 - copia.jpeg new file mode 100644 index 0000000..37ac242 Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-3189250-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-3346259-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-3346259-0001 - copia.jpeg new file mode 100644 index 0000000..a4da782 Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-3346259-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-3459196-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-3459196-0001 - copia.jpeg new file mode 100644 index 0000000..0c21e2a Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-3459196-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-3985743-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-3985743-0001 - copia.jpeg new file mode 100644 index 0000000..38623da Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-3985743-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-541071-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-541071-0001 - copia.jpeg new file mode 100644 index 0000000..d1f4be0 Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-541071-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-706052-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-706052-0001 - copia.jpeg new file mode 100644 index 0000000..0d158ad Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-706052-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/NORMAL-786023-0001 - copia.jpeg b/hackathon/bancos/test/SANOS/NORMAL-786023-0001 - copia.jpeg new file mode 100644 index 0000000..7915cca Binary files /dev/null and b/hackathon/bancos/test/SANOS/NORMAL-786023-0001 - copia.jpeg differ diff --git a/hackathon/bancos/test/SANOS/a18539dc-1902-4410-83c9-7614b9e355a9 - copia.png b/hackathon/bancos/test/SANOS/a18539dc-1902-4410-83c9-7614b9e355a9 - copia.png new file mode 100644 index 0000000..cb2b7e8 Binary files /dev/null and b/hackathon/bancos/test/SANOS/a18539dc-1902-4410-83c9-7614b9e355a9 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/ba3b13ee-0a05-4219-a45a-90eb7d91dc5d - copia.png b/hackathon/bancos/test/SANOS/ba3b13ee-0a05-4219-a45a-90eb7d91dc5d - copia.png new file mode 100644 index 0000000..b6d6d8d Binary files /dev/null and b/hackathon/bancos/test/SANOS/ba3b13ee-0a05-4219-a45a-90eb7d91dc5d - copia.png differ diff --git a/hackathon/bancos/test/SANOS/bcca16d2-1b10-4644-9724-701bb38c4790 - copia.png b/hackathon/bancos/test/SANOS/bcca16d2-1b10-4644-9724-701bb38c4790 - copia.png new file mode 100644 index 0000000..abb0ee8 Binary files /dev/null and b/hackathon/bancos/test/SANOS/bcca16d2-1b10-4644-9724-701bb38c4790 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/be9ed5cb-5663-44e4-8ba4-5e0886009683 - copia.png b/hackathon/bancos/test/SANOS/be9ed5cb-5663-44e4-8ba4-5e0886009683 - copia.png new file mode 100644 index 0000000..509e608 Binary files /dev/null and b/hackathon/bancos/test/SANOS/be9ed5cb-5663-44e4-8ba4-5e0886009683 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/cb9149e2-a09d-4b4a-a644-81d8f394d679 - copia.png b/hackathon/bancos/test/SANOS/cb9149e2-a09d-4b4a-a644-81d8f394d679 - copia.png new file mode 100644 index 0000000..a199384 Binary files /dev/null and b/hackathon/bancos/test/SANOS/cb9149e2-a09d-4b4a-a644-81d8f394d679 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/de94813d-0475-41b0-b248-af03dfb5a412 - copia.png b/hackathon/bancos/test/SANOS/de94813d-0475-41b0-b248-af03dfb5a412 - copia.png new file mode 100644 index 0000000..e04919e Binary files /dev/null and b/hackathon/bancos/test/SANOS/de94813d-0475-41b0-b248-af03dfb5a412 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/e257131e-342a-472b-b568-ac448f054081 - copia.png b/hackathon/bancos/test/SANOS/e257131e-342a-472b-b568-ac448f054081 - copia.png new file mode 100644 index 0000000..f2e0323 Binary files /dev/null and b/hackathon/bancos/test/SANOS/e257131e-342a-472b-b568-ac448f054081 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/e5a478b2-b843-4e25-b35f-2a4ce3f08c0c - copia.png b/hackathon/bancos/test/SANOS/e5a478b2-b843-4e25-b35f-2a4ce3f08c0c - copia.png new file mode 100644 index 0000000..caa876d Binary files /dev/null and b/hackathon/bancos/test/SANOS/e5a478b2-b843-4e25-b35f-2a4ce3f08c0c - copia.png differ diff --git a/hackathon/bancos/test/SANOS/f12d5151-4168-4bce-a9cf-c9eb427a1743 - copia.png b/hackathon/bancos/test/SANOS/f12d5151-4168-4bce-a9cf-c9eb427a1743 - copia.png new file mode 100644 index 0000000..6129aab Binary files /dev/null and b/hackathon/bancos/test/SANOS/f12d5151-4168-4bce-a9cf-c9eb427a1743 - copia.png differ diff --git a/hackathon/bancos/test/SANOS/fe047967-9495-42a5-a25b-b5c22f7724c3 - copia.png b/hackathon/bancos/test/SANOS/fe047967-9495-42a5-a25b-b5c22f7724c3 - copia.png new file mode 100644 index 0000000..db3014b Binary files /dev/null and b/hackathon/bancos/test/SANOS/fe047967-9495-42a5-a25b-b5c22f7724c3 - copia.png differ diff --git a/hackathon/bancos/train/COVID/1-s2.0-S0735675720302746-gr1_lrg.jpg b/hackathon/bancos/train/COVID/1-s2.0-S0735675720302746-gr1_lrg.jpg new file mode 100644 index 0000000..e9a7fc4 Binary files /dev/null and b/hackathon/bancos/train/COVID/1-s2.0-S0735675720302746-gr1_lrg.jpg differ diff --git a/hackathon/bancos/train/COVID/1-s2.0-S1521661620303314-gr1_lrg-a.png b/hackathon/bancos/train/COVID/1-s2.0-S1521661620303314-gr1_lrg-a.png new file mode 100644 index 0000000..eec5465 Binary files /dev/null and b/hackathon/bancos/train/COVID/1-s2.0-S1521661620303314-gr1_lrg-a.png differ diff --git a/hackathon/bancos/train/COVID/1-s2.0-S2387020620301959-gr4_lrg-b.png b/hackathon/bancos/train/COVID/1-s2.0-S2387020620301959-gr4_lrg-b.png new file mode 100644 index 0000000..ffac224 Binary files /dev/null and b/hackathon/bancos/train/COVID/1-s2.0-S2387020620301959-gr4_lrg-b.png differ diff --git a/hackathon/bancos/train/COVID/1-s2.0-S2387020620301959-gr4_lrg-c.png b/hackathon/bancos/train/COVID/1-s2.0-S2387020620301959-gr4_lrg-c.png new file mode 100644 index 0000000..12c218d Binary files /dev/null and b/hackathon/bancos/train/COVID/1-s2.0-S2387020620301959-gr4_lrg-c.png differ diff --git a/hackathon/bancos/train/COVID/1-s2.0-S2531043720300921-gr1.png b/hackathon/bancos/train/COVID/1-s2.0-S2531043720300921-gr1.png new file mode 100644 index 0000000..7e22de1 Binary files /dev/null and b/hackathon/bancos/train/COVID/1-s2.0-S2531043720300921-gr1.png differ diff --git a/hackathon/bancos/train/COVID/1.png b/hackathon/bancos/train/COVID/1.png new file mode 100644 index 0000000..06b6ce6 Binary files /dev/null and b/hackathon/bancos/train/COVID/1.png differ diff --git a/hackathon/bancos/train/COVID/10.1016-slash-j.hrcr.2020.04.015-a.png b/hackathon/bancos/train/COVID/10.1016-slash-j.hrcr.2020.04.015-a.png new file mode 100644 index 0000000..8d1c14e Binary files /dev/null and b/hackathon/bancos/train/COVID/10.1016-slash-j.hrcr.2020.04.015-a.png differ diff --git a/hackathon/bancos/train/COVID/11547_2020_1202_Fig1_HTML-a.png b/hackathon/bancos/train/COVID/11547_2020_1202_Fig1_HTML-a.png new file mode 100644 index 0000000..d1af9b7 Binary files /dev/null and b/hackathon/bancos/train/COVID/11547_2020_1202_Fig1_HTML-a.png differ diff --git a/hackathon/bancos/train/COVID/11547_2020_1203_Fig1_HTML-b.png b/hackathon/bancos/train/COVID/11547_2020_1203_Fig1_HTML-b.png new file mode 100644 index 0000000..3dfbbea Binary files /dev/null and b/hackathon/bancos/train/COVID/11547_2020_1203_Fig1_HTML-b.png differ diff --git a/hackathon/bancos/train/COVID/11547_2020_1203_Fig1_HTML-d.png b/hackathon/bancos/train/COVID/11547_2020_1203_Fig1_HTML-d.png new file mode 100644 index 0000000..27dcb8d Binary files /dev/null and b/hackathon/bancos/train/COVID/11547_2020_1203_Fig1_HTML-d.png differ diff --git a/hackathon/bancos/train/COVID/11547_2020_1203_Fig2_HTML-a.png b/hackathon/bancos/train/COVID/11547_2020_1203_Fig2_HTML-a.png new file mode 100644 index 0000000..a1b5d58 Binary files /dev/null and b/hackathon/bancos/train/COVID/11547_2020_1203_Fig2_HTML-a.png differ diff --git a/hackathon/bancos/train/COVID/1663b242.jpg b/hackathon/bancos/train/COVID/1663b242.jpg new file mode 100644 index 0000000..0738bb9 Binary files /dev/null and b/hackathon/bancos/train/COVID/1663b242.jpg differ diff --git a/hackathon/bancos/train/COVID/16691_1_1.jpg b/hackathon/bancos/train/COVID/16691_1_1.jpg new file mode 100644 index 0000000..656a481 Binary files /dev/null and b/hackathon/bancos/train/COVID/16691_1_1.jpg differ diff --git a/hackathon/bancos/train/COVID/16708_1_1.jpg b/hackathon/bancos/train/COVID/16708_1_1.jpg new file mode 100644 index 0000000..601cf0f Binary files /dev/null and b/hackathon/bancos/train/COVID/16708_1_1.jpg differ diff --git a/hackathon/bancos/train/COVID/16744_1_1.jpg b/hackathon/bancos/train/COVID/16744_1_1.jpg new file mode 100644 index 0000000..66cbcae Binary files /dev/null and b/hackathon/bancos/train/COVID/16744_1_1.jpg differ diff --git a/hackathon/bancos/train/COVID/16858_3_1.png b/hackathon/bancos/train/COVID/16858_3_1.png new file mode 100644 index 0000000..888ecbc Binary files /dev/null and b/hackathon/bancos/train/COVID/16858_3_1.png differ diff --git a/hackathon/bancos/train/COVID/16865_1_1.jpg b/hackathon/bancos/train/COVID/16865_1_1.jpg new file mode 100644 index 0000000..c325c9b Binary files /dev/null and b/hackathon/bancos/train/COVID/16865_1_1.jpg differ diff --git a/hackathon/bancos/train/COVID/16883_1_1.png b/hackathon/bancos/train/COVID/16883_1_1.png new file mode 100644 index 0000000..c808fc7 Binary files /dev/null and b/hackathon/bancos/train/COVID/16883_1_1.png differ diff --git a/hackathon/bancos/train/COVID/16892_2_1.png b/hackathon/bancos/train/COVID/16892_2_1.png new file mode 100644 index 0000000..17e3579 Binary files /dev/null and b/hackathon/bancos/train/COVID/16892_2_1.png differ diff --git a/hackathon/bancos/train/COVID/1d435a4b.jpg b/hackathon/bancos/train/COVID/1d435a4b.jpg new file mode 100644 index 0000000..e8a5374 Binary files /dev/null and b/hackathon/bancos/train/COVID/1d435a4b.jpg differ diff --git a/hackathon/bancos/train/COVID/2.png b/hackathon/bancos/train/COVID/2.png new file mode 100644 index 0000000..9f6206e Binary files /dev/null and b/hackathon/bancos/train/COVID/2.png differ diff --git a/hackathon/bancos/train/COVID/2B8649B2-00C4-4233-85D5-1CE240CF233B.jpeg b/hackathon/bancos/train/COVID/2B8649B2-00C4-4233-85D5-1CE240CF233B.jpeg new file mode 100644 index 0000000..71b2895 Binary files /dev/null and b/hackathon/bancos/train/COVID/2B8649B2-00C4-4233-85D5-1CE240CF233B.jpeg differ diff --git a/hackathon/bancos/train/COVID/2C26F453-AF3B-4517-BB9E-802CF2179543.jpeg b/hackathon/bancos/train/COVID/2C26F453-AF3B-4517-BB9E-802CF2179543.jpeg new file mode 100644 index 0000000..d40c034 Binary files /dev/null and b/hackathon/bancos/train/COVID/2C26F453-AF3B-4517-BB9E-802CF2179543.jpeg differ diff --git a/hackathon/bancos/train/COVID/2cd63b76.jpg b/hackathon/bancos/train/COVID/2cd63b76.jpg new file mode 100644 index 0000000..e5f9b62 Binary files /dev/null and b/hackathon/bancos/train/COVID/2cd63b76.jpg differ diff --git a/hackathon/bancos/train/COVID/333932bd.jpg b/hackathon/bancos/train/COVID/333932bd.jpg new file mode 100644 index 0000000..966ee09 Binary files /dev/null and b/hackathon/bancos/train/COVID/333932bd.jpg differ diff --git a/hackathon/bancos/train/COVID/441c9cdd.jpg b/hackathon/bancos/train/COVID/441c9cdd.jpg new file mode 100644 index 0000000..9396c5a Binary files /dev/null and b/hackathon/bancos/train/COVID/441c9cdd.jpg differ diff --git a/hackathon/bancos/train/COVID/447d65b38231a1031586b304bc5837_jumbo.jpeg b/hackathon/bancos/train/COVID/447d65b38231a1031586b304bc5837_jumbo.jpeg new file mode 100644 index 0000000..6164a40 Binary files /dev/null and b/hackathon/bancos/train/COVID/447d65b38231a1031586b304bc5837_jumbo.jpeg differ diff --git a/hackathon/bancos/train/COVID/50e51fcefaa760d0757eeae6eb0858_jumbo.jpeg b/hackathon/bancos/train/COVID/50e51fcefaa760d0757eeae6eb0858_jumbo.jpeg new file mode 100644 index 0000000..467087b Binary files /dev/null and b/hackathon/bancos/train/COVID/50e51fcefaa760d0757eeae6eb0858_jumbo.jpeg differ diff --git a/hackathon/bancos/train/COVID/5CBC2E94-D358-401E-8928-965CCD965C5C.jpeg b/hackathon/bancos/train/COVID/5CBC2E94-D358-401E-8928-965CCD965C5C.jpeg new file mode 100644 index 0000000..d57eacd Binary files /dev/null and b/hackathon/bancos/train/COVID/5CBC2E94-D358-401E-8928-965CCD965C5C.jpeg differ diff --git a/hackathon/bancos/train/COVID/6C94A287-C059-46A0-8600-AFB95F4727B7.jpeg b/hackathon/bancos/train/COVID/6C94A287-C059-46A0-8600-AFB95F4727B7.jpeg new file mode 100644 index 0000000..1a90711 Binary files /dev/null and b/hackathon/bancos/train/COVID/6C94A287-C059-46A0-8600-AFB95F4727B7.jpeg differ diff --git a/hackathon/bancos/train/COVID/701_2020_4374_Fig2_HTML.png b/hackathon/bancos/train/COVID/701_2020_4374_Fig2_HTML.png new file mode 100644 index 0000000..e2a46dd Binary files /dev/null and b/hackathon/bancos/train/COVID/701_2020_4374_Fig2_HTML.png differ diff --git a/hackathon/bancos/train/COVID/8781ac6b9589f3646d2bbfff8f9015_jumbo.jpeg b/hackathon/bancos/train/COVID/8781ac6b9589f3646d2bbfff8f9015_jumbo.jpeg new file mode 100644 index 0000000..a92d160 Binary files /dev/null and b/hackathon/bancos/train/COVID/8781ac6b9589f3646d2bbfff8f9015_jumbo.jpeg differ diff --git a/hackathon/bancos/train/COVID/87d50e40.jpg b/hackathon/bancos/train/COVID/87d50e40.jpg new file mode 100644 index 0000000..f4d87dc Binary files /dev/null and b/hackathon/bancos/train/COVID/87d50e40.jpg differ diff --git a/hackathon/bancos/train/COVID/88de9d8c39e946abd495b37cd07d89e5-0666-0.jpg b/hackathon/bancos/train/COVID/88de9d8c39e946abd495b37cd07d89e5-0666-0.jpg new file mode 100644 index 0000000..f47d1eb Binary files /dev/null and b/hackathon/bancos/train/COVID/88de9d8c39e946abd495b37cd07d89e5-0666-0.jpg differ diff --git a/hackathon/bancos/train/COVID/88de9d8c39e946abd495b37cd07d89e5-2ee6-0.jpg b/hackathon/bancos/train/COVID/88de9d8c39e946abd495b37cd07d89e5-2ee6-0.jpg new file mode 100644 index 0000000..5168511 Binary files /dev/null and b/hackathon/bancos/train/COVID/88de9d8c39e946abd495b37cd07d89e5-2ee6-0.jpg differ diff --git a/hackathon/bancos/train/COVID/88de9d8c39e946abd495b37cd07d89e5-6531-0.jpg b/hackathon/bancos/train/COVID/88de9d8c39e946abd495b37cd07d89e5-6531-0.jpg new file mode 100644 index 0000000..04b63c3 Binary files /dev/null and b/hackathon/bancos/train/COVID/88de9d8c39e946abd495b37cd07d89e5-6531-0.jpg differ diff --git a/hackathon/bancos/train/COVID/8FDE8DBA-CFBD-4B4C-B1A4-6F36A93B7E87.jpeg b/hackathon/bancos/train/COVID/8FDE8DBA-CFBD-4B4C-B1A4-6F36A93B7E87.jpeg new file mode 100644 index 0000000..036d58d Binary files /dev/null and b/hackathon/bancos/train/COVID/8FDE8DBA-CFBD-4B4C-B1A4-6F36A93B7E87.jpeg differ diff --git a/hackathon/bancos/train/COVID/90070cbc.jpg b/hackathon/bancos/train/COVID/90070cbc.jpg new file mode 100644 index 0000000..522b273 Binary files /dev/null and b/hackathon/bancos/train/COVID/90070cbc.jpg differ diff --git a/hackathon/bancos/train/COVID/90986ce4.jpg b/hackathon/bancos/train/COVID/90986ce4.jpg new file mode 100644 index 0000000..c1be3b4 Binary files /dev/null and b/hackathon/bancos/train/COVID/90986ce4.jpg differ diff --git a/hackathon/bancos/train/COVID/E1724330-1866-4581-8CD8-CEC9B8AFEDDE.jpeg b/hackathon/bancos/train/COVID/E1724330-1866-4581-8CD8-CEC9B8AFEDDE.jpeg new file mode 100644 index 0000000..baeaa34 Binary files /dev/null and b/hackathon/bancos/train/COVID/E1724330-1866-4581-8CD8-CEC9B8AFEDDE.jpeg differ diff --git a/hackathon/bancos/train/COVID/a1fec23b293dfe7876660cb7acce43_jumbo.jpeg b/hackathon/bancos/train/COVID/a1fec23b293dfe7876660cb7acce43_jumbo.jpeg new file mode 100644 index 0000000..dcf64a9 Binary files /dev/null and b/hackathon/bancos/train/COVID/a1fec23b293dfe7876660cb7acce43_jumbo.jpeg differ diff --git a/hackathon/bancos/train/COVID/a47dc73e.jpg b/hackathon/bancos/train/COVID/a47dc73e.jpg new file mode 100644 index 0000000..7278972 Binary files /dev/null and b/hackathon/bancos/train/COVID/a47dc73e.jpg differ diff --git a/hackathon/bancos/train/COVID/all14238-fig-0001-m-c.jpg b/hackathon/bancos/train/COVID/all14238-fig-0001-m-c.jpg new file mode 100644 index 0000000..904cb49 Binary files /dev/null and b/hackathon/bancos/train/COVID/all14238-fig-0001-m-c.jpg differ diff --git a/hackathon/bancos/train/COVID/all14238-fig-0002-m-d.jpg b/hackathon/bancos/train/COVID/all14238-fig-0002-m-d.jpg new file mode 100644 index 0000000..e588991 Binary files /dev/null and b/hackathon/bancos/train/COVID/all14238-fig-0002-m-d.jpg differ diff --git a/hackathon/bancos/train/COVID/all14238-fig-0002-m-e.jpg b/hackathon/bancos/train/COVID/all14238-fig-0002-m-e.jpg new file mode 100644 index 0000000..4a17416 Binary files /dev/null and b/hackathon/bancos/train/COVID/all14238-fig-0002-m-e.jpg differ diff --git a/hackathon/bancos/train/COVID/aqaa062i0002-a.png b/hackathon/bancos/train/COVID/aqaa062i0002-a.png new file mode 100644 index 0000000..901eb6c Binary files /dev/null and b/hackathon/bancos/train/COVID/aqaa062i0002-a.png differ diff --git a/hackathon/bancos/train/COVID/auntminnie-b-2020_01_28_23_51_6665_2020_01_28_Vietnam_coronavirus.jpeg b/hackathon/bancos/train/COVID/auntminnie-b-2020_01_28_23_51_6665_2020_01_28_Vietnam_coronavirus.jpeg new file mode 100644 index 0000000..c7a2e31 Binary files /dev/null and b/hackathon/bancos/train/COVID/auntminnie-b-2020_01_28_23_51_6665_2020_01_28_Vietnam_coronavirus.jpeg differ diff --git a/hackathon/bancos/train/COVID/case_71_figura1.png b/hackathon/bancos/train/COVID/case_71_figura1.png new file mode 100644 index 0000000..4a9f645 Binary files /dev/null and b/hackathon/bancos/train/COVID/case_71_figura1.png differ diff --git a/hackathon/bancos/train/COVID/ciaa199.pdf-001-a.png b/hackathon/bancos/train/COVID/ciaa199.pdf-001-a.png new file mode 100644 index 0000000..da3f4b1 Binary files /dev/null and b/hackathon/bancos/train/COVID/ciaa199.pdf-001-a.png differ diff --git a/hackathon/bancos/train/COVID/covid-19-caso-111-1-21.png b/hackathon/bancos/train/COVID/covid-19-caso-111-1-21.png new file mode 100644 index 0000000..256dd45 Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-caso-111-1-21.png differ diff --git a/hackathon/bancos/train/COVID/covid-19-caso-70-1-PA.jpg b/hackathon/bancos/train/COVID/covid-19-caso-70-1-PA.jpg new file mode 100644 index 0000000..4e72bd5 Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-caso-70-1-PA.jpg differ diff --git a/hackathon/bancos/train/COVID/covid-19-caso-70-2-APS.jpg b/hackathon/bancos/train/COVID/covid-19-caso-70-2-APS.jpg new file mode 100644 index 0000000..de68b1f Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-caso-70-2-APS.jpg differ diff --git a/hackathon/bancos/train/COVID/covid-19-caso-82-1-8.png b/hackathon/bancos/train/COVID/covid-19-caso-82-1-8.png new file mode 100644 index 0000000..6a3b94b Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-caso-82-1-8.png differ diff --git a/hackathon/bancos/train/COVID/covid-19-caso-85-4-6.png b/hackathon/bancos/train/COVID/covid-19-caso-85-4-6.png new file mode 100644 index 0000000..7449351 Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-caso-85-4-6.png differ diff --git a/hackathon/bancos/train/COVID/covid-19-caso-94-1-14.png b/hackathon/bancos/train/COVID/covid-19-caso-94-1-14.png new file mode 100644 index 0000000..316988a Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-caso-94-1-14.png differ diff --git a/hackathon/bancos/train/COVID/covid-19-caso-99-1-19.png b/hackathon/bancos/train/COVID/covid-19-caso-99-1-19.png new file mode 100644 index 0000000..0da9c2c Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-caso-99-1-19.png differ diff --git a/hackathon/bancos/train/COVID/covid-19-infection-exclusive-gastrointestinal-symptoms-pa.png b/hackathon/bancos/train/COVID/covid-19-infection-exclusive-gastrointestinal-symptoms-pa.png new file mode 100644 index 0000000..d4ba511 Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-infection-exclusive-gastrointestinal-symptoms-pa.png differ diff --git a/hackathon/bancos/train/COVID/covid-19-pneumonia-28.png b/hackathon/bancos/train/COVID/covid-19-pneumonia-28.png new file mode 100644 index 0000000..b4a2756 Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-pneumonia-28.png differ diff --git a/hackathon/bancos/train/COVID/covid-19-pneumonia-41-day-2.jpg b/hackathon/bancos/train/COVID/covid-19-pneumonia-41-day-2.jpg new file mode 100644 index 0000000..a4558d6 Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-pneumonia-41-day-2.jpg differ diff --git a/hackathon/bancos/train/COVID/covid-19-pneumonia-49-day8.jpg b/hackathon/bancos/train/COVID/covid-19-pneumonia-49-day8.jpg new file mode 100644 index 0000000..3b2f5cf Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-pneumonia-49-day8.jpg differ diff --git a/hackathon/bancos/train/COVID/covid-19-pneumonia-58-day-3.jpg b/hackathon/bancos/train/COVID/covid-19-pneumonia-58-day-3.jpg new file mode 100644 index 0000000..5fcbeb6 Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-pneumonia-58-day-3.jpg differ diff --git a/hackathon/bancos/train/COVID/covid-19-pneumonia-bilateral.jpg b/hackathon/bancos/train/COVID/covid-19-pneumonia-bilateral.jpg new file mode 100644 index 0000000..f5dad1d Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-pneumonia-bilateral.jpg differ diff --git a/hackathon/bancos/train/COVID/covid-19-pneumonia-evolution-over-a-week-1-day6.jpg b/hackathon/bancos/train/COVID/covid-19-pneumonia-evolution-over-a-week-1-day6.jpg new file mode 100644 index 0000000..af1e13a Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-pneumonia-evolution-over-a-week-1-day6.jpg differ diff --git a/hackathon/bancos/train/COVID/covid-19-pneumonia-progression-and-regression-day28.jpg b/hackathon/bancos/train/COVID/covid-19-pneumonia-progression-and-regression-day28.jpg new file mode 100644 index 0000000..30861d0 Binary files /dev/null and b/hackathon/bancos/train/COVID/covid-19-pneumonia-progression-and-regression-day28.jpg differ diff --git a/hackathon/bancos/train/COVID/d680397c.jpg b/hackathon/bancos/train/COVID/d680397c.jpg new file mode 100644 index 0000000..a13d04e Binary files /dev/null and b/hackathon/bancos/train/COVID/d680397c.jpg differ diff --git a/hackathon/bancos/train/COVID/d7f2ee0f.jpg b/hackathon/bancos/train/COVID/d7f2ee0f.jpg new file mode 100644 index 0000000..96099ee Binary files /dev/null and b/hackathon/bancos/train/COVID/d7f2ee0f.jpg differ diff --git a/hackathon/bancos/train/COVID/f46a9bfc7222e61e099a25ab9267da_jumbo.jpeg b/hackathon/bancos/train/COVID/f46a9bfc7222e61e099a25ab9267da_jumbo.jpeg new file mode 100644 index 0000000..6692968 Binary files /dev/null and b/hackathon/bancos/train/COVID/f46a9bfc7222e61e099a25ab9267da_jumbo.jpeg differ diff --git a/hackathon/bancos/train/COVID/f6575117.jpg b/hackathon/bancos/train/COVID/f6575117.jpg new file mode 100644 index 0000000..524290a Binary files /dev/null and b/hackathon/bancos/train/COVID/f6575117.jpg differ diff --git a/hackathon/bancos/train/COVID/figure1-5e71be566aa8714a04de3386-98-left.jpeg b/hackathon/bancos/train/COVID/figure1-5e71be566aa8714a04de3386-98-left.jpeg new file mode 100644 index 0000000..6dc7665 Binary files /dev/null and b/hackathon/bancos/train/COVID/figure1-5e71be566aa8714a04de3386-98-left.jpeg differ diff --git a/hackathon/bancos/train/COVID/figure1-5e73d7ae897e27ff066a30cb-98.jpeg b/hackathon/bancos/train/COVID/figure1-5e73d7ae897e27ff066a30cb-98.jpeg new file mode 100644 index 0000000..53b864d Binary files /dev/null and b/hackathon/bancos/train/COVID/figure1-5e73d7ae897e27ff066a30cb-98.jpeg differ diff --git a/hackathon/bancos/train/COVID/figure1-5e7c1b8d98c29ab001275405-98.jpeg b/hackathon/bancos/train/COVID/figure1-5e7c1b8d98c29ab001275405-98.jpeg new file mode 100644 index 0000000..4d8f395 Binary files /dev/null and b/hackathon/bancos/train/COVID/figure1-5e7c1b8d98c29ab001275405-98.jpeg differ diff --git a/hackathon/bancos/train/COVID/nejmoa2001191_f1-PA.jpeg b/hackathon/bancos/train/COVID/nejmoa2001191_f1-PA.jpeg new file mode 100644 index 0000000..b6a11a4 Binary files /dev/null and b/hackathon/bancos/train/COVID/nejmoa2001191_f1-PA.jpeg differ diff --git a/hackathon/bancos/train/COVID/nejmoa2004500_f1-b.png b/hackathon/bancos/train/COVID/nejmoa2004500_f1-b.png new file mode 100644 index 0000000..d349efd Binary files /dev/null and b/hackathon/bancos/train/COVID/nejmoa2004500_f1-b.png differ diff --git a/hackathon/bancos/train/COVID/post-intubuation-pneumomediastium-and-pneumothorax-background-covid-19-pneumonia-day6-1.jpg b/hackathon/bancos/train/COVID/post-intubuation-pneumomediastium-and-pneumothorax-background-covid-19-pneumonia-day6-1.jpg new file mode 100644 index 0000000..0326484 Binary files /dev/null and b/hackathon/bancos/train/COVID/post-intubuation-pneumomediastium-and-pneumothorax-background-covid-19-pneumonia-day6-1.jpg differ diff --git a/hackathon/bancos/train/COVID/radiol.2020201160.fig3a.jpeg b/hackathon/bancos/train/COVID/radiol.2020201160.fig3a.jpeg new file mode 100644 index 0000000..e4f8795 Binary files /dev/null and b/hackathon/bancos/train/COVID/radiol.2020201160.fig3a.jpeg differ diff --git a/hackathon/bancos/train/COVID/radiol.2020201160.fig3d.jpeg b/hackathon/bancos/train/COVID/radiol.2020201160.fig3d.jpeg new file mode 100644 index 0000000..4bac464 Binary files /dev/null and b/hackathon/bancos/train/COVID/radiol.2020201160.fig3d.jpeg differ diff --git a/hackathon/bancos/train/COVID/tpmd200203f2-c.png b/hackathon/bancos/train/COVID/tpmd200203f2-c.png new file mode 100644 index 0000000..a4c4293 Binary files /dev/null and b/hackathon/bancos/train/COVID/tpmd200203f2-c.png differ diff --git a/hackathon/bancos/train/COVID/yxppt-2020-02-19_00-51-27_287214-day8.jpg b/hackathon/bancos/train/COVID/yxppt-2020-02-19_00-51-27_287214-day8.jpg new file mode 100644 index 0000000..48885c4 Binary files /dev/null and b/hackathon/bancos/train/COVID/yxppt-2020-02-19_00-51-27_287214-day8.jpg differ diff --git a/hackathon/bancos/train/SANOS/0e0f57c7-7fd2-4d28-bcb8-28ddb072333a.png b/hackathon/bancos/train/SANOS/0e0f57c7-7fd2-4d28-bcb8-28ddb072333a.png new file mode 100644 index 0000000..70aaa1a Binary files /dev/null and b/hackathon/bancos/train/SANOS/0e0f57c7-7fd2-4d28-bcb8-28ddb072333a.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10195.1517875222.579098.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10195.1517875222.579098.png new file mode 100644 index 0000000..384b561 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10195.1517875222.579098.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10267.1517875222.914154.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10267.1517875222.914154.png new file mode 100644 index 0000000..944b5dc Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10267.1517875222.914154.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10380.1517875223.444038.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10380.1517875223.444038.png new file mode 100644 index 0000000..ac4e035 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10380.1517875223.444038.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10710.1517875225.214140.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10710.1517875225.214140.png new file mode 100644 index 0000000..7a83809 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10710.1517875225.214140.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10712.1517875225.224680.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10712.1517875225.224680.png new file mode 100644 index 0000000..290e1ac Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10712.1517875225.224680.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10725.1517875225.308470.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10725.1517875225.308470.png new file mode 100644 index 0000000..bb0e114 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10725.1517875225.308470.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10750.1517875225.455691.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10750.1517875225.455691.png new file mode 100644 index 0000000..3107c2a Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10750.1517875225.455691.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10862.1517875226.16660.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10862.1517875226.16660.png new file mode 100644 index 0000000..3f256ec Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.10862.1517875226.16660.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11152.1517875231.426864.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11152.1517875231.426864.png new file mode 100644 index 0000000..b566dd7 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11152.1517875231.426864.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11179.1517875231.595038.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11179.1517875231.595038.png new file mode 100644 index 0000000..620b558 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11179.1517875231.595038.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11435.1517875232.930413.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11435.1517875232.930413.png new file mode 100644 index 0000000..0805a39 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11435.1517875232.930413.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11497.1517875233.215084.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11497.1517875233.215084.png new file mode 100644 index 0000000..780f4c0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11497.1517875233.215084.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11614.1517875233.931863.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11614.1517875233.931863.png new file mode 100644 index 0000000..e2cb645 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11614.1517875233.931863.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11618.1517875233.948060.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11618.1517875233.948060.png new file mode 100644 index 0000000..dbc3cbd Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11618.1517875233.948060.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11693.1517875234.338316.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11693.1517875234.338316.png new file mode 100644 index 0000000..b322e51 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11693.1517875234.338316.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11882.1517875236.177865.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11882.1517875236.177865.png new file mode 100644 index 0000000..eaf2af5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11882.1517875236.177865.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11917.1517875236.463943.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11917.1517875236.463943.png new file mode 100644 index 0000000..603612d Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11917.1517875236.463943.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11978.1517875236.725141.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11978.1517875236.725141.png new file mode 100644 index 0000000..839f3ef Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.11978.1517875236.725141.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1223.1517875166.847916.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1223.1517875166.847916.png new file mode 100644 index 0000000..84a7c08 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1223.1517875166.847916.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12301.1517875238.453250.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12301.1517875238.453250.png new file mode 100644 index 0000000..933463b Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12301.1517875238.453250.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12318.1517875238.551807.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12318.1517875238.551807.png new file mode 100644 index 0000000..bf9fd16 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12318.1517875238.551807.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12354.1517875238.746738.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12354.1517875238.746738.png new file mode 100644 index 0000000..5b9dc0d Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12354.1517875238.746738.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12362.1517875238.799884.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12362.1517875238.799884.png new file mode 100644 index 0000000..197eb5e Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12362.1517875238.799884.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12493.1517875239.385688.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12493.1517875239.385688.png new file mode 100644 index 0000000..4e467d3 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12493.1517875239.385688.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12789.1517875241.863581.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12789.1517875241.863581.png new file mode 100644 index 0000000..53504d2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12789.1517875241.863581.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12824.1517875242.24774.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12824.1517875242.24774.png new file mode 100644 index 0000000..634ac9a Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12824.1517875242.24774.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12872.1517875242.289734.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12872.1517875242.289734.png new file mode 100644 index 0000000..592c549 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12872.1517875242.289734.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12897.1517875242.426825.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12897.1517875242.426825.png new file mode 100644 index 0000000..2c50aa1 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12897.1517875242.426825.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12987.1517875242.890311.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12987.1517875242.890311.png new file mode 100644 index 0000000..9ae2677 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.12987.1517875242.890311.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13304.1517875244.575626.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13304.1517875244.575626.png new file mode 100644 index 0000000..ee111ee Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13304.1517875244.575626.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13361.1517875244.832027.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13361.1517875244.832027.png new file mode 100644 index 0000000..0daaad3 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13361.1517875244.832027.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13611.1517875246.854664.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13611.1517875246.854664.png new file mode 100644 index 0000000..6490f17 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13611.1517875246.854664.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13709.1517875247.318659.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13709.1517875247.318659.png new file mode 100644 index 0000000..d88af51 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13709.1517875247.318659.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13911.1517875248.626599.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13911.1517875248.626599.png new file mode 100644 index 0000000..79639a7 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.13911.1517875248.626599.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14038.1517875249.271298.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14038.1517875249.271298.png new file mode 100644 index 0000000..5f91f2a Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14038.1517875249.271298.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14083.1517875249.540371.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14083.1517875249.540371.png new file mode 100644 index 0000000..bb0af2a Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14083.1517875249.540371.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14261.1517875250.474127.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14261.1517875250.474127.png new file mode 100644 index 0000000..82e1424 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14261.1517875250.474127.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14334.1517875251.367307.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14334.1517875251.367307.png new file mode 100644 index 0000000..8e3106b Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14334.1517875251.367307.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14400.1517875251.918427.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14400.1517875251.918427.png new file mode 100644 index 0000000..c861fc4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14400.1517875251.918427.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14435.1517875252.97906.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14435.1517875252.97906.png new file mode 100644 index 0000000..4b5819c Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14435.1517875252.97906.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14453.1517875252.188348.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14453.1517875252.188348.png new file mode 100644 index 0000000..a11286a Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14453.1517875252.188348.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14513.1517875252.454722.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14513.1517875252.454722.png new file mode 100644 index 0000000..c3ccfa5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14513.1517875252.454722.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14515.1517875252.471942.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14515.1517875252.471942.png new file mode 100644 index 0000000..8a9918a Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.14515.1517875252.471942.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1461.1517875167.903360.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1461.1517875167.903360.png new file mode 100644 index 0000000..fc95711 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1461.1517875167.903360.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1485.1517875168.41670.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1485.1517875168.41670.png new file mode 100644 index 0000000..3a6c47d Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1485.1517875168.41670.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1505.1517875168.149805.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1505.1517875168.149805.png new file mode 100644 index 0000000..12001e0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1505.1517875168.149805.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1690.1517875168.958183.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1690.1517875168.958183.png new file mode 100644 index 0000000..e38dd77 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1690.1517875168.958183.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1824.1517875169.753287.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1824.1517875169.753287.png new file mode 100644 index 0000000..1711bb0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.1824.1517875169.753287.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2147.1517875171.360386.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2147.1517875171.360386.png new file mode 100644 index 0000000..b285c21 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2147.1517875171.360386.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2340.1517875172.266257.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2340.1517875172.266257.png new file mode 100644 index 0000000..7557e90 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2340.1517875172.266257.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2428.1517875172.652980.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2428.1517875172.652980.png new file mode 100644 index 0000000..9eb8f49 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2428.1517875172.652980.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2453.1517875172.813865.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2453.1517875172.813865.png new file mode 100644 index 0000000..53dd96f Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2453.1517875172.813865.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2457.1517875172.834411.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2457.1517875172.834411.png new file mode 100644 index 0000000..adc8391 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2457.1517875172.834411.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2480.1517875172.971527.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2480.1517875172.971527.png new file mode 100644 index 0000000..42e4169 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2480.1517875172.971527.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2482.1517875172.992788.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2482.1517875172.992788.png new file mode 100644 index 0000000..eabceb5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2482.1517875172.992788.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2529.1517875173.221993.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2529.1517875173.221993.png new file mode 100644 index 0000000..a3b3f45 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2529.1517875173.221993.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2820.1517875174.884740.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2820.1517875174.884740.png new file mode 100644 index 0000000..cd77748 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.2820.1517875174.884740.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31695.1517875156.358341.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31695.1517875156.358341.png new file mode 100644 index 0000000..a18d560 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31695.1517875156.358341.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.3177.1517875176.445287.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.3177.1517875176.445287.png new file mode 100644 index 0000000..a11b37d Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.3177.1517875176.445287.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31823.1517875157.41461.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31823.1517875157.41461.png new file mode 100644 index 0000000..4f0d125 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31823.1517875157.41461.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31860.1517875157.200685.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31860.1517875157.200685.png new file mode 100644 index 0000000..4ae66a0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31860.1517875157.200685.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31892.1517875157.349249.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31892.1517875157.349249.png new file mode 100644 index 0000000..97f9b87 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31892.1517875157.349249.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31924.1517875157.522938.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31924.1517875157.522938.png new file mode 100644 index 0000000..ed77733 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.31924.1517875157.522938.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32034.1517875158.122247.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32034.1517875158.122247.png new file mode 100644 index 0000000..a3e377d Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32034.1517875158.122247.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32070.1517875158.272331.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32070.1517875158.272331.png new file mode 100644 index 0000000..fc31925 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32070.1517875158.272331.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32082.1517875158.341124.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32082.1517875158.341124.png new file mode 100644 index 0000000..c8ddfa5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32082.1517875158.341124.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32310.1517875159.845412.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32310.1517875159.845412.png new file mode 100644 index 0000000..caabe87 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32310.1517875159.845412.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32311.1517875159.954516.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32311.1517875159.954516.png new file mode 100644 index 0000000..2ab3318 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32311.1517875159.954516.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32674.1517875161.744716.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32674.1517875161.744716.png new file mode 100644 index 0000000..effb97f Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32674.1517875161.744716.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32703.1517875161.876097.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32703.1517875161.876097.png new file mode 100644 index 0000000..6786f46 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.32703.1517875161.876097.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.3424.1517875177.790867.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.3424.1517875177.790867.png new file mode 100644 index 0000000..462e95a Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.3424.1517875177.790867.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.3637.1517875178.776612.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.3637.1517875178.776612.png new file mode 100644 index 0000000..44ba1e5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.3637.1517875178.776612.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.367.1517875162.573432.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.367.1517875162.573432.png new file mode 100644 index 0000000..1c11434 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.367.1517875162.573432.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.3858.1517875179.820893.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.3858.1517875179.820893.png new file mode 100644 index 0000000..2e9d61f Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.3858.1517875179.820893.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4004.1517875180.609434.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4004.1517875180.609434.png new file mode 100644 index 0000000..29947bb Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4004.1517875180.609434.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4072.1517875180.971125.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4072.1517875180.971125.png new file mode 100644 index 0000000..5eaae96 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4072.1517875180.971125.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4362.1517875182.469446.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4362.1517875182.469446.png new file mode 100644 index 0000000..787f5b5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4362.1517875182.469446.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4445.1517875182.890975.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4445.1517875182.890975.png new file mode 100644 index 0000000..c46f1ac Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4445.1517875182.890975.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4628.1517875183.816936.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4628.1517875183.816936.png new file mode 100644 index 0000000..3c2fde9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4628.1517875183.816936.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4729.1517875184.343855.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4729.1517875184.343855.png new file mode 100644 index 0000000..9f44c81 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4729.1517875184.343855.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4759.1517875184.635338.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4759.1517875184.635338.png new file mode 100644 index 0000000..fa2a882 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4759.1517875184.635338.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4820.1517875184.975018.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4820.1517875184.975018.png new file mode 100644 index 0000000..b0db7c2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.4820.1517875184.975018.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.5169.1517875186.763360.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.5169.1517875186.763360.png new file mode 100644 index 0000000..7f203b4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.5169.1517875186.763360.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.524.1517875163.298894.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.524.1517875163.298894.png new file mode 100644 index 0000000..7b9689b Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.524.1517875163.298894.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.5268.1517875187.283015.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.5268.1517875187.283015.png new file mode 100644 index 0000000..0d003f9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.5268.1517875187.283015.png differ diff --git a/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.5302.1517875187.529811.png b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.5302.1517875187.529811.png new file mode 100644 index 0000000..d2acc2d Binary files /dev/null and b/hackathon/bancos/train/SANOS/1.2.276.0.7230010.3.1.4.8323329.5302.1517875187.529811.png differ diff --git a/hackathon/bancos/train/SANOS/1d3e4775-9d2c-4e5f-81de-ce29b540a9f7.png b/hackathon/bancos/train/SANOS/1d3e4775-9d2c-4e5f-81de-ce29b540a9f7.png new file mode 100644 index 0000000..59b6a5e Binary files /dev/null and b/hackathon/bancos/train/SANOS/1d3e4775-9d2c-4e5f-81de-ce29b540a9f7.png differ diff --git a/hackathon/bancos/train/SANOS/207560f9-0c11-46f4-b6b3-9ee68a558565.png b/hackathon/bancos/train/SANOS/207560f9-0c11-46f4-b6b3-9ee68a558565.png new file mode 100644 index 0000000..761a71d Binary files /dev/null and b/hackathon/bancos/train/SANOS/207560f9-0c11-46f4-b6b3-9ee68a558565.png differ diff --git a/hackathon/bancos/train/SANOS/21e9c794-01b6-4193-86f5-b07f03323ad3.png b/hackathon/bancos/train/SANOS/21e9c794-01b6-4193-86f5-b07f03323ad3.png new file mode 100644 index 0000000..eaf7b69 Binary files /dev/null and b/hackathon/bancos/train/SANOS/21e9c794-01b6-4193-86f5-b07f03323ad3.png differ diff --git a/hackathon/bancos/train/SANOS/394002c4-8633-4639-a5a0-6bb85e83d2ef.png b/hackathon/bancos/train/SANOS/394002c4-8633-4639-a5a0-6bb85e83d2ef.png new file mode 100644 index 0000000..92f817d Binary files /dev/null and b/hackathon/bancos/train/SANOS/394002c4-8633-4639-a5a0-6bb85e83d2ef.png differ diff --git a/hackathon/bancos/train/SANOS/39ab54cb-9b3f-405c-b4e0-e084a93a87c6.png b/hackathon/bancos/train/SANOS/39ab54cb-9b3f-405c-b4e0-e084a93a87c6.png new file mode 100644 index 0000000..8c107b2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/39ab54cb-9b3f-405c-b4e0-e084a93a87c6.png differ diff --git a/hackathon/bancos/train/SANOS/39ab581e-bbd8-454e-8e32-8384ea206b64.png b/hackathon/bancos/train/SANOS/39ab581e-bbd8-454e-8e32-8384ea206b64.png new file mode 100644 index 0000000..fea93cb Binary files /dev/null and b/hackathon/bancos/train/SANOS/39ab581e-bbd8-454e-8e32-8384ea206b64.png differ diff --git a/hackathon/bancos/train/SANOS/3c0f0186-b2c2-4b74-b6c0-47eaf4a3b47b.png b/hackathon/bancos/train/SANOS/3c0f0186-b2c2-4b74-b6c0-47eaf4a3b47b.png new file mode 100644 index 0000000..1c09a93 Binary files /dev/null and b/hackathon/bancos/train/SANOS/3c0f0186-b2c2-4b74-b6c0-47eaf4a3b47b.png differ diff --git a/hackathon/bancos/train/SANOS/3dae24d1-bf9f-468b-9cfd-4fb768b8eb53.png b/hackathon/bancos/train/SANOS/3dae24d1-bf9f-468b-9cfd-4fb768b8eb53.png new file mode 100644 index 0000000..59afd18 Binary files /dev/null and b/hackathon/bancos/train/SANOS/3dae24d1-bf9f-468b-9cfd-4fb768b8eb53.png differ diff --git a/hackathon/bancos/train/SANOS/43db9133-c2d9-42a9-bf91-2ea2bc256fbb.png b/hackathon/bancos/train/SANOS/43db9133-c2d9-42a9-bf91-2ea2bc256fbb.png new file mode 100644 index 0000000..872b256 Binary files /dev/null and b/hackathon/bancos/train/SANOS/43db9133-c2d9-42a9-bf91-2ea2bc256fbb.png differ diff --git a/hackathon/bancos/train/SANOS/450d51d8-b779-44ee-9ee6-145dbcf55683.png b/hackathon/bancos/train/SANOS/450d51d8-b779-44ee-9ee6-145dbcf55683.png new file mode 100644 index 0000000..a50ff54 Binary files /dev/null and b/hackathon/bancos/train/SANOS/450d51d8-b779-44ee-9ee6-145dbcf55683.png differ diff --git a/hackathon/bancos/train/SANOS/490878a2-3121-4346-bb42-388438010ee3.png b/hackathon/bancos/train/SANOS/490878a2-3121-4346-bb42-388438010ee3.png new file mode 100644 index 0000000..a4cb6bc Binary files /dev/null and b/hackathon/bancos/train/SANOS/490878a2-3121-4346-bb42-388438010ee3.png differ diff --git a/hackathon/bancos/train/SANOS/4999ef1e-b2b5-4ac1-85ad-c082281c0cbe.png b/hackathon/bancos/train/SANOS/4999ef1e-b2b5-4ac1-85ad-c082281c0cbe.png new file mode 100644 index 0000000..d73deeb Binary files /dev/null and b/hackathon/bancos/train/SANOS/4999ef1e-b2b5-4ac1-85ad-c082281c0cbe.png differ diff --git a/hackathon/bancos/train/SANOS/4aaa902f-4a6b-447f-88df-0e186e216e25.png b/hackathon/bancos/train/SANOS/4aaa902f-4a6b-447f-88df-0e186e216e25.png new file mode 100644 index 0000000..fb00062 Binary files /dev/null and b/hackathon/bancos/train/SANOS/4aaa902f-4a6b-447f-88df-0e186e216e25.png differ diff --git a/hackathon/bancos/train/SANOS/4ade4645-44d9-45a1-b574-5d1718c1e76c.png b/hackathon/bancos/train/SANOS/4ade4645-44d9-45a1-b574-5d1718c1e76c.png new file mode 100644 index 0000000..38e5aed Binary files /dev/null and b/hackathon/bancos/train/SANOS/4ade4645-44d9-45a1-b574-5d1718c1e76c.png differ diff --git a/hackathon/bancos/train/SANOS/4e4c8f09-6600-4198-bb73-cbb46a32f771.png b/hackathon/bancos/train/SANOS/4e4c8f09-6600-4198-bb73-cbb46a32f771.png new file mode 100644 index 0000000..f67a518 Binary files /dev/null and b/hackathon/bancos/train/SANOS/4e4c8f09-6600-4198-bb73-cbb46a32f771.png differ diff --git a/hackathon/bancos/train/SANOS/56b59af5-bcfa-4d99-ab3c-3603783851f6.png b/hackathon/bancos/train/SANOS/56b59af5-bcfa-4d99-ab3c-3603783851f6.png new file mode 100644 index 0000000..66b8eae Binary files /dev/null and b/hackathon/bancos/train/SANOS/56b59af5-bcfa-4d99-ab3c-3603783851f6.png differ diff --git a/hackathon/bancos/train/SANOS/58119b67-26c8-4081-9c3e-0339604982cd.png b/hackathon/bancos/train/SANOS/58119b67-26c8-4081-9c3e-0339604982cd.png new file mode 100644 index 0000000..60952ed Binary files /dev/null and b/hackathon/bancos/train/SANOS/58119b67-26c8-4081-9c3e-0339604982cd.png differ diff --git a/hackathon/bancos/train/SANOS/5c88666d-566e-4b2e-a0dd-6ff1b6fe8a63.png b/hackathon/bancos/train/SANOS/5c88666d-566e-4b2e-a0dd-6ff1b6fe8a63.png new file mode 100644 index 0000000..797c368 Binary files /dev/null and b/hackathon/bancos/train/SANOS/5c88666d-566e-4b2e-a0dd-6ff1b6fe8a63.png differ diff --git a/hackathon/bancos/train/SANOS/6099324c-1fef-47a1-9f1b-b2e8f2a110a1.png b/hackathon/bancos/train/SANOS/6099324c-1fef-47a1-9f1b-b2e8f2a110a1.png new file mode 100644 index 0000000..63bee40 Binary files /dev/null and b/hackathon/bancos/train/SANOS/6099324c-1fef-47a1-9f1b-b2e8f2a110a1.png differ diff --git a/hackathon/bancos/train/SANOS/60f096a6-8c30-4796-9592-1ac0d82e9bad.png b/hackathon/bancos/train/SANOS/60f096a6-8c30-4796-9592-1ac0d82e9bad.png new file mode 100644 index 0000000..155f33d Binary files /dev/null and b/hackathon/bancos/train/SANOS/60f096a6-8c30-4796-9592-1ac0d82e9bad.png differ diff --git a/hackathon/bancos/train/SANOS/61bb36ee-8122-492d-ace1-d1abe492bda2.png b/hackathon/bancos/train/SANOS/61bb36ee-8122-492d-ace1-d1abe492bda2.png new file mode 100644 index 0000000..790b26b Binary files /dev/null and b/hackathon/bancos/train/SANOS/61bb36ee-8122-492d-ace1-d1abe492bda2.png differ diff --git a/hackathon/bancos/train/SANOS/61e09ab3-94a9-46a7-bd05-6457a35f78d7.png b/hackathon/bancos/train/SANOS/61e09ab3-94a9-46a7-bd05-6457a35f78d7.png new file mode 100644 index 0000000..c22a1fc Binary files /dev/null and b/hackathon/bancos/train/SANOS/61e09ab3-94a9-46a7-bd05-6457a35f78d7.png differ diff --git a/hackathon/bancos/train/SANOS/6292f3d6-392c-4a60-8b6e-57b0bda52429.png b/hackathon/bancos/train/SANOS/6292f3d6-392c-4a60-8b6e-57b0bda52429.png new file mode 100644 index 0000000..74e34bb Binary files /dev/null and b/hackathon/bancos/train/SANOS/6292f3d6-392c-4a60-8b6e-57b0bda52429.png differ diff --git a/hackathon/bancos/train/SANOS/651be07e-374b-49b9-b062-be338b0db63c.png b/hackathon/bancos/train/SANOS/651be07e-374b-49b9-b062-be338b0db63c.png new file mode 100644 index 0000000..ea202ed Binary files /dev/null and b/hackathon/bancos/train/SANOS/651be07e-374b-49b9-b062-be338b0db63c.png differ diff --git a/hackathon/bancos/train/SANOS/691f5a2a-73e9-40b2-aa76-aac6ee7e0b2d.png b/hackathon/bancos/train/SANOS/691f5a2a-73e9-40b2-aa76-aac6ee7e0b2d.png new file mode 100644 index 0000000..d3ed90e Binary files /dev/null and b/hackathon/bancos/train/SANOS/691f5a2a-73e9-40b2-aa76-aac6ee7e0b2d.png differ diff --git a/hackathon/bancos/train/SANOS/699e4f22-4860-407b-a380-61ed56827fa5.png b/hackathon/bancos/train/SANOS/699e4f22-4860-407b-a380-61ed56827fa5.png new file mode 100644 index 0000000..9234b0a Binary files /dev/null and b/hackathon/bancos/train/SANOS/699e4f22-4860-407b-a380-61ed56827fa5.png differ diff --git a/hackathon/bancos/train/SANOS/69e38864-ac4e-4475-b29c-b48462d16b35.png b/hackathon/bancos/train/SANOS/69e38864-ac4e-4475-b29c-b48462d16b35.png new file mode 100644 index 0000000..8e1360a Binary files /dev/null and b/hackathon/bancos/train/SANOS/69e38864-ac4e-4475-b29c-b48462d16b35.png differ diff --git a/hackathon/bancos/train/SANOS/6a37b9f8-d542-4c2d-aa3f-a81104df4bc4.png b/hackathon/bancos/train/SANOS/6a37b9f8-d542-4c2d-aa3f-a81104df4bc4.png new file mode 100644 index 0000000..bd63dbe Binary files /dev/null and b/hackathon/bancos/train/SANOS/6a37b9f8-d542-4c2d-aa3f-a81104df4bc4.png differ diff --git a/hackathon/bancos/train/SANOS/6bdde7fd-1ec2-4ae0-9f50-43d2f072bd72.png b/hackathon/bancos/train/SANOS/6bdde7fd-1ec2-4ae0-9f50-43d2f072bd72.png new file mode 100644 index 0000000..d24dc5a Binary files /dev/null and b/hackathon/bancos/train/SANOS/6bdde7fd-1ec2-4ae0-9f50-43d2f072bd72.png differ diff --git a/hackathon/bancos/train/SANOS/793afb6f-89d5-4148-8342-819c2e559a82.png b/hackathon/bancos/train/SANOS/793afb6f-89d5-4148-8342-819c2e559a82.png new file mode 100644 index 0000000..4ff9efe Binary files /dev/null and b/hackathon/bancos/train/SANOS/793afb6f-89d5-4148-8342-819c2e559a82.png differ diff --git a/hackathon/bancos/train/SANOS/79f85434-48b2-4910-b861-bdd0e3f7d042.png b/hackathon/bancos/train/SANOS/79f85434-48b2-4910-b861-bdd0e3f7d042.png new file mode 100644 index 0000000..06955b5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/79f85434-48b2-4910-b861-bdd0e3f7d042.png differ diff --git a/hackathon/bancos/train/SANOS/7ca28929-8937-41fb-a34b-15bb6f150cf1.png b/hackathon/bancos/train/SANOS/7ca28929-8937-41fb-a34b-15bb6f150cf1.png new file mode 100644 index 0000000..dd4c85b Binary files /dev/null and b/hackathon/bancos/train/SANOS/7ca28929-8937-41fb-a34b-15bb6f150cf1.png differ diff --git a/hackathon/bancos/train/SANOS/80f4ae7c-9523-46ec-93ac-592415eb4748.png b/hackathon/bancos/train/SANOS/80f4ae7c-9523-46ec-93ac-592415eb4748.png new file mode 100644 index 0000000..7450bc9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/80f4ae7c-9523-46ec-93ac-592415eb4748.png differ diff --git a/hackathon/bancos/train/SANOS/87997557-f548-49b5-b779-ef299507bc6c.png b/hackathon/bancos/train/SANOS/87997557-f548-49b5-b779-ef299507bc6c.png new file mode 100644 index 0000000..aacee28 Binary files /dev/null and b/hackathon/bancos/train/SANOS/87997557-f548-49b5-b779-ef299507bc6c.png differ diff --git a/hackathon/bancos/train/SANOS/89c12318-d65a-4b6e-8d4c-23237c2a0630.png b/hackathon/bancos/train/SANOS/89c12318-d65a-4b6e-8d4c-23237c2a0630.png new file mode 100644 index 0000000..b3630f6 Binary files /dev/null and b/hackathon/bancos/train/SANOS/89c12318-d65a-4b6e-8d4c-23237c2a0630.png differ diff --git a/hackathon/bancos/train/SANOS/8ac92a3d-6fe9-45d6-ba9b-a860abe38f83.png b/hackathon/bancos/train/SANOS/8ac92a3d-6fe9-45d6-ba9b-a860abe38f83.png new file mode 100644 index 0000000..b287098 Binary files /dev/null and b/hackathon/bancos/train/SANOS/8ac92a3d-6fe9-45d6-ba9b-a860abe38f83.png differ diff --git a/hackathon/bancos/train/SANOS/8ddb703e-4cbf-4570-8395-70d0c4b7fff0.png b/hackathon/bancos/train/SANOS/8ddb703e-4cbf-4570-8395-70d0c4b7fff0.png new file mode 100644 index 0000000..24a0b83 Binary files /dev/null and b/hackathon/bancos/train/SANOS/8ddb703e-4cbf-4570-8395-70d0c4b7fff0.png differ diff --git a/hackathon/bancos/train/SANOS/9026b542-0d53-4df4-95a7-17182000c372.png b/hackathon/bancos/train/SANOS/9026b542-0d53-4df4-95a7-17182000c372.png new file mode 100644 index 0000000..50d2d00 Binary files /dev/null and b/hackathon/bancos/train/SANOS/9026b542-0d53-4df4-95a7-17182000c372.png differ diff --git a/hackathon/bancos/train/SANOS/90849bf6-c078-47c5-a407-1e3fe1d006e5.png b/hackathon/bancos/train/SANOS/90849bf6-c078-47c5-a407-1e3fe1d006e5.png new file mode 100644 index 0000000..52cc2d0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/90849bf6-c078-47c5-a407-1e3fe1d006e5.png differ diff --git a/hackathon/bancos/train/SANOS/919a3ffe-97fa-44dd-8347-63b66964dbb5.png b/hackathon/bancos/train/SANOS/919a3ffe-97fa-44dd-8347-63b66964dbb5.png new file mode 100644 index 0000000..244424e Binary files /dev/null and b/hackathon/bancos/train/SANOS/919a3ffe-97fa-44dd-8347-63b66964dbb5.png differ diff --git a/hackathon/bancos/train/SANOS/92c10f10-30ce-4da4-8c80-0610a0647d07.png b/hackathon/bancos/train/SANOS/92c10f10-30ce-4da4-8c80-0610a0647d07.png new file mode 100644 index 0000000..2282dfd Binary files /dev/null and b/hackathon/bancos/train/SANOS/92c10f10-30ce-4da4-8c80-0610a0647d07.png differ diff --git a/hackathon/bancos/train/SANOS/934d2f15-76ae-4a2c-817f-a3b022b0cc10.png b/hackathon/bancos/train/SANOS/934d2f15-76ae-4a2c-817f-a3b022b0cc10.png new file mode 100644 index 0000000..f00184e Binary files /dev/null and b/hackathon/bancos/train/SANOS/934d2f15-76ae-4a2c-817f-a3b022b0cc10.png differ diff --git a/hackathon/bancos/train/SANOS/93ababba-31c5-4015-ac19-cd98d51651bc.png b/hackathon/bancos/train/SANOS/93ababba-31c5-4015-ac19-cd98d51651bc.png new file mode 100644 index 0000000..1381867 Binary files /dev/null and b/hackathon/bancos/train/SANOS/93ababba-31c5-4015-ac19-cd98d51651bc.png differ diff --git a/hackathon/bancos/train/SANOS/957f244a-9680-40f3-8b04-367fcad6e6dc.png b/hackathon/bancos/train/SANOS/957f244a-9680-40f3-8b04-367fcad6e6dc.png new file mode 100644 index 0000000..0e762a0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/957f244a-9680-40f3-8b04-367fcad6e6dc.png differ diff --git a/hackathon/bancos/train/SANOS/95bf4dfe-d99f-48d6-888f-14be370fd736.png b/hackathon/bancos/train/SANOS/95bf4dfe-d99f-48d6-888f-14be370fd736.png new file mode 100644 index 0000000..5715187 Binary files /dev/null and b/hackathon/bancos/train/SANOS/95bf4dfe-d99f-48d6-888f-14be370fd736.png differ diff --git a/hackathon/bancos/train/SANOS/9606743a-92fc-4da0-979e-a8a6d21c0ad7.png b/hackathon/bancos/train/SANOS/9606743a-92fc-4da0-979e-a8a6d21c0ad7.png new file mode 100644 index 0000000..3dc97e6 Binary files /dev/null and b/hackathon/bancos/train/SANOS/9606743a-92fc-4da0-979e-a8a6d21c0ad7.png differ diff --git a/hackathon/bancos/train/SANOS/98e9931d-aac7-43d5-abc6-33cfc6582861.png b/hackathon/bancos/train/SANOS/98e9931d-aac7-43d5-abc6-33cfc6582861.png new file mode 100644 index 0000000..0b04971 Binary files /dev/null and b/hackathon/bancos/train/SANOS/98e9931d-aac7-43d5-abc6-33cfc6582861.png differ diff --git a/hackathon/bancos/train/SANOS/99cb86f4-ff46-4d92-86b5-e3b08e0016b4.png b/hackathon/bancos/train/SANOS/99cb86f4-ff46-4d92-86b5-e3b08e0016b4.png new file mode 100644 index 0000000..18ddad3 Binary files /dev/null and b/hackathon/bancos/train/SANOS/99cb86f4-ff46-4d92-86b5-e3b08e0016b4.png differ diff --git a/hackathon/bancos/train/SANOS/9d0cbf60-07ab-4621-950a-9ee60910d2aa.png b/hackathon/bancos/train/SANOS/9d0cbf60-07ab-4621-950a-9ee60910d2aa.png new file mode 100644 index 0000000..fadffc2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/9d0cbf60-07ab-4621-950a-9ee60910d2aa.png differ diff --git a/hackathon/bancos/train/SANOS/9f08094e-9855-45c7-ac2b-1375e23f6b2f.png b/hackathon/bancos/train/SANOS/9f08094e-9855-45c7-ac2b-1375e23f6b2f.png new file mode 100644 index 0000000..dafb5c7 Binary files /dev/null and b/hackathon/bancos/train/SANOS/9f08094e-9855-45c7-ac2b-1375e23f6b2f.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0014_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0014_0.png new file mode 100644 index 0000000..61d539a Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0014_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0021_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0021_0.png new file mode 100644 index 0000000..6e7ba60 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0021_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0024_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0024_0.png new file mode 100644 index 0000000..a9e4412 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0024_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0026_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0026_0.png new file mode 100644 index 0000000..9aa07b8 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0026_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0046_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0046_0.png new file mode 100644 index 0000000..dd5569d Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0046_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0047_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0047_0.png new file mode 100644 index 0000000..fe97193 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0047_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0048_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0048_0.png new file mode 100644 index 0000000..105046d Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0048_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0051_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0051_0.png new file mode 100644 index 0000000..7e3efce Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0051_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0054_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0054_0.png new file mode 100644 index 0000000..c50bee5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0054_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0063_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0063_0.png new file mode 100644 index 0000000..532a3e1 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0063_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0066_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0066_0.png new file mode 100644 index 0000000..5ee7f98 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0066_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0077_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0077_0.png new file mode 100644 index 0000000..793d9fd Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0077_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0080_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0080_0.png new file mode 100644 index 0000000..ff6fa9a Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0080_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0082_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0082_0.png new file mode 100644 index 0000000..e71d1ca Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0082_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0083_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0083_0.png new file mode 100644 index 0000000..e29cc57 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0083_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0090_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0090_0.png new file mode 100644 index 0000000..8cff022 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0090_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0106_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0106_0.png new file mode 100644 index 0000000..37eb762 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0106_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0108_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0108_0.png new file mode 100644 index 0000000..f23e96c Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0108_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0112_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0112_0.png new file mode 100644 index 0000000..12b1aee Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0112_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0121_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0121_0.png new file mode 100644 index 0000000..5eacbd7 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0121_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0122_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0122_0.png new file mode 100644 index 0000000..07393f2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0122_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0123_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0123_0.png new file mode 100644 index 0000000..8cb9ece Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0123_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0124_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0124_0.png new file mode 100644 index 0000000..11333ea Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0124_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0126_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0126_0.png new file mode 100644 index 0000000..6c115d4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0126_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0135_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0135_0.png new file mode 100644 index 0000000..cad61f2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0135_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0149_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0149_0.png new file mode 100644 index 0000000..38596eb Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0149_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0151_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0151_0.png new file mode 100644 index 0000000..9579fa3 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0151_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0152_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0152_0.png new file mode 100644 index 0000000..c1377a7 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0152_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0154_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0154_0.png new file mode 100644 index 0000000..8182e10 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0154_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0158_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0158_0.png new file mode 100644 index 0000000..dd0427a Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0158_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0177_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0177_0.png new file mode 100644 index 0000000..b0a6f30 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0177_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0179_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0179_0.png new file mode 100644 index 0000000..365cdba Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0179_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0189_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0189_0.png new file mode 100644 index 0000000..b61c59d Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0189_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0198_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0198_0.png new file mode 100644 index 0000000..1e1a099 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0198_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0210_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0210_0.png new file mode 100644 index 0000000..3437db9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0210_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0215_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0215_0.png new file mode 100644 index 0000000..b4978ef Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0215_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0217_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0217_0.png new file mode 100644 index 0000000..e5e9dd5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0217_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0227_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0227_0.png new file mode 100644 index 0000000..a4480f3 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0227_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0231_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0231_0.png new file mode 100644 index 0000000..3b0d5c3 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0231_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0232_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0232_0.png new file mode 100644 index 0000000..e9cdcbe Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0232_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0235_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0235_0.png new file mode 100644 index 0000000..7597da4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0235_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0236_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0236_0.png new file mode 100644 index 0000000..bf74c8b Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0236_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0237_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0237_0.png new file mode 100644 index 0000000..edbdc9d Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0237_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0238_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0238_0.png new file mode 100644 index 0000000..fc3d732 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0238_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0242_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0242_0.png new file mode 100644 index 0000000..83b7193 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0242_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0243_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0243_0.png new file mode 100644 index 0000000..9b4c7b4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0243_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0244_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0244_0.png new file mode 100644 index 0000000..fecfe21 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0244_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0252_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0252_0.png new file mode 100644 index 0000000..16318e9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0252_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0257_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0257_0.png new file mode 100644 index 0000000..217a10a Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0257_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0264_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0264_0.png new file mode 100644 index 0000000..ebc4dfa Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0264_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0268_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0268_0.png new file mode 100644 index 0000000..a5a794b Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0268_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0273_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0273_0.png new file mode 100644 index 0000000..ae61698 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0273_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0276_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0276_0.png new file mode 100644 index 0000000..6af8a10 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0276_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0277_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0277_0.png new file mode 100644 index 0000000..ead79e7 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0277_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0279_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0279_0.png new file mode 100644 index 0000000..584ebe6 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0279_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0280_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0280_0.png new file mode 100644 index 0000000..9344601 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0280_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0282_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0282_0.png new file mode 100644 index 0000000..1719b49 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0282_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0283_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0283_0.png new file mode 100644 index 0000000..989a980 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0283_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0285_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0285_0.png new file mode 100644 index 0000000..bb6cdb2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0285_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0301_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0301_0.png new file mode 100644 index 0000000..f03f9d3 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0301_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0305_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0305_0.png new file mode 100644 index 0000000..b27f104 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0305_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0310_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0310_0.png new file mode 100644 index 0000000..a098f03 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0310_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0314_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0314_0.png new file mode 100644 index 0000000..87c5737 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0314_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0318_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0318_0.png new file mode 100644 index 0000000..5c3ca57 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0318_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0322_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0322_0.png new file mode 100644 index 0000000..4ea6161 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0322_0.png differ diff --git a/hackathon/bancos/train/SANOS/CHNCXR_0326_0.png b/hackathon/bancos/train/SANOS/CHNCXR_0326_0.png new file mode 100644 index 0000000..75913a4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/CHNCXR_0326_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0017_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0017_0.png new file mode 100644 index 0000000..98d526e Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0017_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0027_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0027_0.png new file mode 100644 index 0000000..4edf71f Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0027_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0028_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0028_0.png new file mode 100644 index 0000000..fc8611b Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0028_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0030_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0030_0.png new file mode 100644 index 0000000..f92dcc7 Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0030_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0040_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0040_0.png new file mode 100644 index 0000000..42553fc Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0040_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0044_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0044_0.png new file mode 100644 index 0000000..868cf26 Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0044_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0062_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0062_0.png new file mode 100644 index 0000000..806b928 Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0062_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0070_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0070_0.png new file mode 100644 index 0000000..9be06c4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0070_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0071_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0071_0.png new file mode 100644 index 0000000..ca7eec3 Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0071_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0075_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0075_0.png new file mode 100644 index 0000000..d8b2203 Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0075_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0079_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0079_0.png new file mode 100644 index 0000000..6d77348 Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0079_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0080_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0080_0.png new file mode 100644 index 0000000..63905c2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0080_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0081_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0081_0.png new file mode 100644 index 0000000..fe1ba79 Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0081_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0089_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0089_0.png new file mode 100644 index 0000000..52d2b88 Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0089_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0091_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0091_0.png new file mode 100644 index 0000000..78e9cc9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0091_0.png differ diff --git a/hackathon/bancos/train/SANOS/MCUCXR_0103_0.png b/hackathon/bancos/train/SANOS/MCUCXR_0103_0.png new file mode 100644 index 0000000..4fa4ed8 Binary files /dev/null and b/hackathon/bancos/train/SANOS/MCUCXR_0103_0.png differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1049278-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1049278-0001.jpeg new file mode 100644 index 0000000..6d0c7ab Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1049278-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1110860-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1110860-0001.jpeg new file mode 100644 index 0000000..69126f2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1110860-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-11419-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-11419-0001.jpeg new file mode 100644 index 0000000..fcc91db Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-11419-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-115218-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-115218-0001.jpeg new file mode 100644 index 0000000..4b317da Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-115218-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1160949-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1160949-0001.jpeg new file mode 100644 index 0000000..33e726b Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1160949-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1212407-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1212407-0001.jpeg new file mode 100644 index 0000000..2c2a7dc Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1212407-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1228182-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1228182-0001.jpeg new file mode 100644 index 0000000..9524cd9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1228182-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1283091-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1283091-0001.jpeg new file mode 100644 index 0000000..3fcfbe6 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1283091-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1318320-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1318320-0001.jpeg new file mode 100644 index 0000000..9951bd6 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1318320-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1368583-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1368583-0001.jpeg new file mode 100644 index 0000000..d03189d Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1368583-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1430636-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1430636-0001.jpeg new file mode 100644 index 0000000..035f8f4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1430636-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1520670-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1520670-0001.jpeg new file mode 100644 index 0000000..c2c80eb Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1520670-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-152130-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-152130-0001.jpeg new file mode 100644 index 0000000..8252410 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-152130-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-159472-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-159472-0001.jpeg new file mode 100644 index 0000000..9fd90c0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-159472-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1608079-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1608079-0001.jpeg new file mode 100644 index 0000000..0e817e6 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1608079-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1627110-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1627110-0001.jpeg new file mode 100644 index 0000000..93f33ac Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1627110-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1698651-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1698651-0001.jpeg new file mode 100644 index 0000000..11c27e1 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1698651-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-171327-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-171327-0001.jpeg new file mode 100644 index 0000000..5f1c8b7 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-171327-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1759114-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1759114-0001.jpeg new file mode 100644 index 0000000..a2b80ea Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1759114-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1763721-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1763721-0001.jpeg new file mode 100644 index 0000000..cb192bb Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1763721-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1768815-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1768815-0001.jpeg new file mode 100644 index 0000000..a332f84 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1768815-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1771524-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1771524-0001.jpeg new file mode 100644 index 0000000..6a275b8 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1771524-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1784004-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1784004-0001.jpeg new file mode 100644 index 0000000..b4d288e Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1784004-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1803887-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1803887-0001.jpeg new file mode 100644 index 0000000..29cceaf Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1803887-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1858497-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1858497-0001.jpeg new file mode 100644 index 0000000..f18d6b9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1858497-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-186900-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-186900-0001.jpeg new file mode 100644 index 0000000..511fec2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-186900-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1931427-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1931427-0001.jpeg new file mode 100644 index 0000000..2cf4d38 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1931427-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-1944537-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-1944537-0001.jpeg new file mode 100644 index 0000000..8ebfb91 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-1944537-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2107985-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2107985-0001.jpeg new file mode 100644 index 0000000..251c1c0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2107985-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2123652-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2123652-0001.jpeg new file mode 100644 index 0000000..7bd385c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2123652-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2162145-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2162145-0001.jpeg new file mode 100644 index 0000000..67dc711 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2162145-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-217318-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-217318-0001.jpeg new file mode 100644 index 0000000..4b13be4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-217318-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2233350-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2233350-0001.jpeg new file mode 100644 index 0000000..3a6659c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2233350-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2256620-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2256620-0001.jpeg new file mode 100644 index 0000000..5781256 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2256620-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2274324-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2274324-0001.jpeg new file mode 100644 index 0000000..921b13d Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2274324-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2280080-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2280080-0001.jpeg new file mode 100644 index 0000000..c74bcde Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2280080-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2298727-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2298727-0001.jpeg new file mode 100644 index 0000000..cff2a87 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2298727-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2403676-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2403676-0001.jpeg new file mode 100644 index 0000000..3cbf5e4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2403676-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2477476-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2477476-0001.jpeg new file mode 100644 index 0000000..57c5684 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2477476-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2514572-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2514572-0001.jpeg new file mode 100644 index 0000000..73c0b9b Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2514572-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2578531-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2578531-0001.jpeg new file mode 100644 index 0000000..9d30d91 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2578531-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2704875-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2704875-0001.jpeg new file mode 100644 index 0000000..bf5f881 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2704875-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2728578-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2728578-0001.jpeg new file mode 100644 index 0000000..026d4a2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2728578-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2771774-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2771774-0001.jpeg new file mode 100644 index 0000000..f120504 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2771774-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2798826-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2798826-0001.jpeg new file mode 100644 index 0000000..ad6670c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2798826-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-283245-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-283245-0001.jpeg new file mode 100644 index 0000000..5743377 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-283245-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-284601-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-284601-0001.jpeg new file mode 100644 index 0000000..907fb94 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-284601-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2850034-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2850034-0001.jpeg new file mode 100644 index 0000000..8d2b44c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2850034-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2862975-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2862975-0001.jpeg new file mode 100644 index 0000000..b4b995b Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2862975-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2870844-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2870844-0001.jpeg new file mode 100644 index 0000000..7a7dff5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2870844-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2924895-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2924895-0001.jpeg new file mode 100644 index 0000000..db2d09e Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2924895-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-2959018-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-2959018-0001.jpeg new file mode 100644 index 0000000..b2a2525 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-2959018-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3065672-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3065672-0001.jpeg new file mode 100644 index 0000000..145ee89 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3065672-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3098476-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3098476-0001.jpeg new file mode 100644 index 0000000..350a860 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3098476-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3117193-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3117193-0001.jpeg new file mode 100644 index 0000000..45b0fd0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3117193-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3170711-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3170711-0001.jpeg new file mode 100644 index 0000000..ed8e28b Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3170711-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3189250-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3189250-0001.jpeg new file mode 100644 index 0000000..37ac242 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3189250-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3267425-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3267425-0001.jpeg new file mode 100644 index 0000000..308cd20 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3267425-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3293997-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3293997-0001.jpeg new file mode 100644 index 0000000..edcee6c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3293997-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3322209-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3322209-0001.jpeg new file mode 100644 index 0000000..ef6b8ab Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3322209-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3346259-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3346259-0001.jpeg new file mode 100644 index 0000000..a4da782 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3346259-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3395085-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3395085-0001.jpeg new file mode 100644 index 0000000..1c4cd20 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3395085-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3396581-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3396581-0001.jpeg new file mode 100644 index 0000000..b260eae Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3396581-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3397442-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3397442-0001.jpeg new file mode 100644 index 0000000..845af65 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3397442-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3437568-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3437568-0001.jpeg new file mode 100644 index 0000000..da8ac49 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3437568-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3459196-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3459196-0001.jpeg new file mode 100644 index 0000000..0c21e2a Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3459196-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3464500-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3464500-0001.jpeg new file mode 100644 index 0000000..1245c53 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3464500-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3464500-0002.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3464500-0002.jpeg new file mode 100644 index 0000000..ebdc4e6 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3464500-0002.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3464500-0003.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3464500-0003.jpeg new file mode 100644 index 0000000..a561637 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3464500-0003.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3487620-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3487620-0001.jpeg new file mode 100644 index 0000000..7af51df Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3487620-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3518268-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3518268-0001.jpeg new file mode 100644 index 0000000..498dc4c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3518268-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3549035-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3549035-0001.jpeg new file mode 100644 index 0000000..dc42e69 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3549035-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3564811-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3564811-0001.jpeg new file mode 100644 index 0000000..b9031fc Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3564811-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3624496-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3624496-0001.jpeg new file mode 100644 index 0000000..2953c17 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3624496-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3686746-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3686746-0001.jpeg new file mode 100644 index 0000000..bb5c61e Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3686746-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3733696-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3733696-0001.jpeg new file mode 100644 index 0000000..cbe746d Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3733696-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3782395-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3782395-0001.jpeg new file mode 100644 index 0000000..3eff598 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3782395-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3837280-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3837280-0001.jpeg new file mode 100644 index 0000000..cfad9fe Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3837280-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3921425-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3921425-0001.jpeg new file mode 100644 index 0000000..b12f35c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3921425-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3937418-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3937418-0001.jpeg new file mode 100644 index 0000000..1f9c688 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3937418-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3983280-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3983280-0001.jpeg new file mode 100644 index 0000000..0945a1c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3983280-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-3985743-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-3985743-0001.jpeg new file mode 100644 index 0000000..38623da Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-3985743-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4172448-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4172448-0001.jpeg new file mode 100644 index 0000000..7163619 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4172448-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4190414-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4190414-0001.jpeg new file mode 100644 index 0000000..39f829d Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4190414-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4196521-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4196521-0001.jpeg new file mode 100644 index 0000000..78c14ea Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4196521-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4315572-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4315572-0001.jpeg new file mode 100644 index 0000000..6a2ecb6 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4315572-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4340661-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4340661-0001.jpeg new file mode 100644 index 0000000..5c13722 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4340661-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4363211-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4363211-0001.jpeg new file mode 100644 index 0000000..c33a6bd Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4363211-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4511610-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4511610-0001.jpeg new file mode 100644 index 0000000..4101777 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4511610-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4512-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4512-0001.jpeg new file mode 100644 index 0000000..5546105 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4512-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4513268-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4513268-0001.jpeg new file mode 100644 index 0000000..fb601af Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4513268-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4534031-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4534031-0001.jpeg new file mode 100644 index 0000000..6d44fa2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4534031-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4675782-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4675782-0001.jpeg new file mode 100644 index 0000000..b773f90 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4675782-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-472699-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-472699-0001.jpeg new file mode 100644 index 0000000..8eb71b0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-472699-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4766279-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4766279-0001.jpeg new file mode 100644 index 0000000..00dbf76 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4766279-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4834475-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4834475-0001.jpeg new file mode 100644 index 0000000..9085bc2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4834475-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4852815-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4852815-0001.jpeg new file mode 100644 index 0000000..c2959da Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4852815-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4886177-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4886177-0001.jpeg new file mode 100644 index 0000000..0f056a7 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4886177-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4906464-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4906464-0001.jpeg new file mode 100644 index 0000000..0d9494b Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4906464-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4911367-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4911367-0001.jpeg new file mode 100644 index 0000000..d157856 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4911367-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4921478-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4921478-0001.jpeg new file mode 100644 index 0000000..df385ee Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4921478-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-4955194-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-4955194-0001.jpeg new file mode 100644 index 0000000..c508959 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-4955194-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5083836-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5083836-0001.jpeg new file mode 100644 index 0000000..d5d272c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5083836-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5148117-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5148117-0001.jpeg new file mode 100644 index 0000000..155c4ef Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5148117-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5175014-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5175014-0001.jpeg new file mode 100644 index 0000000..c8e131a Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5175014-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5180957-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5180957-0001.jpeg new file mode 100644 index 0000000..1289dc2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5180957-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5200363-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5200363-0001.jpeg new file mode 100644 index 0000000..b66d658 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5200363-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-520267-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-520267-0001.jpeg new file mode 100644 index 0000000..5c89b25 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-520267-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-522391-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-522391-0001.jpeg new file mode 100644 index 0000000..e2df3e4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-522391-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-528189-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-528189-0001.jpeg new file mode 100644 index 0000000..99eb96f Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-528189-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5349917-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5349917-0001.jpeg new file mode 100644 index 0000000..d4018cf Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5349917-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5356114-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5356114-0001.jpeg new file mode 100644 index 0000000..4b17a8f Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5356114-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5388550-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5388550-0001.jpeg new file mode 100644 index 0000000..b51db04 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5388550-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5401638-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5401638-0001.jpeg new file mode 100644 index 0000000..7e832e5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5401638-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5402107-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5402107-0001.jpeg new file mode 100644 index 0000000..8566dc9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5402107-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-541071-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-541071-0001.jpeg new file mode 100644 index 0000000..d1f4be0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-541071-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5423277-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5423277-0001.jpeg new file mode 100644 index 0000000..8cb7da0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5423277-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5425295-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5425295-0001.jpeg new file mode 100644 index 0000000..fd54fa9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5425295-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5459424-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5459424-0001.jpeg new file mode 100644 index 0000000..6d40478 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5459424-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5472638-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5472638-0001.jpeg new file mode 100644 index 0000000..5ffd571 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5472638-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5487025-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5487025-0001.jpeg new file mode 100644 index 0000000..254348f Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5487025-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5498455-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5498455-0001.jpeg new file mode 100644 index 0000000..ba82c18 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5498455-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5511958-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5511958-0001.jpeg new file mode 100644 index 0000000..d555e91 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5511958-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5513974-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5513974-0001.jpeg new file mode 100644 index 0000000..5302f05 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5513974-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5538803-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5538803-0001.jpeg new file mode 100644 index 0000000..130dd4e Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5538803-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5545906-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5545906-0001.jpeg new file mode 100644 index 0000000..3721f17 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5545906-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5578360-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5578360-0001.jpeg new file mode 100644 index 0000000..b139e8e Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5578360-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5601980-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5601980-0001.jpeg new file mode 100644 index 0000000..6c684ab Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5601980-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5611875-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5611875-0001.jpeg new file mode 100644 index 0000000..98555a3 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5611875-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-561684-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-561684-0001.jpeg new file mode 100644 index 0000000..b12c2db Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-561684-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5661793-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5661793-0001.jpeg new file mode 100644 index 0000000..e205bc8 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5661793-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5661793-0002.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5661793-0002.jpeg new file mode 100644 index 0000000..0486494 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5661793-0002.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5714306-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5714306-0001.jpeg new file mode 100644 index 0000000..17da0e2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5714306-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5789014-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5789014-0001.jpeg new file mode 100644 index 0000000..e00d7c5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5789014-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5889760-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5889760-0001.jpeg new file mode 100644 index 0000000..2f717eb Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5889760-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5893138-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5893138-0001.jpeg new file mode 100644 index 0000000..f9c5c01 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5893138-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-5997885-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-5997885-0001.jpeg new file mode 100644 index 0000000..a117298 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-5997885-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6000527-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6000527-0001.jpeg new file mode 100644 index 0000000..08f3d92 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6000527-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6085151-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6085151-0001.jpeg new file mode 100644 index 0000000..b1b6b38 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6085151-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6106856-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6106856-0001.jpeg new file mode 100644 index 0000000..061c484 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6106856-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6112608-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6112608-0001.jpeg new file mode 100644 index 0000000..8aa086d Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6112608-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6137647-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6137647-0001.jpeg new file mode 100644 index 0000000..3d3f140 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6137647-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6190523-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6190523-0001.jpeg new file mode 100644 index 0000000..a934aee Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6190523-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6195450-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6195450-0001.jpeg new file mode 100644 index 0000000..37c1fd5 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6195450-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6204576-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6204576-0001.jpeg new file mode 100644 index 0000000..4184306 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6204576-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6267994-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6267994-0001.jpeg new file mode 100644 index 0000000..9bba494 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6267994-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6293151-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6293151-0001.jpeg new file mode 100644 index 0000000..2725485 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6293151-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6297597-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6297597-0001.jpeg new file mode 100644 index 0000000..334876a Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6297597-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-630880-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-630880-0001.jpeg new file mode 100644 index 0000000..d3ad31b Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-630880-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6322108-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6322108-0001.jpeg new file mode 100644 index 0000000..505249b Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6322108-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6332708-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6332708-0001.jpeg new file mode 100644 index 0000000..0d7d541 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6332708-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6332708-0002.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6332708-0002.jpeg new file mode 100644 index 0000000..b95ba6c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6332708-0002.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6332708-0003.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6332708-0003.jpeg new file mode 100644 index 0000000..b903528 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6332708-0003.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6342197-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6342197-0001.jpeg new file mode 100644 index 0000000..a018297 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6342197-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6395296-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6395296-0001.jpeg new file mode 100644 index 0000000..81eacd2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6395296-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6410283-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6410283-0001.jpeg new file mode 100644 index 0000000..838f7ad Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6410283-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6442221-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6442221-0001.jpeg new file mode 100644 index 0000000..967341d Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6442221-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6497443-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6497443-0001.jpeg new file mode 100644 index 0000000..2ea0ada Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6497443-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6503977-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6503977-0001.jpeg new file mode 100644 index 0000000..61ba68f Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6503977-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6518197-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6518197-0001.jpeg new file mode 100644 index 0000000..54aaa11 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6518197-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6524124-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6524124-0001.jpeg new file mode 100644 index 0000000..6744200 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6524124-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6544436-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6544436-0001.jpeg new file mode 100644 index 0000000..c91cb48 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6544436-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6569259-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6569259-0001.jpeg new file mode 100644 index 0000000..93d75e1 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6569259-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6650392-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6650392-0001.jpeg new file mode 100644 index 0000000..43c76f2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6650392-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6667079-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6667079-0001.jpeg new file mode 100644 index 0000000..3cecc1a Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6667079-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-667173-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-667173-0001.jpeg new file mode 100644 index 0000000..b12a53c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-667173-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6703189-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6703189-0001.jpeg new file mode 100644 index 0000000..6b46a26 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6703189-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6713743-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6713743-0001.jpeg new file mode 100644 index 0000000..8e9e3a2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6713743-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6874528-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6874528-0001.jpeg new file mode 100644 index 0000000..592ba16 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6874528-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-6983998-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-6983998-0001.jpeg new file mode 100644 index 0000000..0a9a662 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-6983998-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7031638-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7031638-0001.jpeg new file mode 100644 index 0000000..d60010b Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7031638-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-706052-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-706052-0001.jpeg new file mode 100644 index 0000000..0d158ad Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-706052-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7082548-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7082548-0001.jpeg new file mode 100644 index 0000000..d791d3d Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7082548-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-71002-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-71002-0001.jpeg new file mode 100644 index 0000000..a2bec0e Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-71002-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7100645-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7100645-0001.jpeg new file mode 100644 index 0000000..233c9d9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7100645-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7165123-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7165123-0001.jpeg new file mode 100644 index 0000000..3e22a2a Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7165123-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7225301-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7225301-0001.jpeg new file mode 100644 index 0000000..fca4a45 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7225301-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7236364-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7236364-0001.jpeg new file mode 100644 index 0000000..a3e326d Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7236364-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-724740-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-724740-0001.jpeg new file mode 100644 index 0000000..c8df97f Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-724740-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7331861-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7331861-0001.jpeg new file mode 100644 index 0000000..ad69410 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7331861-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7398200-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7398200-0001.jpeg new file mode 100644 index 0000000..ab82b1d Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7398200-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7423096-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7423096-0001.jpeg new file mode 100644 index 0000000..06a589e Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7423096-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-745902-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-745902-0001.jpeg new file mode 100644 index 0000000..8db8bf4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-745902-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7483489-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7483489-0001.jpeg new file mode 100644 index 0000000..415e285 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7483489-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7488601-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7488601-0001.jpeg new file mode 100644 index 0000000..6174d6d Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7488601-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7519498-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7519498-0001.jpeg new file mode 100644 index 0000000..263eb69 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7519498-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-754920-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-754920-0001.jpeg new file mode 100644 index 0000000..9870790 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-754920-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7590045-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7590045-0001.jpeg new file mode 100644 index 0000000..4b49862 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7590045-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7695736-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7695736-0001.jpeg new file mode 100644 index 0000000..b5a61f6 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7695736-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7738170-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7738170-0001.jpeg new file mode 100644 index 0000000..28e8ed7 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7738170-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7804528-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7804528-0001.jpeg new file mode 100644 index 0000000..2fff9d8 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7804528-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-78265-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-78265-0001.jpeg new file mode 100644 index 0000000..857d5aa Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-78265-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-786023-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-786023-0001.jpeg new file mode 100644 index 0000000..7915cca Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-786023-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7922918-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7922918-0001.jpeg new file mode 100644 index 0000000..d1919c1 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7922918-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7950798-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7950798-0001.jpeg new file mode 100644 index 0000000..b26bb61 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7950798-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-7961936-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-7961936-0001.jpeg new file mode 100644 index 0000000..4714f73 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-7961936-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8014191-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8014191-0001.jpeg new file mode 100644 index 0000000..6a5b227 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8014191-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8207090-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8207090-0001.jpeg new file mode 100644 index 0000000..b377dce Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8207090-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8278998-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8278998-0001.jpeg new file mode 100644 index 0000000..8b1fdde Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8278998-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8305321-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8305321-0001.jpeg new file mode 100644 index 0000000..dd23959 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8305321-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8305499-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8305499-0001.jpeg new file mode 100644 index 0000000..d1a92e9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8305499-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8406720-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8406720-0001.jpeg new file mode 100644 index 0000000..31e9674 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8406720-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8417023-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8417023-0001.jpeg new file mode 100644 index 0000000..a2902d2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8417023-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8418332-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8418332-0001.jpeg new file mode 100644 index 0000000..ab6933d Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8418332-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8441235-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8441235-0001.jpeg new file mode 100644 index 0000000..74c0d93 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8441235-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8448068-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8448068-0001.jpeg new file mode 100644 index 0000000..c2de99a Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8448068-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8495317-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8495317-0001.jpeg new file mode 100644 index 0000000..6d53cb1 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8495317-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-857568-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-857568-0001.jpeg new file mode 100644 index 0000000..e5aeca1 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-857568-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8586608-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8586608-0001.jpeg new file mode 100644 index 0000000..ccede5b Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8586608-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8661138-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8661138-0001.jpeg new file mode 100644 index 0000000..2f2cc32 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8661138-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8698006-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8698006-0001.jpeg new file mode 100644 index 0000000..44043c1 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8698006-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-870639-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-870639-0001.jpeg new file mode 100644 index 0000000..8fbac03 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-870639-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8750803-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8750803-0001.jpeg new file mode 100644 index 0000000..6f85bee Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8750803-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8836138-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8836138-0001.jpeg new file mode 100644 index 0000000..e036707 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8836138-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8876914-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8876914-0001.jpeg new file mode 100644 index 0000000..3c3bb7c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8876914-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8907762-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8907762-0001.jpeg new file mode 100644 index 0000000..dd3bdb2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8907762-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-8944072-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-8944072-0001.jpeg new file mode 100644 index 0000000..9e5780b Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-8944072-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9054075-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9054075-0001.jpeg new file mode 100644 index 0000000..04624f7 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9054075-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9077486-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9077486-0001.jpeg new file mode 100644 index 0000000..3c8c22c Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9077486-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9092354-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9092354-0001.jpeg new file mode 100644 index 0000000..8355e98 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9092354-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9104493-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9104493-0001.jpeg new file mode 100644 index 0000000..cb5cc4f Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9104493-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9145111-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9145111-0001.jpeg new file mode 100644 index 0000000..2b1bb2b Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9145111-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9194822-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9194822-0001.jpeg new file mode 100644 index 0000000..f8f1f01 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9194822-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9217241-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9217241-0001.jpeg new file mode 100644 index 0000000..c0610af Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9217241-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9260113-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9260113-0001.jpeg new file mode 100644 index 0000000..3f2cd56 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9260113-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9275512-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9275512-0001.jpeg new file mode 100644 index 0000000..2dd0bdf Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9275512-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9334007-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9334007-0001.jpeg new file mode 100644 index 0000000..8f09bf4 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9334007-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9343440-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9343440-0001.jpeg new file mode 100644 index 0000000..aa19100 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9343440-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9441169-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9441169-0001.jpeg new file mode 100644 index 0000000..091302a Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9441169-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9717513-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9717513-0001.jpeg new file mode 100644 index 0000000..26058d8 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9717513-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-976006-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-976006-0001.jpeg new file mode 100644 index 0000000..8c098b2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-976006-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9799657-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9799657-0001.jpeg new file mode 100644 index 0000000..c773413 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9799657-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/NORMAL-9896495-0001.jpeg b/hackathon/bancos/train/SANOS/NORMAL-9896495-0001.jpeg new file mode 100644 index 0000000..9a7a152 Binary files /dev/null and b/hackathon/bancos/train/SANOS/NORMAL-9896495-0001.jpeg differ diff --git a/hackathon/bancos/train/SANOS/a18539dc-1902-4410-83c9-7614b9e355a9.png b/hackathon/bancos/train/SANOS/a18539dc-1902-4410-83c9-7614b9e355a9.png new file mode 100644 index 0000000..cb2b7e8 Binary files /dev/null and b/hackathon/bancos/train/SANOS/a18539dc-1902-4410-83c9-7614b9e355a9.png differ diff --git a/hackathon/bancos/train/SANOS/a35d8ccc-2bdd-4915-9a0e-318828fe3de3.png b/hackathon/bancos/train/SANOS/a35d8ccc-2bdd-4915-9a0e-318828fe3de3.png new file mode 100644 index 0000000..122dae2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/a35d8ccc-2bdd-4915-9a0e-318828fe3de3.png differ diff --git a/hackathon/bancos/train/SANOS/a391b63d-c95d-41c3-9047-4f337e09add1.png b/hackathon/bancos/train/SANOS/a391b63d-c95d-41c3-9047-4f337e09add1.png new file mode 100644 index 0000000..38fdfb1 Binary files /dev/null and b/hackathon/bancos/train/SANOS/a391b63d-c95d-41c3-9047-4f337e09add1.png differ diff --git a/hackathon/bancos/train/SANOS/a408115c-3467-4141-b2a4-48c90b05883e.png b/hackathon/bancos/train/SANOS/a408115c-3467-4141-b2a4-48c90b05883e.png new file mode 100644 index 0000000..1b9896c Binary files /dev/null and b/hackathon/bancos/train/SANOS/a408115c-3467-4141-b2a4-48c90b05883e.png differ diff --git a/hackathon/bancos/train/SANOS/a415726c-28b8-4227-829d-44794a37acfc.png b/hackathon/bancos/train/SANOS/a415726c-28b8-4227-829d-44794a37acfc.png new file mode 100644 index 0000000..441d8a0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/a415726c-28b8-4227-829d-44794a37acfc.png differ diff --git a/hackathon/bancos/train/SANOS/a986ed31-7616-4e4a-bd62-961a7142a3c6.png b/hackathon/bancos/train/SANOS/a986ed31-7616-4e4a-bd62-961a7142a3c6.png new file mode 100644 index 0000000..93f15eb Binary files /dev/null and b/hackathon/bancos/train/SANOS/a986ed31-7616-4e4a-bd62-961a7142a3c6.png differ diff --git a/hackathon/bancos/train/SANOS/adca229f-0bee-40a2-9dbe-97501c87986b.png b/hackathon/bancos/train/SANOS/adca229f-0bee-40a2-9dbe-97501c87986b.png new file mode 100644 index 0000000..0994e23 Binary files /dev/null and b/hackathon/bancos/train/SANOS/adca229f-0bee-40a2-9dbe-97501c87986b.png differ diff --git a/hackathon/bancos/train/SANOS/b5f01025-fe74-4d81-b38f-44f6e64e7741.png b/hackathon/bancos/train/SANOS/b5f01025-fe74-4d81-b38f-44f6e64e7741.png new file mode 100644 index 0000000..b38435a Binary files /dev/null and b/hackathon/bancos/train/SANOS/b5f01025-fe74-4d81-b38f-44f6e64e7741.png differ diff --git a/hackathon/bancos/train/SANOS/b9251876-de66-4c09-9680-7d17d681bf3e.png b/hackathon/bancos/train/SANOS/b9251876-de66-4c09-9680-7d17d681bf3e.png new file mode 100644 index 0000000..a4736f2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/b9251876-de66-4c09-9680-7d17d681bf3e.png differ diff --git a/hackathon/bancos/train/SANOS/ba3b13ee-0a05-4219-a45a-90eb7d91dc5d.png b/hackathon/bancos/train/SANOS/ba3b13ee-0a05-4219-a45a-90eb7d91dc5d.png new file mode 100644 index 0000000..b6d6d8d Binary files /dev/null and b/hackathon/bancos/train/SANOS/ba3b13ee-0a05-4219-a45a-90eb7d91dc5d.png differ diff --git a/hackathon/bancos/train/SANOS/bb2b1f50-cfac-4a69-896c-3033513b241c.png b/hackathon/bancos/train/SANOS/bb2b1f50-cfac-4a69-896c-3033513b241c.png new file mode 100644 index 0000000..455fb13 Binary files /dev/null and b/hackathon/bancos/train/SANOS/bb2b1f50-cfac-4a69-896c-3033513b241c.png differ diff --git a/hackathon/bancos/train/SANOS/bb41d628-5873-469a-9850-574fca494f29.png b/hackathon/bancos/train/SANOS/bb41d628-5873-469a-9850-574fca494f29.png new file mode 100644 index 0000000..953a0c1 Binary files /dev/null and b/hackathon/bancos/train/SANOS/bb41d628-5873-469a-9850-574fca494f29.png differ diff --git a/hackathon/bancos/train/SANOS/bc422dd3-596e-40e6-93b5-0f08fc6fa720.png b/hackathon/bancos/train/SANOS/bc422dd3-596e-40e6-93b5-0f08fc6fa720.png new file mode 100644 index 0000000..835f056 Binary files /dev/null and b/hackathon/bancos/train/SANOS/bc422dd3-596e-40e6-93b5-0f08fc6fa720.png differ diff --git a/hackathon/bancos/train/SANOS/bcca16d2-1b10-4644-9724-701bb38c4790.png b/hackathon/bancos/train/SANOS/bcca16d2-1b10-4644-9724-701bb38c4790.png new file mode 100644 index 0000000..abb0ee8 Binary files /dev/null and b/hackathon/bancos/train/SANOS/bcca16d2-1b10-4644-9724-701bb38c4790.png differ diff --git a/hackathon/bancos/train/SANOS/bde5d050-10b4-4a55-9c5a-b509013483f6.png b/hackathon/bancos/train/SANOS/bde5d050-10b4-4a55-9c5a-b509013483f6.png new file mode 100644 index 0000000..ca46fa0 Binary files /dev/null and b/hackathon/bancos/train/SANOS/bde5d050-10b4-4a55-9c5a-b509013483f6.png differ diff --git a/hackathon/bancos/train/SANOS/be9ed5cb-5663-44e4-8ba4-5e0886009683.png b/hackathon/bancos/train/SANOS/be9ed5cb-5663-44e4-8ba4-5e0886009683.png new file mode 100644 index 0000000..509e608 Binary files /dev/null and b/hackathon/bancos/train/SANOS/be9ed5cb-5663-44e4-8ba4-5e0886009683.png differ diff --git a/hackathon/bancos/train/SANOS/bfe2ef33-c62d-45ae-9687-ce865f5eca51.png b/hackathon/bancos/train/SANOS/bfe2ef33-c62d-45ae-9687-ce865f5eca51.png new file mode 100644 index 0000000..51fc232 Binary files /dev/null and b/hackathon/bancos/train/SANOS/bfe2ef33-c62d-45ae-9687-ce865f5eca51.png differ diff --git a/hackathon/bancos/train/SANOS/c104d585-85a7-4071-b7ff-930ac2565128.png b/hackathon/bancos/train/SANOS/c104d585-85a7-4071-b7ff-930ac2565128.png new file mode 100644 index 0000000..b17ab44 Binary files /dev/null and b/hackathon/bancos/train/SANOS/c104d585-85a7-4071-b7ff-930ac2565128.png differ diff --git a/hackathon/bancos/train/SANOS/c1cf3255-d734-4980-bfe0-967902ad7ed9.png b/hackathon/bancos/train/SANOS/c1cf3255-d734-4980-bfe0-967902ad7ed9.png new file mode 100644 index 0000000..91e8a06 Binary files /dev/null and b/hackathon/bancos/train/SANOS/c1cf3255-d734-4980-bfe0-967902ad7ed9.png differ diff --git a/hackathon/bancos/train/SANOS/c7a54198-aecc-4556-9056-57a6746759ee.png b/hackathon/bancos/train/SANOS/c7a54198-aecc-4556-9056-57a6746759ee.png new file mode 100644 index 0000000..eb174e3 Binary files /dev/null and b/hackathon/bancos/train/SANOS/c7a54198-aecc-4556-9056-57a6746759ee.png differ diff --git a/hackathon/bancos/train/SANOS/c8297433-13c9-4a56-abe9-a9a201f8e455.png b/hackathon/bancos/train/SANOS/c8297433-13c9-4a56-abe9-a9a201f8e455.png new file mode 100644 index 0000000..9b2dd74 Binary files /dev/null and b/hackathon/bancos/train/SANOS/c8297433-13c9-4a56-abe9-a9a201f8e455.png differ diff --git a/hackathon/bancos/train/SANOS/cb9149e2-a09d-4b4a-a644-81d8f394d679.png b/hackathon/bancos/train/SANOS/cb9149e2-a09d-4b4a-a644-81d8f394d679.png new file mode 100644 index 0000000..a199384 Binary files /dev/null and b/hackathon/bancos/train/SANOS/cb9149e2-a09d-4b4a-a644-81d8f394d679.png differ diff --git a/hackathon/bancos/train/SANOS/cd4e583e-19e0-4b95-9b4b-148c05b679dc.png b/hackathon/bancos/train/SANOS/cd4e583e-19e0-4b95-9b4b-148c05b679dc.png new file mode 100644 index 0000000..2a074e9 Binary files /dev/null and b/hackathon/bancos/train/SANOS/cd4e583e-19e0-4b95-9b4b-148c05b679dc.png differ diff --git a/hackathon/bancos/train/SANOS/cdcbecda-ad13-4aa2-a0af-4e32e72855e1.png b/hackathon/bancos/train/SANOS/cdcbecda-ad13-4aa2-a0af-4e32e72855e1.png new file mode 100644 index 0000000..f2c0017 Binary files /dev/null and b/hackathon/bancos/train/SANOS/cdcbecda-ad13-4aa2-a0af-4e32e72855e1.png differ diff --git a/hackathon/bancos/train/SANOS/d4620803-3df7-4c31-90ce-17aca75b0cba.png b/hackathon/bancos/train/SANOS/d4620803-3df7-4c31-90ce-17aca75b0cba.png new file mode 100644 index 0000000..827ca4c Binary files /dev/null and b/hackathon/bancos/train/SANOS/d4620803-3df7-4c31-90ce-17aca75b0cba.png differ diff --git a/hackathon/bancos/train/SANOS/d6970a49-240b-400f-9c6c-146ad7e64bd7.png b/hackathon/bancos/train/SANOS/d6970a49-240b-400f-9c6c-146ad7e64bd7.png new file mode 100644 index 0000000..67893d8 Binary files /dev/null and b/hackathon/bancos/train/SANOS/d6970a49-240b-400f-9c6c-146ad7e64bd7.png differ diff --git a/hackathon/bancos/train/SANOS/d9e9d65f-dd61-4e76-aec0-0cc27e5c583e.png b/hackathon/bancos/train/SANOS/d9e9d65f-dd61-4e76-aec0-0cc27e5c583e.png new file mode 100644 index 0000000..4955055 Binary files /dev/null and b/hackathon/bancos/train/SANOS/d9e9d65f-dd61-4e76-aec0-0cc27e5c583e.png differ diff --git a/hackathon/bancos/train/SANOS/da3a1825-40e8-4168-9a91-1f17f9b385f8.png b/hackathon/bancos/train/SANOS/da3a1825-40e8-4168-9a91-1f17f9b385f8.png new file mode 100644 index 0000000..b269103 Binary files /dev/null and b/hackathon/bancos/train/SANOS/da3a1825-40e8-4168-9a91-1f17f9b385f8.png differ diff --git a/hackathon/bancos/train/SANOS/de94813d-0475-41b0-b248-af03dfb5a412.png b/hackathon/bancos/train/SANOS/de94813d-0475-41b0-b248-af03dfb5a412.png new file mode 100644 index 0000000..e04919e Binary files /dev/null and b/hackathon/bancos/train/SANOS/de94813d-0475-41b0-b248-af03dfb5a412.png differ diff --git a/hackathon/bancos/train/SANOS/df3f3138-02f4-4e28-9346-cb1bc5862024.png b/hackathon/bancos/train/SANOS/df3f3138-02f4-4e28-9346-cb1bc5862024.png new file mode 100644 index 0000000..a8bf0c2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/df3f3138-02f4-4e28-9346-cb1bc5862024.png differ diff --git a/hackathon/bancos/train/SANOS/e1842e70-7e45-4fbd-9bdc-65da2ed37f0d.png b/hackathon/bancos/train/SANOS/e1842e70-7e45-4fbd-9bdc-65da2ed37f0d.png new file mode 100644 index 0000000..4e9b79a Binary files /dev/null and b/hackathon/bancos/train/SANOS/e1842e70-7e45-4fbd-9bdc-65da2ed37f0d.png differ diff --git a/hackathon/bancos/train/SANOS/e257131e-342a-472b-b568-ac448f054081.png b/hackathon/bancos/train/SANOS/e257131e-342a-472b-b568-ac448f054081.png new file mode 100644 index 0000000..f2e0323 Binary files /dev/null and b/hackathon/bancos/train/SANOS/e257131e-342a-472b-b568-ac448f054081.png differ diff --git a/hackathon/bancos/train/SANOS/e2f22313-d739-4162-9cbe-c3ce35ca020c.png b/hackathon/bancos/train/SANOS/e2f22313-d739-4162-9cbe-c3ce35ca020c.png new file mode 100644 index 0000000..d1d6018 Binary files /dev/null and b/hackathon/bancos/train/SANOS/e2f22313-d739-4162-9cbe-c3ce35ca020c.png differ diff --git a/hackathon/bancos/train/SANOS/e5a478b2-b843-4e25-b35f-2a4ce3f08c0c.png b/hackathon/bancos/train/SANOS/e5a478b2-b843-4e25-b35f-2a4ce3f08c0c.png new file mode 100644 index 0000000..caa876d Binary files /dev/null and b/hackathon/bancos/train/SANOS/e5a478b2-b843-4e25-b35f-2a4ce3f08c0c.png differ diff --git a/hackathon/bancos/train/SANOS/e5e2445c-282a-4c49-8dc4-880f4e3133c8.png b/hackathon/bancos/train/SANOS/e5e2445c-282a-4c49-8dc4-880f4e3133c8.png new file mode 100644 index 0000000..e2645f2 Binary files /dev/null and b/hackathon/bancos/train/SANOS/e5e2445c-282a-4c49-8dc4-880f4e3133c8.png differ diff --git a/hackathon/bancos/train/SANOS/e6e4c1a3-7efd-4ee3-b955-8e3ed9176972.png b/hackathon/bancos/train/SANOS/e6e4c1a3-7efd-4ee3-b955-8e3ed9176972.png new file mode 100644 index 0000000..f292a86 Binary files /dev/null and b/hackathon/bancos/train/SANOS/e6e4c1a3-7efd-4ee3-b955-8e3ed9176972.png differ diff --git a/hackathon/bancos/train/SANOS/eb31f994-518b-4e9d-9a52-ccbf541cfa9f.png b/hackathon/bancos/train/SANOS/eb31f994-518b-4e9d-9a52-ccbf541cfa9f.png new file mode 100644 index 0000000..ec9fc29 Binary files /dev/null and b/hackathon/bancos/train/SANOS/eb31f994-518b-4e9d-9a52-ccbf541cfa9f.png differ diff --git a/hackathon/bancos/train/SANOS/f12d5151-4168-4bce-a9cf-c9eb427a1743.png b/hackathon/bancos/train/SANOS/f12d5151-4168-4bce-a9cf-c9eb427a1743.png new file mode 100644 index 0000000..6129aab Binary files /dev/null and b/hackathon/bancos/train/SANOS/f12d5151-4168-4bce-a9cf-c9eb427a1743.png differ diff --git a/hackathon/bancos/train/SANOS/f23ba6fa-6625-4b77-9d81-332e5091b50d.png b/hackathon/bancos/train/SANOS/f23ba6fa-6625-4b77-9d81-332e5091b50d.png new file mode 100644 index 0000000..3760d48 Binary files /dev/null and b/hackathon/bancos/train/SANOS/f23ba6fa-6625-4b77-9d81-332e5091b50d.png differ diff --git a/hackathon/bancos/train/SANOS/f36c1075-71a4-41b7-9687-8abbb3c06c58.png b/hackathon/bancos/train/SANOS/f36c1075-71a4-41b7-9687-8abbb3c06c58.png new file mode 100644 index 0000000..f7b3521 Binary files /dev/null and b/hackathon/bancos/train/SANOS/f36c1075-71a4-41b7-9687-8abbb3c06c58.png differ diff --git a/hackathon/bancos/train/SANOS/f7dfa994-ff99-46eb-bac4-e431688046cf.png b/hackathon/bancos/train/SANOS/f7dfa994-ff99-46eb-bac4-e431688046cf.png new file mode 100644 index 0000000..88f89ee Binary files /dev/null and b/hackathon/bancos/train/SANOS/f7dfa994-ff99-46eb-bac4-e431688046cf.png differ diff --git a/hackathon/bancos/train/SANOS/f85d067a-4a40-47d2-91fe-682928b1ab18.png b/hackathon/bancos/train/SANOS/f85d067a-4a40-47d2-91fe-682928b1ab18.png new file mode 100644 index 0000000..bc3ff58 Binary files /dev/null and b/hackathon/bancos/train/SANOS/f85d067a-4a40-47d2-91fe-682928b1ab18.png differ diff --git a/hackathon/bancos/train/SANOS/fcd27c75-8d7b-4235-8efc-048a49b38030.png b/hackathon/bancos/train/SANOS/fcd27c75-8d7b-4235-8efc-048a49b38030.png new file mode 100644 index 0000000..992f9c1 Binary files /dev/null and b/hackathon/bancos/train/SANOS/fcd27c75-8d7b-4235-8efc-048a49b38030.png differ diff --git a/hackathon/bancos/train/SANOS/fe047967-9495-42a5-a25b-b5c22f7724c3.png b/hackathon/bancos/train/SANOS/fe047967-9495-42a5-a25b-b5c22f7724c3.png new file mode 100644 index 0000000..db3014b Binary files /dev/null and b/hackathon/bancos/train/SANOS/fe047967-9495-42a5-a25b-b5c22f7724c3.png differ diff --git a/hackathon/bancos/train/SANOS/ff0090ff-4acb-4dc6-a937-86fa8f5e74da.png b/hackathon/bancos/train/SANOS/ff0090ff-4acb-4dc6-a937-86fa8f5e74da.png new file mode 100644 index 0000000..74e294b Binary files /dev/null and b/hackathon/bancos/train/SANOS/ff0090ff-4acb-4dc6-a937-86fa8f5e74da.png differ diff --git a/hackathon/bancos/train/SANOS/ff38a1fd-53c4-4c3c-93e2-860f025f90de.png b/hackathon/bancos/train/SANOS/ff38a1fd-53c4-4c3c-93e2-860f025f90de.png new file mode 100644 index 0000000..fdf4c06 Binary files /dev/null and b/hackathon/bancos/train/SANOS/ff38a1fd-53c4-4c3c-93e2-860f025f90de.png differ diff --git a/hackathon/main.ipynb b/hackathon/main.ipynb new file mode 100644 index 0000000..1aed6e0 --- /dev/null +++ b/hackathon/main.ipynb @@ -0,0 +1,686 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "N8V4_EIW8ZMM", + "metadata": { + "id": "N8V4_EIW8ZMM" + }, + "source": [ + "**Clasificación de pacientes con covid, usando imágenes de radiografía y algoritmos cuánticos híbridos**\n", + "\n", + "\n", + "\n", + "Para la clasificación de imágenes se propone crear una red neuronal híbrida cuántica-clásica que utiliza TorchConnector. Que consta de una primera parte con redes neuronales clasicas con diferentes capas, junto con una etapa del algoritmo cuántico QNN.\n", + "\n", + "Más adelante se mostraran los diferentes experimentos que se hicieron con diferente número de capas, diferente número de kernels y diferente tamaño de las imágenes." + ] + }, + { + "cell_type": "markdown", + "id": "i_oqiCWV-7T6", + "metadata": { + "id": "i_oqiCWV-7T6" + }, + "source": [ + "Se instalan los paquetes necesarios.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ibROZQMq2j5B", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ibROZQMq2j5B", + "outputId": "9a8f1602-5d08-4918-a991-c43737ff67e4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: qiskit in /usr/local/lib/python3.10/dist-packages (0.45.0)\n", + "Requirement already satisfied: qiskit-terra==0.45.0 in /usr/local/lib/python3.10/dist-packages (from qiskit) (0.45.0)\n", + "Requirement already satisfied: rustworkx>=0.13.0 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra==0.45.0->qiskit) (0.13.2)\n", + "Requirement already satisfied: numpy<2,>=1.17 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra==0.45.0->qiskit) (1.23.5)\n", + "Requirement already satisfied: ply>=3.10 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra==0.45.0->qiskit) (3.11)\n", + "Requirement already satisfied: psutil>=5 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra==0.45.0->qiskit) (5.9.5)\n", + "Requirement already satisfied: scipy>=1.5 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra==0.45.0->qiskit) (1.11.3)\n", + "Requirement already satisfied: sympy>=1.3 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra==0.45.0->qiskit) (1.12)\n", + "Requirement already satisfied: dill>=0.3 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra==0.45.0->qiskit) (0.3.7)\n", + "Requirement already satisfied: python-dateutil>=2.8.0 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra==0.45.0->qiskit) (2.8.2)\n", + "Requirement already satisfied: stevedore>=3.0.0 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra==0.45.0->qiskit) (5.1.0)\n", + "Requirement already satisfied: symengine<0.10,>=0.9 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra==0.45.0->qiskit) (0.9.2)\n", + "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from qiskit-terra==0.45.0->qiskit) (4.5.0)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.0->qiskit-terra==0.45.0->qiskit) (1.16.0)\n", + "Requirement already satisfied: pbr!=2.1.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from stevedore>=3.0.0->qiskit-terra==0.45.0->qiskit) (6.0.0)\n", + "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy>=1.3->qiskit-terra==0.45.0->qiskit) (1.3.0)\n" + ] + } + ], + "source": [ + "pip install qiskit" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "nqCfgacn27NR", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nqCfgacn27NR", + "outputId": "fee19e6b-7849-4bc8-9df7-15b3f5208232" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: qiskit_machine_learning in /usr/local/lib/python3.10/dist-packages (0.6.1)\n", + "Requirement already satisfied: qiskit-terra>=0.22.2 in /usr/local/lib/python3.10/dist-packages (from qiskit_machine_learning) (0.45.0)\n", + "Requirement already satisfied: scipy>=1.4 in /usr/local/lib/python3.10/dist-packages (from qiskit_machine_learning) (1.11.3)\n", + "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from qiskit_machine_learning) (1.23.5)\n", + "Requirement already satisfied: psutil>=5 in /usr/local/lib/python3.10/dist-packages (from qiskit_machine_learning) (5.9.5)\n", + "Requirement already satisfied: scikit-learn>=0.20.0 in /usr/local/lib/python3.10/dist-packages (from qiskit_machine_learning) (1.2.2)\n", + "Requirement already satisfied: fastdtw in /usr/local/lib/python3.10/dist-packages (from qiskit_machine_learning) (0.3.4)\n", + "Requirement already satisfied: setuptools>=40.1.0 in /usr/local/lib/python3.10/dist-packages (from qiskit_machine_learning) (67.7.2)\n", + "Requirement already satisfied: dill>=0.3.4 in /usr/local/lib/python3.10/dist-packages (from qiskit_machine_learning) (0.3.7)\n", + "Requirement already satisfied: rustworkx>=0.13.0 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra>=0.22.2->qiskit_machine_learning) (0.13.2)\n", + "Requirement already satisfied: ply>=3.10 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra>=0.22.2->qiskit_machine_learning) (3.11)\n", + "Requirement already satisfied: sympy>=1.3 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra>=0.22.2->qiskit_machine_learning) (1.12)\n", + "Requirement already satisfied: python-dateutil>=2.8.0 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra>=0.22.2->qiskit_machine_learning) (2.8.2)\n", + "Requirement already satisfied: stevedore>=3.0.0 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra>=0.22.2->qiskit_machine_learning) (5.1.0)\n", + "Requirement already satisfied: symengine<0.10,>=0.9 in /usr/local/lib/python3.10/dist-packages (from qiskit-terra>=0.22.2->qiskit_machine_learning) (0.9.2)\n", + "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from qiskit-terra>=0.22.2->qiskit_machine_learning) (4.5.0)\n", + "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.20.0->qiskit_machine_learning) (1.3.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=0.20.0->qiskit_machine_learning) (3.2.0)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.0->qiskit-terra>=0.22.2->qiskit_machine_learning) (1.16.0)\n", + "Requirement already satisfied: pbr!=2.1.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from stevedore>=3.0.0->qiskit-terra>=0.22.2->qiskit_machine_learning) (6.0.0)\n", + "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy>=1.3->qiskit-terra>=0.22.2->qiskit_machine_learning) (1.3.0)\n" + ] + } + ], + "source": [ + "pip install qiskit_machine_learning" + ] + }, + { + "cell_type": "markdown", + "id": "eTewLQo6_TES", + "metadata": { + "id": "eTewLQo6_TES" + }, + "source": [ + "Se importan las librerias necesarias" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "3AsnwtSP2iKX", + "metadata": { + "id": "3AsnwtSP2iKX" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import cv2\n", + "import matplotlib.pyplot as plt\n", + "import torch\n", + "from torch import cat, no_grad, manual_seed\n", + "from torch.utils.data import DataLoader\n", + "from torchvision import datasets, transforms\n", + "import torch.optim as optim\n", + "from torch.nn import (\n", + " Module,\n", + " Conv2d,\n", + " Linear,\n", + " Dropout2d,\n", + " NLLLoss,\n", + " MaxPool2d,\n", + " Flatten,\n", + " Sequential,\n", + " ReLU,\n", + ")\n", + "import torch.nn.functional as F\n", + "\n", + "from torch import Tensor\n", + "from torchvision.io import read_image, image\n", + "import os\n", + "from torchvision.utils import make_grid\n", + "from pathlib import Path\n", + "from torchvision import transforms\n", + "from PIL import Image as imagePIL\n", + "from torch.nn import Linear, CrossEntropyLoss, MSELoss\n", + "from torch.optim import LBFGS\n", + "\n", + "from qiskit import QuantumCircuit\n", + "from qiskit.utils import algorithm_globals\n", + "from qiskit.circuit import Parameter\n", + "from qiskit.circuit.library import RealAmplitudes, ZZFeatureMap\n", + "from qiskit_machine_learning.neural_networks import SamplerQNN, EstimatorQNN\n", + "from qiskit_machine_learning.connectors import TorchConnector\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "Tx7dSF_x7KlZ", + "metadata": { + "id": "Tx7dSF_x7KlZ" + }, + "source": [ + "**Definiendo dataset de imágenes para entrenamiento y test.**\n", + "\n", + "Se creo un dataset con con radiografías de tórax de personas con covid y personas sanas.de 251 kb.\n", + "El dataset esta dividido de la siguiente manera para entrenamiento:\n", + "- 78 imágenes de radiografías de tórax de pacientes con COVID.\n", + "- 498 imágenes de radiografías de tórax de pacientes sanos.\n", + "\n", + "\n", + "Para test:\n", + "- 12 imágenes de radiografías de tórax de pacientes con COVID.\n", + "- 69 imágenes de radiografías de tórax de pacientes sanos.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "tbeknWXf2iKb", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tbeknWXf2iKb", + "outputId": "250c1944-786b-4598-94e3-743b0bc5d28c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rm: cannot remove 'bancos/train/.ipynb_checkpoints': No such file or directory\n", + "rm: cannot remove 'bancos/test/.ipynb_checkpoints': No such file or directory\n", + "\n", + "\n" + ] + } + ], + "source": [ + "\n", + "batch_size = 1\n", + "transformar = transforms.Compose([\n", + " transforms.Resize((28,28)),\n", + " transforms.Grayscale(num_output_channels=1),\n", + " transforms.ToTensor()\n", + "])\n", + "!rm -R bancos/train/.ipynb_checkpoints #necesario si corres tu programa en colab\n", + "\n", + "train = datasets.ImageFolder('bancos/train/',transform=transformar)\n", + "\n", + "!rm -R bancos/test/.ipynb_checkpoints #necesario si corres tu programa en colab\n", + "test = datasets.ImageFolder('bancos/test/',transform=transformar)\n", + "\n", + "\n", + "train_data = DataLoader(train, batch_size=1, shuffle=True)\n", + "test_data = DataLoader(test, batch_size=1, shuffle=True)\n", + "print(train_data)\n", + "print(test_data)\n" + ] + }, + { + "cell_type": "markdown", + "id": "URbsOlxuAnW_", + "metadata": { + "id": "URbsOlxuAnW_" + }, + "source": [ + "Si realizamos una visualización rápida, podemos ver que el conjunto de datos consta de las imagenes del torax de pacientes sanos y enfermos" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "vG_t54w92iKc", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 290 + }, + "id": "vG_t54w92iKc", + "outputId": "33218007-d452-4443-8844-da1272c7d59a" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtIAAAERCAYAAABW/kAtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAy5UlEQVR4nO3deXxV9Z3/8XcI2fedJCyyuRBQKW4oGNQR5KE4iHVtO1jXUTt1fNhaO9aqo62dUauOOlOrVtGqo6JDrW21OqLjVu1U6wbIFjQQCAlZyUaW7+8PfslwSe73czg3xKCv5+PRx6Pez73nfO+5557vh3tv3t8455wTAAAAgD0y4oseAAAAALAvopEGAAAAQqCRBgAAAEKgkQYAAABCoJEGAAAAQqCRBgAAAEKgkQYAAABCoJEGAAAAQqCRBgAAAEL4whrpDRs2KC4uTrfddtugbfPVV19VXFycXn311UHb5g033KC4uLhB295QmzNnjqZOnbrX9/Pwww8rLi5OGzZs2Gv76Onp0dSpU/WTn/yk77bzzjtPcXFxiouLG5LniWD+8R//se91SU9P77t927ZtSktL0+9///svcHRAdMxNQ4O5CV+EvTE37VEj3XtC/u///u8e7+ir6qc//amWLVv2RQ8jtB07duiuu+7S9OnTlZmZqezsbJWVleniiy/WqlWrhnQsTzzxhCorK/Wd73wn4vb8/Hw9+uij+tnPfhZx+x//+EddcMEFmjp1quLj47XffvvFPIZPP/1UV155pY4++mglJycPygX6z3/+s77zne+orKxMaWlpGjt2rM4880ytXr16wPs/9dRTOuqoo5Sdna28vDyVl5frd7/7Xej9P/vsszrrrLM0YcIEpaam6oADDtBVV12lhoaGfvdtb2/XLbfcoilTpig1NVWlpaU644wz9Mknn0Tc71vf+pYeffRRzZ49O+L2vLw8XXjhhbruuutCjxfYHXPTnmNuGjzMTTt9ZecmtwceeughJ8n9+c9/3pOHDaiiosJJcrfeemvM2+q1fPlyJ8ktX7580LZ5/fXXuz08TBHS0tLc4sWLB208e6q8vNyVlZWFfvwpp5zi4uPj3Te/+U137733ujvvvNP9/d//vRs9erR76KGH+u7X1dXl2traXE9PzyCMemCHHHKIu/jiiyNuW7x4sRs3btyA91+8eLFLTk52Rx99tBs9enTU++2Jhx56yI0YMcJNnTrVHXrooU6Sq6ioiGmbp59+uhs1apT7h3/4B3f//fe7m266yRUVFbm0tDT30UcfRdz33/7t35wkd/LJJ7v/+I//cHfccYc75JBDnCT3zDPPhNp/Xl6emzZtmrvuuuvc/fff77773e+6xMREd+CBB7rW1taI+y5atMiNHDnSXXrppe7+++93N954oyssLHQZGRluw4YN/ba9ePFil5aWFnHbihUrnCT33//936HGC+yOuWnPMTcNHuamr/bcRCNtGI4Xq+3btwe+bywXq3fffddJcj/5yU/61bq6ulxtbW2o7Ybx3nvvOUnu5Zdfjrjdd7HatGmT27Fjh3POuZNPPnlQLlbbtm1zTU1Nzjnnbr311kG5WL355puuo6Mj4rbVq1e7pKQk941vfCPi9smTJ7vDDz88YlJobGx06enp7tRTTw21/4HeL0uWLHGS3P33399328aNG50k973vfS/ivq+88oqT5H7+85/3285AFyvnnJs6dar71re+FWq8wO6Ym/Ycc9PgYG7a6as8Nw36b6R37NihH//4x5oxY4aysrKUlpam2bNna/ny5VEfc8cdd2jcuHFKSUlReXm5Pv744373WbVqlb7+9a8rNzdXycnJOuyww/Tcc88FGtM777yjk046SVlZWUpNTVV5ebnefPPNfvd74403dPjhhys5OVkTJ07UfffdN+D2amtrtWrVKrW2tnr3GxcXp5aWFi1ZsqTvNznnnXdeX/3999/X/PnzlZmZqfT0dJ1wwgn605/+FLGN3q8sX3vtNV122WUqLCzU6NGj++p/+MMfVF5eroyMDGVmZurwww/X448/3m8sK1as0HHHHdf3lce//uu/escuSevWrZMkHXPMMf1q8fHxysvL6zfO3q+Sen+/N9D/dj0GPT09uvPOO1VWVqbk5GQVFRXpkksuUX19fcT+li1bpsTERB177LHmuHuVlJQoISEh8P2DyM3NVUZGxqBu8+ijj1ZiYmLEbZMnT1ZZWZlWrlwZcXtTU5MKCwsjfhvZe/6kpKSE2v+cOXP63XbaaadJUsT+m5ubJUlFRUUR9y0uLpakPdr/iSeeqN/+9rdyzu3pcIFQmJv+D3MTc1MQzE3BjAx8z4Campr0wAMP6JxzztFFF12k5uZmPfjgg5o3b57effddHXrooRH3f+SRR9Tc3KzLL79c7e3tuuuuu3T88cfro48+6json3zyiY455hiVlpbqmmuuUVpamp566iktXLhQzzzzTN+BHcgrr7yi+fPna8aMGbr++us1YsQIPfTQQzr++OP1+uuv64gjjpAkffTRR5o7d64KCgp0ww03qKurS9dff32/F0aS7rnnHt14441avnz5gC90r0cffVQXXnihjjjiCF188cWSpIkTJ/Y9p9mzZyszM1NXX321EhISdN9992nOnDl67bXXdOSRR0Zs67LLLlNBQYF+/OMfq6WlRdLOC8T555+vsrIy/fCHP1R2drbef/99vfDCCzr33HP7HltfX6+TTjpJixYt0plnnqmlS5fqBz/4gaZNm6b58+dHHf+4ceMkSY899piOOeYYjRwZ/HRZtGiRJk2aFHHbX/7yF915550qLCzsu+2SSy7Rww8/rG9/+9v67ne/q4qKCt1zzz16//339eabb/ZdbN566y1NnTp10C8+w5VzTtXV1SorK4u4fc6cOVq6dKnuvvtuLViwQO3t7br77rvV2NioK664YtD2v2XLFkk7f+PXa+LEiRo9erRuv/12HXDAAZo+fbqqqqp09dVXa/z48Tr77LMDb3/GjBm644479Mknn/CHOBgSzE3/h7mJuSks5qYB7MnH10G+Puvq6ur3VUB9fb0rKipy559/ft9tvV+fpaSkuI0bN/bd/s477zhJ7sorr+y77YQTTnDTpk1z7e3tfbf19PS4o48+2k2ePLnvtt2/Puvp6XGTJ0928+bNi/i6obW11Y0fP96deOKJfbctXLjQJScnu88++6zvthUrVrj4+Ph+X5/1fqUW5Gu6aF+fLVy40CUmJrp169b13VZVVeUyMjLcscce23db7zGfNWuW6+rq6ru9oaHBZWRkuCOPPNK1tbVFbHvX51peXu4kuUceeaTvto6ODjdq1Ch3+umne8fe09PT9/iioiJ3zjnnuHvvvTfiGO0+zmhfJdXU1LixY8e6adOm9X399/rrrztJ7rHHHou47wsvvNDv9tGjRw84Xt/XZ7sarK/PdjVYX58N5NFHH3WS3IMPPhhxe3V1tTvhhBOcpL7/5efnu7feemtQ93/BBRe4+Ph4t3r16ojb33nnHTdx4sSI/c+YMcNt3rx5wO1E+/rsrbfecpLck08+OajjxlcTc9NOzE3MTc4xNw313DToP+2Ij4/v+yqgp6dHdXV16urq0mGHHab33nuv3/0XLlyo0tLSvv8+4ogjdOSRR/ZFkNTV1emVV17RmWeeqebmZtXW1qq2tlbbtm3TvHnztGbNGm3atGnAsfz1r3/VmjVrdO6552rbtm19j21padEJJ5yg//mf/1FPT4+6u7v14osvauHChRo7dmzf4w866CDNmzev33ZvuOEGOee8/+L36e7u1h//+EctXLhQEyZM6Lu9uLhY5557rt544w01NTVFPOaiiy5SfHx833+/9NJLam5u1jXXXKPk5OSI++4eiZSenq5vfvObff+dmJioI444QuvXr/eOMy4uTi+++KJuvvlm5eTk6IknntDll1+ucePG6ayzzhrwL2ejPd9zzjlHzc3N+q//+i+lpaVJkp5++mllZWXpxBNP7HttamtrNWPGDKWnp0d85bpt2zbl5OQE2t++btWqVbr88ss1c+ZMLV68OKLW+5fLixcv1tNPP61f/epXKi4u1qJFi7R27dpB2f/jjz+uBx98UFdddZUmT54cUcvJydGhhx6qa665RsuWLdNtt92mDRs26IwzzlB7e3vgffS+lrW1tYMyZsDC3GRjbmJu8mFuGtig/7RDkpYsWaLbb79dq1atUmdnZ9/t48eP73ff3Q+GJO2///566qmnJElr166Vc07XXXdd1FiSrVu3Rlzweq1Zs0aS+r3gu2psbFRHR4fa2toGHMsBBxww6Jm3NTU1am1t1QEHHNCvdtBBB6mnp0eVlZURX53sfux6fyMW5KuH0aNH97uA5eTk6MMPPzQfm5SUpGuvvVbXXnutNm/erNdee0133XWXnnrqKSUkJOjXv/61uY0f/ehHeuWVV/S73/2u7+tDaefr09jYGPF12q62bt0a8d/uK/B72i1btujkk09WVlaWli5dGjFBSdIZZ5yhkSNH6re//W3fbX/7t3+ryZMn69prr9WTTz4Z0/5ff/11XXDBBZo3b15EJqq0870ye/Zsff/739dVV13Vd/thhx2mOXPm6KGHHtKll14aaD+9r+W+nIOLfQ9zkx9z007MTf0xN0U36I30r3/9a5133nlauHChvv/976uwsFDx8fG65ZZb+t5ge6Knp0eS9L3vfW/Af4FL6vd7p90fe+utt/b7/Vuv9PR0dXR07PG4hlrYH+tL6nfC99rTN39xcbHOPvtsnX766SorK9NTTz2lhx9+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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n_samples_show = 2\n", + "\n", + "fig, axes = plt.subplots(nrows=1, ncols=n_samples_show, figsize=(10, 3))\n", + "\n", + "for ind, (i,c) in enumerate(train_data):\n", + " axes[ind].imshow(i[0,0], cmap=\"gray\")\n", + " axes[ind].set_xticks([])\n", + " axes[ind].set_yticks([])\n", + " axes[ind].set_title(\"Labeled: {}\".format(i.shape))\n", + " n_samples_show -= 1\n", + " if n_samples_show == 0:\n", + " break\n" + ] + }, + { + "cell_type": "markdown", + "id": "YCDeFqRpBT67", + "metadata": { + "id": "YCDeFqRpBT67" + }, + "source": [ + "**Modelo hibrido**\n", + "\n", + "Primero se define una capa de de red neuronal cuántica, en este caso, un EstimatorQNN. Esta se puede incrustar inicializando un TorchConnector(qnn).\n", + "\n", + "Para tener una retropropagación de gradiente adecuada en modelos híbridos, se establecera el parámetro inicial input_gradients en TRUE durante la inicialización de qnn." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "spORW8XD2iKd", + "metadata": { + "id": "spORW8XD2iKd" + }, + "outputs": [], + "source": [ + "def create_qnn():\n", + " feature_map = ZZFeatureMap(2)\n", + " ansatz = RealAmplitudes(2, reps=1)\n", + " qc = QuantumCircuit(2)\n", + " qc.compose(feature_map, inplace=True)\n", + " qc.compose(ansatz, inplace=True)\n", + "\n", + " # REMEMBER TO SET input_gradients=True FOR ENABLING HYBRID GRADIENT BACKPROP\n", + " qnn = EstimatorQNN(\n", + " circuit=qc,\n", + " input_params=feature_map.parameters,\n", + " weight_params=ansatz.parameters,\n", + " input_gradients=True,\n", + " )\n", + " return qnn\n", + "\n", + "\n", + "qnn4 = create_qnn()" + ] + }, + { + "cell_type": "markdown", + "id": "OnVbYOSoDPpk", + "metadata": { + "id": "OnVbYOSoDPpk" + }, + "source": [ + "En este punto se pueden crear diferentes combinaciones de capas y kernels. Mas adelante se mostrara una tabla con las combinaciones correspondientes.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "L9bxtfhq2iKd", + "metadata": { + "id": "L9bxtfhq2iKd" + }, + "outputs": [], + "source": [ + "class Net(Module):\n", + " def __init__(self, qnn):\n", + " super().__init__()\n", + " self.conv1 = Conv2d(1, 2, kernel_size=3)\n", + " self.conv2 = Conv2d(2, 16, kernel_size=3)\n", + " self.conv3 = Conv2d(16, 64, kernel_size=3)\n", + " self.dropout = Dropout2d()\n", + " self.fc1 = Linear(64, 128)\n", + " self.fc2 = Linear(128, 64) # 2-dimensional input to QNN\n", + " self.fc3 = Linear(64, 2) # 2-dimensional input to QNN\n", + " self.qnn = TorchConnector(qnn) # Apply torch connector, weights chosen\n", + " # uniformly at random from interval [-1,1].\n", + " self.fc4 = Linear(1, 1) # 1-dimensional output from QNN\n", + "\n", + " def forward(self, x):\n", + " x = F.relu(self.conv1(x))\n", + " x = F.max_pool2d(x, 2)\n", + " x = F.relu(self.conv2(x))\n", + " x = F.max_pool2d(x, 2)\n", + " x = F.relu(self.conv3(x))\n", + " x = F.max_pool2d(x, 2)\n", + " x = self.dropout(x)\n", + " x = x.view(x.shape[0], -1)\n", + " x = F.relu(self.fc1(x))\n", + " x = self.fc2(x)\n", + " x = self.fc3(x)\n", + " x = self.qnn(x) # apply QNN\n", + " x = self.fc4(x)\n", + " return cat((x, 1 - x), -1)\n", + "\n", + "\n", + "model4 = Net(qnn4)" + ] + }, + { + "cell_type": "markdown", + "id": "CvelV5ZkEU2w", + "metadata": { + "id": "CvelV5ZkEU2w" + }, + "source": [ + "**Manda llamar el modelo para entrenar**\n", + "\n", + "El entrenamiento varia dependiendo de el número de epocas o iteraciones que se coloquen para el mismo. Para conocer el error que se va teniendo en la iteración con el fin de mejorar el algoritmo, se ocupa la función NLLLOSS, la cual obtiene la pérdida de probabilidad logarítmica negativa. Esto es útil entrenar un problema de clasificación donde el dataset esta desbalanceado." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "_nTc2vyZ2iKe", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_nTc2vyZ2iKe", + "outputId": "1a9d70f6-26a6-44b6-e886-ba3ba68cabf4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training [5%]\tLoss: -1.7011\n", + "Training [10%]\tLoss: -2.4804\n", + "Training [15%]\tLoss: -3.1281\n", + "Training [20%]\tLoss: -3.7477\n", + "Training [25%]\tLoss: -4.3693\n", + "Training [30%]\tLoss: -4.9791\n", + "Training [35%]\tLoss: -5.5980\n", + "Training [40%]\tLoss: -6.2114\n", + "Training [45%]\tLoss: -6.8245\n", + "Training [50%]\tLoss: -7.4322\n", + "Training [55%]\tLoss: -8.0498\n", + "Training [60%]\tLoss: -8.6626\n", + "Training [65%]\tLoss: -9.2751\n", + "Training [70%]\tLoss: -9.8824\n", + "Training [75%]\tLoss: -10.5001\n", + "Training [80%]\tLoss: -11.1126\n", + "Training [85%]\tLoss: -11.7215\n", + "Training [90%]\tLoss: -12.3376\n", + "Training [95%]\tLoss: -12.9502\n", + "Training [100%]\tLoss: -13.5605\n" + ] + } + ], + "source": [ + "optimizer = optim.Adam(model4.parameters(), lr=0.001)\n", + "loss_func = NLLLoss()\n", + "\n", + "# Start training\n", + "epochs = 20 # Set number of epochs\n", + "loss_list = [] # Store loss history\n", + "model4.train() # Set model to training mode\n", + "\n", + "for epoch in range(epochs):\n", + " total_loss = []\n", + " for batch_idx, (data,label) in enumerate(train_data):\n", + " optimizer.zero_grad(set_to_none=True) # Initialize gradient\n", + " output = model4(data) # Forward pass\n", + " loss = loss_func(output, label) # Calculate loss\n", + " loss.backward() # Backward pass\n", + " optimizer.step() # Optimize weights\n", + " total_loss.append(loss.item()) # Store loss\n", + " loss_list.append(sum(total_loss) / len(total_loss))\n", + " print(\"Training [{:.0f}%]\\tLoss: {:.4f}\".format(100.0 * (epoch + 1) / epochs, loss_list[-1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "_fFpK5cv2iKe", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 472 + }, + "id": "_fFpK5cv2iKe", + "outputId": "1f8b0612-5843-43eb-cccb-ba59f180ff6c" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(loss_list)\n", + "plt.title(\"Hybrid NN Training Convergence\")\n", + "plt.xlabel(\"Training Iterations\")\n", + "plt.ylabel(\"Neg. Log Likelihood Loss\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "W9zV_hajGSM2", + "metadata": { + "id": "W9zV_hajGSM2" + }, + "source": [ + "Se guarda el modelo entrenado, para reutilizarlo más adelante y realizar inferencias." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "aZjv8jaZ2iKf", + "metadata": { + "id": "aZjv8jaZ2iKf" + }, + "outputs": [], + "source": [ + "torch.save(model4.state_dict(), \"model4.pt\")" + ] + }, + { + "cell_type": "markdown", + "id": "HV-2qD1EHJru", + "metadata": { + "id": "HV-2qD1EHJru" + }, + "source": [ + "**Evaluación**\n", + "\n", + "\n", + "Se recrea el modelo y se carga el estado del archivo previamente guardado. Se crea una capa QNN usando otro simulador" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "MYI6hX0k2iKf", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "MYI6hX0k2iKf", + "outputId": "327e9661-5578-4bf9-95a4-d12b06c11703" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qnn5 = create_qnn()\n", + "model5 = Net(qnn5)\n", + "model5.load_state_dict(torch.load(\"model4.pt\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "4JbIxKxV2iKg", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4JbIxKxV2iKg", + "outputId": "7ec03178-dfe3-4059-ccb1-9aaeb75c5a72" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Performance on test data:\n", + "\tLoss: -13.5411\n", + "\tAccuracy: 85.2%\n" + ] + } + ], + "source": [ + "model5.eval() # set model to evaluation mode\n", + "with no_grad():\n", + "\n", + " correct = 0\n", + " for batch_idx, (data, target) in enumerate(test_data):\n", + " output = model5(data)\n", + " if len(output.shape) == 1:\n", + " output = output.reshape(1, *output.shape)\n", + "\n", + " pred = output.argmax(dim=1, keepdim=True)\n", + " correct += pred.eq(target.view_as(pred)).sum().item()\n", + "\n", + " loss = loss_func(output, target)\n", + " total_loss.append(loss.item())\n", + "\n", + " print(\n", + " \"Performance on test data:\\n\\tLoss: {:.4f}\\n\\tAccuracy: {:.1f}%\".format(\n", + " sum(total_loss) / len(total_loss), correct / len(test_data) / 1 * 100\n", + " )\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "nU8ko0T02iKg", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 170 + }, + "id": "nU8ko0T02iKg", + "outputId": "05f2b18b-32a6-4648-cd9f-91b2c4ca4812" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxsAAACZCAYAAABHTieHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA1FUlEQVR4nO2de4weZfXHz267tFAKLd222730AmzttpQCCgYFJSAQLwiaYJQYNTFgUBMviRgvBDEYEY3RhIsmok0kEv7wDzRGMcbWasJFAQXpBUq73e6FttuWdmG729195/cHeef3PJ/tztnZ9519t/X7SYw9O/POPPM85zkzw3zPc+qSJElMCCGEEEIIIapMfa0bIIQQQgghhDg10cuGEEIIIYQQohD0siGEEEIIIYQoBL1sCCGEEEIIIQpBLxtCCCGEEEKIQtDLhhBCCCGEEKIQ9LIhhBBCCCGEKAS9bAghhBBCCCEKQS8bQgghhBBCiELQy4YQQgghhBCiEGrysrFx40arq6tL/zd79mxraWmxz3zmM9bT01PRsb/3ve/Zhz/8YVu6dKnV1dXZd77znYrbG7a1vr7empub7brrrrPNmzdP+Zh//vOf7bOf/axdcMEFNmvWLFu5cmXF7TyZKdInSqWS3XfffbZq1SqbO3euXXjhhfboo49O+XidnZ1RW2fNmmXLly+3j3zkI/bvf/97ysd97LHH7JOf/KS1t7dbXV2dXXXVVVM+1qmA4oTiRIj8Qf5A5BPyCSKfmJk+MbuWJ//ud79rq1atsqGhIXvqqads48aN9o9//MP++9//2ty5c6d0zG9/+9vW1NRkF198sT3xxBNVa+u1115rn/rUpyxJEtu9e7c9+OCDdvXVV9sf/vAHe//735/7eL/5zW/sscces0suucSam5ur1s6TnSJ84lvf+pbde++9duutt9qll15qjz/+uN1yyy1WV1dnH//4x6fc1k984hP2gQ98wMbGxmzbtm320EMP2R//+Ed76qmn7KKLLsp9vIceesieffZZu/TSS+3gwYNTbtephuKE4kSI/EH+QOQT8gkin5hhPpHUgF/96leJmSX//Oc/o79//etfT8wseeyxx6Z87N27dydJkiQHDhxIzCy56667KmjpW5hZ8oUvfCH62wsvvJCYWXLddddN6Zg9PT3J8ePHkyRJkg9+8IPJihUrKm3mSU1R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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n_samples_show = 6\n", + "count = 0\n", + "fig, axes = plt.subplots(nrows=1, ncols=n_samples_show, figsize=(10, 3))\n", + "\n", + "model5.eval()\n", + "with no_grad():\n", + " for batch_idx, (data, target) in enumerate(test_data):\n", + " if count == n_samples_show:\n", + " break\n", + " output = model5(data[0:1])\n", + " if len(output.shape) == 1:\n", + " output = output.reshape(1, *output.shape)\n", + "\n", + " pred = output.argmax(dim=1, keepdim=True)\n", + "\n", + " axes[count].imshow(data[0].numpy().squeeze(), cmap=\"gray\")\n", + "\n", + " axes[count].set_xticks([])\n", + " axes[count].set_yticks([])\n", + " titulo = \"R: \"+str(target.item()) + \", P: \"+ str(pred.item())\n", + " axes[count].set_title(titulo)\n", + "\n", + " count += 1" + ] + }, + { + "cell_type": "markdown", + "id": "6HIyTAoSH2Ly", + "metadata": { + "id": "6HIyTAoSH2Ly" + }, + "source": [ + "Se realizaron las siguientes combinaciones del modelo:\n", + "![photo_2023-11-10_01-55-35.jpg](data:image/jpeg;base64,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)\n", + "\n", + "En este caso nuestro dataset, funciona muy bien si redimensionamos las imágenes a 28 * 28, ya que incluso todos los resultados son mejores con este tamaño independiente de la combinación de capas o kernels. El resultado es muy bueno si se dejan 2 capas conv2d y 2 lineales y comienza a mejorar si se incrementa el número de épocas" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.10.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/hackathon/model4.pt b/hackathon/model4.pt new file mode 100644 index 0000000..37204bc Binary files /dev/null and b/hackathon/model4.pt differ diff --git a/hackathon/torch_prueba1.py b/hackathon/torch_prueba1.py new file mode 100644 index 0000000..9bdcb93 --- /dev/null +++ b/hackathon/torch_prueba1.py @@ -0,0 +1,132 @@ +import numpy as np +import matplotlib.pyplot as plt + +from torch import Tensor +from torch.nn import Linear, CrossEntropyLoss, MSELoss +from torch.optim import LBFGS + +from qiskit import QuantumCircuit +from qiskit.utils import algorithm_globals +from qiskit.circuit import Parameter +from qiskit.circuit.library import RealAmplitudes, ZZFeatureMap +from qiskit_machine_learning.neural_networks import SamplerQNN, EstimatorQNN +from qiskit_machine_learning.connectors import TorchConnector + +# Set seed for random generators +algorithm_globals.random_seed = 42 + +num_inputs = 2 +num_samples = 20 + +# Generate random input coordinates (X) and binary labels (y) +X = 2 * algorithm_globals.random.random([num_samples, num_inputs]) - 1 +y01 = 1 * (np.sum(X, axis=1) >= 0) # in { 0, 1}, y01 will be used for SamplerQNN example +y = 2 * y01 - 1 # in {-1, +1}, y will be used for EstimatorQNN example + +# Convert to torch Tensors +X_ = Tensor(X) +y01_ = Tensor(y01).reshape(len(y)).long() +y_ = Tensor(y).reshape(len(y), 1) + +# Plot dataset +for x, y_target in zip(X, y): + if y_target == 1: + plt.plot(x[0], x[1], "bo") + else: + plt.plot(x[0], x[1], "go") +plt.plot([-1, 1], [1, -1], "--", color="black") +# plt.show() + +print("====================EstimatorQNN===============================") + +feature_map = ZZFeatureMap(num_inputs) +ansatz = RealAmplitudes(num_inputs) +qc = QuantumCircuit(num_inputs) +qc.compose(feature_map, inplace=True) +qc.compose(ansatz, inplace=True) + +qnn1 = EstimatorQNN( + circuit=qc, input_params=feature_map.parameters, weight_params=ansatz.parameters +) + +# Set up PyTorch module +# Note: If we don't explicitly declare the initial weights +# they are chosen uniformly at random from [-1, 1]. +initial_weights = 0.1 * (2 * algorithm_globals.random.random(qnn1.num_weights) - 1) +model1 = TorchConnector(qnn1, initial_weights=initial_weights) +# print("Initial weights: ", initial_weights) + + + +optimizer = LBFGS(model1.parameters()) +f_loss = MSELoss(reduction="sum") + +# Start training +model1.train() # set model to training mode + + +# Note from (https://pytorch.org/docs/stable/optim.html): +# Some optimization algorithms such as LBFGS need to +# reevaluate the function multiple times, so you have to +# pass in a closure that allows them to recompute your model. +# The closure should clear the gradients, compute the loss, +# and return it. +def closure(): + optimizer.zero_grad() # Initialize/clear gradients + loss = f_loss(model1(X_), y_) # Evaluate loss function + loss.backward() # Backward pass + print(loss.item()) # Print loss + return loss + + +# Run optimizer step4 +optimizer.step(closure) + +print("====================SamplerQNN===============================") + +feature_map = ZZFeatureMap(num_inputs) +ansatz = RealAmplitudes(num_inputs, entanglement="linear", reps=1) + +# Define quantum circuit of num_qubits = input dim +# Append feature map and ansatz +qc = QuantumCircuit(num_inputs) +qc.compose(feature_map, inplace=True) +qc.compose(ansatz, inplace=True) + +# Define SamplerQNN and initial setup +parity = lambda x: "{:b}".format(x).count("1") % 2 # optional interpret function +output_shape = 2 # parity = 0, 1 +qnn2 = SamplerQNN( + circuit=qc, + input_params=feature_map.parameters, + weight_params=ansatz.parameters, + interpret=parity, + output_shape=output_shape, +) + +# Set up PyTorch module +# Reminder: If we don't explicitly declare the initial weights +# they are chosen uniformly at random from [-1, 1]. +initial_weights = 0.1 * (2 * algorithm_globals.random.random(qnn2.num_weights) - 1) +print("Initial weights: ", initial_weights) +model2 = TorchConnector(qnn2, initial_weights) + +# Define model, optimizer, and loss +optimizer = LBFGS(model2.parameters()) +f_loss = CrossEntropyLoss() # Our output will be in the [0,1] range + +# Start training +model2.train() + +# Define LBFGS closure method (explained in previous section) +def closure(): + optimizer.zero_grad(set_to_none=True) # Initialize gradient + loss = f_loss(model2(X_), y01_) # Calculate loss + loss.backward() # Backward pass + + print(loss.item()) # Print loss + return loss + + +# Run optimizer (LBFGS requires closure) +optimizer.step(closure) \ No newline at end of file