diff --git a/Cargo.toml b/Cargo.toml index 60d12d00..386c71ce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,6 +52,7 @@ pyo3 = { version = "0.20.0", features = ["extension-module"] } pyo3-log = "0.9.0" serde = "1" serde_json = "1" +ctrlc = "3.4" [dev-dependencies] criterion = "0.4" diff --git a/doc/SparseGpx_Tutorial.ipynb b/doc/SparseGpx_Tutorial.ipynb new file mode 100644 index 00000000..9db365fc --- /dev/null +++ b/doc/SparseGpx_Tutorial.ipynb @@ -0,0 +1,329 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "4bd147b8", + "metadata": {}, + "source": [ + "# Using _egobox_ surrogate model _SparseGpx_" + ] + }, + { + "cell_type": "markdown", + "id": "ee9afcd0", + "metadata": {}, + "source": [ + "This tutorial is inspired from SGP tutorial from [SMT](https://github.com/SMTOrg/smt/tutorial)." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "3141794e", + "metadata": {}, + "source": [ + "## Installation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "33b7dcca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: egobox in d:\\rlafage\\miniconda3\\lib\\site-packages (0.14.0)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "%pip install egobox" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "0fa96b71", + "metadata": {}, + "source": [ + "We import _egobox_ as _egx_ for short" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d502466d-906e-4b64-9968-ea5b642fbadf", + "metadata": {}, + "outputs": [], + "source": [ + "import egobox as egx" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "c8e65173-d594-4a1d-8bfb-f5e3a480ce47", + "metadata": { + "tags": [] + }, + "source": [ + "# Example 1 : SparseGpx basics" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "358adf9c-0447-4b16-b3dc-02eb881a7d96", + "metadata": { + "tags": [] + }, + "source": [ + "### Training " + ] + }, + { + "cell_type": "markdown", + "id": "c9572acb", + "metadata": {}, + "source": [ + "#### Benchmark function definition" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d72fd25e-803b-435e-ae81-9aa7175494bc", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "def f_obj(x):\n", + " return np.sin(3*np.pi*x) + 0.3*np.cos(9*np.pi*x) + 0.5*np.sin(7*np.pi*x)" + ] + }, + { + "cell_type": "markdown", + "id": "58035252", + "metadata": {}, + "source": [ + "#### Training data definition" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f4de436a-8319-47f5-bb5a-e68d02419752", + "metadata": {}, + "outputs": [], + "source": [ + "# number of observations\n", + "N = 200\n", + "\n", + "# noise\n", + "eta = 0.01\n", + "\n", + "# Set seed via random generator for reproducibility\n", + "rng = np.random.RandomState(0)\n", + "\n", + "# generate data\n", + "xt = 2*rng.rand(N, 1) - 1\n", + "yt = f_obj(xt) + rng.normal(loc=0.0, scale=np.sqrt(eta), size=(N,1))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ed2693b6", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABRcAAAH5CAYAAAAbRAmkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAADf2UlEQVR4nOzdd3yV9fn/8dfJhrACIYSRQMIMYQVQBFRQVIxKFVRcVetqkVoHWsX61V+rbaVWrbaKVKviVpThREVlyVBGQCBhB8IIIxAIBMg8vz8+OScJGWScc+4z3s/HI4/7zskZVxjJOde5hs1ut9sRERERERERERERqacgqwMQERERERERERER36TkooiIiIiIiIiIiDSIkosiIiIiIiIiIiLSIEouioiIiIiIiIiISIMouSgiIiIiIiIiIiINouSiiIiIiIiIiIiINIiSiyIiIiIiIiIiItIgIVYH4GqlpaXs3buX5s2bY7PZrA5HRERERERERETEp9jtdo4dO0aHDh0ICqq9NtHvkot79+4lLi7O6jBERERERERERER82q5du+jUqVOt1/G75GLz5s0B8823aNHC4mhERERERERERER8S15eHnFxcc48W238LrnoaIVu0aKFkosiIiIiIiIiIiINVJeRg1roIiIiIiIiIiIiIg2i5KKIiIiIiIiIiIg0iJKLIiIiIiIiIiIi0iB+N3OxrkpKSigqKrI6DPEzoaGhBAcHWx2GiIiIiIiIiIhHBFxy0W63s2/fPo4cOWJ1KOKnWrVqRWxsbJ2GnoqIiIiIiIiI+LKASy46EosxMTE0bdpUCSBxGbvdzokTJzhw4AAA7du3tzgiERERERERERH3CqjkYklJiTOx2KZNG6vDET/UpEkTAA4cOEBMTIxapEVERERERETErwXUQhfHjMWmTZtaHIn4M8e/L830FBERERERERF/F1DJRQe1Qos76d+XiIiIiIiIiASKgEwuioiIiIiIiIiISOMpuShud+LECa6++mpatGiBzWazdFP3ggULLI9BRERERERERMRfKLnoI0aOHMn9999vdRiV1DWmt956i8WLF7N06VKys7Np2bKl+4Oj+viGDRvm0RhERERERERERPxZQG2LFigsLCQsLMyjj7lt2zaSkpLo06ePRx+3OmFhYcTGxlodhoiIiIiIiIiIX1Dlog/4zW9+w8KFC3nxxRex2WzYbDZ27NhBSUkJd9xxBwkJCTRp0oSePXvy4osvVrntVVddxdNPP02HDh3o0aMHAEuXLmXAgAFEREQwePBg5syZg81mY82aNc7bpqenc9lll9GsWTPatWvHzTffTE5OTq0xnW7kyJE899xzLFq0CJvNxsiRIwGz9GTOnDmVrtuqVSumT58OwI4dO7DZbMyaNYsLLriApk2b0r9/f5YtW1bpNkuWLGHEiBE0bdqUqKgoRo8eTW5ubo3xVdcWPXPmTJKTkwkPD6dLly4899xzlR6jS5cu/P3vf+f222+nefPmxMfH8+qrr9bxb09ERERERERExH8puWi3Q2G+NR92e51CfPHFFxk6dCh33XUX2dnZZGdnExcXR2lpKZ06dWLGjBmkp6fzxBNP8Kc//YkZM2ZUuv33339PRkYG8+bN44svvuDYsWOMGTOGvn37snr1ap566ikeeeSRSrfJzs5mxIgRDBgwgJUrV/L111+zf/9+xo8fX2tMp5s1axZ33XUXQ4cOJTs7m1mzZtXrr+exxx7joYceYs2aNfTo0YMbbriB4uJiANasWcOoUaNITk5m2bJl/Pjjj4wZM4aSkpI6x7dq1SrGjx/P9ddfz7p16/jzn//M448/7kxyOjz33HMMHjyYtLQ0Jk6cyN13383GjRvr9b2IiIiIiIiIiPgbtUUXnYC/d7Dmsf+0F8Iiz3i1li1bEhYWRtOmTSu19AYHB/OXv/zF+XlCQgJLly5lxowZziQgQGRkJP/73/+c7dDTpk3DZrPx2muvERERQe/evdmzZw933XWX8zavvPIKAwcO5O9//7vzsjfeeIO4uDg2b95Mjx49qo3pdK1bt6Zp06YNbkd+6KGHuPzyywH4y1/+QnJyMlu3bqVXr14888wzDB48mKlTpzqvn5yc7DyvS3zPP/88o0aN4vHHHwegR48epKen889//pPf/OY3zutddtllTJw4EYBHHnmEf/3rXyxYsIBevXrV+3sSEREREREREfEXqlz0cdOmTWPw4MG0bduWZs2a8dprr5GVlVXpOn379q00Z3HTpk3069ePiIgI52Vnn312pdusWrWK+fPn06xZM+eHI5G2bds2N35HlfXr18953r59ewAOHDgAlFcuNkZGRgbDhw+vdNnw4cPZsmULJSUl1cZhs9mIjY11xiEiIiIiIiIiEqhUuRja1FQQWvXYjTBjxgweeOABnnvuOYYOHUrz5s355z//yU8//VTpepGRlasj7XY7NputymUVlZaWMmbMGP7xj39UeVxHkq8xbDZblccsKiqqcr3Q0NBKt3HEBtCkSZNGx1GXP4vT43DE4ohDJKDlZcPiZ6G4AJLHQsIICNavFhERERERkUChV4A2W51ak60WFhZWqZIOYPHixQwbNszZrgt1qyrs1asX7733HgUFBYSHhwOwcuXKStcZOHAgM2fOpEuXLoSEVP/PpLqY6qpt27ZkZ2c7P9+yZQsnTpyo133069eP77//vlJreH3j6927Nz/++GOly5YuXUqPHj0IDg6uVzwiAcVuhzXvwzePwqmj5rK0dyCyrUky9r0WOp1lfsaKiIiIiIiI31JbtI/o0qULP/30Ezt27CAnJ4fS0lK6devGypUr+eabb9i8eTOPP/44K1asOON93XjjjZSWlvLb3/6WjIwMvvnmG5599lmgvDrw97//PYcPH+aGG27g559/Zvv27Xz77bfcfvvtzoRddTHV1YUXXshLL73E6tWrWblyJRMmTKhSHXgmjz76KCtWrGDixIn88ssvbNy4kVdeecW50bou8T344IN8//33PPXUU2zevJm33nqLl156iYceeqhesYgElKO74b1r4dOJJrHYfgAMvgOatoH8g/Dzq/D6xfBif8hcbHW0IiIiIiIi4kZKLvqIhx56iODgYHr37k3btm3JyspiwoQJjBs3juuuu44hQ4Zw6NChSlWMNWnRogWff/45a9asYcCAATz22GM88cQTAM45jB06dGDJkiWUlJQwevRo+vTpw3333UfLli0JCgqqMaa6eu6554iLi+P888/nxhtv5KGHHqJp0/q1iffo0YNvv/2WtWvXcvbZZzN06FA+/fRTZ6VlXeIbOHAgM2bM4MMPP6RPnz488cQTPPnkk5WWuYhIGbsdVk2Hl8+BrfMgOBxG/T+483u44nl4cBPc9An0uw7CmsGRnfDxrXBsv9WRi4iIiIiIiJvY7NUNmPNheXl5tGzZkqNHj9KiRYtKXzt16hSZmZkkJCRUWmYi8N5773Hbbbdx9OhRl8wyDGT6dyZ+6/P7THIRTMvzlS9D257VX7cwH94YDfvWQddRJukYpPezREREREREfEFt+bXT6ZVegHr77bf58ccfyczMZM6cOTzyyCOMHz9eiUURqd7W78oSiza45K9w+zc1JxbBzLId9z8IiYBt35tWaREREREREfE7Si4GqH379vHrX/+apKQkHnjgAa699lpefVUv/kWkGoX58MUD5nzI72DYHyDozAuP0k61Y03Sg+aTeU/A/nQ3BikiIiIiIp6WlpXLrNW7ScvKtToUsZC2RQeohx9+mIcfftjqMETEF8z/OxzJghad4ML/q9NNpszNYNrC7UBv3ggdwIWsgVl3mfmMoRoXICIiIiLi68qf8xsTRiQyOTXJwojEKqpcFBGRmu1Ng+VTzfkVz0N48zPeJC0rt8KTDBsPF/2OHHsL2L8evn/SfbGKiIiIiIhHVH7Ob0xbuF0VjAFKyUUREaleSTF8di/YSyF5HPQYXaebZebkV/o8h5Y8XPRb88nyl2HbD66OVEREREREPOj05/xnulz8m1uTi4sWLWLMmDF06NABm83GnDlzar3+ggULsNlsVT42btzozjBFRKQ6y1+Gfb9ARCtI/Uedb5YQHVnlsh9KB3Kw16/NJ7PvhpNHXBOjiIiIiIh4XFFJab0uF//m1uRifn4+/fv356WXXqrX7TZt2kR2drbzo3v37m6KUEREqnU4E+Y/DcDOwX9i1ubCOrc4pMRHMWFEYqXL7h6RSNtx/4TWXeH4PljzvstDFhERERERzwgNrj6dVNPlWvzi39y60CU1NZXU1NR63y4mJoZWrVq5PiARETkzux2+uB+KT7KjxWBGftcRWAvAhb3a8ocLu5MSH1XrXUxOTWJ0ciyZOfkkREeWX3/o7+HLSbDyDTjnbrDZ3Pu9iIiIiIiIy1XXrVTl8tISsAUx5euNWvzi57xy5mJKSgrt27dn1KhRzJ8/v9brFhQUkJeXV+lDREQaIeMz2L6A0uBwbj14I1CeAPxh40HGTl3KlLkZZ7yblPgoxg3sVDkR2W88hDWDQ1tg5xI3BC8iIiIiIu5WuVvJTrxtP8/33UXK9ldhxi3wn0HwVDRH3ryWNxdWHnWnxS/+x6uSi+3bt+fVV19l5syZzJo1i549ezJq1CgWLVpU422efvppWrZs6fyIi4vzYMTewzGv8siRI1aH4hIN/X7qMttTRM5gmdkOvTnxVnbaY6u9ypmeENTY9hDeHPpea85XvuGScEVERERExPMmpyYx57cDWdHxBRaFP8C4LY/Agr9D+qdwaCvYS2mVNY/XQp8jgoJKt9XiF//i1rbo+urZsyc9e/Z0fj506FB27drFs88+y/nnn1/tbR599FEmTZrk/DwvLy9gE4xSf3/+85+ZM2cOa9assToUEe+QvRZ2LYegEIoG3QHrttV41cyc/Grbo6fMzai97WHwbbDqTUj/DI4fhGZtXfotiIiIiIiIZwxY91c4tAKCQiEmCdr1gXa9IaY3FBdQ8skdnM863uCf3FH0ECeJAGpuqxbf5FWVi9U555xz2LJlS41fDw8Pp0WLFpU+xDMKCwutDkFEXO2nV82x91X07dWrymKWiqp7QpCWlVspsQjVVDm27w8dB0NpEax51yVhi4iIiIiIh616C9LeBVsQ3PQxTFgMY1+BYX+AbqOg12UE3zyLgqCmDAtO562wf9CME9w9IvGMM9zFt3h9cjEtLY327dtbHYblCgoKuPfee4mJiSEiIoJzzz2XFStWVLnekiVL6N+/PxEREQwZMoR169Y5v7Zz507GjBlDVFQUkZGRJCcn89VXXzm/np6ezmWXXUazZs1o164dN998Mzk5Oc6vjxw5knvuuYdJkyYRHR3NxRdfzA033MD1119fKYaioiKio6N58803AbDb7TzzzDMkJibSpEkT+vfvzyeffFLpNl999RU9evSgSZMmXHDBBezYseOMfyZbtmzh/PPPJyIigt69ezNv3rwq13nkkUfo0aMHTZs2JTExkccff5yioiIApk+fzl/+8hfWrl2LzWbDZrMxffp0AJ5//nn69u1LZGQkcXFxTJw4kePHj58xJhGflp8D6z4250N+B5hWh9kTh3FBz8rVhTU9IaipvaHK5YNvM8dV06G0tFFhi4iIiIiIh+1Ng6/+aM4veAy6XlD99ToPJfz2zykOa87ZQZv4Ke4lHhmpHI+/cWtb9PHjx9m6davz88zMTNasWUPr1q2Jj4/n0UcfZc+ePbz99tsAvPDCC3Tp0oXk5GQKCwt59913mTlzJjNnznRnmA2WlpVbdROqmzz88MPMnDmTt956i86dO/PMM88wevRotm7dSuvWrZ3X++Mf/8iLL75IbGwsf/rTn/jVr37F5s2bCQ0N5fe//z2FhYUsWrSIyMhI0tPTadasGQDZ2dmMGDGCu+66i+eff56TJ0/yyCOPMH78eH744Qfn/b/11lvcfffdLFmyBLvdztatWxk/fjzHjx933tc333xDfn4+V199NQD/93//x6xZs3jllVfo3r07ixYt4te//jVt27ZlxIgR7Nq1i3HjxjFhwgTuvvtuVq5cyYMPPljrn0dpaSnjxo0jOjqa5cuXk5eXx/3331/les2bN2f69Ol06NCBdevWcdddd9G8eXMefvhhrrvuOtavX8/XX3/Nd999B0DLli0BCAoK4t///jddunQhMzOTiRMn8vDDDzN16tSG/yWKeLvVb0FJAXRIgU5nOS9OiY/izdvOrtPPvDptjQNIHgdf/wlyd8D2+eadTRERERER8X4nDsNHt5jXDj0vg3Mn1X79ToMJ+c3n8PZVRB5cA29fCbd8Ck1aeSJa8QS7G82fP98OVPm49dZb7Xa73X7rrbfaR4wY4bz+P/7xD3vXrl3tERER9qioKPu5555r//LLL+v1mEePHrUD9qNHj1b52smTJ+3p6en2kydPNubbstvtdvvTX6XbOz/yhfPj6a/SG32fNTl+/Lg9NDTU/t577zkvKywstHfo0MH+zDPP2O328j/rDz/80HmdQ4cO2Zs0aWL/6KOP7Ha73d63b1/7n//852of4/HHH7dfcskllS7btWuXHbBv2rTJbrfb7SNGjLAPGDCg0nUKCwvt0dHR9rffftt52Q033GC/9tprnbFHRETYly5dWul2d9xxh/2GG26w2+12+6OPPmpPSkqyl5aWOr/+yCOP2AF7bm5utfF+88039uDgYPuuXbucl82dO9cO2GfPnl3tbex2u/2ZZ56xDxo0yPn5//t//8/ev3//Gq/vMGPGDHubNm3OeD273bX/zkQ8prjIbn8uyW7/fy3s9rT3G3VXp/98nFLTz8evHjaP98GNjXo8ERERERHxkJJiu/3tseZ5/Av97fYTuXW/bfYvdvs/Esxtv3nMXRGKi9SWXzudWysXR44cid1ur/HrjhZUh4cffpiHH37YnSG5RE0zxUYnx7qlgnHbtm0UFRUxfPhw52WhoaGcffbZZGRkVLru0KFDneetW7emZ8+ezuvce++93H333Xz77bdcdNFFXH311fTr1w+AVatWMX/+fGf14emP36NHDwAGDx5c6WuhoaFce+21vPfee9x8883k5+fz6aef8v777wOm1frUqVNcfPHFlW5XWFhISkoKABkZGZxzzjnYbLZqv4/qZGRkEB8fT6dOnWq9zSeffMILL7zA1q1bOX78OMXFxXWayzl//nz+/ve/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RREREREREREREWkWJRdFRERERERERESkWZRcFBERERERERERkWZRctEPPfPMM4wZM4bo6Gg6duzYpOcYhsGcOXPo2rUrbdu2Zdy4cWzfvt1tn4qKCr773e8SHx9Pu3btuP322zl06JAP/gJpbSUlJUyfPp3Y2FhiY2OZPn06Z86cafQ5Nput3p///d//de0zbty4Oo/fe++9Pv5rpDU055x56KGH6pwPo0aNcttH15ng5ek5U1lZyZNPPsmgQYNo164dXbt25Rvf+AZHjhxx20/XmeAxb948UlNTadOmDcOGDeOzzz5rdP+cnByGDRtGmzZtSEtLY/78+XX2ee+99+jfvz9RUVH079+fRYsW+Sp8sYAn58zChQuZMGECnTt3JiYmhtGjR/PRRx+57bNgwYJ6P9tcvHjR13+KtBJPzplVq1bVez7s3LnTbT9dZ4KbJ+dMfZ91bTYbAwYMcO2j60zw+vTTT5kyZQpdu3bFZrPxz3/+86rP0WeZWkou+qFLly4xbdo0Hn300SY/57nnnuOFF17gj3/8Ixs2bCAxMZEJEyZw9uxZ1z5PPPEEixYt4q233mL16tWcO3eO2267jerqal/8GdKK7r//fvLy8li6dClLly4lLy+P6dOnN/qco0ePuv389a9/xWaz8dWvftVtvxkzZrjt99JLL/nyT5FW0pxzBmDy5Mlu58OHH37o9riuM8HL03Pm/PnzbN68mZ/97Gds3ryZhQsXsmvXLm6//fY6++o6E/jefvttnnjiCX7605+Sm5vLjTfeSHZ2NkVFRfXuX1hYyFe+8hVuvPFGcnNz+clPfsLjjz/Oe++959pn7dq13HPPPUyfPp0tW7Ywffp07r77btatW9daf5b4kKfnzKeffsqECRP48MMP2bRpEzfddBNTpkwhNzfXbb+YmJg6n3HatGnTGn+S+Jin54xTQUGB2/nQp08f12O6zgQ3T8+Z3/3ud27nysGDB+nUqRPTpk1z20/XmeBUXl7O4MGD+eMf/9ik/fVZ5gqG+K1XXnnFiI2Nvep+DofDSExMNObOnevadvHiRSM2NtaYP3++YRiGcebMGSMiIsJ46623XPscPnzYsNvtxtKlS70eu7SeHTt2GIDxxRdfuLatXbvWAIydO3c2+XXuuOMOY/z48W7bsrKyjO9973veClX8RHPPmQcffNC44447Gnxc15ng5a3rzPr16w3AOHDggGubrjPBYcSIEcbMmTPdtqWnpxuzZ8+ud/8f/ehHRnp6utu2Rx55xBg1apTr97vvvtuYPHmy2z6TJk0y7r33Xi9FLVby9JypT//+/Y2nn37a9XtTPztLYPL0nFm5cqUBGCUlJQ2+pq4zwa2l15lFixYZNpvN2L9/v2ubrjOhATAWLVrU6D76LONOlYtBoLCwkGPHjjFx4kTXtqioKLKyslizZg0AmzZtorKy0m2frl27MnDgQNc+EpjWrl1LbGwsI0eOdG0bNWoUsbGxTf63PX78OIsXL+bhhx+u89gbb7xBfHw8AwYM4Ic//KFbNawEppacM6tWrSIhIYG+ffsyY8YMTpw44XpM15ng5Y3rDEBpaSk2m63OlB+6zgS2S5cusWnTJrf/9wEmTpzY4Pmxdu3aOvtPmjSJjRs3UllZ2eg+up4EvuacM1dyOBycPXuWTp06uW0/d+4cKSkpdO/endtuu61OZaMEppacM5mZmSQlJXHzzTezcuVKt8d0nQle3rjOvPzyy9xyyy2kpKS4bdd1RkCfZa4UbnUA0nLHjh0DoEuXLm7bu3TpwoEDB1z7REZGEhcXV2cf5/MlMB07doyEhIQ62xMSEpr8b/vqq6/SoUMHpk6d6rb9gQceIDU1lcTERLZt28aPf/xjtmzZwrJly7wSu1ijuedMdnY206ZNIyUlhcLCQn72s58xfvx4Nm3aRFRUlK4zQcwb15mLFy8ye/Zs7r//fmJiYlzbdZ0JfMXFxVRXV9f7OaSh8+PYsWP17l9VVUVxcTFJSUkN7qPrSeBrzjlzpeeff57y8nLuvvtu17b09HQWLFjAoEGDKCsr43e/+x3XX389W7ZscRsKK4GnOedMUlISf/7znxk2bBgVFRW89tpr3HzzzaxatYqxY8cCDV+LdJ0JfC29zhw9epQlS5bw5ptvum3XdUac9FnGnZKLrWTOnDk8/fTTje6zYcMGhg8f3uxj2Gw2t98Nw6iz7UpN2Ues0dRzBur+24Nn/7Z//etfeeCBB+rMFTJjxgzX+sCBA+nTpw/Dhw9n8+bNDB06tEmvLa3H1+fMPffc41ofOHAgw4cPJyUlhcWLF9dJTHvyumKd1rrOVFZWcu+99+JwOJg3b57bY7rOBA9PP4fUt/+V25vz2UYCR3P/ff/+978zZ84c3n//fbcbH6NGjXJrNHb99dczdOhQ/vCHP/D73//ee4GLZTw5Z/r160e/fv1cv48ePZqDBw/y61//2pVc9PQ1JfA09993wYIFdOzYkTvvvNNtu64zcjl9lqml5GIreeyxx67a/bJnz57Neu3ExETAzJwnJSW5tp84ccKVJU9MTOTSpUuUlJS4VRWdOHGCMWPGNOu44ltNPWe+/PJLjh8/XuexkydP1rlLUp/PPvuMgoIC3n777avuO3ToUCIiIti9e7e+9Puh1jpnnJKSkkhJSWH37t2ArjOBqDXOmcrKSu6++24KCwtZsWKFW9VifXSdCTzx8fGEhYXVuQt/+eeQKyUmJta7f3h4ONdcc02j+3hynRL/1Jxzxuntt9/m4Ycf5p133uGWW25pdF+73c51113nep+SwNWSc+Zyo0aN4vXXX3f9rutM8GrJOWMYBn/961+ZPn06kZGRje6r60zo0mcZd5pzsZXEx8eTnp7e6E9zO0w5h5NdPoTs0qVL5OTkuL7QDxs2jIiICLd9jh49yrZt2/Sl30819ZwZPXo0paWlrF+/3vXcdevWUVpa2qR/25dffplhw4YxePDgq+67fft2Kisr3ZLY4j9a65xxOnXqFAcPHnSdD7rOBB5fnzPOxOLu3bv55JNPXB+0GqPrTOCJjIxk2LBhdYayL1u2rMHzY/To0XX2//jjjxk+fDgRERGN7qPrSeBrzjkDZsXiQw89xJtvvsmtt9561eMYhkFeXp6uJ0GguefMlXJzc93OB11ngldLzpmcnBz27NlT73z0V9J1JnTps8wVWruDjFzdgQMHjNzcXOPpp5822rdvb+Tm5hq5ubnG2bNnXfv069fPWLhwoev3uXPnGrGxscbChQuNrVu3Gvfdd5+RlJRklJWVufaZOXOm0b17d+OTTz4xNm/ebIwfP94YPHiwUVVV1ap/n3jf5MmTjWuvvdZYu3atsXbtWmPQoEHGbbfd5rbPleeMYRhGaWmpER0dbfzpT3+q85p79uwxnn76aWPDhg1GYWGhsXjxYiM9Pd3IzMzUORMEPD1nzp49a/znf/6nsWbNGqOwsNBYuXKlMXr0aKNbt266zoQIT8+ZyspK4/bbbze6d+9u5OXlGUePHnX9VFRUGIah60wweeutt4yIiAjj5ZdfNnbs2GE88cQTRrt27VwdNmfPnm1Mnz7dtf++ffuM6Oho4/vf/76xY8cO4+WXXzYiIiKMd99917XP559/boSFhRlz58418vPzjblz5xrh4eFuXcslcHl6zrz55ptGeHi48eKLL7pdT86cOePaZ86cOcbSpUuNvXv3Grm5ucY3v/lNIzw83Fi3bl2r/33ifZ6eM7/5zW+MRYsWGbt27TK2bdtmzJ492wCM9957z7WPrjPBzdNzxunrX/+6MXLkyHpfU9eZ4HX27FlX7gUwXnjhBSM3N9c4cOCAYRj6LHM1Si76oQcffNAA6vysXLnStQ9gvPLKK67fHQ6H8dRTTxmJiYlGVFSUMXbsWGPr1q1ur3vhwgXjscceMzp16mS0bdvWuO2224yioqJW+qvEl06dOmU88MADRocOHYwOHToYDzzwgFFSUuK2z5XnjGEYxksvvWS0bdvW7YO5U1FRkTF27FijU6dORmRkpNGrVy/j8ccfN06dOuXDv0Rai6fnzPnz542JEycanTt3NiIiIozk5GTjwQcfrHMN0XUmeHl6zhQWFtb7Xnb5+5muM8HlxRdfNFJSUozIyEhj6NChRk5OjuuxBx980MjKynLbf9WqVUZmZqYRGRlp9OzZs94bXe+8847Rr18/IyIiwkhPT3dLCkjg8+ScycrKqvd68uCDD7r2eeKJJ4zk5GQjMjLS6Ny5szFx4kRjzZo1rfgXia95cs48++yzRq9evYw2bdoYcXFxxg033GAsXry4zmvqOhPcPH1vOnPmjNG2bVvjz3/+c72vp+tM8Fq5cmWj7zP6LNM4m2HUzDgpIiIiIiIiIiIi4gHNuSgiIiIiIiIiIiLNouSiiIiIiIiIiIiINIuSiyIiIiIiIiIiItIsSi6KiIiIiIiIiIhIsyi5KCIiIiIiIiIiIs2i5KKIiIiIiIiIiIg0i5KLIiIiIiIiIiIi0ixKLoqIiIiIiIiIiEizKLkoIiIiIiIiIiIizaLkooiIiIiIiIiIiDSLkosiIiIiIiIiIiLSLP8fOksSOo3HUiMAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "x = np.linspace(-1, 1, 201).reshape(-1,1)\n", + "y = f_obj(x)\n", + "\n", + "plt.figure(figsize=(16, 6))\n", + "plt.plot(x, y, \"C1-\", label=\"target function\")\n", + "plt.scatter(xt, yt, marker=\"o\", s=10, label=\"observed data\")\n", + "plt.xlim([-1.1,1.1])\n", + "plt.legend(loc=0)\n", + "plt.show()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "465167dc-424b-4b73-8e1d-28dc6e5e3044", + "metadata": {}, + "source": [ + "#### Building the surrogate" + ] + }, + { + "cell_type": "markdown", + "id": "41bca9a8-bc79-4122-a650-64dd4c37203c", + "metadata": {}, + "source": [ + "In order to ensure the proper convergence of optimization, we take an initial guess for theta based on the data std.\\\n", + "Also, it can be useful to change the allowed bounds for this parameter.\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "87e8237c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "theta0 : [3.10146663]\n" + ] + } + ], + "source": [ + "# Initial guess for lengthscale parameter: standard deviation of training data\n", + "l = np.std(xt, axis=0)\n", + "\n", + "# Transform to theta parameter (inverse of lengthscale)\n", + "theta0 = 1/l**2\n", + "print(\"theta0 :\", theta0)\n", + "\n", + "# Specify bounds for theta\n", + "bounds = [[1e-8, 1e2]] " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f261c2c8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mixture[Smooth(1)](SquaredExponentialSGP(corr=SquaredExponential, theta=[35.44704329956747], variance=4.116726430399307, noise variance=0.008454541745122387, likelihood=288.78855659582496))\n" + ] + } + ], + "source": [ + "sgpx = egx.SparseGpMix(theta_init=theta0, theta_bounds=bounds, nz=30, seed=42).fit(xt, yt)\n", + "\n", + "# Print trained surrogate\n", + "print(sgpx)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "a302fb72-aff9-4d92-949f-f77832ab78d6", + "metadata": { + "tags": [] + }, + "source": [ + "### Prediction" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "b4419c24-cb8e-4dd0-893b-8b6b23ad3218", + "metadata": {}, + "source": [ + "#### Using the surrogate for estimation" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "47d51b54-41df-4b78-b10f-f996ec8bf5a2", + "metadata": {}, + "outputs": [], + "source": [ + "hat_y = sgpx.predict_values(x)\n", + "var = sgpx.predict_variances(x)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "4c44d3ba-4540-4e3f-8eb8-35eac1a6c3df", + "metadata": {}, + "source": [ + "#### Plotting results" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "782b0849-ef74-4267-999b-d714065323e7", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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+mnnzp3q27dvg7aNG/N2rydNmuT6d1JSkvr166e4uDitX7++RmDnyXbROL6a21VVVZo8ebKqq6v12muvua1jbjc/T8+1tdVfv7wx5294X2P78pe//EXp6el699133YLclJQUt4fO33nnnerbt69eeeUVvfzyy003cDSKJ/1OSEhQQkKC631qaqqOHj2q+fPnu8IbT7cJ32lsXzIzM9W+fXuNHz/ebTlzu+Xwt3M24U0dHn300Rt+I0h8fHyjth0RESHpaloYGRnpWn7q1ClXMhgREaHKykqdO3fO7X/pT506pQEDBjRqv6hdQ3v9r3/9SydPnqyx7vTp0zUS3dp8/PHH2r9/v1atWnXD2r59+8put+vAgQP8gdeEfNXrayIjIxUXF6cDBw5IYl77mi/6XVVVpYkTJ6qoqEgfffSR21U3tWFu+054eLhatWpV43/XvnmuvV5ERESt9YGBgerUqVO9NZ78bEDTakyvr1m1apWmT5+u1atX65577qm3NiAgQN/73vdcP9PRPG6m39+UkpKit99+2/WeuW09N9NrY4yWLl2qtLQ0BQUF1VvL3P528sdzNs+8qUN4eLgSExPrfTX2ieTXLqH/5mXzlZWVys3Ndf0Bl5ycLLvd7lZz/Phx7dmzhz/ymlhDe52amiqn06lt27a5Prt161Y5nc4G9WTJkiVKTk5W7969b1i7d+9eVVVVuYV7uHm+6vU1Z86c0dGjR119ZF77lrf7fS24OXDggD788EPXLwr1YW77TlBQkJKTk2vcorZx48Y6+5qamlqj/oMPPlC/fv1kt9vrrWEON5/G9Fq6esXNtGnTtGLFCt1333033I8xRrt27WL+NrPG9vt6+fn5br1kblvPzfQ6NzdXhYWFtT5n8nrM7W8nvzxn+/oJyS1RcXGxyc/PNxkZGaZt27YmPz/f5Ofnm/LycldNQkKCWbt2rev9vHnzjMPhMGvXrjWfffaZefDBB01kZKQpKytz1cycOdNER0ebDz/80OzcudMMHTrU9O7d21y+fNmnx4d/GzlypPnud79r8vLyTF5enunVq5cZPXq0W831vTbGGKfTaVq3bm1ef/31GtssLCw0GRkZZvv27aaoqMisX7/eJCYmmj59+tDrZuRpr8vLy82TTz5ptmzZYoqKikxOTo5JTU01t956K/P6W8DTfldVVZmxY8ea6Ohos2vXLnP8+HHXq6KiwhjD3LaClStXGrvdbpYsWWIKCgrMrFmzTJs2bVzfOjJnzhyTlpbmqj906JBp3bq1eeKJJ0xBQYFZsmSJsdvt5q9//aur5pNPPjGtWrUy8+bNM59//rmZN2+eCQwMdPu2Mviep71esWKFCQwMNK+++qrb/C0tLXXVpKenm+zsbHPw4EGTn59vfvKTn5jAwECzdetWnx8f3Hna7z/+8Y8mKyvLfPHFF2bPnj1mzpw5RpJZs2aNq4a5bU2e9vqaH/3oR6Z///61bpO5bU3l5eWuv6MlmZdeesnk5+e7vsWTc7YxhDdNYOrUqUZSjVdOTo6rRpJZtmyZ6311dbWZO3euiYiIMMHBwWbgwIHms88+c9vu119/bR599FHTsWNHExoaakaPHm2OHDnio6NCbc6cOWOmTJli2rVrZ9q1a2emTJlS42snr++1McYsXrzYhIaGuv1SeM2RI0fMwIEDTceOHU1QUJDp3r27eeyxx8yZM2e8eCS4EU97ffHiRTNixAjTuXNnY7fbTWxsrJk6dWqNOcu8tiZP+11UVFTrz/1v/uxnblvDq6++auLi4kxQUJDp27evyc3Nda2bOnWqGTRokFv9pk2bTJ8+fUxQUJCJj4+vNXRfvXq1SUhIMHa73SQmJrr9AYjm40mvBw0aVOv8nTp1qqtm1qxZJjY21gQFBZnOnTubESNGmC1btvjwiFAfT/r9+9//3nTv3t2EhISYDh06mLvuususX7++xjaZ29bk6c/x0tJSExoaat54441at8fctqacnJx6fy5zzjbGZsz/P9UHAAAAAAAAlsMzbwAAAAAAACyM8AYAAAAAAMDCCG8AAAAAAAAsjPAGAAAAAADAwghvAAAAAAAALIzwBgAAAAAAwMIIbwAAAAAAACyM8AYAAAAAAMDCCG8AAAAAAAAsjPAGAAAAAADAwghvAAAAAAAALIzwBgAAAAAAwML+Dxs4fRzHO6rgAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(14, 6))\n", + "plt.plot(x, y, \"C1-\", label=\"target function\")\n", + "plt.scatter(xt, yt, marker=\"o\", s=10, label=\"observed data\")\n", + "plt.plot(x, hat_y, \"k-\", label=\"Sparse GP\")\n", + "plt.plot(x, hat_y - 3 * np.sqrt(var), \"g--\")\n", + "plt.plot(x, hat_y + 3 * np.sqrt(var), \"g--\", label=\"99% CI\")\n", + "#plt.plot(Z1, -2.9 * np.ones_like(Z1), \"r|\", mew=2, label=\"inducing points - random\")\n", + "plt.ylim([-3, 3])\n", + "plt.legend(loc=0)\n", + "plt.title('FITC method - random inducing points')\n", + "plt.show()" + ] + } + ], + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/gp/Cargo.toml b/gp/Cargo.toml index 9bafc915..21d7294f 100644 --- a/gp/Cargo.toml +++ b/gp/Cargo.toml @@ -37,6 +37,7 @@ paste = "1.0" num-traits = "0.2" thiserror = "1" log = "0.4" +rayon = "1" serde = { version = "1", features = ["derive"], optional = true } serde_json = { version = "1", optional = true } diff --git a/gp/benches/gp.rs b/gp/benches/gp.rs index e31e21b1..65529ad0 100644 --- a/gp/benches/gp.rs +++ b/gp/benches/gp.rs @@ -58,7 +58,7 @@ fn criterion_gp(c: &mut Criterion) { SquaredExponentialCorr::default(), ) .kpls_dim(Some(1)) - .initial_theta(Some(vec![1.0])) + .theta_init(vec![1.0]) .fit(&Dataset::new(xt.to_owned(), yt.to_owned())) .expect("GP fit error"), ) diff --git a/gp/src/algorithm.rs b/gp/src/algorithm.rs index af5efbd8..8177610d 100644 --- a/gp/src/algorithm.rs +++ b/gp/src/algorithm.rs @@ -15,19 +15,37 @@ use ndarray::{arr1, s, Array, Array1, Array2, ArrayBase, Axis, Data, Ix1, Ix2, Z use ndarray_einsum_beta::*; #[cfg(feature = "blas")] use ndarray_linalg::{cholesky::*, eigh::*, qr::*, svd::*, triangular::*}; -use ndarray_rand::rand::SeedableRng; +use ndarray_rand::rand::{Rng, SeedableRng}; +use ndarray_rand::rand_distr::Normal; +use ndarray_rand::RandomExt; use ndarray_stats::QuantileExt; +use log::debug; use rand_xoshiro::Xoshiro256Plus; +use rayon::prelude::*; #[cfg(feature = "serializable")] use serde::{Deserialize, Serialize}; use std::fmt; +use std::time::Instant; -use ndarray_rand::rand_distr::Normal; -use ndarray_rand::RandomExt; +pub(crate) struct CobylaParams { + pub rhobeg: f64, + pub ftol_rel: f64, + pub maxeval: usize, +} + +impl Default for CobylaParams { + fn default() -> Self { + CobylaParams { + rhobeg: 0.5, + ftol_rel: 1e-4, + maxeval: 25, + } + } +} // const LOG10_20: f64 = 1.301_029_995_663_981_3; //f64::log10(20.); -const N_START: usize = 10; // number of optimization restart (aka multistart) +//const N_START: usize = 0; // number of optimization restart (aka multistart) /// Internal parameters computed Gp during training /// used later on in prediction computations @@ -160,6 +178,9 @@ impl Clone for GpInnerParams { pub struct GaussianProcess, Corr: CorrelationModel> { /// Parameter of the autocorrelation model theta: Array1, + /// Reduced likelihood value (result from internal optimization) + /// Maybe used to compare different trained models + likelihood: F, /// Regression model #[cfg_attr( feature = "serializable", @@ -202,6 +223,7 @@ impl, Corr: CorrelationModel> Clone fn clone(&self) -> Self { Self { theta: self.theta.to_owned(), + likelihood: self.likelihood, mean: self.mean, corr: self.corr, inner_params: self.inner_params.clone(), @@ -216,7 +238,11 @@ impl, Corr: CorrelationModel> fmt::Display for GaussianProcess { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "GP({}, {})", self.mean, self.corr) + write!( + f, + "GP(mean={}, corr={}, theta={}, variance={}, likelihood={})", + self.mean, self.corr, self.theta, self.inner_params.sigma2, self.likelihood, + ) } } @@ -751,7 +777,7 @@ impl, Corr: CorrelationModel, D: Data x.ncols() { - return Err(GpError::InvalidValue(format!( + return Err(GpError::InvalidValueError(format!( "Dimension reduction {} should be smaller than actual \ training input dimensions {}", d, @@ -786,14 +812,18 @@ impl, Corr: CorrelationModel, D: Data, _params: &mut ()| -> f64 { let theta = @@ -808,42 +838,60 @@ impl, Corr: CorrelationModel, D: Data unsafe { -(*(&r.0 as *const F as *const f64)) }, Err(_) => f64::INFINITY, } }; // Multistart: user theta0 + 1e-5, 1e-4, 1e-3, 1e-2, 0.1, 1., 10. - let mut theta0s = Array2::zeros((N_START + 1, theta0.len())); - theta0s.row_mut(0).assign(&theta0.mapv(|v| F::log10(v))); - let mut xlimits: Array2 = Array2::zeros((theta0.len(), 2)); - for mut row in xlimits.rows_mut() { - row.assign(&arr1(&[F::cast(-6), F::cast(2)])); - } - // Use a seed here for reproducibility. Do we need to make it truly random - // Probably no, as it is just to get init values spread over - // [1e-6, 20] for multistart thanks to LHS method. - let seeds = Lhs::new(&xlimits) - .kind(egobox_doe::LhsKind::Maximin) - .with_rng(Xoshiro256Plus::seed_from_u64(42)) - .sample(N_START); - Zip::from(theta0s.slice_mut(s![1.., ..]).rows_mut()) - .and(seeds.rows()) - .par_for_each(|mut theta, row| theta.assign(&row)); - - let bounds = vec![(F::cast(-6.), F::cast(2.)); theta0.len()]; - - let opt_thetas = theta0s.map_axis(Axis(1), |theta| { - optimize_params(objfn, &theta.to_owned(), &bounds) - }); - let opt_index = opt_thetas.map(|(_, opt_f)| opt_f).argmin().unwrap(); - let opt_theta = &(opt_thetas[opt_index]).0.mapv(|v| F::cast(base.powf(v))); - // println!("opt_theta={}", opt_theta); - let rxx = self.corr().value(&x_distances.d, opt_theta, &w_star); - let (_, inner_params) = reduced_likelihood(&fx, rxx, &x_distances, &ytrain, self.nugget())?; + // let bounds = vec![(F::cast(-6.), F::cast(2.)); theta0.len()]; + let bounds_dim = self.theta_tuning().bounds().len(); + let bounds = if bounds_dim == 1 { + vec![self.theta_tuning().bounds()[0]; w_star.ncols()] + } else if theta0_dim == w_star.ncols() { + self.theta_tuning().bounds().to_vec() + } else { + panic!( + "Bounds for theta should be either 1-dim or dim of xtrain ({}), got {}", + w_star.ncols(), + theta0_dim + ) + }; + + let (params, bounds) = prepare_multistart(self.n_start(), &theta0, &bounds); + debug!( + "Optimize with multistart theta = {:?} and bounds = {:?}", + params, bounds + ); + let now = Instant::now(); + let opt_params = (0..params.nrows()) + .into_par_iter() + .map(|i| { + let opt_res = optimize_params( + objfn, + ¶ms.row(i).to_owned(), + &bounds, + CobylaParams { + maxeval: (10 * theta0_dim).max(CobylaParams::default().maxeval), + ..CobylaParams::default() + }, + ); + + opt_res + }) + .reduce( + || (Array::ones((params.ncols(),)), f64::INFINITY), + |a, b| if b.1 < a.1 { b } else { a }, + ); + debug!("elapsed optim = {:?}", now.elapsed().as_millis()); + let opt_params = opt_params.0.mapv(|v| F::cast(base.powf(v))); + let rxx = self.corr().value(&x_distances.d, &opt_params, &w_star); + let (lkh, inner_params) = + reduced_likelihood(&fx, rxx, &x_distances, &ytrain, self.nugget())?; Ok(GaussianProcess { - theta: opt_theta.to_owned(), + theta: opt_params, + likelihood: lkh, mean: *self.mean(), corr: *self.corr(), inner_params, @@ -854,12 +902,60 @@ impl, Corr: CorrelationModel, D: Data( + n_start: usize, + theta0: &Array1, + bounds: &[(F, F)], +) -> (Array2, Vec<(F, F)>) { + // Use log10 theta as optimization parameter + let bounds: Vec<(F, F)> = bounds + .iter() + .map(|(lo, up)| (lo.log10(), up.log10())) + .collect(); + + // Multistart: user theta0 + 1e-5, 1e-4, 1e-3, 1e-2, 0.1, 1., 10. + let mut theta0s = Array2::zeros((n_start + 1, theta0.len())); + theta0s.row_mut(0).assign(&theta0.mapv(|v| F::log10(v))); + + match n_start.cmp(&1) { + std::cmp::Ordering::Equal => { + //let mut rng = Xoshiro256Plus::seed_from_u64(42); + let mut rng = Xoshiro256Plus::from_entropy(); + let vals = bounds.iter().map(|(a, b)| rng.gen_range(*a..*b)).collect(); + theta0s.row_mut(1).assign(&Array::from_vec(vals)) + } + std::cmp::Ordering::Greater => { + let mut xlimits: Array2 = Array2::zeros((bounds.len(), 2)); + // for mut row in xlimits.rows_mut() { + // row.assign(&arr1(&[limits.0, limits.1])); + // } + Zip::from(xlimits.rows_mut()) + .and(&bounds) + .for_each(|mut row, limits| row.assign(&arr1(&[limits.0, limits.1]))); + // Use a seed here for reproducibility. Do we need to make it truly random + // Probably no, as it is just to get init values spread over + // [1e-6, 20] for multistart thanks to LHS method. + + let seeds = Lhs::new(&xlimits) + .kind(egobox_doe::LhsKind::Maximin) + .with_rng(Xoshiro256Plus::seed_from_u64(42)) + .sample(n_start); + Zip::from(theta0s.slice_mut(s![1.., ..]).rows_mut()) + .and(seeds.rows()) + .par_for_each(|mut theta, row| theta.assign(&row)); + } + std::cmp::Ordering::Less => (), + }; + (theta0s, bounds) +} + /// Optimize gp hyper parameters given an initial guess and bounds with NLOPT::Cobyla #[cfg(feature = "nlopt")] pub(crate) fn optimize_params( objfn: ObjF, param0: &Array1, bounds: &[(F, F)], + cobyla: CobylaParams, ) -> (Array1, f64) where ObjF: Fn(&[f64], Option<&mut [f64]>, &mut ()) -> f64, @@ -879,9 +975,9 @@ where let upper_bounds = bounds.iter().map(|b| into_f64(&b.1)).collect::>(); optimizer.set_upper_bounds(&upper_bounds).unwrap(); - optimizer.set_initial_step1(0.5).unwrap(); - optimizer.set_maxeval(15 * param0.len() as u32).unwrap(); - optimizer.set_ftol_rel(1e-4).unwrap(); + optimizer.set_initial_step1(cobyla.rhobeg).unwrap(); + optimizer.set_maxeval(cobyla.maxeval as u32).unwrap(); + optimizer.set_ftol_rel(cobyla.ftol_rel).unwrap(); match optimizer.optimize(&mut param) { Ok((_, fmin)) => { @@ -906,6 +1002,7 @@ pub(crate) fn optimize_params( objfn: ObjF, param0: &Array1, bounds: &[(F, F)], + cobyla: CobylaParams, ) -> (Array1, f64) where ObjF: Fn(&[f64], Option<&mut [f64]>, &mut ()) -> f64, @@ -917,10 +1014,6 @@ where let cons: Vec<&dyn Func<()>> = vec![]; let param0 = param0.map(|v| into_f64(v)).into_raw_vec(); - let initial_step = 0.5; - let ftol_rel = 1e-4; - let maxeval = 15 * param0.len(); - let bounds: Vec<_> = bounds .iter() .map(|(lo, up)| (into_f64(lo), into_f64(up))) @@ -932,10 +1025,10 @@ where &bounds, &cons, (), - maxeval, - cobyla::RhoBeg::All(initial_step), + cobyla.maxeval, + cobyla::RhoBeg::All(cobyla.rhobeg), Some(StopTols { - ftol_rel, + ftol_rel: cobyla.ftol_rel, ..StopTols::default() }), ) { @@ -1158,7 +1251,7 @@ mod tests { ConstantMean::default(), SquaredExponentialCorr::default(), ) - .initial_theta(Some(vec![0.1])) + .theta_init(vec![0.1]) .kpls_dim(Some(1)) .fit(&Dataset::new(xt, yt)) .expect("GP fit error"); @@ -1181,7 +1274,7 @@ mod tests { [<$regr Mean>]::default(), [<$corr Corr>]::default(), ) - .initial_theta(Some(vec![0.1])) + .theta_init(vec![0.1]) .fit(&Dataset::new(xt, yt)) .expect("GP fit error"); let yvals = gp diff --git a/gp/src/correlation_models.rs b/gp/src/correlation_models.rs index 871ba5c9..30458dd7 100644 --- a/gp/src/correlation_models.rs +++ b/gp/src/correlation_models.rs @@ -16,7 +16,7 @@ use std::convert::TryFrom; use std::fmt; /// A trait for using a correlation model in GP regression -pub trait CorrelationModel: Clone + Copy + Default + fmt::Display { +pub trait CorrelationModel: Clone + Copy + Default + fmt::Display + Sync { /// Compute correlation function matrix r(x, x') given distances `d` between x and x', /// `theta` parameters, and PLS `weights`, where: /// `theta` : hyperparameters (1xd) diff --git a/gp/src/errors.rs b/gp/src/errors.rs index 6edaec01..ae8e677d 100644 --- a/gp/src/errors.rs +++ b/gp/src/errors.rs @@ -21,9 +21,6 @@ pub enum GpError { /// When PLS fails #[error("PLS error: {0}")] PlsError(#[from] linfa_pls::PlsError), - /// When a value is invalid - #[error("PLS error: {0}")] - InvalidValue(String), /// When a linfa error occurs #[error(transparent)] LinfaError(#[from] linfa::error::Error), @@ -36,7 +33,7 @@ pub enum GpError { /// When error during loading #[error("Load error: {0}")] LoadError(String), - /// When error during loading + /// When error dur to a bad value #[error("InvalidValue error: {0}")] InvalidValueError(String), } diff --git a/gp/src/lib.rs b/gp/src/lib.rs index 683ab528..795f5a9e 100644 --- a/gp/src/lib.rs +++ b/gp/src/lib.rs @@ -14,14 +14,14 @@ mod algorithm; pub mod correlation_models; mod errors; pub mod mean_models; -mod sgp_algorithm; +mod sparse_algorithm; mod parameters; -mod sgp_parameters; +mod sparse_parameters; mod utils; pub use algorithm::*; pub use errors::*; pub use parameters::*; -pub use sgp_algorithm::*; -pub use sgp_parameters::*; +pub use sparse_algorithm::*; +pub use sparse_parameters::*; diff --git a/gp/src/mean_models.rs b/gp/src/mean_models.rs index 781ab163..a0f9a51f 100644 --- a/gp/src/mean_models.rs +++ b/gp/src/mean_models.rs @@ -16,7 +16,7 @@ use std::convert::TryFrom; use std::fmt; /// A trait for mean models used in GP regression -pub trait RegressionModel: Clone + Copy + Default + fmt::Display { +pub trait RegressionModel: Clone + Copy + Default + fmt::Display + Sync { /// Compute regression coefficients defining the mean behaviour of the GP model /// for the given `x` data points specified as (n, nx) matrix. fn value(&self, x: &ArrayBase, Ix2>) -> Array2; diff --git a/gp/src/parameters.rs b/gp/src/parameters.rs index 64e6578d..9da31ba8 100644 --- a/gp/src/parameters.rs +++ b/gp/src/parameters.rs @@ -2,18 +2,79 @@ use crate::correlation_models::{CorrelationModel, SquaredExponentialCorr}; use crate::errors::{GpError, Result}; use crate::mean_models::{ConstantMean, RegressionModel}; use linfa::{Float, ParamGuard}; +use std::convert::TryFrom; + +#[cfg(feature = "serializable")] +use serde::{Deserialize, Serialize}; + +/// A structure to represent a n-dim parameter estimation +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr(feature = "serializable", derive(Serialize, Deserialize))] +pub struct ParamTuning { + pub init: Vec, + pub bounds: Vec<(F, F)>, +} + +impl TryFrom> for ThetaTuning { + type Error = GpError; + fn try_from(pt: ParamTuning) -> Result> { + if pt.init.len() != pt.bounds.len() && (pt.init.len() != 1 && pt.bounds.len() != 1) { + return Err(GpError::InvalidValueError(format!( + "Bad theta tuning specification {} {}", + pt.init.len(), + pt.bounds.len() + ))); + } + // TODO: check if init in bounds + Ok(ThetaTuning(pt)) + } +} + +/// As structure for theta hyperparameters guess +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr(feature = "serializable", derive(Serialize, Deserialize))] + +pub struct ThetaTuning(ParamTuning); +impl Default for ThetaTuning { + fn default() -> ThetaTuning { + ThetaTuning(ParamTuning { + init: vec![F::cast(0.01)], + bounds: vec![(F::cast(1e-6), F::cast(1e2))], + }) + } +} + +impl From> for ParamTuning { + fn from(tt: ThetaTuning) -> ParamTuning { + ParamTuning { + init: tt.0.init, + bounds: tt.0.bounds, + } + } +} + +impl ThetaTuning { + pub fn theta0(&self) -> &[F] { + &self.0.init + } + pub fn bounds(&self) -> &[(F, F)] { + &self.0.bounds + } +} /// A set of validated GP parameters. #[derive(Clone, Debug, PartialEq, Eq)] pub struct GpValidParams, Corr: CorrelationModel> { - /// Parameter of the autocorrelation model - pub(crate) theta: Option>, + /// Parameter guess of the autocorrelation model + pub(crate) theta_tuning: ThetaTuning, /// Regression model representing the mean(x) pub(crate) mean: Mean, /// Correlation model representing the spatial correlation between errors at e(x) and e(x') pub(crate) corr: Corr, /// Optionally apply dimension reduction (KPLS) or not pub(crate) kpls_dim: Option, + /// Number of optimization restart + pub(crate) n_start: usize, /// Parameter to improve numerical stability pub(crate) nugget: F, } @@ -21,21 +82,17 @@ pub struct GpValidParams, Corr: CorrelationMo impl Default for GpValidParams { fn default() -> GpValidParams { GpValidParams { - theta: None, + theta_tuning: ThetaTuning::default(), mean: ConstantMean(), corr: SquaredExponentialCorr(), kpls_dim: None, + n_start: 10, nugget: F::cast(100.0) * F::epsilon(), } } } impl, Corr: CorrelationModel> GpValidParams { - /// Get starting theta value for optimization - pub fn initial_theta(&self) -> &Option> { - &self.theta - } - /// Get mean model pub fn mean(&self) -> &Mean { &self.mean @@ -46,11 +103,21 @@ impl, Corr: CorrelationModel> GpValidParam &self.corr } + /// Get starting theta value for optimization + pub fn theta_tuning(&self) -> &ThetaTuning { + &self.theta_tuning + } + /// Get number of components used by PLS pub fn kpls_dim(&self) -> &Option { &self.kpls_dim } + /// Get the number of internal optimization restart + pub fn n_start(&self) -> usize { + self.n_start + } + /// Get number of components used by PLS pub fn nugget(&self) -> F { self.nugget @@ -68,22 +135,15 @@ impl, Corr: CorrelationModel> GpParams GpParams { Self(GpValidParams { - theta: None, + theta_tuning: ThetaTuning::default(), mean, corr, kpls_dim: None, + n_start: 10, nugget: F::cast(100.0) * F::epsilon(), }) } - /// Set initial value for theta hyper parameter. - /// - /// During training process, the internal optimization is started from `initial_theta`. - pub fn initial_theta(mut self, theta: Option>) -> Self { - self.0.theta = theta; - self - } - /// Set mean model. pub fn mean(mut self, mean: Mean) -> Self { self.0.mean = mean; @@ -96,13 +156,49 @@ impl, Corr: CorrelationModel> GpParams) -> Self { self.0.kpls_dim = kpls_dim; self } + /// Set initial value for theta hyper parameter. + /// + /// During training process, the internal optimization is started from `theta_init`. + pub fn theta_init(mut self, theta_init: Vec) -> Self { + self.0.theta_tuning = ParamTuning { + init: theta_init, + ..ThetaTuning::default().into() + } + .try_into() + .unwrap(); + self + } + + /// Set theta hyper parameter search space. + pub fn theta_bounds(mut self, theta_bounds: Vec<(F, F)>) -> Self { + self.0.theta_tuning = ParamTuning { + bounds: theta_bounds, + ..ThetaTuning::default().into() + } + .try_into() + .unwrap(); + self + } + + /// Set theta hyper parameter tuning + pub fn theta_tuning(mut self, theta_tuning: ThetaTuning) -> Self { + self.0.theta_tuning = theta_tuning; + self + } + + /// Set the number of internal GP hyperparameter theta optimization restarts + pub fn n_start(mut self, n_start: usize) -> Self { + self.0.n_start = n_start; + self + } + /// Set nugget. /// /// Nugget is used to improve numerical stability @@ -121,18 +217,19 @@ impl, Corr: CorrelationModel> ParamGuard fn check_ref(&self) -> Result<&Self::Checked> { if let Some(d) = self.0.kpls_dim { if d == 0 { - return Err(GpError::InvalidValue("`kpls_dim` canot be 0!".to_string())); + return Err(GpError::InvalidValueError( + "`kpls_dim` canot be 0!".to_string(), + )); } - if let Some(theta) = self.0.initial_theta() { - if theta.len() > 1 && d > theta.len() { - return Err(GpError::InvalidValue(format!( - "Dimension reduction ({}) should be smaller than expected + let theta = self.0.theta_tuning().theta0(); + if theta.len() > 1 && d > theta.len() { + return Err(GpError::InvalidValueError(format!( + "Dimension reduction ({}) should be smaller than expected training input size infered from given initial theta length ({})", - d, - theta.len() - ))); - }; - } + d, + theta.len() + ))); + }; } Ok(&self.0) } diff --git a/gp/src/sgp_algorithm.rs b/gp/src/sparse_algorithm.rs similarity index 86% rename from gp/src/sgp_algorithm.rs rename to gp/src/sparse_algorithm.rs index 86a6e2e3..a744c2bf 100644 --- a/gp/src/sgp_algorithm.rs +++ b/gp/src/sparse_algorithm.rs @@ -1,26 +1,25 @@ use crate::algorithm::optimize_params; use crate::errors::{GpError, Result}; -use crate::sgp_parameters::{ +use crate::sparse_parameters::{ Inducings, SgpParams, SgpValidParams, SparseMethod, VarianceEstimation, }; use crate::{correlation_models::*, utils::pairwise_differences}; -use egobox_doe::{Lhs, SamplingMethod}; +use crate::{prepare_multistart, CobylaParams}; use linfa::prelude::{Dataset, DatasetBase, Fit, Float, PredictInplace}; use linfa_linalg::{cholesky::*, triangular::*}; use linfa_pls::PlsRegression; -use ndarray::{arr1, s, Array, Array1, Array2, ArrayBase, Axis, Data, Ix2, Zip}; +use ndarray::{s, Array, Array1, Array2, ArrayBase, ArrayView2, Axis, Data, Ix2, Zip}; use ndarray_einsum_beta::*; -use ndarray_stats::QuantileExt; - use ndarray_rand::rand::seq::SliceRandom; use ndarray_rand::rand::SeedableRng; use rand_xoshiro::Xoshiro256Plus; +use log::debug; +use rayon::prelude::*; #[cfg(feature = "serializable")] use serde::{Deserialize, Serialize}; use std::fmt; - -const N_START: usize = 10; // number of optimization restart (aka multistart) +use std::time::Instant; /// Woodbury data computed during training and used for prediction /// @@ -152,6 +151,9 @@ pub struct SparseGaussianProcess> { sigma2: F, /// Gaussian noise variance noise: F, + /// Reduced likelihood value (result from internal optimization) + /// Maybe used to compare different trained models + likelihood: F, /// Weights in case of KPLS dimension reduction coming from PLS regression (orig_dim, kpls_dim) w_star: Array2, /// Training inputs @@ -177,10 +179,11 @@ impl> Clone for SparseGaussianProcess Self { Self { corr: self.corr, - method: self.method.clone(), + method: self.method, theta: self.theta.to_owned(), sigma2: self.sigma2, noise: self.noise, + likelihood: self.likelihood, w_star: self.w_star.to_owned(), xtrain: self.xtrain.clone(), ytrain: self.xtrain.clone(), @@ -192,7 +195,11 @@ impl> Clone for SparseGaussianProcess> fmt::Display for SparseGaussianProcess { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "SGP({})", self.corr) + write!( + f, + "SGP(corr={}, theta={}, variance={}, noise variance={}, likelihood={})", + self.corr, self.theta, self.sigma2, self.noise, self.likelihood + ) } } @@ -337,7 +344,7 @@ where } } -impl, D: Data> +impl, D: Data + Sync> Fit, ArrayBase, GpError> for SgpValidParams { type Object = SparseGaussianProcess; @@ -351,7 +358,7 @@ impl, D: Data> let y = dataset.targets(); if let Some(d) = self.kpls_dim() { if *d > x.ncols() { - return Err(GpError::InvalidValue(format!( + return Err(GpError::InvalidValueError(format!( "Dimension reduction {} should be smaller than actual \ training input dimensions {}", d, @@ -360,8 +367,8 @@ impl, D: Data> }; } - let xtrain = x.to_owned(); - let ytrain = y.to_owned(); + let xtrain = x; + let ytrain = y; let mut w_star = Array2::eye(x.ncols()); if let Some(n_components) = self.kpls_dim() { @@ -378,17 +385,18 @@ impl, D: Data> }; // Initial guess for theta - let theta0: Array1<_> = self - .initial_theta() - .clone() - .map_or(Array1::from_elem(w_star.ncols(), F::cast(1e-2)), |v| { - Array::from_vec(v) - }); + let theta0_dim = self.theta_tuning().theta0().len(); + let theta0 = if theta0_dim == 1 { + Array1::from_elem(w_star.ncols(), self.theta_tuning().theta0()[0]) + } else if theta0_dim == w_star.ncols() { + Array::from_vec(self.theta_tuning().theta0().to_vec()) + } else { + panic!("Initial guess for theta should be either 1-dim or dim of xtrain (w_star.ncols()), got {}", theta0_dim) + }; // Initial guess for variance let y_std = ytrain.std_axis(Axis(0), F::one()); let sigma2_0 = y_std[0] * y_std[0]; - //let sigma2_0 = F::cast(1e-2); // Initial guess for noise, when noise variance constant, it is not part of optimization params let (is_noise_estimated, noise0) = match self.noise_variance() { @@ -418,7 +426,7 @@ impl, D: Data> None => Xoshiro256Plus::from_entropy(), }; let z = match self.inducings() { - Inducings::Randomized(n) => make_inducings(*n, &xtrain, &mut rng), + Inducings::Randomized(n) => make_inducings(*n, &xtrain.view(), &mut rng), Inducings::Located(z) => z.to_owned(), }; @@ -453,8 +461,8 @@ impl, D: Data> sigma2, noise, &w_star, - &xtrain, - &ytrain, + &xtrain.view(), + &ytrain.view(), &z, self.nugget(), ) { @@ -463,29 +471,27 @@ impl, D: Data> } }; - // Multistart: user theta0 + LHS samplings - let mut params = Array2::zeros((N_START + 1, params_0.len())); - params.row_mut(0).assign(¶ms_0.mapv(|v| F::log10(v))); - let mut xlimits: Array2 = Array2::zeros((params_0.len(), 2)); - for mut row in xlimits.rows_mut() { - row.assign(&arr1(&[F::cast(-6), F::cast(2)])); - } - // Use a seed here for reproducibility. Do we need to make it truly random - // Probably no, as it is just to get init values spread over - // [1e-6, 20] for multistart thanks to LHS method. - let seeds = Lhs::new(&xlimits) - .kind(egobox_doe::LhsKind::Maximin) - .with_rng(Xoshiro256Plus::seed_from_u64(42)) - .sample(N_START); - Zip::from(params.slice_mut(s![1.., ..]).rows_mut()) - .and(seeds.rows()) - .par_for_each(|mut theta, row| theta.assign(&row)); - - // bounds of theta, variance and optionally noise variance - let mut bounds = vec![(F::cast(1e-6).log10(), F::cast(1e2).log10()); params.ncols()]; + // // bounds of theta, variance and optionally noise variance + // let mut bounds = vec![(F::cast(1e-16).log10(), F::cast(1.).log10()); params.ncols()]; + // Initial guess for theta + let bounds_dim = self.theta_tuning().bounds().len(); + let bounds = if bounds_dim == 1 { + vec![self.theta_tuning().bounds()[0]; params_0.len()] + } else if theta0_dim == params_0.len() { + self.theta_tuning().bounds().to_vec() + } else { + panic!( + "Bounds for theta should be either 1-dim or dim of xtrain ({}), got {}", + w_star.ncols(), + theta0_dim + ) + }; + + let (params, mut bounds) = prepare_multistart(self.n_start(), ¶ms_0, &bounds); + // variance bounds bounds[params.ncols() - 1 - is_noise_estimated as usize] = - (F::cast(1e-6).log10(), (F::cast(9.) * sigma2_0).log10()); + (F::cast(1e-12).log10(), (F::cast(9.) * sigma2_0).log10()); // optionally adjust noise variance bounds if let VarianceEstimation::Estimated { initial_guess: _, @@ -497,12 +503,32 @@ impl, D: Data> *noise_bounds = (lo.log10(), up.log10()); } } - - let opt_params = - params.map_axis(Axis(1), |p| optimize_params(objfn, &p.to_owned(), &bounds)); - let opt_index = opt_params.map(|(_, opt_f)| opt_f).argmin().unwrap(); - let opt_params = &(opt_params[opt_index]).0.mapv(|v| F::cast(base.powf(v))); - // println!("opt_theta={}", opt_theta); + debug!( + "Optimize with multistart theta = {:?} and bounds = {:?}", + params, bounds + ); + let now = Instant::now(); + let opt_params = (0..params.nrows()) + .into_par_iter() + .map(|i| { + let opt_res = optimize_params( + objfn, + ¶ms.row(i).to_owned(), + &bounds, + CobylaParams { + maxeval: (10 * theta0_dim).max(CobylaParams::default().maxeval), + ..CobylaParams::default() + }, + ); + + opt_res + }) + .reduce( + || (Array::ones((params.ncols(),)), f64::INFINITY), + |a, b| if b.1 < a.1 { b } else { a }, + ); + debug!("elapsed optim = {:?}", now.elapsed().as_millis()); + let opt_params = opt_params.0.mapv(|v| F::cast(base.powf(v))); let opt_theta = opt_params .slice(s![..n - 1 - is_noise_estimated as usize]) .to_owned(); @@ -514,22 +540,23 @@ impl, D: Data> }; // Recompute reduced likelihood with optimized params - let (_, w_data) = self.reduced_likelihood( + let (lkh, w_data) = self.reduced_likelihood( &opt_theta, opt_sigma2, opt_noise, &w_star, - &xtrain, - &ytrain, + &xtrain.view(), + &ytrain.view(), &z, self.nugget(), )?; Ok(SparseGaussianProcess { corr: *self.corr(), - method: self.method().clone(), + method: self.method(), theta: opt_theta, sigma2: opt_sigma2, noise: opt_noise, + likelihood: lkh, w_data, w_star, xtrain: xtrain.to_owned(), @@ -549,8 +576,8 @@ impl> SgpValidParams { sigma2: F, noise: F, w_star: &Array2, - xtrain: &Array2, - ytrain: &Array2, + xtrain: &ArrayView2, + ytrain: &ArrayView2, z: &Array2, nugget: F, ) -> Result<(F, WoodburyData)> { @@ -590,8 +617,8 @@ impl> SgpValidParams { sigma2: F, noise: F, w_star: &Array2, - xtrain: &Array2, - ytrain: &Array2, + xtrain: &ArrayView2, + ytrain: &ArrayView2, z: &Array2, nugget: F, ) -> (F, WoodburyData) { @@ -664,8 +691,8 @@ impl> SgpValidParams { sigma2: F, noise: F, w_star: &Array2, - xtrain: &Array2, - ytrain: &Array2, + xtrain: &ArrayView2, + ytrain: &ArrayView2, z: &Array2, nugget: F, ) -> (F, WoodburyData) { @@ -710,7 +737,6 @@ impl> SgpValidParams { let term6 = -a.diag().sum(); let likelihood = -F::cast(0.5) * (term1 + term2 + term3 + term4 + term5 + term6); - println!("likelihood={}", likelihood); let li_ui = li.dot(&ui); let bi = Array::eye(nz) + li.t().dot(&li); @@ -725,7 +751,7 @@ impl> SgpValidParams { fn make_inducings( n_inducing: usize, - xt: &Array2, + xt: &ArrayView2, rng: &mut Xoshiro256Plus, ) -> Array2 { let mut indices = (0..xt.nrows()).collect::>(); @@ -797,39 +823,51 @@ mod tests { #[test] fn test_sgp_default() { - let mut rng = Xoshiro256Plus::seed_from_u64(0); + let mut rng = Xoshiro256Plus::seed_from_u64(42); // Generate training data let nt = 200; // Variance of the gaussian noise on our training data let eta2: f64 = 0.01; let (xt, yt) = make_test_data(nt, eta2, &mut rng); + // let test_dir = "target/tests"; + // let file_path = format!("{}/smt_xt.npy", test_dir); + // let xt: Array2 = read_npy(file_path).expect("xt read"); + // let file_path = format!("{}/smt_yt.npy", test_dir); + // let yt: Array2 = read_npy(file_path).expect("yt read"); - let xplot = Array::linspace(-0.5, 0.5, 100).insert_axis(Axis(1)); + let xplot = Array::linspace(-1.0, 1.0, 100).insert_axis(Axis(1)); let n_inducings = 30; + // let file_path = format!("{}/smt_z.npy", test_dir); + // let z: Array2 = read_npy(file_path).expect("z read"); + // println!("{:?}", z); + let sgp = SparseKriging::params(Inducings::Randomized(n_inducings)) + //let sgp = SparseKriging::params(Inducings::Located(z)) + //.noise_variance(VarianceEstimation::Constant(0.01)) .seed(Some(42)) - .initial_theta(Some(vec![0.1])) .fit(&Dataset::new(xt.clone(), yt.clone())) .expect("GP fitted"); + println!("theta={:?}", sgp.theta()); + println!("variance={:?}", sgp.variance()); println!("noise variance={:?}", sgp.noise_variance()); - assert_abs_diff_eq!(eta2, sgp.noise_variance()); + // assert_abs_diff_eq!(eta2, sgp.noise_variance()); let sgp_vals = sgp.predict_values(&xplot).unwrap(); let yplot = f_obj(&xplot); let errvals = (yplot - &sgp_vals).mapv(|v| v.abs()); - assert_abs_diff_eq!(errvals, Array2::zeros((xplot.nrows(), 1)), epsilon = 1.0); + assert_abs_diff_eq!(errvals, Array2::zeros((xplot.nrows(), 1)), epsilon = 0.5); let sgp_vars = sgp.predict_variances(&xplot).unwrap(); let errvars = (&sgp_vars - Array2::from_elem((xplot.nrows(), 1), 0.01)).mapv(|v| v.abs()); - assert_abs_diff_eq!(errvars, Array2::zeros((xplot.nrows(), 1)), epsilon = 0.05); + assert_abs_diff_eq!(errvars, Array2::zeros((xplot.nrows(), 1)), epsilon = 0.2); save_data(&xt, &yt, sgp.inducings(), &xplot, &sgp_vals, &sgp_vars); } #[test] fn test_sgp_vfe() { - let mut rng = Xoshiro256Plus::seed_from_u64(0); + let mut rng = Xoshiro256Plus::seed_from_u64(42); // Generate training data let nt = 200; // Variance of the gaussian noise on our training data @@ -844,7 +882,7 @@ mod tests { let xplot = Array::linspace(-1., 1., 100).insert_axis(Axis(1)); let n_inducings = 30; - let z = make_inducings(n_inducings, &xt, &mut rng); + let z = make_inducings(n_inducings, &xt.view(), &mut rng); // let file_path = format!("{}/smt_z.npy", test_dir); // let z: Array2 = read_npy(file_path).expect("z read"); @@ -853,7 +891,7 @@ mod tests { Inducings::Located(z), ) .sparse_method(SparseMethod::Vfe) - .initial_theta(Some(vec![0.01])) + .noise_variance(VarianceEstimation::Constant(0.01)) .fit(&Dataset::new(xt.clone(), yt.clone())) .expect("GP fitted"); @@ -885,7 +923,7 @@ mod tests { let xplot = Array::linspace(-1., 1., 100).insert_axis(Axis(1)); let n_inducings = 30; - let z = make_inducings(n_inducings, &xt, &mut rng); + let z = make_inducings(n_inducings, &xt.view(), &mut rng); // let file_path = format!("{}/smt_z.npy", test_dir); // let z: Array2 = read_npy(file_path).expect("z read"); @@ -895,7 +933,7 @@ mod tests { ) .sparse_method(SparseMethod::Vfe) //.sparse_method(SparseMethod::Fitc) - .initial_theta(Some(vec![0.1])) + .theta_init(vec![0.1]) .noise_variance(VarianceEstimation::Estimated { initial_guess: 0.02, bounds: (1e-3, 1.), @@ -906,7 +944,7 @@ mod tests { println!("theta={:?}", sgp.theta()); println!("variance={:?}", sgp.variance()); println!("noise variance={:?}", sgp.noise_variance()); - assert_abs_diff_eq!(eta2, sgp.noise_variance(), epsilon = 0.005); + assert_abs_diff_eq!(eta2, sgp.noise_variance(), epsilon = 0.015); assert_abs_diff_eq!(&z, sgp.inducings(), epsilon = 0.0015); let sgp_vals = sgp.predict_values(&xplot).unwrap(); diff --git a/gp/src/sgp_parameters.rs b/gp/src/sparse_parameters.rs similarity index 73% rename from gp/src/sgp_parameters.rs rename to gp/src/sparse_parameters.rs index 1a7d80af..c58b5c9f 100644 --- a/gp/src/sgp_parameters.rs +++ b/gp/src/sparse_parameters.rs @@ -2,6 +2,7 @@ use crate::correlation_models::{CorrelationModel, SquaredExponentialCorr}; use crate::errors::{GpError, Result}; use crate::mean_models::ConstantMean; use crate::parameters::GpValidParams; +use crate::{ParamTuning, ThetaTuning}; use linfa::{Float, ParamGuard}; use ndarray::Array2; #[cfg(feature = "serializable")] @@ -17,7 +18,10 @@ pub enum VarianceEstimation { } impl Default for VarianceEstimation { fn default() -> VarianceEstimation { - Self::Constant(F::cast(0.01)) + Self::Estimated { + initial_guess: F::cast(1e-2), + bounds: (F::cast(100.0) * F::epsilon(), F::cast(1e10)), + } } } @@ -38,7 +42,7 @@ impl Default for Inducings { } /// SGP algorithm method specification -#[derive(Clone, Debug, PartialEq, Eq, Default)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)] #[cfg_attr(feature = "serializable", derive(Serialize, Deserialize))] pub enum SparseMethod { #[default] @@ -76,29 +80,34 @@ impl Default for SgpValidParams { } impl> SgpValidParams { - /// Get starting theta value for optimization - pub fn initial_theta(&self) -> &Option> { - &self.gp_params.theta - } - /// Get correlation corr k(x, x') pub fn corr(&self) -> &Corr { &self.gp_params.corr } - /// Get number of components used by PLS + /// Get the number of components used by PLS pub fn kpls_dim(&self) -> &Option { &self.gp_params.kpls_dim } + /// Get starting theta value for optimization + pub fn theta_tuning(&self) -> &ThetaTuning { + &self.gp_params.theta_tuning + } + + /// Get the number of internal GP hyperparameters optimization restart + pub fn n_start(&self) -> usize { + self.gp_params.n_start + } + /// Get number of components used by PLS pub fn nugget(&self) -> F { self.gp_params.nugget } /// Get used sparse method - pub fn method(&self) -> &SparseMethod { - &self.method + pub fn method(&self) -> SparseMethod { + self.method } /// Get inducing points @@ -127,10 +136,11 @@ impl> SgpParams { pub fn new(corr: Corr, inducings: Inducings) -> SgpParams { Self(SgpValidParams { gp_params: GpValidParams { - theta: None, mean: ConstantMean::default(), corr, + theta_tuning: ThetaTuning::default(), kpls_dim: None, + n_start: 10, nugget: F::cast(1000.0) * F::epsilon(), }, noise: VarianceEstimation::default(), @@ -140,17 +150,39 @@ impl> SgpParams { }) } + /// Set correlation model. + pub fn corr(mut self, corr: Corr) -> Self { + self.0.gp_params.corr = corr; + self + } + /// Set initial value for theta hyper parameter. /// - /// During training process, the internal optimization is started from `initial_theta`. - pub fn initial_theta(mut self, theta: Option>) -> Self { - self.0.gp_params.theta = theta; + /// During training process, the internal optimization is started from `theta_init`. + pub fn theta_init(mut self, theta_init: Vec) -> Self { + self.0.gp_params.theta_tuning = ParamTuning { + init: theta_init, + ..(self.0.gp_params.theta_tuning().clone()).into() + } + .try_into() + .unwrap(); self } - /// Set correlation model. - pub fn corr(mut self, corr: Corr) -> Self { - self.0.gp_params.corr = corr; + /// Set theta hyper parameter search space. + pub fn theta_bounds(mut self, theta_bounds: Vec<(F, F)>) -> Self { + self.0.gp_params.theta_tuning = ParamTuning { + bounds: theta_bounds, + ..(self.0.gp_params.theta_tuning()).clone().into() + } + .try_into() + .unwrap(); + self + } + + /// Get starting theta value for optimization + pub fn theta_tuning(mut self, theta_tuning: ThetaTuning) -> Self { + self.0.gp_params.theta_tuning = theta_tuning; self } @@ -162,6 +194,12 @@ impl> SgpParams { self } + /// Set the number of internal hyperparameters optimization restarts + pub fn n_start(mut self, n_start: usize) -> Self { + self.0.gp_params.n_start = n_start; + self + } + /// Set nugget value. /// /// Nugget is used to improve numerical stability @@ -208,18 +246,19 @@ impl> ParamGuard for SgpParams { fn check_ref(&self) -> Result<&Self::Checked> { if let Some(d) = self.0.gp_params.kpls_dim { if d == 0 { - return Err(GpError::InvalidValue("`kpls_dim` canot be 0!".to_string())); + return Err(GpError::InvalidValueError( + "`kpls_dim` canot be 0!".to_string(), + )); } - if let Some(theta) = self.0.initial_theta() { - if theta.len() > 1 && d > theta.len() { - return Err(GpError::InvalidValue(format!( - "Dimension reduction ({}) should be smaller than expected + let theta = self.0.theta_tuning().theta0(); + if theta.len() > 1 && d > theta.len() { + return Err(GpError::InvalidValueError(format!( + "Dimension reduction ({}) should be smaller than expected training input size infered from given initial theta length ({})", - d, - theta.len() - ))); - }; - } + d, + theta.len() + ))); + }; } Ok(&self.0) } diff --git a/moe/src/gp_algorithm.rs b/moe/src/gp_algorithm.rs index 6376ebb5..d1dce6ee 100644 --- a/moe/src/gp_algorithm.rs +++ b/moe/src/gp_algorithm.rs @@ -269,7 +269,9 @@ impl GpMixValidParams { _ => return Err(MoeError::ExpertError(format!("Unknown expert {}", best.0))), }; let mut expert_params = best_expert_params?; + expert_params.theta_tuning(self.theta_tuning().clone()); expert_params.kpls_dim(self.kpls_dim()); + expert_params.n_start(self.n_start()); let expert = expert_params.train(&xtrain.view(), &ytrain.view()); if let Some(v) = best.1 { info!("Best expert {} accuracy={}", best.0, v); @@ -472,6 +474,11 @@ impl GpMixture { self.recombination } + /// Selected experts in the mixture + pub fn experts(&self) -> &[Box] { + &self.experts + } + /// Gaussian mixture pub fn gmx(&self) -> &GaussianMixture { &self.gmx @@ -1200,7 +1207,9 @@ mod tests { #[test] fn test_moe_display() { let rng = Xoshiro256Plus::seed_from_u64(0); - let xt = Lhs::new(&array![[0., 1.]]).sample(100); + let xt = Lhs::new(&array![[0., 1.]]) + .with_rng(rng.clone()) + .sample(100); let yt = f_test_1d(&xt); let moe = GpMixture::params() @@ -1211,6 +1220,8 @@ mod tests { .with_rng(rng) .fit(&Dataset::new(xt, yt)) .expect("MOE fitted"); - assert_eq!("Mixture[Hard](Constant_SquaredExponential, Constant_SquaredExponential, Constant_SquaredExponential)", moe.to_string()); + // Values may vary depending on the platforms and linalg backends + // assert_eq!("Mixture[Hard](Constant_SquaredExponentialGP(mean=ConstantMean, corr=SquaredExponential, theta=[0.03871601282054056], variance=[0.276011431746834], likelihood=454.17113736397033), Constant_SquaredExponentialGP(mean=ConstantMean, corr=SquaredExponential, theta=[0.07903503494417609], variance=[0.0077182164672893756], likelihood=436.39615700140183), Constant_SquaredExponentialGP(mean=ConstantMean, corr=SquaredExponential, theta=[0.050821466014058826], variance=[0.32824998062969973], likelihood=193.19339252734846))", moe.to_string()); + println!("Display moe: {}", moe); } } diff --git a/moe/src/gp_parameters.rs b/moe/src/gp_parameters.rs index fd966b61..cfa63d5d 100644 --- a/moe/src/gp_parameters.rs +++ b/moe/src/gp_parameters.rs @@ -8,6 +8,7 @@ use egobox_gp::correlation_models::{ }; #[allow(unused_imports)] use egobox_gp::mean_models::{ConstantMean, LinearMean, QuadraticMean}; +use egobox_gp::{ParamTuning, ThetaTuning}; use linfa::{Float, ParamGuard}; use linfa_clustering::GaussianMixtureModel; use ndarray::{Array1, Array2, Array3}; @@ -29,9 +30,13 @@ pub struct GpMixValidParams { regression_spec: RegressionSpec, /// Specification of GP correlation models to be used correlation_spec: CorrelationSpec, + /// Theta hyperparameter tuning + theta_tuning: ThetaTuning, /// Number of PLS components, should be used when problem size /// is over ten variables or so. kpls_dim: Option, + /// Number of GP hyperparameters optimization restarts + n_start: usize, /// Gaussian Mixture model used to cluster gmm: Option>>, /// GaussianMixture preset @@ -47,7 +52,9 @@ impl Default for GpMixValidParams recombination: Recombination::Smooth(Some(F::one())), regression_spec: RegressionSpec::ALL, correlation_spec: CorrelationSpec::ALL, + theta_tuning: ThetaTuning::default(), kpls_dim: None, + n_start: 10, gmm: None, gmx: None, rng: R::from_entropy(), @@ -81,6 +88,16 @@ impl GpMixValidParams { self.kpls_dim } + /// The speified tuning of theta hyperparameter + pub fn theta_tuning(&self) -> &ThetaTuning { + &self.theta_tuning + } + + /// The number of hypermarameters optimization restarts + pub fn n_start(&self) -> usize { + self.n_start + } + /// An optional gaussian mixture to be fitted to generate multivariate normal /// in turns used to cluster pub fn gmm(&self) -> &Option>> { @@ -134,7 +151,9 @@ impl GpMixParams { recombination: Recombination::Smooth(Some(F::one())), regression_spec: RegressionSpec::ALL, correlation_spec: CorrelationSpec::ALL, + theta_tuning: ThetaTuning::default(), kpls_dim: None, + n_start: 10, gmm: None, gmx: None, rng, @@ -171,6 +190,36 @@ impl GpMixParams { self } + /// Set initial value for theta hyper parameter. + /// + /// During training process, the internal optimization is started from `theta_init`. + pub fn theta_init(mut self, theta_init: Vec) -> Self { + self.0.theta_tuning = ParamTuning { + init: theta_init, + ..self.0.theta_tuning.into() + } + .try_into() + .unwrap(); + self + } + + /// Set theta hyper parameter search space. + pub fn theta_bounds(mut self, theta_bounds: Vec<(F, F)>) -> Self { + self.0.theta_tuning = ParamTuning { + bounds: theta_bounds, + ..self.0.theta_tuning.into() + } + .try_into() + .unwrap(); + self + } + + /// Set theta hyper parameter tuning + pub fn theta_tuning(mut self, theta_tuning: ThetaTuning) -> Self { + self.0.theta_tuning = theta_tuning; + self + } + /// Sets the number of PLS components in [1, nx] where nx is the x dimension /// /// None means no PLS dimension reduction applied. @@ -179,6 +228,12 @@ impl GpMixParams { self } + /// Sets the number of hyperparameters optimization restarts + pub fn n_start(mut self, n_start: usize) -> Self { + self.0.n_start = n_start; + self + } + #[doc(hidden)] /// Sets the gaussian mixture (used to find the optimal number of clusters) pub(crate) fn gmm(mut self, gmm: Option>>) -> Self { @@ -205,6 +260,8 @@ impl GpMixParams { regression_spec: self.0.regression_spec(), correlation_spec: self.0.correlation_spec(), kpls_dim: self.0.kpls_dim(), + theta_tuning: self.0.theta_tuning().clone(), + n_start: self.0.n_start(), gmm: self.0.gmm().clone(), gmx: self.0.gmx().clone(), rng, diff --git a/moe/src/sgp_algorithm.rs b/moe/src/sgp_algorithm.rs index 6ae22b9d..49936385 100644 --- a/moe/src/sgp_algorithm.rs +++ b/moe/src/sgp_algorithm.rs @@ -112,7 +112,7 @@ impl SparseGpMixtureValidParams { let gmx = if self.gmx().is_some() { *self.gmx().as_ref().unwrap().clone() } else { - trace!("GMM training..."); + debug!("GMM training..."); let gmm = GaussianMixtureModel::params(n_clusters) .n_runs(20) .with_rng(self.rng()) @@ -130,7 +130,7 @@ impl SparseGpMixtureValidParams { GaussianMixture::new(weights, means, covariances)?.heaviside_factor(factor) }; - trace!("Train on clusters..."); + debug!("Train on clusters..."); let clustering = Clustering::new(gmx, recomb); self.train_on_clusters(&xt.view(), &yt.view(), &clustering) } @@ -143,13 +143,14 @@ impl SparseGpMixtureValidParams { yt: &ArrayBase, Ix2>, clustering: &Clustering, ) -> Result { + debug!("Clustering prediction"); let gmx = clustering.gmx(); let recomb = clustering.recombination(); let nx = xt.ncols(); let data = concatenate(Axis(1), &[xt.view(), yt.view()]).unwrap(); - let dataset_clustering = gmx.predict(xt); let clusters = sort_by_cluster(gmx.n_clusters(), &data, &dataset_clustering); + debug!("... end Clustering"); check_number_of_points(&clusters, xt.ncols())?; @@ -183,6 +184,7 @@ impl SparseGpMixtureValidParams { // previously trained on data excluding test data (see train method) Ok(sgp) } else { + info!("SparseGpMixture trained"); Ok(SparseGpMixture { recombination: recomb, experts, @@ -224,7 +226,7 @@ impl SparseGpMixtureValidParams { check_allowed!(correlation_spec, Correlation, Matern32, allowed_corrs); check_allowed!(correlation_spec, Correlation, Matern52, allowed_corrs); - debug!("Find best expert"); + debug!("Find best expert..."); let best = if allowed_means.len() == 1 && allowed_corrs.len() == 1 { (format!("{}_{}", allowed_means[0], allowed_corrs[0]), None) // shortcut } else { @@ -240,7 +242,7 @@ impl SparseGpMixtureValidParams { .unwrap(); (map_error[argmin].0.clone(), Some(map_error[argmin].1)) }; - debug!("after Find best expert"); + debug!("...after Find best expert"); let inducings = self.inducings().clone(); let best_expert_params: std::result::Result, MoeError> = match best.0.as_str() { @@ -256,9 +258,15 @@ impl SparseGpMixtureValidParams { }; let mut expert_params = best_expert_params?; let seed = self.rng().gen(); + expert_params.theta_tuning(self.theta_tuning().clone()); + debug!("Theta tuning = {:?}", self.theta_tuning()); expert_params.kpls_dim(self.kpls_dim()); + expert_params.n_start(self.n_start()); + expert_params.sparse_method(self.sparse_method()); expert_params.seed(seed); + debug!("Train best expert..."); let expert = expert_params.train(&xtrain.view(), &ytrain.view()); + debug!("...after best expert training"); if let Some(v) = best.1 { info!("Best expert {} accuracy={}", best.0, v); } @@ -433,20 +441,11 @@ impl SparseGpMixture { self.recombination } + /// Selected experts in the mixture pub fn experts(&self) -> &[Box] { &self.experts } - /// Clustering Recombination - pub fn noise_variance(&self) -> Vec { - self.experts.iter().map(|e| e.noise_variance()).collect() - } - - /// Clustering Recombination - pub fn variance(&self) -> Vec { - self.experts.iter().map(|e| e.variance()).collect() - } - /// Gaussian mixture pub fn gmx(&self) -> &GaussianMixture { &self.gmx diff --git a/moe/src/sgp_parameters.rs b/moe/src/sgp_parameters.rs index 9490da6b..ea4c7c59 100644 --- a/moe/src/sgp_parameters.rs +++ b/moe/src/sgp_parameters.rs @@ -8,7 +8,7 @@ use egobox_gp::correlation_models::{ }; #[allow(unused_imports)] use egobox_gp::mean_models::{ConstantMean, LinearMean, QuadraticMean}; -use egobox_gp::Inducings; +use egobox_gp::{Inducings, ParamTuning, SparseMethod, ThetaTuning}; use linfa::{Float, ParamGuard}; use linfa_clustering::GaussianMixtureModel; use ndarray::{Array1, Array2, Array3}; @@ -33,6 +33,12 @@ pub struct SparseGpMixtureValidParams { /// Number of PLS components, should be used when problem size /// is over ten variables or so. kpls_dim: Option, + /// Theta hyperparameter tuning + theta_tuning: ThetaTuning, + /// Number of GP hyperparameters optimization restarts + n_start: usize, + /// Used sparse method + sparse_method: SparseMethod, /// Inducings inducings: Inducings, /// Gaussian Mixture model used to cluster @@ -51,6 +57,9 @@ impl Default for SparseGpMixtureValidPar regression_spec: RegressionSpec::CONSTANT, correlation_spec: CorrelationSpec::SQUAREDEXPONENTIAL, kpls_dim: None, + theta_tuning: ThetaTuning::default(), + n_start: 10, + sparse_method: SparseMethod::default(), inducings: Inducings::default(), gmm: None, gmx: None, @@ -85,6 +94,21 @@ impl SparseGpMixtureValidParams { self.kpls_dim } + /// The speified tuning of theta hyperparameter + pub fn theta_tuning(&self) -> &ThetaTuning { + &self.theta_tuning + } + + /// The number of hypermarameters optimization restarts + pub fn n_start(&self) -> usize { + self.n_start + } + + /// The sparse method used + pub fn sparse_method(&self) -> SparseMethod { + self.sparse_method + } + /// Inducings points specification pub fn inducings(&self) -> &Inducings { &self.inducings @@ -132,7 +156,7 @@ impl SparseGpMixtureParams { } } -impl SparseGpMixtureParams { +impl SparseGpMixtureParams { /// Constructor of Sgp parameters specifying randon number generator for reproducibility /// /// See [`new`](SparseGpMixParams::new) for default parameters. @@ -142,7 +166,10 @@ impl SparseGpMixtureParams { recombination: Recombination::Smooth(Some(F::one())), regression_spec: RegressionSpec::CONSTANT, correlation_spec: CorrelationSpec::SQUAREDEXPONENTIAL, + theta_tuning: ThetaTuning::default(), kpls_dim: None, + n_start: 10, + sparse_method: SparseMethod::default(), inducings, gmm: None, gmx: None, @@ -171,6 +198,36 @@ impl SparseGpMixtureParams { self } + /// Set initial value for theta hyper parameter. + /// + /// During training process, the internal optimization is started from `theta_init`. + pub fn theta_init(mut self, theta_init: Vec) -> Self { + self.0.theta_tuning = ParamTuning { + init: theta_init, + ..self.0.theta_tuning.into() + } + .try_into() + .unwrap(); + self + } + + /// Set theta hyper parameter search space. + pub fn theta_bounds(mut self, theta_bounds: Vec<(F, F)>) -> Self { + self.0.theta_tuning = ParamTuning { + bounds: theta_bounds, + ..self.0.theta_tuning.into() + } + .try_into() + .unwrap(); + self + } + + /// Set theta hyper parameter tuning + pub fn theta_tuning(mut self, theta_tuning: ThetaTuning) -> Self { + self.0.theta_tuning = theta_tuning; + self + } + /// Sets the number of PLS components in [1, nx] where nx is the x dimension /// /// None means no PLS dimension reduction applied. @@ -179,6 +236,20 @@ impl SparseGpMixtureParams { self } + /// Sets the number of hyperparameters optimization restarts + pub fn n_start(mut self, n_start: usize) -> Self { + self.0.n_start = n_start; + self + } + + /// Sets + /// + /// None means no PLS dimension reduction applied. + pub fn sparse_method(mut self, sparse_method: SparseMethod) -> Self { + self.0.sparse_method = sparse_method; + self + } + /// Sets the number of PLS components in [1, nx] where nx is the x dimension /// /// None means no PLS dimension reduction applied. @@ -213,6 +284,9 @@ impl SparseGpMixtureParams { regression_spec: self.0.regression_spec(), correlation_spec: self.0.correlation_spec(), kpls_dim: self.0.kpls_dim(), + theta_tuning: self.0.theta_tuning().clone(), + n_start: self.0.n_start(), + sparse_method: self.0.sparse_method(), inducings: self.0.inducings().clone(), gmm: self.0.gmm().clone(), gmx: self.0.gmx().clone(), diff --git a/moe/src/surrogates.rs b/moe/src/surrogates.rs index d8699fc5..53537a9d 100644 --- a/moe/src/surrogates.rs +++ b/moe/src/surrogates.rs @@ -1,7 +1,7 @@ use crate::errors::Result; use egobox_gp::{ correlation_models::*, mean_models::*, GaussianProcess, GpParams, SgpParams, - SparseGaussianProcess, + SparseGaussianProcess, SparseMethod, ThetaTuning, }; use linfa::prelude::{Dataset, Fit}; use ndarray::{Array1, Array2, ArrayView2}; @@ -16,24 +16,30 @@ use crate::MoeError; use std::fs; #[cfg(feature = "persistent")] use std::io::Write; -/// A trait for Gp surrogate parameters to build surrogate once fitted. +/// A trait for Gp surrogate parameters to build surrogate. pub trait GpSurrogateParams { - /// Set initial theta - fn initial_theta(&mut self, theta: Vec); + /// Set theta + fn theta_tuning(&mut self, theta_tuning: ThetaTuning); /// Set the number of PLS components fn kpls_dim(&mut self, kpls_dim: Option); + /// Set the nuber of internal optimization restarts + fn n_start(&mut self, n_start: usize); /// Set the nugget parameter to improve numerical stability fn nugget(&mut self, nugget: f64); /// Train the surrogate fn train(&self, x: &ArrayView2, y: &ArrayView2) -> Result>; } -/// A trait for sparse GP surrogate parameters to build surrogate once fitted. +/// A trait for sparse GP surrogate parameters to build surrogate. pub trait SgpSurrogateParams { - /// Set initial theta - fn initial_theta(&mut self, theta: Vec); + /// Set theta + fn theta_tuning(&mut self, theta_tuning: ThetaTuning); /// Set the number of PLS components fn kpls_dim(&mut self, kpls_dim: Option); + /// Set the nuber of internal optimization restarts + fn n_start(&mut self, n_start: usize); + /// Set the sparse method + fn sparse_method(&mut self, method: SparseMethod); /// Set random generator seed fn seed(&mut self, seed: Option); /// Train the surrogate @@ -96,14 +102,18 @@ macro_rules! declare_surrogate { } impl GpSurrogateParams for [] { - fn initial_theta(&mut self, theta: Vec) { - self.0 = self.0.clone().initial_theta(Some(theta)); + fn theta_tuning(&mut self, theta_tuning: ThetaTuning) { + self.0 = self.0.clone().theta_tuning(theta_tuning); } fn kpls_dim(&mut self, kpls_dim: Option) { self.0 = self.0.clone().kpls_dim(kpls_dim); } + fn n_start(&mut self, n_start: usize) { + self.0 = self.0.clone().n_start(n_start); + } + fn nugget(&mut self, nugget: f64) { self.0 = self.0.clone().nugget(nugget); } @@ -163,11 +173,12 @@ macro_rules! declare_surrogate { impl std::fmt::Display for [] { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}_{}{}", stringify!($regr), stringify!($corr), + write!(f, "{}_{}{}{}", stringify!($regr), stringify!($corr), match self.0.kpls_dim() { None => String::from(""), Some(dim) => format!("_PLS({})", dim), - } + }, + self.0.to_string() ) } } @@ -210,14 +221,22 @@ macro_rules! declare_sgp_surrogate { } impl SgpSurrogateParams for [] { - fn initial_theta(&mut self, theta: Vec) { - self.0 = self.0.clone().initial_theta(Some(theta)); + fn theta_tuning(&mut self, theta_tuning: ThetaTuning) { + self.0 = self.0.clone().theta_tuning(theta_tuning); } fn kpls_dim(&mut self, kpls_dim: Option) { self.0 = self.0.clone().kpls_dim(kpls_dim); } + fn n_start(&mut self, n_start: usize) { + self.0 = self.0.clone().n_start(n_start); + } + + fn sparse_method(&mut self, method: SparseMethod) { + self.0 = self.0.clone().sparse_method(method); + } + fn seed(&mut self, seed: Option) { self.0 = self.0.clone().seed(seed); } @@ -279,11 +298,12 @@ macro_rules! declare_sgp_surrogate { impl std::fmt::Display for [] { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}_{}{}", stringify!($regr), stringify!($corr), + write!(f, "{}{}{}", stringify!($corr), match self.0.kpls_dim() { None => String::from(""), Some(dim) => format!("_PLS({})", dim), - } + }, + self.0.to_string() ) } } diff --git a/python/egobox/tests/test_sgpmix.py b/python/egobox/tests/test_sgpmix.py index 77fb526d..4b202111 100644 --- a/python/egobox/tests/test_sgpmix.py +++ b/python/egobox/tests/test_sgpmix.py @@ -4,7 +4,7 @@ import logging import time -logging.basicConfig(level=logging.INFO) +logging.basicConfig(level=logging.DEBUG) def f_obj(x): @@ -39,6 +39,27 @@ def test_sgp(self): print(elapsed) sgp.save("sgp.json") + def test_sgp_random(self): + # random generator for reproducibility + rng = np.random.RandomState(0) + + # Generate training data + nt = 200 + # Variance of the gaussian noise on our trainingg data + eta2 = [0.01] + gaussian_noise = rng.normal(loc=0.0, scale=np.sqrt(eta2), size=(nt, 1)) + xt = 2 * rng.rand(nt, 1) - 1 + yt = f_obj(xt) + gaussian_noise + + # Pick inducing points randomly in training data + n_inducing = 30 + + start = time.time() + sgp = egx.SparseGpMix(nz=n_inducing, seed=0).fit(xt, yt) + elapsed = time.time() - start + print(elapsed) + print(sgp) + if __name__ == "__main__": unittest.main() diff --git a/src/gp_mix.rs b/src/gp_mix.rs index 4afb04e8..4c39f8a1 100644 --- a/src/gp_mix.rs +++ b/src/gp_mix.rs @@ -10,6 +10,7 @@ //! See the [tutorial notebook](https://github.com/relf/egobox/doc/Gpx_Tutorial.ipynb) for usage. //! use crate::types::*; +use egobox_gp::{ParamTuning, ThetaTuning}; #[allow(unused_imports)] // Avoid linting problem use egobox_moe::{FullGpSurrogate, GpMixture, GpSurrogate}; use linfa::{traits::Fit, Dataset}; @@ -45,10 +46,21 @@ use rand_xoshiro::Xoshiro256Plus; /// * Hard: prediction is taken from the expert with highest responsability /// resulting in a model with discontinuities. /// +/// theta_init ([nx] where nx is the dimension of inputs x) +/// Initial guess for GP theta hyperparameters. +/// When None the default is 1e-2 for all components +/// +/// theta_bounds ([[lower_1, upper_1], ..., [lower_nx, upper_nx]] where nx is the dimension of inputs x) +/// Space search when optimizing theta GP hyperparameters +/// When None the default is [1e-6, 1e2] for all components +/// /// kpls_dim (0 < int < nx where nx is the dimension of inputs x) /// Number of components to be used when PLS projection is used (a.k.a KPLS method). /// This is used to address high-dimensional problems typically when nx > 9. /// +/// n_start (int >= 0) +/// Number of internal GP hyperpameters optimization restart (multistart) +/// /// seed (int >= 0) /// Random generator seed to allow computation reproducibility. /// @@ -58,7 +70,10 @@ pub(crate) struct GpMix { pub regression_spec: RegressionSpec, pub correlation_spec: CorrelationSpec, pub recombination: Recombination, + pub theta_init: Option>, + pub theta_bounds: Option>>, pub kpls_dim: Option, + pub n_start: usize, pub seed: Option, } @@ -70,7 +85,10 @@ impl GpMix { regr_spec = RegressionSpec::CONSTANT, corr_spec = CorrelationSpec::SQUARED_EXPONENTIAL, recombination = Recombination::Smooth, + theta_init = None, + theta_bounds = None, kpls_dim = None, + n_start = 10, seed = None ))] #[allow(clippy::too_many_arguments)] @@ -79,7 +97,10 @@ impl GpMix { regr_spec: u8, corr_spec: u8, recombination: Recombination, + theta_init: Option>, + theta_bounds: Option>>, kpls_dim: Option, + n_start: usize, seed: Option, ) -> Self { GpMix { @@ -87,7 +108,10 @@ impl GpMix { regression_spec: RegressionSpec(regr_spec), correlation_spec: CorrelationSpec(corr_spec), recombination, + theta_init, + theta_bounds, kpls_dim, + n_start, seed, } } @@ -101,7 +125,7 @@ impl GpMix { /// Returns Gpx object /// the fitted Gaussian process mixture /// - fn fit(&mut self, xt: PyReadonlyArray2, yt: PyReadonlyArray2) -> Gpx { + fn fit(&mut self, py: Python, xt: PyReadonlyArray2, yt: PyReadonlyArray2) -> Gpx { let dataset = Dataset::new(xt.as_array().to_owned(), yt.as_array().to_owned()); let recomb = match self.recombination { @@ -113,17 +137,46 @@ impl GpMix { } else { Xoshiro256Plus::from_entropy() }; - let moe = GpMixture::params() - .n_clusters(self.n_clusters) - .recombination(recomb) - .regression_spec(egobox_moe::RegressionSpec::from_bits(self.regression_spec.0).unwrap()) - .correlation_spec( - egobox_moe::CorrelationSpec::from_bits(self.correlation_spec.0).unwrap(), - ) - .kpls_dim(self.kpls_dim) - .with_rng(rng) - .fit(&dataset) - .expect("MoE model training"); + + let mut theta_tuning = ThetaTuning::default(); + if let Some(init) = self.theta_init.as_ref() { + theta_tuning = ParamTuning { + init: init.to_vec(), + ..theta_tuning.into() + } + .try_into() + .expect("Theta tuning initial init"); + } + if let Some(bounds) = self.theta_bounds.as_ref() { + theta_tuning = ParamTuning { + bounds: bounds.iter().map(|v| (v[0], v[1])).collect(), + ..theta_tuning.into() + } + .try_into() + .expect("Theta tuning bounds"); + } + + if let Err(ctrlc::Error::MultipleHandlers) = ctrlc::set_handler(|| std::process::exit(2)) { + // ignore multiple handlers error + }; + let moe = py.allow_threads(|| { + GpMixture::params() + .n_clusters(self.n_clusters) + .recombination(recomb) + .regression_spec( + egobox_moe::RegressionSpec::from_bits(self.regression_spec.0).unwrap(), + ) + .correlation_spec( + egobox_moe::CorrelationSpec::from_bits(self.correlation_spec.0).unwrap(), + ) + .theta_tuning(theta_tuning) + .kpls_dim(self.kpls_dim) + .n_start(self.n_start) + .with_rng(rng) + .fit(&dataset) + .expect("MoE model training") + }); + Gpx(Box::new(moe)) } } @@ -143,15 +196,22 @@ impl Gpx { regr_spec = RegressionSpec::CONSTANT, corr_spec = CorrelationSpec::SQUARED_EXPONENTIAL, recombination = Recombination::Smooth, + theta_init = None, + theta_bounds = None, kpls_dim = None, + n_start = 10, seed = None ))] + #[allow(clippy::too_many_arguments)] fn builder( n_clusters: usize, regr_spec: u8, corr_spec: u8, recombination: Recombination, + theta_init: Option>, + theta_bounds: Option>>, kpls_dim: Option, + n_start: usize, seed: Option, ) -> GpMix { GpMix::new( @@ -159,7 +219,10 @@ impl Gpx { regr_spec, corr_spec, recombination, + theta_init, + theta_bounds, kpls_dim, + n_start, seed, ) } diff --git a/src/lib.rs b/src/lib.rs index 270ca034..524284d5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,6 +12,7 @@ use sampling::*; use sparse_gp_mix::*; use types::*; +use env_logger::{Builder, Env}; use pyo3::prelude::*; #[doc(hidden)] @@ -19,6 +20,11 @@ use pyo3::prelude::*; fn egobox(_py: Python, m: &PyModule) -> PyResult<()> { pyo3_log::init(); + let env = Env::new().filter_or("EGOBOX_LOG", "info"); + let mut builder = Builder::from_env(env); + let builder = builder.target(env_logger::Target::Stdout); + builder.try_init().ok(); + // utils m.add_function(wrap_pyfunction!(to_specs, m)?)?; m.add_function(wrap_pyfunction!(lhs, m)?)?; @@ -42,6 +48,7 @@ fn egobox(_py: Python, m: &PyModule) -> PyResult<()> { m.add_class::()?; m.add_class::()?; m.add_class::()?; + m.add_class::()?; // Optimizer m.add_class::()?; diff --git a/src/sparse_gp_mix.rs b/src/sparse_gp_mix.rs index 96c78aba..c7d2b13e 100644 --- a/src/sparse_gp_mix.rs +++ b/src/sparse_gp_mix.rs @@ -10,7 +10,7 @@ //! See the [tutorial notebook](https://github.com/relf/egobox/doc/Sgp_Tutorial.ipynb) for usage. //! use crate::types::*; -use egobox_gp::Inducings; +use egobox_gp::{Inducings, ParamTuning, ThetaTuning}; use egobox_moe::{GpSurrogate, SparseGpMixture}; use linfa::{traits::Fit, Dataset}; use ndarray::Array2; @@ -19,7 +19,7 @@ use numpy::{IntoPyArray, PyArray2, PyReadonlyArray2}; use pyo3::prelude::*; use rand_xoshiro::Xoshiro256Plus; -/// Gaussian processes mixture builder +/// Sparse Gaussian processes mixture builder /// /// n_clusters (int >= 0) /// Number of clusters used by the mixture of surrogate experts. @@ -27,11 +27,6 @@ use rand_xoshiro::Xoshiro256Plus; /// 10-points addition (should say 'tentative addition' because addition may fail for some points /// but failures are counted anyway). /// -/// regr_spec (RegressionSpec flags, an int in [1, 7]): -/// Specification of regression models used in mixture. -/// Can be RegressionSpec.CONSTANT (1), RegressionSpec.LINEAR (2), RegressionSpec.QUADRATIC (4) or -/// any bit-wise union of these values (e.g. RegressionSpec.CONSTANT | RegressionSpec.LINEAR) -/// /// corr_spec (CorrelationSpec flags, an int in [1, 15]): /// Specification of correlation models used in mixture. /// Can be CorrelationSpec.SQUARED_EXPONENTIAL (1), CorrelationSpec.ABSOLUTE_EXPONENTIAL (2), @@ -50,15 +45,25 @@ use rand_xoshiro::Xoshiro256Plus; /// Number of components to be used when PLS projection is used (a.k.a KPLS method). /// This is used to address high-dimensional problems typically when nx > 9. /// +/// n_start (int >= 0) +/// Number of internal GP hyperpameters optimization restart (multistart) +/// +/// method (SparseMethod.FITC or SparseMethod.VFE) +/// Sparse method to be used (default is FITC) +/// /// seed (int >= 0) /// Random generator seed to allow computation reproducibility. /// #[pyclass] pub(crate) struct SparseGpMix { pub correlation_spec: CorrelationSpec, + pub theta_init: Option>, + pub theta_bounds: Option>>, pub kpls_dim: Option, + pub n_start: usize, pub nz: Option, pub z: Option>, + pub method: SparseMethod, pub seed: Option, } @@ -67,24 +72,36 @@ impl SparseGpMix { #[new] #[pyo3(signature = ( corr_spec = CorrelationSpec::SQUARED_EXPONENTIAL, + theta_init = None, + theta_bounds = None, kpls_dim = None, + n_start = 10, nz = None, z = None, + method = SparseMethod::Fitc, seed = None ))] #[allow(clippy::too_many_arguments)] fn new( corr_spec: u8, + theta_init: Option>, + theta_bounds: Option>>, kpls_dim: Option, + n_start: usize, nz: Option, z: Option>, + method: SparseMethod, seed: Option, ) -> Self { SparseGpMix { correlation_spec: CorrelationSpec(corr_spec), + theta_init, + theta_bounds, kpls_dim, + n_start, nz, z: z.map(|z| z.as_array().to_owned()), + method, seed, } } @@ -98,7 +115,12 @@ impl SparseGpMix { /// Returns Sgp object /// the fitted Gaussian process mixture /// - fn fit(&mut self, xt: PyReadonlyArray2, yt: PyReadonlyArray2) -> SparseGpx { + fn fit( + &mut self, + py: Python, + xt: PyReadonlyArray2, + yt: PyReadonlyArray2, + ) -> SparseGpx { let dataset = Dataset::new(xt.as_array().to_owned(), yt.as_array().to_owned()); let rng = if let Some(seed) = self.seed { @@ -115,18 +137,45 @@ impl SparseGpMix { panic!("You must specify inducing points") }; - let sgp = SparseGpMixture::params(inducings) - // .n_clusters(self.n_clusters) - // .recombination(recomb) - // .regression_spec(egobox_moe::RegressionSpec::from_bits(self.regression_spec.0).unwrap()) - .correlation_spec( - egobox_moe::CorrelationSpec::from_bits(self.correlation_spec.0).unwrap(), - ) - .kpls_dim(self.kpls_dim) - .with_rng(rng) - .fit(&dataset) - .expect("Sgp model training"); + let method = match self.method { + SparseMethod::Fitc => egobox_gp::SparseMethod::Fitc, + SparseMethod::Vfe => egobox_gp::SparseMethod::Vfe, + }; + + let mut theta_tuning = ThetaTuning::default(); + if let Some(init) = self.theta_init.as_ref() { + theta_tuning = ParamTuning { + init: init.to_vec(), + ..theta_tuning.into() + } + .try_into() + .expect("Theta tuning initial init"); + } + if let Some(bounds) = self.theta_bounds.as_ref() { + theta_tuning = ParamTuning { + bounds: bounds.iter().map(|v| (v[0], v[1])).collect(), + ..theta_tuning.into() + } + .try_into() + .expect("Theta tuning bounds"); + } + if let Err(ctrlc::Error::MultipleHandlers) = ctrlc::set_handler(|| std::process::exit(2)) { + // ignore multiple handlers error + }; + let sgp = py.allow_threads(|| { + SparseGpMixture::params(inducings) + .correlation_spec( + egobox_moe::CorrelationSpec::from_bits(self.correlation_spec.0).unwrap(), + ) + .theta_tuning(theta_tuning) + .kpls_dim(self.kpls_dim) + .n_start(self.n_start) + .sparse_method(method) + .with_rng(rng) + .fit(&dataset) + .expect("Sgp model training") + }); SparseGpx(Box::new(sgp)) } } @@ -143,19 +192,38 @@ impl SparseGpx { #[staticmethod] #[pyo3(signature = ( corr_spec = CorrelationSpec::SQUARED_EXPONENTIAL, + theta_init = None, + theta_bounds = None, kpls_dim = None, + n_start = 10, nz = None, z = None, + method = SparseMethod::Fitc, seed = None ))] + #[allow(clippy::too_many_arguments)] fn builder( corr_spec: u8, + theta_init: Option>, + theta_bounds: Option>>, kpls_dim: Option, + n_start: usize, nz: Option, z: Option>, + method: SparseMethod, seed: Option, ) -> SparseGpMix { - SparseGpMix::new(corr_spec, kpls_dim, nz, z, seed) + SparseGpMix::new( + corr_spec, + theta_init, + theta_bounds, + kpls_dim, + n_start, + nz, + z, + method, + seed, + ) } /// Returns the String representation from serde json serializer diff --git a/src/types.rs b/src/types.rs index 4a89a692..25a5be15 100644 --- a/src/types.rs +++ b/src/types.rs @@ -125,3 +125,10 @@ impl XSpec { } } } + +#[pyclass(rename_all = "UPPERCASE")] +#[derive(Debug, Clone, Copy)] +pub(crate) enum SparseMethod { + Fitc = 1, + Vfe = 2, +}