{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# MANUAL DE LABORATORIO DE COMUNICACIONES DIGITALES: PYTHON\n",
    "F. Javier Payán Somet, Juan José Murillo-Fuentes, José Carlos Aradillas Jaramillo \\\n",
    "_Departamento de Teoría de la Señal y Comunicaciones_ \\\n",
    "_Escuela Técnica Superior de Ingeniería_ \\\n",
    "_Universidad de Sevilla_ \n",
    "\n",
    "# Tema 3. Test de Hipótesis\n",
    "\n",
    "**Este notebook contiene código del Tema 3**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<table align=\"left\">\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/gapsc-us/labcomdig/blob/main/Tema3.Test_de_Hipotesis.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",
    "  </td>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Inicialización"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Python ≥3.5 is required\n",
    "import sys\n",
    "assert sys.version_info >= (3, 5)\n",
    "\n",
    "# Numpy ≥1.16 is required\n",
    "import numpy as np\n",
    "assert np.__version__ >= \"1.16\"\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Probabilidad de error"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Probabilidad de error en el caso binario"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Código 3.2**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cálculo de la probabilidad de error con ruido gaussiano y caso binario\n",
      "Umbral MAP, g: -0.27\n",
      "P_e para el detector MAP: 1.92E-02\n",
      "Umbral ML, g: 0.00\n",
      "P_e para el detector ML: 2.28E-02\n"
     ]
    }
   ],
   "source": [
    "# Rango de valores del vector de observación \n",
    "paso = 1e-6\n",
    "r = np.arange(-10,10,paso)\n",
    "\n",
    "# Probabilidades a priori\n",
    "P_0=1/4\n",
    "P_1=1-P_0\n",
    "\n",
    "# Valores de la variable aleatoria mensaje\n",
    "X_0 = -2\n",
    "X_1 = +2\n",
    "\n",
    "# Varianza del ruido aditivo en el canal\n",
    "vza = 1;\n",
    "\n",
    "# Funciones densidad de probabilidad condicionales\n",
    "f_0 = (1/(np.sqrt(2*np.pi*vza)))*np.exp(-((r-X_0)**2)/(2*vza)) # Caso X=X_0 \n",
    "f_1 = (1/(np.sqrt(2*np.pi*vza)))*np.exp(-((r-X_1)**2)/(2*vza)) # Caso X=X_1\n",
    "\"\"\"Alternativamente\n",
    "from labcomdig import fdpnormal\n",
    "f_0 = fdpnormal(r,X_0,vza)\n",
    "f_1 = fdpnormal(r,X_1,vza)\n",
    "\"\"\"\n",
    "\n",
    "# Encontrar la frontera de la región de decisión g con el detector MAP\n",
    "indexUmbral = np.where(P_1*f_1 > P_0*f_0)[0][0]\n",
    "g = r[indexUmbral]\n",
    "\"\"\" Alternativamente\n",
    "g = r[np.where(P_1*f_1 > P_0*f_0)][0]  \n",
    "#Primer valor (índice [0]) en el que P1f1>P0f0\n",
    "\"\"\"    \n",
    "print('Cálculo de la probabilidad de error con ruido gaussiano y caso binario')\n",
    "print('Umbral MAP, g: {:.2f}'.format(g))\n",
    "\n",
    "# Calcular las integrales de manera aproximada\n",
    "PC_0 = np.sum(f_0[:indexUmbral])*paso  # Pb de detección correcta si se transmite un cero\n",
    "PC_1 = np.sum(f_1[indexUmbral:])*paso  # Pb de detección correcta si se transmite un uno\n",
    "\"\"\"Alternativamente\n",
    "from scipy.integrate import quad\n",
    "F_0 = lambda r: (1/(np.sqrt(2*np.pi*vza)))*np.exp(-((r-X_0)**2)/(2*vza)) \n",
    "PC_0 = quad(F_0,y[0],g)[0]\n",
    "F_1 = lambda r: (1/(np.sqrt(2*np.pi*vza)))*np.exp(-((r-X_1)**2)/(2*vza)) \n",
    "PC_1 = quad(F_1,g,y[-1])[0]\n",
    "\"\"\"\n",
    "\n",
    "# La probabilidad correcta en el caso MAP\n",
    "PC = P_0*PC_0 + P_1*PC_1\n",
    "\n",
    "# La probabilidad de error en el caso MAP\n",
    "PE = 1 - PC\n",
    "print('P_e para el detector MAP: {:.2E}'.format(PE))\n",
    "\n",
    "# Encontrar la frontera de la región de decisión g con el detector ML\n",
    "indexUmbral = np.where(f_1 > f_0)[0][0]\n",
    "g = r[indexUmbral]\n",
    "\"\"\" Alternativamente\n",
    "g = y[np.where(P_1*f_1 > P_0*f_0)][0]  \n",
    "Primer valor (índice [0]) en el que P1f1>P0f0\n",
    "\"\"\"    \n",
    "print('Umbral ML, g: {:.2f}'.format(g))\n",
    "\n",
    "# Calcular las integrales de manera aproximada\n",
    "PC_0 = np.sum(f_0[:indexUmbral])*paso\n",
    "PC_1 = np.sum(f_1[indexUmbral:])*paso\n",
    "\"\"\"Alternativamente\n",
    "from scipy.integrate import quad\n",
    "F_0 = lambda y: (1/(np.sqrt(2*np.pi*vza)))*np.exp(-((y-X_0)**2)/(2*vza)) \n",
    "PC_0 = quad(F_0,y[0],g)[0]\n",
    "F_1 = lambda y: (1/(np.sqrt(2*np.pi*vza)))*np.exp(-((y-X_1)**2)/(2*vza)) \n",
    "PC_1 = quad(F_1,g,y[-1])[0]\n",
    "\"\"\"\n",
    "\n",
    "# La probabilidad correcta en el caso ML\n",
    "PC = P_0*PC_0 + P_1*PC_1\n",
    "\n",
    "# La probabilidad de error en el caso ML\n",
    "PE = 1 - PC\n",
    "print('P_e para el detector ML: {:.2E}'.format(PE))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Ejercicio propuesto"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "En un problema de test de hipótesis como el mostrado en la Figura 3.10, la variable aleatoria $X$ toma los valores {1, -1} con probabilidades 1/4 y 3/4 respectivamente. Se tiene que la variable aleatoria $N$ viene dada por $N = N_1 + N_2$, con $N_1$ y $N_2$ dos variables aleatorias uniformemente distribuidas entre [−1,1].\n",
    "\n",
    " <img src=https://raw.githubusercontent.com/gapsc-us/labcomdig/main/figures/deteccionBinP3.png style=\"max-width:40%;width:auto;height:auto;\" align=\"center\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**1.** Generar $N_p=1e6$ muestras de la variable aleatoria $X$. Representar su función masa de probabilidad estimada."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**2.** Generar $N_p=1e6$ muestras de la variable aleatoria $N$. Representar su función densidad de probabilidad estimada"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**3.** Representar las estimaciones de las funciones densidad de probabilidad condicional $f_{R|X=-1}(r|X =-1)$ y $f_{R|X=1}(r|X=1)$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**4.** Representar en una misma gráfica $qf_{R|X=-1}(r|X=-1)$ y $pf_{R|X=1}(r|X=1)$, siendo $p$ y $q$ las probabilidades a priori de la variable aleatoria $X$; esto es, $p = P(X=+1)$ y $q = P(X=-1)$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**5.** Encontrar experimentalmente la frontera de la región de decisión cuando el detector utiliza una regla MAP y cuando utiliza una regla ML."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**6.** Calcular las probabilidades $P_e(-1|Tx)$ y $P_e(+1|Tx)$ para el caso MAP y el caso ML"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**7.** Calcular la probabilidad de error del detector cuando siga las reglas MAP y ML."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**8.** Proponer una estimación de estas probabilidades de forma experimental y comprobar su coincidencia (o no) con el cálculo teórico"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "       a) A partir de las estimaciones de las funciones densidad de probabilidad."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "       b) A partir de conteo de muestras erróneas en el receptor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}