{ "cells": [ { "cell_type": "markdown", "id": "909b0b7a-3b4d-4a87-9ec4-3a7796893279", "metadata": {}, "source": [ "# Inverse vectors and matrices\n", "\n", "In this tutorial we will learn how to calculate the element-wise inverse of a tensor train, but also the\n", "inverse of a linear operator." ] }, { "cell_type": "code", "execution_count": 1, "id": "53158c92-7531-4426-b565-e22acf0ba8f5", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from trainsum.numpy import trainsum as ts\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "id": "641fbc59-1035-40b7-a6fa-b26813ec77cc", "metadata": {}, "outputs": [], "source": [ "dim = ts.dimension(2**10)\n", "domain = ts.domain(-10.0, 10.0)\n", "grid = ts.uniform_grid(dim, domain)\n", "\n", "vec_shape = ts.trainshape(dim.size())\n", "vec_shape.ranks = 15\n", "op_shape = ts.trainshape(dim.size(), dim.size(), mode=\"interleaved\")" ] }, { "cell_type": "markdown", "id": "1b43341d-a625-4bce-823c-fece275cb05c", "metadata": {}, "source": [ "At the beginning we introduce the problem settings." ] }, { "cell_type": "code", "execution_count": 3, "id": "69281d7a-7f9e-483d-91e6-f94ab9ab64bb", "metadata": {}, "outputs": [], "source": [ "# define the Laplace operator as matrix\n", "with ts.exact():\n", " laplace = -2.0 * ts.shift(dim, 0)\n", " laplace += 1.0 * ts.shift(dim, -1)\n", " laplace += 1.0 * ts.shift(dim, 1)\n", " laplace /= grid.spacings[0]**2\n", "laplace_map = ts.linear_map(\"ij,jk->ik\", laplace, op_shape)" ] }, { "cell_type": "markdown", "id": "143330ad-c3a6-4e02-8f8b-b1418151f4c8", "metadata": {}, "source": [ "As the next step we create the 1D-Laplace operator as our choice of an invertible square matrix.\n", "The linear map is the matrix multiplication of our operator and the guess." ] }, { "cell_type": "code", "execution_count": 4, "id": "28c8e3a1-8c75-4ea0-b4aa-936b6a14a313", "metadata": {}, "outputs": [], "source": [ "# define the identity as result\n", "rhs = ts.shift(dim, 0)\n", "\n", "# create the linear solver\n", "strat = ts.sweeping_strategy(ncores=2, nsweeps=15)\n", "decomp = ts.svdecomposition(max_rank=16, cutoff=0)\n", "solver = ts.gmres(nsteps=25, subspace=25, eps=1e-10)\n", "\n", "lin_solver = ts.linsolver(\n", " rhs,\n", " laplace_map,\n", " strategy=strat,\n", " decomposition=decomp,\n", " solver=solver,\n", " method=\"dmrg\")" ] }, { "cell_type": "markdown", "id": "e6515a5a-a575-4de7-aafc-b8fe7e80274a", "metadata": {}, "source": [ "Here we define our right hand side of the linear equation as the identity operator and the linear solver." ] }, { "cell_type": "code", "execution_count": 5, "id": "ec777049-7361-4c1d-9f88-b7c8975dad53", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9.82526465E-11\n", "1.0000000001018634\n" ] } ], "source": [ "# callback for printing and retrieval of local results\n", "def callback(lrange, res):\n", " print(f\"{res.residuals[-1]:.8E}\", end=\"\\r\", flush=True)\n", " return False\n", "\n", "# create some start guess and solve the system\n", "guess = ts.shift(dim, 0)\n", "inv_laplace = lin_solver(guess, callback=callback)\n", "print()\n", "\n", "# check trace of the result\n", "res = ts.einsum(\"ij,jk->\", laplace, inv_laplace)\n", "print(res / dim.size())" ] }, { "cell_type": "markdown", "id": "91f63b2b-3e8f-4ac0-8c49-db393bb19912", "metadata": {}, "source": [ "With the guess defined as the identity operator we can start the solving process.\n", "After that we can check the sum of the matrix multiplication." ] }, { "cell_type": "code", "execution_count": 6, "id": "bc6ecd9b-7776-41f0-a2bd-d27bb92d3438", "metadata": {}, "outputs": [ { "data": { "image/png": "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j38cO4b7O3GPP/64+fa3v20eeeQRI8k8+uijY15PxL3s7u42VVVV5tprrzW7du0y999/v8nLyzP/8R//kaqPaTI2jFxwwQVm1apVsZ9HRkZMTU2NWb9+vY2tcp7Dhw8bSWbLli3GGGO6urpMdna2eeihh2LHvP7660aS2bZtmzEm8o/L6/WalpaW2DF33XWXKSoqMoODg6n9AGkqGAya0047zWzatMl84AMfiIUR7u/UfeMb3zDvfe97x309HA6b6upq8y//8i+x57q6uozf7zf333+/McaY3bt3G0nmpZdeih3zP//zP8bj8ZiDBw8mr/EOcMUVV5gbbrhhzHMf/ehHzbXXXmuM4f5OxV+HkUTdyzvvvNOUlpaO+X74xje+Yc4444wkf6JRGdlNMzQ0pB07dmjp0qWx57xer5YuXapt27bZ2DLn6e7uliSVlZVJknbs2KHh4eEx93bBggWaPXt27N5u27ZNZ599tqqqqmLHLFu2TIFAQK+99loKW5++Vq1apSuuuGLMfZS4v4nwu9/9TosWLdJVV12lyspK1dXV6ec//3ns9f3796ulpWXMPS4uLtaFF1445h6XlJRo0aJFsWOWLl0qr9erF154IXUfJg1dfPHF2rx5s958801J0ssvv6xnn31Wy5cvl8T9TaRE3ctt27bp/e9/v3JycmLHLFu2THv27FFnZ2dKPosjNspLtLa2No2MjIz5spakqqoqvfHGGza1ynnC4bBuuukmLV68WGeddZYkqaWlRTk5OSopKRlzbFVVlVpaWmLHHO/eW69lugceeEB/+ctf9NJLLx3zGvd36vbt26e77rpLa9eu1be+9S299NJL+spXvqKcnBytXLkydo+Odw+PvseVlZVjXvf5fCorK8v4e/zNb35TgUBACxYsUFZWlkZGRvT9739f1157rSRxfxMoUfeypaVF8+bNO+Y9rNdKS0uT0v4xbUr6FeBaq1at0q5du/Tss8/a3RTXaGpq0po1a7Rp0ybl5uba3RxXCofDWrRokX7wgx9Ikurq6rRr1y797Gc/08qVK21unfM9+OCDuvfee3Xffffp3e9+txoaGnTTTTeppqaG+4txZWQ3TUVFhbKyso6ZgdDa2qrq6mqbWuUsq1ev1mOPPaann35as2bNij1fXV2toaEhdXV1jTn+6HtbXV193HtvvZbJduzYocOHD+s973mPfD6ffD6ftmzZop/85Cfy+Xyqqqri/k7RjBkz9K53vWvMc2eeeaYaGxsljd6jE30/VFdX6/Dhw2NeD4VC6ujoyPh7fPPNN+ub3/ymPvnJT+rss8/Wpz/9aX31q1/V+vXrJXF/EylR9zIdvjMyMozk5OTovPPO0+bNm2PPhcNhbd68WfX19Ta2LP0ZY7R69Wo9+uijeuqpp44p7Z133nnKzs4ec2/37NmjxsbG2L2tr6/Xq6++OuYfyKZNm1RUVHTML4lMc+mll+rVV19VQ0ND7LFo0SJde+21sf/O/Z2axYsXHzMd/c0339ScOXMkSfPmzVN1dfWYexwIBPTCCy+MucddXV3asWNH7JinnnpK4XBYF154YQo+Rfrq6+uT1zv2V0tWVpbC4bAk7m8iJepe1tfXa+vWrRoeHo4ds2nTJp1xxhkp6aKRlNlTe/1+v9mwYYPZvXu3+Yd/+AdTUlIyZgYCjvXFL37RFBcXm2eeecY0NzfHHn19fbFjbrzxRjN79mzz1FNPme3bt5v6+npTX18fe92aenrZZZeZhoYG88QTT5jp06cz9XQcR8+mMYb7O1Uvvvii8fl85vvf/7556623zL333mvy8/PNb37zm9gxt912mykpKTG//e1vzSuvvGL+9m//9rjTJevq6swLL7xgnn32WXPaaadl5NTTv7Zy5Uozc+bM2NTeRx55xFRUVJivf/3rsWO4vxMXDAbNzp07zc6dO40kc/vtt5udO3eat99+2xiTmHvZ1dVlqqqqzKc//Wmza9cu88ADD5j8/Hym9qbKv//7v5vZs2ebnJwcc8EFF5jnn3/e7ialPUnHfdxzzz2xY/r7+82XvvQlU1paavLz883f/d3fmebm5jHvc+DAAbN8+XKTl5dnKioqzNe+9jUzPDyc4k/jDH8dRri/U/f73//enHXWWcbv95sFCxaYu+++e8zr4XDYfOc73zFVVVXG7/ebSy+91OzZs2fMMe3t7ebqq682BQUFpqioyFx//fUmGAym8mOkpUAgYNasWWNmz55tcnNzzSmnnGK+/e1vj5k2yv2duKeffvq437krV640xiTuXr788svmve99r/H7/WbmzJnmtttuS9VHNMYY4zHmqGXxAAAAUiwjx4wAAID0QRgBAAC2IowAAABbEUYAAICtCCMAAMBWhBEAAGArwggAALAVYQQAANiKMAIAAGxFGAEAALYijAAAAFsRRgAAgK3+f8FmXKRylV2yAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# approximate some data and define it as linear map (essentially its a diagonal matrix)\n", "data = np.exp(-np.linspace(domain.lower, domain.upper, dim.size())**2) + 1\n", "with ts.variational(max_rank=8, cutoff=1e-10, ncores=2, nsweeps=2):\n", " vec = ts.tensortrain(vec_shape, data)\n", "lin_map = ts.linear_map(\"i,i->i\", vec, vec_shape)\n", "\n", "plt.figure()\n", "plt.plot(vec.to_tensor())\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "b1d7e905-04ba-4613-ab97-d46278848dc2", "metadata": {}, "source": [ "Having seen how a matrix can be inverted we will see a element-wise inversion of a Gaussian-shaped function.\n", "We therefore approximate the data variationally and define the linear map for the inversion." ] }, { "cell_type": "code", "execution_count": 7, "id": "62c8976e-bd61-4143-8691-1308588236e1", "metadata": {}, "outputs": [], "source": [ "# define the right side as ones\n", "rhs = ts.full(vec_shape, 1.0)\n", "\n", "# create the linear solver\n", "strat = ts.sweeping_strategy(ncores=1, nsweeps=5)\n", "decomp = ts.svdecomposition(max_rank=2, cutoff=0)\n", "solver = ts.gmres(nsteps=25, subspace=25, eps=1e-10)\n", "\n", "lin_solver = ts.linsolver(\n", " rhs,\n", " lin_map,\n", " strategy=strat,\n", " decomposition=decomp,\n", " solver=solver,\n", " method=\"amen\")" ] }, { "cell_type": "markdown", "id": "f599a8af-75df-472f-a7f6-6ac0a5ecdf3e", "metadata": {}, "source": [ "We define the right part of the equation as a vector of ones and define out linear solver." ] }, { "cell_type": "code", "execution_count": 8, "id": "1f0e5562-838c-4d7e-8c04-5c9539c243e3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7.69527307E-13" ] } ], "source": [ "# callback for printing and retrieval of local results\n", "def callback(lrange, res):\n", " print(f\"{res.residuals[-1]:.8E}\", end=\"\\r\", flush=True)\n", " return False\n", " \n", "# create some start guess and solve the system\n", "guess = ts.full(vec_shape, 0.0)\n", "guess = lin_solver(guess, callback=callback)" ] }, { "cell_type": "markdown", "id": "4f4529d9-97b1-409c-8442-d0ca69f09da6", "metadata": {}, "source": [ "Defining the guess as a vector with ones, we can start the linear solver." ] }, { "cell_type": "code", "execution_count": 9, "id": "08a387da-e262-41c2-ba90-a9475d8fb1a5", "metadata": {}, "outputs": [ { "data": { "image/png": "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BFamDrIs49FHH8U333yDn3766aKmzEGDBsHT07PJ+T18+DByc3Nt5zcpKQl79+5t8g9uzZo18Pf3v+iLp6O58cYbsXfvXmRlZdlugwcPxuTJk22PeX7bLjk5+aKlC44cOYIuXboAAOLj4xEREdHk/BqNRmzZsqXJ+S0vL8eOHTts2/z000+wWCwYOnSoEz6F66qpqYFG0/RrSqvVwmKxAOD5tTd7nc+kpCRs3LgR9fX1tm3WrFmDXr16OaVLCgCngtvD4sWLZb1eL2dkZMgHDhyQH3roITkwMLDJ7BJq3sMPPywHBATI69evlwsLC223mpoa2zbTp0+XY2Nj5Z9++knevn27nJSUJCclJdlet05Vvummm+SsrCx59erVcmhoKKcqX8KFs6Vkmee3PbZu3Sp7eHjIr7zyinz06FH5888/l729veX//Oc/tm1effVVOTAwUP7222/lPXv2yLfeemuzU2sTExPlLVu2yJs2bZJ79OjRYacqX2jq1KlydHS0bSr40qVL5ZCQEPmZZ56xbcPz2zqVlZXyrl275F27dskA5DfeeEPetWuXfPLkSVmW7XM+y8vL5fDwcPnee++V9+3bJy9evFj29vbmVHA1+uc//ynHxsbKOp1OHjJkiPzrr7+KLkkVADR7W7hwoW2bc+fOyY888ojcqVMn2dvbW77tttvkwsLCJu9z4sQJedy4cbKXl5ccEhIiP/nkk3J9fb2TP406/Dbc8Py2z3fffSf369dP1uv1cu/eveUFCxY0ed1iscgvvviiHB4eLuv1evnGG2+UDx8+3GSbM2fOyJMmTZJ9fX1lf39/+b777pMrKyud+TFcktFolGfOnCnHxsbKBoNB7tq1q/z88883mWLM89s669ata/Z37tSpU2VZtt/53L17t3zdddfJer1ejo6Oll999VVnfURZlmVZkuULlnokIiIiUjmOuSEiIiK3wnBDREREboXhhoiIiNwKww0RERG5FYYbIiIicisMN0RERORWGG6IiIjIrTDcEBERkVthuCEiIiK3wnBDREREboXhhoiIiNwKww0RqV5paSkiIiIwb94823O//PILdDod1q5dK7AyIhKBF84kIrewatUqTJw4Eb/88gt69eqFgQMH4tZbb8Ubb7whujQicjKGGyJyGzNmzMCPP/6IwYMHY+/evdi2bRv0er3osojIyRhuiMhtnDt3Dv369UNeXh527NiB/v37iy6JiATgmBsichvHjx9HQUEBLBYLTpw4IbocIhKELTdE5Bbq6uowZMgQDBw4EL169cJbb72FvXv3IiwsTHRpRORkDDdE5BaefvppfP3119i9ezd8fX0xYsQIBAQEYMWKFaJLIyInY7cUEane+vXr8dZbb+Gzzz6Dv78/NBoNPvvsM/z88894//33RZdHRE7GlhsiIiJyK2y5ISIiIrfCcENERERuheGGiIiI3ArDDREREbkVhhsiIiJyKww3RERE5FYYboiIiMitMNwQERGRW2G4ISIiIrfCcENERERuheGGiIiI3Mr/AySd0aNShPQmAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot the input function and its inverse\n", "plt.figure()\n", "plt.plot(vec.to_tensor(), label=\"function\")\n", "plt.plot(guess.to_tensor(), label=\"inverse function\")\n", "plt.legend()\n", "plt.xlabel(\"x\")\n", "plt.ylabel(\"y\")\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.14.2" } }, "nbformat": 4, "nbformat_minor": 5 }