{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9b307888-39ee-40e5-9950-f6eabba9ba3f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "from scipy.integrate import IntegrationWarning\n",
    "\n",
    "# Ignore integration warnings\n",
    "warnings.simplefilter(\"ignore\", IntegrationWarning)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a068b19f-a17b-479a-9a3b-6632541f5a86",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Physical baryon density parameter (\\Omega_b h^2) from Planck\n",
    "obh2pl = 0.02236\n",
    "\n",
    "# Matter density parameter (\\Omega_m) from Planck\n",
    "ompl = 0.3166\n",
    "\n",
    "# Hubble constant (H_0) in km s^-1 Mpc^-1 from Planck\n",
    "H0pl = 67.27\n",
    "\n",
    "# Dimensionless Hubble parameter (h) from Planck\n",
    "h0pl = H0pl / 100\n",
    "\n",
    "# Dimensionless Hubble parameter (h) from Type Ia Supernovae\n",
    "h0riess = 0.7403\n",
    "\n",
    "# Cosmic Microwave Background (CMB) temperature in Kelvin\n",
    "Tcmb = 2.7255\n",
    "\n",
    "# Speed of light in vacuum in km s^-1\n",
    "c = 299792.458\n",
    "\n",
    "# Hubble distance scale (c / 100) in Mpc\n",
    "cH0 = 2997.92458"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "69f11549-198a-44de-b92f-8821c2331e63",
   "metadata": {},
   "outputs": [],
   "source": [
    "import mpmath\n",
    "import numpy as np\n",
    "# w(a) = w_0 + w_a * (1 - a)^n, i.e., nCPL model\n",
    "# For n=1 we get the usual CPL model\n",
    "def w(a, w0, wa, n):\n",
    "    return w0 + wa * (1 - a)**n\n",
    "\n",
    "# f_DE(a) for the nCPL model\n",
    "def f(a, w0, wa, n):\n",
    "    if wa == 0:\n",
    "        return a**(-3 * (1 + w0))\n",
    "    \n",
    "    harmonic_n = mpmath.harmonic(n)\n",
    "    hyper_term = mpmath.hyper([1, 1, 1 - n], [2, 2], a)\n",
    "    term1 = a**(-3 * (1 + w0 + wa))\n",
    "    term2 = mpmath.exp(-3 * wa * harmonic_n + 3 * a * n * wa * hyper_term)\n",
    "    return float(term1 * term2)\n",
    "\n",
    "# Define z_equality and a_equality in order to avoid some problems.\n",
    "# Tcmb is added as a parameter with a default value of 2.725 K.\n",
    "def zeq(om, h, Tcmb=2.725):\n",
    "    return 2.5*10**4 * om * (h**2) * (Tcmb / 2.7)**(-4)\n",
    "\n",
    "def aeq(om, h, Tcmb=2.725):\n",
    "    return 1.0 / (1.0 + zeq(om, h, Tcmb))\n",
    "\n",
    "#humble parameter\n",
    "def H(a, om, w0, wa, n, h):\n",
    "    # matter and radiation term\n",
    "    term_m_r = (a**-3) * om * (1 + aeq(om, h) / a)\n",
    "    # dark energy term\n",
    "    term_de = (1 - om * (1 + aeq(om, h))) * f(a, w0, wa, n)\n",
    "    \n",
    "    return 100 * h * np.sqrt(term_m_r + term_de)\n",
    "\n",
    "#sound speed\n",
    "def cs(a, obh2):\n",
    "    R = 31500 * obh2 * (Tcmb / 2.7)**-4 * a\n",
    "    return c / np.sqrt(3 * (1 + R))\n",
    "\n",
    "#redshift at decoupling\n",
    "def zcmb(om, obh2, h):\n",
    "    omh2 = om * h**2\n",
    "    g1 = (0.0783 * obh2**-0.238) / (1 + 39.5 * obh2**0.763)\n",
    "    g2 = 0.560 / (1 + 21.1 * obh2**1.81)\n",
    "    return 1048 * (1 + 0.00124 * obh2**-0.738) * (1 + g1 * omh2**g2)\n",
    "\n",
    "#drag redshift\n",
    "def zdrag(om, obh2, h):\n",
    "    omh2 = om * h**2\n",
    "    b1 = 0.313 * omh2**-0.419 * (1 + 0.607 * omh2**0.674)\n",
    "    b2 = 0.238 * omh2**0.223\n",
    "    \n",
    "    term1 = 1291 * omh2**0.251 / (1 + 0.659 * omh2**0.828)\n",
    "    term2 = 1 + b1 * obh2**b2\n",
    "    return term1 * term2\n",
    "\n",
    "from scipy.integrate import quad\n",
    "\n",
    "#comoving sound horizon at drag redshift\n",
    "def rs(ze, om, obh2, w0, wa, n, h):\n",
    "    lower_limit = 10**-11\n",
    "    upper_limit = 1.0 / (1.0 + ze)\n",
    "    \n",
    "    def integrand(x):\n",
    "        return cs(x, obh2) / (x**2 * H(x, om, w0, wa, n, h))\n",
    "    \n",
    "    \n",
    "    result, error = quad(integrand, lower_limit, upper_limit)\n",
    "    \n",
    "    return result\n",
    "    \n",
    "#luminosity distance\n",
    "from scipy.integrate import solve_ivp\n",
    "from functools import lru_cache\n",
    "\n",
    "@lru_cache(maxsize=None)\n",
    "def DLsol(om, w0, wa, n, h):\n",
    "    def dy_dz(zz, y):\n",
    "        a = 1.0 / (1.0 + zz)\n",
    "        return 1.0 / (H(a, om, w0, wa, n, h) / (100.0 * h))\n",
    "    sol = solve_ivp(dy_dz, [0, 1300], [0.0], dense_output=True)\n",
    "    return sol.sol\n",
    "\n",
    "def DL(z, om, w0, wa, n, h):\n",
    "    sol_func = DLsol(om, w0, wa, n, h)\n",
    "    y_val = sol_func(z)[0]\n",
    "    dL_val = y_val * (1.0 + z)\n",
    "    return (c / (100.0 * h)) * dL_val\n",
    "    \n",
    "#angular diameter distance\n",
    "def DA(z, om, w0, wa, n, h):\n",
    "    return DL(z, om, w0, wa, n, h) / (1.0 + z)**2\n",
    "    \n",
    "#volume averaged distance\n",
    "def Dv(zbao, om, w0, wa, n, h):\n",
    "    dl_term = DL(zbao, om, w0, wa, n, h) / (1.0 + zbao)\n",
    "    h_val = H(1.0 / (1.0 + zbao), om, w0, wa, n, h)\n",
    "    \n",
    "    return ((dl_term**2) * (c * zbao) / h_val)**(1.0 / 3.0)\n",
    "\n",
    "#BAO dz ratio\n",
    "def dz(zbao, om, obh2, w0, wa, n, h):\n",
    "    term1 = rs(zdrag(om, obh2, h), om, obh2, w0, wa, n, h)\n",
    "    term2 = Dv(zbao, om, w0, wa, n, h)\n",
    "    return term1/term2\n",
    "\n",
    "#DH distance\n",
    "def DH(z, om, w0, wa, n, h):\n",
    "    return c/H(1/(1+z), om, w0, wa, n, h)\n",
    "\n",
    "def hz(z, om, w0, wa, n, h):\n",
    "    return H(1/(1+z), om, w0, wa, n, h)\n",
    "\n",
    "#shift parameter\n",
    "def R(om, obh2, w0, wa, n, h):\n",
    "    term1 = np.sqrt(om*(100*h)**2) * DA(zcmb(om, obh2, h), om, w0, wa, n, h)\n",
    "    term2 = 1 + zcmb(om, obh2, h)\n",
    "    return term1*term2/c\n",
    "\n",
    "#angular scale of sound horizon at recombination\n",
    "def la(om, obh2, w0, wa, n, h):\n",
    "    term1 = np.pi * DA(zcmb(om, obh2, h), om, w0, wa, n, h)\n",
    "    term2 = 1 + zcmb(om, obh2, h)\n",
    "    term3 = rs(zcmb(om, obh2, h), om, obh2, w0, wa, n, h)\n",
    "    return term1*term2/term3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "a8403542-1fc5-452d-8204-2d209627a6d5",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Data combination\n",
    "#CMB data\n",
    "datacmb = np.array([1.74963, 301.80845, 0.02237])\n",
    "\n",
    "# Covariance Matrix for {R, l_a, Omega_b h^2}\n",
    "covcmb = 10**-8 * np.array([\n",
    "    [1598.9554,  17112.007,  -36.311179],\n",
    "    [17112.007,  811208.45,  -494.79813],\n",
    "    [-36.311179, -494.79813,  2.1242182]\n",
    "])\n",
    "\n",
    "# Inverse Covariance Matrix\n",
    "invcov = np.linalg.inv(covcmb)\n",
    "\n",
    "# Number of CMB data points\n",
    "ndatCMB = len(datacmb)\n",
    "\n",
    "# Vector of residuals (Model - Data)\n",
    "def vec(om, obh2, w0, wa, n, h):\n",
    "    return np.array([\n",
    "        R(om, obh2, w0, wa, n, h) - datacmb[0],\n",
    "        la(om, obh2, w0, wa, n, h) - datacmb[1],\n",
    "        obh2 - datacmb[2]\n",
    "    ])\n",
    "\n",
    "# chi^2 function for CMB shift parameters\n",
    "def chi2R(om, obh2, w0, wa, n, h):\n",
    "    v = vec(om, obh2, w0, wa, n, h)\n",
    "    return v.T @ invcov @ v\n",
    "\n",
    "#ΒΑΟ data\n",
    "databao = np.array([\n",
    "    [0.106, 0.336, 0.015],\n",
    "    [0.44, 0.073, 0.031],\n",
    "    [0.6, 0.0726, 0.0164],\n",
    "    [0.73, 0.0592, 0.0185]\n",
    "])\n",
    "\n",
    "\n",
    "Cijbaoinv = np.array([\n",
    "    [1 / (databao[0, 2]**2), 0, 0, 0],\n",
    "    [0, 1040.3, -807.5, 336.8],\n",
    "    [0, -807.5, 3720.3, -1551.9],\n",
    "    [0, 336.8, -1551.9, 2914.9]\n",
    "])\n",
    "\n",
    "def vecbao(om, obh2, w0, wa, n, h):\n",
    "    return np.array([\n",
    "        databao[i, 1] - dz(databao[i, 0], om, obh2, w0, wa, n, h)\n",
    "        for i in range(len(databao))\n",
    "    ])\n",
    "\n",
    "#SDSS\n",
    "dataSDSS = np.array([\n",
    "    [0.15, 4.465666824, 0.1681350461],\n",
    "    [0.32, 8.4673, 0.167],\n",
    "    [0.57, 13.7728, 0.134],\n",
    "])\n",
    "\n",
    "#Ly-a\n",
    "dataLya = np.array([\n",
    "    [2.34, 11.2005988024, 0.56],\n",
    "    [2.34, 8.86, 0.29],\n",
    "])\n",
    "\n",
    "CijLyainv = np.array([\n",
    "    [1 / (dataLya[0, 2]**2), 0 ],\n",
    "    [0, 1 / (dataLya[1, 2]**2)]\n",
    "])\n",
    "\n",
    "def vecLya(om, obh2, w0, wa, n, h):\n",
    "    return np.array([\n",
    "        dataLya[0, 1] - DA(dataLya[0, 0], om, w0, wa, n, h) / rs(zdrag(om, obh2, h), om, obh2, w0, wa, n, h),\n",
    "        dataLya[1, 1] - DH(dataLya[1, 0], om, w0, wa, n, h) / rs(zdrag(om, obh2, h), om, obh2, w0, wa, n, h)\n",
    "    ])\n",
    "\n",
    "ndatBAO = len(dataSDSS) + len(databao) + len(dataLya)\n",
    "\n",
    "#total BAO χ^2\n",
    "def chi2bao(om, obh2, w0, wa, n, h):\n",
    "    v_bao = vecbao(om, obh2, w0, wa, n, h)\n",
    "    v_lya = vecLya(om, obh2, w0, wa, n, h)\n",
    "    \n",
    "    term_bao = v_bao.T @ Cijbaoinv @ v_bao\n",
    "    \n",
    "    term_sdss = sum(\n",
    "        ((dataSDSS[i, 1] - 1 / dz(dataSDSS[i, 0], om, obh2, w0, wa, n, h))**2) / (dataSDSS[i, 2]**2)\n",
    "        for i in range(len(dataSDSS))\n",
    "    )\n",
    "    \n",
    "    term_lya = v_lya.T @ CijLyainv @ v_lya\n",
    "    \n",
    "    return term_bao + term_sdss + term_lya"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "cf4fe375-50ce-449f-a684-81226c0179ec",
   "metadata": {},
   "outputs": [
    {
     "ename": "OSError",
     "evalue": "[Errno 9] Bad file descriptor: 'lcparam_full_long_zhel.txt'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mOSError\u001b[0m                                   Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[5], line 3\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[38;5;66;03m#full pantheon data\u001b[39;00m\n\u001b[0;32m      2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[1;32m----> 3\u001b[0m dataPanth \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mread_csv(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlcparam_full_long_zhel.txt\u001b[39m\u001b[38;5;124m\"\u001b[39m, sep\u001b[38;5;241m=\u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124ms+\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m      4\u001b[0m ndatPanth \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(dataPanth)\n\u001b[0;32m      5\u001b[0m Dij0 \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mloadtxt(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msys_full_long.txt\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:1026\u001b[0m, in \u001b[0;36mread_csv\u001b[1;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[0;32m   1013\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[0;32m   1014\u001b[0m     dialect,\n\u001b[0;32m   1015\u001b[0m     delimiter,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m   1022\u001b[0m     dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[0;32m   1023\u001b[0m )\n\u001b[0;32m   1024\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[1;32m-> 1026\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _read(filepath_or_buffer, kwds)\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:620\u001b[0m, in \u001b[0;36m_read\u001b[1;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[0;32m    617\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[0;32m    619\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[1;32m--> 620\u001b[0m parser \u001b[38;5;241m=\u001b[39m TextFileReader(filepath_or_buffer, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds)\n\u001b[0;32m    622\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[0;32m    623\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m parser\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:1620\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[1;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[0;32m   1617\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m   1619\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m-> 1620\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_make_engine(f, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mengine)\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:1880\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[1;34m(self, f, engine)\u001b[0m\n\u001b[0;32m   1878\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m mode:\n\u001b[0;32m   1879\u001b[0m         mode \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m-> 1880\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;241m=\u001b[39m get_handle(\n\u001b[0;32m   1881\u001b[0m     f,\n\u001b[0;32m   1882\u001b[0m     mode,\n\u001b[0;32m   1883\u001b[0m     encoding\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mencoding\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[0;32m   1884\u001b[0m     compression\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcompression\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[0;32m   1885\u001b[0m     memory_map\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmemory_map\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mFalse\u001b[39;00m),\n\u001b[0;32m   1886\u001b[0m     is_text\u001b[38;5;241m=\u001b[39mis_text,\n\u001b[0;32m   1887\u001b[0m     errors\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mencoding_errors\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstrict\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[0;32m   1888\u001b[0m     storage_options\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstorage_options\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[0;32m   1889\u001b[0m )\n\u001b[0;32m   1890\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m   1891\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles\u001b[38;5;241m.\u001b[39mhandle\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\pandas\\io\\common.py:873\u001b[0m, in \u001b[0;36mget_handle\u001b[1;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[0;32m    868\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(handle, \u001b[38;5;28mstr\u001b[39m):\n\u001b[0;32m    869\u001b[0m     \u001b[38;5;66;03m# Check whether the filename is to be opened in binary mode.\u001b[39;00m\n\u001b[0;32m    870\u001b[0m     \u001b[38;5;66;03m# Binary mode does not support 'encoding' and 'newline'.\u001b[39;00m\n\u001b[0;32m    871\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mencoding \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mmode:\n\u001b[0;32m    872\u001b[0m         \u001b[38;5;66;03m# Encoding\u001b[39;00m\n\u001b[1;32m--> 873\u001b[0m         handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(\n\u001b[0;32m    874\u001b[0m             handle,\n\u001b[0;32m    875\u001b[0m             ioargs\u001b[38;5;241m.\u001b[39mmode,\n\u001b[0;32m    876\u001b[0m             encoding\u001b[38;5;241m=\u001b[39mioargs\u001b[38;5;241m.\u001b[39mencoding,\n\u001b[0;32m    877\u001b[0m             errors\u001b[38;5;241m=\u001b[39merrors,\n\u001b[0;32m    878\u001b[0m             newline\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m    879\u001b[0m         )\n\u001b[0;32m    880\u001b[0m     \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m    881\u001b[0m         \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[0;32m    882\u001b[0m         handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(handle, ioargs\u001b[38;5;241m.\u001b[39mmode)\n",
      "\u001b[1;31mOSError\u001b[0m: [Errno 9] Bad file descriptor: 'lcparam_full_long_zhel.txt'"
     ]
    }
   ],
   "source": [
    "#full pantheon data\n",
    "import pandas as pd\n",
    "dataPanth = pd.read_csv(\"lcparam_full_long_zhel.txt\", sep=r'\\s+')\n",
    "ndatPanth = len(dataPanth)\n",
    "Dij0 = np.loadtxt(\"sys_full_long.txt\")\n",
    "Dij = Dij0[1:].reshape((1048,1048))\n",
    "Id = np.ones(ndatPanth)\n",
    "#Construct of the covariance using only the statistical uncertainties\n",
    "Covstat = np.diag(dataPanth.iloc[:, 5]**2)\n",
    "#Construct of the covariance using only the systematic uncertainties\n",
    "Covsys = Dij\n",
    "Cijtot = Covsys + Covstat\n",
    "InvCovTotal = np.linalg.inv(Cijtot)\n",
    "InvCovstat = np.linalg.inv(Covstat)\n",
    "\n",
    "# χ^2 for the pantheon data\n",
    "def chi2Panth(M, om, w0, wa, n, h):\n",
    "    zcmb = dataPanth.iloc[:, 1].values  \n",
    "    zhel = dataPanth.iloc[:, 2].values  \n",
    "    mb = dataPanth.iloc[:, 4].values\n",
    "    dl_vals = DL(zcmb, om, w0, wa, n, h)\n",
    "    delta_m = mb - (M + 5 * np.log10(((1 + zhel) / (1 + zcmb)) * dl_vals) + 25)\n",
    "    chi2 = delta_m.T @ InvCovTotal @ delta_m\n",
    "    return chi2\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "e40a7457-7c85-4d12-ab43-906b35dfe5be",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1060\n",
      "Test Mathematica point in Python: 1032.8152046282437\n",
      "1026.259730262297\n",
      "0.12038195926556611\n",
      "6.43509240668118\n"
     ]
    }
   ],
   "source": [
    "#total χ^2\n",
    "def chi2total(M, om, w0, wa, h):\n",
    "    return chi2R(om, obh2pl, w0, wa, 1.0, h) + chi2bao(om, obh2pl, w0, wa, 1.0, h) + chi2Panth(M, om, w0, wa, 1.0, h)\n",
    "ndatot = ndatCMB + ndatBAO + ndatPanth\n",
    "print(ndatot)\n",
    "test_val = chi2total(-19.4294, 0.316911, -1, 0, 0.672379)\n",
    "print(\"Test Mathematica point in Python:\", test_val)\n",
    "x_val = chi2Panth(-19.4294, 0.316911, -1.0, 0.0, 1.0, 0.672379)\n",
    "print(x_val)\n",
    "y_val = chi2R(0.316911, obh2pl, -1.0, 0.0, 1, 0.672379)\n",
    "print(y_val)\n",
    "z_val = chi2bao(0.316911, obh2pl, -1.0, 0.0, 1, 0.672379)\n",
    "print(z_val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "81cb9b6d-ac47-4520-94ec-6676c3a7a5cd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum chi2: 1032.790623469142\n",
      "Mlcdm = -19.428583685268908\n",
      "omlcdm = 0.3165893176224527\n",
      "wolcdm = -1\n",
      "walcdm = 0\n",
      "hlcdm = 0.6725515837865229\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from scipy.optimize import basinhopping\n",
    "\n",
    "def obj_lcdm(params):\n",
    "    M, om, h = params\n",
    "    if om <= 0.01 or om >= 0.99 or h <= 0.1 or h >= 1.5:\n",
    "        return 1e10\n",
    "    try:\n",
    "        val = chi2total(M, om, -1, 0, h)\n",
    "        if np.isnan(val):\n",
    "            return 1e10\n",
    "        return val\n",
    "    except:\n",
    "        return 1e10\n",
    "\n",
    "initial_guess = [-19.05, 0.3205, 0.6705]\n",
    "\n",
    "minimizer_kwargs = {\n",
    "    \"method\": \"Powell\",\n",
    "    \"bounds\": [(None, None), (0.01, 0.99), (0.1, 1.5)],\n",
    "    \"options\": {'ftol': 1e-12, 'xtol': 1e-12}\n",
    "}\n",
    "\n",
    "minlcdm = basinhopping(\n",
    "    obj_lcdm,\n",
    "    x0=initial_guess,\n",
    "    minimizer_kwargs=minimizer_kwargs,\n",
    "    niter=10,\n",
    "    stepsize=0.05,\n",
    "    T=1.0\n",
    ")\n",
    "\n",
    "Mlcdm = minlcdm.x[0]\n",
    "omlcdm = minlcdm.x[1]\n",
    "wolcdm = -1\n",
    "walcdm = 0\n",
    "hlcdm = minlcdm.x[2]\n",
    "\n",
    "print(\"Minimum chi2:\", minlcdm.fun)\n",
    "print(\"Mlcdm =\", Mlcdm)\n",
    "print(\"omlcdm =\", omlcdm)\n",
    "print(\"wolcdm =\", wolcdm)\n",
    "print(\"walcdm =\", walcdm)\n",
    "print(\"hlcdm =\", hlcdm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "5297ca97-bab8-430f-96e9-0661e601225e",
   "metadata": {},
   "outputs": [],
   "source": [
    "#χ^2 for the wCDM model using all three likelihoods\n",
    "def obj_wwcdm(params):\n",
    "    M, om, w0, h = params\n",
    "    if om <= 0.01 or om >= 0.99 or w0 <= -3.0 or w0 >= 1.0 or h <= 0.1 or h >= 1.5:\n",
    "        return 1e10\n",
    "    try:\n",
    "        val = chi2total(M, om, w0, 0, h)\n",
    "        if np.isnan(val):\n",
    "            return 1e10\n",
    "        return val\n",
    "    except:\n",
    "        return 1e10\n",
    "\n",
    "initial_guess_wwcdm = [-19.05, 0.3205, -1.0, 0.6705]\n",
    "\n",
    "minimizer_kwargs_wwcdm = {\n",
    "    \"method\": \"Powell\",\n",
    "    \"bounds\": [(None, None), (0.01, 0.99), (-3.0, 1.0), (0.1, 1.5)],\n",
    "    \"options\": {'ftol': 1e-12, 'xtol': 1e-12}\n",
    "}\n",
    "\n",
    "minwwcdm = basinhopping(\n",
    "    obj_wwcdm,\n",
    "    x0=initial_guess_wwcdm,\n",
    "    minimizer_kwargs=minimizer_kwargs_wwcdm,\n",
    "    niter=10,\n",
    "    stepsize=0.05,\n",
    "    T=1.0\n",
    ")\n",
    "\n",
    "Mwwcdm = minwwcdm.x[0]\n",
    "omwwcdm = minwwcdm.x[1]\n",
    "wowwcdm = minwwcdm.x[2]\n",
    "wawwcdm = 0\n",
    "hwwcdm = minwwcdm.x[3]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "22316e51-72d2-442c-b087-cfd57df45c9d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum chi2: 1032.6923784195606\n",
      "Mwwcdm = -19.423397527158578\n",
      "omwwcdm = 0.31448391244009194\n",
      "wowwcdm = -1.010353662710515\n",
      "wawwcdm = 0\n",
      "hwwcdm = 0.6751045297764388\n"
     ]
    }
   ],
   "source": [
    "print(\"Minimum chi2:\", minwwcdm.fun)\n",
    "print(\"Mwwcdm =\", Mwwcdm)\n",
    "print(\"omwwcdm =\", omwwcdm)\n",
    "print(\"wowwcdm =\", wowwcdm)\n",
    "print(\"wawwcdm =\", wawwcdm)\n",
    "print(\"hwwcdm =\", hwwcdm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "6d001561-b995-49e2-9472-9822797cb0c6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum chi2: 1031.8200001076448\n",
      "Mcpl = -19.434704767652953\n",
      "omcpl = 0.31459788748449363\n",
      "wocpl = -1.0810461575469668\n",
      "wacpl = 0.2798726755788088\n",
      "hcpl = 0.6742663679712206\n"
     ]
    }
   ],
   "source": [
    "#χ^2 for the CPL model using all three likelihoods\n",
    "def obj_cpl(params):\n",
    "    M, om, w0, wa, h = params\n",
    "    if om <= 0.01 or om >= 0.99 or w0 <= -3.0 or w0 >= 1.0 or wa <= -3.0 or wa >= 3.0 or h <= 0.1 or h >= 1.5:\n",
    "        return 1e10\n",
    "    try:\n",
    "        val = chi2total(M, om, w0, wa, h)\n",
    "        if np.isnan(val):\n",
    "            return 1e10\n",
    "        return val\n",
    "    except:\n",
    "        return 1e10\n",
    "\n",
    "initial_guess_cpl = [-19.05, 0.3205, -1.0, 0.0, 0.6705]\n",
    "\n",
    "minimizer_kwargs_cpl = {\n",
    "    \"method\": \"Powell\",\n",
    "    \"bounds\": [(None, None), (0.01, 0.99), (-3.0, 1.0), (-3.0, 3.0), (0.1, 1.5)],\n",
    "    \"options\": {'ftol': 1e-12, 'xtol': 1e-12}\n",
    "}\n",
    "\n",
    "mincpl = basinhopping(\n",
    "    obj_cpl,\n",
    "    x0=initial_guess_cpl,\n",
    "    minimizer_kwargs=minimizer_kwargs_cpl,\n",
    "    niter=10,\n",
    "    stepsize=0.05,\n",
    "    T=1.0\n",
    ")\n",
    "\n",
    "Mcpl = mincpl.x[0]\n",
    "omcpl = mincpl.x[1]\n",
    "wocpl = mincpl.x[2]\n",
    "wacpl = mincpl.x[3]\n",
    "hcpl = mincpl.x[4]\n",
    "\n",
    "print(\"Minimum chi2:\", mincpl.fun)\n",
    "print(\"Mcpl =\", Mcpl)\n",
    "print(\"omcpl =\", omcpl)\n",
    "print(\"wocpl =\", wocpl)\n",
    "print(\"wacpl =\", wacpl)\n",
    "print(\"hcpl =\", hcpl)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e9583fb3-1a6c-4bb6-9e79-0e74403f2621",
   "metadata": {},
   "outputs": [],
   "source": [
    "#Adding Riess point \n",
    "def chi2riessh(h):\n",
    "    return (h - h0riess)**2/(0.0142)**2\n",
    "\n",
    "def chi2total5(M, om, w0, wa, h):\n",
    "    return chi2R(om, obh2pl, w0, wa, 1.0, h) + chi2bao(om, obh2pl, w0, wa, 1.0, h) + chi2Panth(M, om, w0, wa, 1.0, h) + chi2riessh(h)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "8ea97f67-17c3-4f99-bb48-2d90614e7777",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum chi2: 1047.8763051813364\n",
      "Mwcdm = -19.385712873484604\n",
      "omwcdm = 0.2983761994240545\n",
      "wowcdm = -1.074074768570873\n",
      "wawcdm = 0\n",
      "hwcdm = 0.6934669355181287\n"
     ]
    }
   ],
   "source": [
    "#χ^2 for the wCDM model using all three likelihoods and adding the Riess point\n",
    "def obj_wcdm(params):\n",
    "    M, om, w0, h = params\n",
    "    if om <= 0.01 or om >= 0.99 or w0 <= -3.0 or w0 >= 1.0 or h <= 0.1 or h >= 1.5:\n",
    "        return 1e10\n",
    "    try:\n",
    "        val = chi2total5(M, om, w0, 0, h)\n",
    "        if np.isnan(val):\n",
    "            return 1e10\n",
    "        return val\n",
    "    except:\n",
    "        return 1e10\n",
    "\n",
    "initial_guess_wcdm = [-19.05, 0.3205, -1.0, 0.6705]\n",
    "\n",
    "minimizer_kwargs_wcdm = {\n",
    "    \"method\": \"Powell\",\n",
    "    \"bounds\": [(None, None), (0.01, 0.99), (-3.0, 1.0), (0.1, 1.5)],\n",
    "    \"options\": {'ftol': 1e-12, 'xtol': 1e-12}\n",
    "}\n",
    "\n",
    "minwcdm = basinhopping(\n",
    "    obj_wcdm,\n",
    "    x0=initial_guess_wcdm,\n",
    "    minimizer_kwargs=minimizer_kwargs_wcdm,\n",
    "    niter=10,\n",
    "    stepsize=0.05,\n",
    "    T=1.0\n",
    ")\n",
    "\n",
    "Mwcdm = minwcdm.x[0]\n",
    "omwcdm = minwcdm.x[1]\n",
    "wowcdm = minwcdm.x[2]\n",
    "wawcdm = 0\n",
    "hwcdm = minwcdm.x[3]\n",
    "\n",
    "print(\"Minimum chi2:\", minwcdm.fun)\n",
    "print(\"Mwcdm =\", Mwcdm)\n",
    "print(\"omwcdm =\", omwcdm)\n",
    "print(\"wowcdm =\", wowcdm)\n",
    "print(\"wawcdm =\", wawcdm)\n",
    "print(\"hwcdm =\", hwcdm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "7117e4d9-c823-4fde-9a8f-13bcb3a9106e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minimum chi2: 1047.343501344547\n",
      "Mcplriess = -19.393001034158825\n",
      "omwcplriess = 0.29825785029821916\n",
      "wocplriess = -1.1250300172029628\n",
      "wacplriess = 0.20672207438886622\n",
      "hcplriess = 0.6931120500377138\n"
     ]
    }
   ],
   "source": [
    "#χ^2 for the wCDM model using all three likelihoods and adding the Riess point\n",
    "def obj_cplriess(params):\n",
    "    M, om, w0, wa, h = params\n",
    "    if om <= 0.01 or om >= 0.99 or w0 <= -3.0 or w0 >= 1.0 or wa <= -3.0 or w0 >= 3.0 or h <= 0.1 or h >= 1.5:\n",
    "        return 1e10\n",
    "    try:\n",
    "        val = chi2total5(M, om, w0, wa, h)\n",
    "        if np.isnan(val):\n",
    "            return 1e10\n",
    "        return val\n",
    "    except:\n",
    "        return 1e10\n",
    "\n",
    "initial_guess_cplriess = [-19.05, 0.3205, -1.0, 0.0, 0.6705]\n",
    "\n",
    "minimizer_kwargs_cplriess = {\n",
    "    \"method\": \"Powell\",\n",
    "    \"bounds\": [(None, None), (0.01, 0.99), (-3.0, 1.0), (-3.0, 3.0), (0.1, 1.5)],\n",
    "    \"options\": {'ftol': 1e-12, 'xtol': 1e-12}\n",
    "}\n",
    "\n",
    "mincplriess = basinhopping(\n",
    "    obj_cplriess,\n",
    "    x0=initial_guess_cplriess,\n",
    "    minimizer_kwargs=minimizer_kwargs_cplriess,\n",
    "    niter=10,\n",
    "    stepsize=0.05,\n",
    "    T=1.0\n",
    ")\n",
    "\n",
    "Mcplriess = mincplriess.x[0]\n",
    "omcplriess = mincplriess.x[1]\n",
    "wocplriess = mincplriess.x[2]\n",
    "wacplriess = mincplriess.x[3]\n",
    "hcplriess = mincplriess.x[4]\n",
    "\n",
    "print(\"Minimum chi2:\", mincplriess.fun)\n",
    "print(\"Mcplriess =\", Mcplriess)\n",
    "print(\"omwcplriess =\", omcplriess)\n",
    "print(\"wocplriess =\", wocplriess)\n",
    "print(\"wacplriess =\", wacplriess)\n",
    "print(\"hcplriess =\", hcplriess)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "93de3c36-410a-41a5-a9e5-21b275c10e1c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "chi2_lcdm = 1032.7906234691416\n",
    "Mlcdm = -19.428583683289137\n",
    "omlcdm = 0.3165893182993782\n",
    "wolcdm = -1\n",
    "walcdm = 0\n",
    "hlcdm = 0.6725515834715047\n",
    "\n",
    "chi2_wwcdm = 1032.6923784195612\n",
    "Mwwcdm = -19.423397513557912\n",
    "omwwcdm = 0.31448390671613147\n",
    "wowwcdm = -1.0103536947470049\n",
    "wawwcdm = 0\n",
    "hwwcdm = 0.6751045370485488\n",
    "\n",
    "chi2_cpl = 1031.8200001076264\n",
    "Mcpl = -19.434704769334335\n",
    "omcpl = 0.3145979001968007\n",
    "wocpl = -1.081045814578108\n",
    "wacpl = 0.27987150856828413\n",
    "hcpl = 0.6742663592877898\n",
    "\n",
    "#με Riess\n",
    "chi2_wcdm = 1047.8763051813364\n",
    "Mwcdm = -19.385712873484604\n",
    "omwcdm = 0.2983761994240545\n",
    "wowcdm = -1.074074768570873\n",
    "wawcdm = 0\n",
    "hwcdm = 0.6934669355181287\n",
    "\n",
    "chi2_cplriess = 1047.343501344547\n",
    "Mcplriess = -19.393001034158825\n",
    "omcplriess = 0.29825785029821916\n",
    "wocplriess = -1.1250300172029628\n",
    "wacplriess = 0.20672207438886622\n",
    "hcplriess = 0.6931120500377138\n",
    "\n",
    "\n",
    "np.savez('cosmology_parameters_22.npz',\n",
    "         chi2_lcdm=chi2_lcdm, Mlcdm=Mlcdm, omlcdm=omlcdm, wolcdm=wolcdm, walcdm=walcdm, hlcdm=hlcdm,\n",
    "         chi2_wwcdm=chi2_wwcdm, Mwwcdm=Mwwcdm, omwwcdm=omwwcdm, wowwcdm=wowwcdm, wawwcdm=wawwcdm, hwwcdm=hwwcdm,\n",
    "         chi2_cpl=chi2_cpl, Mcpl=Mcpl, omcpl=omcpl, wocpl=wocpl, wacpl=wacpl, hcpl=hcpl,\n",
    "         chi2_wcdm=chi2_wcdm, Mwcdm=Mwcdm, omwcdm=omwcdm, wowcdm=wowcdm, wawcdm=wawcdm, hwcdm=hwcdm,\n",
    "         chi2_cplriess=chi2_cplriess, Mcplriess=Mcplriess, omcplriess=omcplriess, wocplriess=wocplriess, wacplriess=wacplriess, hcplriess=hcplriess)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "52f0f64a-9aad-4a1f-95fc-cfdf3da6da7b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Δχ^2 για 1σ, 2 παράμετροι: 2.295748928898636\n"
     ]
    }
   ],
   "source": [
    "#dchi\n",
    "import scipy.stats as stats\n",
    "import scipy.special as special\n",
    "\n",
    "def dchi(nsig, M):\n",
    "    p = special.erf(nsig / np.sqrt(2))\n",
    "    return stats.chi2.ppf(p, M)\n",
    "\n",
    "print(\"Δχ^2 για 1σ, 2 παράμετροι:\", dchi(1, 2)) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "c3d7440f-3ee2-49a2-b632-252049b35ed1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting pathos\n",
      "  Downloading pathos-0.3.5-py3-none-any.whl.metadata (11 kB)\n",
      "Collecting ppft>=1.7.8 (from pathos)\n",
      "  Downloading ppft-1.7.8-py3-none-any.whl.metadata (12 kB)\n",
      "Collecting dill>=0.4.1 (from pathos)\n",
      "  Downloading dill-0.4.1-py3-none-any.whl.metadata (10 kB)\n",
      "Collecting pox>=0.3.7 (from pathos)\n",
      "  Downloading pox-0.3.7-py3-none-any.whl.metadata (8.0 kB)\n",
      "Collecting multiprocess>=0.70.19 (from pathos)\n",
      "  Downloading multiprocess-0.70.19-py312-none-any.whl.metadata (7.5 kB)\n",
      "Downloading pathos-0.3.5-py3-none-any.whl (82 kB)\n",
      "Downloading dill-0.4.1-py3-none-any.whl (120 kB)\n",
      "Downloading multiprocess-0.70.19-py312-none-any.whl (150 kB)\n",
      "Downloading pox-0.3.7-py3-none-any.whl (29 kB)\n",
      "Downloading ppft-1.7.8-py3-none-any.whl (56 kB)\n",
      "Installing collected packages: ppft, pox, dill, multiprocess, pathos\n",
      "  Attempting uninstall: dill\n",
      "    Found existing installation: dill 0.3.8\n",
      "    Uninstalling dill-0.3.8:\n",
      "      Successfully uninstalled dill-0.3.8\n",
      "Successfully installed dill-0.4.1 multiprocess-0.70.19 pathos-0.3.5 pox-0.3.7 ppft-1.7.8\n"
     ]
    }
   ],
   "source": [
    "!pip install pathos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "12ef2032-675f-4631-8367-a7a7679f3368",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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7/80YMAAGYahp556Sm+99ZZ8fR3PBSxfvlz33XefCgoK9Pzzz+v111+/wqMFgJIRMgHAC+Tn56t169bau3evbrrpJm3atMlpwCz097//XZMmTVKVKlW0d+9ehYeHX6HRAkDpuF0OAF7g66+/1t69eyVJL7/8cqkBU5LGjBmjwMBA5eXl6V//+tflHiIAuIWQCQBe4Msvv5QkBQUFqUePHi6dExwcrO7duxc5HwC8BSETALzAwYMHJUmRkZFuvS3esmVLSdLhw4cvy7gAoKwImQDgBc6ePSvJnMl0R2H99PR0q4cEAOVCyAQALxAaGipJOnPmjFvnFdavW7dukeP5+fmaOnWqIiMj5e/vr4iICL322mssdwTgiiFkAoAXaNasmSRp3759ys7Odvm8n376SZLUtGnTIseffvppvfDCC4qKitKcOXN022236aWXXtLjjz9u3aABoASETADwArfffrsk6eLFi1q9erVL55w6dUpbtmyRJPXu3dt2fOfOnZo3b55iY2P14Ycf6tFHH9W8efM0evRoLVy4UD/88IP1XwAAiiFkAoAXiImJsc1murqw+syZM5Wfny8fHx/dd999tuPLli2TYRh65plnitQv/Odly5YVOT506FDVqFFDx44dU1xcnOrUqaOQkBA98cQTysvL0/nz5zVq1Cg1a9ZMNWvW1J133qnU1NTyfF0AlQAhEwC8gK+vr6ZOnSpJ2rJli6ZMmVJi/W+++UYzZsyQJD3yyCNq1aqVreyHH36Qr6+vOnXqVOScJk2aqEmTJnYzmUlJSQoODtbNN9+soKAgTZo0SVFRUZo/f76mTp2qm266SceOHdOLL76oQYMG6ZNPPtE//vEPK742gAqMHX8AwIsMHTpUCxculK+vr1auXKkBAwbY1Tl48KC6du2qU6dOqU2bNkpMTFTNmjVt5W3bttWpU6d08uRJu3Ojo6N15swZ7d+/X5KUl5enoKAg5efna/369brlllskSRkZGQoJCVFBQYFmz56tp556ytZGy5YtVbNmTW67AygRM5kA4EXmzZungQMHqqCgQAMHDtTYsWN18eJFW/m///1vdezYUadOnVLLli31xRdfFAmYkpSVlSV/f3+H7VevXl0XLlyw/fPu3buVk5Oj//mf/7EFTEmqWbOmqlatqs6dOxcJmJJUq1Yt+fn5WfF1AVRghEwA8AINGzZUw4YN1axZM23atEmSVFBQoGnTpmnp0qWSpKNHj+qBBx5QRkaGJOnEiROKioqynZuYmCjJDJI5OTkO+8nOzlb16tVt/5yUlCRJuueee4rU279/v3JycnT33XcXOW4Yhvbt26c//elP5f/SACo017eVAABcNo5ubRcqKCgo8tdCGRkZtsApSbm5uZLM5Yz27Nmj3NxcVatWrcg5ycnJioiIsP1zUlKSfHx87J7f3L59uyTz9vqlDh06pIyMDN1www2ufjUAlRQhEwC8gCuPx7do0cKlelFRUVq7dq1++OEHde3a1Xb8+PHjOn78uGJjY23HkpKSFBkZaXfLvTB8dujQwe64JLvjAFAct8sBoIKJjY2Vj4+P3nrrrSLHC//50pC5Y8cOh7OSSUlJioiIUK1ateyOS4RMAKVjJhMAKpj27dvrscce0/z582UYhnr16qUffvhB8+fPV1xcnO0W+LFjx5SamuowZG7fvl0333yzw+PNmzdX7dq1L/fXAHCVI2QCQAU0e/ZsNW/eXP/617/08ccfq3Hjxnr55Zc1btw4W50dO3ZIsp+VPHnypE6ePKmOHTvatZuUlGT3/CYAOMI6mQAAALAcz2QCAADAcoRMAAAAWI6QCQAAAMsRMgEAAGA5QiYAAAAsR8gEAACA5QiZAAAAsBwhEwAAAJYjZAIAAMByhEwAAABYjpAJAAAAy/1/nK9FoLokHakAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 700x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Contours without Riess point-CPL\n",
    "#1)Contour om - Μ\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from joblib import Parallel, delayed \n",
    "plt.rcParams.update({\n",
    "    'font.family': 'serif',\n",
    "    'font.serif': ['Times New Roman'],\n",
    "    'font.size': 18\n",
    "})\n",
    "\n",
    "om_vals1 = np.linspace(0.29, 0.34, 150) \n",
    "M_vals1 = np.linspace(-19.4, -19.5, 150)\n",
    "OM_grid1, M_grid1 = np.meshgrid(om_vals1, M_vals1)\n",
    "\n",
    "params1 = [(om, M) for om, M in zip(OM_grid1.ravel(), M_grid1.ravel())]\n",
    "results1 = Parallel(n_jobs=-1, prefer=\"threads\" )(delayed(chi2total)(M, om, wocpl, wacpl, hcpl) for om, M in params1)\n",
    "Z_1 = np.array(results1).reshape(150, 150)\n",
    "\n",
    "#Contour definition\n",
    "chi2_min = chi2_cpl\n",
    "levels1 = [\n",
    "    chi2_min + dchi(1,2),  # 1 sigma \n",
    "    chi2_min + dchi(2,2),  # 2 sigma \n",
    "    chi2_min + dchi(3,2)  # 3 sigma \n",
    "]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 6))\n",
    "\n",
    "contour1 = ax.contour(OM_grid1, M_grid1, Z_1, levels=levels1, colors='blue', linewidths=0.7)\n",
    "\n",
    "\n",
    "\n",
    "ax.plot(omcpl, Mcpl, 'ko', markersize=8)\n",
    "\n",
    "ax.set_xlabel(r'$\\Omega_{0m}$') \n",
    "ax.set_ylabel(r'$M$')\n",
    "\n",
    "for spine in ax.spines.values():\n",
    "    spine.set_edgecolor('black')\n",
    "    spine.set_linewidth(1.5)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5f74c576-a0f7-4f80-96e5-b000ee60bb74",
   "metadata": {},
   "outputs": [],
   "source": [
    "#2)Contour om - h\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from joblib import Parallel, delayed \n",
    "plt.rcParams.update({\n",
    "    'font.family': 'serif',\n",
    "    'font.serif': ['Times New Roman'],\n",
    "    'font.size': 18\n",
    "})\n",
    "\n",
    "om_vals2 = np.linspace(0.29, 0.34, 150) \n",
    "h_vals2 = np.linspace(0.63, 0.7, 150)\n",
    "OM_grid2, h_grid2 = np.meshgrid(om_vals2, h_vals2)\n",
    "\n",
    "params2 = [(om, h) for om, h in zip(OM_grid2.ravel(), h_grid2.ravel())]\n",
    "results2 = Parallel(n_jobs=-1, prefer=\"threads\")(delayed(chi2total)(Mcpl, om, wocpl, wacpl, h) for om, h in params2)\n",
    "Z_2 = np.array(results2).reshape(150, 150)\n",
    "\n",
    "#Contour definition\n",
    "chi2_min = chi2_cpl\n",
    "levels2 = [\n",
    "    chi2_min + dchi(1,2),  # 1 sigma \n",
    "    chi2_min + dchi(2,2),  # 2 sigma \n",
    "    chi2_min + dchi(3,2)  # 3 sigma \n",
    "]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 6))\n",
    "\n",
    "contour2 = ax.contour(OM_grid2, h_grid2, Z_2, levels=levels2, colors='blue', linewidths=0.7)\n",
    "\n",
    "\n",
    "\n",
    "ax.plot(omcpl, hcpl, 'ko', markersize=8)\n",
    "\n",
    "ax.set_xlabel(r'$\\Omega_{0m}$') \n",
    "ax.set_ylabel(r'$h$')\n",
    "\n",
    "for spine in ax.spines.values():\n",
    "    spine.set_edgecolor('black')\n",
    "    spine.set_linewidth(1.5)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "d8f2a9bf-2924-4fdc-958b-e419e8ce9d7c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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dN58ngIDA5WSkuJxvf2hHPY2tGTefJ7caY1zUHv7ObI/NdF5XnI7e0D97rvvPD7G2xOC5kXWvXt3SdKBAwd09uxZl/XG/80mlZeX1+A6T548qZkzZ2rJkiXy96/7lO3bt0/BwcGKjY2Vn5+fDMPQRx99pBtuuEHz5s1rxJG0bM19nuxeeOEF3XLLLa0mtDSGt5wjZ8ePH9fu3bu1atWqVvmL0h1vPE92eXl56tq1qxITE5tcR0vhzecJNs15jvLz8x0PsYmKinJZHxgYKIvFIknKzs5u8P4lguZFd8MNN+jyyy9XRUWF3nzzTZf1J06ckCQFBQU1uM6JEyfq17/+dYP+Kr/66qu1fft2HTp0SKdOndL8+fMVHh6uqqoqTZs2TYsXL274wbRgzX2eJGnr1q1av369UlNTG7yP1sQbzpGzHTt26LbbblPXrl11/vz5Rn++pfK282T39ddf68iRI/r5z39OCJL3nidUa85z5Hx5iafRtfDwcEmNC7pSKwqav/zlL93OKVlXmTBhQqP3ExwcrMWLFysoKEgvvPCC3nnnHZWXl+vcuXP661//qt///veSGj6U88YbbygkJMTtU47q07lzZ/3P//yP9u7dq7i4OEnStGnTdO7cuUbXdam0lvNktVr1k5/8REuWLHF7HaA3ay3nyO6bb77RT3/6Uw0dOlQHDx7UBx98oAEDBuiTTz5p9DFdSq3tPNW2aNEi9e3bV0899dQF1WO21n6efEFrOEf5+fmO5Xbt2rndxv4HW0lJSYP27/hco7b2YWlpaTJsd9k3uLzzzjtN2teIESP0r3/9SyNGjNALL7ygwYMH66c//anCwsIcXd833HBDvfUcPnxYL730kt56660mtcOuW7du+uc//6n27dursLBQGzduvKD6zNRaztMzzzyjcePGaeDAgU1qe3NqLefILioqSm+++aby8vL06quvqkOHDiouLtYjjzyi8vLyRtd3qbS28+Tsq6++0ttvv62VK1c2qvenObTm8+QrWsM5cv45se+ntrKyMkly3GTXUG0atTUabODAgcrIyKjx3q5du3T48GFJ0pgxY+r8fFVVlR599FEtWLBAkZGRF9yeqKgoPfXUU5ozZ46jDWie8/SPf/xDX3zxhV599dWmNbqV8ZafJYvFoieffFLJycm6/vrrlZOTo23btunmm29ucp0tibecp7Ky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",
      "text/plain": [
       "<Figure size 700x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#3)Contour M - h\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from joblib import Parallel, delayed \n",
    "plt.rcParams.update({\n",
    "    'font.family': 'serif',\n",
    "    'font.serif': ['Times New Roman'],\n",
    "    'font.size': 18\n",
    "})\n",
    "\n",
    "M_vals3 = np.linspace(-19.4, -19.45, 100) \n",
    "h_vals3 = np.linspace(0.63, 0.70, 100)\n",
    "M_grid3, h_grid3 = np.meshgrid(M_vals3, h_vals3)\n",
    "\n",
    "params3 = [(M, h) for M, h in zip(M_grid3.ravel(), h_grid3.ravel())]\n",
    "results3 = Parallel(n_jobs=-1, prefer=\"threads\")(delayed(chi2total)(M, omcpl, wocpl, wacpl, h) for M, h in params3)\n",
    "Z_3 = np.array(results3).reshape(100, 100)\n",
    "\n",
    "#Contour definition\n",
    "chi2_min = chi2_cpl \n",
    "levels3 = [\n",
    "    chi2_min + dchi(1,2),  # 1 sigma \n",
    "    chi2_min + dchi(2,2),  # 2 sigma \n",
    "    chi2_min + dchi(3,2)  # 3 sigma \n",
    "]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 6))\n",
    "\n",
    "contour3 = ax.contour(M_grid3, h_grid3, Z_3, levels=levels3, colors='blue', linewidths=0.7)\n",
    "\n",
    "\n",
    "\n",
    "ax.plot(Mcpl, hcpl, 'ko', markersize=8)\n",
    "\n",
    "ax.set_xlabel(r'$M$') \n",
    "ax.set_ylabel(r'$h$')\n",
    "\n",
    "for spine in ax.spines.values():\n",
    "    spine.set_edgecolor('black')\n",
    "    spine.set_linewidth(1.5)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "59157676-401c-415b-9a8d-474709d749bc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAApkAAAI1CAYAAACdceHHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABeqUlEQVR4nO3de3zO9f/H8ee1sY1tdqAwp4xyPkTOp5KcOqicSgeHfEuhcrZS4VvZUhKlVA7fTkihE0UOySkUwk/JoYicxszGxrbP749317bLNnb4zC7XHvfb7bqZz/nTZ9Zz7/fn/Xo7LMuyBAAAANjIq6AvAAAAAJ6HkAkAAADbETIBAABgO0ImAAAAbEfIBAAAgO0ImQAAALAdIRMAAAC2I2QCAADAdoRMAAAA2I6QCQAAANt5fMi0LEvTp09XnTp1VKVKFTVq1EiLFi3K1bG+/PJL3XzzzQoPD1epUqXUqVMnbdy48ZL7JCQkqEyZMnI4HC6f4sWLKzo6OlfXAQAA4O48OmRalqWHHnpI48eP1yeffKK9e/dq0qRJ6tWrlyZNmpSjY73wwgvq27evnn32We3bt0/79+9XaGioWrZsqQULFmS538yZM3X06NEMy/v06aOSJUvm+J4AAACuBg7LsqyCvoj8MnnyZA0ZMkTz5s1Tjx49Upc/88wzioqK0tq1a9W0adPLHuebb77RHXfcoWnTpunxxx9PXX7hwgXVr19fBw8e1LZt21S5cmWX/ZKSklS9enXNmDFDpUuXdllXrlw5BQYG5vEOAQAA3JPHhswzZ86oUqVKSklJ0fHjx1W0aNHUdbt27VLNmjXVpEkTbdiw4bLHat68udavX68///xTlSpVcln31ltvadCgQXrkkUf0/vvvu6z78MMP9c0332ju3Ln23BQAAMBVwmO7yxcvXqxTp06pUaNGLgFTkqpXr67g4GD99NNP2r59+yWPEx8fr59++kmSFBYWlmF9u3btJEnz589XcnJy6nLLshQVFaXixYtr+fLlunDhQl5vCQAA4KpRpKAvIL988803kqTw8PAM6xwOh2rVqqW1a9dq5cqVqlOnTpbHiYmJUUpKiiTp9OnTKlWqlMt6Z8tmbGysdu/erRo1akiSvvjiC+3cuVM7d+7UrFmzVKpUKQ0ePFgjRoxQsWLFcnQvKSkpOnHihCSpePHicjgcOdofAAAULpZl6ezZs5KkUqVKycvryrcremzI3LJliySpfPnyma4PDg6WJG3duvWSxylVqpR8fHx0/vx5bdq0SZ06dXJZn/5tA2cQlKS1a9eqbt26+uuvv3T69GmdOHFCL7zwgj777DN9/fXXqlix4iXPm5iYqMTEREnS8ePHVbVq1UtuDwAAkJmjR4/q2muvveLn9dju8uPHj0tKC5MXCwoKkuQaDDPj6+ur22+/XZL05ptvZlh/6NCh1K99fHxSv544caK2bdum6OhorVu3Trfddpskafv27erYsaPi4+Mved4JEyYoKChIQUFBBEwAAHDVcfuWzNGjRysqKipH+/Tu3Tu1BmXx4sUz3cbZbJyQkHDZ402ePFkbN27U4sWLNWTIEI0bN05+fn7asGGDxo4dm7rdxYOCJMnb21vNmjXT0qVLNWnSJA0bNky7du3S66+/rjFjxmR5zoiICA0dOlSSFBcXp3Llykkyv434+/tf9poBAEDhFR8fn1rZJqsslN/cPmRGRkYqMjIyx/vNnz9fSUlJymrw/Pnz5yVJoaGhlz1WxYoVtXnzZo0fP15fffWVvv76a9WsWVN33HFH6gO87rrrVKZMmUseZ+jQoTp48KAmT56suXPnXjJk+vr6ytfXV5IJqk7+/v6ETAAAkG0FNZbD7UNmbpUpU0b79u3Lsls6JiZGkjIM5LnU8aZNm+ayLCkpSREREZKknj17Zus4zz//vGbMmKG9e/dma3sAAICrkce+k1m3bl1J0uHDhzNd75yFp379+rk+x+zZsxUdHS0/Pz89+eST2donJCREDRo0UEBAQK7PCwAA4O48NmR26NBBkrRz584M6yzL0r59+yRJHTt2zNXxY2Nj9eyzz0qSxo4dm2kNzayULVs2WzMNAQAAXK08NmTed999KlGihNavX6+kpCSXdTt27NCZM2fUunXrLEscXYplWfrPf/6jY8eO6a677tKIESNytP+OHTuy3fIJAABwNfLYkBkcHKxnnnlGJ0+e1Ndff+2y7n//+58cDodefvlll+Xbt29XixYtUt+zzExycrIGDhyoTz/9VF26dNG8efMyLXB68uTJTAcdLVy4UM2aNUstaQQAAOCJPDZkStLw4cPVuXNnDR8+XAcOHJAkff7555o6dapef/11tWjRwmX76dOna926dYqMjEwtgeSUmJiozz77TM2bN9esWbMUGRmp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aty4scqWLZu6vFy5cpKyDpHWv1WrTpw4kavzepr8fE6//PKLLly4oLfffvuKntfTFNQzQva54zNy/ozr0qVLjs/pqdztOU2bNk0zZsxI/aUaBf+Mtm3bplmzZmU6w2FOETLzSUJCguLi4iQpy+kjg4KCJOU+7P344486f/68RowY4bL83nvvlSR9+eWXOnDgQIb9Dh06JMl0MxV2+fmcvv32W91+++264YYbFB8fn2G9swsvv74/PEVBPiNkj7s+o++//1516tRRhw4dcrSfp3Kn53Tq1Cn17dtXa9eu5TWUdAr6GZ0/f169e/fWu+++m3qevCBk5pP070oUL148022cXTwJCQm5OsfUqVPVrl07devWzWX5XXfdpYceekgJCQm64447tHPnTknSn3/+qVGjRqW2cNKFlD/P6f/+7/90//33684779SRI0f0wQcfqEGDBtq1a1em586v7w9PUZDPCNnjjs9o27ZtWrNmjd566y1mWPuXuzynyZMn66abbtLs2bN15MgRdevWTU8//XT2b8SDFfQzev7559W2bVvdcsstubj6TK7VlqMgg/SthFYWkyqdP39eknnHIqdWrVqlNWvWaPbs2Zmu/9///qdp06bJz89PHTp0UNu2bfX222+rRo0aqedt1qxZjs/rafLjOdWsWVNz5szRsWPH9OKLL8rPz09HjhxR//79Mz13fnx/eJKCfEbIHnd8RkOGDNGoUaPUqlWrbG1fGLjLc3r66ae1Z88erV69OvX/Q2+88YaWLVuW3VvxWAX5jNatW6fFixfr5ZdfzuXVZ0TIzCehoaGp3yxZNUvHxMRIkkqVKpWjY586dUpPPPGEFixYkPr+5cUcDocef/xxbdy4UX///bdWrFihqKio1Hc9wsLC+OGr/H1OISEhevbZZzV//nxJ5h9w+tcXnCP27D6vpynIZ4Tscbdn9MYbbyggIED//e9/c3QuT+dOz8nhcKhVq1b64YcfUkeYz5kzJ0fn9EQF9Yzi4+PVv39/zZ4929bXFwiZ+cTb21s1a9aUJB0+fDjTbY4ePSopZ6UbkpOT9fDDD+u///2vWrZsmaNrOnHihD744ANJpvwRXUj595zSu+OOO9S4ceMM53CWj8iv83qKgnxGyB53ekY//PCDFi5cqLlz58rb2ztX5/JU7vScnIoWLarnn38+29t7uoJ6RgsWLNCu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",
      "text/plain": [
       "<Figure size 700x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#4)Contour om - w0\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from joblib import Parallel, delayed \n",
    "plt.rcParams.update({\n",
    "    'font.family': 'serif',\n",
    "    'font.serif': ['Times New Roman'],\n",
    "    'font.size': 18\n",
    "})\n",
    "\n",
    "om_vals4 = np.linspace(0.29, 0.34, 100) \n",
    "wo_vals4 = np.linspace(-1.20, -0.95, 100)\n",
    "OM_grid4, wo_grid4 = np.meshgrid(om_vals4, wo_vals4)\n",
    "\n",
    "params4 = [(om, wo) for om, wo in zip(OM_grid4.ravel(), wo_grid4.ravel())]\n",
    "results4 = Parallel(n_jobs=-1, prefer=\"threads\")(delayed(chi2total)(Mcpl, om, wo, wacpl, hcpl) for om, wo in params4)\n",
    "Z_4 = np.array(results4).reshape(100, 100)\n",
    "\n",
    "#Contour definition\n",
    "chi2_min = chi2_cpl \n",
    "levels4 = [\n",
    "    chi2_min + dchi(1,2),  # 1 sigma \n",
    "    chi2_min + dchi(2,2),  # 2 sigma \n",
    "    chi2_min + dchi(3,2)  # 3 sigma \n",
    "]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 6))\n",
    "\n",
    "contour4 = ax.contour(OM_grid4, wo_grid4, Z_4, levels=levels4, colors='blue', linewidths=0.7)\n",
    "\n",
    "\n",
    "\n",
    "ax.plot(omcpl, wocpl, 'ko', markersize=8)\n",
    "\n",
    "ax.set_xlabel(r'$\\Omega_{0m}$') \n",
    "ax.set_ylabel(r'$w_{0}$')\n",
    "\n",
    "for spine in ax.spines.values():\n",
    "    spine.set_edgecolor('black')\n",
    "    spine.set_linewidth(1.5)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "6466e49a-a905-4ce9-9613-3baea974461f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 700x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#5)Contour Μ - w0\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from joblib import Parallel, delayed \n",
    "plt.rcParams.update({\n",
    "    'font.family': 'serif',\n",
    "    'font.serif': ['Times New Roman'],\n",
    "    'font.size': 18\n",
    "})\n",
    "\n",
    "M_vals5 = np.linspace(-19.4, -19.5, 100) \n",
    "wo_vals5 = np.linspace(-1.20, -0.95, 100)\n",
    "M_grid5, wo_grid5 = np.meshgrid(M_vals5, wo_vals5)\n",
    "\n",
    "params5 = [(M, wo) for M, wo in zip(M_grid5.ravel(), wo_grid5.ravel())]\n",
    "results5 = Parallel(n_jobs=-1, prefer=\"threads\")(delayed(chi2total)(M, omcpl, wo, wacpl, hcpl) for M, wo in params5)\n",
    "Z_5 = np.array(results5).reshape(100, 100)\n",
    "\n",
    "#Contour definition\n",
    "chi2_min = chi2_cpl \n",
    "levels5 = [\n",
    "    chi2_min + dchi(1,2),  # 1 sigma \n",
    "    chi2_min + dchi(2,2),  # 2 sigma \n",
    "    chi2_min + dchi(3,2)  # 3 sigma \n",
    "]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 6))\n",
    "\n",
    "contour5 = ax.contour(M_grid5, wo_grid5, Z_5, levels=levels5, colors='blue', linewidths=0.7)\n",
    "\n",
    "\n",
    "\n",
    "ax.plot(Mcpl, wocpl, 'ko', markersize=8)\n",
    "\n",
    "ax.set_xlabel(r'$M$') \n",
    "ax.set_ylabel(r'$w_{0}$')\n",
    "\n",
    "for spine in ax.spines.values():\n",
    "    spine.set_edgecolor('black')\n",
    "    spine.set_linewidth(1.5)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "c4912dd3-83f9-4964-aeef-abb2f79709f6",
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[35], line 16\u001b[0m\n\u001b[0;32m     13\u001b[0m h_grid6, wo_grid6 \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mmeshgrid(h_vals6, wo_vals6)\n\u001b[0;32m     15\u001b[0m params6 \u001b[38;5;241m=\u001b[39m [(h, wo) \u001b[38;5;28;01mfor\u001b[39;00m h, wo \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(h_grid6\u001b[38;5;241m.\u001b[39mravel(), wo_grid6\u001b[38;5;241m.\u001b[39mravel())]\n\u001b[1;32m---> 16\u001b[0m results6 \u001b[38;5;241m=\u001b[39m Parallel(n_jobs\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m, prefer\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mthreads\u001b[39m\u001b[38;5;124m\"\u001b[39m)(delayed(chi2total)(Mcpl, omcpl, wo, wacpl, h) \u001b[38;5;28;01mfor\u001b[39;00m h, wo \u001b[38;5;129;01min\u001b[39;00m params6)\n\u001b[0;32m     17\u001b[0m Z_6 \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marray(results6)\u001b[38;5;241m.\u001b[39mreshape(\u001b[38;5;241m100\u001b[39m, \u001b[38;5;241m100\u001b[39m)\n\u001b[0;32m     19\u001b[0m \u001b[38;5;66;03m#Contour definition\u001b[39;00m\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\joblib\\parallel.py:2007\u001b[0m, in \u001b[0;36mParallel.__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m   2001\u001b[0m \u001b[38;5;66;03m# The first item from the output is blank, but it makes the interpreter\u001b[39;00m\n\u001b[0;32m   2002\u001b[0m \u001b[38;5;66;03m# progress until it enters the Try/Except block of the generator and\u001b[39;00m\n\u001b[0;32m   2003\u001b[0m \u001b[38;5;66;03m# reaches the first `yield` statement. This starts the asynchronous\u001b[39;00m\n\u001b[0;32m   2004\u001b[0m \u001b[38;5;66;03m# dispatch of the tasks to the workers.\u001b[39;00m\n\u001b[0;32m   2005\u001b[0m \u001b[38;5;28mnext\u001b[39m(output)\n\u001b[1;32m-> 2007\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m output \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreturn_generator \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mlist\u001b[39m(output)\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\joblib\\parallel.py:1650\u001b[0m, in \u001b[0;36mParallel._get_outputs\u001b[1;34m(self, iterator, pre_dispatch)\u001b[0m\n\u001b[0;32m   1647\u001b[0m     \u001b[38;5;28;01myield\u001b[39;00m\n\u001b[0;32m   1649\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backend\u001b[38;5;241m.\u001b[39mretrieval_context():\n\u001b[1;32m-> 1650\u001b[0m         \u001b[38;5;28;01myield from\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_retrieve()\n\u001b[0;32m   1652\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mGeneratorExit\u001b[39;00m:\n\u001b[0;32m   1653\u001b[0m     \u001b[38;5;66;03m# The generator has been garbage collected before being fully\u001b[39;00m\n\u001b[0;32m   1654\u001b[0m     \u001b[38;5;66;03m# consumed. This aborts the remaining tasks if possible and warn\u001b[39;00m\n\u001b[0;32m   1655\u001b[0m     \u001b[38;5;66;03m# the user if necessary.\u001b[39;00m\n\u001b[0;32m   1656\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\joblib\\parallel.py:1762\u001b[0m, in \u001b[0;36mParallel._retrieve\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m   1757\u001b[0m \u001b[38;5;66;03m# If the next job is not ready for retrieval yet, we just wait for\u001b[39;00m\n\u001b[0;32m   1758\u001b[0m \u001b[38;5;66;03m# async callbacks to progress.\u001b[39;00m\n\u001b[0;32m   1759\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ((\u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jobs) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m\n\u001b[0;32m   1760\u001b[0m     (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jobs[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mget_status(\n\u001b[0;32m   1761\u001b[0m         timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtimeout) \u001b[38;5;241m==\u001b[39m TASK_PENDING)):\n\u001b[1;32m-> 1762\u001b[0m     time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;241m0.01\u001b[39m)\n\u001b[0;32m   1763\u001b[0m     \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[0;32m   1765\u001b[0m \u001b[38;5;66;03m# We need to be careful: the job list can be filling up as\u001b[39;00m\n\u001b[0;32m   1766\u001b[0m \u001b[38;5;66;03m# we empty it and Python list are not thread-safe by\u001b[39;00m\n\u001b[0;32m   1767\u001b[0m \u001b[38;5;66;03m# default hence the use of the lock\u001b[39;00m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "#6)Contour h - w0\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from joblib import Parallel, delayed \n",
    "plt.rcParams.update({\n",
    "    'font.family': 'serif',\n",
    "    'font.serif': ['Times New Roman'],\n",
    "    'font.size': 18\n",
    "})\n",
    "\n",
    "h_vals6 = np.linspace(0.66, 0.69, 100) \n",
    "wo_vals6 = np.linspace(-1.20, -0.95, 100)\n",
    "h_grid6, wo_grid6 = np.meshgrid(h_vals6, wo_vals6)\n",
    "\n",
    "params6 = [(h, wo) for h, wo in zip(h_grid6.ravel(), wo_grid6.ravel())]\n",
    "results6 = Parallel(n_jobs=-1, prefer=\"threads\")(delayed(chi2total)(Mcpl, omcpl, wo, wacpl, h) for h, wo in params6)\n",
    "Z_6 = np.array(results6).reshape(100, 100)\n",
    "\n",
    "#Contour definition\n",
    "chi2_min = chi2_cpl \n",
    "levels6 = [\n",
    "    chi2_min + dchi(1,2),  # 1 sigma \n",
    "    chi2_min + dchi(2,2),  # 2 sigma \n",
    "    chi2_min + dchi(3,2)  # 3 sigma \n",
    "]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 6))\n",
    "\n",
    "contour6 = ax.contour(h_grid6, wo_grid6, Z_6, levels=levels6, colors='blue', linewidths=0.7)\n",
    "\n",
    "\n",
    "\n",
    "ax.plot(hcpl, wocpl, 'ko', markersize=8)\n",
    "\n",
    "ax.set_xlabel(r'$h$') \n",
    "ax.set_ylabel(r'$w_{0}$')\n",
    "\n",
    "for spine in ax.spines.values():\n",
    "    spine.set_edgecolor('black')\n",
    "    spine.set_linewidth(1.5)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "20663a06-dc07-4763-a56e-5f03dd364068",
   "metadata": {},
   "outputs": [],
   "source": [
    "#7)Contour om - wa\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from joblib import Parallel, delayed \n",
    "plt.rcParams.update({\n",
    "    'font.family': 'serif',\n",
    "    'font.serif': ['Times New Roman'],\n",
    "    'font.size': 18\n",
    "})\n",
    "\n",
    "om_vals7 = np.linspace(0.29, 0.34, 100) \n",
    "wa_vals7 = np.linspace(-0.2, 0.5, 100)\n",
    "OM_grid7, wa_grid7 = np.meshgrid(om_vals7, wa_vals7)\n",
    "\n",
    "params7 = [(om, wa) for om, wa in zip(OM_grid7.ravel(), wa_grid7.ravel())]\n",
    "results7 = Parallel(n_jobs=-1, prefer=\"threads\")(delayed(chi2total)(Mcpl, om, wocpl, wa, hcpl) for om, wa in params7)\n",
    "Z_7 = np.array(results7).reshape(100, 100)\n",
    "\n",
    "#Contour definition\n",
    "chi2_min = chi2_cpl \n",
    "levels7 = [\n",
    "    chi2_min + dchi(1,2),  # 1 sigma \n",
    "    chi2_min + dchi(2,2),  # 2 sigma \n",
    "    chi2_min + dchi(3,2)  # 3 sigma \n",
    "]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 6))\n",
    "\n",
    "contour7 = ax.contour(OM_grid7, wa_grid7, Z_7, levels=levels7, colors='blue', linewidths=0.7)\n",
    "\n",
    "\n",
    "\n",
    "ax.plot(omcpl, wacpl, 'ko', markersize=8)\n",
    "\n",
    "ax.set_xlabel(r'$\\Omega_{0m}$') \n",
    "ax.set_ylabel(r'$w_{a}$')\n",
    "\n",
    "for spine in ax.spines.values():\n",
    "    spine.set_edgecolor('black')\n",
    "    spine.set_linewidth(1.5)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4a902ec7-dae6-4822-a775-453ab564d3a0",
   "metadata": {},
   "outputs": [],
   "source": [
    "#8)Contour M - wa\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from joblib import Parallel, delayed \n",
    "plt.rcParams.update({\n",
    "    'font.family': 'serif',\n",
    "    'font.serif': ['Times New Roman'],\n",
    "    'font.size': 18\n",
    "})\n",
    "\n",
    "M_vals8 = np.linspace(-19.4, -19.5, 100) \n",
    "wa_vals8 = np.linspace(-0.2, 0.5, 100)\n",
    "M_grid8, wa_grid8 = np.meshgrid(M_vals8, wa_vals8)\n",
    "\n",
    "params8 = [(M, wa) for M, wa in zip(M_grid8.ravel(), wa_grid8.ravel())]\n",
    "results8 = Parallel(n_jobs=-1, prefer=\"threads\")(delayed(chi2total)(M, omcpl, wocpl, wa, hcpl) for M, wa in params8)\n",
    "Z_8 = np.array(results8).reshape(100, 100)\n",
    "\n",
    "#Contour definition\n",
    "chi2_min = chi2_cpl \n",
    "levels8 = [\n",
    "    chi2_min + dchi(1,2),  # 1 sigma \n",
    "    chi2_min + dchi(2,2),  # 2 sigma \n",
    "    chi2_min + dchi(3,2)  # 3 sigma \n",
    "]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 6))\n",
    "\n",
    "contour8 = ax.contour(M_grid8, wa_grid8, Z_8, levels=levels8, colors='blue', linewidths=0.7)\n",
    "\n",
    "\n",
    "\n",
    "ax.plot(Mcpl, wacpl, 'ko', markersize=8)\n",
    "\n",
    "ax.set_xlabel(r'$M$') \n",
    "ax.set_ylabel(r'$w_{a}$')\n",
    "\n",
    "for spine in ax.spines.values():\n",
    "    spine.set_edgecolor('black')\n",
    "    spine.set_linewidth(1.5)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b247c23f-cb09-482c-9749-a2837e819bcb",
   "metadata": {},
   "outputs": [],
   "source": [
    "#9)Contour h - wa\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from joblib import Parallel, delayed \n",
    "plt.rcParams.update({\n",
    "    'font.family': 'serif',\n",
    "    'font.serif': ['Times New Roman'],\n",
    "    'font.size': 18\n",
    "})\n",
    "\n",
    "h_vals9 = np.linspace(0.66, 0.69, 100) \n",
    "wa_vals9 = np.linspace(-0.2, 0.5, 100)\n",
    "h_grid9, wa_grid9 = np.meshgrid(h_vals9, wa_vals9)\n",
    "\n",
    "params9 = [(h, wa) for h, wa in zip(h_grid9.ravel(), wa_grid9.ravel())]\n",
    "results9 = Parallel(n_jobs=-1, prefer=\"threads\")(delayed(chi2total)(Mcpl, omcpl, wocpl, wa, h) for h, wa in params9)\n",
    "Z_9 = np.array(results9).reshape(100, 100)\n",
    "\n",
    "#Contour definition\n",
    "chi2_min = chi2_cpl \n",
    "levels9 = [\n",
    "    chi2_min + dchi(1,2),  # 1 sigma \n",
    "    chi2_min + dchi(2,2),  # 2 sigma \n",
    "    chi2_min + dchi(3,2)  # 3 sigma \n",
    "]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 6))\n",
    "\n",
    "contour9 = ax.contour(h_grid9, wa_grid9, Z_9, levels=levels9, colors='blue', linewidths=0.7)\n",
    "\n",
    "\n",
    "\n",
    "ax.plot(hcpl, wacpl, 'ko', markersize=8)\n",
    "\n",
    "ax.set_xlabel(r'$h$') \n",
    "ax.set_ylabel(r'$w_{a}$')\n",
    "\n",
    "for spine in ax.spines.values():\n",
    "    spine.set_edgecolor('black')\n",
    "    spine.set_linewidth(1.5)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d10e24ea-d150-4351-a470-037e1e0f7bd6",
   "metadata": {},
   "outputs": [],
   "source": [
    "#10)Contour w0 - wa\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from joblib import Parallel, delayed \n",
    "plt.rcParams.update({\n",
    "    'font.family': 'serif',\n",
    "    'font.serif': ['Times New Roman'],\n",
    "    'font.size': 18\n",
    "})\n",
    "\n",
    "wo_vals10 = np.linspace(-1.2, -0.9, 150) \n",
    "wa_vals10 = np.linspace(-0.4, 0.7, 150)\n",
    "wo_grid10, wa_grid10 = np.meshgrid(wo_vals10, wa_vals10)\n",
    "\n",
    "params10 = [(wo, wa) for wo, wa in zip(wo_grid10.ravel(), wa_grid10.ravel())]\n",
    "results10 = Parallel(n_jobs=-1, prefer=\"threads\")(delayed(chi2total)(Mcpl, omcpl, wo, wa, hcpl) for wo, wa in params10)\n",
    "Z_10 = np.array(results10).reshape(150, 150)\n",
    "\n",
    "#Contour definition\n",
    "chi2_min = chi2_cpl \n",
    "levels10 = [\n",
    "    chi2_min + dchi(1,2),  # 1 sigma \n",
    "    chi2_min + dchi(2,2),  # 2 sigma \n",
    "    chi2_min + dchi(3,2)  # 3 sigma \n",
    "]\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 6))\n",
    "\n",
    "contour10 = ax.contour(wo_grid10, wa_grid10, Z_10, levels=levels10, colors='blue', linewidths=0.7)\n",
    "\n",
    "\n",
    "\n",
    "ax.plot(wocpl, wacpl, 'ko', markersize=8)\n",
    "\n",
    "ax.set_xlabel(r'$w_{0}$') \n",
    "ax.set_ylabel(r'$w_{a}$')\n",
    "\n",
    "for spine in ax.spines.values():\n",
    "    spine.set_edgecolor('black')\n",
    "    spine.set_linewidth(1.5)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ddfc25b3-6ba6-4d90-bcd7-62bcb77cb270",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
