Skip to main content
  • Home
  • Development
  • Documentation
  • Donate
  • Operational login
  • Browse the archive

swh logo
SoftwareHeritage
Software
Heritage
Archive
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

Raw File Download
Permalink

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • content
content badge Iframe embedding
swh:1:cnt:3e93b132cf5c4920144197f81602304e6877d017
Citations

This interface enables to generate software citations, provided that the root directory of browsed objects contains a citation.cff or codemeta.json file.
Select below a type of object currently browsed in order to generate citations for them.

  • content
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tensor Completion\n",
    "\n",
    "*Completing* a tensor means filling out its missing values. It's the equivalent of interpolation for the case of discretized tensor grids."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "torch.set_default_dtype(torch.float64)\n",
    "import tntorch as tn\n",
    "import numpy as np\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will start by reading a text image and masking out 90% of its pixels:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAACVCAYAAABIDAHAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAHCFJREFUeJzt3XuUlWX99/H3l3PgKQXMAycVJY+oI2riIcAnpV9imYWaaY+GrbRkPWo/eVqSli21X5mmLV1kKiBPiopEaqmRSumSZBAcFZGTyklA00QIGZjr+WPv730P48zse88+335ea7H2zGbvub/72ve+9ve67utgIQRERKT2dap0ACIiUhyq0EVEUkIVuohISqhCFxFJCVXoIiIpoQpdRCQlVKGLiKREQRW6mZ1mZovNbKmZXV2soEREJH/W0YlFZtYZeAM4FVgFvAicE0J4rXjhiYhIUl0KeO4wYGkIYTmAmd0PjAHarNB79+4dBg4cWMAhRUQ+ferr698NIfTJ9bhCKvR9gJXNfl8FHNvyQWY2DhgH0L9/f+bNm1fAIUVEPn3M7K0kjyukD91aue8T/TchhEkhhLoQQl2fPjm/YEREpIMKqdBXAf2a/b4vsKawcEREpKMKqdBfBAab2SAz6waMBWYVJywREclXh/vQQwjbzOwy4AmgM3B3COHVokUmIiJ5KeSiKCGEx4HHixSLiIgUQDNFRURSQhW6iEhKqEIXEUkJVegiIimhCl1EJCVUoYuIpIQqdBGRlFCFLiKSEqrQRURSQhW6iEhKqEIXEUkJVegiIimhCl1EJCUKWm1RRKSUGhsbAfj3v/+d+Dm9evUC4DOf+UxJYqpmytBFRFJCGbqIVK0nnngCgJ///OcAfPTRR20+tnPnzgCMHz8egAsvvLC0wVUhZegiIimhDF1EqpZn5K++mtndcuPGjW0+1jP09957r/SBVSll6CIiKZGqDH3z5s3MnDkTgC1btuR8/MCBAwE4+eSTgfgb/tMuhMD8+fMBWLhwYc7Hd+mSOY1GjRoFwN5771264ESkTamq0NesWcPVV18NwMqVK3M+fuzYsQAcc8wxAOy8886lC66GhBB45JFHgPhiVHv22GMPAKZNmwaoQhepFHW5iIikhCp0EZGUUIUuIpISqtBFRFJCFbqISEqoQhcRSYmcFbqZ9TOzp81skZm9amaXZ+/f3cyeMrMl2dvPlj5cERFpS5IMfRtwRQjh88BxwKVmdjBwNTA7hDAYmJ39XUREKiRnhR5CWBtCmJ/9eSOwCNgHGANMzj5sMnBmqYIUEZHc8popamYDgSOBucCeIYS1kKn0zaxvG88ZB4wD6N+/fyGxVpUQAhAvBOS/t6dbt24A7LLLLpjZDv+3bds2ADZs2ADAsmXL+Ne//gXA1q1bAejRowcAu+22GwD7778/AL1796Zr164dfzE1wst4+/btbNq0CYC3334biN8HX8zp448/BqB79+7RDGCf0ernYc+ePYHMkg8t349iaGxsjDZoSKJ79+5RPM35696yZQtvvvkmQHTrr/P4448HYM899+xQrE1NTUB8rr377rtAPON648aNUdl6fDvttBOQOf8ABgwYEN3ny0FUkxBCtCSIv6633noLgA8//BCIX9vOO+9Mv379ANh3332BeMOMUpwrxZK41M1sJ+BhYHwI4cOkLyqEMAmYBFBXV5e71kvA34x//vOffgwg8+H2ijGJVatWATBjxgwg3unEHXbYYQAcdNBBbcZw+eWXA7B06dKcx/vSl74EwDXXXBNVMq+//joAU6dOBeCvf/0rACtWrIh2adm+fTsQfyH4h8bXojnppJM455xzADjqqKOAZOvS+N999tlnAaIvkBACr732Ws7nOy/zZ555Bvjking9evTgtNNOA/L7oPv7+p///AeAF154AciUkb/3ixcvBuKK3B/rFVP37t2jL0Iv8yFDhgBQV1cHwMiRI6MKsZgf2qlTp3LHHXfkfNxnP5u5/DRhwgQAvvjFLwJxJTt37lwApkyZwlNPPQXA6tWrgfhL/p577gHgzDOTN5Sbmpp45513APjLX/4CxOfCggULgMxyGpBZJ8krw06dMg17L6tddtkFgAMOOIAvfOELAHzta18D4IgjjgCoaMLhX6qzZ89m+vTpAPz9738HYO3atUB83vj73qNHDz73uc8B8ZflmDFjAPjyl78MVOeOSIlGuZhZVzKV+bQQwozs3evMbK/s/+8FrC9NiCIikkTOdMkyX1m/BxaFEG5u9l+zgAuAG7O3fyxJhK3429/+BsD3v/99IJM9dMQ//vGPHW6dZyA33ngjAFdddVWbf6OhoQHIdJHkcsABBwCZjNYzhdtuuw2A559/PufzvXntt97NUF9fH+3s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s7wmRKxcuRKIr+wrU4jls1CUL9fqo1CSTE7x//Ms8uijjwbg6aefznm8Dz74gGuvvRaI9yb9+te/DsR7YnoWvW3bNt544w0AHnzwQQBuv/12IFlrwPlO8scdd1zi51RKyz1TvS/9tddey/nc5557DoCJEycC8L3vfQ+AESNG0KtXrx0e6zs3PfDAAwDcfPPNUas3l759+zJq1Cig+IuufZrl/NSGECaEEPYNIQwExgJ/CyGcBzwNfD37sAuAP5YsShERyamQzsD/Bu43s+uBl4DfFyekjuvatWteE1VefvllACZMmAAQ9ct6f+yJJ54IwMknn1zMMKuemUXlmGTjB++b9REOnrn17t0byPTpnnfeeQCfGCHiY6YvvPBCABYsWBBtT9ce39n+uuuuA+C+++4DMvuDAlE2+dFHH0UjOJYvXw7kt+2d7wPr8XVkJ/lKOeSQQwD4yle+AiTL0P199nHk8+bNA+Dwww+PXru/3ytWrADiz1E+11BGjhxZE62dWpNXhR5CeAZ4JvvzcmBY8UPquJ49e0aTFRYvXpzz8X4x1C8aPfroo0BcoV9//fXAp7NCHzhwIBDPGNy0aVPO5/lsw1tvvRWIu22GDBnCmWdmBkG1rND9C8P/v76+nttuuw1INgzSK2d/v5O870n4OeAV+ZgxY3aItxZ4V8a5554LwAsvvADEQxOT8Otes2fPLkpMhx56KJC5mK0uzuLTWi4iIilR3eOv8rT77rszYsQIIM4okq5zDXG2pwlHcffTkCFDAPIajubl57dJujh8qN0VV1wRTfy59957gfK+D56Zf/e73wVg/PjxQG2vbeJDEK+88kognlg1f/78ssWw//77A3DVVVcBcXemFJcydBGRlEhVht6pUyfOOussAObOnQvAI488UsmQataBBx4IwMUXXwzAmjWZUak+/b5U+vfvz09/+lMgvqg6efJkIL4QWqrjApx//vlAvGBU3759S3bMcvF+/9GjRwNxK+Q3v/kNTzzxBFC6VtDw4cMBuPTSS4F4eKn2MC0NZegiIimRqgwd4r66G264ASAarfHUU08B8WSiTZs2RX27ni34qADfk/HTvGhQy1EevgiWTyLxPvX333//E/tR+qQeL898d/jxZVR98pBnedOnTwdgzpw5UYshn2skLePzrPzUU09l7NixQDxxyM+BNPFRR6eddhqQmXA0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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "We will keep 1159 out of 11592 pixels\n"
     ]
    }
   ],
   "source": [
    "im = torch.DoubleTensor(plt.imread('../images/text.png'))\n",
    "plt.imshow(im, cmap='gray', vmin=im.min(), vmax=im.max())\n",
    "plt.show()\n",
    "\n",
    "P = im.shape[0]*im.shape[1]\n",
    "Q = int(P/10)\n",
    "print('We will keep {} out of {} pixels'.format(Q, P))\n",
    "X = np.unravel_index(np.random.choice(P, Q), im.shape)  # Coordinates of surviving pixels\n",
    "y = torch.Tensor(im[X])  # Grayscale values of surviving pixels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The masked image looks like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "mask = np.ones([im.shape[0], im.shape[1]])\n",
    "mask[X] = y\n",
    "plt.imshow(mask, cmap='gray', vmin=im.min(), vmax=im.max())\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, we will try to recover the image by completing a rank-6 tensor with those samples:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "iter: 0      | loss:   1.178050 | total time:    0.0009\n",
      "iter: 500    | loss:   0.200007 | total time:    0.5207\n",
      "iter: 1000   | loss:   0.084521 | total time:    1.0735\n",
      "iter: 1500   | loss:   0.021333 | total time:    1.6547\n",
      "iter: 2000   | loss:   0.003651 | total time:    2.2765\n",
      "iter: 2187   | loss:   0.001562 | total time:    2.5357 <- converged (tol=0.0001)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = tn.rand(im.shape, ranks_tt=6, requires_grad=True)\n",
    "\n",
    "def loss(t):\n",
    "    return tn.relative_error(y, t[X])\n",
    "tn.optimize(t, loss)\n",
    "\n",
    "plt.imshow(t.numpy(), cmap='gray', vmin=im.min(), vmax=im.max())\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The result is not convincing since we are not using any notion of spatial correlation: the real world signal is smooth, but our tensor does not know about that.\n",
    "\n",
    "## Smoothness Priors\n",
    "\n",
    "This time we will add a penalization term in the hope of getting a smoother reconstruction. We will use the norm of the tensor's 2nd-order derivatives, for which we can use [the function *partialset()*](derivatives.ipynb). To combine (add) both losses, we need to return them as a tuple from the `loss()` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "iter: 0      | loss:   1.172050 +   2.569117 =      3.741 | total time:    0.0037\n",
      "iter: 500    | loss:   0.120569 +   0.085111 =     0.2057 | total time:    2.4681\n",
      "iter: 1000   | loss:   0.063130 +   0.021324 =    0.08445 | total time:    4.9900\n",
      "iter: 1500   | loss:   0.053652 +   0.010877 =    0.06453 | total time:    7.6926\n",
      "iter: 2000   | loss:   0.046964 +   0.008748 =    0.05571 | total time:   10.2740\n",
      "iter: 2500   | loss:   0.037407 +   0.008513 =    0.04592 | total time:   12.8340\n",
      "iter: 3000   | loss:   0.025241 +   0.007971 =    0.03321 | total time:   15.2129\n",
      "iter: 3500   | loss:   0.015514 +   0.006649 =    0.02216 | total time:   17.7566\n",
      "iter: 4000   | loss:   0.010046 +   0.005578 =    0.01562 | total time:   19.9821\n",
      "iter: 4500   | loss:   0.006938 +   0.005028 =    0.01197 | total time:   22.7111\n",
      "iter: 5000   | loss:   0.005096 +   0.004723 =   0.009818 | total time:   25.3216\n",
      "iter: 5500   | loss:   0.004118 +   0.004510 =   0.008628 | total time:   28.6819\n",
      "iter: 6000   | loss:   0.003574 +   0.004364 =   0.007938 | total time:   33.3063\n",
      "iter: 6500   | loss:   0.003203 +   0.004258 =   0.007461 | total time:   37.6611\n",
      "iter: 6542   | loss:   0.003178 +   0.004251 =   0.007429 | total time:   38.1314 <- converged (tol=0.0001)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = tn.rand(im.shape, ranks_tt=6, requires_grad=True)\n",
    "\n",
    "def loss(t):\n",
    "    return tn.relative_error(y, t[X])**2, tn.normsq(tn.partialset(t, order=2))*1e-4\n",
    "tn.optimize(t, loss)\n",
    "\n",
    "plt.imshow(t.numpy(), cmap='gray', vmin=im.min(), vmax=im.max())\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}

back to top

Software Heritage — Copyright (C) 2015–2025, The Software Heritage developers. License: GNU AGPLv3+.
The source code of Software Heritage itself is available on our development forge.
The source code files archived by Software Heritage are available under their own copyright and licenses.
Terms of use: Archive access, API— Contact— JavaScript license information— Web API